diff options
author | Ajay Ramachandran <[email protected]> | 2023-09-05 01:28:15 -0400 |
---|---|---|
committer | GitHub <[email protected]> | 2023-09-05 01:28:15 -0400 |
commit | bc2db0cf2c13f6e8aac75227694babdf3693d45d (patch) | |
tree | 664d67988b1fe96abc67e9842dd2252aaaa3b9bc | |
parent | edaed61612597d55af691963fa99b74ab0813e8e (diff) | |
parent | 843ef37dcd5e5e15f5ace6d36e5c84908048f0ea (diff) | |
download | SponsorBlock-bc2db0cf2c13f6e8aac75227694babdf3693d45d.tar.gz SponsorBlock-bc2db0cf2c13f6e8aac75227694babdf3693d45d.zip |
Merge branch 'master' into EthanBnntt-patch-1
147 files changed, 5980 insertions, 45010 deletions
diff --git a/.eslintrc.json b/.eslintrc.json index 4310d618..9651d379 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -24,7 +24,10 @@ "no-self-assign": "off", "@typescript-eslint/no-empty-interface": "off", "react/prop-types": [2, { "ignore": ["children"] }], - "@typescript-eslint/member-delimiter-style": "warn" + "@typescript-eslint/member-delimiter-style": "warn", + "@typescript-eslint/no-non-null-assertion": "off", + "@typescript-eslint/ban-ts-comment": "off", + "@typescript-eslint/no-this-alias": "off" }, "settings": { "react": { diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 377246c0..391943e4 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,3 +1,3 @@ github: ajayyy-org patreon: ajayyy -custom: [buy.ajay.app/l/sponsorblock, sponsor.ajay.app/donate] +custom: [sponsor.ajay.app/donate] diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bb5b9d0e..1b5541b1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,8 +10,10 @@ jobs: steps: # Initialization - - uses: actions/checkout@v2 - - uses: actions/setup-node@v2 + - uses: actions/checkout@v3 + with: + submodules: recursive + - uses: actions/setup-node@v3 with: node-version: '18' - run: npm ci @@ -25,7 +27,7 @@ jobs: # Create Chrome artifacts - name: Create Chrome artifacts run: npm run build:chrome - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: ChromeExtension path: dist @@ -37,7 +39,7 @@ jobs: # Create Firefox artifacts - name: Create Firefox artifacts run: npm run build:firefox - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: FirefoxExtension path: dist @@ -48,7 +50,7 @@ jobs: # Create Beta artifacts (Builds with the name changed to beta) - name: Create Chrome Beta artifacts run: npm run build:chrome -- --env stream=beta - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: ChromeExtensionBeta path: dist @@ -58,7 +60,7 @@ jobs: - name: Create Firefox Beta artifacts run: npm run build:firefox -- --env stream=beta - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: FirefoxExtensionBeta path: dist diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 943d54f5..21108d7a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -12,98 +12,93 @@ jobs: steps: # Initialization - - uses: actions/checkout@v2 - - uses: actions/setup-node@v2 + - 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@v2 - with: - name: ChromeExtension - path: dist - run: mkdir ./builds - name: Zip Artifacts run: cd ./dist ; zip -r ../builds/ChromeExtension.zip * + - name: Upload ChromeExtension to release + uses: Shopify/upload-to-release@07611424e04f1475ddf550e1c0dd650b867d5467 + with: + args: builds/ChromeExtension.zip + name: ChromeExtension.zip + path: ./builds/ChromeExtension.zip + repo-token: ${{ secrets.GITHUB_TOKEN }} # Create Firefox artifacts - name: Create Firefox artifacts run: npm run build:firefox - - uses: actions/upload-artifact@v2 - with: - name: FirefoxExtension - path: dist - name: Zip Artifacts run: cd ./dist ; zip -r ../builds/FirefoxExtension.zip * + - name: Upload FirefoxExtension to release + uses: Shopify/upload-to-release@07611424e04f1475ddf550e1c0dd650b867d5467 + with: + args: builds/FirefoxExtension.zip + 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 - - uses: actions/upload-artifact@v2 - with: - name: ChromeExtensionBeta - path: dist - 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 - - uses: actions/upload-artifact@v2 - with: - name: SafariExtension - path: dist - name: Zip Artifacts run: cd ./dist ; zip -r ../builds/SafariExtension.zip * + - name: Upload SafariExtension to release + uses: Shopify/upload-to-release@07611424e04f1475ddf550e1c0dd650b867d5467 + with: + args: builds/SafariExtension.zip + 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 - - uses: actions/upload-artifact@v2 - 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@master - with: - args: builds/ChromeExtension.zip - name: ChromeExtension.zip - path: ./builds/ChromeExtension.zip - repo-token: ${{ secrets.GITHUB_TOKEN }} - - name: Upload ChromeExtensionBeta to release - uses: Shopify/upload-to-release@master - with: - args: builds/ChromeExtensionBeta.zip - name: ChromeExtensionBeta.zip - path: ./builds/ChromeExtensionBeta.zip - repo-token: ${{ secrets.GITHUB_TOKEN }} - - name: Upload FirefoxExtension to release - uses: Shopify/upload-to-release@master - with: - args: builds/FirefoxExtension.zip - name: FirefoxExtension.zip - path: ./builds/FirefoxExtension.zip - repo-token: ${{ secrets.GITHUB_TOKEN }} - - name: Upload SafariExtension to release - uses: Shopify/upload-to-release@master - with: - args: builds/SafariExtension.zip - name: SafariExtension.zip - path: ./builds/SafariExtension.zip - repo-token: ${{ secrets.GITHUB_TOKEN }} - name: Upload EdgeExtension to release - uses: Shopify/upload-to-release@master + uses: Shopify/upload-to-release@07611424e04f1475ddf550e1c0dd650b867d5467 with: args: builds/EdgeExtension.zip name: EdgeExtension.zip @@ -113,7 +108,7 @@ jobs: # Firefox Beta - name: Create Firefox Beta artifacts run: npm run build:firefox -- --env stream=beta - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: FirefoxExtensionBeta path: dist @@ -130,13 +125,13 @@ jobs: run: sudo apt-get install rename - name: Rename signed file run: cd ./web-ext-artifacts ; rename 's/.*/FirefoxSignedInstaller.xpi/' * - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: FirefoxExtensionSigned.xpi path: ./web-ext-artifacts/FirefoxSignedInstaller.xpi - name: Upload FirefoxSignedInstaller.xpi to release - uses: Shopify/upload-to-release@master + uses: Shopify/upload-to-release@07611424e04f1475ddf550e1c0dd650b867d5467 with: args: web-ext-artifacts/FirefoxSignedInstaller.xpi name: FirefoxSignedInstaller.xpi diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index b14925ec..8773c147 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -9,8 +9,10 @@ jobs: steps: # Initialization - - uses: actions/checkout@v2 - - uses: actions/setup-node@v2 + - uses: actions/checkout@v3 + with: + submodules: recursive + - uses: actions/setup-node@v3 with: node-version: '18' - run: npm ci diff --git a/.github/workflows/update-oss-attribution.yml b/.github/workflows/update-oss-attribution.yml index f8f684ba..5c45e6e3 100644 --- a/.github/workflows/update-oss-attribution.yml +++ b/.github/workflows/update-oss-attribution.yml @@ -12,9 +12,10 @@ jobs: update-oss: runs-on: ubuntu-latest steps: - - name: Checkout - uses: actions/checkout@v2 - - uses: actions/setup-node@v2 + - uses: actions/checkout@v3 + with: + submodules: recursive + - uses: actions/setup-node@v3 with: node-version: '18' - name: Install and generate attribution @@ -23,9 +24,13 @@ jobs: npm i -g oss-attribution-generator generate-attribution mv ./oss-attribution/attribution.txt ./public/oss-attribution/attribution.txt + - name: Prettify attributions + run: | + cd ci && npx ts-node prettify.ts - name: Create pull request to update list - uses: peter-evans/create-pull-request@923ad837f191474af6b1721408744feb989a4c27 + uses: peter-evans/create-pull-request@2b011faafdcbc9ceb11414d64d0573f37c774b04 + # v4.2.3 with: commit-message: Update OSS Attribution author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> diff --git a/.github/workflows/updateInvidous.yml b/.github/workflows/updateInvidous.yml index ede1b9b0..0dcf556c 100644 --- a/.github/workflows/updateInvidous.yml +++ b/.github/workflows/updateInvidous.yml @@ -8,21 +8,24 @@ jobs: check-list: runs-on: ubuntu-latest steps: - - name: Checkout - uses: actions/checkout@v2 - - name: Download instance list + - uses: actions/checkout@v3 + with: + submodules: recursive + - name: Download instance lists run: | - wget https://api.invidious.io/instances.json -O ci/data.json + wget https://api.invidious.io/instances.json -O ci/invidious_instances.json + wget https://github.com/TeamPiped/piped-uptime/raw/master/history/summary.json -O ci/piped_instances.json - name: Install dependencies run: npm ci - name: "Run CI" run: npm run ci:invidious - name: Create pull request to update list - uses: peter-evans/create-pull-request@923ad837f191474af6b1721408744feb989a4c27 + uses: peter-evans/create-pull-request@2b011faafdcbc9ceb11414d64d0573f37c774b04 + # v4.2.3 with: commit-message: Update Invidious List - author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> + author: github-actions[bot] <github-actions[bot]@users.noreply.github.com> branch: ci/update_invidious_list title: Update Invidious List body: Automated Invidious list update
\ No newline at end of file @@ -7,5 +7,6 @@ web-ext-artifacts dist/ tmp/ .DS_Store -ci/data.json +ci/invidious_instances.json +ci/piped_instances.json test-results
\ No newline at end of file diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..19ee9032 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "public/_locales"] + path = public/_locales + url = https://github.com/ajayyy/ExtensionTranslations +[submodule "maze-utils"] + path = maze-utils + url = https://github.com/ajayyy/maze-utils diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 60bd0953..ac044615 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1 +1,31 @@ -If you make any contributions to SponsorBlock after this file was created, you are agreeing that any code you have contributed will be licensed under LGPL-3.0. +If you make any contributions to SponsorBlock after this file was created, you are agreeing that any code you have contributed will be licensed under LGPL-3.0 or later. + +# Translations +https://crowdin.com/project/sponsorblock + +# Building +## Building locally +0. You must have [Node.js 16 or later](https://nodejs.org/) and npm installed. Works best on Linux +1. Clone with submodules + ```bash + git clone --recursive https://github.com/ajayyy/SponsorBlock + ``` + 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. + - Comments are invalid in JSON, make sure they are all removed. + - You will need to repeat this step in the future if you get build errors related to `CompileConfig` or `property does not exist on type ConfigClass`. This can happen for example when a new category is added. +3. Run `npm ci` in the repository to install dependencies. +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. +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/docs/Tools/about:debugging#loading_a_temporary_extension) in Firefox. + +## Developing with a clean profile and hot reloading +Run `npm run dev` (for Chrome) or `npm run dev:firefox` (for Firefox) to run the extension using a clean browser profile with hot reloading. This uses [`web-ext run`](https://extensionworkshop.com/documentation/develop/web-ext-command-reference/#commands). + +Known chromium bug: Extension is not loaded properly on first start. Visit `chrome://extensions/` and reload the extension. + +For Firefox for Android, use `npm run dev:firefox-android -- --adb-device <ip-address of the device>`. See the [Firefox documentation](https://extensionworkshop.com/documentation/develop/developing-extensions-for-firefox-for-android/#debug-your-extension) for more information. You may need to edit package.json and add the parameters directly there. + @@ -38,7 +38,7 @@ SponsorBlock is an open-source crowdsourced browser extension to skip sponsor segments in YouTube videos. Users submit when a sponsor happens from the extension, and the extension automatically skips sponsors it knows about. It also supports skipping other categories, such as intros, outros and reminders to subscribe. -It also supports Invidio.us. +It also supports Invidious. **Translate:** [![Crowdin](https://badges.crowdin.net/sponsorblock/localized.svg)](https://crowdin.com/project/sponsorblock) @@ -56,35 +56,14 @@ The dataset and API are now being used in some [ports](https://github.com/ajayyy # API -You can read the API docs [here](https://wiki.sponsor.ajay.app/index.php/API_Docs). +You can read the API docs [here](https://wiki.sponsor.ajay.app/w/API_Docs). # Building - -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. - - - 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 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. - -### Developing with a clean profile and hot reloading - -Run `npm run dev` (for Chrome) or `npm run dev:firefox` (for Firefox) to run the extension using a clean browser profile with hot reloading. This uses [`web-ext run`](https://extensionworkshop.com/documentation/develop/web-ext-command-reference/#commands). - -Known chromium bug: Extension is not loaded properly on first start. Visit `chrome://extensions/` and reload the extension. - -For Firefox for Android, use `npm run dev:firefox-android -- --adb-device <ip-address of the device>`. See the [Firefox documentation](https://extensionworkshop.com/documentation/develop/developing-extensions-for-firefox-for-android/#debug-your-extension) for more information. +See [CONTRIBUTING.md](CONTRIBUTING.md) # Credit -The awesome [Invidious API](https://docs.invidious.io/API.md) was previously used, and the server is now using [NewLeaf](https://git.sr.ht/~cadence/NewLeaf) as a to get video info from YouTube. +The awesome [Invidious API](https://docs.invidious.io/) was previously used, and the server is now using [NewLeaf](https://git.sr.ht/~cadence/NewLeaf) as a to get video info from YouTube. Originally forked from [YTSponsorSkip](https://github.com/NDevTK/YTSponsorSkip), but very little code remains. diff --git a/ci/generateList.ts b/ci/generateList.ts new file mode 100644 index 00000000..7c0f8882 --- /dev/null +++ b/ci/generateList.ts @@ -0,0 +1,63 @@ +/* +This file is only ran by GitHub Actions in order to populate the Invidious instances list + +This file should not be shipped with the extension +*/ + +/* +Criteria for inclusion: +Invidious +- 30d uptime >= 90% +- available for at least 80/90 days +- must have been up for at least 90 days +- HTTPS only +- url includes name (this is to avoid redirects) + +Piped +- 30d uptime >= 90% +- available for at least 80/90 days +- must have been up for at least 90 days +- must not be a wildcard redirect to piped.video +- must be currently up +- must have a functioning frontend +- must have a functioning API +*/ + +import { writeFile, existsSync } from "fs" +import { join } from "path" +import { getInvidiousList } from "./invidiousCI"; +// import { getPipedList } from "./pipedCI"; + +const checkPath = (path: string) => existsSync(path); +const fixArray = (arr: string[]) => [...new Set(arr)].sort() + +async function generateList() { + // import file from https://api.invidious.io/instances.json + const invidiousPath = join(__dirname, "invidious_instances.json"); + // import file from https://github.com/TeamPiped/piped-uptime/raw/master/history/summary.json + const pipedPath = join(__dirname, "piped_instances.json"); + + // check if files exist + if (!checkPath(invidiousPath) || !checkPath(pipedPath)) { + console.log("Missing files") + process.exit(1); + } + + // static non-invidious instances + const staticInstances = ["www.youtubekids.com"]; + // invidious instances + const invidiousList = fixArray(getInvidiousList()) + // piped instnaces + // const pipedList = fixArray(await getPipedList()) + + console.log([...staticInstances, ...invidiousList]) + + writeFile( + join(__dirname, "./invidiouslist.json"), + JSON.stringify([...staticInstances, ...invidiousList]), + (err) => { + if (err) return console.log(err); + } + ); +} +generateList() diff --git a/ci/invidiousCI.ts b/ci/invidiousCI.ts index 5c618e74..d27a3a4e 100644 --- a/ci/invidiousCI.ts +++ b/ci/invidiousCI.ts @@ -1,55 +1,31 @@ -/* -This file is only ran by GitHub Actions in order to populate the Invidious instances list +import { InvidiousInstance, instanceMap } from "./invidiousType" -This file should not be shipped with the extension -*/ - -import { writeFile, existsSync } from 'fs'; -import { join } from 'path'; - -// import file from https://api.invidious.io/instances.json -if (!existsSync(join(__dirname, "data.json"))) { - process.exit(1); -} -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore -import * as data from "../ci/data.json"; - -type instanceMap = { - name: string, - url: string, - dailyRatios: {ratio: string, label: string }[], - thirtyDayUptime: string -}[] +import * as data from "../ci/invidious_instances.json"; // only https servers const mapped: instanceMap = data - // eslint-disable-next-line @typescript-eslint/no-explicit-any - .filter((i: any) => i[1]?.type === 'https') - // eslint-disable-next-line @typescript-eslint/no-explicit-any - .map((instance: any) => { + .filter((i: InvidiousInstance) => i[1]?.type === "https") + .map((instance: InvidiousInstance) => { return { name: instance[0], url: instance[1].uri, dailyRatios: instance[1].monitor.dailyRatios, - thirtyDayUptime: instance[1]?.monitor['30dRatio'].ratio, + thirtyDayUptime: instance[1]?.monitor["30dRatio"].ratio, } - }) + }); // reliability and sanity checks const reliableCheck = mapped - .filter((instance) => { + .filter(instance => { // 30d uptime >= 90% - const thirtyDayUptime = Number(instance.thirtyDayUptime) >= 90 + const thirtyDayUptime = Number(instance.thirtyDayUptime) >= 90; // available for at least 80/90 days - const dailyRatioCheck = instance.dailyRatios.filter(status => status.label !== "black") - return (thirtyDayUptime && dailyRatioCheck.length >= 80) + const dailyRatioCheck = instance.dailyRatios.filter(status => status.label !== "black"); + return thirtyDayUptime && dailyRatioCheck.length >= 80; }) // url includes name - .filter(instance => instance.url.includes(instance.name)) + .filter(instance => instance.url.includes(instance.name)); -// finally map to array -const result: string[] = reliableCheck.map(instance => instance.name).sort() -writeFile(join(__dirname, "./invidiouslist.json"), JSON.stringify(result), (err) => { - if (err) return console.log(err); -})
\ No newline at end of file +export function getInvidiousList(): string[] { + return reliableCheck.map(instance => instance.name).sort() +}
\ No newline at end of file diff --git a/ci/invidiousType.ts b/ci/invidiousType.ts new file mode 100644 index 00000000..e5f682bb --- /dev/null +++ b/ci/invidiousType.ts @@ -0,0 +1,54 @@ +type ratio = { + ratio: string; + label: string; +} + +export type instanceMap = { + name: string; + url: string; + dailyRatios: {ratio: string; label: string }[]; + thirtyDayUptime: string; +}[] + +export type InvidiousInstance = [ + string, + { + flag: string; + region: string; + stats: null | { + version: string; + software: { + name: string; + version: string; + branch: string; + }; + openRegistrations: boolean; + usage: { + users: { + total: number; + activeHalfyear: number; + activeMonth: number; + }; + }; + metadata: { + updatedAt: number; + lastChannelRefreshedAt: number; + }; + }; + cors: boolean | null; + api: boolean | null; + type: "https" | "http" | "onion" | "i2p"; + uri: string; + monitor: null | { + monitorId: number; + createdAt: number; + statusClass: string; + name: string; + url: string | null; + type: "HTTP(s)"; + dailyRatios: ratio[]; + "90dRatio": ratio; + "30dRatio": ratio; + }; + } +]
\ No newline at end of file diff --git a/ci/invidiouslist.json b/ci/invidiouslist.json index 69b6a845..aa6e30ea 100644 --- a/ci/invidiouslist.json +++ b/ci/invidiouslist.json @@ -1 +1 @@ -["inv.cthd.icu","inv.riverside.rocks","invidio.xamh.de","invidious.kavin.rocks","invidious.namazso.eu","invidious.osi.kr","invidious.snopyta.org","vid.puffyan.us","yewtu.be","youtube.076.ne.jp","yt.artemislena.eu"]
\ No newline at end of file +["www.youtubekids.com","inv.bp.projectsegfau.lt","inv.citw.lgbt","inv.in.projectsegfau.lt","inv.makerlab.tech","inv.pistasjis.net","inv.tux.pizza","inv.zzls.xyz","invidious.0011.lt","invidious.io.lol","invidious.lunar.icu","invidious.no-logs.com","invidious.projectsegfau.lt","invidious.protokolla.fi","invidious.slipfox.xyz","invidious.tiekoetter.com","iv.ggtyler.dev","iv.melmac.space","iv.nboeck.de","onion.tube","vid.priv.au","vid.puffyan.us","yewtu.be","yt.artemislena.eu","yt.oelrichsgarcia.de"]
\ No newline at end of file diff --git a/ci/pipedCI.ts b/ci/pipedCI.ts new file mode 100644 index 00000000..80424295 --- /dev/null +++ b/ci/pipedCI.ts @@ -0,0 +1,92 @@ +import * as data from "../ci/piped_instances.json"; + +type percent = string +type dailyMinutesDown = Record<string, number> + +type PipedInstance = { + name: string; + url: string; + icon: string; + slug: string; + status: string; + uptime: percent; + uptimeDay: percent; + uptimeWeek: percent; + uptimeMonth: percent; + uptimeYear: percent; + time: number; + timeDay: number; + timeWeek: number; + timeMonth: number; + timeYear: number; + dailyMinutesDown: dailyMinutesDown +} + +const percentNumber = (percent: percent) => Number(percent.replace("%", "")) +const ninetyDaysAgo = new Date(Date.now() - 90 * 24 * 60 * 60 * 1000) + +function dailyMinuteFilter (dailyMinutesDown: dailyMinutesDown) { + let daysDown = 0 + for (const [date, minsDown] of Object.entries(dailyMinutesDown)) { + if (new Date(date) >= ninetyDaysAgo && minsDown > 1000) { // if within 90 days and down for more than 1000 minutes + daysDown++ + } + } + // return true f less than 10 days down + return daysDown < 10 +} + +const getHost = (url: string) => new URL(url).host + +const getWatchPage = async (instance: PipedInstance) => + fetch(`https://${getHost(instance.url)}`, { redirect: "manual" }) + .then(res => res.headers.get("Location")) + .catch(e => { console.log (e); return null }) + +const siteOK = async (instance) => { + // check if entire site is redirect + const notRedirect = await fetch(instance.url, { redirect: "manual" }) + .then(res => res.status == 200) + // only allow kavin to return piped.video + // if (instance.url.startsWith("https://piped.video") && instance.slug !== "kavin-rocks-official") return false + // check if frontend is OK + const watchPageStatus = await fetch(instance.frontendUrl) + .then(res => res.ok) + // test API - stream returns ok result + const streamStatus = await fetch(`${instance.apiUrl}/streams/BaW_jenozKc`) + .then(res => res.ok) + // get startTime of monitor + const age = await fetch(instance.historyUrl) + .then(res => res.text()) + .then(text => { // startTime greater than 90 days ago + const date = text.match(/startTime: (.+)/)[1] + return Date.parse(date) < ninetyDaysAgo.valueOf() + }) + // console.log(notRedirect, watchPageStatus, streamStatus, age, instance.frontendUrl, instance.apiUrl) + return notRedirect && watchPageStatus && streamStatus && age +} + +const staticFilters = (data as PipedInstance[]) + .filter(instance => { + const isup = instance.status === "up" + const monthCheck = percentNumber(instance.uptimeMonth) >= 90 + const dailyMinuteCheck = dailyMinuteFilter(instance.dailyMinutesDown) + return isup && monthCheck && dailyMinuteCheck + }) + .map(async instance => { + // get frontend url + const frontendUrl = await getWatchPage(instance) + if (!frontendUrl) return null // return false if frontend doesn't resolve + // get api base + const apiUrl = instance.url.replace("/healthcheck", "") + const historyUrl = `https://raw.githubusercontent.com/TeamPiped/piped-uptime/master/history/${instance.slug}.yml` + const pass = await siteOK({ apiUrl, historyUrl, frontendUrl, url: instance.url }) + const frontendHost = getHost(frontendUrl) + return pass ? frontendHost : null + }) + +export async function getPipedList(): Promise<string[]> { + const instances = await Promise.all(staticFilters) + .then(arr => arr.filter(i => i !== null)) + return instances +} diff --git a/ci/prettify.ts b/ci/prettify.ts new file mode 100644 index 00000000..c965a3a3 --- /dev/null +++ b/ci/prettify.ts @@ -0,0 +1,6 @@ +import { writeFile } from 'fs'; + +import * as license from "../oss-attribution/licenseInfos.json"; + +const result = JSON.stringify(license, null, 2); +writeFile("../oss-attribution/licenseInfos.json", result, err => { if (err) return console.log(err) } );
\ No newline at end of file diff --git a/config.json.example b/config.json.example index c5e86444..b67a8440 100644 --- a/config.json.example +++ b/config.json.example @@ -30,5 +30,17 @@ "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" + }, + "extensionImportList": { + "chromium": [ + "enamippconapkdmgfgjchkhakpfinmaj" + ], + "firefox": [ + "[email protected]", + ], + "safari": [ + "app.ajay.dearrow.extension" + ] } } diff --git a/manifest/chrome-manifest-extra.json b/manifest/chrome-manifest-extra.json index 8fe52df2..9cb5082d 100644 --- a/manifest/chrome-manifest-extra.json +++ b/manifest/chrome-manifest-extra.json @@ -1,8 +1,12 @@ { "optional_permissions": [ - "declarativeContent" + "declarativeContent", + "webNavigation" ], "background": { "persistent": false - } + }, + "permissions": [ + "https://*.youtube.com/*" + ] } diff --git a/manifest/firefox-manifest-extra.json b/manifest/firefox-manifest-extra.json index f481cb1c..714fef58 100644 --- a/manifest/firefox-manifest-extra.json +++ b/manifest/firefox-manifest-extra.json @@ -3,5 +3,11 @@ "gecko": { "id": "[email protected]" } - } + }, + "background": { + "persistent": false + }, + "permissions": [ + "scripting" + ] } diff --git a/manifest/manifest.json b/manifest/manifest.json index 2292923c..5eff251a 100644 --- a/manifest/manifest.json +++ b/manifest/manifest.json @@ -1,7 +1,7 @@ { "name": "__MSG_fullName__", "short_name": "SponsorBlock", - "version": "5.1.0", + "version": "5.4.18", "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": [ @@ -68,9 +67,17 @@ "icons/export.svg", "icons/PlayerInfoIconSponsorBlocker.svg", "icons/PlayerDeleteIconSponsorBlocker.svg", + "icons/dearrow.svg", "popup.html", + "popup.css", "content.css", - "js/document.js" + "shared.css", + "js/document.js", + "libs/Source+Sans+Pro.css", + "libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdu.woff2", + "libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmRduz8A.woff2", + "libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmBduz8A.woff2", + "libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlBduz8A.woff2" ], "permissions": [ "storage", @@ -85,8 +92,8 @@ "default_icon": { "16": "icons/IconSponsorBlocker16px.png", "32": "icons/IconSponsorBlocker32px.png", - "64": "icons/LogoSponsorBlocker64px.png", - "128": "icons/LogoSponsorBlocker128px.png" + "64": "icons/IconSponsorBlocker64px.png", + "128": "icons/IconSponsorBlocker128px.png" }, "theme_icons": [ { @@ -100,31 +107,45 @@ "size": 32 }, { - "light": "icons/LogoSponsorBlocker64px.png", - "dark": "icons/LogoSponsorBlocker64px.png", + "light": "icons/IconSponsorBlocker64px.png", + "dark": "icons/IconSponsorBlocker64px.png", "size": 64 }, { - "light": "icons/LogoSponsorBlocker128px.png", - "dark": "icons/LogoSponsorBlocker128px.png", + "light": "icons/IconSponsorBlocker128px.png", + "dark": "icons/IconSponsorBlocker128px.png", "size": 128 + }, + { + "light": "icons/IconSponsorBlocker256px.png", + "dark": "icons/IconSponsorBlocker256px.png", + "size": 256 + }, + { + "light": "icons/IconSponsorBlocker512px.png", + "dark": "icons/IconSponsorBlocker512px.png", + "size": 512 + }, + { + "light": "icons/IconSponsorBlocker1024px.png", + "dark": "icons/IconSponsorBlocker1024px.png", + "size": 1024 } ] }, "background": { "scripts":[ - "./js/vendor.js", "./js/background.js" ] }, "icons": { "16": "icons/IconSponsorBlocker16px.png", "32": "icons/IconSponsorBlocker32px.png", - "64": "icons/LogoSponsorBlocker64px.png", - "128": "icons/LogoSponsorBlocker128px.png", - "256": "icons/LogoSponsorBlocker256px.png", - "512": "icons/LogoSponsorBlocker512px.png", - "1024": "icons/LogoSponsorBlocker1024px.png" + "64": "icons/IconSponsorBlocker64px.png", + "128": "icons/IconSponsorBlocker128px.png", + "256": "icons/IconSponsorBlocker256px.png", + "512": "icons/IconSponsorBlocker512px.png", + "1024": "icons/IconSponsorBlocker1024px.png" }, "options_ui": { "page": "options/options.html", diff --git a/manifest/safari-manifest-extra.json b/manifest/safari-manifest-extra.json index 30f46118..1706b2c3 100644 --- a/manifest/safari-manifest-extra.json +++ b/manifest/safari-manifest-extra.json @@ -1,5 +1,11 @@ { "background": { "persistent": false - } + }, + "permissions": [ + "scripting" + ], + "optional_permissions": [ + "webNavigation" + ] } diff --git a/maze-utils b/maze-utils new file mode 160000 +Subproject 4f7384e03f87370cb09129ac43901725dcef19a diff --git a/oss-attribution/licenseInfos.json b/oss-attribution/licenseInfos.json index 72f18799..67b93f49 100644 --- a/oss-attribution/licenseInfos.json +++ b/oss-attribution/licenseInfos.json @@ -1 +1,89 @@ -{"js-tokens":{"ignore":false,"name":"js-tokens","version":"4.0.0","authors":"Simon Lydell","url":"https://github.com/lydell/js-tokens","license":"MIT","licenseText":"The MIT License (MIT)\n\nCopyright (c) 2014, 2015, 2016, 2017, 2018 Simon Lydell\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"},"loose-envify":{"ignore":false,"name":"loose-envify","version":"1.4.0","authors":"Andres Suarez <[email protected]>","url":"https://github.com/zertosh/loose-envify","license":"MIT","licenseText":"The MIT License (MIT)\n\nCopyright (c) 2015 Andres Suarez <[email protected]>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"},"react-dom":{"ignore":false,"name":"react-dom","version":"18.2.0","url":"https://github.com/facebook/react","license":"MIT","licenseText":"MIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},"react":{"ignore":false,"name":"react","version":"18.2.0","url":"https://github.com/facebook/react","license":"MIT","licenseText":"MIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},"scheduler":{"ignore":false,"name":"scheduler","version":"0.23.0","url":"https://github.com/facebook/react","license":"MIT","licenseText":"MIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"}}
\ No newline at end of file +{ + "content-scripts-register-polyfill": { + "ignore": false, + "name": "content-scripts-register-polyfill", + "version": "4.0.2", + "authors": "Federico Brigante <[email protected]> (https://fregante.com)", + "url": "https://github.com/fregante/content-scripts-register-polyfill", + "license": "MIT", + "licenseText": "MIT License\n\nCopyright (c) Federico Brigante <[email protected]> (https://fregante.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n" + }, + "escape-string-regexp": { + "ignore": false, + "name": "escape-string-regexp", + "version": "5.0.0", + "authors": "Sindre Sorhus <[email protected]>", + "url": "https://github.com/sindresorhus/escape-string-regexp", + "license": "MIT", + "licenseText": "MIT License\n\nCopyright (c) Sindre Sorhus <[email protected]> (https://sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n" + }, + "js-tokens": { + "ignore": false, + "name": "js-tokens", + "version": "4.0.0", + "authors": "Simon Lydell", + "url": "https://github.com/lydell/js-tokens", + "license": "MIT", + "licenseText": "The MIT License (MIT)\n\nCopyright (c) 2014, 2015, 2016, 2017, 2018 Simon Lydell\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n" + }, + "loose-envify": { + "ignore": false, + "name": "loose-envify", + "version": "1.4.0", + "authors": "Andres Suarez <[email protected]>", + "url": "https://github.com/zertosh/loose-envify", + "license": "MIT", + "licenseText": "The MIT License (MIT)\n\nCopyright (c) 2015 Andres Suarez <[email protected]>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n" + }, + "react-dom": { + "ignore": false, + "name": "react-dom", + "version": "18.2.0", + "url": "https://github.com/facebook/react", + "license": "MIT", + "licenseText": "MIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n" + }, + "react": { + "ignore": false, + "name": "react", + "version": "18.2.0", + "url": "https://github.com/facebook/react", + "license": "MIT", + "licenseText": "MIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n" + }, + "scheduler": { + "ignore": false, + "name": "scheduler", + "version": "0.23.0", + "url": "https://github.com/facebook/react", + "license": "MIT", + "licenseText": "MIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n" + }, + "webext-content-scripts": { + "ignore": false, + "name": "webext-content-scripts", + "version": "2.5.5", + "authors": "Federico Brigante <[email protected]> (https://fregante.com)", + "url": "https://github.com/fregante/webext-content-scripts", + "license": "MIT", + "licenseText": "MIT License\n\nCopyright (c) Federico Brigante <[email protected]> (https://fregante.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n" + }, + "webext-patterns": { + "ignore": false, + "name": "webext-patterns", + "version": "1.3.0", + "authors": "Federico Brigante <[email protected]> (https://fregante.com)", + "url": "https://github.com/fregante/webext-patterns", + "license": "MIT", + "licenseText": "MIT License\n\nCopyright (c) Federico Brigante <[email protected]> (https://fregante.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n" + }, + "webext-polyfill-kinda": { + "ignore": false, + "name": "webext-polyfill-kinda", + "version": "1.0.2", + "authors": "Federico Brigante <[email protected]> (https://fregante.com)", + "url": "https://github.com/fregante/webext-polyfill-kinda", + "license": "MIT", + "licenseText": "MIT License\n\nCopyright (c) Federico Brigante <[email protected]> (https://fregante.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n" + } +}
\ No newline at end of file diff --git a/package-lock.json b/package-lock.json index c92982f0..4e986143 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,37 +27,37 @@ ], "license": "LGPL-3.0-or-later", "dependencies": { + "content-scripts-register-polyfill": "^4.0.2", "react": "^18.2.0", "react-dom": "^18.2.0" }, "devDependencies": { - "@types/chrome": "^0.0.197", - "@types/firefox-webext-browser": "^94.0.1", - "@types/jest": "^29.1.2", - "@types/react": "^18.0.21", - "@types/react-dom": "^18.0.6", - "@types/selenium-webdriver": "^4.1.5", + "@types/chrome": "^0.0.220", + "@types/firefox-webext-browser": "^111.0.0", + "@types/jest": "^29.4.0", + "@types/react": "^18.0.28", + "@types/react-dom": "^18.0.11", + "@types/selenium-webdriver": "^4.1.13", "@types/wicg-mediasession": "^1.1.4", - "@typescript-eslint/eslint-plugin": "^5.39.0", - "@typescript-eslint/parser": "^5.39.0", - "chromedriver": "^106.0.1", - "concurrently": "^7.4.0", + "@typescript-eslint/eslint-plugin": "^5.54.1", + "@typescript-eslint/parser": "^5.54.1", + "chromedriver": "^110.0.0", + "concurrently": "^7.6.0", "copy-webpack-plugin": "^11.0.0", - "eslint": "^8.24.0", - "eslint-plugin-react": "^7.31.8", - "fork-ts-checker-webpack-plugin": "^7.2.13", - "jest": "^29.1.2", - "jest-environment-jsdom": "^29.1.2", - "rimraf": "^3.0.2", + "eslint": "^8.35.0", + "eslint-plugin-react": "^7.32.2", + "fork-ts-checker-webpack-plugin": "^7.3.0", + "jest": "^29.5.0", + "jest-environment-jsdom": "^29.5.0", + "rimraf": "^4.3.1", "schema-utils": "^4.0.0", - "selenium-webdriver": "^4.5.0", - "speed-measure-webpack-plugin": "^1.5.0", - "ts-jest": "^29.0.3", - "ts-loader": "^9.4.1", + "selenium-webdriver": "^4.8.1", + "ts-jest": "^29.0.5", + "ts-loader": "^9.4.2", "ts-node": "^10.9.1", - "typescript": "4.8", - "web-ext": "^7.2.0", - "webpack": "^5.74.0", + "typescript": "4.9", + "web-ext": "^7.6.2", + "webpack": "^5.75.0", "webpack-cli": "^4.10.0", "webpack-merge": "^5.8.0" }, @@ -274,9 +274,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", - "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", "dev": true, "engines": { "node": ">=6.9.0" @@ -329,9 +329,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.3.tgz", - "integrity": "sha512-pJ9xOlNWHiy9+FuFP09DEAFbAn4JskgRsVcc169w2xRBC3FRGuQEwjeIMMND9L2zc0iEhO/tGv4Zq+km+hxNpQ==", + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.13.tgz", + "integrity": "sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -503,12 +503,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz", - "integrity": "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", + "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -518,12 +518,12 @@ } }, "node_modules/@babel/runtime": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", - "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", + "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", "dev": true, "dependencies": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.13.11" }, "engines": { "node": ">=6.9.0" @@ -565,12 +565,12 @@ } }, "node_modules/@babel/types": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.3.tgz", - "integrity": "sha512-hGCaQzIY22DJlDh9CH7NOxgKkFjBk0Cw9xDO1Xmh2151ti7wiGfQ3LauXzL4HP1fmFlTX6XjpRETTpUcv7wQLw==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-string-parser": "^7.19.4", "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" }, @@ -663,16 +663,40 @@ "node": ">=10.0.0" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", + "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.2.tgz", - "integrity": "sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", + "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.15.0", + "espree": "^9.5.1", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -709,15 +733,27 @@ } } }, + "node_modules/@eslint/eslintrc/node_modules/eslint-visitor-keys": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", + "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@eslint/eslintrc/node_modules/espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", + "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", "dev": true, "dependencies": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -727,9 +763,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -765,30 +801,39 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@eslint/js": { + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz", + "integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@fluent/syntax": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@fluent/syntax/-/syntax-0.19.0.tgz", + "integrity": "sha512-5D2qVpZrgpjtqU4eNOcWGp1gnUCgjfM+vKGE2y03kKN6z5EBhtx0qdRFbg8QuNNj8wXNoX93KJoYb+NqoxswmQ==", + "dev": true, + "engines": { + "node": ">=14.0.0", + "npm": ">=7.0.0" + } + }, "node_modules/@humanwhocodes/config-array": { - "version": "0.10.7", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.7.tgz", - "integrity": "sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==", + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5" }, "engines": { "node": ">=10.10.0" } }, - "node_modules/@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", - "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -834,16 +879,16 @@ } }, "node_modules/@jest/console": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.1.2.tgz", - "integrity": "sha512-ujEBCcYs82BTmRxqfHMQggSlkUZP63AE5YEaTPj7eFyJOzukkTorstOUC7L6nE3w5SYadGVAnTsQ/ZjTGL0qYQ==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.5.0.tgz", + "integrity": "sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==", "dev": true, "dependencies": { - "@jest/types": "^29.1.2", + "@jest/types": "^29.5.0", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.1.2", - "jest-util": "^29.1.2", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", "slash": "^3.0.0" }, "engines": { @@ -921,37 +966,37 @@ } }, "node_modules/@jest/core": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.1.2.tgz", - "integrity": "sha512-sCO2Va1gikvQU2ynDN8V4+6wB7iVrD2CvT0zaRst4rglf56yLly0NQ9nuRRAWFeimRf+tCdFsb1Vk1N9LrrMPA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.5.0.tgz", + "integrity": "sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==", "dev": true, "dependencies": { - "@jest/console": "^29.1.2", - "@jest/reporters": "^29.1.2", - "@jest/test-result": "^29.1.2", - "@jest/transform": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/console": "^29.5.0", + "@jest/reporters": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.0.0", - "jest-config": "^29.1.2", - "jest-haste-map": "^29.1.2", - "jest-message-util": "^29.1.2", - "jest-regex-util": "^29.0.0", - "jest-resolve": "^29.1.2", - "jest-resolve-dependencies": "^29.1.2", - "jest-runner": "^29.1.2", - "jest-runtime": "^29.1.2", - "jest-snapshot": "^29.1.2", - "jest-util": "^29.1.2", - "jest-validate": "^29.1.2", - "jest-watcher": "^29.1.2", + "jest-changed-files": "^29.5.0", + "jest-config": "^29.5.0", + "jest-haste-map": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-resolve-dependencies": "^29.5.0", + "jest-runner": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "jest-watcher": "^29.5.0", "micromatch": "^4.0.4", - "pretty-format": "^29.1.2", + "pretty-format": "^29.5.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -1038,88 +1083,88 @@ } }, "node_modules/@jest/environment": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.1.2.tgz", - "integrity": "sha512-rG7xZ2UeOfvOVzoLIJ0ZmvPl4tBEQ2n73CZJSlzUjPw4or1oSWC0s0Rk0ZX+pIBJ04aVr6hLWFn1DFtrnf8MhQ==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz", + "integrity": "sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/fake-timers": "^29.5.0", + "@jest/types": "^29.5.0", "@types/node": "*", - "jest-mock": "^29.1.2" + "jest-mock": "^29.5.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.1.2.tgz", - "integrity": "sha512-FXw/UmaZsyfRyvZw3M6POgSNqwmuOXJuzdNiMWW9LCYo0GRoRDhg+R5iq5higmRTHQY7hx32+j7WHwinRmoILQ==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.5.0.tgz", + "integrity": "sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==", "dev": true, "dependencies": { - "expect": "^29.1.2", - "jest-snapshot": "^29.1.2" + "expect": "^29.5.0", + "jest-snapshot": "^29.5.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.1.2.tgz", - "integrity": "sha512-4a48bhKfGj/KAH39u0ppzNTABXQ8QPccWAFUFobWBaEMSMp+sB31Z2fK/l47c4a/Mu1po2ffmfAIPxXbVTXdtg==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz", + "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==", "dev": true, "dependencies": { - "jest-get-type": "^29.0.0" + "jest-get-type": "^29.4.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/fake-timers": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.1.2.tgz", - "integrity": "sha512-GppaEqS+QQYegedxVMpCe2xCXxxeYwQ7RsNx55zc8f+1q1qevkZGKequfTASI7ejmg9WwI+SJCrHe9X11bLL9Q==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.5.0.tgz", + "integrity": "sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==", "dev": true, "dependencies": { - "@jest/types": "^29.1.2", - "@sinonjs/fake-timers": "^9.1.2", + "@jest/types": "^29.5.0", + "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.1.2", - "jest-mock": "^29.1.2", - "jest-util": "^29.1.2" + "jest-message-util": "^29.5.0", + "jest-mock": "^29.5.0", + "jest-util": "^29.5.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.1.2.tgz", - "integrity": "sha512-uMgfERpJYoQmykAd0ffyMq8wignN4SvLUG6orJQRe9WAlTRc9cdpCaE/29qurXixYJVZWUqIBXhSk8v5xN1V9g==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.5.0.tgz", + "integrity": "sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.1.2", - "@jest/expect": "^29.1.2", - "@jest/types": "^29.1.2", - "jest-mock": "^29.1.2" + "@jest/environment": "^29.5.0", + "@jest/expect": "^29.5.0", + "@jest/types": "^29.5.0", + "jest-mock": "^29.5.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.1.2.tgz", - "integrity": "sha512-X4fiwwyxy9mnfpxL0g9DD0KcTmEIqP0jUdnc2cfa9riHy+I6Gwwp5vOZiwyg0vZxfSDxrOlK9S4+340W4d+DAA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.5.0.tgz", + "integrity": "sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.1.2", - "@jest/test-result": "^29.1.2", - "@jest/transform": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/console": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", "@jridgewell/trace-mapping": "^0.3.15", "@types/node": "*", "chalk": "^4.0.0", @@ -1132,13 +1177,12 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.1.2", - "jest-util": "^29.1.2", - "jest-worker": "^29.1.2", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", + "jest-worker": "^29.5.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", - "terminal-link": "^2.0.0", "v8-to-istanbul": "^9.0.1" }, "engines": { @@ -1212,13 +1256,13 @@ } }, "node_modules/@jest/reporters/node_modules/jest-worker": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.1.2.tgz", - "integrity": "sha512-AdTZJxKjTSPHbXT/AIOjQVmoFx0LHFcVabWu0sxI7PAy7rFf8c0upyvgBKgguVXdM4vY74JdwkyD4hSmpTW8jA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", + "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.1.2", + "jest-util": "^29.5.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -1254,21 +1298,21 @@ } }, "node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", + "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "dependencies": { - "@sinclair/typebox": "^0.24.1" + "@sinclair/typebox": "^0.25.16" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/source-map": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.0.0.tgz", - "integrity": "sha512-nOr+0EM8GiHf34mq2GcJyz/gYFyLQ2INDhAylrZJ9mMWoW21mLBfZa0BUVPPMxVYrLjeiRe2Z7kWXOGnS0TFhQ==", + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz", + "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.15", @@ -1280,13 +1324,13 @@ } }, "node_modules/@jest/test-result": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.1.2.tgz", - "integrity": "sha512-jjYYjjumCJjH9hHCoMhA8PCl1OxNeGgAoZ7yuGYILRJX9NjgzTN0pCT5qAoYR4jfOP8htIByvAlz9vfNSSBoVg==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.5.0.tgz", + "integrity": "sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==", "dev": true, "dependencies": { - "@jest/console": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/console": "^29.5.0", + "@jest/types": "^29.5.0", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" }, @@ -1295,14 +1339,14 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.1.2.tgz", - "integrity": "sha512-fU6dsUqqm8sA+cd85BmeF7Gu9DsXVWFdGn9taxM6xN1cKdcP/ivSgXh5QucFRFz1oZxKv3/9DYYbq0ULly3P/Q==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz", + "integrity": "sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==", "dev": true, "dependencies": { - "@jest/test-result": "^29.1.2", + "@jest/test-result": "^29.5.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.1.2", + "jest-haste-map": "^29.5.0", "slash": "^3.0.0" }, "engines": { @@ -1310,26 +1354,26 @@ } }, "node_modules/@jest/transform": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.1.2.tgz", - "integrity": "sha512-2uaUuVHTitmkx1tHF+eBjb4p7UuzBG7SXIaA/hNIkaMP6K+gXYGxP38ZcrofzqN0HeZ7A90oqsOa97WU7WZkSw==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.5.0.tgz", + "integrity": "sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/types": "^29.1.2", + "@jest/types": "^29.5.0", "@jridgewell/trace-mapping": "^0.3.15", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", + "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.1.2", - "jest-regex-util": "^29.0.0", - "jest-util": "^29.1.2", + "jest-haste-map": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.5.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" + "write-file-atomic": "^4.0.2" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -1384,6 +1428,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/@jest/transform/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, "node_modules/@jest/transform/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -1419,12 +1469,12 @@ } }, "node_modules/@jest/types": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.1.2.tgz", - "integrity": "sha512-DcXGtoTykQB5jiwCmVr8H4vdg2OJhQex3qPkG+ISyDO7xQXbt/4R6dowcRyPemRnkH7JoHvZuxPBdlq+9JxFCg==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", + "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", "dev": true, "dependencies": { - "@jest/schemas": "^29.0.0", + "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", @@ -1575,17 +1625,18 @@ } }, "node_modules/@mdn/browser-compat-data": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.1.8.tgz", - "integrity": "sha512-gHZvccExN0upm9gjJZnmavwQWeFHwxBOxiwiHzYYtsRSlu0xBafz0WFCgRqWmzJh/ABNz87/4nhB7FTaop3r6Q==", + "version": "5.2.42", + "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.2.42.tgz", + "integrity": "sha512-CD/2ai1W45cDN/zN2AcYduDavU+nq9aStyQizi4MHxnwkRvS/H24WIjgc1qD8CISoqXa8AAIe+A+zpWxwV7a2Q==", "dev": true }, "node_modules/@nodelib/fs.scandir": { - "version": "2.1.3", - "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "dependencies": { - "@nodelib/fs.stat": "2.0.3", + "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" }, "engines": { @@ -1593,19 +1644,21 @@ } }, "node_modules/@nodelib/fs.stat": { - "version": "2.0.3", - "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.walk": { - "version": "1.2.4", - "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "dependencies": { - "@nodelib/fs.scandir": "2.1.3", + "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" }, "engines": { @@ -1638,39 +1691,39 @@ } }, "node_modules/@sinclair/typebox": { - "version": "0.24.44", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.44.tgz", - "integrity": "sha512-ka0W0KN5i6LfrSocduwliMMpqVgohtPFidKdMEOUjoOFCHcOOYkKsPRxfs5f15oPNHTm6ERAm0GV/+/LTKeiWg==", + "version": "0.25.24", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", + "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz", + "integrity": "sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==", "dev": true, "engines": { - "node": ">=10" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sindresorhus/is?sponsor=1" } }, "node_modules/@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", "dev": true, "dependencies": { "type-detect": "4.0.8" } }, "node_modules/@sinonjs/fake-timers": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", - "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", + "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", "dev": true, "dependencies": { - "@sinonjs/commons": "^1.7.0" + "@sinonjs/commons": "^2.0.0" } }, "node_modules/@szmarczak/http-timer": { @@ -1721,13 +1774,13 @@ "dev": true }, "node_modules/@types/babel__core": { - "version": "7.1.19", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", - "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", + "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", "dev": true, "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" @@ -1761,22 +1814,10 @@ "@babel/types": "^7.3.0" } }, - "node_modules/@types/cacheable-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", - "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", - "dev": true, - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" - } - }, "node_modules/@types/chrome": { - "version": "0.0.197", - "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.197.tgz", - "integrity": "sha512-m1NfS5bOjaypyqQfaX6CxmJodZVcvj5+Mt/K94EBHkflYjPNmXHAzbxfifdLMa0YM3PDyOxohoTS5ug/e6p5jA==", + "version": "0.0.220", + "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.220.tgz", + "integrity": "sha512-s5Sl4M3z3+IQLvYbR1yA+UVjX+LTtodmuZjqL6LkP+MWmuoNl1yryoJVCHBqEDZTH5p5PALGgkQVSTfjfYwXlg==", "dev": true, "dependencies": { "@types/filesystem": "*", @@ -1823,15 +1864,15 @@ "dev": true }, "node_modules/@types/firefox-webext-browser": { - "version": "94.0.1", - "resolved": "https://registry.npmjs.org/@types/firefox-webext-browser/-/firefox-webext-browser-94.0.1.tgz", - "integrity": "sha512-I6iHRQJSTZ+gYt2IxdH2RRAMvcUyK8v5Ig7fHQR0IwUNYP7hz9+cziBVIKxLCO6XI7fiyRsNOWObfl3/4Js2Lg==", + "version": "111.0.0", + "resolved": "https://registry.npmjs.org/@types/firefox-webext-browser/-/firefox-webext-browser-111.0.0.tgz", + "integrity": "sha512-KboW0ughUYzuYAvzWGJsiSMmH9AgJDvnstjsNrXMgf6cpJ5g1eBGzkqpjPzVqkOyTH/mFl7gd15+XyaVQhKywA==", "dev": true }, "node_modules/@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", "dev": true, "dependencies": { "@types/node": "*" @@ -1873,9 +1914,9 @@ } }, "node_modules/@types/jest": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.1.2.tgz", - "integrity": "sha512-y+nlX0h87U0R+wsGn6EBuoRWYyv3KFtwRNP3QWp9+k2tJ2/bqcGS3UxD7jgT+tiwJWWq3UsyV4Y+T6rsMT4XMg==", + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.4.0.tgz", + "integrity": "sha512-VaywcGQ9tPorCX/Jkkni7RWGFfI11whqzs8dvxF41P17Z+z872thvEvlIbznjPJ02kl1HMX3LmLOonsj2n7HeQ==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -1893,26 +1934,11 @@ "parse5": "^7.0.0" } }, - "node_modules/@types/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ==", - "dev": true - }, "node_modules/@types/json-schema": { "version": "7.0.9", "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/minimatch": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", @@ -1931,9 +1957,9 @@ "dev": true }, "node_modules/@types/prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==", + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", + "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", "dev": true }, "node_modules/@types/prop-types": { @@ -1942,9 +1968,9 @@ "dev": true }, "node_modules/@types/react": { - "version": "18.0.21", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.21.tgz", - "integrity": "sha512-7QUCOxvFgnD5Jk8ZKlUAhVcRj7GuJRjnjjiY/IUBWKgOlnvDvTMLD4RTF7NPyVmbRhNrbomZiOepg7M/2Kj1mA==", + "version": "18.0.28", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.28.tgz", + "integrity": "sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==", "dev": true, "dependencies": { "@types/prop-types": "*", @@ -1953,37 +1979,34 @@ } }, "node_modules/@types/react-dom": { - "version": "18.0.6", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.6.tgz", - "integrity": "sha512-/5OFZgfIPSwy+YuIBP/FgJnQnsxhZhjjrnxudMddeblOouIodEQ75X14Rr4wGSG/bknL+Omy9iWlLo1u/9GzAA==", + "version": "18.0.11", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.11.tgz", + "integrity": "sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==", "dev": true, "dependencies": { "@types/react": "*" } }, - "node_modules/@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/scheduler": { "version": "0.16.2", "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", "dev": true }, "node_modules/@types/selenium-webdriver": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.1.5.tgz", - "integrity": "sha512-Lfu97JK5b2jAxCUHH8uMjmhUiQZCGDyVzSAskFFZuWcprtcwjMkEPZE/SiIM5hOGQJVs982BAF26a3kmw8iiJw==", + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.1.13.tgz", + "integrity": "sha512-kGpIh7bvu4HGCJXl4PEJ53kzpG4iXlRDd66SNNCfJ58QhFuk9skOm57lVffZap5ChEOJwbge/LJ9IVGVC8EEOg==", "dev": true, "dependencies": { "@types/ws": "*" } }, + "node_modules/@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true + }, "node_modules/@types/stack-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", @@ -2036,16 +2059,18 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.39.0.tgz", - "integrity": "sha512-xVfKOkBm5iWMNGKQ2fwX5GVgBuHmZBO1tCRwXmY5oAIsPscfwm2UADDuNB8ZVYCtpQvJK4xpjrK7jEhcJ0zY9A==", + "version": "5.54.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.54.1.tgz", + "integrity": "sha512-a2RQAkosH3d3ZIV08s3DcL/mcGc2M/UC528VkPULFxR9VnVPT8pBu0IyBAJJmVsCmhVfwQX1v6q+QGnmSe1bew==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.39.0", - "@typescript-eslint/type-utils": "5.39.0", - "@typescript-eslint/utils": "5.39.0", + "@typescript-eslint/scope-manager": "5.54.1", + "@typescript-eslint/type-utils": "5.54.1", + "@typescript-eslint/utils": "5.54.1", "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" @@ -2100,14 +2125,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.39.0.tgz", - "integrity": "sha512-PhxLjrZnHShe431sBAGHaNe6BDdxAASDySgsBCGxcBecVCi8NQWxQZMcizNA4g0pN51bBAn/FUfkWG3SDVcGlA==", + "version": "5.54.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.54.1.tgz", + "integrity": "sha512-8zaIXJp/nG9Ff9vQNh7TI+C3nA6q6iIsGJ4B4L6MhZ7mHnTMR4YP5vp2xydmFXIy8rpyIVbNAG44871LMt6ujg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.39.0", - "@typescript-eslint/types": "5.39.0", - "@typescript-eslint/typescript-estree": "5.39.0", + "@typescript-eslint/scope-manager": "5.54.1", + "@typescript-eslint/types": "5.54.1", + "@typescript-eslint/typescript-estree": "5.54.1", "debug": "^4.3.4" }, "engines": { @@ -2144,13 +2169,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.39.0.tgz", - "integrity": "sha512-/I13vAqmG3dyqMVSZPjsbuNQlYS082Y7OMkwhCfLXYsmlI0ca4nkL7wJ/4gjX70LD4P8Hnw1JywUVVAwepURBw==", + "version": "5.54.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.54.1.tgz", + "integrity": "sha512-zWKuGliXxvuxyM71UA/EcPxaviw39dB2504LqAmFDjmkpO8qNLHcmzlh6pbHs1h/7YQ9bnsO8CCcYCSA8sykUg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.39.0", - "@typescript-eslint/visitor-keys": "5.39.0" + "@typescript-eslint/types": "5.54.1", + "@typescript-eslint/visitor-keys": "5.54.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2161,13 +2186,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.39.0.tgz", - "integrity": "sha512-KJHJkOothljQWzR3t/GunL0TPKY+fGJtnpl+pX+sJ0YiKTz3q2Zr87SGTmFqsCMFrLt5E0+o+S6eQY0FAXj9uA==", + "version": "5.54.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.54.1.tgz", + "integrity": "sha512-WREHsTz0GqVYLIbzIZYbmUUr95DKEKIXZNH57W3s+4bVnuF1TKe2jH8ZNH8rO1CeMY3U4j4UQeqPNkHMiGem3g==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.39.0", - "@typescript-eslint/utils": "5.39.0", + "@typescript-eslint/typescript-estree": "5.54.1", + "@typescript-eslint/utils": "5.54.1", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -2205,9 +2230,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.39.0.tgz", - "integrity": "sha512-gQMZrnfEBFXK38hYqt8Lkwt8f4U6yq+2H5VDSgP/qiTzC8Nw8JO3OuSUOQ2qW37S/dlwdkHDntkZM6SQhKyPhw==", + "version": "5.54.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.54.1.tgz", + "integrity": "sha512-G9+1vVazrfAfbtmCapJX8jRo2E4MDXxgm/IMOF4oGh3kq7XuK3JRkOg6y2Qu1VsTRmWETyTkWt1wxy7X7/yLkw==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2218,13 +2243,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.39.0.tgz", - "integrity": "sha512-qLFQP0f398sdnogJoLtd43pUgB18Q50QSA+BTE5h3sUxySzbWDpTSdgt4UyxNSozY/oDK2ta6HVAzvGgq8JYnA==", + "version": "5.54.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.54.1.tgz", + "integrity": "sha512-bjK5t+S6ffHnVwA0qRPTZrxKSaFYocwFIkZx5k7pvWfsB1I57pO/0M0Skatzzw1sCkjJ83AfGTL0oFIFiDX3bg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.39.0", - "@typescript-eslint/visitor-keys": "5.39.0", + "@typescript-eslint/types": "5.54.1", + "@typescript-eslint/visitor-keys": "5.54.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -2277,17 +2302,19 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.39.0.tgz", - "integrity": "sha512-+DnY5jkpOpgj+EBtYPyHRjXampJfC0yUZZzfzLuUWVZvCuKqSdJVC8UhdWipIw7VKNTfwfAPiOWzYkAwuIhiAg==", + "version": "5.54.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.54.1.tgz", + "integrity": "sha512-IY5dyQM8XD1zfDe5X8jegX6r2EVU5o/WJnLu/znLPWCBF7KNGC+adacXnt5jEYS9JixDcoccI6CvE4RCjHMzCQ==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.39.0", - "@typescript-eslint/types": "5.39.0", - "@typescript-eslint/typescript-estree": "5.39.0", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.54.1", + "@typescript-eslint/types": "5.54.1", + "@typescript-eslint/typescript-estree": "5.54.1", "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2300,13 +2327,28 @@ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/@typescript-eslint/utils/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.39.0.tgz", - "integrity": "sha512-yyE3RPwOG+XJBLrhvsxAidUgybJVQ/hG8BhiJo0k8JSAYfk/CshVcxf0HwP4Jt7WZZ6vLmxdo1p6EyN3tzFTkg==", + "version": "5.54.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.54.1.tgz", + "integrity": "sha512-q8iSoHTgwCfgcRJ2l2x+xCbu8nBlRAlsQ33k24Adj8eoVBE0f8dUeI+bAa8F84Mv05UGbAx57g2zrRsYIooqQg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.39.0", + "@typescript-eslint/types": "5.54.1", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -2570,41 +2612,42 @@ } }, "node_modules/addons-linter": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/addons-linter/-/addons-linter-5.14.0.tgz", - "integrity": "sha512-50thc5vltnIeRkLCH/PxmnKhWXiguDs7SoPVNDF7YkMp9X58zHBJKKBgroJZaDFwzWOPLdxOM9ClU0JFkLR8WQ==", + "version": "5.32.0", + "resolved": "https://registry.npmjs.org/addons-linter/-/addons-linter-5.32.0.tgz", + "integrity": "sha512-Lf6oOyw8X9z5BMd9xhQwSbPlN2PUlzDLnYLAVT5lkrgXEx0fO9hRk4JRxWZ8+rFGz+mCIA2TTClZF2f+MKgJQA==", "dev": true, "dependencies": { - "@mdn/browser-compat-data": "5.1.8", - "addons-moz-compare": "1.2.0", - "addons-scanner-utils": "7.1.0", - "ajv": "8.11.0", - "ajv-merge-patch": "5.0.1", + "@fluent/syntax": "0.19.0", + "@mdn/browser-compat-data": "5.2.42", + "addons-moz-compare": "1.3.0", + "addons-scanner-utils": "8.5.0", + "ajv": "8.12.0", "chalk": "4.1.2", "cheerio": "1.0.0-rc.12", "columnify": "1.6.0", "common-tags": "1.8.2", - "deepmerge": "4.2.2", - "eslint": "8.21.0", - "eslint-plugin-no-unsanitized": "4.0.1", + "deepmerge": "4.3.1", + "eslint": "8.36.0", + "eslint-plugin-no-unsanitized": "4.0.2", "eslint-visitor-keys": "3.3.0", - "espree": "9.3.3", + "espree": "9.5.0", "esprima": "4.0.1", - "fluent-syntax": "0.13.0", - "glob": "8.0.3", + "fast-json-patch": "3.1.1", + "glob": "9.3.0", "image-size": "1.0.2", "is-mergeable-object": "1.1.1", "jed": "1.1.1", + "json-merge-patch": "1.0.2", "os-locale": "5.0.0", - "pino": "8.4.0", - "postcss": "8.4.16", + "pino": "8.11.0", + "postcss": "8.4.21", "relaxed-json": "1.0.3", - "semver": "7.3.7", + "semver": "7.3.8", "sha.js": "2.4.11", "source-map-support": "0.5.21", "tosource": "1.0.0", "upath": "2.0.1", - "yargs": "17.5.1", + "yargs": "17.7.1", "yauzl": "2.10.0" }, "bin": { @@ -2614,10 +2657,44 @@ "node": ">=12.21.0" } }, + "node_modules/addons-linter/node_modules/addons-scanner-utils": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/addons-scanner-utils/-/addons-scanner-utils-8.5.0.tgz", + "integrity": "sha512-X35SYZRdSnxx7UZuAk+DizKihQp2Ze2c5GV+5nnRr/FFyx/fOgE3Zo8jdhzSne57PENE9w1ZVocBLJTN6UDB3g==", + "dev": true, + "dependencies": { + "@types/yauzl": "2.10.0", + "common-tags": "1.8.2", + "first-chunk-stream": "3.0.0", + "strip-bom-stream": "4.0.0", + "upath": "2.0.1", + "yauzl": "2.10.0" + }, + "peerDependencies": { + "body-parser": "1.20.2", + "express": "4.18.2", + "node-fetch": "2.6.7", + "safe-compare": "1.1.4" + }, + "peerDependenciesMeta": { + "body-parser": { + "optional": true + }, + "express": { + "optional": true + }, + "node-fetch": { + "optional": true + }, + "safe-compare": { + "optional": true + } + } + }, "node_modules/addons-linter/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", @@ -2630,19 +2707,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/addons-linter/node_modules/ajv-merge-patch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ajv-merge-patch/-/ajv-merge-patch-5.0.1.tgz", - "integrity": "sha512-0UP3aJCzfzBOkmLR+EinJDCfg6DNtprj3bVPo7JJNgUpZMKt097t9xxQOWFGRoB4JvKKIHE2qe0HkVaS/HyrjQ==", - "dev": true, - "dependencies": { - "fast-json-patch": "^2.0.6", - "json-merge-patch": "^1.0.2" - }, - "peerDependencies": { - "ajv": ">=8.0.0" - } - }, "node_modules/addons-linter/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -2658,12 +2722,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/addons-linter/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, "node_modules/addons-linter/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -2707,219 +2765,24 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/addons-linter/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/addons-linter/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/addons-linter/node_modules/eslint": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.21.0.tgz", - "integrity": "sha512-/XJ1+Qurf1T9G2M5IHrsjp+xrGT73RZf23xA1z5wB1ZzzEAWSZKvRwhWxTFp1rvkvCfwcvAUNAP31bhKTTGfDA==", - "dev": true, - "dependencies": { - "@eslint/eslintrc": "^1.3.0", - "@humanwhocodes/config-array": "^0.10.4", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.3", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", - "globby": "^11.1.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/addons-linter/node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/addons-linter/node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/addons-linter/node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/addons-linter/node_modules/eslint/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/addons-linter/node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/addons-linter/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/addons-linter/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/addons-linter/node_modules/glob": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.0.tgz", + "integrity": "sha512-EAZejC7JvnQINayvB/7BJbpZpNOJ8Lrw2OZNEvQxe0vaLn1SuwMcfV7/MNaX8L/T0wmptBFI4YMtDvSBxYDc7w==", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "minimatch": "^7.4.1", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" }, "engines": { - "node": ">=12" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/addons-linter/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/addons-linter/node_modules/globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/addons-linter/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -2929,124 +2792,53 @@ "node": ">=8" } }, - "node_modules/addons-linter/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/addons-linter/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "node_modules/addons-linter/node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/addons-linter/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/addons-linter/node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", + "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { "node": ">=10" - } - }, - "node_modules/addons-linter/node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/addons-linter/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/addons-linter/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "node_modules/addons-linter/node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "p-limit": "^3.0.2" + "whatwg-url": "^5.0.0" }, "engines": { - "node": ">=10" + "node": "4.x || >=6.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/addons-linter/node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, "node_modules/addons-linter/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -3070,78 +2862,44 @@ "node": ">=8" } }, - "node_modules/addons-linter/node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "node_modules/addons-linter/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } + "optional": true, + "peer": true }, - "node_modules/addons-linter/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/addons-linter/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/addons-moz-compare": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/addons-moz-compare/-/addons-moz-compare-1.2.0.tgz", - "integrity": "sha512-COG8qk2/dubPqabfcoJW4E7pm2EQDI43iMrHnhlobvq/uRMEzx/PYJ1KaUZ97Vgg44R3QdRG5CvDsTRbMUHcDw==", - "dev": true + "optional": true, + "peer": true }, - "node_modules/addons-scanner-utils": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/addons-scanner-utils/-/addons-scanner-utils-7.1.0.tgz", - "integrity": "sha512-I6uQtJg3sbNtbGOsR2GmTtegCegYTXFRTnnvukEcX0jWidI4enyENyCV1MNkoLSw5xbgKIM/bFuSm4IPFlDYrg==", + "node_modules/addons-linter/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "@types/yauzl": "2.10.0", - "common-tags": "1.8.2", - "first-chunk-stream": "3.0.0", - "strip-bom-stream": "4.0.0", - "upath": "2.0.1", - "yauzl": "2.10.0" - }, - "peerDependencies": { - "@types/download": "8.0.1", - "body-parser": "1.20.0", - "download": "8.0.0", - "express": "4.18.1", - "safe-compare": "1.1.4" - }, - "peerDependenciesMeta": { - "@types/download": { - "optional": true - }, - "body-parser": { - "optional": true - }, - "download": { - "optional": true - }, - "express": { - "optional": true - }, - "safe-compare": { - "optional": true - } + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } }, + "node_modules/addons-moz-compare": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/addons-moz-compare/-/addons-moz-compare-1.3.0.tgz", + "integrity": "sha512-/rXpQeaY0nOKhNx00pmZXdk5Mu+KhVlL3/pSBuAYwrxRrNiTvI/9xfQI8Lmm7DMMl+PDhtfAHY/0ibTpdeoQQQ==", + "dev": true + }, "node_modules/adm-zip": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.9.tgz", - "integrity": "sha512-s+3fXLkeeLjZ2kLjCBwQufpI5fuN+kIGBxu6530nVQZGVol0d7Y/M88/xw9HGGUcJjKf8LutN3VPRUBq6N7Ajg==", + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.10.tgz", + "integrity": "sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==", "dev": true, "engines": { "node": ">=6.0" @@ -3159,19 +2917,6 @@ "node": ">= 6.0.0" } }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/ajv": { "version": "6.12.6", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", @@ -3323,15 +3068,15 @@ } }, "node_modules/array-includes": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", - "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5", - "get-intrinsic": "^1.1.1", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", "is-string": "^1.0.7" }, "engines": { @@ -3343,6 +3088,7 @@ }, "node_modules/array-union": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, "engines": { @@ -3350,14 +3096,14 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz", - "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -3367,6 +3113,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", + "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + } + }, "node_modules/asn1": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", @@ -3408,6 +3167,18 @@ "node": ">=8.0.0" } }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -3418,19 +3189,20 @@ } }, "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", "dev": true }, "node_modules/axios": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", - "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.6.tgz", + "integrity": "sha512-rC/7F08XxZwjMV4iuWv+JpD3E0Ksqg9nac4IIg6RwNuF0JTeWoCo/mBNG54+tNhhI11G3/VDRbdDQTs9hGp4pQ==", "dev": true, "dependencies": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, "node_modules/axios/node_modules/form-data": { @@ -3448,15 +3220,15 @@ } }, "node_modules/babel-jest": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.1.2.tgz", - "integrity": "sha512-IuG+F3HTHryJb7gacC7SQ59A9kO56BctUsT67uJHp1mMCHUOMXpDwOHWGifWqdWVknN2WNkCVQELPjXx0aLJ9Q==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz", + "integrity": "sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==", "dev": true, "dependencies": { - "@jest/transform": "^29.1.2", + "@jest/transform": "^29.5.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.0.2", + "babel-preset-jest": "^29.5.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" @@ -3555,9 +3327,9 @@ } }, "node_modules/babel-plugin-jest-hoist": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.0.2.tgz", - "integrity": "sha512-eBr2ynAEFjcebVvu8Ktx580BD1QKCrBG1XwEUTXJe285p9HA/4hOhfWCFRQhTKSyBV0VzjhG7H91Eifz9s29hg==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", + "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==", "dev": true, "dependencies": { "@babel/template": "^7.3.3", @@ -3593,12 +3365,12 @@ } }, "node_modules/babel-preset-jest": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.0.2.tgz", - "integrity": "sha512-BeVXp7rH5TK96ofyEnHjznjLMQ2nAeDJ+QzxKnHAAMs0RgrQsCywjAN8m4mOm5Di0pxU//3AoEeJJrerMH5UeA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz", + "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==", "dev": true, "dependencies": { - "babel-plugin-jest-hoist": "^29.0.2", + "babel-plugin-jest-hoist": "^29.5.0", "babel-preset-current-node-syntax": "^1.0.0" }, "engines": { @@ -3922,54 +3694,30 @@ } }, "node_modules/cacheable-lookup": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.0.4.tgz", - "integrity": "sha512-mbcDEZCkv2CZF4G01kr8eBd/5agkt9oCqz75tJMSIsquvRZ2sL6Hi5zGVKi/0OSC9oO1GHfJ2AV0ZIOY9vye0A==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", "dev": true, "engines": { - "node": ">=10.6.0" + "node": ">=14.16" } }, "node_modules/cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", - "dev": true, - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "version": "10.2.7", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.7.tgz", + "integrity": "sha512-I4SA6mKgDxcxVbSt/UmIkb9Ny8qSkg6ReBHtAAXnZHk7KOSx5g3DTiAOaYzcHCs6oOdHn+bip9T48E6tMvK9hw==", "dev": true, "dependencies": { - "pump": "^3.0.0" + "@types/http-cache-semantics": "^4.0.1", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.2", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, - "engines": { - "node": ">=8" + "node": ">=14.16" } }, "node_modules/call-bind": { @@ -4185,16 +3933,15 @@ } }, "node_modules/chromedriver": { - "version": "106.0.1", - "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-106.0.1.tgz", - "integrity": "sha512-thaBvbDEPgGocSp4/SBIajQz3G7UQfUqCOHZBp9TVhRJv7c91eZrUGcjeJUaNF4p9CfSjCYNYzs4EVVryqmddA==", + "version": "110.0.0", + "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-110.0.0.tgz", + "integrity": "sha512-Le6q8xrA/3fAt+g8qiN0YjsYxINIhQMC6wj9X3W5L77uN4NspEzklDrqYNwBcEVn7PcAEJ73nLlS7mTyZRspHA==", "dev": true, "hasInstallScript": true, "dependencies": { "@testim/chrome-version": "^1.1.3", - "axios": "^0.27.2", + "axios": "^1.2.1", "compare-versions": "^5.0.1", - "del": "^6.1.1", "extract-zip": "^2.0.1", "https-proxy-agent": "^5.0.1", "proxy-from-env": "^1.1.0", @@ -4204,7 +3951,7 @@ "chromedriver": "bin/chromedriver" }, "engines": { - "node": ">=10" + "node": ">=14" } }, "node_modules/ci-info": { @@ -4219,15 +3966,6 @@ "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", "dev": true }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/cli-boxes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", @@ -4241,13 +3979,17 @@ } }, "node_modules/cliui": { - "version": "7.0.4", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "dependencies": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, "node_modules/clone": { @@ -4273,15 +4015,6 @@ "node": ">=6" } }, - "node_modules/clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==", - "dev": true, - "dependencies": { - "mimic-response": "^1.0.0" - } - }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -4361,19 +4094,6 @@ "integrity": "sha512-v8Au3l0b+Nwkp4G142JcgJFh1/TUhdxut7wzD1Nq1dyp5oa3tXaqb03EXOAB6jS4gMlalkjAUPZBMiAfKUixHQ==", "dev": true }, - "node_modules/compress-brotli": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/compress-brotli/-/compress-brotli-1.3.8.tgz", - "integrity": "sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ==", - "dev": true, - "dependencies": { - "@types/json-buffer": "~3.0.0", - "json-buffer": "~3.0.1" - }, - "engines": { - "node": ">= 12" - } - }, "node_modules/concat-map": { "version": "0.0.1", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", @@ -4395,9 +4115,9 @@ } }, "node_modules/concurrently": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.4.0.tgz", - "integrity": "sha512-M6AfrueDt/GEna/Vg9BqQ+93yuvzkSKmoTixnwEJkH0LlcGrRC2eCmjeG1tLLHIYfpYJABokqSGyMcXjm96AFA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.6.0.tgz", + "integrity": "sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==", "dev": true, "dependencies": { "chalk": "^4.1.0", @@ -4534,6 +4254,19 @@ "url": "https://github.com/yeoman/configstore?sponsor=1" } }, + "node_modules/content-scripts-register-polyfill": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/content-scripts-register-polyfill/-/content-scripts-register-polyfill-4.0.2.tgz", + "integrity": "sha512-8hDm+tu3BkxHZP7EUIIIo/495F6QNXF7cI9Lwr4PQaiohw2wWmi9k2SE4W4kNrAaLnFw6RZ2ev8EmrQb+sCoGQ==", + "dependencies": { + "webext-content-scripts": "^2.5.2", + "webext-patterns": "^1.3.0", + "webext-polyfill-kinda": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/fregante" + } + }, "node_modules/convert-source-map": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", @@ -4617,10 +4350,9 @@ } }, "node_modules/core-js": { - "version": "3.22.8", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.8.tgz", - "integrity": "sha512-UoGQ/cfzGYIuiq6Z7vWL1HfkE9U9IZ4Ub+0XSiJTCzvbZzgPA69oDF2f+lgJ6dFFLEdjW5O6svvoKzXX23xFkA==", - "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.29.0.tgz", + "integrity": "sha512-VG23vuEisJNkGl6XQmFJd3rEG/so/CNatqeE+7uZAwTSwFeB/qaO0be8xZYUNWprJ/GIwL8aMt9cj1kvbpTZhg==", "dev": true, "hasInstallScript": true, "funding": { @@ -4764,6 +4496,15 @@ "node": ">=0.10" } }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, "node_modules/data-urls": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", @@ -4888,20 +4629,24 @@ } }, "node_modules/deepmerge": { - "version": "4.2.2", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, "dependencies": { "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/defer-to-connect": { @@ -4938,28 +4683,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/del": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", - "dev": true, - "dependencies": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/delayed-stream": { "version": "1.0.0", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", @@ -4986,9 +4709,9 @@ } }, "node_modules/diff-sequences": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.0.0.tgz", - "integrity": "sha512-7Qe/zd1wxSDL4D/X/FPjOMB+ZMDt71W94KYaq05I2l0oQqgXgs7s4ftYYmV38gBSrPz2vcygxfs1xn0FT+rKNA==", + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", + "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -5144,9 +4867,9 @@ "dev": true }, "node_modules/emittery": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", - "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true, "engines": { "node": ">=12" @@ -5215,34 +4938,44 @@ } }, "node_modules/es-abstract": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", - "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", + "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", "dev": true, "dependencies": { + "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.1", + "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", + "internal-slot": "^1.0.4", + "is-array-buffer": "^3.0.1", + "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", + "object-inspect": "^1.12.2", "object-keys": "^1.1.1", - "object.assign": "^4.1.2", + "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" }, "engines": { "node": ">= 0.4" @@ -5257,6 +4990,20 @@ "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", "dev": true }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-shim-unscopables": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", @@ -5268,6 +5015,7 @@ }, "node_modules/es-to-primitive": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "dependencies": { @@ -5357,15 +5105,18 @@ } }, "node_modules/eslint": { - "version": "8.24.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.24.0.tgz", - "integrity": "sha512-dWFaPhGhTAiPcCgm3f6LI2MBWbogMnTJzFBbhXVRQDJPkr9pGZvVjlVfXd+vyDcWPA2Ic9L2AXPIQM0+vk/cSQ==", + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz", + "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.3.2", - "@humanwhocodes/config-array": "^0.10.5", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.1", + "@eslint/js": "8.36.0", + "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -5373,22 +5124,21 @@ "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", + "espree": "^9.5.0", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", - "globby": "^11.1.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", @@ -5397,7 +5147,6 @@ "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" @@ -5413,34 +5162,35 @@ } }, "node_modules/eslint-plugin-no-unsanitized": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-unsanitized/-/eslint-plugin-no-unsanitized-4.0.1.tgz", - "integrity": "sha512-y/lAMWnPPC7RYuUdxlEL/XiCL8FehN9h9s3Kjqbp/Kv0i9NZs+IXSC2kS546Fa4Bumwy31HlVS/OdWX0Kxb5Xg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-unsanitized/-/eslint-plugin-no-unsanitized-4.0.2.tgz", + "integrity": "sha512-Pry0S9YmHoz8NCEMRQh7N0Yexh2MYCNPIlrV52hTmS7qXnTghWsjXouF08bgsrrZqaW9tt1ZiK3j5NEmPE+EjQ==", "dev": true, "peerDependencies": { "eslint": "^6 || ^7 || ^8" } }, "node_modules/eslint-plugin-react": { - "version": "7.31.8", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.8.tgz", - "integrity": "sha512-5lBTZmgQmARLLSYiwI71tiGVTLUuqXantZM6vlSY39OaDSV0M7+32K5DnLkmFrwTe+Ksz0ffuLUC91RUviVZfw==", + "version": "7.32.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", + "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", "dev": true, "dependencies": { - "array-includes": "^3.1.5", - "array.prototype.flatmap": "^1.3.0", + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", "doctrine": "^2.1.0", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.5", - "object.fromentries": "^2.0.5", - "object.hasown": "^1.1.1", - "object.values": "^1.1.5", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.3", + "resolve": "^2.0.0-next.4", "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.7" + "string.prototype.matchall": "^4.0.8" }, "engines": { "node": ">=4" @@ -5469,12 +5219,17 @@ } }, "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.3", - "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", "dev": true, "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5543,6 +5298,7 @@ }, "node_modules/eslint/node_modules/argparse": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, @@ -5578,8 +5334,9 @@ "dev": true }, "node_modules/eslint/node_modules/debug": { - "version": "4.3.3", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -5617,23 +5374,6 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/eslint/node_modules/espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", - "dev": true, - "dependencies": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/eslint/node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", @@ -5671,9 +5411,9 @@ } }, "node_modules/eslint/node_modules/globals": { - "version": "13.15.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", - "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -5695,6 +5435,7 @@ }, "node_modules/eslint/node_modules/js-yaml": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "dependencies": { @@ -5824,9 +5565,9 @@ } }, "node_modules/espree": { - "version": "9.3.3", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.3.tgz", - "integrity": "sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==", + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz", + "integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==", "dev": true, "dependencies": { "acorn": "^8.8.0", @@ -5853,8 +5594,9 @@ } }, "node_modules/esquery": { - "version": "1.4.0", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "dependencies": { "estraverse": "^5.1.0" @@ -5947,15 +5689,6 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/execa/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -5966,16 +5699,16 @@ } }, "node_modules/expect": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.1.2.tgz", - "integrity": "sha512-AuAGn1uxva5YBbBlXb+2JPxJRuemZsmlGcapPXWNSBNsQtAULfjioREGBWuI0EOvYUKjDnrCy8PW5Zlr1md5mw==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz", + "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==", "dev": true, "dependencies": { - "@jest/expect-utils": "^29.1.2", - "jest-get-type": "^29.0.0", - "jest-matcher-utils": "^29.1.2", - "jest-message-util": "^29.1.2", - "jest-util": "^29.1.2" + "@jest/expect-utils": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -6050,21 +5783,9 @@ } }, "node_modules/fast-json-patch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-2.2.1.tgz", - "integrity": "sha512-4j5uBaTnsYAV5ebkidvxiLUYOwjQ+JSFljeqfTxCrH9bDmlCQaOJFS84oDJ2rAXZq2yskmk3ORfoP9DCwqFNig==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^2.0.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/fast-json-patch/node_modules/fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", + "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==", "dev": true }, "node_modules/fast-json-stable-stringify": { @@ -6117,6 +5838,29 @@ "pend": "~1.2.0" } }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, "node_modules/file-entry-cache": { "version": "6.0.1", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", @@ -6154,16 +5898,16 @@ } }, "node_modules/firefox-profile": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/firefox-profile/-/firefox-profile-4.2.2.tgz", - "integrity": "sha512-3kI17Xl9dL9AeRkpV1yahsJ+UbekkPtlQswKrIsTY1NLgxtEOR4R19rjGGz5+7/rP8Jt6fvxHk+Bai9R6Eai3w==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/firefox-profile/-/firefox-profile-4.3.2.tgz", + "integrity": "sha512-/C+Eqa0YgIsQT2p66p7Ygzqe7NlE/GNTbhw2SBCm5V3OsWDPITNdTPEcH2Q2fe7eMpYYNPKdUcuVioZBZiR6kA==", "dev": true, "dependencies": { "adm-zip": "~0.5.x", "fs-extra": "~9.0.1", "ini": "~2.0.0", "minimist": "^1.2.5", - "xml2js": "~0.4.23" + "xml2js": "^0.5.0" }, "bin": { "firefox-profile": "lib/cli.js" @@ -6214,24 +5958,30 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/flatted": { "version": "3.2.0", "integrity": "sha512-XprP7lDrVT+kE2c2YlfiV+IfS9zxukiIOvNamPNsImNhXadSsQEbosItdL9bUQlCZXR13SvPk20BjWSWLA7m4A==", "dev": true }, - "node_modules/fluent-syntax": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/fluent-syntax/-/fluent-syntax-0.13.0.tgz", - "integrity": "sha512-0Bk1AsliuYB550zr4JV9AYhsETsD3ELXUQzdXGJfIc1Ni/ukAfBdQInDhVMYJUaT2QxoamNslwkYF7MlOrPUwg==", - "dev": true, - "engines": { - "node": ">=8.9.0" - } - }, "node_modules/follow-redirects": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "dev": true, "funding": [ { @@ -6248,6 +5998,15 @@ } } }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -6258,9 +6017,9 @@ } }, "node_modules/fork-ts-checker-webpack-plugin": { - "version": "7.2.13", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.2.13.tgz", - "integrity": "sha512-fR3WRkOb4bQdWB/y7ssDUlVdrclvwtyCUIHCfivAoYxq9dF7XfrDKbMdZIfwJ7hxIAqkYSGeU7lLJE6xrxIBdg==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.3.0.tgz", + "integrity": "sha512-IN+XTzusCjR5VgntYFgxbxVx3WraPRnKehBFrf00cMSrtUuW9MsG9dhL6MWpY6MkjC3wVwoujfCDgZZCQwbswA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.16.7", @@ -6409,10 +6168,25 @@ } }, "node_modules/form-data-encoder": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.1.tgz", - "integrity": "sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==", - "dev": true + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "dev": true, + "engines": { + "node": ">= 14.17" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } }, "node_modules/fs-extra": { "version": "10.1.0", @@ -6476,12 +6250,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, "node_modules/functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", @@ -6557,13 +6325,14 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.1", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", "dev": true, "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1" + "has-symbols": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6592,6 +6361,7 @@ }, "node_modules/get-symbol-description": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", "dev": true, "dependencies": { @@ -6673,8 +6443,24 @@ "node": ">=4" } }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/globby": { "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "dependencies": { @@ -6692,25 +6478,35 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/got": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-12.1.0.tgz", - "integrity": "sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==", + "version": "12.5.3", + "resolved": "https://registry.npmjs.org/got/-/got-12.5.3.tgz", + "integrity": "sha512-8wKnb9MGU8IPGRIo+/ukTy9XLJBwDiCpIf5TVzQ9Cpol50eMTpBq2GAuDsuDIz7hTYmZgMgC1e9ydr6kSDWs3w==", "dev": true, "dependencies": { - "@sindresorhus/is": "^4.6.0", + "@sindresorhus/is": "^5.2.0", "@szmarczak/http-timer": "^5.0.1", - "@types/cacheable-request": "^6.0.2", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^6.0.4", - "cacheable-request": "^7.0.2", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.1", "decompress-response": "^6.0.0", - "form-data-encoder": "1.7.1", + "form-data-encoder": "^2.1.2", "get-stream": "^6.0.1", "http2-wrapper": "^2.1.10", "lowercase-keys": "^3.0.0", "p-cancelable": "^3.0.0", - "responselike": "^2.0.0" + "responselike": "^3.0.0" }, "engines": { "node": ">=14.16" @@ -6806,6 +6602,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -6820,6 +6628,7 @@ }, "node_modules/has-tostringtag": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "dev": true, "dependencies": { @@ -6863,9 +6672,9 @@ "dev": true }, "node_modules/htmlparser2": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", - "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", "dev": true, "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", @@ -6876,15 +6685,15 @@ ], "dependencies": { "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", + "domhandler": "^5.0.3", "domutils": "^3.0.1", - "entities": "^4.3.0" + "entities": "^4.4.0" } }, "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", "dev": true }, "node_modules/http-proxy-agent": { @@ -6943,12 +6752,12 @@ } }, "node_modules/human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, "engines": { - "node": ">=8.12.0" + "node": ">=10.17.0" } }, "node_modules/iconv-lite": { @@ -7082,15 +6891,6 @@ "node": ">=0.8.19" } }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/inflight": { "version": "1.0.6", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", @@ -7115,11 +6915,12 @@ } }, "node_modules/internal-slot": { - "version": "1.0.3", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz", + "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.0", + "get-intrinsic": "^1.1.3", "has": "^1.0.3", "side-channel": "^1.0.4" }, @@ -7168,6 +6969,20 @@ "node": ">=0.10.0" } }, + "node_modules/is-array-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz", + "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -7203,8 +7018,9 @@ } }, "node_modules/is-callable": { - "version": "1.2.4", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, "engines": { "node": ">= 0.4" @@ -7226,8 +7042,9 @@ } }, "node_modules/is-core-module": { - "version": "2.2.0", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -7237,9 +7054,13 @@ } }, "node_modules/is-date-object": { - "version": "1.0.2", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -7322,6 +7143,7 @@ }, "node_modules/is-negative-zero": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true, "engines": { @@ -7376,15 +7198,6 @@ "node": ">=8" } }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/is-path-inside": { "version": "3.0.3", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", @@ -7412,6 +7225,7 @@ }, "node_modules/is-regex": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, "dependencies": { @@ -7460,6 +7274,7 @@ }, "node_modules/is-string": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, "dependencies": { @@ -7473,11 +7288,31 @@ } }, "node_modules/is-symbol": { - "version": "1.0.3", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", "dev": true, "dependencies": { - "has-symbols": "^1.0.1" + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -7505,6 +7340,7 @@ }, "node_modules/is-weakref": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, "dependencies": { @@ -7666,15 +7502,15 @@ "dev": true }, "node_modules/jest": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.1.2.tgz", - "integrity": "sha512-5wEIPpCezgORnqf+rCaYD1SK+mNN7NsstWzIsuvsnrhR/hSxXWd82oI7DkrbJ+XTD28/eG8SmxdGvukrGGK6Tw==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz", + "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==", "dev": true, "dependencies": { - "@jest/core": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/core": "^29.5.0", + "@jest/types": "^29.5.0", "import-local": "^3.0.2", - "jest-cli": "^29.1.2" + "jest-cli": "^29.5.0" }, "bin": { "jest": "bin/jest.js" @@ -7692,9 +7528,9 @@ } }, "node_modules/jest-changed-files": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.0.0.tgz", - "integrity": "sha512-28/iDMDrUpGoCitTURuDqUzWQoWmOmOKOFST1mi2lwh62X4BFf6khgH3uSuo1e49X/UDjuApAj3w0wLOex4VPQ==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", + "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", "dev": true, "dependencies": { "execa": "^5.0.0", @@ -7720,28 +7556,29 @@ } }, "node_modules/jest-circus": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.1.2.tgz", - "integrity": "sha512-ajQOdxY6mT9GtnfJRZBRYS7toNIJayiiyjDyoZcnvPRUPwJ58JX0ci0PKAKUo2C1RyzlHw0jabjLGKksO42JGA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.5.0.tgz", + "integrity": "sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==", "dev": true, "dependencies": { - "@jest/environment": "^29.1.2", - "@jest/expect": "^29.1.2", - "@jest/test-result": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/environment": "^29.5.0", + "@jest/expect": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^0.7.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.1.2", - "jest-matcher-utils": "^29.1.2", - "jest-message-util": "^29.1.2", - "jest-runtime": "^29.1.2", - "jest-snapshot": "^29.1.2", - "jest-util": "^29.1.2", + "jest-each": "^29.5.0", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", "p-limit": "^3.1.0", - "pretty-format": "^29.1.2", + "pretty-format": "^29.5.0", + "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -7835,21 +7672,21 @@ } }, "node_modules/jest-cli": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.1.2.tgz", - "integrity": "sha512-vsvBfQ7oS2o4MJdAH+4u9z76Vw5Q8WBQF5MchDbkylNknZdrPTX1Ix7YRJyTlOWqRaS7ue/cEAn+E4V1MWyMzw==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz", + "integrity": "sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==", "dev": true, "dependencies": { - "@jest/core": "^29.1.2", - "@jest/test-result": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/core": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.1.2", - "jest-util": "^29.1.2", - "jest-validate": "^29.1.2", + "jest-config": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", "prompts": "^2.0.1", "yargs": "^17.3.1" }, @@ -7939,31 +7776,31 @@ } }, "node_modules/jest-config": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.1.2.tgz", - "integrity": "sha512-EC3Zi86HJUOz+2YWQcJYQXlf0zuBhJoeyxLM6vb6qJsVmpP7KcCP1JnyF0iaqTaXdBP8Rlwsvs7hnKWQWWLwwA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz", + "integrity": "sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.1.2", - "@jest/types": "^29.1.2", - "babel-jest": "^29.1.2", + "@jest/test-sequencer": "^29.5.0", + "@jest/types": "^29.5.0", + "babel-jest": "^29.5.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.1.2", - "jest-environment-node": "^29.1.2", - "jest-get-type": "^29.0.0", - "jest-regex-util": "^29.0.0", - "jest-resolve": "^29.1.2", - "jest-runner": "^29.1.2", - "jest-util": "^29.1.2", - "jest-validate": "^29.1.2", + "jest-circus": "^29.5.0", + "jest-environment-node": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-runner": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.1.2", + "pretty-format": "^29.5.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -8054,15 +7891,15 @@ } }, "node_modules/jest-diff": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.1.2.tgz", - "integrity": "sha512-4GQts0aUopVvecIT4IwD/7xsBaMhKTYoM4/njE/aVw9wpw+pIUVp8Vab/KnSzSilr84GnLBkaP3JLDnQYCKqVQ==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", + "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "diff-sequences": "^29.0.0", - "jest-get-type": "^29.0.0", - "pretty-format": "^29.1.2" + "diff-sequences": "^29.4.3", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8139,9 +7976,9 @@ } }, "node_modules/jest-docblock": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.0.0.tgz", - "integrity": "sha512-s5Kpra/kLzbqu9dEjov30kj1n4tfu3e7Pl8v+f8jOkeWNqM6Ds8jRaJfZow3ducoQUrf2Z4rs2N5S3zXnb83gw==", + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", + "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", "dev": true, "dependencies": { "detect-newline": "^3.0.0" @@ -8151,16 +7988,16 @@ } }, "node_modules/jest-each": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.1.2.tgz", - "integrity": "sha512-AmTQp9b2etNeEwMyr4jc0Ql/LIX/dhbgP21gHAizya2X6rUspHn2gysMXaj6iwWuOJ2sYRgP8c1P4cXswgvS1A==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.5.0.tgz", + "integrity": "sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==", "dev": true, "dependencies": { - "@jest/types": "^29.1.2", + "@jest/types": "^29.5.0", "chalk": "^4.0.0", - "jest-get-type": "^29.0.0", - "jest-util": "^29.1.2", - "pretty-format": "^29.1.2" + "jest-get-type": "^29.4.3", + "jest-util": "^29.5.0", + "pretty-format": "^29.5.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8237,65 +8074,73 @@ } }, "node_modules/jest-environment-jsdom": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.1.2.tgz", - "integrity": "sha512-D+XNIKia5+uDjSMwL/G1l6N9MCb7LymKI8FpcLo7kkISjc/Sa9w+dXXEa7u1Wijo3f8sVLqfxdGqYtRhmca+Xw==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.5.0.tgz", + "integrity": "sha512-/KG8yEK4aN8ak56yFVdqFDzKNHgF4BAymCx2LbPNPsUshUlfAl0eX402Xm1pt+eoG9SLZEUVifqXtX8SK74KCw==", "dev": true, "dependencies": { - "@jest/environment": "^29.1.2", - "@jest/fake-timers": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/environment": "^29.5.0", + "@jest/fake-timers": "^29.5.0", + "@jest/types": "^29.5.0", "@types/jsdom": "^20.0.0", "@types/node": "*", - "jest-mock": "^29.1.2", - "jest-util": "^29.1.2", + "jest-mock": "^29.5.0", + "jest-util": "^29.5.0", "jsdom": "^20.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } } }, "node_modules/jest-environment-node": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.1.2.tgz", - "integrity": "sha512-C59yVbdpY8682u6k/lh8SUMDJPbOyCHOTgLVVi1USWFxtNV+J8fyIwzkg+RJIVI30EKhKiAGNxYaFr3z6eyNhQ==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz", + "integrity": "sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==", "dev": true, "dependencies": { - "@jest/environment": "^29.1.2", - "@jest/fake-timers": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/environment": "^29.5.0", + "@jest/fake-timers": "^29.5.0", + "@jest/types": "^29.5.0", "@types/node": "*", - "jest-mock": "^29.1.2", - "jest-util": "^29.1.2" + "jest-mock": "^29.5.0", + "jest-util": "^29.5.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-get-type": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.0.0.tgz", - "integrity": "sha512-83X19z/HuLKYXYHskZlBAShO7UfLFXu/vWajw9ZNJASN32li8yHMaVGAQqxFW1RCFOkB7cubaL6FaJVQqqJLSw==", + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-haste-map": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.1.2.tgz", - "integrity": "sha512-xSjbY8/BF11Jh3hGSPfYTa/qBFrm3TPM7WU8pU93m2gqzORVLkHFWvuZmFsTEBPRKndfewXhMOuzJNHyJIZGsw==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz", + "integrity": "sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==", "dev": true, "dependencies": { - "@jest/types": "^29.1.2", + "@jest/types": "^29.5.0", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.0.0", - "jest-util": "^29.1.2", - "jest-worker": "^29.1.2", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.5.0", + "jest-worker": "^29.5.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -8316,13 +8161,13 @@ } }, "node_modules/jest-haste-map/node_modules/jest-worker": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.1.2.tgz", - "integrity": "sha512-AdTZJxKjTSPHbXT/AIOjQVmoFx0LHFcVabWu0sxI7PAy7rFf8c0upyvgBKgguVXdM4vY74JdwkyD4hSmpTW8jA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", + "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.1.2", + "jest-util": "^29.5.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -8346,28 +8191,28 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.1.2.tgz", - "integrity": "sha512-TG5gAZJpgmZtjb6oWxBLf2N6CfQ73iwCe6cofu/Uqv9iiAm6g502CAnGtxQaTfpHECBdVEMRBhomSXeLnoKjiQ==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz", + "integrity": "sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==", "dev": true, "dependencies": { - "jest-get-type": "^29.0.0", - "pretty-format": "^29.1.2" + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.1.2.tgz", - "integrity": "sha512-MV5XrD3qYSW2zZSHRRceFzqJ39B2z11Qv0KPyZYxnzDHFeYZGJlgGi0SW+IXSJfOewgJp/Km/7lpcFT+cgZypw==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz", + "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.1.2", - "jest-get-type": "^29.0.0", - "pretty-format": "^29.1.2" + "jest-diff": "^29.5.0", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8444,18 +8289,18 @@ } }, "node_modules/jest-message-util": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.1.2.tgz", - "integrity": "sha512-9oJ2Os+Qh6IlxLpmvshVbGUiSkZVc2FK+uGOm6tghafnB2RyjKAxMZhtxThRMxfX1J1SOMhTn9oK3/MutRWQJQ==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz", + "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.1.2", + "@jest/types": "^29.5.0", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.1.2", + "pretty-format": "^29.5.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -8534,23 +8379,23 @@ } }, "node_modules/jest-mock": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.1.2.tgz", - "integrity": "sha512-PFDAdjjWbjPUtQPkQufvniXIS3N9Tv7tbibePEjIIprzjgo0qQlyUiVMrT4vL8FaSJo1QXifQUOuPH3HQC/aMA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz", + "integrity": "sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==", "dev": true, "dependencies": { - "@jest/types": "^29.1.2", + "@jest/types": "^29.5.0", "@types/node": "*", - "jest-util": "^29.1.2" + "jest-util": "^29.5.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, "engines": { "node": ">=6" @@ -8565,28 +8410,28 @@ } }, "node_modules/jest-regex-util": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.0.0.tgz", - "integrity": "sha512-BV7VW7Sy0fInHWN93MMPtlClweYv2qrSCwfeFWmpribGZtQPWNvRSq9XOVgOEjU1iBGRKXUZil0o2AH7Iy9Lug==", + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", + "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.1.2.tgz", - "integrity": "sha512-7fcOr+k7UYSVRJYhSmJHIid3AnDBcLQX3VmT9OSbPWsWz1MfT7bcoerMhADKGvKCoMpOHUQaDHtQoNp/P9JMGg==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.5.0.tgz", + "integrity": "sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==", "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.1.2", + "jest-haste-map": "^29.5.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.1.2", - "jest-validate": "^29.1.2", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", + "resolve.exports": "^2.0.0", "slash": "^3.0.0" }, "engines": { @@ -8594,13 +8439,13 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.1.2.tgz", - "integrity": "sha512-44yYi+yHqNmH3OoWZvPgmeeiwKxhKV/0CfrzaKLSkZG9gT973PX8i+m8j6pDrTYhhHoiKfF3YUFg/6AeuHw4HQ==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz", + "integrity": "sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==", "dev": true, "dependencies": { - "jest-regex-util": "^29.0.0", - "jest-snapshot": "^29.1.2" + "jest-regex-util": "^29.4.3", + "jest-snapshot": "^29.5.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8677,30 +8522,30 @@ } }, "node_modules/jest-runner": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.1.2.tgz", - "integrity": "sha512-yy3LEWw8KuBCmg7sCGDIqKwJlULBuNIQa2eFSVgVASWdXbMYZ9H/X0tnXt70XFoGf92W2sOQDOIFAA6f2BG04Q==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz", + "integrity": "sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==", "dev": true, "dependencies": { - "@jest/console": "^29.1.2", - "@jest/environment": "^29.1.2", - "@jest/test-result": "^29.1.2", - "@jest/transform": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/console": "^29.5.0", + "@jest/environment": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", "@types/node": "*", "chalk": "^4.0.0", - "emittery": "^0.10.2", + "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.0.0", - "jest-environment-node": "^29.1.2", - "jest-haste-map": "^29.1.2", - "jest-leak-detector": "^29.1.2", - "jest-message-util": "^29.1.2", - "jest-resolve": "^29.1.2", - "jest-runtime": "^29.1.2", - "jest-util": "^29.1.2", - "jest-watcher": "^29.1.2", - "jest-worker": "^29.1.2", + "jest-docblock": "^29.4.3", + "jest-environment-node": "^29.5.0", + "jest-haste-map": "^29.5.0", + "jest-leak-detector": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-resolve": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-util": "^29.5.0", + "jest-watcher": "^29.5.0", + "jest-worker": "^29.5.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -8767,13 +8612,13 @@ } }, "node_modules/jest-runner/node_modules/jest-worker": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.1.2.tgz", - "integrity": "sha512-AdTZJxKjTSPHbXT/AIOjQVmoFx0LHFcVabWu0sxI7PAy7rFf8c0upyvgBKgguVXdM4vY74JdwkyD4hSmpTW8jA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", + "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.1.2", + "jest-util": "^29.5.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -8834,31 +8679,31 @@ } }, "node_modules/jest-runtime": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.1.2.tgz", - "integrity": "sha512-jr8VJLIf+cYc+8hbrpt412n5jX3tiXmpPSYTGnwcvNemY+EOuLNiYnHJ3Kp25rkaAcTWOEI4ZdOIQcwYcXIAZw==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.1.2", - "@jest/fake-timers": "^29.1.2", - "@jest/globals": "^29.1.2", - "@jest/source-map": "^29.0.0", - "@jest/test-result": "^29.1.2", - "@jest/transform": "^29.1.2", - "@jest/types": "^29.1.2", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz", + "integrity": "sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.5.0", + "@jest/fake-timers": "^29.5.0", + "@jest/globals": "^29.5.0", + "@jest/source-map": "^29.4.3", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", "@types/node": "*", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.1.2", - "jest-message-util": "^29.1.2", - "jest-mock": "^29.1.2", - "jest-regex-util": "^29.0.0", - "jest-resolve": "^29.1.2", - "jest-snapshot": "^29.1.2", - "jest-util": "^29.1.2", + "jest-haste-map": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-mock": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -8937,9 +8782,9 @@ } }, "node_modules/jest-snapshot": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.1.2.tgz", - "integrity": "sha512-rYFomGpVMdBlfwTYxkUp3sjD6usptvZcONFYNqVlaz4EpHPnDvlWjvmOQ9OCSNKqYZqLM2aS3wq01tWujLg7gg==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz", + "integrity": "sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -8948,23 +8793,22 @@ "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/traverse": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.1.2", - "@jest/transform": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/expect-utils": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", "@types/babel__traverse": "^7.0.6", "@types/prettier": "^2.1.5", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.1.2", + "expect": "^29.5.0", "graceful-fs": "^4.2.9", - "jest-diff": "^29.1.2", - "jest-get-type": "^29.0.0", - "jest-haste-map": "^29.1.2", - "jest-matcher-utils": "^29.1.2", - "jest-message-util": "^29.1.2", - "jest-util": "^29.1.2", + "jest-diff": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", "natural-compare": "^1.4.0", - "pretty-format": "^29.1.2", + "pretty-format": "^29.5.0", "semver": "^7.3.5" }, "engines": { @@ -9057,12 +8901,12 @@ } }, "node_modules/jest-util": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.1.2.tgz", - "integrity": "sha512-vPCk9F353i0Ymx3WQq3+a4lZ07NXu9Ca8wya6o4Fe4/aO1e1awMMprZ3woPFpKwghEOW+UXgd15vVotuNN9ONQ==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", + "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", "dev": true, "dependencies": { - "@jest/types": "^29.1.2", + "@jest/types": "^29.5.0", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -9144,17 +8988,17 @@ } }, "node_modules/jest-validate": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.1.2.tgz", - "integrity": "sha512-k71pOslNlV8fVyI+mEySy2pq9KdXdgZtm7NHrBX8LghJayc3wWZH0Yr0mtYNGaCU4F1OLPXRkwZR0dBm/ClshA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz", + "integrity": "sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==", "dev": true, "dependencies": { - "@jest/types": "^29.1.2", + "@jest/types": "^29.5.0", "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^29.0.0", + "jest-get-type": "^29.4.3", "leven": "^3.1.0", - "pretty-format": "^29.1.2" + "pretty-format": "^29.5.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -9243,18 +9087,18 @@ } }, "node_modules/jest-watcher": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.1.2.tgz", - "integrity": "sha512-6JUIUKVdAvcxC6bM8/dMgqY2N4lbT+jZVsxh0hCJRbwkIEnbr/aPjMQ28fNDI5lB51Klh00MWZZeVf27KBUj5w==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz", + "integrity": "sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==", "dev": true, "dependencies": { - "@jest/test-result": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "emittery": "^0.10.2", - "jest-util": "^29.1.2", + "emittery": "^0.13.1", + "jest-util": "^29.5.0", "string-length": "^4.0.1" }, "engines": { @@ -9367,6 +9211,15 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/jose": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.13.1.tgz", + "integrity": "sha512-MSJQC5vXco5Br38mzaQKiq9mwt7lwj2eXpgpRyQYNHYt2lq1PjkWa7DLXX0WVcQLE9HhMh3jPiufS7fhJf+CLQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/js-sdsl": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", @@ -9455,27 +9308,6 @@ "node": ">= 6" } }, - "node_modules/jsdom/node_modules/ws": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.9.0.tgz", - "integrity": "sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -9532,9 +9364,9 @@ "dev": true }, "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "bin": { "json5": "lib/cli.js" @@ -9556,34 +9388,34 @@ } }, "node_modules/jsonwebtoken": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", - "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", + "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", "dev": true, "dependencies": { "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", + "lodash": "^4.17.21", "ms": "^2.1.1", - "semver": "^5.6.0" + "semver": "^7.3.8" }, "engines": { - "node": ">=4", - "npm": ">=1.4.28" + "node": ">=12", + "npm": ">=6" } }, "node_modules/jsonwebtoken/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { - "semver": "bin/semver" + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/jsprim": { @@ -9647,12 +9479,11 @@ } }, "node_modules/keyv": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.3.2.tgz", - "integrity": "sha512-kn8WmodVBe12lmHpA6W8OY7SNh6wVR+Z+wZESF4iF5FCazaVXGWOtnbnvX0tMQ1bO+/TmOD9LziuYMvrIIs0xw==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", + "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", "dev": true, "dependencies": { - "compress-brotli": "^1.3.8", "json-buffer": "3.0.1" } }, @@ -9787,42 +9618,6 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", - "dev": true - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", - "dev": true - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", - "dev": true - }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", - "dev": true - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "dev": true - }, "node_modules/lodash.memoize": { "version": "4.1.2", "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", @@ -9833,12 +9628,6 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", - "dev": true - }, "node_modules/loose-envify": { "version": "1.4.0", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", @@ -9993,6 +9782,7 @@ }, "node_modules/mimic-fn": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, "engines": { @@ -10000,12 +9790,15 @@ } }, "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", "dev": true, "engines": { - "node": ">=4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/minimatch": { @@ -10026,6 +9819,15 @@ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, + "node_modules/minipass": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.4.tgz", + "integrity": "sha512-lwycX3cBMTvcejsHITUgYj6Gy6A7Nh4Q6h9NP4sTHY1ccJlC7yKzDmiShEHsJ16Jf1nKGDEaiHxiltsJEvk0nQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -10148,10 +9950,16 @@ "optional": true }, "node_modules/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -10164,6 +9972,12 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, "node_modules/ncp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", @@ -10186,6 +10000,43 @@ "integrity": "sha512-/ujIVxthRs+7q6hsdjHMaj8hRG9NuWmwrz+JdRwZ14jdFoKSkm+vDsCbF9PLpnSqjaWQJuTmVtcWHNLr+vrOFw==", "dev": true }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.1.tgz", + "integrity": "sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==", + "dev": true, + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, "node_modules/node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -10246,12 +10097,12 @@ } }, "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", + "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", "dev": true, "engines": { - "node": ">=10" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -10305,8 +10156,9 @@ } }, "node_modules/object-inspect": { - "version": "1.12.0", - "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -10321,13 +10173,14 @@ } }, "node_modules/object.assign": { - "version": "4.1.2", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, "engines": { @@ -10338,26 +10191,28 @@ } }, "node_modules/object.entries": { - "version": "1.1.5", - "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { - "version": "2.0.5", - "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" @@ -10367,26 +10222,27 @@ } }, "node_modules/object.hasown": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz", - "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", + "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", "dev": true, "dependencies": { "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.values": { - "version": "1.1.5", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" @@ -10411,6 +10267,7 @@ }, "node_modules/onetime": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "dependencies": { @@ -10424,9 +10281,9 @@ } }, "node_modules/open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "dev": true, "dependencies": { "define-lazy-prop": "^2.0.0", @@ -10512,6 +10369,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/os-locale/node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "engines": { + "node": ">=8.12.0" + } + }, "node_modules/os-shim": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz", @@ -10575,21 +10441,6 @@ "node": ">=8" } }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -10723,6 +10574,31 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "node_modules/path-scurry": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.6.1.tgz", + "integrity": "sha512-OW+5s+7cw6253Q4E+8qQ/u1fVvcJQCJo/VFD8pje+dbJCF1n5ZRMV2AEHbGp+5Q7jxQIYJxkHopnj6nzdGeZLA==", + "dev": true, + "dependencies": { + "lru-cache": "^7.14.1", + "minipass": "^4.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/path-type": { "version": "4.0.0", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", @@ -10760,9 +10636,9 @@ } }, "node_modules/pino": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-8.4.0.tgz", - "integrity": "sha512-R95U66WOb4Ggtb1RPGnC2uvtc8T0i1FSbrKHrAudRtiLDrlNxKjM1MyCJu+V4gL0qdE/7/LoXAmkEY/TlX6ELA==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.11.0.tgz", + "integrity": "sha512-Z2eKSvlrl2rH8p5eveNUnTdd4AjJk8tAsLkHYZQKGHP4WTh2Gi1cOSOs3eWPqaj+niS3gj4UkoreoaWgF3ZWYg==", "dev": true, "dependencies": { "atomic-sleep": "^1.0.0", @@ -10792,9 +10668,9 @@ } }, "node_modules/pino-abstract-transport/node_modules/readable-stream": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.2.0.tgz", - "integrity": "sha512-gJrBHsaI3lgBoGMW/jHZsQ/o/TIWiu5ENCJG1BB7fuCKzpFM8GaS2UoBVt9NO+oI+3FcrBNbUkl3ilDe09aY4A==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.3.0.tgz", + "integrity": "sha512-MuEnA0lbSi7JS8XM+WNJlWZkHAAdm7gETHdFK//Q/mChGyj2akEFtdLZh32jSdkWGbRwCW9pn6g3LWDdDeZnBQ==", "dev": true, "dependencies": { "abort-controller": "^3.0.0", @@ -10807,9 +10683,9 @@ } }, "node_modules/pino-std-serializers": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.0.0.tgz", - "integrity": "sha512-mMMOwSKrmyl+Y12Ri2xhH1lbzQxwwpuru9VjyJpgFIH4asSj88F2csdMwN6+M5g1Ll4rmsYghHLQJw81tgZ7LQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.0.tgz", + "integrity": "sha512-IWgSzUL8X1w4BIWTwErRgtV8PyOGOOi60uqv0oKuS/fOA8Nco/OeI6lBuc4dyP8MMfdFwyHqTMcBIA7nDiqEqA==", "dev": true }, "node_modules/pirates": { @@ -10822,9 +10698,9 @@ } }, "node_modules/postcss": { - "version": "8.4.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", - "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", + "version": "8.4.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", "dev": true, "funding": [ { @@ -10855,12 +10731,12 @@ } }, "node_modules/pretty-format": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.1.2.tgz", - "integrity": "sha512-CGJ6VVGXVRP2o2Dorl4mAwwvDWT25luIsYhkyVQW32E4nL+TgW939J7LlKT/npq5Cpq6j3s+sy+13yk7xYpBmg==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", + "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", "dev": true, "dependencies": { - "@jest/schemas": "^29.0.0", + "@jest/schemas": "^29.4.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -10901,9 +10777,9 @@ "dev": true }, "node_modules/process-warning": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.0.0.tgz", - "integrity": "sha512-+MmoAXoUX+VTHAlwns0h+kFUWFs/3FZy+ZuchkgjyOu3oioLAo2LB5aCfKPh2+P9O18i3m43tUEv3YqttSy0Ww==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.2.0.tgz", + "integrity": "sha512-/1WZ8+VQjR6avWOgHeEPd7SDQmFQ1B5mC1eRXsCm5TarlNmx/wCsa5GEaxGm05BORRtyG/Ex/3xq3TuRvq57qg==", "dev": true }, "node_modules/promise-toolbox": { @@ -10991,6 +10867,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/pure-rand": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.0.tgz", + "integrity": "sha512-rLSBxJjP+4DQOgcJAx6RZHT2he2pkhQdSnofG5VWyVl6GRq/K02ISOuOLcsMOrtKDIJb8JN2zm3FFzWNbezdPw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, "node_modules/qs": { "version": "6.5.3", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", @@ -11015,6 +10907,26 @@ "inherits": "~2.0.3" } }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/quick-format-unescaped": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", @@ -11149,9 +11061,9 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "dev": true }, "node_modules/regexp.prototype.flags": { @@ -11342,30 +11254,27 @@ } }, "node_modules/resolve.exports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", - "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.1.tgz", + "integrity": "sha512-OEJWVeimw8mgQuj3HfkNl4KqRevH7lzeQNaWRPfx0PPse7Jk6ozcsG4FKVgtzDsC1KUF+YlTHh17NcgHOPykLw==", "dev": true, "engines": { "node": ">=10" } }, "node_modules/responselike": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", - "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", "dev": true, "dependencies": { - "lowercase-keys": "^2.0.0" - } - }, - "node_modules/responselike/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, + "lowercase-keys": "^3.0.0" + }, "engines": { - "node": ">=8" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/reusify": { @@ -11378,23 +11287,87 @@ } }, "node_modules/rimraf": { - "version": "3.0.2", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.3.1.tgz", + "integrity": "sha512-GfHJHBzFQra23IxDzIdBqhOWfbtdgS1/dCHrDy+yvhpoJY5TdwdT28oWaHWfRpKFDLd3GZnGTx6Mlt4+anbsxQ==", "dev": true, "dependencies": { - "glob": "^7.1.3" + "glob": "^9.2.0" }, "bin": { - "rimraf": "bin.js" + "rimraf": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.2.1.tgz", + "integrity": "sha512-Pxxgq3W0HyA3XUvSXcFhRSs+43Jsx0ddxcFrbjxNGkL2Ak5BAUBxLqI5G6ADDeCHLfzzXFhe0b1yYcctGmytMA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "minimatch": "^7.4.1", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.2.tgz", + "integrity": "sha512-xy4q7wou3vUoC9k1xGTXc+awNdGaGVHtFUaey8tiX4H1QRc04DZ/rmDFwNm2EBsuYEhAZ6SgMmYf3InGY6OauA==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/run-parallel": { - "version": "1.1.9", - "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", - "dev": true + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } }, "node_modules/rxjs": { "version": "7.5.6", @@ -11438,10 +11411,24 @@ "dev": true, "optional": true }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-stable-stringify": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.0.tgz", - "integrity": "sha512-eehKHKpab6E741ud7ZIMcXhKcP6TSIezPkNZhy5U8xC6+VvrRdUA2tMgxGxaGl4cz7c2Ew5+mg5+wNB16KQqrA==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", "dev": true, "engines": { "node": ">=10" @@ -11533,14 +11520,14 @@ "dev": true }, "node_modules/selenium-webdriver": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.5.0.tgz", - "integrity": "sha512-9mSFii+lRwcnT2KUAB1kqvx6+mMiiQHH60Y0VUtr3kxxi3oZ3CV3B8e2nuJ7T4SPb+Q6VA0swswe7rYpez07Bg==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.8.1.tgz", + "integrity": "sha512-p4MtfhCQdcV6xxkS7eI0tQN6+WNReRULLCAuT4RDGkrjfObBNXMJ3WT8XdK+aXTr5nnBKuh+PxIevM0EjJgkxA==", "dev": true, "dependencies": { "jszip": "^3.10.0", "tmp": "^0.2.1", - "ws": ">=8.7.0" + "ws": ">=8.11.0" }, "engines": { "node": ">= 14.20.0" @@ -11659,6 +11646,7 @@ }, "node_modules/side-channel": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "dev": true, "dependencies": { @@ -11671,17 +11659,17 @@ } }, "node_modules/sign-addon": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/sign-addon/-/sign-addon-5.0.0.tgz", - "integrity": "sha512-qO3YYs8/kV7SyY8Kqmk1TW30FAVnvxTxUvncnK82H1+k4AkhVw33owReKyzoiHfNpgv1ugmgxA9jEsAIWqVCCg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/sign-addon/-/sign-addon-5.3.0.tgz", + "integrity": "sha512-7nHlCzhQgVMLBNiXVEgbG/raq48awOW0lYMN5uo1BaB3mp0+k8M8pvDwbfTlr3apcxZJsk9HQsAW1POwoJugpQ==", "dev": true, "dependencies": { "common-tags": "1.8.2", - "core-js": "3.22.8", + "core-js": "3.29.0", "deepcopy": "2.1.0", "es6-error": "4.1.1", "es6-promisify": "7.0.0", - "jsonwebtoken": "8.5.1", + "jsonwebtoken": "9.0.0", "mz": "2.7.0", "request": "2.88.2", "source-map-support": "0.5.21", @@ -11710,9 +11698,9 @@ } }, "node_modules/sonic-boom": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.2.0.tgz", - "integrity": "sha512-SbbZ+Kqj/XIunvIAgUZRlqd6CGQYq71tRRbXR92Za8J/R3Yh4Av+TWENiSiEgnlwckYLyP0YZQWVfyNC0dzLaA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.3.0.tgz", + "integrity": "sha512-LYxp34KlZ1a2Jb8ZQgFCK3niIHzibdwtwNUWKg0qQRzsDoJ3Gfgkf8KdBTFU3SkejDEIlWwnSnpVdOZIhFMl/g==", "dev": true, "dependencies": { "atomic-sleep": "^1.0.0" @@ -11761,91 +11749,6 @@ "os-shim": "^0.1.2" } }, - "node_modules/speed-measure-webpack-plugin": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.5.0.tgz", - "integrity": "sha512-Re0wX5CtM6gW7bZA64ONOfEPEhwbiSF/vz6e2GvadjuaPrQcHTQdRGsD8+BE7iUOysXH8tIenkPCQBEcspXsNg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0" - }, - "engines": { - "node": ">=6.0.0" - }, - "peerDependencies": { - "webpack": "^1 || ^2 || ^3 || ^4 || ^5" - } - }, - "node_modules/speed-measure-webpack-plugin/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/speed-measure-webpack-plugin/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/speed-measure-webpack-plugin/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/speed-measure-webpack-plugin/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/speed-measure-webpack-plugin/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/speed-measure-webpack-plugin/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/split": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", @@ -11859,9 +11762,9 @@ } }, "node_modules/split2": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", - "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", "dev": true, "engines": { "node": ">= 10.x" @@ -11970,18 +11873,18 @@ } }, "node_modules/string.prototype.matchall": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", - "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", + "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.1", + "regexp.prototype.flags": "^1.4.3", "side-channel": "^1.0.4" }, "funding": { @@ -11989,28 +11892,28 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -12064,6 +11967,7 @@ }, "node_modules/strip-final-newline": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, "engines": { @@ -12092,38 +11996,16 @@ "node": ">=4" } }, - "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" + "node": ">= 0.4" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/symbol-tree": { @@ -12150,22 +12032,6 @@ "is2": "^2.0.6" } }, - "node_modules/terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/terser": { "version": "5.14.2", "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", @@ -12277,9 +12143,9 @@ } }, "node_modules/thread-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.2.0.tgz", - "integrity": "sha512-rUkv4/fnb4rqy/gGy7VuqK6wE1+1DOCOWy4RMeaV69ZHMP11tQKZvZSip1yTgrKCMZzEMcCL/bKfHvSfDHx+iQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.3.0.tgz", + "integrity": "sha512-kaDqm1DET9pp3NXwR8382WHbnpXnRkN9xGN9dQt3B2+dmXiW8X1SOwmFOxAErEQ47ObhZ96J6yhZNXuyCOL7KA==", "dev": true, "dependencies": { "real-require": "^0.2.0" @@ -12302,6 +12168,21 @@ "node": ">=8.17.0" } }, + "node_modules/tmp/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -12383,15 +12264,15 @@ } }, "node_modules/ts-jest": { - "version": "29.0.3", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.3.tgz", - "integrity": "sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ==", + "version": "29.0.5", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.5.tgz", + "integrity": "sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==", "dev": true, "dependencies": { "bs-logger": "0.x", "fast-json-stable-stringify": "2.x", "jest-util": "^29.0.0", - "json5": "^2.2.1", + "json5": "^2.2.3", "lodash.memoize": "4.x", "make-error": "1.x", "semver": "7.x", @@ -12437,9 +12318,9 @@ } }, "node_modules/ts-loader": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.1.tgz", - "integrity": "sha512-384TYAqGs70rn9F0VBnh6BPTfhga7yFNdC5gXbQpDrBj9/KsT4iRkGqKXhziofHOlE2j6YEaiTYVGKKvPhGWvw==", + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz", + "integrity": "sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==", "dev": true, "dependencies": { "chalk": "^4.1.0", @@ -12635,6 +12516,7 @@ }, "node_modules/type-detect": { "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, "engines": { @@ -12653,6 +12535,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -12669,9 +12565,9 @@ } }, "node_modules/typescript": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", - "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -12843,12 +12739,6 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -12856,9 +12746,9 @@ "dev": true }, "node_modules/v8-to-istanbul": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", - "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", @@ -12927,40 +12817,42 @@ } }, "node_modules/web-ext": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/web-ext/-/web-ext-7.2.0.tgz", - "integrity": "sha512-EIrTUpweU1hu+gG2UcwkVKU2BGV6jsZ0+uoUcSdHB/aZPWzQr4dkcH3QHsDGIH/r2J9ESTvsWUHWHLRPeklqBg==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/web-ext/-/web-ext-7.6.2.tgz", + "integrity": "sha512-xlxbzgFBIS/UWWlvWxyR1PIqRRzDj1cutoHh+VZu4ZTcJTfv35KVdKkLRZv4PQwHu4dg8VfTg7WEcNP4QLaaFQ==", "dev": true, "dependencies": { - "@babel/runtime": "7.18.9", + "@babel/runtime": "7.21.0", "@devicefarmer/adbkit": "3.2.3", - "addons-linter": "5.14.0", + "addons-linter": "5.32.0", "bunyan": "1.8.15", - "camelcase": "7.0.0", + "camelcase": "7.0.1", "chrome-launcher": "0.15.1", "debounce": "1.2.1", "decamelize": "6.0.0", "es6-error": "4.1.1", - "firefox-profile": "4.2.2", - "fs-extra": "10.1.0", + "firefox-profile": "4.3.2", + "fs-extra": "11.1.0", "fx-runner": "1.3.0", "import-fresh": "3.3.0", + "jose": "4.13.1", "mkdirp": "1.0.4", "multimatch": "6.0.0", "mz": "2.7.0", + "node-fetch": "3.3.1", "node-notifier": "10.0.1", - "open": "8.4.0", + "open": "8.4.2", "parse-json": "6.0.2", "promise-toolbox": "0.21.0", - "sign-addon": "5.0.0", + "sign-addon": "5.3.0", "source-map-support": "0.5.21", "strip-bom": "5.0.0", "strip-json-comments": "5.0.0", "tmp": "0.2.1", "update-notifier": "6.0.2", "watchpack": "2.4.0", - "ws": "8.8.1", - "yargs": "17.5.1", + "ws": "8.13.0", + "yargs": "17.7.1", "zip-dir": "2.0.0" }, "bin": { @@ -12972,9 +12864,9 @@ } }, "node_modules/web-ext/node_modules/camelcase": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.0.tgz", - "integrity": "sha512-JToIvOmz6nhGsUhAYScbo2d6Py5wojjNfoxoc2mEVLUdJ70gJK2gnd+ABY1Tc3sVMyK7QDPtN0T/XdlCQWITyQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", "dev": true, "engines": { "node": ">=14.16" @@ -12983,6 +12875,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/web-ext/node_modules/fs-extra": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", + "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, "node_modules/web-ext/node_modules/lines-and-columns": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz", @@ -13045,6 +12951,60 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/web-streams-polyfill": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", + "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/webext-content-scripts": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/webext-content-scripts/-/webext-content-scripts-2.5.5.tgz", + "integrity": "sha512-CIq1LA/nHIXE43v8qlpqNPcbsSzGuQBkeykbqOWvKJ1Rx/q7zgdZsLgxwyoonWiQcJczslVmGWCfdBY04JwIyw==", + "dependencies": { + "webext-patterns": "^1.3.0", + "webext-polyfill-kinda": "^1.0.2" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/fregante" + } + }, + "node_modules/webext-patterns": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/webext-patterns/-/webext-patterns-1.3.0.tgz", + "integrity": "sha512-X9HMnic9ZtvSFKi2cdh0l+sxyj7f9oLedaa2JfxjnyEqGBz8OJjaHQ40jmraX1DJLTHOpqr+rCz1r3MW2+doUg==", + "dependencies": { + "escape-string-regexp": "^5.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/fregante" + } + }, + "node_modules/webext-patterns/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webext-polyfill-kinda": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/webext-polyfill-kinda/-/webext-polyfill-kinda-1.0.2.tgz", + "integrity": "sha512-rqQUKeBTOicej0tjDJWDQlOTnDcm9yYJTzgI+7rMdyYV4QHmYMRm+yjkcVgECkg/Wu9MboZ4lYeBPdp1Ep9WgQ==", + "funding": { + "url": "https://github.com/sponsors/fregante" + } + }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -13055,9 +13015,9 @@ } }, "node_modules/webpack": { - "version": "5.74.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", - "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "version": "5.75.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", + "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -13277,6 +13237,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/widest-line": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", @@ -13355,8 +13335,9 @@ "dev": true }, "node_modules/word-wrap": { - "version": "1.2.3", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", + "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -13364,6 +13345,7 @@ }, "node_modules/wrap-ansi": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "dependencies": { @@ -13380,6 +13362,7 @@ }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { @@ -13394,6 +13377,7 @@ }, "node_modules/wrap-ansi/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { @@ -13405,6 +13389,7 @@ }, "node_modules/wrap-ansi/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, @@ -13426,16 +13411,16 @@ } }, "node_modules/ws": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", - "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", "dev": true, "engines": { "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -13468,9 +13453,9 @@ } }, "node_modules/xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", "dev": true, "dependencies": { "sax": ">=0.6.0", @@ -13520,27 +13505,27 @@ } }, "node_modules/yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", "dev": true, "dependencies": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" + "yargs-parser": "^21.1.1" }, "engines": { "node": ">=12" } }, "node_modules/yargs-parser": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", - "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, "engines": { "node": ">=12" @@ -13752,9 +13737,9 @@ } }, "@babel/helper-string-parser": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", - "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", "dev": true }, "@babel/helper-validator-identifier": { @@ -13792,9 +13777,9 @@ } }, "@babel/parser": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.3.tgz", - "integrity": "sha512-pJ9xOlNWHiy9+FuFP09DEAFbAn4JskgRsVcc169w2xRBC3FRGuQEwjeIMMND9L2zc0iEhO/tGv4Zq+km+hxNpQ==", + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.13.tgz", + "integrity": "sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==", "dev": true }, "@babel/plugin-syntax-async-generators": { @@ -13915,21 +13900,21 @@ } }, "@babel/plugin-syntax-typescript": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz", - "integrity": "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", + "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.19.0" } }, "@babel/runtime": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", - "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", + "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", "dev": true, "requires": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.13.11" } }, "@babel/template": { @@ -13962,12 +13947,12 @@ } }, "@babel/types": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.3.tgz", - "integrity": "sha512-hGCaQzIY22DJlDh9CH7NOxgKkFjBk0Cw9xDO1Xmh2151ti7wiGfQ3LauXzL4HP1fmFlTX6XjpRETTpUcv7wQLw==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-string-parser": "^7.19.4", "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" } @@ -14040,16 +14025,31 @@ "integrity": "sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA==", "dev": true }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", + "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", + "dev": true + }, "@eslint/eslintrc": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.2.tgz", - "integrity": "sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", + "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.15.0", + "espree": "^9.5.1", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -14072,21 +14072,27 @@ "ms": "2.1.2" } }, + "eslint-visitor-keys": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", + "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", + "dev": true + }, "espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", + "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", "dev": true, "requires": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.0" } }, "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -14109,23 +14115,29 @@ } } }, + "@eslint/js": { + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz", + "integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==", + "dev": true + }, + "@fluent/syntax": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@fluent/syntax/-/syntax-0.19.0.tgz", + "integrity": "sha512-5D2qVpZrgpjtqU4eNOcWGp1gnUCgjfM+vKGE2y03kKN6z5EBhtx0qdRFbg8QuNNj8wXNoX93KJoYb+NqoxswmQ==", + "dev": true + }, "@humanwhocodes/config-array": { - "version": "0.10.7", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.7.tgz", - "integrity": "sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==", + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5" } }, - "@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", - "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", - "dev": true - }, "@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -14158,16 +14170,16 @@ "dev": true }, "@jest/console": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.1.2.tgz", - "integrity": "sha512-ujEBCcYs82BTmRxqfHMQggSlkUZP63AE5YEaTPj7eFyJOzukkTorstOUC7L6nE3w5SYadGVAnTsQ/ZjTGL0qYQ==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.5.0.tgz", + "integrity": "sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==", "dev": true, "requires": { - "@jest/types": "^29.1.2", + "@jest/types": "^29.5.0", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.1.2", - "jest-util": "^29.1.2", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", "slash": "^3.0.0" }, "dependencies": { @@ -14223,37 +14235,37 @@ } }, "@jest/core": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.1.2.tgz", - "integrity": "sha512-sCO2Va1gikvQU2ynDN8V4+6wB7iVrD2CvT0zaRst4rglf56yLly0NQ9nuRRAWFeimRf+tCdFsb1Vk1N9LrrMPA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.5.0.tgz", + "integrity": "sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==", "dev": true, "requires": { - "@jest/console": "^29.1.2", - "@jest/reporters": "^29.1.2", - "@jest/test-result": "^29.1.2", - "@jest/transform": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/console": "^29.5.0", + "@jest/reporters": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.0.0", - "jest-config": "^29.1.2", - "jest-haste-map": "^29.1.2", - "jest-message-util": "^29.1.2", - "jest-regex-util": "^29.0.0", - "jest-resolve": "^29.1.2", - "jest-resolve-dependencies": "^29.1.2", - "jest-runner": "^29.1.2", - "jest-runtime": "^29.1.2", - "jest-snapshot": "^29.1.2", - "jest-util": "^29.1.2", - "jest-validate": "^29.1.2", - "jest-watcher": "^29.1.2", + "jest-changed-files": "^29.5.0", + "jest-config": "^29.5.0", + "jest-haste-map": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-resolve-dependencies": "^29.5.0", + "jest-runner": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "jest-watcher": "^29.5.0", "micromatch": "^4.0.4", - "pretty-format": "^29.1.2", + "pretty-format": "^29.5.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -14310,73 +14322,73 @@ } }, "@jest/environment": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.1.2.tgz", - "integrity": "sha512-rG7xZ2UeOfvOVzoLIJ0ZmvPl4tBEQ2n73CZJSlzUjPw4or1oSWC0s0Rk0ZX+pIBJ04aVr6hLWFn1DFtrnf8MhQ==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz", + "integrity": "sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==", "dev": true, "requires": { - "@jest/fake-timers": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/fake-timers": "^29.5.0", + "@jest/types": "^29.5.0", "@types/node": "*", - "jest-mock": "^29.1.2" + "jest-mock": "^29.5.0" } }, "@jest/expect": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.1.2.tgz", - "integrity": "sha512-FXw/UmaZsyfRyvZw3M6POgSNqwmuOXJuzdNiMWW9LCYo0GRoRDhg+R5iq5higmRTHQY7hx32+j7WHwinRmoILQ==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.5.0.tgz", + "integrity": "sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==", "dev": true, "requires": { - "expect": "^29.1.2", - "jest-snapshot": "^29.1.2" + "expect": "^29.5.0", + "jest-snapshot": "^29.5.0" } }, "@jest/expect-utils": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.1.2.tgz", - "integrity": "sha512-4a48bhKfGj/KAH39u0ppzNTABXQ8QPccWAFUFobWBaEMSMp+sB31Z2fK/l47c4a/Mu1po2ffmfAIPxXbVTXdtg==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz", + "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==", "dev": true, "requires": { - "jest-get-type": "^29.0.0" + "jest-get-type": "^29.4.3" } }, "@jest/fake-timers": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.1.2.tgz", - "integrity": "sha512-GppaEqS+QQYegedxVMpCe2xCXxxeYwQ7RsNx55zc8f+1q1qevkZGKequfTASI7ejmg9WwI+SJCrHe9X11bLL9Q==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.5.0.tgz", + "integrity": "sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==", "dev": true, "requires": { - "@jest/types": "^29.1.2", - "@sinonjs/fake-timers": "^9.1.2", + "@jest/types": "^29.5.0", + "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.1.2", - "jest-mock": "^29.1.2", - "jest-util": "^29.1.2" + "jest-message-util": "^29.5.0", + "jest-mock": "^29.5.0", + "jest-util": "^29.5.0" } }, "@jest/globals": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.1.2.tgz", - "integrity": "sha512-uMgfERpJYoQmykAd0ffyMq8wignN4SvLUG6orJQRe9WAlTRc9cdpCaE/29qurXixYJVZWUqIBXhSk8v5xN1V9g==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.5.0.tgz", + "integrity": "sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==", "dev": true, "requires": { - "@jest/environment": "^29.1.2", - "@jest/expect": "^29.1.2", - "@jest/types": "^29.1.2", - "jest-mock": "^29.1.2" + "@jest/environment": "^29.5.0", + "@jest/expect": "^29.5.0", + "@jest/types": "^29.5.0", + "jest-mock": "^29.5.0" } }, "@jest/reporters": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.1.2.tgz", - "integrity": "sha512-X4fiwwyxy9mnfpxL0g9DD0KcTmEIqP0jUdnc2cfa9riHy+I6Gwwp5vOZiwyg0vZxfSDxrOlK9S4+340W4d+DAA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.5.0.tgz", + "integrity": "sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.1.2", - "@jest/test-result": "^29.1.2", - "@jest/transform": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/console": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", "@jridgewell/trace-mapping": "^0.3.15", "@types/node": "*", "chalk": "^4.0.0", @@ -14389,13 +14401,12 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.1.2", - "jest-util": "^29.1.2", - "jest-worker": "^29.1.2", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", + "jest-worker": "^29.5.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", - "terminal-link": "^2.0.0", "v8-to-istanbul": "^9.0.1" }, "dependencies": { @@ -14440,13 +14451,13 @@ "dev": true }, "jest-worker": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.1.2.tgz", - "integrity": "sha512-AdTZJxKjTSPHbXT/AIOjQVmoFx0LHFcVabWu0sxI7PAy7rFf8c0upyvgBKgguVXdM4vY74JdwkyD4hSmpTW8jA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", + "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", "dev": true, "requires": { "@types/node": "*", - "jest-util": "^29.1.2", + "jest-util": "^29.5.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -14474,18 +14485,18 @@ } }, "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", + "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "requires": { - "@sinclair/typebox": "^0.24.1" + "@sinclair/typebox": "^0.25.16" } }, "@jest/source-map": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.0.0.tgz", - "integrity": "sha512-nOr+0EM8GiHf34mq2GcJyz/gYFyLQ2INDhAylrZJ9mMWoW21mLBfZa0BUVPPMxVYrLjeiRe2Z7kWXOGnS0TFhQ==", + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz", + "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==", "dev": true, "requires": { "@jridgewell/trace-mapping": "^0.3.15", @@ -14494,50 +14505,50 @@ } }, "@jest/test-result": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.1.2.tgz", - "integrity": "sha512-jjYYjjumCJjH9hHCoMhA8PCl1OxNeGgAoZ7yuGYILRJX9NjgzTN0pCT5qAoYR4jfOP8htIByvAlz9vfNSSBoVg==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.5.0.tgz", + "integrity": "sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==", "dev": true, "requires": { - "@jest/console": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/console": "^29.5.0", + "@jest/types": "^29.5.0", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.1.2.tgz", - "integrity": "sha512-fU6dsUqqm8sA+cd85BmeF7Gu9DsXVWFdGn9taxM6xN1cKdcP/ivSgXh5QucFRFz1oZxKv3/9DYYbq0ULly3P/Q==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz", + "integrity": "sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==", "dev": true, "requires": { - "@jest/test-result": "^29.1.2", + "@jest/test-result": "^29.5.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.1.2", + "jest-haste-map": "^29.5.0", "slash": "^3.0.0" } }, "@jest/transform": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.1.2.tgz", - "integrity": "sha512-2uaUuVHTitmkx1tHF+eBjb4p7UuzBG7SXIaA/hNIkaMP6K+gXYGxP38ZcrofzqN0HeZ7A90oqsOa97WU7WZkSw==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.5.0.tgz", + "integrity": "sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==", "dev": true, "requires": { "@babel/core": "^7.11.6", - "@jest/types": "^29.1.2", + "@jest/types": "^29.5.0", "@jridgewell/trace-mapping": "^0.3.15", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", + "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.1.2", - "jest-regex-util": "^29.0.0", - "jest-util": "^29.1.2", + "jest-haste-map": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.5.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" + "write-file-atomic": "^4.0.2" }, "dependencies": { "ansi-styles": { @@ -14574,6 +14585,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -14602,12 +14619,12 @@ } }, "@jest/types": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.1.2.tgz", - "integrity": "sha512-DcXGtoTykQB5jiwCmVr8H4vdg2OJhQex3qPkG+ISyDO7xQXbt/4R6dowcRyPemRnkH7JoHvZuxPBdlq+9JxFCg==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", + "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", "dev": true, "requires": { - "@jest/schemas": "^29.0.0", + "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", @@ -14726,31 +14743,34 @@ } }, "@mdn/browser-compat-data": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.1.8.tgz", - "integrity": "sha512-gHZvccExN0upm9gjJZnmavwQWeFHwxBOxiwiHzYYtsRSlu0xBafz0WFCgRqWmzJh/ABNz87/4nhB7FTaop3r6Q==", + "version": "5.2.42", + "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.2.42.tgz", + "integrity": "sha512-CD/2ai1W45cDN/zN2AcYduDavU+nq9aStyQizi4MHxnwkRvS/H24WIjgc1qD8CISoqXa8AAIe+A+zpWxwV7a2Q==", "dev": true }, "@nodelib/fs.scandir": { - "version": "2.1.3", - "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "requires": { - "@nodelib/fs.stat": "2.0.3", + "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "@nodelib/fs.stat": { - "version": "2.0.3", - "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true }, "@nodelib/fs.walk": { - "version": "1.2.4", - "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "requires": { - "@nodelib/fs.scandir": "2.1.3", + "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, @@ -14774,33 +14794,33 @@ } }, "@sinclair/typebox": { - "version": "0.24.44", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.44.tgz", - "integrity": "sha512-ka0W0KN5i6LfrSocduwliMMpqVgohtPFidKdMEOUjoOFCHcOOYkKsPRxfs5f15oPNHTm6ERAm0GV/+/LTKeiWg==", + "version": "0.25.24", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", + "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz", + "integrity": "sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==", "dev": true }, "@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", "dev": true, "requires": { "type-detect": "4.0.8" } }, "@sinonjs/fake-timers": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", - "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", + "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", "dev": true, "requires": { - "@sinonjs/commons": "^1.7.0" + "@sinonjs/commons": "^2.0.0" } }, "@szmarczak/http-timer": { @@ -14845,13 +14865,13 @@ "dev": true }, "@types/babel__core": { - "version": "7.1.19", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", - "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", + "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", "dev": true, "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" @@ -14885,22 +14905,10 @@ "@babel/types": "^7.3.0" } }, - "@types/cacheable-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", - "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", - "dev": true, - "requires": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" - } - }, "@types/chrome": { - "version": "0.0.197", - "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.197.tgz", - "integrity": "sha512-m1NfS5bOjaypyqQfaX6CxmJodZVcvj5+Mt/K94EBHkflYjPNmXHAzbxfifdLMa0YM3PDyOxohoTS5ug/e6p5jA==", + "version": "0.0.220", + "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.220.tgz", + "integrity": "sha512-s5Sl4M3z3+IQLvYbR1yA+UVjX+LTtodmuZjqL6LkP+MWmuoNl1yryoJVCHBqEDZTH5p5PALGgkQVSTfjfYwXlg==", "dev": true, "requires": { "@types/filesystem": "*", @@ -14947,15 +14955,15 @@ "dev": true }, "@types/firefox-webext-browser": { - "version": "94.0.1", - "resolved": "https://registry.npmjs.org/@types/firefox-webext-browser/-/firefox-webext-browser-94.0.1.tgz", - "integrity": "sha512-I6iHRQJSTZ+gYt2IxdH2RRAMvcUyK8v5Ig7fHQR0IwUNYP7hz9+cziBVIKxLCO6XI7fiyRsNOWObfl3/4Js2Lg==", + "version": "111.0.0", + "resolved": "https://registry.npmjs.org/@types/firefox-webext-browser/-/firefox-webext-browser-111.0.0.tgz", + "integrity": "sha512-KboW0ughUYzuYAvzWGJsiSMmH9AgJDvnstjsNrXMgf6cpJ5g1eBGzkqpjPzVqkOyTH/mFl7gd15+XyaVQhKywA==", "dev": true }, "@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", "dev": true, "requires": { "@types/node": "*" @@ -14997,9 +15005,9 @@ } }, "@types/jest": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.1.2.tgz", - "integrity": "sha512-y+nlX0h87U0R+wsGn6EBuoRWYyv3KFtwRNP3QWp9+k2tJ2/bqcGS3UxD7jgT+tiwJWWq3UsyV4Y+T6rsMT4XMg==", + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.4.0.tgz", + "integrity": "sha512-VaywcGQ9tPorCX/Jkkni7RWGFfI11whqzs8dvxF41P17Z+z872thvEvlIbznjPJ02kl1HMX3LmLOonsj2n7HeQ==", "dev": true, "requires": { "expect": "^29.0.0", @@ -15017,26 +15025,11 @@ "parse5": "^7.0.0" } }, - "@types/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ==", - "dev": true - }, "@types/json-schema": { "version": "7.0.9", "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true }, - "@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, "@types/minimatch": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", @@ -15055,9 +15048,9 @@ "dev": true }, "@types/prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==", + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", + "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", "dev": true }, "@types/prop-types": { @@ -15066,9 +15059,9 @@ "dev": true }, "@types/react": { - "version": "18.0.21", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.21.tgz", - "integrity": "sha512-7QUCOxvFgnD5Jk8ZKlUAhVcRj7GuJRjnjjiY/IUBWKgOlnvDvTMLD4RTF7NPyVmbRhNrbomZiOepg7M/2Kj1mA==", + "version": "18.0.28", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.28.tgz", + "integrity": "sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==", "dev": true, "requires": { "@types/prop-types": "*", @@ -15077,37 +15070,34 @@ } }, "@types/react-dom": { - "version": "18.0.6", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.6.tgz", - "integrity": "sha512-/5OFZgfIPSwy+YuIBP/FgJnQnsxhZhjjrnxudMddeblOouIodEQ75X14Rr4wGSG/bknL+Omy9iWlLo1u/9GzAA==", + "version": "18.0.11", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.11.tgz", + "integrity": "sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==", "dev": true, "requires": { "@types/react": "*" } }, - "@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, "@types/scheduler": { "version": "0.16.2", "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", "dev": true }, "@types/selenium-webdriver": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.1.5.tgz", - "integrity": "sha512-Lfu97JK5b2jAxCUHH8uMjmhUiQZCGDyVzSAskFFZuWcprtcwjMkEPZE/SiIM5hOGQJVs982BAF26a3kmw8iiJw==", + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.1.13.tgz", + "integrity": "sha512-kGpIh7bvu4HGCJXl4PEJ53kzpG4iXlRDd66SNNCfJ58QhFuk9skOm57lVffZap5ChEOJwbge/LJ9IVGVC8EEOg==", "dev": true, "requires": { "@types/ws": "*" } }, + "@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true + }, "@types/stack-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", @@ -15160,16 +15150,18 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.39.0.tgz", - "integrity": "sha512-xVfKOkBm5iWMNGKQ2fwX5GVgBuHmZBO1tCRwXmY5oAIsPscfwm2UADDuNB8ZVYCtpQvJK4xpjrK7jEhcJ0zY9A==", + "version": "5.54.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.54.1.tgz", + "integrity": "sha512-a2RQAkosH3d3ZIV08s3DcL/mcGc2M/UC528VkPULFxR9VnVPT8pBu0IyBAJJmVsCmhVfwQX1v6q+QGnmSe1bew==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.39.0", - "@typescript-eslint/type-utils": "5.39.0", - "@typescript-eslint/utils": "5.39.0", + "@typescript-eslint/scope-manager": "5.54.1", + "@typescript-eslint/type-utils": "5.54.1", + "@typescript-eslint/utils": "5.54.1", "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" @@ -15196,14 +15188,14 @@ } }, "@typescript-eslint/parser": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.39.0.tgz", - "integrity": "sha512-PhxLjrZnHShe431sBAGHaNe6BDdxAASDySgsBCGxcBecVCi8NQWxQZMcizNA4g0pN51bBAn/FUfkWG3SDVcGlA==", + "version": "5.54.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.54.1.tgz", + "integrity": "sha512-8zaIXJp/nG9Ff9vQNh7TI+C3nA6q6iIsGJ4B4L6MhZ7mHnTMR4YP5vp2xydmFXIy8rpyIVbNAG44871LMt6ujg==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.39.0", - "@typescript-eslint/types": "5.39.0", - "@typescript-eslint/typescript-estree": "5.39.0", + "@typescript-eslint/scope-manager": "5.54.1", + "@typescript-eslint/types": "5.54.1", + "@typescript-eslint/typescript-estree": "5.54.1", "debug": "^4.3.4" }, "dependencies": { @@ -15219,23 +15211,23 @@ } }, "@typescript-eslint/scope-manager": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.39.0.tgz", - "integrity": "sha512-/I13vAqmG3dyqMVSZPjsbuNQlYS082Y7OMkwhCfLXYsmlI0ca4nkL7wJ/4gjX70LD4P8Hnw1JywUVVAwepURBw==", + "version": "5.54.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.54.1.tgz", + "integrity": "sha512-zWKuGliXxvuxyM71UA/EcPxaviw39dB2504LqAmFDjmkpO8qNLHcmzlh6pbHs1h/7YQ9bnsO8CCcYCSA8sykUg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.39.0", - "@typescript-eslint/visitor-keys": "5.39.0" + "@typescript-eslint/types": "5.54.1", + "@typescript-eslint/visitor-keys": "5.54.1" } }, "@typescript-eslint/type-utils": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.39.0.tgz", - "integrity": "sha512-KJHJkOothljQWzR3t/GunL0TPKY+fGJtnpl+pX+sJ0YiKTz3q2Zr87SGTmFqsCMFrLt5E0+o+S6eQY0FAXj9uA==", + "version": "5.54.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.54.1.tgz", + "integrity": "sha512-WREHsTz0GqVYLIbzIZYbmUUr95DKEKIXZNH57W3s+4bVnuF1TKe2jH8ZNH8rO1CeMY3U4j4UQeqPNkHMiGem3g==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.39.0", - "@typescript-eslint/utils": "5.39.0", + "@typescript-eslint/typescript-estree": "5.54.1", + "@typescript-eslint/utils": "5.54.1", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -15252,19 +15244,19 @@ } }, "@typescript-eslint/types": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.39.0.tgz", - "integrity": "sha512-gQMZrnfEBFXK38hYqt8Lkwt8f4U6yq+2H5VDSgP/qiTzC8Nw8JO3OuSUOQ2qW37S/dlwdkHDntkZM6SQhKyPhw==", + "version": "5.54.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.54.1.tgz", + "integrity": "sha512-G9+1vVazrfAfbtmCapJX8jRo2E4MDXxgm/IMOF4oGh3kq7XuK3JRkOg6y2Qu1VsTRmWETyTkWt1wxy7X7/yLkw==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.39.0.tgz", - "integrity": "sha512-qLFQP0f398sdnogJoLtd43pUgB18Q50QSA+BTE5h3sUxySzbWDpTSdgt4UyxNSozY/oDK2ta6HVAzvGgq8JYnA==", + "version": "5.54.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.54.1.tgz", + "integrity": "sha512-bjK5t+S6ffHnVwA0qRPTZrxKSaFYocwFIkZx5k7pvWfsB1I57pO/0M0Skatzzw1sCkjJ83AfGTL0oFIFiDX3bg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.39.0", - "@typescript-eslint/visitor-keys": "5.39.0", + "@typescript-eslint/types": "5.54.1", + "@typescript-eslint/visitor-keys": "5.54.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -15293,26 +15285,39 @@ } }, "@typescript-eslint/utils": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.39.0.tgz", - "integrity": "sha512-+DnY5jkpOpgj+EBtYPyHRjXampJfC0yUZZzfzLuUWVZvCuKqSdJVC8UhdWipIw7VKNTfwfAPiOWzYkAwuIhiAg==", + "version": "5.54.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.54.1.tgz", + "integrity": "sha512-IY5dyQM8XD1zfDe5X8jegX6r2EVU5o/WJnLu/znLPWCBF7KNGC+adacXnt5jEYS9JixDcoccI6CvE4RCjHMzCQ==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.39.0", - "@typescript-eslint/types": "5.39.0", - "@typescript-eslint/typescript-estree": "5.39.0", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.54.1", + "@typescript-eslint/types": "5.54.1", + "@typescript-eslint/typescript-estree": "5.54.1", "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" + }, + "dependencies": { + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } } }, "@typescript-eslint/visitor-keys": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.39.0.tgz", - "integrity": "sha512-yyE3RPwOG+XJBLrhvsxAidUgybJVQ/hG8BhiJo0k8JSAYfk/CshVcxf0HwP4Jt7WZZ6vLmxdo1p6EyN3tzFTkg==", + "version": "5.54.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.54.1.tgz", + "integrity": "sha512-q8iSoHTgwCfgcRJ2l2x+xCbu8nBlRAlsQ33k24Adj8eoVBE0f8dUeI+bAa8F84Mv05UGbAx57g2zrRsYIooqQg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.39.0", + "@typescript-eslint/types": "5.54.1", "eslint-visitor-keys": "^3.3.0" } }, @@ -15542,48 +15547,63 @@ "dev": true }, "addons-linter": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/addons-linter/-/addons-linter-5.14.0.tgz", - "integrity": "sha512-50thc5vltnIeRkLCH/PxmnKhWXiguDs7SoPVNDF7YkMp9X58zHBJKKBgroJZaDFwzWOPLdxOM9ClU0JFkLR8WQ==", + "version": "5.32.0", + "resolved": "https://registry.npmjs.org/addons-linter/-/addons-linter-5.32.0.tgz", + "integrity": "sha512-Lf6oOyw8X9z5BMd9xhQwSbPlN2PUlzDLnYLAVT5lkrgXEx0fO9hRk4JRxWZ8+rFGz+mCIA2TTClZF2f+MKgJQA==", "dev": true, "requires": { - "@mdn/browser-compat-data": "5.1.8", - "addons-moz-compare": "1.2.0", - "addons-scanner-utils": "7.1.0", - "ajv": "8.11.0", - "ajv-merge-patch": "5.0.1", + "@fluent/syntax": "0.19.0", + "@mdn/browser-compat-data": "5.2.42", + "addons-moz-compare": "1.3.0", + "addons-scanner-utils": "8.5.0", + "ajv": "8.12.0", "chalk": "4.1.2", "cheerio": "1.0.0-rc.12", "columnify": "1.6.0", "common-tags": "1.8.2", - "deepmerge": "4.2.2", - "eslint": "8.21.0", - "eslint-plugin-no-unsanitized": "4.0.1", + "deepmerge": "4.3.1", + "eslint": "8.36.0", + "eslint-plugin-no-unsanitized": "4.0.2", "eslint-visitor-keys": "3.3.0", - "espree": "9.3.3", + "espree": "9.5.0", "esprima": "4.0.1", - "fluent-syntax": "0.13.0", - "glob": "8.0.3", + "fast-json-patch": "3.1.1", + "glob": "9.3.0", "image-size": "1.0.2", "is-mergeable-object": "1.1.1", "jed": "1.1.1", + "json-merge-patch": "1.0.2", "os-locale": "5.0.0", - "pino": "8.4.0", - "postcss": "8.4.16", + "pino": "8.11.0", + "postcss": "8.4.21", "relaxed-json": "1.0.3", - "semver": "7.3.7", + "semver": "7.3.8", "sha.js": "2.4.11", "source-map-support": "0.5.21", "tosource": "1.0.0", "upath": "2.0.1", - "yargs": "17.5.1", + "yargs": "17.7.1", "yauzl": "2.10.0" }, "dependencies": { + "addons-scanner-utils": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/addons-scanner-utils/-/addons-scanner-utils-8.5.0.tgz", + "integrity": "sha512-X35SYZRdSnxx7UZuAk+DizKihQp2Ze2c5GV+5nnRr/FFyx/fOgE3Zo8jdhzSne57PENE9w1ZVocBLJTN6UDB3g==", + "dev": true, + "requires": { + "@types/yauzl": "2.10.0", + "common-tags": "1.8.2", + "first-chunk-stream": "3.0.0", + "strip-bom-stream": "4.0.0", + "upath": "2.0.1", + "yauzl": "2.10.0" + } + }, "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -15592,16 +15612,6 @@ "uri-js": "^4.2.2" } }, - "ajv-merge-patch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ajv-merge-patch/-/ajv-merge-patch-5.0.1.tgz", - "integrity": "sha512-0UP3aJCzfzBOkmLR+EinJDCfg6DNtprj3bVPo7JJNgUpZMKt097t9xxQOWFGRoB4JvKKIHE2qe0HkVaS/HyrjQ==", - "dev": true, - "requires": { - "fast-json-patch": "^2.0.6", - "json-merge-patch": "^1.0.2" - } - }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -15611,12 +15621,6 @@ "color-convert": "^2.0.1" } }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, "brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -15651,162 +15655,16 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.21.0.tgz", - "integrity": "sha512-/XJ1+Qurf1T9G2M5IHrsjp+xrGT73RZf23xA1z5wB1ZzzEAWSZKvRwhWxTFp1rvkvCfwcvAUNAP31bhKTTGfDA==", - "dev": true, - "requires": { - "@eslint/eslintrc": "^1.3.0", - "@humanwhocodes/config-array": "^0.10.4", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.3", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", - "globby": "^11.1.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, "glob": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.0.tgz", + "integrity": "sha512-EAZejC7JvnQINayvB/7BJbpZpNOJ8Lrw2OZNEvQxe0vaLn1SuwMcfV7/MNaX8L/T0wmptBFI4YMtDvSBxYDc7w==", "dev": true, "requires": { "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" + "minimatch": "^7.4.1", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" } }, "has-flag": { @@ -15815,91 +15673,36 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, "json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", + "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", "dev": true, "requires": { "brace-expansion": "^2.0.1" } }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "dev": true, + "optional": true, + "peer": true, "requires": { - "p-limit": "^3.0.2" + "whatwg-url": "^5.0.0" } }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -15914,47 +15717,46 @@ "has-flag": "^4.0.0" } }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "optional": true, + "peer": true + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "dev": true, + "optional": true, + "peer": true + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "optional": true, + "peer": true, "requires": { - "prelude-ls": "^1.2.1" + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true } } }, "addons-moz-compare": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/addons-moz-compare/-/addons-moz-compare-1.2.0.tgz", - "integrity": "sha512-COG8qk2/dubPqabfcoJW4E7pm2EQDI43iMrHnhlobvq/uRMEzx/PYJ1KaUZ97Vgg44R3QdRG5CvDsTRbMUHcDw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/addons-moz-compare/-/addons-moz-compare-1.3.0.tgz", + "integrity": "sha512-/rXpQeaY0nOKhNx00pmZXdk5Mu+KhVlL3/pSBuAYwrxRrNiTvI/9xfQI8Lmm7DMMl+PDhtfAHY/0ibTpdeoQQQ==", "dev": true }, - "addons-scanner-utils": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/addons-scanner-utils/-/addons-scanner-utils-7.1.0.tgz", - "integrity": "sha512-I6uQtJg3sbNtbGOsR2GmTtegCegYTXFRTnnvukEcX0jWidI4enyENyCV1MNkoLSw5xbgKIM/bFuSm4IPFlDYrg==", - "dev": true, - "requires": { - "@types/yauzl": "2.10.0", - "common-tags": "1.8.2", - "first-chunk-stream": "3.0.0", - "strip-bom-stream": "4.0.0", - "upath": "2.0.1", - "yauzl": "2.10.0" - } - }, "adm-zip": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.9.tgz", - "integrity": "sha512-s+3fXLkeeLjZ2kLjCBwQufpI5fuN+kIGBxu6530nVQZGVol0d7Y/M88/xw9HGGUcJjKf8LutN3VPRUBq6N7Ajg==", + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.10.tgz", + "integrity": "sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==", "dev": true }, "agent-base": { @@ -15966,16 +15768,6 @@ "debug": "4" } }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, "ajv": { "version": "6.12.6", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", @@ -16090,35 +15882,49 @@ "dev": true }, "array-includes": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", - "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5", - "get-intrinsic": "^1.1.1", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", "is-string": "^1.0.7" } }, "array-union": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, "array.prototype.flatmap": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz", - "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", "es-shim-unscopables": "^1.0.0" } }, + "array.prototype.tosorted": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", + "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + } + }, "asn1": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", @@ -16151,6 +15957,12 @@ "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", "dev": true }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true + }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -16158,19 +15970,20 @@ "dev": true }, "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", "dev": true }, "axios": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", - "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.6.tgz", + "integrity": "sha512-rC/7F08XxZwjMV4iuWv+JpD3E0Ksqg9nac4IIg6RwNuF0JTeWoCo/mBNG54+tNhhI11G3/VDRbdDQTs9hGp4pQ==", "dev": true, "requires": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" }, "dependencies": { "form-data": { @@ -16187,15 +16000,15 @@ } }, "babel-jest": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.1.2.tgz", - "integrity": "sha512-IuG+F3HTHryJb7gacC7SQ59A9kO56BctUsT67uJHp1mMCHUOMXpDwOHWGifWqdWVknN2WNkCVQELPjXx0aLJ9Q==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz", + "integrity": "sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==", "dev": true, "requires": { - "@jest/transform": "^29.1.2", + "@jest/transform": "^29.5.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.0.2", + "babel-preset-jest": "^29.5.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" @@ -16266,9 +16079,9 @@ } }, "babel-plugin-jest-hoist": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.0.2.tgz", - "integrity": "sha512-eBr2ynAEFjcebVvu8Ktx580BD1QKCrBG1XwEUTXJe285p9HA/4hOhfWCFRQhTKSyBV0VzjhG7H91Eifz9s29hg==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", + "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==", "dev": true, "requires": { "@babel/template": "^7.3.3", @@ -16298,12 +16111,12 @@ } }, "babel-preset-jest": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.0.2.tgz", - "integrity": "sha512-BeVXp7rH5TK96ofyEnHjznjLMQ2nAeDJ+QzxKnHAAMs0RgrQsCywjAN8m4mOm5Di0pxU//3AoEeJJrerMH5UeA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz", + "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==", "dev": true, "requires": { - "babel-plugin-jest-hoist": "^29.0.2", + "babel-plugin-jest-hoist": "^29.5.0", "babel-preset-current-node-syntax": "^1.0.0" } }, @@ -16510,41 +16323,24 @@ } }, "cacheable-lookup": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.0.4.tgz", - "integrity": "sha512-mbcDEZCkv2CZF4G01kr8eBd/5agkt9oCqz75tJMSIsquvRZ2sL6Hi5zGVKi/0OSC9oO1GHfJ2AV0ZIOY9vye0A==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", "dev": true }, "cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "version": "10.2.7", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.7.tgz", + "integrity": "sha512-I4SA6mKgDxcxVbSt/UmIkb9Ny8qSkg6ReBHtAAXnZHk7KOSx5g3DTiAOaYzcHCs6oOdHn+bip9T48E6tMvK9hw==", "dev": true, "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - } + "@types/http-cache-semantics": "^4.0.1", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.2", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" } }, "call-bind": { @@ -16695,15 +16491,14 @@ } }, "chromedriver": { - "version": "106.0.1", - "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-106.0.1.tgz", - "integrity": "sha512-thaBvbDEPgGocSp4/SBIajQz3G7UQfUqCOHZBp9TVhRJv7c91eZrUGcjeJUaNF4p9CfSjCYNYzs4EVVryqmddA==", + "version": "110.0.0", + "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-110.0.0.tgz", + "integrity": "sha512-Le6q8xrA/3fAt+g8qiN0YjsYxINIhQMC6wj9X3W5L77uN4NspEzklDrqYNwBcEVn7PcAEJ73nLlS7mTyZRspHA==", "dev": true, "requires": { "@testim/chrome-version": "^1.1.3", - "axios": "^0.27.2", + "axios": "^1.2.1", "compare-versions": "^5.0.1", - "del": "^6.1.1", "extract-zip": "^2.0.1", "https-proxy-agent": "^5.0.1", "proxy-from-env": "^1.1.0", @@ -16722,12 +16517,6 @@ "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", "dev": true }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, "cli-boxes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", @@ -16735,12 +16524,13 @@ "dev": true }, "cliui": { - "version": "7.0.4", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "requires": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, @@ -16761,15 +16551,6 @@ "shallow-clone": "^3.0.0" } }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -16836,16 +16617,6 @@ "integrity": "sha512-v8Au3l0b+Nwkp4G142JcgJFh1/TUhdxut7wzD1Nq1dyp5oa3tXaqb03EXOAB6jS4gMlalkjAUPZBMiAfKUixHQ==", "dev": true }, - "compress-brotli": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/compress-brotli/-/compress-brotli-1.3.8.tgz", - "integrity": "sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ==", - "dev": true, - "requires": { - "@types/json-buffer": "~3.0.0", - "json-buffer": "~3.0.1" - } - }, "concat-map": { "version": "0.0.1", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", @@ -16864,9 +16635,9 @@ } }, "concurrently": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.4.0.tgz", - "integrity": "sha512-M6AfrueDt/GEna/Vg9BqQ+93yuvzkSKmoTixnwEJkH0LlcGrRC2eCmjeG1tLLHIYfpYJABokqSGyMcXjm96AFA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.6.0.tgz", + "integrity": "sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==", "dev": true, "requires": { "chalk": "^4.1.0", @@ -16966,6 +16737,16 @@ "xdg-basedir": "^5.0.1" } }, + "content-scripts-register-polyfill": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/content-scripts-register-polyfill/-/content-scripts-register-polyfill-4.0.2.tgz", + "integrity": "sha512-8hDm+tu3BkxHZP7EUIIIo/495F6QNXF7cI9Lwr4PQaiohw2wWmi9k2SE4W4kNrAaLnFw6RZ2ev8EmrQb+sCoGQ==", + "requires": { + "webext-content-scripts": "v2.5.5", + "webext-patterns": "^1.3.0", + "webext-polyfill-kinda": "^1.0.0" + } + }, "convert-source-map": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", @@ -17028,9 +16809,9 @@ } }, "core-js": { - "version": "3.22.8", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.8.tgz", - "integrity": "sha512-UoGQ/cfzGYIuiq6Z7vWL1HfkE9U9IZ4Ub+0XSiJTCzvbZzgPA69oDF2f+lgJ6dFFLEdjW5O6svvoKzXX23xFkA==", + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.29.0.tgz", + "integrity": "sha512-VG23vuEisJNkGl6XQmFJd3rEG/so/CNatqeE+7uZAwTSwFeB/qaO0be8xZYUNWprJ/GIwL8aMt9cj1kvbpTZhg==", "dev": true }, "core-util-is": { @@ -17140,6 +16921,12 @@ "assert-plus": "^1.0.0" } }, + "data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "dev": true + }, "data-urls": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", @@ -17227,14 +17014,15 @@ } }, "deepmerge": { - "version": "4.2.2", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true }, "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, "requires": { "clone": "^1.0.2" @@ -17262,22 +17050,6 @@ "object-keys": "^1.1.1" } }, - "del": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", - "dev": true, - "requires": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - } - }, "delayed-stream": { "version": "1.0.0", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", @@ -17295,9 +17067,9 @@ "dev": true }, "diff-sequences": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.0.0.tgz", - "integrity": "sha512-7Qe/zd1wxSDL4D/X/FPjOMB+ZMDt71W94KYaq05I2l0oQqgXgs7s4ftYYmV38gBSrPz2vcygxfs1xn0FT+rKNA==", + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", + "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", "dev": true }, "dir-glob": { @@ -17413,9 +17185,9 @@ "dev": true }, "emittery": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", - "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true }, "emoji-regex": { @@ -17463,34 +17235,44 @@ } }, "es-abstract": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", - "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", + "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", "dev": true, "requires": { + "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.1", + "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", + "internal-slot": "^1.0.4", + "is-array-buffer": "^3.0.1", + "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", + "object-inspect": "^1.12.2", "object-keys": "^1.1.1", - "object.assign": "^4.1.2", + "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" } }, "es-module-lexer": { @@ -17499,6 +17281,17 @@ "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", "dev": true }, + "es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + } + }, "es-shim-unscopables": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", @@ -17510,6 +17303,7 @@ }, "es-to-primitive": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "requires": { @@ -17568,15 +17362,18 @@ } }, "eslint": { - "version": "8.24.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.24.0.tgz", - "integrity": "sha512-dWFaPhGhTAiPcCgm3f6LI2MBWbogMnTJzFBbhXVRQDJPkr9pGZvVjlVfXd+vyDcWPA2Ic9L2AXPIQM0+vk/cSQ==", + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz", + "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.3.2", - "@humanwhocodes/config-array": "^0.10.5", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.1", + "@eslint/js": "8.36.0", + "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -17584,22 +17381,21 @@ "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", + "espree": "^9.5.0", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", - "globby": "^11.1.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", @@ -17608,7 +17404,6 @@ "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" @@ -17624,6 +17419,7 @@ }, "argparse": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, @@ -17650,8 +17446,9 @@ "dev": true }, "debug": { - "version": "4.3.3", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -17672,17 +17469,6 @@ "estraverse": "^5.2.0" } }, - "espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", - "dev": true, - "requires": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - } - }, "estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", @@ -17708,9 +17494,9 @@ } }, "globals": { - "version": "13.15.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", - "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -17723,6 +17509,7 @@ }, "js-yaml": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "requires": { @@ -17812,32 +17599,33 @@ } }, "eslint-plugin-no-unsanitized": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-unsanitized/-/eslint-plugin-no-unsanitized-4.0.1.tgz", - "integrity": "sha512-y/lAMWnPPC7RYuUdxlEL/XiCL8FehN9h9s3Kjqbp/Kv0i9NZs+IXSC2kS546Fa4Bumwy31HlVS/OdWX0Kxb5Xg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-unsanitized/-/eslint-plugin-no-unsanitized-4.0.2.tgz", + "integrity": "sha512-Pry0S9YmHoz8NCEMRQh7N0Yexh2MYCNPIlrV52hTmS7qXnTghWsjXouF08bgsrrZqaW9tt1ZiK3j5NEmPE+EjQ==", "dev": true, "requires": {} }, "eslint-plugin-react": { - "version": "7.31.8", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.8.tgz", - "integrity": "sha512-5lBTZmgQmARLLSYiwI71tiGVTLUuqXantZM6vlSY39OaDSV0M7+32K5DnLkmFrwTe+Ksz0ffuLUC91RUviVZfw==", + "version": "7.32.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", + "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", "dev": true, "requires": { - "array-includes": "^3.1.5", - "array.prototype.flatmap": "^1.3.0", + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", "doctrine": "^2.1.0", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.5", - "object.fromentries": "^2.0.5", - "object.hasown": "^1.1.1", - "object.values": "^1.1.5", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.3", + "resolve": "^2.0.0-next.4", "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.7" + "string.prototype.matchall": "^4.0.8" }, "dependencies": { "doctrine": { @@ -17854,12 +17642,14 @@ "dev": true }, "resolve": { - "version": "2.0.0-next.3", - "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", "dev": true, "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } } } @@ -17896,9 +17686,9 @@ "dev": true }, "espree": { - "version": "9.3.3", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.3.tgz", - "integrity": "sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==", + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz", + "integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==", "dev": true, "requires": { "acorn": "^8.8.0", @@ -17912,8 +17702,9 @@ "dev": true }, "esquery": { - "version": "1.4.0", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "requires": { "estraverse": "^5.1.0" @@ -17978,14 +17769,6 @@ "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" - }, - "dependencies": { - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - } } }, "exit": { @@ -17995,16 +17778,16 @@ "dev": true }, "expect": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.1.2.tgz", - "integrity": "sha512-AuAGn1uxva5YBbBlXb+2JPxJRuemZsmlGcapPXWNSBNsQtAULfjioREGBWuI0EOvYUKjDnrCy8PW5Zlr1md5mw==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz", + "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==", "dev": true, "requires": { - "@jest/expect-utils": "^29.1.2", - "jest-get-type": "^29.0.0", - "jest-matcher-utils": "^29.1.2", - "jest-message-util": "^29.1.2", - "jest-util": "^29.1.2" + "@jest/expect-utils": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0" } }, "extend": { @@ -18058,21 +17841,10 @@ } }, "fast-json-patch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-2.2.1.tgz", - "integrity": "sha512-4j5uBaTnsYAV5ebkidvxiLUYOwjQ+JSFljeqfTxCrH9bDmlCQaOJFS84oDJ2rAXZq2yskmk3ORfoP9DCwqFNig==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1" - }, - "dependencies": { - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==", - "dev": true - } - } + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", + "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==", + "dev": true }, "fast-json-stable-stringify": { "version": "2.1.0", @@ -18121,6 +17893,16 @@ "pend": "~1.2.0" } }, + "fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, + "requires": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + } + }, "file-entry-cache": { "version": "6.0.1", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", @@ -18149,16 +17931,16 @@ } }, "firefox-profile": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/firefox-profile/-/firefox-profile-4.2.2.tgz", - "integrity": "sha512-3kI17Xl9dL9AeRkpV1yahsJ+UbekkPtlQswKrIsTY1NLgxtEOR4R19rjGGz5+7/rP8Jt6fvxHk+Bai9R6Eai3w==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/firefox-profile/-/firefox-profile-4.3.2.tgz", + "integrity": "sha512-/C+Eqa0YgIsQT2p66p7Ygzqe7NlE/GNTbhw2SBCm5V3OsWDPITNdTPEcH2Q2fe7eMpYYNPKdUcuVioZBZiR6kA==", "dev": true, "requires": { "adm-zip": "~0.5.x", "fs-extra": "~9.0.1", "ini": "~2.0.0", "minimist": "^1.2.5", - "xml2js": "~0.4.23" + "xml2js": "^0.5.0" }, "dependencies": { "fs-extra": { @@ -18194,6 +17976,17 @@ "requires": { "flatted": "^3.1.0", "rimraf": "^3.0.2" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, "flatted": { @@ -18201,18 +17994,21 @@ "integrity": "sha512-XprP7lDrVT+kE2c2YlfiV+IfS9zxukiIOvNamPNsImNhXadSsQEbosItdL9bUQlCZXR13SvPk20BjWSWLA7m4A==", "dev": true }, - "fluent-syntax": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/fluent-syntax/-/fluent-syntax-0.13.0.tgz", - "integrity": "sha512-0Bk1AsliuYB550zr4JV9AYhsETsD3ELXUQzdXGJfIc1Ni/ukAfBdQInDhVMYJUaT2QxoamNslwkYF7MlOrPUwg==", - "dev": true - }, "follow-redirects": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "dev": true }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -18220,9 +18016,9 @@ "dev": true }, "fork-ts-checker-webpack-plugin": { - "version": "7.2.13", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.2.13.tgz", - "integrity": "sha512-fR3WRkOb4bQdWB/y7ssDUlVdrclvwtyCUIHCfivAoYxq9dF7XfrDKbMdZIfwJ7hxIAqkYSGeU7lLJE6xrxIBdg==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.3.0.tgz", + "integrity": "sha512-IN+XTzusCjR5VgntYFgxbxVx3WraPRnKehBFrf00cMSrtUuW9MsG9dhL6MWpY6MkjC3wVwoujfCDgZZCQwbswA==", "dev": true, "requires": { "@babel/code-frame": "^7.16.7", @@ -18322,11 +18118,20 @@ } }, "form-data-encoder": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.1.tgz", - "integrity": "sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", "dev": true }, + "formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, + "requires": { + "fetch-blob": "^3.1.2" + } + }, "fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", @@ -18373,12 +18178,6 @@ "functions-have-names": "^1.2.2" } }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, "functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", @@ -18438,13 +18237,14 @@ "dev": true }, "get-intrinsic": { - "version": "1.1.1", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", "dev": true, "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1" + "has-symbols": "^1.0.3" } }, "get-package-type": { @@ -18461,6 +18261,7 @@ }, "get-symbol-description": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", "dev": true, "requires": { @@ -18518,8 +18319,18 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, + "globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3" + } + }, "globby": { "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "requires": { @@ -18531,25 +18342,32 @@ "slash": "^3.0.0" } }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, "got": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-12.1.0.tgz", - "integrity": "sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==", + "version": "12.5.3", + "resolved": "https://registry.npmjs.org/got/-/got-12.5.3.tgz", + "integrity": "sha512-8wKnb9MGU8IPGRIo+/ukTy9XLJBwDiCpIf5TVzQ9Cpol50eMTpBq2GAuDsuDIz7hTYmZgMgC1e9ydr6kSDWs3w==", "dev": true, "requires": { - "@sindresorhus/is": "^4.6.0", + "@sindresorhus/is": "^5.2.0", "@szmarczak/http-timer": "^5.0.1", - "@types/cacheable-request": "^6.0.2", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^6.0.4", - "cacheable-request": "^7.0.2", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.1", "decompress-response": "^6.0.0", - "form-data-encoder": "1.7.1", + "form-data-encoder": "^2.1.2", "get-stream": "^6.0.1", "http2-wrapper": "^2.1.10", "lowercase-keys": "^3.0.0", "p-cancelable": "^3.0.0", - "responselike": "^2.0.0" + "responselike": "^3.0.0" } }, "graceful-fs": { @@ -18620,6 +18438,12 @@ "get-intrinsic": "^1.1.1" } }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true + }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -18628,6 +18452,7 @@ }, "has-tostringtag": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "dev": true, "requires": { @@ -18656,21 +18481,21 @@ "dev": true }, "htmlparser2": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", - "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", "dev": true, "requires": { "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", + "domhandler": "^5.0.3", "domutils": "^3.0.1", - "entities": "^4.3.0" + "entities": "^4.4.0" } }, "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", "dev": true }, "http-proxy-agent": { @@ -18716,9 +18541,9 @@ } }, "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true }, "iconv-lite": { @@ -18803,12 +18628,6 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, "inflight": { "version": "1.0.6", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", @@ -18830,11 +18649,12 @@ "dev": true }, "internal-slot": { - "version": "1.0.3", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz", + "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==", "dev": true, "requires": { - "get-intrinsic": "^1.1.0", + "get-intrinsic": "^1.1.3", "has": "^1.0.3", "side-channel": "^1.0.4" } @@ -18865,6 +18685,17 @@ "is-relative": "^0.1.0" } }, + "is-array-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz", + "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-typed-array": "^1.1.10" + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -18891,8 +18722,9 @@ } }, "is-callable": { - "version": "1.2.4", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true }, "is-ci": { @@ -18905,17 +18737,22 @@ } }, "is-core-module": { - "version": "2.2.0", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "dev": true, "requires": { "has": "^1.0.3" } }, "is-date-object": { - "version": "1.0.2", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "dev": true + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } }, "is-docker": { "version": "2.2.1", @@ -18965,6 +18802,7 @@ }, "is-negative-zero": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true }, @@ -18995,12 +18833,6 @@ "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", "dev": true }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true - }, "is-path-inside": { "version": "3.0.3", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", @@ -19022,6 +18854,7 @@ }, "is-regex": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, "requires": { @@ -19052,6 +18885,7 @@ }, "is-string": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, "requires": { @@ -19059,11 +18893,25 @@ } }, "is-symbol": { - "version": "1.0.3", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", "dev": true, "requires": { - "has-symbols": "^1.0.1" + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" } }, "is-typedarray": { @@ -19085,6 +18933,7 @@ }, "is-weakref": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, "requires": { @@ -19212,21 +19061,21 @@ "dev": true }, "jest": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.1.2.tgz", - "integrity": "sha512-5wEIPpCezgORnqf+rCaYD1SK+mNN7NsstWzIsuvsnrhR/hSxXWd82oI7DkrbJ+XTD28/eG8SmxdGvukrGGK6Tw==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz", + "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==", "dev": true, "requires": { - "@jest/core": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/core": "^29.5.0", + "@jest/types": "^29.5.0", "import-local": "^3.0.2", - "jest-cli": "^29.1.2" + "jest-cli": "^29.5.0" } }, "jest-changed-files": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.0.0.tgz", - "integrity": "sha512-28/iDMDrUpGoCitTURuDqUzWQoWmOmOKOFST1mi2lwh62X4BFf6khgH3uSuo1e49X/UDjuApAj3w0wLOex4VPQ==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", + "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", "dev": true, "requires": { "execa": "^5.0.0", @@ -19245,28 +19094,29 @@ } }, "jest-circus": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.1.2.tgz", - "integrity": "sha512-ajQOdxY6mT9GtnfJRZBRYS7toNIJayiiyjDyoZcnvPRUPwJ58JX0ci0PKAKUo2C1RyzlHw0jabjLGKksO42JGA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.5.0.tgz", + "integrity": "sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==", "dev": true, "requires": { - "@jest/environment": "^29.1.2", - "@jest/expect": "^29.1.2", - "@jest/test-result": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/environment": "^29.5.0", + "@jest/expect": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^0.7.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.1.2", - "jest-matcher-utils": "^29.1.2", - "jest-message-util": "^29.1.2", - "jest-runtime": "^29.1.2", - "jest-snapshot": "^29.1.2", - "jest-util": "^29.1.2", + "jest-each": "^29.5.0", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", "p-limit": "^3.1.0", - "pretty-format": "^29.1.2", + "pretty-format": "^29.5.0", + "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -19332,21 +19182,21 @@ } }, "jest-cli": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.1.2.tgz", - "integrity": "sha512-vsvBfQ7oS2o4MJdAH+4u9z76Vw5Q8WBQF5MchDbkylNknZdrPTX1Ix7YRJyTlOWqRaS7ue/cEAn+E4V1MWyMzw==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz", + "integrity": "sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==", "dev": true, "requires": { - "@jest/core": "^29.1.2", - "@jest/test-result": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/core": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.1.2", - "jest-util": "^29.1.2", - "jest-validate": "^29.1.2", + "jest-config": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", "prompts": "^2.0.1", "yargs": "^17.3.1" }, @@ -19403,31 +19253,31 @@ } }, "jest-config": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.1.2.tgz", - "integrity": "sha512-EC3Zi86HJUOz+2YWQcJYQXlf0zuBhJoeyxLM6vb6qJsVmpP7KcCP1JnyF0iaqTaXdBP8Rlwsvs7hnKWQWWLwwA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz", + "integrity": "sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==", "dev": true, "requires": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.1.2", - "@jest/types": "^29.1.2", - "babel-jest": "^29.1.2", + "@jest/test-sequencer": "^29.5.0", + "@jest/types": "^29.5.0", + "babel-jest": "^29.5.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.1.2", - "jest-environment-node": "^29.1.2", - "jest-get-type": "^29.0.0", - "jest-regex-util": "^29.0.0", - "jest-resolve": "^29.1.2", - "jest-runner": "^29.1.2", - "jest-util": "^29.1.2", - "jest-validate": "^29.1.2", + "jest-circus": "^29.5.0", + "jest-environment-node": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-runner": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.1.2", + "pretty-format": "^29.5.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -19484,15 +19334,15 @@ } }, "jest-diff": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.1.2.tgz", - "integrity": "sha512-4GQts0aUopVvecIT4IwD/7xsBaMhKTYoM4/njE/aVw9wpw+pIUVp8Vab/KnSzSilr84GnLBkaP3JLDnQYCKqVQ==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", + "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", "dev": true, "requires": { "chalk": "^4.0.0", - "diff-sequences": "^29.0.0", - "jest-get-type": "^29.0.0", - "pretty-format": "^29.1.2" + "diff-sequences": "^29.4.3", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" }, "dependencies": { "ansi-styles": { @@ -19547,25 +19397,25 @@ } }, "jest-docblock": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.0.0.tgz", - "integrity": "sha512-s5Kpra/kLzbqu9dEjov30kj1n4tfu3e7Pl8v+f8jOkeWNqM6Ds8jRaJfZow3ducoQUrf2Z4rs2N5S3zXnb83gw==", + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", + "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", "dev": true, "requires": { "detect-newline": "^3.0.0" } }, "jest-each": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.1.2.tgz", - "integrity": "sha512-AmTQp9b2etNeEwMyr4jc0Ql/LIX/dhbgP21gHAizya2X6rUspHn2gysMXaj6iwWuOJ2sYRgP8c1P4cXswgvS1A==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.5.0.tgz", + "integrity": "sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==", "dev": true, "requires": { - "@jest/types": "^29.1.2", + "@jest/types": "^29.5.0", "chalk": "^4.0.0", - "jest-get-type": "^29.0.0", - "jest-util": "^29.1.2", - "pretty-format": "^29.1.2" + "jest-get-type": "^29.4.3", + "jest-util": "^29.5.0", + "pretty-format": "^29.5.0" }, "dependencies": { "ansi-styles": { @@ -19620,57 +19470,57 @@ } }, "jest-environment-jsdom": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.1.2.tgz", - "integrity": "sha512-D+XNIKia5+uDjSMwL/G1l6N9MCb7LymKI8FpcLo7kkISjc/Sa9w+dXXEa7u1Wijo3f8sVLqfxdGqYtRhmca+Xw==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.5.0.tgz", + "integrity": "sha512-/KG8yEK4aN8ak56yFVdqFDzKNHgF4BAymCx2LbPNPsUshUlfAl0eX402Xm1pt+eoG9SLZEUVifqXtX8SK74KCw==", "dev": true, "requires": { - "@jest/environment": "^29.1.2", - "@jest/fake-timers": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/environment": "^29.5.0", + "@jest/fake-timers": "^29.5.0", + "@jest/types": "^29.5.0", "@types/jsdom": "^20.0.0", "@types/node": "*", - "jest-mock": "^29.1.2", - "jest-util": "^29.1.2", + "jest-mock": "^29.5.0", + "jest-util": "^29.5.0", "jsdom": "^20.0.0" } }, "jest-environment-node": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.1.2.tgz", - "integrity": "sha512-C59yVbdpY8682u6k/lh8SUMDJPbOyCHOTgLVVi1USWFxtNV+J8fyIwzkg+RJIVI30EKhKiAGNxYaFr3z6eyNhQ==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz", + "integrity": "sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==", "dev": true, "requires": { - "@jest/environment": "^29.1.2", - "@jest/fake-timers": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/environment": "^29.5.0", + "@jest/fake-timers": "^29.5.0", + "@jest/types": "^29.5.0", "@types/node": "*", - "jest-mock": "^29.1.2", - "jest-util": "^29.1.2" + "jest-mock": "^29.5.0", + "jest-util": "^29.5.0" } }, "jest-get-type": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.0.0.tgz", - "integrity": "sha512-83X19z/HuLKYXYHskZlBAShO7UfLFXu/vWajw9ZNJASN32li8yHMaVGAQqxFW1RCFOkB7cubaL6FaJVQqqJLSw==", + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", "dev": true }, "jest-haste-map": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.1.2.tgz", - "integrity": "sha512-xSjbY8/BF11Jh3hGSPfYTa/qBFrm3TPM7WU8pU93m2gqzORVLkHFWvuZmFsTEBPRKndfewXhMOuzJNHyJIZGsw==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz", + "integrity": "sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==", "dev": true, "requires": { - "@jest/types": "^29.1.2", + "@jest/types": "^29.5.0", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.3.2", "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.0.0", - "jest-util": "^29.1.2", - "jest-worker": "^29.1.2", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.5.0", + "jest-worker": "^29.5.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -19682,13 +19532,13 @@ "dev": true }, "jest-worker": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.1.2.tgz", - "integrity": "sha512-AdTZJxKjTSPHbXT/AIOjQVmoFx0LHFcVabWu0sxI7PAy7rFf8c0upyvgBKgguVXdM4vY74JdwkyD4hSmpTW8jA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", + "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", "dev": true, "requires": { "@types/node": "*", - "jest-util": "^29.1.2", + "jest-util": "^29.5.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } @@ -19705,25 +19555,25 @@ } }, "jest-leak-detector": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.1.2.tgz", - "integrity": "sha512-TG5gAZJpgmZtjb6oWxBLf2N6CfQ73iwCe6cofu/Uqv9iiAm6g502CAnGtxQaTfpHECBdVEMRBhomSXeLnoKjiQ==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz", + "integrity": "sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==", "dev": true, "requires": { - "jest-get-type": "^29.0.0", - "pretty-format": "^29.1.2" + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" } }, "jest-matcher-utils": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.1.2.tgz", - "integrity": "sha512-MV5XrD3qYSW2zZSHRRceFzqJ39B2z11Qv0KPyZYxnzDHFeYZGJlgGi0SW+IXSJfOewgJp/Km/7lpcFT+cgZypw==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz", + "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==", "dev": true, "requires": { "chalk": "^4.0.0", - "jest-diff": "^29.1.2", - "jest-get-type": "^29.0.0", - "pretty-format": "^29.1.2" + "jest-diff": "^29.5.0", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" }, "dependencies": { "ansi-styles": { @@ -19778,18 +19628,18 @@ } }, "jest-message-util": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.1.2.tgz", - "integrity": "sha512-9oJ2Os+Qh6IlxLpmvshVbGUiSkZVc2FK+uGOm6tghafnB2RyjKAxMZhtxThRMxfX1J1SOMhTn9oK3/MutRWQJQ==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz", + "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==", "dev": true, "requires": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.1.2", + "@jest/types": "^29.5.0", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.1.2", + "pretty-format": "^29.5.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -19846,43 +19696,43 @@ } }, "jest-mock": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.1.2.tgz", - "integrity": "sha512-PFDAdjjWbjPUtQPkQufvniXIS3N9Tv7tbibePEjIIprzjgo0qQlyUiVMrT4vL8FaSJo1QXifQUOuPH3HQC/aMA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz", + "integrity": "sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==", "dev": true, "requires": { - "@jest/types": "^29.1.2", + "@jest/types": "^29.5.0", "@types/node": "*", - "jest-util": "^29.1.2" + "jest-util": "^29.5.0" } }, "jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, "requires": {} }, "jest-regex-util": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.0.0.tgz", - "integrity": "sha512-BV7VW7Sy0fInHWN93MMPtlClweYv2qrSCwfeFWmpribGZtQPWNvRSq9XOVgOEjU1iBGRKXUZil0o2AH7Iy9Lug==", + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", + "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", "dev": true }, "jest-resolve": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.1.2.tgz", - "integrity": "sha512-7fcOr+k7UYSVRJYhSmJHIid3AnDBcLQX3VmT9OSbPWsWz1MfT7bcoerMhADKGvKCoMpOHUQaDHtQoNp/P9JMGg==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.5.0.tgz", + "integrity": "sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==", "dev": true, "requires": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.1.2", + "jest-haste-map": "^29.5.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.1.2", - "jest-validate": "^29.1.2", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", + "resolve.exports": "^2.0.0", "slash": "^3.0.0" }, "dependencies": { @@ -19938,40 +19788,40 @@ } }, "jest-resolve-dependencies": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.1.2.tgz", - "integrity": "sha512-44yYi+yHqNmH3OoWZvPgmeeiwKxhKV/0CfrzaKLSkZG9gT973PX8i+m8j6pDrTYhhHoiKfF3YUFg/6AeuHw4HQ==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz", + "integrity": "sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==", "dev": true, "requires": { - "jest-regex-util": "^29.0.0", - "jest-snapshot": "^29.1.2" + "jest-regex-util": "^29.4.3", + "jest-snapshot": "^29.5.0" } }, "jest-runner": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.1.2.tgz", - "integrity": "sha512-yy3LEWw8KuBCmg7sCGDIqKwJlULBuNIQa2eFSVgVASWdXbMYZ9H/X0tnXt70XFoGf92W2sOQDOIFAA6f2BG04Q==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz", + "integrity": "sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==", "dev": true, "requires": { - "@jest/console": "^29.1.2", - "@jest/environment": "^29.1.2", - "@jest/test-result": "^29.1.2", - "@jest/transform": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/console": "^29.5.0", + "@jest/environment": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", "@types/node": "*", "chalk": "^4.0.0", - "emittery": "^0.10.2", + "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.0.0", - "jest-environment-node": "^29.1.2", - "jest-haste-map": "^29.1.2", - "jest-leak-detector": "^29.1.2", - "jest-message-util": "^29.1.2", - "jest-resolve": "^29.1.2", - "jest-runtime": "^29.1.2", - "jest-util": "^29.1.2", - "jest-watcher": "^29.1.2", - "jest-worker": "^29.1.2", + "jest-docblock": "^29.4.3", + "jest-environment-node": "^29.5.0", + "jest-haste-map": "^29.5.0", + "jest-leak-detector": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-resolve": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-util": "^29.5.0", + "jest-watcher": "^29.5.0", + "jest-worker": "^29.5.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -20017,13 +19867,13 @@ "dev": true }, "jest-worker": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.1.2.tgz", - "integrity": "sha512-AdTZJxKjTSPHbXT/AIOjQVmoFx0LHFcVabWu0sxI7PAy7rFf8c0upyvgBKgguVXdM4vY74JdwkyD4hSmpTW8jA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", + "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", "dev": true, "requires": { "@types/node": "*", - "jest-util": "^29.1.2", + "jest-util": "^29.5.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -20070,31 +19920,31 @@ } }, "jest-runtime": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.1.2.tgz", - "integrity": "sha512-jr8VJLIf+cYc+8hbrpt412n5jX3tiXmpPSYTGnwcvNemY+EOuLNiYnHJ3Kp25rkaAcTWOEI4ZdOIQcwYcXIAZw==", - "dev": true, - "requires": { - "@jest/environment": "^29.1.2", - "@jest/fake-timers": "^29.1.2", - "@jest/globals": "^29.1.2", - "@jest/source-map": "^29.0.0", - "@jest/test-result": "^29.1.2", - "@jest/transform": "^29.1.2", - "@jest/types": "^29.1.2", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz", + "integrity": "sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==", + "dev": true, + "requires": { + "@jest/environment": "^29.5.0", + "@jest/fake-timers": "^29.5.0", + "@jest/globals": "^29.5.0", + "@jest/source-map": "^29.4.3", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", "@types/node": "*", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.1.2", - "jest-message-util": "^29.1.2", - "jest-mock": "^29.1.2", - "jest-regex-util": "^29.0.0", - "jest-resolve": "^29.1.2", - "jest-snapshot": "^29.1.2", - "jest-util": "^29.1.2", + "jest-haste-map": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-mock": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -20151,9 +20001,9 @@ } }, "jest-snapshot": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.1.2.tgz", - "integrity": "sha512-rYFomGpVMdBlfwTYxkUp3sjD6usptvZcONFYNqVlaz4EpHPnDvlWjvmOQ9OCSNKqYZqLM2aS3wq01tWujLg7gg==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz", + "integrity": "sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==", "dev": true, "requires": { "@babel/core": "^7.11.6", @@ -20162,23 +20012,22 @@ "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/traverse": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.1.2", - "@jest/transform": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/expect-utils": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", "@types/babel__traverse": "^7.0.6", "@types/prettier": "^2.1.5", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.1.2", + "expect": "^29.5.0", "graceful-fs": "^4.2.9", - "jest-diff": "^29.1.2", - "jest-get-type": "^29.0.0", - "jest-haste-map": "^29.1.2", - "jest-matcher-utils": "^29.1.2", - "jest-message-util": "^29.1.2", - "jest-util": "^29.1.2", + "jest-diff": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", "natural-compare": "^1.4.0", - "pretty-format": "^29.1.2", + "pretty-format": "^29.5.0", "semver": "^7.3.5" }, "dependencies": { @@ -20243,12 +20092,12 @@ } }, "jest-util": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.1.2.tgz", - "integrity": "sha512-vPCk9F353i0Ymx3WQq3+a4lZ07NXu9Ca8wya6o4Fe4/aO1e1awMMprZ3woPFpKwghEOW+UXgd15vVotuNN9ONQ==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", + "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", "dev": true, "requires": { - "@jest/types": "^29.1.2", + "@jest/types": "^29.5.0", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -20308,17 +20157,17 @@ } }, "jest-validate": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.1.2.tgz", - "integrity": "sha512-k71pOslNlV8fVyI+mEySy2pq9KdXdgZtm7NHrBX8LghJayc3wWZH0Yr0mtYNGaCU4F1OLPXRkwZR0dBm/ClshA==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz", + "integrity": "sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==", "dev": true, "requires": { - "@jest/types": "^29.1.2", + "@jest/types": "^29.5.0", "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^29.0.0", + "jest-get-type": "^29.4.3", "leven": "^3.1.0", - "pretty-format": "^29.1.2" + "pretty-format": "^29.5.0" }, "dependencies": { "ansi-styles": { @@ -20379,18 +20228,18 @@ } }, "jest-watcher": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.1.2.tgz", - "integrity": "sha512-6JUIUKVdAvcxC6bM8/dMgqY2N4lbT+jZVsxh0hCJRbwkIEnbr/aPjMQ28fNDI5lB51Klh00MWZZeVf27KBUj5w==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz", + "integrity": "sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==", "dev": true, "requires": { - "@jest/test-result": "^29.1.2", - "@jest/types": "^29.1.2", + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "emittery": "^0.10.2", - "jest-util": "^29.1.2", + "emittery": "^0.13.1", + "jest-util": "^29.5.0", "string-length": "^4.0.1" }, "dependencies": { @@ -20471,6 +20320,12 @@ } } }, + "jose": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.13.1.tgz", + "integrity": "sha512-MSJQC5vXco5Br38mzaQKiq9mwt7lwj2eXpgpRyQYNHYt2lq1PjkWa7DLXX0WVcQLE9HhMh3jPiufS7fhJf+CLQ==", + "dev": true + }, "js-sdsl": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", @@ -20541,13 +20396,6 @@ "combined-stream": "^1.0.8", "mime-types": "^2.1.12" } - }, - "ws": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.9.0.tgz", - "integrity": "sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg==", - "dev": true, - "requires": {} } } }, @@ -20601,9 +20449,9 @@ "dev": true }, "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true }, "jsonfile": { @@ -20617,28 +20465,25 @@ } }, "jsonwebtoken": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", - "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", + "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", "dev": true, "requires": { "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", + "lodash": "^4.17.21", "ms": "^2.1.1", - "semver": "^5.6.0" + "semver": "^7.3.8" }, "dependencies": { "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } } } }, @@ -20697,12 +20542,11 @@ } }, "keyv": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.3.2.tgz", - "integrity": "sha512-kn8WmodVBe12lmHpA6W8OY7SNh6wVR+Z+wZESF4iF5FCazaVXGWOtnbnvX0tMQ1bO+/TmOD9LziuYMvrIIs0xw==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", + "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", "dev": true, "requires": { - "compress-brotli": "^1.3.8", "json-buffer": "3.0.1" } }, @@ -20812,42 +20656,6 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, - "lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", - "dev": true - }, - "lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", - "dev": true - }, - "lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", - "dev": true - }, - "lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", - "dev": true - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true - }, - "lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "dev": true - }, "lodash.memoize": { "version": "4.1.2", "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", @@ -20858,12 +20666,6 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", - "dev": true - }, "loose-envify": { "version": "1.4.0", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", @@ -20979,13 +20781,14 @@ }, "mimic-fn": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", "dev": true }, "minimatch": { @@ -21003,6 +20806,12 @@ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, + "minipass": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.4.tgz", + "integrity": "sha512-lwycX3cBMTvcejsHITUgYj6Gy6A7Nh4Q6h9NP4sTHY1ccJlC7yKzDmiShEHsJ16Jf1nKGDEaiHxiltsJEvk0nQ==", + "dev": true + }, "mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -21102,9 +20911,9 @@ "optional": true }, "nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", "dev": true }, "natural-compare": { @@ -21112,6 +20921,12 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, "ncp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", @@ -21131,6 +20946,23 @@ "integrity": "sha512-/ujIVxthRs+7q6hsdjHMaj8hRG9NuWmwrz+JdRwZ14jdFoKSkm+vDsCbF9PLpnSqjaWQJuTmVtcWHNLr+vrOFw==", "dev": true }, + "node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "dev": true + }, + "node-fetch": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.1.tgz", + "integrity": "sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==", + "dev": true, + "requires": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + } + }, "node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -21181,9 +21013,9 @@ "dev": true }, "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", + "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", "dev": true }, "npm-run-path": { @@ -21222,8 +21054,9 @@ "dev": true }, "object-inspect": { - "version": "1.12.0", - "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "dev": true }, "object-keys": { @@ -21232,54 +21065,58 @@ "dev": true }, "object.assign": { - "version": "4.1.2", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" } }, "object.entries": { - "version": "1.1.5", - "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "object.fromentries": { - "version": "2.0.5", - "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "object.hasown": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz", - "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", + "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", "dev": true, "requires": { "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" } }, "object.values": { - "version": "1.1.5", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "on-exit-leak-free": { @@ -21298,6 +21135,7 @@ }, "onetime": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "requires": { @@ -21305,9 +21143,9 @@ } }, "open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "dev": true, "requires": { "define-lazy-prop": "^2.0.0", @@ -21365,6 +21203,12 @@ "requires": { "pump": "^3.0.0" } + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true } } }, @@ -21410,15 +21254,6 @@ "p-limit": "^2.2.0" } }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -21515,6 +21350,24 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "path-scurry": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.6.1.tgz", + "integrity": "sha512-OW+5s+7cw6253Q4E+8qQ/u1fVvcJQCJo/VFD8pje+dbJCF1n5ZRMV2AEHbGp+5Q7jxQIYJxkHopnj6nzdGeZLA==", + "dev": true, + "requires": { + "lru-cache": "^7.14.1", + "minipass": "^4.0.2" + }, + "dependencies": { + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + } + } + }, "path-type": { "version": "4.0.0", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", @@ -21543,9 +21396,9 @@ "dev": true }, "pino": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-8.4.0.tgz", - "integrity": "sha512-R95U66WOb4Ggtb1RPGnC2uvtc8T0i1FSbrKHrAudRtiLDrlNxKjM1MyCJu+V4gL0qdE/7/LoXAmkEY/TlX6ELA==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.11.0.tgz", + "integrity": "sha512-Z2eKSvlrl2rH8p5eveNUnTdd4AjJk8tAsLkHYZQKGHP4WTh2Gi1cOSOs3eWPqaj+niS3gj4UkoreoaWgF3ZWYg==", "dev": true, "requires": { "atomic-sleep": "^1.0.0", @@ -21572,9 +21425,9 @@ }, "dependencies": { "readable-stream": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.2.0.tgz", - "integrity": "sha512-gJrBHsaI3lgBoGMW/jHZsQ/o/TIWiu5ENCJG1BB7fuCKzpFM8GaS2UoBVt9NO+oI+3FcrBNbUkl3ilDe09aY4A==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.3.0.tgz", + "integrity": "sha512-MuEnA0lbSi7JS8XM+WNJlWZkHAAdm7gETHdFK//Q/mChGyj2akEFtdLZh32jSdkWGbRwCW9pn6g3LWDdDeZnBQ==", "dev": true, "requires": { "abort-controller": "^3.0.0", @@ -21586,9 +21439,9 @@ } }, "pino-std-serializers": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.0.0.tgz", - "integrity": "sha512-mMMOwSKrmyl+Y12Ri2xhH1lbzQxwwpuru9VjyJpgFIH4asSj88F2csdMwN6+M5g1Ll4rmsYghHLQJw81tgZ7LQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.0.tgz", + "integrity": "sha512-IWgSzUL8X1w4BIWTwErRgtV8PyOGOOi60uqv0oKuS/fOA8Nco/OeI6lBuc4dyP8MMfdFwyHqTMcBIA7nDiqEqA==", "dev": true }, "pirates": { @@ -21598,9 +21451,9 @@ "dev": true }, "postcss": { - "version": "8.4.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", - "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", + "version": "8.4.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", "dev": true, "requires": { "nanoid": "^3.3.4", @@ -21615,12 +21468,12 @@ "dev": true }, "pretty-format": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.1.2.tgz", - "integrity": "sha512-CGJ6VVGXVRP2o2Dorl4mAwwvDWT25luIsYhkyVQW32E4nL+TgW939J7LlKT/npq5Cpq6j3s+sy+13yk7xYpBmg==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", + "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", "dev": true, "requires": { - "@jest/schemas": "^29.0.0", + "@jest/schemas": "^29.4.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -21651,9 +21504,9 @@ "dev": true }, "process-warning": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.0.0.tgz", - "integrity": "sha512-+MmoAXoUX+VTHAlwns0h+kFUWFs/3FZy+ZuchkgjyOu3oioLAo2LB5aCfKPh2+P9O18i3m43tUEv3YqttSy0Ww==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.2.0.tgz", + "integrity": "sha512-/1WZ8+VQjR6avWOgHeEPd7SDQmFQ1B5mC1eRXsCm5TarlNmx/wCsa5GEaxGm05BORRtyG/Ex/3xq3TuRvq57qg==", "dev": true }, "promise-toolbox": { @@ -21726,6 +21579,12 @@ "escape-goat": "^4.0.0" } }, + "pure-rand": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.0.tgz", + "integrity": "sha512-rLSBxJjP+4DQOgcJAx6RZHT2he2pkhQdSnofG5VWyVl6GRq/K02ISOuOLcsMOrtKDIJb8JN2zm3FFzWNbezdPw==", + "dev": true + }, "qs": { "version": "6.5.3", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", @@ -21747,6 +21606,12 @@ "inherits": "~2.0.3" } }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, "quick-format-unescaped": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", @@ -21861,9 +21726,9 @@ } }, "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "dev": true }, "regexp.prototype.flags": { @@ -22003,26 +21868,18 @@ "dev": true }, "resolve.exports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", - "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.1.tgz", + "integrity": "sha512-OEJWVeimw8mgQuj3HfkNl4KqRevH7lzeQNaWRPfx0PPse7Jk6ozcsG4FKVgtzDsC1KUF+YlTHh17NcgHOPykLw==", "dev": true }, "responselike": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", - "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", "dev": true, "requires": { - "lowercase-keys": "^2.0.0" - }, - "dependencies": { - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - } + "lowercase-keys": "^3.0.0" } }, "reusify": { @@ -22031,17 +21888,54 @@ "dev": true }, "rimraf": { - "version": "3.0.2", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.3.1.tgz", + "integrity": "sha512-GfHJHBzFQra23IxDzIdBqhOWfbtdgS1/dCHrDy+yvhpoJY5TdwdT28oWaHWfRpKFDLd3GZnGTx6Mlt4+anbsxQ==", "dev": true, "requires": { - "glob": "^7.1.3" + "glob": "^9.2.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.2.1.tgz", + "integrity": "sha512-Pxxgq3W0HyA3XUvSXcFhRSs+43Jsx0ddxcFrbjxNGkL2Ak5BAUBxLqI5G6ADDeCHLfzzXFhe0b1yYcctGmytMA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "minimatch": "^7.4.1", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" + } + }, + "minimatch": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.2.tgz", + "integrity": "sha512-xy4q7wou3vUoC9k1xGTXc+awNdGaGVHtFUaey8tiX4H1QRc04DZ/rmDFwNm2EBsuYEhAZ6SgMmYf3InGY6OauA==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } } }, "run-parallel": { - "version": "1.1.9", - "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", - "dev": true + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } }, "rxjs": { "version": "7.5.6", @@ -22073,10 +21967,21 @@ "dev": true, "optional": true }, + "safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } + }, "safe-stable-stringify": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.0.tgz", - "integrity": "sha512-eehKHKpab6E741ud7ZIMcXhKcP6TSIezPkNZhy5U8xC6+VvrRdUA2tMgxGxaGl4cz7c2Ew5+mg5+wNB16KQqrA==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", "dev": true }, "safer-buffer": { @@ -22150,14 +22055,14 @@ } }, "selenium-webdriver": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.5.0.tgz", - "integrity": "sha512-9mSFii+lRwcnT2KUAB1kqvx6+mMiiQHH60Y0VUtr3kxxi3oZ3CV3B8e2nuJ7T4SPb+Q6VA0swswe7rYpez07Bg==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.8.1.tgz", + "integrity": "sha512-p4MtfhCQdcV6xxkS7eI0tQN6+WNReRULLCAuT4RDGkrjfObBNXMJ3WT8XdK+aXTr5nnBKuh+PxIevM0EjJgkxA==", "dev": true, "requires": { "jszip": "^3.10.0", "tmp": "^0.2.1", - "ws": ">=8.7.0" + "ws": ">=8.11.0" } }, "semver": { @@ -22248,6 +22153,7 @@ }, "side-channel": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "dev": true, "requires": { @@ -22257,17 +22163,17 @@ } }, "sign-addon": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/sign-addon/-/sign-addon-5.0.0.tgz", - "integrity": "sha512-qO3YYs8/kV7SyY8Kqmk1TW30FAVnvxTxUvncnK82H1+k4AkhVw33owReKyzoiHfNpgv1ugmgxA9jEsAIWqVCCg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/sign-addon/-/sign-addon-5.3.0.tgz", + "integrity": "sha512-7nHlCzhQgVMLBNiXVEgbG/raq48awOW0lYMN5uo1BaB3mp0+k8M8pvDwbfTlr3apcxZJsk9HQsAW1POwoJugpQ==", "dev": true, "requires": { "common-tags": "1.8.2", - "core-js": "3.22.8", + "core-js": "3.29.0", "deepcopy": "2.1.0", "es6-error": "4.1.1", "es6-promisify": "7.0.0", - "jsonwebtoken": "8.5.1", + "jsonwebtoken": "9.0.0", "mz": "2.7.0", "request": "2.88.2", "source-map-support": "0.5.21", @@ -22293,9 +22199,9 @@ "dev": true }, "sonic-boom": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.2.0.tgz", - "integrity": "sha512-SbbZ+Kqj/XIunvIAgUZRlqd6CGQYq71tRRbXR92Za8J/R3Yh4Av+TWENiSiEgnlwckYLyP0YZQWVfyNC0dzLaA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.3.0.tgz", + "integrity": "sha512-LYxp34KlZ1a2Jb8ZQgFCK3niIHzibdwtwNUWKg0qQRzsDoJ3Gfgkf8KdBTFU3SkejDEIlWwnSnpVdOZIhFMl/g==", "dev": true, "requires": { "atomic-sleep": "^1.0.0" @@ -22337,66 +22243,6 @@ "os-shim": "^0.1.2" } }, - "speed-measure-webpack-plugin": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.5.0.tgz", - "integrity": "sha512-Re0wX5CtM6gW7bZA64ONOfEPEhwbiSF/vz6e2GvadjuaPrQcHTQdRGsD8+BE7iUOysXH8tIenkPCQBEcspXsNg==", - "dev": true, - "requires": { - "chalk": "^4.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, "split": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", @@ -22407,9 +22253,9 @@ } }, "split2": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", - "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", "dev": true }, "sprintf-js": { @@ -22494,41 +22340,41 @@ } }, "string.prototype.matchall": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", - "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", + "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.1", + "regexp.prototype.flags": "^1.4.3", "side-channel": "^1.0.4" } }, "string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" } }, "string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" } }, "strip-ansi": { @@ -22567,6 +22413,7 @@ }, "strip-final-newline": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true }, @@ -22583,32 +22430,11 @@ "has-flag": "^3.0.0" } }, - "supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true }, "symbol-tree": { "version": "3.2.4", @@ -22631,16 +22457,6 @@ "is2": "^2.0.6" } }, - "terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - } - }, "terser": { "version": "5.14.2", "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", @@ -22714,9 +22530,9 @@ } }, "thread-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.2.0.tgz", - "integrity": "sha512-rUkv4/fnb4rqy/gGy7VuqK6wE1+1DOCOWy4RMeaV69ZHMP11tQKZvZSip1yTgrKCMZzEMcCL/bKfHvSfDHx+iQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.3.0.tgz", + "integrity": "sha512-kaDqm1DET9pp3NXwR8382WHbnpXnRkN9xGN9dQt3B2+dmXiW8X1SOwmFOxAErEQ47ObhZ96J6yhZNXuyCOL7KA==", "dev": true, "requires": { "real-require": "^0.2.0" @@ -22734,6 +22550,17 @@ "dev": true, "requires": { "rimraf": "^3.0.0" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, "tmpl": { @@ -22798,15 +22625,15 @@ "dev": true }, "ts-jest": { - "version": "29.0.3", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.3.tgz", - "integrity": "sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ==", + "version": "29.0.5", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.5.tgz", + "integrity": "sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==", "dev": true, "requires": { "bs-logger": "0.x", "fast-json-stable-stringify": "2.x", "jest-util": "^29.0.0", - "json5": "^2.2.1", + "json5": "^2.2.3", "lodash.memoize": "4.x", "make-error": "1.x", "semver": "7.x", @@ -22821,9 +22648,9 @@ } }, "ts-loader": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.1.tgz", - "integrity": "sha512-384TYAqGs70rn9F0VBnh6BPTfhga7yFNdC5gXbQpDrBj9/KsT4iRkGqKXhziofHOlE2j6YEaiTYVGKKvPhGWvw==", + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz", + "integrity": "sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==", "dev": true, "requires": { "chalk": "^4.1.0", @@ -22953,6 +22780,7 @@ }, "type-detect": { "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, @@ -22962,6 +22790,17 @@ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true }, + "typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + } + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -22978,9 +22817,9 @@ } }, "typescript": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", - "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true }, "unbox-primitive": { @@ -23094,12 +22933,6 @@ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, "v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -23107,9 +22940,9 @@ "dev": true }, "v8-to-istanbul": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", - "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", "dev": true, "requires": { "@jridgewell/trace-mapping": "^0.3.12", @@ -23166,49 +22999,62 @@ } }, "web-ext": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/web-ext/-/web-ext-7.2.0.tgz", - "integrity": "sha512-EIrTUpweU1hu+gG2UcwkVKU2BGV6jsZ0+uoUcSdHB/aZPWzQr4dkcH3QHsDGIH/r2J9ESTvsWUHWHLRPeklqBg==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/web-ext/-/web-ext-7.6.2.tgz", + "integrity": "sha512-xlxbzgFBIS/UWWlvWxyR1PIqRRzDj1cutoHh+VZu4ZTcJTfv35KVdKkLRZv4PQwHu4dg8VfTg7WEcNP4QLaaFQ==", "dev": true, "requires": { - "@babel/runtime": "7.18.9", + "@babel/runtime": "7.21.0", "@devicefarmer/adbkit": "3.2.3", - "addons-linter": "5.14.0", + "addons-linter": "5.32.0", "bunyan": "1.8.15", - "camelcase": "7.0.0", + "camelcase": "7.0.1", "chrome-launcher": "0.15.1", "debounce": "1.2.1", "decamelize": "6.0.0", "es6-error": "4.1.1", - "firefox-profile": "4.2.2", - "fs-extra": "10.1.0", + "firefox-profile": "4.3.2", + "fs-extra": "11.1.0", "fx-runner": "1.3.0", "import-fresh": "3.3.0", + "jose": "4.13.1", "mkdirp": "1.0.4", "multimatch": "6.0.0", "mz": "2.7.0", + "node-fetch": "3.3.1", "node-notifier": "10.0.1", - "open": "8.4.0", + "open": "8.4.2", "parse-json": "6.0.2", "promise-toolbox": "0.21.0", - "sign-addon": "5.0.0", + "sign-addon": "5.3.0", "source-map-support": "0.5.21", "strip-bom": "5.0.0", "strip-json-comments": "5.0.0", "tmp": "0.2.1", "update-notifier": "6.0.2", "watchpack": "2.4.0", - "ws": "8.8.1", - "yargs": "17.5.1", + "ws": "8.13.0", + "yargs": "17.7.1", "zip-dir": "2.0.0" }, "dependencies": { "camelcase": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.0.tgz", - "integrity": "sha512-JToIvOmz6nhGsUhAYScbo2d6Py5wojjNfoxoc2mEVLUdJ70gJK2gnd+ABY1Tc3sVMyK7QDPtN0T/XdlCQWITyQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", "dev": true }, + "fs-extra": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", + "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, "lines-and-columns": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz", @@ -23246,6 +23092,41 @@ } } }, + "web-streams-polyfill": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", + "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", + "dev": true + }, + "webext-content-scripts": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/webext-content-scripts/-/webext-content-scripts-2.5.5.tgz", + "integrity": "sha512-CIq1LA/nHIXE43v8qlpqNPcbsSzGuQBkeykbqOWvKJ1Rx/q7zgdZsLgxwyoonWiQcJczslVmGWCfdBY04JwIyw==", + "requires": { + "webext-patterns": "^1.3.0", + "webext-polyfill-kinda": "^1.0.2" + } + }, + "webext-patterns": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/webext-patterns/-/webext-patterns-1.3.0.tgz", + "integrity": "sha512-X9HMnic9ZtvSFKi2cdh0l+sxyj7f9oLedaa2JfxjnyEqGBz8OJjaHQ40jmraX1DJLTHOpqr+rCz1r3MW2+doUg==", + "requires": { + "escape-string-regexp": "^5.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==" + } + } + }, + "webext-polyfill-kinda": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/webext-polyfill-kinda/-/webext-polyfill-kinda-1.0.2.tgz", + "integrity": "sha512-rqQUKeBTOicej0tjDJWDQlOTnDcm9yYJTzgI+7rMdyYV4QHmYMRm+yjkcVgECkg/Wu9MboZ4lYeBPdp1Ep9WgQ==" + }, "webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -23253,9 +23134,9 @@ "dev": true }, "webpack": { - "version": "5.74.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", - "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "version": "5.75.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", + "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.3", @@ -23401,6 +23282,20 @@ "is-symbol": "^1.0.3" } }, + "which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + } + }, "widest-line": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", @@ -23457,12 +23352,14 @@ "dev": true }, "word-wrap": { - "version": "1.2.3", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", + "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", "dev": true }, "wrap-ansi": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "requires": { @@ -23473,6 +23370,7 @@ "dependencies": { "ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { @@ -23481,6 +23379,7 @@ }, "color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { @@ -23489,6 +23388,7 @@ }, "color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true } @@ -23512,9 +23412,9 @@ } }, "ws": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", - "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", "dev": true, "requires": {} }, @@ -23531,9 +23431,9 @@ "dev": true }, "xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", "dev": true, "requires": { "sax": ">=0.6.0", @@ -23571,24 +23471,24 @@ "dev": true }, "yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", "dev": true, "requires": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" + "yargs-parser": "^21.1.1" } }, "yargs-parser": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", - "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true }, "yauzl": { diff --git a/package.json b/package.json index fc1a14f9..1c4f20e2 100644 --- a/package.json +++ b/package.json @@ -4,37 +4,42 @@ "description": "", "main": "background.js", "dependencies": { + "content-scripts-register-polyfill": "^4.0.2", "react": "^18.2.0", "react-dom": "^18.2.0" }, + "overrides": { + "content-scripts-register-polyfill": { + "webext-content-scripts": "v2.5.5" + } + }, "devDependencies": { - "@types/chrome": "^0.0.197", - "@types/firefox-webext-browser": "^94.0.1", - "@types/jest": "^29.1.2", - "@types/react": "^18.0.21", - "@types/react-dom": "^18.0.6", - "@types/selenium-webdriver": "^4.1.5", + "@types/chrome": "^0.0.220", + "@types/firefox-webext-browser": "^111.0.0", + "@types/jest": "^29.4.0", + "@types/react": "^18.0.28", + "@types/react-dom": "^18.0.11", + "@types/selenium-webdriver": "^4.1.13", "@types/wicg-mediasession": "^1.1.4", - "@typescript-eslint/eslint-plugin": "^5.39.0", - "@typescript-eslint/parser": "^5.39.0", - "chromedriver": "^106.0.1", - "concurrently": "^7.4.0", + "@typescript-eslint/eslint-plugin": "^5.54.1", + "@typescript-eslint/parser": "^5.54.1", + "chromedriver": "^110.0.0", + "concurrently": "^7.6.0", "copy-webpack-plugin": "^11.0.0", - "eslint": "^8.24.0", - "eslint-plugin-react": "^7.31.8", - "fork-ts-checker-webpack-plugin": "^7.2.13", - "jest": "^29.1.2", - "jest-environment-jsdom": "^29.1.2", - "rimraf": "^3.0.2", + "eslint": "^8.35.0", + "eslint-plugin-react": "^7.32.2", + "fork-ts-checker-webpack-plugin": "^7.3.0", + "jest": "^29.5.0", + "jest-environment-jsdom": "^29.5.0", + "rimraf": "^4.3.1", "schema-utils": "^4.0.0", - "selenium-webdriver": "^4.5.0", - "speed-measure-webpack-plugin": "^1.5.0", - "ts-jest": "^29.0.3", - "ts-loader": "^9.4.1", + "selenium-webdriver": "^4.8.1", + "ts-jest": "^29.0.5", + "ts-loader": "^9.4.2", "ts-node": "^10.9.1", - "typescript": "4.8", - "web-ext": "^7.2.0", - "webpack": "^5.74.0", + "typescript": "4.9", + "web-ext": "^7.6.2", + "webpack": "^5.75.0", "webpack-cli": "^4.10.0", "webpack-merge": "^5.8.0" }, @@ -55,7 +60,7 @@ "build:watch": "npm run build:watch:chrome", "build:watch:chrome": "webpack --env browser=chrome --config webpack/webpack.dev.js --watch", "build:watch:firefox": "webpack --env browser=firefox --config webpack/webpack.dev.js --watch", - "ci:invidious": "ts-node ci/invidiousCI.ts", + "ci:invidious": "ts-node ci/generateList.ts", "dev": "npm run build:dev && concurrently \"npm run web-run\" \"npm run build:watch\"", "dev:firefox": "npm run build:dev:firefox && concurrently \"npm run web-run:firefox\" \"npm run build:watch:firefox\"", "dev:firefox-android": "npm run build:dev:firefox && concurrently \"npm run web-run:firefox-android\" \"npm run build:watch:firefox\"", diff --git a/public/_locales b/public/_locales new file mode 160000 +Subproject 5528978f2f608eb84a7f7e9785508b0f70a9e3c diff --git a/public/_locales/af/messages.json b/public/_locales/af/messages.json deleted file mode 100644 index 0967ef42..00000000 --- a/public/_locales/af/messages.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/public/_locales/am/messages.json b/public/_locales/am/messages.json deleted file mode 100644 index 3d8fed50..00000000 --- a/public/_locales/am/messages.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "Loading": { - "message": "በመጫን ላይ..." - }, - "paused": { - "message": "ለአፍታ አቁም" - }, - "success": { - "message": "ተሳክቷል!" - }, - "Username": { - "message": "መለያ ስም" - } -} diff --git a/public/_locales/ar/messages.json b/public/_locales/ar/messages.json deleted file mode 100644 index a5b97cca..00000000 --- a/public/_locales/ar/messages.json +++ /dev/null @@ -1,644 +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": "أجزاء" - }, - "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": "إغلاق النافذة المنبثقة" - }, - "SubmitTimes": { - "message": "إرسال الأجزاء" - }, - "submitCheck": { - "message": "هل أنت متأكد أنك تريد إرسال هذا؟" - }, - "whitelistChannel": { - "message": "إضافة القناة إلى القائمة البيضاء" - }, - "removeFromWhitelist": { - "message": "إزالة القناة من القائمة البيضاء" - }, - "voteOnTime": { - "message": "صوّت لجزء" - }, - "Submissions": { - "message": "المشاركات" - }, - "savedPeopleFrom": { - "message": "لقد وفّرت على الناس " - }, - "viewLeaderboard": { - "message": "المتصدرين" - }, - "recordTimesDescription": { - "message": "إرسال" - }, - "submissionEditHint": { - "message": "سيظهر تحرير الجزء بعد النقر على إرسال", - "description": "Appears in the popup to inform them that editing has been moved to the video player." - }, - "popupHint": { - "message": "تلميح: يمكنك إعداد اختصارات مفاتيح للتقديم في الخيارات" - }, - "clearTimesButton": { - "message": "مسح الأوقات" - }, - "submitTimesButton": { - "message": "إرسال الأوقات" - }, - "publicStats": { - "message": "يستخدم هذا في صفحة الإحصائيات العامة لإظهار مقدار مساهمتك. قم برؤيتها" - }, - "Username": { - "message": "اسم المستخدم" - }, - "setUsername": { - "message": "تعيين اسم مستخدم" - }, - "copyPublicID": { - "message": "نسخ رمز المستخدم" - }, - "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": "أضِف" - }, - "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": "تعديل" - }, - "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_filler_short": { - "message": "حشو" - }, - "category_music_offtopic": { - "message": "الموسيقى: مقطع غير موسيقي" - }, - "category_music_offtopic_short": { - "message": "غير موسيقي" - }, - "category_poi_highlight": { - "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": "(النهاية)" - }, - "hiddenDueToDownvote": { - "message": "مخفي: تصويت سلبي" - }, - "hiddenDueToDuration": { - "message": "مخفي: قصير جداً" - }, - "manuallyHidden": { - "message": "مخفي يدوياً" - }, - "permissionRequestSuccess": { - "message": "نجح طلب الإذن!" - }, - "permissionRequestFailed": { - "message": "فشل طلب الإذن ، هل نقرت على رفض؟" - }, - "downvoteDescription": { - "message": "خاطئ/التوقيت غير صحيح" - }, - "incorrectCategory": { - "message": "تغيير الفئة" - }, - "multipleSegments": { - "message": "أجزاء متعددة" - }, - "guidelines": { - "message": "الإرشادات" - }, - "readTheGuidelines": { - "message": "اقرأ الإرشادات!!", - "description": "Show the first time they submit or if they are \"high risk\"" - }, - "categoryUpdate1": { - "message": "الفئات هنا!" - }, - "help": { - "message": "المساعدة" - }, - "GotIt": { - "message": "فهمت", - "description": "Used as the button to dismiss a tooltip" - }, - "hideForever": { - "message": "إخفاء دائم" - }, - "warningTitle": { - "message": "لقد حصلت على تحذير" - }, - "questionButton": { - "message": "لدي سؤال" - }, - "warningConfirmButton": { - "message": "أنا أفهم السبب" - }, - "Donate": { - "message": "تبرع" - }, - "considerDonating": { - "message": "ساعد في تمويل التطوير" - }, - "hideDonationLink": { - "message": "إخفاء رابط التبرع" - }, - "darkModeOptionsPage": { - "message": "الوضع الداكن في صفحة الخيارات" - }, - "helpPageThanksForInstalling": { - "message": "شكرا على تثبيت SponsorBlock." - }, - "helpPageReviewOptions": { - "message": "يرجى مراجعة الخيارات أدناه" - }, - "helpPageHowSkippingWorks": { - "message": "كيف يعمل التخطي" - }, - "Submitting": { - "message": "إرسال" - }, - "Editing": { - "message": "التعديل" - }, - "helpPageTooSlow": { - "message": "هذا بطيء جداً" - }, - "helpPageCopyOfDatabase": { - "message": "هل يمكنني الحصول على نسخة من قاعدة البيانات؟ ماذا يحدث إذا اختفيت؟" - }, - "helpPageCopyOfDatabase1": { - "message": "قاعدة البيانات عامة ومتاحة على" - }, - "helpPageNews": { - "message": "الأخبار وكيف تم صنعها" - }, - "helpPageSourceCode": { - "message": "أين يمكنني الحصول على شفرة المصدر؟" - }, - "LearnMore": { - "message": "معرفة المزيد" - }, - "FullDetails": { - "message": "التفاصيل الكاملة" - }, - "OpenCategoryWikiPage": { - "message": "افتح صفحة ويكي هذه الفئة." - }, - "CopyAndDownvote": { - "message": "نسخ وتصويت معارض" - }, - "ContinueVoting": { - "message": "متابعة التصويت" - }, - "downvote": { - "message": "تصويت سلبي" - }, - "upvote": { - "message": "تصويت إيجابي" - }, - "hideSegment": { - "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": "هل أنت متأكد من أنك تريد إعادة تعيين كافة الإعدادات إلى حالتها الافتراضية؟ لا يمكنك التراجع عن ذلك." - } -} diff --git a/public/_locales/bg/messages.json b/public/_locales/bg/messages.json deleted file mode 100644 index 00deb453..00000000 --- a/public/_locales/bg/messages.json +++ /dev/null @@ -1,1247 +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": "Сегменти" - }, - "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": "Икона - затваряне" - }, - "SubmitTimes": { - "message": "Изпращане на сегментите" - }, - "sortSegments": { - "message": "Сортиране на сегментите" - }, - "submitCheck": { - "message": "Наистина ли искате да изпратите това?" - }, - "whitelistChannel": { - "message": "Добавяне на канала към белия списък" - }, - "removeFromWhitelist": { - "message": "Премахване на канала от белия списък" - }, - "voteOnTime": { - "message": "Гласувайте за сегмент" - }, - "Submissions": { - "message": "Изпратени сегменти" - }, - "savedPeopleFrom": { - "message": "Помогнахте на хората да пропуснат " - }, - "viewLeaderboard": { - "message": "Класиране" - }, - "recordTimesDescription": { - "message": "Изпращане" - }, - "submissionEditHint": { - "message": "Редактирането на частите ще се появи, след като щракнете върху Изпращане", - "description": "Appears in the popup to inform them that editing has been moved to the video player." - }, - "popupHint": { - "message": "Съвет: Можете да настроите клавиши за изпращане в опциите" - }, - "clearTimesButton": { - "message": "Изчистване на времената" - }, - "submitTimesButton": { - "message": "Изпращане на времената" - }, - "publicStats": { - "message": "Това се използва на страницата с публичната статистика, за да покаже колко сте допринесли. Вижте го" - }, - "Username": { - "message": "Потребител" - }, - "setUsername": { - "message": "Задайте потребителско име" - }, - "copyPublicID": { - "message": "Копиране на публичния UserID" - }, - "copySegmentID": { - "message": "Копиране на идентификатора на сегмента" - }, - "discordAdvert": { - "message": "Елате в официалния Discord сървър, за да давате предложения!" - }, - "hideThis": { - "message": "Скриване на това" - }, - "Options": { - "message": "Опции" - }, - "showButtons": { - "message": "Показване на бутоните в плейъра на YouTube" - }, - "hideButtons": { - "message": "Скриване на бутоните в плейъра на YouTube" - }, - "hideButtonsDescription": { - "message": "Това скрива бутоните, които се показват в плейъра на YouTube за изпращане на сегменти за пропускане." - }, - "showSkipButton": { - "message": "Оставяне в плейъра на бутона за преминаване към акцента" - }, - "showInfoButton": { - "message": "Показване на бутона за информация в плейъра на YouTube" - }, - "hideInfoButton": { - "message": "Скриване на бутона за информация в плейъра на YouTube" - }, - "autoHideInfoButton": { - "message": "Автоматично скриване на бутона за информация" - }, - "hideDeleteButton": { - "message": "Скриване на бутона за изтриване в плейъра на YouTube" - }, - "showDeleteButton": { - "message": "Показване на бутона за изтриване в плейъра на YouTube" - }, - "enableViewTracking": { - "message": "Активиране проследяването на броя пропускания" - }, - "whatViewTracking": { - "message": "Тази функция проследява кои сегменти сте пропуснали, за да уведоми потребителите доколко приносът им е помогнал на другите и се използва като показател заедно с положителните гласове, за да се гарантира, че спамът няма да попадне в базата данни. Разширението изпраща съобщение до сървъра всеки път, когато пропуснете сегмент. Надяваме се, че повечето хора няма да променят тази настройка, така че броят на прегледите да е точен. :)" - }, - "enableViewTrackingInPrivate": { - "message": "Активиране проследяването на броя пропускания в раздели „Инкогнито“" - }, - "enableTrackDownvotes": { - "message": "Съхраняване на отрицателните гласове за сегменти" - }, - "whatTrackDownvotes": { - "message": "Всички сегменти, за които гласувате против, ще останат скрити дори след опресняване" - }, - "trackDownvotesWarning": { - "message": "Внимание: Деактивирането на това ще изтрие всички по-рано запазени отрицателни гласове" - }, - "enableQueryByHashPrefix": { - "message": "Заявка по префикс на хеш" - }, - "whatQueryByHashPrefix": { - "message": "Вместо да се изискват сегменти от сървъра с помощта на videoID, се изпращат първите 4 знака от хеша на videoID. Този сървър ще изпрати обратно данни за всички видеоклипове с подобни хешове." - }, - "enableRefetchWhenNotFound": { - "message": "Повторно извличане на сегментите при нови видеоклипове" - }, - "whatRefetchWhenNotFound": { - "message": "Ако видеоклипът е нов и няма намерени сегменти, той ще продължи да извлича на всеки няколко минути, докато гледате." - }, - "enableShowCategoryWithoutPermission": { - "message": "Показване на категории в менюто за изпращане дори без разрешение за изпращане" - }, - "whatShowCategoryWithoutPermission": { - "message": "Някои категории изискват разрешение за изпращане поради минимални изисквания за репутация" - }, - "showNotice": { - "message": "Отново покажете известието" - }, - "showSkipNotice": { - "message": "Показване на известие след пропускане на сегмент" - }, - "showCategoryGuidelines": { - "message": "Показване на помощ за категорията" - }, - "noticeVisibilityMode0": { - "message": "Известия за пропускане в пълен размер" - }, - "noticeVisibilityMode1": { - "message": "Малки известия за пропускане при автоматично пропускане" - }, - "noticeVisibilityMode2": { - "message": "Изцяло малки известия за пропускане" - }, - "noticeVisibilityMode3": { - "message": "Плавни известия за пропускане при автоматично пропускане" - }, - "noticeVisibilityMode4": { - "message": "Изцяло плавни известия за пропускане" - }, - "longDescription": { - "message": "SponsorBlock ви позволява да прескачате спонсори, въведения, заключения, напомняния за абониране и други досадни части от видеоклиповете в YouTube. SponsorBlock е разширение за браузър, създадено от множество хора, което позволява на всеки да изпраща началния и крайния час на спонсорирани сегменти и други сегменти от видеоклиповете в YouTube. След като един човек подаде тази информация, всички останали с това разширение ще прескочат спонсорирания сегмент. Можете също да пропуснете части без музика при музикалните видеоклипове.", - "description": "Full description of the extension on the store pages." - }, - "website": { - "message": "Уебсайт", - "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" - }, - "nextChapterKeybind": { - "message": "Следваща глава", - "description": "Keybind label" - }, - "previousChapterKeybind": { - "message": "Предишна глава", - "description": "Keybind label" - }, - "keybindDescription": { - "message": "Изберете клавиш, като го натиснете, заедно с всички клавишни модификатори, които искате да използвате." - }, - "0": { - "message": "Времето за изчакване на връзката изтече. Проверете връзката си с интернет. Ако вашият интернет работи, вероятно сървърът е претоварен или не работи." - }, - "disableSkipping": { - "message": "Пропускането е активирано" - }, - "enableSkipping": { - "message": "Пропускането е деактивирано" - }, - "yourWork": { - "message": "Вашата работа", - "description": "Used to describe the section that will show you the statistics from your submissions." - }, - "502": { - "message": "Сървърът изглежда претоварен. Опитайте отново след няколко секунди." - }, - "errorCode": { - "message": "Код на грешката: " - }, - "skip": { - "message": "Пропускане" - }, - "mute": { - "message": "Заглушаване" - }, - "full": { - "message": "Целия видеоклип", - "description": "Used for the name of the option to label an entire video as sponsor or self promotion." - }, - "skip_category": { - "message": "Пропускане на {0}?" - }, - "mute_category": { - "message": "Заглушаване на {0}?" - }, - "skip_to_category": { - "message": "Прескачане до {0}?", - "description": "Used for skipping to things (Skip to Highlight)" - }, - "skipped": { - "message": "{0} пропуснат", - "description": "Example: Sponsor Skipped" - }, - "muted": { - "message": "{0} заглушено", - "description": "Example: Sponsor Muted" - }, - "skipped_to_category": { - "message": "Прескочено до {0}", - "description": "Used for skipping to things (Skipped to Highlight)" - }, - "disableAutoSkip": { - "message": "Деактивиране на автоматичното пропускане" - }, - "enableAutoSkip": { - "message": "Активиране на автоматичното пропускане" - }, - "audioNotification": { - "message": "Звуково известие при пропускане" - }, - "audioNotificationDescription": { - "message": "Звуковото известие при пропускане ще пуска звук всеки път, когато се пропусне сегмент. Ако е забранено (или автоматичното пропускане е деактивирано), няма да се пуска звук." - }, - "showTimeWithSkips": { - "message": "Показване на времето с премахнати пропускания" - }, - "showTimeWithSkipsDescription": { - "message": "Това време се показва в скоби до текущото време под лентата за прогреса. Това показва общата продължителност на видеоклипа минус всички сегменти. Това включва сегменти, маркирани само като „Показване в лентата за прогреса“." - }, - "youHaveSkipped": { - "message": "Пропуснали сте " - }, - "minLower": { - "message": "минута" - }, - "minsLower": { - "message": "минути" - }, - "hourLower": { - "message": "час" - }, - "hoursLower": { - "message": "часа" - }, - "youHaveSavedTime": { - "message": "Спестили сте на хората", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "youHaveSavedTimeEnd": { - "message": " от живота им", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "statusReminder": { - "message": "Проверете status.sponsor.ajay.app за състоянието на сървъра." - }, - "changeUserID": { - "message": "Импортиране/експортиране на вашия личен UserID" - }, - "whatChangeUserID": { - "message": "Това трябва да се пази в тайна. То е като парола и не трябва да се споделя с никого. Ако някой го има, може да се представи за вас. Ако търсите своя публичен потребителски идентификатор, щракнете върху иконата на клипборда в изскачащия прозорец." - }, - "setUserID": { - "message": "Задаване на личен UserID" - }, - "userIDChangeWarning": { - "message": "Внимание: Промяната на личния UserID е постоянна. Наистина ли искате да направите това? Не забравяйте да архивирате стария си за всеки случай." - }, - "createdBy": { - "message": "Създаден от" - }, - "supportOtherSites": { - "message": "Поддръжка на YouTube-сайтове на трети страни" - }, - "supportOtherSitesDescription": { - "message": "Поддръжка на клиенти за YouTube на трети страни. За да активирате поддръжката, трябва да приемете допълнителните разрешения. Това НЕ работи в режим инкогнито в Chrome и други варианти на Chromium.", - "description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube" - }, - "supportedSites": { - "message": "Поддържани сайтове: " - }, - "optionsInfo": { - "message": "Активиране поддръжката на Invidious, деактивиране на автоматичното пропускане, скриване на бутоните и др." - }, - "addInvidiousInstance": { - "message": "Добавяне екземпляр на клиент на трета страна" - }, - "addInvidiousInstanceDescription": { - "message": "Добавяне на персонализиран екземпляр. Това трябва да бъде форматирано само с домейна. Пример: invidious.ajay.app" - }, - "add": { - "message": "Добавяне" - }, - "addInvidiousInstanceError": { - "message": "Това е невалиден домейн. Трябва да включва само частта на домейна. Пример: invidious.ajay.app" - }, - "resetInvidiousInstance": { - "message": "Нулиране списъка на Invidious" - }, - "resetInvidiousInstanceAlert": { - "message": "На път сте да нулирате списъка на Invidious" - }, - "currentInstances": { - "message": "Текущи екземпляри:" - }, - "minDuration": { - "message": "Минимална продължителност (секунди):" - }, - "minDurationDescription": { - "message": "Сегменти, по-кратки от зададената стойност, няма да бъдат пропускани или показвани в плейъра." - }, - "enableManualSkipOnFullVideo": { - "message": "Използване на ръчно пропускане, когато съществува етикет за целия видеоклип" - }, - "whatManualSkipOnFullVideo": { - "message": "За хора, които искат да гледат видеоклипа без прекъсване, ако е изцяло спонсориран или саморекламен." - }, - "skipNoticeDuration": { - "message": "Продължителност на известието за пропускане (секунди):" - }, - "skipNoticeDurationDescription": { - "message": "Известието за пропускане ще остане на екрана поне толкова дълго. За ръчно пропускане може да се вижда по-дълго." - }, - "shortCheck": { - "message": "Следното предложение е по-кратко от опцията за минимална продължителност. Това може да означава, че вече е изпратено и просто е игнорирано поради тази опция. Наистина ли искате да го изпратите?" - }, - "liveOrPremiere": { - "message": "Не е разрешено изпращането по време на активен поток на живо или премиера. Моля, изчакайте, докато приключи, след което опреснете страницата и проверете дали сегментите са все още валидни." - }, - "showUploadButton": { - "message": "Показване на бутона за качване" - }, - "customServerAddress": { - "message": "Адрес на сървъра на SponsorBlock" - }, - "customServerAddressDescription": { - "message": "Адресът, който SponsorBlock използва за осъществяване на заявки към сървъра.\nОсвен ако нямате собствен екземпляр на сървър, това не трябва да се променя." - }, - "save": { - "message": "Запазване" - }, - "reset": { - "message": "Начално състояние" - }, - "customAddressError": { - "message": "Този адрес не е в правилния формат. Уверете се, че имате http:// или https:// в началото и няма последващи наклонени черти." - }, - "areYouSureReset": { - "message": "Наистина ли искате да върнете началното състояние?" - }, - "mobileUpdateInfo": { - "message": "m.youtube.com вече се поддържа" - }, - "exportOptions": { - "message": "Импортиране/експортиране на всички опции" - }, - "exportOptionsCopy": { - "message": "Редактиране/копиране" - }, - "exportOptionsDownload": { - "message": "Записване във файл" - }, - "exportOptionsUpload": { - "message": "Зареждане от файл" - }, - "whatExportOptions": { - "message": "Това е цялата ви конфигурация в JSON. Това включва вашия личен userID, така че се уверете, че споделяте това разумно." - }, - "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": "Копира информацията в клипборда, за да се предостави на разработчика при възникване на грешка или когато разработчикът поиска това. Деликатната информация като вашия user ID, канали в белия списък и потребителски адрес на сървъра са премахнати. Съдържа се обаче информация като вашия потребителски агент, браузър, операционна система и номер на версия на разширението. " - }, - "copyDebugInformationComplete": { - "message": "Информацията за отстраняване на грешки е копирана в клипборда. Чувствайте се свободни да премахнете всяка информация, която предпочитате да не споделяте. Запазете това в текстов файл или го поставете в доклада за грешки." - }, - "keyAlreadyUsed": { - "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!'" - }, - "generic_guideline1": { - "message": "Включване на преходи" - }, - "generic_guideline2": { - "message": "Възпроизвежда се, сякаш нищо не е пропуснато" - }, - "category_sponsor": { - "message": "Спонсорство" - }, - "category_sponsor_description": { - "message": "Платена промоция, платени препоръки и директни реклами. Не за самореклама или безплатни препоръки за каузи/създатели/уебсайтове/продукти, които се харесват на автора." - }, - "category_sponsor_guideline1": { - "message": "Платени промоции" - }, - "category_sponsor_guideline2": { - "message": "Не за дарения или персонализирани стоки" - }, - "category_selfpromo": { - "message": "Неплатена/Самореклама" - }, - "category_selfpromo_description": { - "message": "Подобно на „спонсорство“, но за безплатна реклама или самореклама. Това включва търговия със стоки, дарения или информация с кого каналът има сътрудничество." - }, - "category_selfpromo_guideline1": { - "message": "Дарения, членства и персонализирани стоки" - }, - "category_selfpromo_guideline2": { - "message": "Безплатни възгласи, които не допринасят за видеоклипа" - }, - "category_selfpromo_guideline3": { - "message": "Не за продукти и стоки с корпоративен дизайн" - }, - "category_exclusive_access": { - "message": "Ексклузивен достъп" - }, - "category_exclusive_access_description": { - "message": "Само за обозначаване на цели видеоклипове. Използва се, когато видеоклипът представя продукт, услуга или място, до които е получен безплатен или субсидиран достъп." - }, - "category_exclusive_access_pill": { - "message": "Този видеоклип представя продукт, услуга или място, до което е получен безплатен или субсидиран достъп", - "description": "Short description for this category" - }, - "category_exclusive_access_guideline1": { - "message": "Целият видеоклип показва нещо, до което е получен безплатен или субсидиран достъп" - }, - "category_interaction": { - "message": "Напомняне за действие (абониране)" - }, - "category_interaction_description": { - "message": "Когато има кратко напомняне да харесате, да се абонирате или да последвате канала по средата на съдържанието. Ако е дълго или за нещо специфично, трябва да е под „самореклама“." - }, - "category_interaction_guideline1": { - "message": "Кратки напомняния за харесване, абониране или следване" - }, - "category_interaction_guideline2": { - "message": "Включва непреки напомняния за коментиране" - }, - "category_interaction_guideline3": { - "message": "Не за общо популяризиране, а само за призиви за действие" - }, - "category_interaction_short": { - "message": "Напомняне за взаимодействие" - }, - "category_intro": { - "message": "Антракт/Начална анимация" - }, - "category_intro_description": { - "message": "Интервал без реално съдържание. Може да бъде пауза, статичен кадър, повтаряща се анимация. Това не трябва да се използва за преходи, съдържащи информация." - }, - "category_intro_short": { - "message": "Антракт" - }, - "category_intro_guideline1": { - "message": "Интервал без реално съдържание" - }, - "category_intro_guideline2": { - "message": "Не за преходи с информация" - }, - "category_outro": { - "message": "Крайни картички/Заслуги" - }, - "category_outro_description": { - "message": "Заслуги или когато се показват крайните карти на YouTube. Не за заключения с информация." - }, - "category_outro_guideline1": { - "message": "Без съдържание, дори ако крайните карти са на екрана" - }, - "category_preview": { - "message": "Кратко резюме/Обобщение" - }, - "category_preview_description": { - "message": "Колекция от клипове, които показват какво предстои в този видеоклип или в други видеоклипове от поредицата, където цялата информация се повтаря по-късно във видеоклипа." - }, - "category_preview_guideline1": { - "message": "Клипове, които се появяват по-късно или в бъдещ видеоклип" - }, - "category_preview_guideline2": { - "message": "Резюме на предишен видеоклип" - }, - "category_preview_guideline3": { - "message": "Не за части, които добавят допълнително съдържание" - }, - "category_filler": { - "message": "Пълнеж/Шеги" - }, - "category_filler_description": { - "message": "Съпътстващи сцени, добавени само за пълнеж или хумор, които не са необходими за разбирането на основното съдържание на видеоклипа. Това не трябва да включва сегменти, предоставящи контекст или справочни данни. Това е много агресивна категория, предназначена за случаите, когато не сте в настроение за „забавление“." - }, - "category_filler_short": { - "message": "Пълнеж" - }, - "category_filler_guideline1": { - "message": "Съпътстващи сцени само за пълнеж или хумор" - }, - "category_filler_guideline2": { - "message": "Отвличане на вниманието, гафове, повторения" - }, - "category_filler_guideline3": { - "message": "Не за сцени, необходими за разбиране на темата" - }, - "category_music_offtopic": { - "message": "Музика: Част без музика" - }, - "category_music_offtopic_description": { - "message": "За използване само в музикални видеоклипове. Това трябва да се използва само за части от музикални видеоклипове, които вече не са обхванати от друга категория." - }, - "category_music_offtopic_short": { - "message": "Без музика" - }, - "category_music_offtopic_guideline1": { - "message": "Секции, които не са в официалните издания" - }, - "category_music_offtopic_guideline2": { - "message": "Немузикална част от изпълнение на живо" - }, - "category_poi_highlight": { - "message": "Акцент" - }, - "category_poi_highlight_description": { - "message": "Частта от видеото, която повечето хора търсят. Подобно на коментарите „Видеото започва от х“." - }, - "category_poi_highlight_guideline1": { - "message": "Секция, която повечето хора търсят" - }, - "category_poi_highlight_guideline2": { - "message": "Може да помогне за прескачане на миналия контекст" - }, - "category_poi_highlight_guideline3": { - "message": "Може да прескочи до заглавието или миниатюрата" - }, - "category_chapter": { - "message": "Глава" - }, - "category_chapter_description": { - "message": "Потребителски наименувани глави, описващи основните части на видеоклипа." - }, - "category_chapter_guideline1": { - "message": "Без споменаване имена на марки на спонсори" - }, - "category_chapter_guideline2": { - "message": "Използване на по-големи глави за общи раздели" - }, - "category_chapter_guideline3": { - "message": "По-малките глави могат да бъдат поставени в по-големите" - }, - "category_livestream_messages": { - "message": "Поточно предаване: Четене на съобщения/дарения" - }, - "category_livestream_messages_short": { - "message": "Четене на съобщения" - }, - "autoSkip": { - "message": "Автоматично пропускане" - }, - "manualSkip": { - "message": "Ръчно пропускане" - }, - "showOverlay": { - "message": "Показване в лентата на прогреса" - }, - "disable": { - "message": "Деактивиране" - }, - "autoSkip_POI": { - "message": "Автоматично прескачане до началото" - }, - "manualSkip_POI": { - "message": "Питане, когато видеото се зарежда" - }, - "showOverlay_POI": { - "message": "Показване в лентата на прогреса" - }, - "showOverlay_full": { - "message": "Показване на етикета" - }, - "showOverlay_chapter": { - "message": "Показване на глави" - }, - "autoSkipOnMusicVideos": { - "message": "Автоматично пропускане на всички сегменти, когато има сегмент без музика" - }, - "muteSegments": { - "message": "Разрешаване на сегменти, които заглушават звука, вместо да се пропускат" - }, - "fullVideoSegments": { - "message": "Показване на икона, когато видеоклипът е изцяло реклама", - "description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo" - }, - "previewColor": { - "message": "Цвят на неизпратен сегмент", - "description": "Referring to submissions that have not been sent to the server yet." - }, - "seekBarColor": { - "message": "Цвят на лентата на прогреса" - }, - "category": { - "message": "Категория" - }, - "skipOption": { - "message": "Метод за пропускане", - "description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)" - }, - "enableTestingServer": { - "message": "Активиране на сървъра за бета тестване" - }, - "whatEnableTestingServer": { - "message": "Вашите предложения и гласове НЯМА ДА СЕ БРОЯТ към основния сървър. Използвайте това само за тестване." - }, - "testingServerWarning": { - "message": "Всички предложения и гласове НЯМА ДА СЕ БРОЯТ към основния сървър, докато се свързвате с тестовия сървър. Не забравяйте да деактивирате това, когато искате да правите реални предложения." - }, - "bracketNow": { - "message": "(Сега)" - }, - "moreCategories": { - "message": "Още категории" - }, - "chooseACategory": { - "message": "Изберете категория" - }, - "enableThisCategoryFirst": { - "message": "За да изпратите сегменти с категория „{0}“, трябва да я активирате от опциите. Ще бъдете пренасочени към опциите сега.", - "description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options." - }, - "poiOnlyOneSegment": { - "message": "Внимание: Само един сегмент от този тип може да е активен. Изпращането на няколко ще доведе до показване на случаен." - }, - "youMustSelectACategory": { - "message": "Трябва да изберете категория за всички сегменти, които изпращате!" - }, - "bracketEnd": { - "message": "(Край)" - }, - "End": { - "message": "Край", - "description": "Button that skips to the end of a segment" - }, - "hiddenDueToDownvote": { - "message": "скрито: глас против" - }, - "hiddenDueToDuration": { - "message": "скрито: твърде кратко" - }, - "manuallyHidden": { - "message": "ръчно скрито" - }, - "channelDataNotFound": { - "description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.", - "message": "ID на канала все още не е зареден. Ако използвате вграден видеоклип, опитайте вместо това да използвате началната страница на YouTube. Това може да бъде причинено и от промени в оформлението на YouTube, ако мислите така, направете коментар тук:" - }, - "invidiousPermissionRefresh": { - "message": "Браузърът е отменил разрешението, необходимо за функциониране на Invidious и други сайтове на трети страни. Моля, щракнете върху бутона по-долу, за да активирате отново това разрешение." - }, - "acceptPermission": { - "message": "Даване на разрешение" - }, - "permissionRequestSuccess": { - "message": "Искането за разрешение е успешно!" - }, - "permissionRequestFailed": { - "message": "Искането за разрешение не бе успешно, натиснахте ли Отказ?" - }, - "adblockerIssueWhitelist": { - "message": "Ако не можете да разрешите това, деактивирайте настройката „Принудителна проверка на канала преди пропускане“, тъй като SponsorBlock не може да извлече информацията за канала за този видеоклип" - }, - "forceChannelCheck": { - "message": "Принудителна проверка на канала преди пропускане" - }, - "whatForceChannelCheck": { - "message": "По подразбиране ще пропусне сегменти веднага, преди дори да разбере какъв е каналът. По подразбиране някои сегменти в началото на видеоклипа може да бъдат пропуснати в канали от белия списък. Активирането на тази опция ще предотврати това, но при всички пропускания ще има леко забавяне, тъй като получаването на ID на канала може да отнеме известно време. Това забавяне може да бъде незабележимо, ако имате бърз интернет." - }, - "forceChannelCheckPopup": { - "message": "Помислете за активиране на „Принудителна проверка на канала преди пропускане“" - }, - "downvoteDescription": { - "message": "Грешно/Неправилно време" - }, - "incorrectVote": { - "message": "Неправилно" - }, - "harmfulVote": { - "message": "Вредно", - "description": "Used for chapter segments when the text is harmful/offensive to remove it faster" - }, - "incorrectCategory": { - "message": "Промяна на категорията" - }, - "nonMusicCategoryOnMusic": { - "message": "Това видео е категоризирано като музика. Сигурни ли сте, че това има спонсор? Ако това всъщност е „Немузикален сегмент“, отворете опциите на разширението и активирайте тази категория. След това можете да изпратите този сегмент като „Немузикален“ вместо като спонсор. Моля, прочетете указанията, ако сте объркани." - }, - "multipleSegments": { - "message": "Няколко сегмента" - }, - "guidelines": { - "message": "Насоки" - }, - "readTheGuidelines": { - "message": "Прочетете насоките!!", - "description": "Show the first time they submit or if they are \"high risk\"" - }, - "categoryUpdate1": { - "message": "Категориите са тук!" - }, - "categoryUpdate2": { - "message": "Отворете опциите, за да пропускате въведения, заключения, продажба на стоки и т.н." - }, - "help": { - "message": "Помощ" - }, - "GotIt": { - "message": "Разбрах", - "description": "Used as the button to dismiss a tooltip" - }, - "fullVideoTooltipWarning": { - "message": "Този сегмент е голям. Ако целия видеоклип е на една тема, променете от „Пропускане“ на „Целия видеоклип“. Вижте насоките за повече информация." - }, - "categoryPillTitleText": { - "message": "Целият видеоклип е обозначен с тази категория и е твърде тясно интегриран, за да може да се раздели" - }, - "chapterNameTooltipWarning": { - "message": "Едно от имената на вашите глави е подобно на категория. Вместо това трябва да използвате категории, когато е възможно." - }, - "experiementOptOut": { - "message": "Отказ от всички бъдещи експерименти", - "description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private." - }, - "hideForever": { - "message": "Скриване завинаги" - }, - "warningChatInfo": { - "message": "Забелязахме, че правите някои често срещани грешки, които не са злонамерени" - }, - "warningTitle": { - "message": "Имате предупреждение" - }, - "questionButton": { - "message": "Имам въпрос" - }, - "warningConfirmButton": { - "message": "Разбирам причината" - }, - "warningError": { - "message": "Грешка при опит за потвърждаване на предупреждение:" - }, - "Donate": { - "message": "Дарение" - }, - "considerDonating": { - "message": "Помогнете с финансиране на разработката" - }, - "hideDonationLink": { - "message": "Скриване на връзката за дарение" - }, - "darkModeOptionsPage": { - "message": "Тъмен режим на страницата с опции" - }, - "helpPageThanksForInstalling": { - "message": "Благодарим ви, че инсталирахте SponsorBlock." - }, - "helpPageReviewOptions": { - "message": "Моля, прегледайте опциите по-долу" - }, - "helpPageFeatureDisclaimer": { - "message": "Много функции са деактивирани по подразбиране. Ако искате да пропускате въведения, заключения, да използвате Invidious и т.н., активирайте ги по-долу. Можете също да скриете/покажете елементи от потребителския интерфейс." - }, - "helpPageHowSkippingWorks": { - "message": "Как работи пропускането" - }, - "helpPageHowSkippingWorks1": { - "message": "Видео сегментите автоматично ще бъдат пропуснати, ако бъдат намерени в базата данни. Можете да отворите изскачащия прозорец, като щракнете върху иконата на разширението, за да прегледате какви са сегментите." - }, - "helpPageHowSkippingWorks2": { - "message": "Всеки път, когато пропуснете сегмент, ще получите известие. Ако времето изглежда грешно, гласувайте против, като щракнете на палец надолу! Можете също така да гласувате в изскачащия прозорец." - }, - "Submitting": { - "message": "Изпращане" - }, - "helpPageSubmitting1": { - "message": "Изпращането може да се извърши или в изскачащия прозорец, като натиснете бутона „Сегментът започва сега“, или във видеоплейъра с бутоните на плейъра." - }, - "helpPageSubmitting2": { - "message": "Щракването върху бутона за възпроизвеждане показва началото на сегмента, а щракването върху иконата за спиране показва края. Можете да подготвите множество спонсори, преди да натиснете „изпращане“. Щракването върху бутона за качване ще изпрати данните. Щракването върху кошчето за боклук ще ги изтрие." - }, - "Editing": { - "message": "Редактиране" - }, - "helpPageEditing1": { - "message": "Ако сте объркали, можете да редактирате или изтриете сегментите си, след като щракнете върху бутона със стрелка нагоре." - }, - "helpPageTooSlow": { - "message": "Това е твърде бавно" - }, - "helpPageTooSlow1": { - "message": "Има клавишни комбинации, ако искате да ги използвате. Натиснете клавиша с точка и запетая, за да посочите началото/края на спонсориран сегмент и щракнете върху апострофа, за да го изпратите. Клавишите могат да бъдат променени в опциите. Ако не използвате подредба QWERTY, вероятно трябва да промените зададените клавиши." - }, - "helpPageCopyOfDatabase": { - "message": "Мога ли да получа копие от базата данни? Какво ще стане, ако изчезнете?" - }, - "helpPageCopyOfDatabase1": { - "message": "Базата данни е публична и достъпна на адрес" - }, - "helpPageCopyOfDatabase2": { - "message": "Програмният код е достъпен свободно. Така че, дори нещо да ми се случи, вашият принос не се губи." - }, - "helpPageNews": { - "message": "Новини и как се прави" - }, - "helpPageSourceCode": { - "message": "Къде мога да получа програмния код?" - }, - "Credits": { - "message": "Заслуги" - }, - "LearnMore": { - "message": "Научете повече" - }, - "FullDetails": { - "message": "Пълна информация" - }, - "CopyDownvoteButtonInfo": { - "message": "Гласуване против и създаване на локално копие, за да го изпратите отново" - }, - "OpenCategoryWikiPage": { - "message": "Отваряне на wiki страницата на тази категория." - }, - "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": "Това е вградена клавишна комбинация в YouTube. Наистина ли искате да я използвате?" - }, - "betaServerWarning": { - "message": "Сървърът BETA е активиран!" - }, - "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": "Ако не можете да си позволите да закупите лиценз, щракнете {тук}, за да видите дали отговаряте на условията за отстъпка", - "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": "Функцията за групови глави на SponsorBlock е достъпна само за хора, закупили лиценз, или за хора, на които е предоставен безплатен достъп поради техния минал принос" - }, - "chaptersPage2": { - "message": "Забележка: Разрешението за изпращане на глави все още се основава на изчислена репутация. Закупуването на лиценз ви позволява само да преглеждате глави, изпратени от други", - "description": "On the chapters page for getting access to the paid chapters feature" - }, - "chapterNewFeature": { - "message": "Нова функция: Персонализирани глави с краудсорсинг. Това са секции с персонализирани имена във видеоклипове, които могат да бъдат подредени, за да станат все по-прецизни. Закупете лиценз, за да видите главите, изпратени в това видео, като например: ", - "description": "After the comma, a list of chapters for this video will appear" - }, - "chapterNewFeature2": { - "message": "Нова функция: Персонализирани глави с краудсорсинг. Това са секции с персонализирани имена във видеоклипове, които могат да бъдат подредени, за да станат все по-прецизни. Имате безплатен достъп, активирайте в опциите." - }, - "unsubmittedSegmentCounts": { - "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": "Споделяне като URL" - } -} diff --git a/public/_locales/bn/messages.json b/public/_locales/bn/messages.json deleted file mode 100644 index e01ab7e6..00000000 --- a/public/_locales/bn/messages.json +++ /dev/null @@ -1,953 +0,0 @@ -{ - "fullName": { - "message": "ইউটিউবের জন্য স্পনসরব্লক - স্পনসরশিপ এড়িয়ে যান", - "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" - }, - "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": "আপনি কি পরিষ্কার করতে চান?" - }, - "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": "পপআপ বন্ধ করুন" - }, - "SubmitTimes": { - "message": "সেগমেন্ট জমা দিন" - }, - "sortSegments": { - "message": "সংক্ষিপ্ত অংশ" - }, - "submitCheck": { - "message": "আপনি কি এটি জমা দেওয়ার বিষয়ে নিশ্চিত?" - }, - "whitelistChannel": { - "message": "সাদা তালিকার চ্যানেল" - }, - "removeFromWhitelist": { - "message": "সাদা তালিকা থেকে চ্যানেল সরান" - }, - "voteOnTime": { - "message": "একটি বিভাগে ভোট দিন" - }, - "Submissions": { - "message": "জমা" - }, - "savedPeopleFrom": { - "message": "আপনি মানুষকে রক্ষা করেছেন " - }, - "viewLeaderboard": { - "message": "শীর্ষতালিকা" - }, - "recordTimesDescription": { - "message": "সাবমিট" - }, - "submissionEditHint": { - "message": "আপনি জমা ক্লিক করার পরে বিভাগ সম্পাদনা প্রদর্শিত হবে", - "description": "Appears in the popup to inform them that editing has been moved to the video player." - }, - "popupHint": { - "message": "ইঙ্গিত: আপনি বিকল্পগুলিতে জমা দেওয়ার জন্য কীবাইন্ড সেটআপ করতে পারেন" - }, - "clearTimesButton": { - "message": "সময় মুছুন" - }, - "submitTimesButton": { - "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": "স্কিপ কাউন্ট ট্র্যাকিং সক্ষম করুন" - }, - "whatViewTracking": { - "message": "এই বৈশিষ্ট্যটি ট্র্যাক করে যে আপনি কোন বিভাগগুলি এড়িয়ে গেছেন ব্যবহারকারীদের জানাতে যে তাদের জমা দেওয়া অন্যদের কতটা সাহায্য করেছে এবং স্প্যাম ডাটাবেসে প্রবেশ না করে তা নিশ্চিত করার জন্য আপভোট সহ একটি মেট্রিক হিসাবে ব্যবহার করা হয়েছে৷ আপনি যখনই একটি সেগমেন্ট এড়িয়ে যান তখন এক্সটেনশনটি সার্ভারে একটি বার্তা পাঠায়। আশা করি অধিকাংশ মানুষ এই সেটিং পরিবর্তন করবেন না যাতে ভিউ সংখ্যা সঠিক হয়। :)" - }, - "enableViewTrackingInPrivate": { - "message": "ব্যক্তিগত/ছদ্মবেশী ট্যাবে গণনা ট্র্যাকিং এড়িয়ে যাওয়া সক্ষম করুন৷" - }, - "enableTrackDownvotes": { - "message": "স্টোর সেগমেন্ট ডাউনভোট" - }, - "whatTrackDownvotes": { - "message": "যেকোন ডাউনভোটকৃত অংশ রিফ্রেশ করার পরেও অদৃশ্য থাকবে" - }, - "trackDownvotesWarning": { - "message": "সতর্কীকরণ: এটি বন্ধ করলে পূর্বে সংরক্ষিত সব ডাউনভোট মুছে যাবে" - }, - "enableQueryByHashPrefix": { - "message": "হ্যাশের প্রিফিক্স দিয়ে খুজুন " - }, - "whatQueryByHashPrefix": { - "message": "সার্ভার থেকে videoID দিয়ে অংশ অনুরোধ করার পরিবর্তে videoID এর হ্যাশ এর প্রথম ৪ অক্ষর পাঠানো হয়। এই সার্ভার সমতুল্য হ্যাশ এর সকল ভিডিও এর তথ্য ফেরত পাঠাবে।" - }, - "enableRefetchWhenNotFound": { - "message": "নতুন ভিডিওতে আবার অংশটি যোগার করুন" - }, - "whatRefetchWhenNotFound": { - "message": "যদি ভিডিওটি নতুন হয়, এবং কোন অংশ পাওয়া না যায়, আপনার দেখার সময় কয়েক মিনিট পর পরই এটি তথ্য আনতে থাকবে।" - }, - "enableShowCategoryWithoutPermission": { - "message": "জমার অনুমতি ছাড়াই বিভাগসমূহকে জমা মেনুতে দেখান" - }, - "whatShowCategoryWithoutPermission": { - "message": "নূন্যতম খ্যাতি প্রয়োজনীয়তার কারণে কিছু বিভাগ জমা দিতে অনুমতি প্রয়োজন" - }, - "showNotice": { - "message": "নোটিশ পুনরায় প্রদর্শন করুন" - }, - "showSkipNotice": { - "message": "একটি অংশ এড়ানোর পরে নোটিস প্রদর্শন করুন" - }, - "showCategoryGuidelines": { - "message": "বিভাগের সাহায্য দেখান" - }, - "noticeVisibilityMode0": { - "message": "পূর্ণ আকারের স্কিপ নোটিস" - }, - "noticeVisibilityMode1": { - "message": "স্বয়ংক্রিয় স্কিপের জন্য ক্ষুদ্র আকারের স্কিপ নোটিস" - }, - "noticeVisibilityMode2": { - "message": "সব ক্ষুদ্র আকারের স্কিপ নোটিস" - }, - "noticeVisibilityMode3": { - "message": "স্বয়ংক্রিয় স্কিপের জন্য অনুজ্বল স্কিপ নোটিস" - }, - "noticeVisibilityMode4": { - "message": "সব অনুজ্বল স্কিপ নোটিস" - }, - "longDescription": { - "message": "SponsorBlock আপনাকে YouTube ভিডিওসমূহের স্পন্সর বার্তা, সূচনাবার্তা, সমাপ্তিবার্তা, সাবস্ক্রাইব করার জন্য স্মরণ করানো, এবং অন্যান্য বিবিধ বিরক্তিকর অংশ এড়িয়ে যেতে সাহায্য করে। SponsorBlock জনসংগৃহীত তথ্যসম্বলিত একটি ব্রাউজার এক্সটেনশন যা যে কাউকে একটি ভিডিওর স্পন্সর বার্তা এবং অন্যান্য অংশের শুরু এবং শেষ সময় সাবমিট করতে দেয়। যখন কেউ একজন এই তথ্য সাবমিট করে, এই এক্সটেনশন ব্যবহারকারী সবাই ঐ স্পন্সর বার্তা সম্বলিত অংশ এড়িয়ে যাবে। মিউজিক ভিডিও এর মিউজিক বহির্ভুত অংশও আপনি এড়িয়ে যেতে পারেন।", - "description": "Full description of the extension on the store pages." - }, - "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" - }, - "nextChapterKeybind": { - "message": "পরবর্তী অধ্যায়", - "description": "Keybind label" - }, - "previousChapterKeybind": { - "message": "পূর্ববর্তী অধ্যায়", - "description": "Keybind label" - }, - "keybindDescription": { - "message": "এটি টাইপ করে একটি কী নির্বাচন করুন এবং আপনি যে কোনও সংশোধক কীগুলি ব্যবহার করতে চান তা চয়ন করুন।" - }, - "0": { - "message": "সংযোগের সময়সীমা অতিক্রান্ত। আপনার ইন্টারনেট সংযোগ যাচাই করুন. যদি আপনার ইন্টারনেট কাজ করে থাকে তবে সার্ভারটি সম্ভবত ওভারলোডেড বা ডাউন।" - }, - "disableSkipping": { - "message": "স্কিপিং চালু করা হয়েছে" - }, - "enableSkipping": { - "message": "স্কিপিং বন্ধ করা হয়েছে" - }, - "yourWork": { - "message": "আপনার কাজ", - "description": "Used to describe the section that will show you the statistics from your submissions." - }, - "502": { - "message": "সার্ভারটি সম্ভবত ওভারলোডেড। কয়েক সেকেন্ডের মধ্যে আবার চেষ্টা করুন।" - }, - "errorCode": { - "message": "ইরোর কোডঃ " - }, - "skip": { - "message": "এড়িয়ে যান" - }, - "mute": { - "message": "নিঃশব্দ করুন" - }, - "full": { - "message": "সমপূর্ণ ভিডিও", - "description": "Used for the name of the option to label an entire video as sponsor or self promotion." - }, - "skip_category": { - "message": "{0} এড়িয়ে যান?" - }, - "mute_category": { - "message": "{0} নিঃশব্দ করুন?" - }, - "skip_to_category": { - "message": "{0} তে চলে যান?", - "description": "Used for skipping to things (Skip to Highlight)" - }, - "skipped": { - "message": "{0} এড়িয়ে যাওয়া হয়েছে", - "description": "Example: Sponsor Skipped" - }, - "muted": { - "message": "{0} নিঃশব্দ করা হয়েছে", - "description": "Example: Sponsor Muted" - }, - "skipped_to_category": { - "message": "{0} তে চলে যাওয়া হয়েছে", - "description": "Used for skipping to things (Skipped to Highlight)" - }, - "disableAutoSkip": { - "message": "স্বয়ংক্রিয়ভাবে স্কিপ করা বন্ধ করুন" - }, - "enableAutoSkip": { - "message": "স্বয়ংক্রিয়ভাবে স্কিপ করা চালু করুন" - }, - "audioNotification": { - "message": "স্কিপের জন্য অডিও নোটিস" - }, - "audioNotificationDescription": { - "message": "যখনই কোনও অংশ এড়িয়ে যাওয়া হয় তখন একটি শব্দ বাজাবে। যদি বন্ধ করা হয় (বা অটো স্কিপ বন্ধ থাকে) তবে কোনও শব্দ বাজানো হবে না।" - }, - "showTimeWithSkips": { - "message": "স্কিপগুলি সরানো সহ সময় দেখান" - }, - "showTimeWithSkipsDescription": { - "message": "এই সময়টি সময় বারের নীচে বর্তমান সময়ের পাশের বন্ধনীগুলিতে উপস্থিত হয়। এটি মোট ভিডিও সময়কাল যে কোনও বিভাগকে বিয়োগ করে তা দেখায়। এর মধ্যে কেবল \"সময় বার এ দেখান\" হিসাবে চিহ্নিত বিভাগগুলি অন্তর্ভুক্ত রয়েছে।" - }, - "youHaveSkipped": { - "message": "আপনি এড়িয়েছেন " - }, - "minLower": { - "message": "মিনিট" - }, - "minsLower": { - "message": "মিনিট" - }, - "hourLower": { - "message": "ঘন্টা" - }, - "hoursLower": { - "message": "ঘন্টা" - }, - "youHaveSavedTime": { - "message": "আপনি মানুষকে রক্ষা করেছেন", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "youHaveSavedTimeEnd": { - "message": "তাদের জীবন থেকে", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "statusReminder": { - "message": "সার্ভারের স্ট্যাটাস এর জন্য status.sponsor.ajay.app দেখুন করুন।" - }, - "whatChangeUserID": { - "message": "এটি ব্যক্তিগত রাখা উচিত। এটি একটি পাসওয়ার্ডের মতো এবং কারও সাথে ভাগ করা উচিত নয়। কারও যদি এটি থাকে তবে তারা আপনার ছদ্মবেশ ধারণ করতে পারে। আপনি যদি আপনার পাবলিক ইউজারআইডি খুঁজছেন তবে পপআপে ক্লিপবোর্ড আইকনটি ক্লিক করুন।" - }, - "createdBy": { - "message": "সৃষ্টি করেছেন" - }, - "supportOtherSites": { - "message": "এটি ৩য় পক্ষের ইউটইউব সাইট সাপোর্ট করে" - }, - "supportOtherSitesDescription": { - "message": "তৃতীয় পক্ষের ইউটিউব ক্লায়েন্টদের সমর্থন করুন। সমর্থন সক্ষম করতে, আপনাকে অবশ্যই অতিরিক্ত অনুমতিগুলি গ্রহণ করতে হবে। এটি ক্রোম এবং অন্যান্য ক্রোমিয়াম ভেরিয়েন্টগুলিতে ছদ্মবেশে কাজ করে না।", - "description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube" - }, - "supportedSites": { - "message": "সমর্থিত সাইটসমুহ:" - }, - "optionsInfo": { - "message": "Indivious সমর্থন সক্ষম করুন, অটোস্কিপ বন্ধ করুন, বোতামগুলি লুকান এবং আরও অনেক কিছু করুন।" - }, - "addInvidiousInstance": { - "message": "তৃতীয় পক্ষের ক্লায়েন্ট যুক্ত করুন" - }, - "addInvidiousInstanceDescription": { - "message": "একটি কাস্টম উদাহরণ যুক্ত করুন। এটি অবশ্যই ডোমেন দিয়ে ফর্ম্যাট করা উচিত। উদাহরণ: invidious.ajay.app" - }, - "add": { - "message": "যোগ করুন" - }, - "addInvidiousInstanceError": { - "message": "এটি একটি অবৈধ ডোমেন। এটিতে কেবল ডোমেন অংশ অন্তর্ভুক্ত করা উচিত। উদাহরণ: invidious.ajay.app" - }, - "resetInvidiousInstance": { - "message": "Invidious Instance এর তালিকা পুনরায় সেট করুন" - }, - "resetInvidiousInstanceAlert": { - "message": "আপনি এখন Invidious Instance এর তালিকা পুনরায় আগের মত করে দিবেন" - }, - "currentInstances": { - "message": "বর্তমান Instance এর তালিকা" - }, - "minDuration": { - "message": "সর্বনিম্ন দৈর্ঘ্য (সেকেন্ড):" - }, - "minDurationDescription": { - "message": "সেট করা মান (সেকেন্ডে) থেকে ছোট সেগমেন্টগুলি প্লেয়ারে এড়িয়ে যাওয়া হবে বা দেখানো হবে না" - }, - "enableManualSkipOnFullVideo": { - "message": "সম্পূর্ণ ভিডিওর লেবেল যুক্ত থাকলে ম্যানুয়াল স্কিপ দেখান" - }, - "skipNoticeDuration": { - "message": "নোটিশ প্রদর্শন করার দৈর্ঘ্য (সেকেন্ড):" - }, - "skipNoticeDurationDescription": { - "message": "স্কিপ নোটিশটি কমপক্ষে এত সেকেন্ডের জন্য স্ক্রিনে থাকবে। নিজে এড়িয়ে যাওয়ার জন্য, এটি দীর্ঘকাল ধরে দৃশ্যমান হতে পারে।" - }, - "shortCheck": { - "message": "নিম্নলিখিত সাবমিশনটি আপনার ন্যূনতম সময়কাল অপশনের চেয়ে কম। এর মানে এই হতে পারে যে এটি ইতিমধ্যে জমা দেওয়া হয়েছে, এবং এই অপশনের কারণে উপেক্ষা করা হচ্ছে। আপনি কি জমা দিতে চান?" - }, - "liveOrPremiere": { - "message": "একটি সক্রিয় লাইভস্ট্রিম বা প্রিমিয়ারে জমা দেওয়ার অনুমতি নেই। এটি শেষ না হওয়া পর্যন্ত অপেক্ষা করুন, তারপরে পৃষ্ঠাটি রিফ্রেশ করুন এবং অংশগুলি এখনও বৈধ কিনা তা যাচাই করুন।" - }, - "showUploadButton": { - "message": "আপলোড করার বোতামটি দেখান" - }, - "customServerAddress": { - "message": "স্পনসরব্লক সার্ভার ঠিকানা" - }, - "customServerAddressDescription": { - "message": "এ ঠিকানা SponsorBlock সার্ভারে সাথে যোগাযোগ করতে ব্যবহার করে।\nআপনার নিজের সার্ভার না থাকলে এটি পরিবর্তন করবেন না।" - }, - "save": { - "message": "সংরক্ষণ করুন" - }, - "reset": { - "message": "পুনরায় সেট করুন" - }, - "customAddressError": { - "message": "এই ঠিকানাটি সঠিক আকারে নেই। এটিতে http: // বা https: // শুরুতে এবং কোনও পিছনের স্ল্যাশ নেই তা নিশ্চিত করুন।" - }, - "areYouSureReset": { - "message": "আপনি কি নিশ্চিতভাবে এটি মুছে ফেলতে চান??" - }, - "mobileUpdateInfo": { - "message": "m.youtube.com এখন সাপর্টেড" - }, - "exportOptions": { - "message": "সব অপশন ইম্পোর্ট/এক্সপোর্ট করুন" - }, - "exportOptionsCopy": { - "message": "সম্পাদন/কপি করুন" - }, - "exportOptionsDownload": { - "message": "ফাইল এ সেভ করুন" - }, - "exportOptionsUpload": { - "message": "ফাইল থেকে লোড করুন" - }, - "setOptions": { - "message": "অপশন সেট করুন" - }, - "exportOptionsWarning": { - "message": "সতর্কতা: অপশনগুলি পরিবর্তন করা চিরস্থায়ী এবং আপনার ইনস্টলটি ভাঙতে পারে। আপনি কি নিশ্চিত যে আপনি এটি করতে চান? আপনার পুরানোটিকে সাবধানতার সার্থে ব্যাকআপ করার বিষয়টি নিশ্চিত করুন।" - }, - "incorrectlyFormattedOptions": { - "message": "এই JSON সঠিকভাবে ফর্ম্যাট করা হয় নাই। আপনার অপশনগুলি পরিবর্তন করা হয়নি।" - }, - "confirmNoticeTitle": { - "message": "অংশ জমা দিন" - }, - "submit": { - "message": "জমা দিন" - }, - "cancel": { - "message": "বাতিল করুন" - }, - "delete": { - "message": "মুছে ফেলুন" - }, - "preview": { - "message": "প্রিভিউ দেখুন" - }, - "unsubmitted": { - "message": "জমাকৃত নয়" - }, - "inspect": { - "message": "পরিদর্শন করুন" - }, - "edit": { - "message": "সম্পাদন করুন" - }, - "copyDebugInformation": { - "message": "ডিবাগ তথ্য ক্লিপবোর্ডে কপি করুন" - }, - "copyDebugInformationFailed": { - "message": "ক্লিপবোর্ডে কপি করা যায় নি" - }, - "copyDebugInformationOptions": { - "message": " কোনও বাগ উত্থাপন করার সময় / যখন কোনও ডেভেলপার এটির জন্য অনুরোধ করে তখন ক্লিপবোর্ডে তথ্য কপি করে। সংবেদনশীল তথ্য যেমন আপনার ইউজার আইডি, সাদা তালিকাভুক্ত চ্যানেল এবং কাস্টম সার্ভারের ঠিকানা সরানো হয়েছে। তবে এটিতে আপনার ব্যবহারকারীর, ব্রাউজার, অপারেটিং সিস্টেম এবং এক্সটেনশন সংস্করণ নম্বরের মতো তথ্য রয়েছে।" - }, - "copyDebugInformationComplete": { - "message": "ডিবাগের তথ্য ক্লিপ বোর্ডে কপি করা হয়েছে। আপনি কোনও তথ্য দিতে অনিচ্ছুক হলে তা নির্দ্বিধায় অপসারণ করতে পারেন। এটি একটি টেক্সট ফাইলে সংরক্ষণ করুন বা বাগ প্রতিবেদনে পেস্ট করুন।" - }, - "keyAlreadyUsed": { - "message": "এই শর্টকাটটি অন্য ক্রিয়ায় আবদ্ধ। দয়া করে একটি আলাদা নির্বাচন করুন।" - }, - "to": { - "message": "থেকে", - "description": "Used between segments. Example: 1:20 to 1:30" - }, - "category_sponsor": { - "message": "স্পন্সর" - }, - "category_sponsor_description": { - "message": "পেইড প্রমোশন, পেইড রেফারেল এবং সরাসরি বিজ্ঞাপন। নিজের পছন্দসই কারণ/স্রষ্টা/ওয়েবসাইট/পণ্যগুলিতে স্ব-প্রচার বা বিনামূল্যে প্রচারের জন্য নয়।" - }, - "category_selfpromo": { - "message": "বিনা অর্থপ্রাপ্ত/স্ব-প্রচার" - }, - "category_selfpromo_description": { - "message": "অবৈতনিক বা স্ব -প্রচার ব্যতীত \"স্পনসর\" এর মতো। এর মধ্যে পণ্যদ্রব্য, অনুদান বা তারা কার সাথে সহযোগিতা করেছে সে সম্পর্কে তথ্য অন্তর্ভুক্ত রয়েছে।" - }, - "category_exclusive_access": { - "message": "এক্সক্লুসিভ অ্যাক্সেস" - }, - "category_exclusive_access_description": { - "message": "শুধুমাত্র পুরো ভিডিও লেবেল করার জন্য। যখন কোনও ভিডিও কোনও পণ্য, পরিষেবা বা অবস্থান প্রদর্শন করে যা তারা নিখরচায় বা ভর্তুকিযুক্ত অ্যাক্সেস পেয়েছে।" - }, - "category_exclusive_access_pill": { - "message": "এই ভিডিওটি এমন একটি পণ্য, পরিষেবা বা অবস্থান প্রদর্শন করে যা তারা নিখরচায় বা ভর্তুকিযুক্ত অ্যাক্সেস পেয়েছে", - "description": "Short description for this category" - }, - "category_interaction": { - "message": "ইন্টারঅ্যাকশন রেমাইন্ডার (সাবস্ক্রাইব)" - }, - "category_interaction_description": { - "message": "যখন সামগ্রীর মাঝখানে তাদেরকে লাইক, সাবস্ক্রাইব বা ফলো করার জন্য একটি সংক্ষিপ্ত অনুস্মারক থাকে। যদি এটি দীর্ঘ বা নির্দিষ্ট কিছু সম্পর্কে হয় তবে পরিবর্তে এটি স্ব -প্রচারের অধীনে থাকা উচিত।" - }, - "category_interaction_short": { - "message": "ইন্টারঅ্যাকশন রেমাইন্ডার" - }, - "category_intro": { - "message": "ইন্টারমিশন/ইন্ট্র অ্যানিমেশন" - }, - "category_intro_description": { - "message": "প্রকৃত বিষয়বস্তু ছাড়াই একটি বিরতি। বিরতি, স্থির ফ্রেম, অ্যানিমেশন পুনরাবৃত্তি হতে পারে। এটি তথ্যযুক্ত ট্রানজিশনের জন্য ব্যবহার করা উচিত নয়।" - }, - "category_intro_short": { - "message": "ইন্টারমিশন" - }, - "category_outro": { - "message": "এন্ডকার্ডস/ক্রেডিট" - }, - "category_outro_description": { - "message": "ক্রেডিট বা যখন ইউটিউব এন্ডকার্ডগুলি উপস্থিত হয়। তথ্য সহ সিদ্ধান্তের জন্য নয়।" - }, - "category_preview": { - "message": "প্রিভিউ/রিক্যাপ" - }, - "category_filler": { - "message": "ফিলার ট্যানজেন্ট/জোকস" - }, - "category_filler_short": { - "message": "ফিলার" - }, - "category_music_offtopic": { - "message": "সঙ্গীত: অসঙ্গীত বিভাগ" - }, - "category_music_offtopic_description": { - "message": "শুধুমাত্র সঙ্গীত ভিডিওতে ব্যবহারের জন্য। এটি কেবলমাত্র সংগীত ভিডিওর সেসব বিভাগের জন্য ব্যবহার করা উচিত যা ইতিমধ্যে অন্য কোনও বিভাগ দ্বারা আচ্ছাদিত নয়।" - }, - "category_music_offtopic_short": { - "message": "মিউসিক নয়" - }, - "category_poi_highlight": { - "message": "গুরুত্বপূর্ণ" - }, - "category_poi_highlight_description": { - "message": "ভিডিওর অংশটি যা বেশিরভাগ লোকেরা খুঁজছেন। \"ভিডিওটি x এ শুরু হয়\" মন্তব্যের মতো।" - }, - "category_livestream_messages": { - "message": "লাইভস্ট্রিম: অনুদান/বার্তা পাঠ" - }, - "category_livestream_messages_short": { - "message": "বার্তা পাঠ" - }, - "autoSkip": { - "message": "স্বয়ংক্রিয়ভাবে এড়িয়ে যান" - }, - "manualSkip": { - "message": "নিজে এড়িয়ে যান" - }, - "showOverlay": { - "message": "সময় বার এ দেখান" - }, - "disable": { - "message": "নিষ্ক্রিয় করুন" - }, - "autoSkip_POI": { - "message": "স্বয়ংক্রিয় ভাবে শুরুতে স্কিপ করুন" - }, - "manualSkip_POI": { - "message": "ভিডিও লোড হলে জিজ্ঞেস করুন" - }, - "showOverlay_POI": { - "message": "সময় বার এ দেখান" - }, - "showOverlay_full": { - "message": "লেবেল দেখান" - }, - "autoSkipOnMusicVideos": { - "message": "যখন অ-সংগীত বিভাগ থাকে তখন স্বয়ংক্রিয়ভাবে সমস্ত বিভাগগুলি এড়িয়ে যান" - }, - "muteSegments": { - "message": "স্কিপের পরিবর্তে অডিও নিঃশব্দ এমন বিভাগগুলিকে দেখানোর অনুমতি দিন" - }, - "fullVideoSegments": { - "message": "যখন কোনও ভিডিও সম্পূর্ণ বিজ্ঞাপন হয় তখন একটি আইকন দেখান", - "description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo" - }, - "previewColor": { - "message": "জমাকৃত নয় এমন অংশের রঙ", - "description": "Referring to submissions that have not been sent to the server yet." - }, - "seekBarColor": { - "message": "সময় বারের রঙ" - }, - "category": { - "message": "বিভাগ" - }, - "skipOption": { - "message": "সেগমেন্ট এড়িয়ে যাওয়ার অপশন", - "description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)" - }, - "enableTestingServer": { - "message": "বিটা টেস্টিং প্রোগ্রামে যোগদান করুন" - }, - "whatEnableTestingServer": { - "message": "আপনার জমাকৃত অংশ এবং ভোটগুলি মূল সার্ভারের হিসাবে গণনা করা হবে না। কেবল পরীক্ষার জন্য এটি ব্যবহার করুন।" - }, - "testingServerWarning": { - "message": "সমস্ত জমাকৃত অংশ এবং ভোট টেস্ট সার্ভারের সাথে সংযোগ করার সময় মূল সার্ভারের হিসাবে গণনা করা হবেনা। আপনি যখন সত্যিকারের অংশ ও ভোট জমা দিতে চান তখন এটি বন্ধ করার বিষয়টি নিশ্চিত করুন।" - }, - "bracketNow": { - "message": "(এখন)" - }, - "moreCategories": { - "message": "আরো বিভাগ" - }, - "chooseACategory": { - "message": "বিভাগ নির্বাচন করুন" - }, - "enableThisCategoryFirst": { - "message": "\"{0}\" বিভাগের অন্তর্ভুক্ত অংশ জমা দিতে, আপনাকে এটি অপশন এ গিয়ে চালু করতে হবে। আপনাকে এখন অপশন এ পাঠানো হবে।", - "description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options." - }, - "poiOnlyOneSegment": { - "message": "সতর্কতা: এই ধরণের বিভাগে একসময়ে সর্বাধিক একবার সক্রিয় থাকতে পারে। একাধিক জমা দেওয়া হলে যেকোন একটি এলোমেলোভাবে বেছে সেটি দেখানো হবে।" - }, - "youMustSelectACategory": { - "message": "আপনাকে প্রত্যেকটি অংশের জন্য কমপক্ষে একটি করে ক্যাটাগরি সিলেক্ট করতে হবে!" - }, - "bracketEnd": { - "message": "(শেষ)" - }, - "hiddenDueToDownvote": { - "message": "লুক্কায়িতঃ ডাউনভোট" - }, - "hiddenDueToDuration": { - "message": "লুক্কায়িতঃ খুব ছোট" - }, - "manuallyHidden": { - "message": "নিজে লুক্কায়িত" - }, - "channelDataNotFound": { - "description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.", - "message": "চ্যানেল আইডি এখনও লোড হয় না। আপনি যদি এম্বেডে থাকা ভিডিও দেখছেন তবে পরিবর্তে ইউটিউব হোমপেজটি ব্যবহার করার চেষ্টা করুন। এটি ইউটিউব লেআউটে পরিবর্তনের কারণেও হতে পারে, আপনার যদি মনেহয় এটি লেআউটে পরিবর্তনের কারণে হয়েছে তাহলে এখানে একটি মন্তব্য করুনঃ " - }, - "acceptPermission": { - "message": "অনুমতি একসেপ্ট করুন" - }, - "permissionRequestSuccess": { - "message": "অনুমতির অনুরোধ সফল হয়েছে!" - }, - "permissionRequestFailed": { - "message": "অনুমতির অনুরোধ ব্যর্থ হয়েছে, আপনি কি ডেনাই ক্লিক করেছেন?" - }, - "adblockerIssueWhitelist": { - "message": "আপনি যদি এটি সমাধান করতে অক্ষম হন তবে সেটিংস এ গিয়ে 'এড়িয়ে যাওয়ার আগে চ্যানেল চেক করুন' বন্ধ করুন, কারণ স্পনসরব্লক এই ভিডিওটির জন্য চ্যানেলের তথ্য পুনরুদ্ধার করতে অক্ষম" - }, - "forceChannelCheck": { - "message": "এড়িয়ে যাওয়ার আগে চ্যানেল চেক করুন" - }, - "whatForceChannelCheck": { - "message": "সাধারণত, এটি চ্যানেলটি কী তা জানার আগেই এটি এখনই বিভাগগুলি এড়িয়ে যাবে। সাধারণত, ভিডিওর শুরুতে কিছু বিভাগগুলি সাদা তালিকাভুক্ত চ্যানেলগুলিতে এড়িয়ে যেতে পারে। এই বিকল্পটি সক্ষম করা এটিকে প্রতিরোধ করবে তবে চ্যানেলআইডি পেতে কিছুটা সময় নিতে পারে বলে সমস্ত এড়িয়ে যাওয়া কিছুটা বিলম্বিত করে। আপনার যদি দ্রুত ইন্টারনেট থাকে তবে এই বিলম্বটি অদৃশ্য হতে পারে।" - }, - "forceChannelCheckPopup": { - "message": "\"এড়িয়ে যাওয়ার আগে চ্যানেল চেক করুন\" সেটিংস টি চালু করার বিষয়টি বিবেচনা করুন" - }, - "downvoteDescription": { - "message": "সময় ভুল দেওয়া হয়েছে" - }, - "incorrectCategory": { - "message": "বিভাগ পরিবর্তন করুন" - }, - "nonMusicCategoryOnMusic": { - "message": "এই ভিডিওটি সংগীত হিসাবে শ্রেণীবদ্ধ করা হয়েছে। আপনি কি নিশ্চিত যে এটি একটি স্পনসর আছে? যদি এটি আসলে একটি \"অ-সংগীত বিভাগ\" হয় তবে এক্সটেনশন এর অপশন এ যান এবং এই বিভাগটি চালু করুন। তারপরে, আপনি এই বিভাগটিকে স্পনসর পরিবর্তে \"অ-সংগীত\" হিসাবে জমা দিতে পারেন। আপনি বিভ্রান্ত হলে দয়া করে নিয়মকানুনপড়ুন।" - }, - "multipleSegments": { - "message": "অনেকগুলো অংশ" - }, - "guidelines": { - "message": "নিয়মকানুন" - }, - "readTheGuidelines": { - "message": "নিয়মকানুন পড়ুন!!", - "description": "Show the first time they submit or if they are \"high risk\"" - }, - "categoryUpdate1": { - "message": "বিভাগ ফিচার এসেছে!" - }, - "categoryUpdate2": { - "message": "ইন্ট্রোস, আউট্রোস, মার্চ ইত্যাদি এড়িয়ে যাওয়ার জন্য অপশন খুলুন।" - }, - "help": { - "message": "সাহায্য" - }, - "GotIt": { - "message": "বুঝেছি", - "description": "Used as the button to dismiss a tooltip" - }, - "fullVideoTooltipWarning": { - "message": "এই বিভাগটি বিশাল। যদি পুরো ভিডিওটি একটি বিষয় নিয়ে হয় তবে \"Skip\" থেকে \"Full Video\" এ পরিবর্তন করুন। আরও তথ্যের জন্য নিয়মকানুন দেখুন।" - }, - "categoryPillTitleText": { - "message": "এই পুরো ভিডিওটি এই বিভাগ হিসাবে লেবেলযুক্ত এবং পৃথক করা সম্ভব না কারন এটি খুব ঘন ঘন সংযুক্ত করা হয়েছে" - }, - "experiementOptOut": { - "message": "ভবিষ্যতের সমস্ত পরীক্ষা-নিরীক্ষা পাওয়া থেকে বিরত থাকুন", - "description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private." - }, - "hideForever": { - "message": "চিরকালের জন্য এই বিষয়বস্তু লুকান" - }, - "Donate": { - "message": "অনুদান" - }, - "considerDonating": { - "message": "অনুদানের মাধ্যমে ভবিষ্যতেে এর উন্নয়নের কাজে সাহায্য হবে" - }, - "hideDonationLink": { - "message": "অনুদানের লিঙ্ক লুকান" - }, - "darkModeOptionsPage": { - "message": "অপশন পেজে ডার্ক মোড " - }, - "helpPageThanksForInstalling": { - "message": "স্পনসরব্লক ইনস্টল করার জন্য আপনাকে ধন্যবাদ." - }, - "helpPageReviewOptions": { - "message": "নীচের অপশনগুলি পর্যালোচনা করুন" - }, - "helpPageFeatureDisclaimer": { - "message": "অনেকগুলি বৈশিষ্ট্য সাধারণত অক্ষম থাকে। আপনি যদি ইন্ট্রোস, আউট্রোস এড়িয়ে যেতে চান, Invidious ইত্যাদি ব্যবহার করতে চান তবে সেগুলি নীচে সক্ষম করুন। আপনি UI উপাদানগুলিও লুকাতে/দেখাতে পারেন।" - }, - "helpPageHowSkippingWorks": { - "message": "এটি কীভাবে কাজ করে" - }, - "helpPageHowSkippingWorks1": { - "message": "ভিডিও এর অংশ ডাটাবেসে পাওয়া গেলে সেগুলি স্বয়ংক্রিয়ভাবে এড়িয়ে যাবে। তারা কীরকম তা পূর্বরূপ দেখতেআপনি এক্সটেনশন আইকনে ক্লিক করে পপআপটি খুলতে পারেন।" - }, - "helpPageHowSkippingWorks2": { - "message": "আপনি যখনই কোনও বিভাগ এড়িয়ে যান, আপনি একটা নোটিস পাবেন। সময়টি যদি ভুল বলে মনে হয় তবে ডাউনভোটে ক্লিক করে ভোট দিন! আপনি পপআপ থেকেও ভোট দিতে পারেন।" - }, - "Submitting": { - "message": "নতুন অংশ জমা দেওয়া" - }, - "helpPageSubmitting1": { - "message": "জমা দেওয়া যায় পপআপে \"অংশ এখন শুরু হয়\" বোতামটি টিপ মেরে বা প্লেয়ারের বোতামগুলি সহ ভিডিও প্লেয়ারে টিপ মেরে করে।" - }, - "helpPageSubmitting2": { - "message": "প্লে বোতামটি ক্লিক করা একটি বিভাগের শুরু নির্দেশ করে এবং স্টপ আইকনটি ক্লিক করা শেষটি নির্দেশ করে। আপনি জমা দেওয়ার আগে একাধিক স্পনসর প্রস্তুত করতে পারেন। আপলোড বোতামটি ক্লিক করা জমা দেওয়া হবে। আবর্জনায় ক্লিক করে বাদ দিতে পারেন এটি।" - }, - "Editing": { - "message": "সম্পাদন করা" - }, - "helpPageEditing1": { - "message": "যদি আপনি ভুল করে বসেন তবে আপনি উপড়ের তীর বোতামটি ক্লিক করার পরে আপনার বিভাগগুলি সম্পাদনা বা মুছতে পারেন।" - }, - "helpPageTooSlow": { - "message": "গতি অত্যন্ত ধীর।" - }, - "helpPageTooSlow1": { - "message": "আপনি যদি ব্যবহার করতে চান তাইলে হটকি রয়েছে। স্পনসর বিভাগের শুরু/শেষ নির্দেশ করতে সেমিকোলন কী টিপুন এবং জমা দেওয়ার জন্য অ্যাপোস্ট্রোফে ক্লিক করুন। এগুলি পরিবর্তন করা যেতে পারে। আপনি যদি QWERTY ব্যবহার না করেন তবে আপনার সম্ভবত কীবাইন্ডিং পরিবর্তন করা উচিত।" - }, - "helpPageCopyOfDatabase": { - "message": "আমি কি ডাটাবেসের একটি অনুলিপি পেতে পারি? আপনি হারিয়ে গেলে হলে কি হবে?" - }, - "helpPageCopyOfDatabase1": { - "message": "ডাটাবেসটি সবার জন্য প্রকাশিত এবং পাওয়া যাবে এখানেঃ " - }, - "helpPageCopyOfDatabase2": { - "message": "এটির সোর্স কোড অবাধে উপলব্ধ। সুতরাং, যদি আমার কিছু ঘটেও যায় তবে আপনার জমাকৃত অংশগুলি হারিয়ে যাবে না।" - }, - "helpPageNews": { - "message": "খবর এবং এটি কীভাবে তৈরি হয়" - }, - "helpPageSourceCode": { - "message": "আমি সোর্স কোডটি কোথায় পেতে পারি?" - }, - "Credits": { - "message": "কৃতিত্ব" - }, - "LearnMore": { - "message": "আরও জানুন" - }, - "CopyDownvoteButtonInfo": { - "message": "ডাউনভোট করে আপনার জন্য পুনরায় জমা দেওয়ার জন্য একটি স্থানীয় অনুলিপি তৈরি করে" - }, - "OpenCategoryWikiPage": { - "message": "এই বিভাগের উইকি পাতা খুলুন." - }, - "CopyAndDownvote": { - "message": "কপি এবং ডাউনভোট" - }, - "ContinueVoting": { - "message": "ভোট করা চালিয়ে যান" - }, - "ChangeCategoryTooltip": { - "message": "এটি তাৎক্ষনিকভাবে আপনার অংশে দেওয়া হবে" - }, - "downvote": { - "message": "ডাউনভোট" - }, - "upvote": { - "message": "আপভোট" - }, - "hideSegment": { - "message": "অংশ আড়াল করুন" - }, - "SponsorTimeEditScrollNewFeature": { - "message": "দ্রুত সময়টি পরিবর্কতন করতে সম্পাদনা বাক্সে ঘুরে দেখার সময় আপনার মাউস এর হুইয়িলটি ব্যবহার করুন। কন্ট্রল বা শিফট কী এর সংমিশ্রণগুলি পরিবর্তনগুলি আরো নিখুতভাবে টিউন করতে ব্যবহার করা যেতে পারে।" - }, - "categoryPillNewFeature": { - "message": "নতুন! দেখুন যখন কোনও ভিডিও সম্পূর্ণ স্পনসর করা বা স্ব-প্রচার হয়" - }, - "dayAbbreviation": { - "message": " দিন", - "description": "100d" - }, - "hourAbbreviation": { - "message": " ঘণ্টা", - "description": "100h" - }, - "optionsTabBehavior": { - "message": "আচরণ", - "description": "Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabInterface": { - "message": "ইন্টারফেস", - "description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabKeyBinds": { - "message": "কীবোর্ড শর্টকাট", - "description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabBackup": { - "message": "ব্যাকআপ এবং পুনঃস্থাপন", - "description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabAdvanced": { - "message": "বিবিধ", - "description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "noticeVisibilityLabel": { - "message": "নোটিশ প্রদর্শন করা বন্ধ করুন", - "description": "Option label" - }, - "unbind": { - "message": "বাদ দিন", - "description": "Unbind keyboard shortcut" - }, - "notSet": { - "message": "নির্ধারণ করা হয়নি" - }, - "change": { - "message": "বদল করুন" - }, - "youtubeKeybindWarning": { - "message": "এটি একটি অন্তর্নির্মিত ইউটিউব শর্টকাট। আপনি কি নিশ্চিত যে আপনি এটি ব্যবহার করতে চান?" - }, - "betaServerWarning": { - "message": "বেটা সার্ভার চালু করা হয়েছে!" - }, - "openOptionsPage": { - "message": "বিকল্প পাতা খুলুন" - } -} diff --git a/public/_locales/ca/messages.json b/public/_locales/ca/messages.json deleted file mode 100644 index df7dfe4d..00000000 --- a/public/_locales/ca/messages.json +++ /dev/null @@ -1,226 +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" - }, - "SubmitTimes": { - "message": "Envia els segments" - }, - "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" - }, - "submitTimesButton": { - "message": "Envia 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" - } -} diff --git a/public/_locales/cs/messages.json b/public/_locales/cs/messages.json deleted file mode 100644 index 94430f0f..00000000 --- a/public/_locales/cs/messages.json +++ /dev/null @@ -1,1247 +0,0 @@ -{ - "fullName": { - "message": "SponsorBlock pro YouTube - Přeskoč sponzorství", - "description": "Name of the extension." - }, - "Description": { - "message": "Přeskoč sponzorství, žadonění o odběr a další v YouTube videích. Nahlaš sponzorované segmenty na videích co sleduješ a ušetři ostatním čas.", - "description": "Description of the extension." - }, - "400": { - "message": "Server hlásí, že tento požadavek je neplatný" - }, - "429": { - "message": "Pro toto video jste přidali příliš mnoho příspěvků. Jste si jistí, že jich je tolik?" - }, - "409": { - "message": "Tento příspěvek byl již přidán dříve" - }, - "channelWhitelisted": { - "message": "Kanál přidán do výjimek!" - }, - "Segment": { - "message": "segment" - }, - "Segments": { - "message": "segmentů" - }, - "SegmentsCap": { - "message": "Segmenty" - }, - "Chapters": { - "message": "Kapitoly" - }, - "renderAsChapters": { - "message": "Zobrazit segmenty jako kapitoly", - "description": "Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system" - }, - "showSegmentNameInChapterBar": { - "message": "Zobrazit aktuální segment vedle času videa" - }, - "upvoteButtonInfo": { - "message": "Hlasovat pro tento příspěvek" - }, - "reportButtonTitle": { - "message": "Nahlásit" - }, - "reportButtonInfo": { - "message": "Nahlásit tento příspěvek jako nesprávný." - }, - "Dismiss": { - "message": "Zrušit" - }, - "Loading": { - "message": "Načítání..." - }, - "Hide": { - "message": "Nikdy nezobrazovat" - }, - "hitGoBack": { - "message": "Klikněte na \"Vrátit se\", abyste se dostali do místa před přeskočením." - }, - "unskip": { - "message": "Vrátit se" - }, - "reskip": { - "message": "Znovu přeskočit" - }, - "unmute": { - "message": "Zrušit ztlumení" - }, - "paused": { - "message": "Pozastaveno" - }, - "manualPaused": { - "message": "Časovač zastaven" - }, - "confirmMSG": { - "message": "Chcete-li upravit nebo odstranit jednotlivé hodnoty, klikněte na tlačítko informace, nebo otevřete vyskakovací okno rozšíření kliknutím na ikonu rozšíření v pravém horním rohu." - }, - "clearThis": { - "message": "Jste si jistí, že to chcete vymazat?\n\n" - }, - "Unknown": { - "message": "Při přidávání vašeho příspěvku došlo k chybě. Zkuste to prosím později." - }, - "sponsorFound": { - "message": "Toto video má segmenty v databázi!" - }, - "sponsor404": { - "message": "Nebyly nalezeny žádné segmenty" - }, - "sponsorStart": { - "message": "Nyní začíná segment" - }, - "sponsorEnd": { - "message": "Segment nyní končí" - }, - "sponsorCancel": { - "message": "Zrušit vytváření segmentu" - }, - "noVideoID": { - "message": "Nebylo nalezeno žádné YouTube video.\nPokud je to špatně, obnovte záložku." - }, - "refreshSegments": { - "message": "Aktualizovat segmenty" - }, - "success": { - "message": "Úspěch!" - }, - "voted": { - "message": "Hlasováno!" - }, - "serverDown": { - "message": "Zdá se, že server nefunguje. Obraťte se okamžitě na vývojáře." - }, - "connectionError": { - "message": "Došlo k chybě připojení. Kód chyby: " - }, - "clearTimes": { - "message": "Vymazat segmenty" - }, - "openPopup": { - "message": "Otevřít vyskakovací okno SponsorBlock" - }, - "closePopup": { - "message": "Zavřít vyskakovací okno" - }, - "closeIcon": { - "message": "Ikona pro zavření" - }, - "SubmitTimes": { - "message": "Odeslat segmenty" - }, - "sortSegments": { - "message": "Seřadit segmenty" - }, - "submitCheck": { - "message": "Opravdu to chcete odeslat?" - }, - "whitelistChannel": { - "message": "Přidat kanál do výjimek" - }, - "removeFromWhitelist": { - "message": "Odebrat kanál z výjimek" - }, - "voteOnTime": { - "message": "Hlasovat pro segment" - }, - "Submissions": { - "message": "Příspěvky" - }, - "savedPeopleFrom": { - "message": "Ušetřili jste lidem " - }, - "viewLeaderboard": { - "message": "Žebříček" - }, - "recordTimesDescription": { - "message": "Odeslat" - }, - "submissionEditHint": { - "message": "Úpravy sekcí se objeví po odeslání", - "description": "Appears in the popup to inform them that editing has been moved to the video player." - }, - "popupHint": { - "message": "Tip: V možnostech můžete nastavit klávesové zkratky pro odeslání" - }, - "clearTimesButton": { - "message": "Vymazat časy" - }, - "submitTimesButton": { - "message": "Odeslat časy" - }, - "publicStats": { - "message": "Toto se používá ve veřejném žebříčku k ukázání jak moc jste přispěli. Podívejte se na něj" - }, - "Username": { - "message": "Uživatelské jméno" - }, - "setUsername": { - "message": "Nastavit uživatelské jméno" - }, - "copyPublicID": { - "message": "Kopírovat veřejné uživatelské ID" - }, - "copySegmentID": { - "message": "Zkopírovat ID segmentu" - }, - "discordAdvert": { - "message": "Připojte se k oficiálnímu Discord serveru k podání návrhů a zpětné vazby!" - }, - "hideThis": { - "message": "Skrýt" - }, - "Options": { - "message": "Nastavení" - }, - "showButtons": { - "message": "Zobrazit tlačítka na YouTube přehrávači" - }, - "hideButtons": { - "message": "Skrýt tlačítka na YouTube přehrávači" - }, - "hideButtonsDescription": { - "message": "Skryje tlačítka, která se zobrazí v YouTube přehrávači pro přeskočení segmentů." - }, - "showSkipButton": { - "message": "Nechat tlačítko přeskočení na zvýraznění v přehrávači" - }, - "showInfoButton": { - "message": "Zobrazit informační tlačítko v YouTube přehrávači" - }, - "hideInfoButton": { - "message": "Skrýt informační tlačítko v YouTube přehrávači" - }, - "autoHideInfoButton": { - "message": "Automaticky skrýt informační tlačítko" - }, - "hideDeleteButton": { - "message": "Skrýt tlačítko Odstranit v YouTube přehrávači" - }, - "showDeleteButton": { - "message": "Zobrazit tlačítko Odstranit v YouTube přehrávači" - }, - "enableViewTracking": { - "message": "Povolit počítadlo přeskočení" - }, - "whatViewTracking": { - "message": "Tato vlastnost sleduje, jaké segmenty jste přeskočili, abychom dali uživatelům vědět, jak moc jejich příspěvek pomohl ostatním a může být použita jako sledování společně s hlasy pro zajištění, že se spam nedostane do databáze. Toto rozšíření posílá zprávu serveru pokaždé když přeskočíte segment. Doufejme, že si moc lidí nezmění toto nastavení, aby byla zobrazená čísla přesná. :)" - }, - "enableViewTrackingInPrivate": { - "message": "Povolit sledování počtu přeskočení v soukromých/anonymních oknech" - }, - "enableTrackDownvotes": { - "message": "Ukládat hlasy proti segmentům" - }, - "whatTrackDownvotes": { - "message": "Jakékoli segmenty, proti kterým budete hlasovat, zůstanou skryté i po obnovení karty" - }, - "trackDownvotesWarning": { - "message": "Varování: Zakázání této možnosti odstraní všechny dříve uložené hlasy proti" - }, - "enableQueryByHashPrefix": { - "message": "Dotaz podle hash předpony" - }, - "whatQueryByHashPrefix": { - "message": "Místo žádání o segmenty ze serveru pomocí videoID jsou poslány první 4 charaktery hashe ve videoID. Tento server odešle zpět data pro všechna videa s podobnými hashy." - }, - "enableRefetchWhenNotFound": { - "message": "Refetovat segmenty na nových videích" - }, - "whatRefetchWhenNotFound": { - "message": "Pokud je video nové a nejsou nalezeny žádné segmenty, bude rozšíření každých několik minut refetchovat data, zatímco sledujete video." - }, - "enableShowCategoryWithoutPermission": { - "message": "Zobrazit kategorie v nabídce odeslání i bez oprávnění k odeslání" - }, - "whatShowCategoryWithoutPermission": { - "message": "Některé kategorie vyžadují oprávnění k odeslání z důvodu minimálních požadavků na reputaci" - }, - "showNotice": { - "message": "Znovu zobrazit upozornění" - }, - "showSkipNotice": { - "message": "Zobrazit upozornění po přeskočení segmentu" - }, - "showCategoryGuidelines": { - "message": "Zobrazit nápovědu ke kategorii" - }, - "noticeVisibilityMode0": { - "message": "Oznámení o přeskočení v plné velikosti" - }, - "noticeVisibilityMode1": { - "message": "Malá oznámení o automatickém přeskočení" - }, - "noticeVisibilityMode2": { - "message": "Všechna malá oznámení o přeskočení" - }, - "noticeVisibilityMode3": { - "message": "Vybledlá oznámení o automatickém přeskočení" - }, - "noticeVisibilityMode4": { - "message": "Všechna vybledlá oznámení o přeskočení" - }, - "longDescription": { - "message": "SponsorBlock vám umožní přeskakovat sponzorské sekce, intra, outra, oznámení k odběru a další otravné části YouTube videí. SponsorBlock je crowdsourcované rozšíření prohlížeče, které dává komukoli možnost odeslat začátek a konec sponzorovaných segmentů a dalších segmentů YouTube videí. Jakmile jedna osoba odešle tuto informaci, všichni ostatní s tímto rozšířením automaticky přeskočí sponzorovaný segment. Můžete také přeskakovat nehudební sekce v hudebních videích.", - "description": "Full description of the extension on the store pages." - }, - "website": { - "message": "Web", - "description": "Used on Firefox Store Page" - }, - "sourceCode": { - "message": "Zdrojový kód", - "description": "Used on Firefox Store Page" - }, - "noticeUpdate": { - "message": "Upozornění bylo aktualizováno!", - "description": "The first line of the message displayed after the notice was upgraded." - }, - "noticeUpdate2": { - "message": "Pokud se vám to stále nelíbí, klikněte na tlačítko Nikdy nezobrazovat.", - "description": "The second line of the message displayed after the notice was upgraded." - }, - "setSkipShortcut": { - "message": "Přeskočit segment", - "description": "Keybind label" - }, - "setStartSponsorShortcut": { - "message": "Začít/ukončit segment", - "description": "Keybind label" - }, - "setSubmitKeybind": { - "message": "Odeslat segmenty", - "description": "Keybind label" - }, - "nextChapterKeybind": { - "message": "Další kapitola", - "description": "Keybind label" - }, - "previousChapterKeybind": { - "message": "Předchozí kapitola", - "description": "Keybind label" - }, - "keybindDescription": { - "message": "Vyberte klávesu jejím zadáním a zvolte si modifikátory, které chcete použít." - }, - "0": { - "message": "Vypršel časový limit připojení. Zkontrolujte vaše připojení k internetu. Pokud váš internet funguje, server je nejspíš přetížený nebo spadnul." - }, - "disableSkipping": { - "message": "Přeskakování je povoleno" - }, - "enableSkipping": { - "message": "Přeskakování je zakázáno" - }, - "yourWork": { - "message": "Vaše práce", - "description": "Used to describe the section that will show you the statistics from your submissions." - }, - "502": { - "message": "Server je nejspíš přetížený. Zkuste to znovu za pár vteřin." - }, - "errorCode": { - "message": "Kód chyby: " - }, - "skip": { - "message": "Přeskočit" - }, - "mute": { - "message": "Ztlumit" - }, - "full": { - "message": "Celé video", - "description": "Used for the name of the option to label an entire video as sponsor or self promotion." - }, - "skip_category": { - "message": "Přeskočit {0}?" - }, - "mute_category": { - "message": "Ztlumit {0}?" - }, - "skip_to_category": { - "message": "Přeskočit na {0}?", - "description": "Used for skipping to things (Skip to Highlight)" - }, - "skipped": { - "message": "Segment {0} přeskočen", - "description": "Example: Sponsor Skipped" - }, - "muted": { - "message": "Segment {0} ztlumen", - "description": "Example: Sponsor Muted" - }, - "skipped_to_category": { - "message": "Přeskočeno na {0}", - "description": "Used for skipping to things (Skipped to Highlight)" - }, - "disableAutoSkip": { - "message": "Zakázat automatické přeskočení" - }, - "enableAutoSkip": { - "message": "Povolit automatické přeskočení" - }, - "audioNotification": { - "message": "Zvukové oznámení při přeskočení" - }, - "audioNotificationDescription": { - "message": "Zvukové oznámení při přeskočení přehraje zvuk při každém přeskočení segmentu. Při zakázání (nebo je zakázáno automatické přeskočení) nebude přehrán žádný zvuk." - }, - "showTimeWithSkips": { - "message": "Zobrazit čas s odebranými přeskočeními" - }, - "showTimeWithSkipsDescription": { - "message": "Tento čas se objeví v závorkách vedle aktuálního času pod časovou lištou. Zobrazí to celkovou dobu trvání videa mínus všechny segmenty. To zahrnuje i segmenty označené jen jako \"Zobrazit v liště\"." - }, - "youHaveSkipped": { - "message": "Přeskočili jste " - }, - "minLower": { - "message": "minutu" - }, - "minsLower": { - "message": "minut" - }, - "hourLower": { - "message": "hodinu" - }, - "hoursLower": { - "message": "hodin" - }, - "youHaveSavedTime": { - "message": "Ušetřili jste lidem", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "youHaveSavedTimeEnd": { - "message": " jejich života", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "statusReminder": { - "message": "Podívejte se na status.sponsor.ajay.app pro stav serverů." - }, - "changeUserID": { - "message": "Importovat / exportovat vaše soukromé UserID" - }, - "whatChangeUserID": { - "message": "Toto by mělo být ponecháno v soukromí. Je to jako heslo a nemělo by být s nikým sdíleno. Pokud to někdo má, může se za vás vydávat. Pokud hledáte vaše veřejné uživatelské ID, klikněte na ikonu schránky ve vyskakovacím okně." - }, - "setUserID": { - "message": "Nastavit soukromé UserID" - }, - "userIDChangeWarning": { - "message": "Varování: Změna soukromého UserID je nevratná. Opravdu to chcete udělat? Pro jistotu si zálohujte vaše staré ID, jen kdyby něco." - }, - "createdBy": { - "message": "Vytvořil" - }, - "supportOtherSites": { - "message": "Podpora pro weby YouTube třetích stran" - }, - "supportOtherSitesDescription": { - "message": "Podpora pro YouTube klienty třetích stran. Chcete-li povolit podporu, musíte přijmout další oprávnění. Toto NEFUNGUJE v anonymním režimu v Chromu a dalších Chromium prohlížečích.", - "description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube" - }, - "supportedSites": { - "message": "Podporované weby: " - }, - "optionsInfo": { - "message": "Povolení podpory Invidious, zakázání automatického přeskočení, skrytí tlačítek a více." - }, - "addInvidiousInstance": { - "message": "Přidat relaci klienta třetí strany" - }, - "addInvidiousInstanceDescription": { - "message": "Přidat vlastní relaci. Musí být formátována POUZE s doménou. Například: invidious.ajay.app" - }, - "add": { - "message": "Přidat" - }, - "addInvidiousInstanceError": { - "message": "Neplatná doména. Toto by mělo zahrnovat POUZE doménovou část. Například: invidious.ajay.app" - }, - "resetInvidiousInstance": { - "message": "Obnovit seznam relací Invidious" - }, - "resetInvidiousInstanceAlert": { - "message": "Chystáte se obnovit seznam relací Invidious" - }, - "currentInstances": { - "message": "Aktuální relace:" - }, - "minDuration": { - "message": "Minimální doba trvání (ve vteřinách):" - }, - "minDurationDescription": { - "message": "Segmenty kratší než nastavená hodnota nebudou přeskočeny nebo zobrazeny v přehrávači." - }, - "enableManualSkipOnFullVideo": { - "message": "Použít manuální přeskočení, pokud existuje štítek na celém videu" - }, - "whatManualSkipOnFullVideo": { - "message": "Pro lidi, kteří chtějí sledovat video bez přerušení, pokud je celé sponzorované nebo sebepropagace." - }, - "skipNoticeDuration": { - "message": "Délka trvání oznámení o přeskočení (v sekundách):" - }, - "skipNoticeDurationDescription": { - "message": "Oznámení o přeskočení zůstane na obrazovce alespoň po tuto dobu. Pro ruční může být zobrazeno déle." - }, - "shortCheck": { - "message": "Váš příspěvek je kratší než vaše možnost nejkratší doby trvání. To by mohlo znamenat, že někdo segment již odeslal, a je jenom ignorován kvůli této možnosti. Opravdu chcete odeslat váš příspěvek?" - }, - "liveOrPremiere": { - "message": "Odesílání na aktivním streamu nebo premiéře. Počkejte prosím, než skončí, poté obnovte stránku a ověřte, zda jsou segmenty stále platné." - }, - "showUploadButton": { - "message": "Zobrazit tlačítko Nahrát" - }, - "customServerAddress": { - "message": "Adresa serveru SponsorBlock" - }, - "customServerAddressDescription": { - "message": "Adresa, kterou SponsorBlock používá ke kontaktování serveru.\nToto byste neměli měnit, pokud nemáte vlastní serverovou relaci." - }, - "save": { - "message": "Uložit" - }, - "reset": { - "message": "Obnovit" - }, - "customAddressError": { - "message": "Tato adresa není platná. Ujistěte se, že na začátku máte http:// nebo https:// a žádná koncová lomítka." - }, - "areYouSureReset": { - "message": "Jste si jisti, že toto chcete obnovit?" - }, - "mobileUpdateInfo": { - "message": "m.youtube.com je nyní podporováno" - }, - "exportOptions": { - "message": "Importovat / exportovat všechny možnosti" - }, - "exportOptionsCopy": { - "message": "Upravit/kopírovat" - }, - "exportOptionsDownload": { - "message": "Uložit do souboru" - }, - "exportOptionsUpload": { - "message": "Načíst ze souboru" - }, - "whatExportOptions": { - "message": "Toto je celá vaše konfigurace ve formátu JSON. Zahrnuje vaše soukromé UserID, takže s ní nakládejte opatrně." - }, - "setOptions": { - "message": "Nastavit možnosti" - }, - "exportOptionsWarning": { - "message": "Varování: Změna možností je nevratná a může rozbít vaši instalaci. Pro jistotu si soubor zálohujte, jen kdyby něco." - }, - "incorrectlyFormattedOptions": { - "message": "Tento soubor JSON nemá správný formát. Vaše možnosti nebyly změněny." - }, - "confirmNoticeTitle": { - "message": "Odeslat segment" - }, - "submit": { - "message": "Odeslat" - }, - "cancel": { - "message": "Zrušit" - }, - "delete": { - "message": "Odstranit" - }, - "preview": { - "message": "Náhled" - }, - "unsubmitted": { - "message": "Neodesláno" - }, - "inspect": { - "message": "Kontrola" - }, - "edit": { - "message": "Upravit" - }, - "copyDebugInformation": { - "message": "Zkopírovat ladící informace do schránky" - }, - "copyDebugInformationFailed": { - "message": "Nepodařilo se zapsat do schránky" - }, - "copyDebugInformationOptions": { - "message": "Zkopíruje informace do schránky pro poskytnutí vývojáři při nahlašování chyby / když o to vývojář zažádá. Citlivé informace jako vaše uživatelské ID, povolené kanály a vlastní adresa serveru byly odebrány. Obsahuje to nicméně informace jako váš useragent, prohlížeč, operační systém a verzi rozšíření. " - }, - "copyDebugInformationComplete": { - "message": "Ladící informace byly zkopírovány do schránky. Můžete odstranit jakékoli informace, které raději nechcete sdílet. Uložte text do textového souboru nebo vložte do chybového hlášení." - }, - "keyAlreadyUsed": { - "message": "Tato zkratka je vázána na jinou akci. Vyberte prosím jinou." - }, - "to": { - "message": "do", - "description": "Used between segments. Example: 1:20 to 1:30" - }, - "CopiedExclamation": { - "message": "Zkopírováno!", - "description": "Used after something has been copied to the clipboard. Example: 'Copied!'" - }, - "generic_guideline1": { - "message": "Zahrnout přechody segmentů" - }, - "generic_guideline2": { - "message": "Hraje, jako kdyby nebylo nic přeskočeno" - }, - "category_sponsor": { - "message": "Sponzor" - }, - "category_sponsor_description": { - "message": "Placená propagace, placená doporučení a přímé reklamy. Nezahrnuje sebepropagaci nebo shout-outy uživatelů/tvůrců/webů/produktů, které se tvůrcovi líbí." - }, - "category_sponsor_guideline1": { - "message": "Placené propagace" - }, - "category_sponsor_guideline2": { - "message": "Není pro dary nebo vlastní merch" - }, - "category_selfpromo": { - "message": "Neplacená / vlastní propagace" - }, - "category_selfpromo_description": { - "message": "Podobné jako „sponzor“, ale pro neplacenou nebo vlastní propagaci. Zahrnuje sekce o zboží, darech nebo informace o tom, s kým spolupracují." - }, - "category_selfpromo_guideline1": { - "message": "Dary, členství a vlastní merch" - }, - "category_selfpromo_guideline2": { - "message": "Bezplatné propagace, které nepřidávají nic k videu" - }, - "category_selfpromo_guideline3": { - "message": "Není pro podnikové produkty a merch" - }, - "category_exclusive_access": { - "message": "Exkluzivní přístup" - }, - "category_exclusive_access_description": { - "message": "Pouze pro označování celých videí. Používá se v případě, že je ve videu zobrazován produkt, služba nebo místo, které autor obdržel zdarma nebo s bezplatným přístupem." - }, - "category_exclusive_access_pill": { - "message": "V tomto videu je zobrazován produkt, služba nebo místo, které autor obdržel zdarma nebo s bezplatným přístupem", - "description": "Short description for this category" - }, - "category_exclusive_access_guideline1": { - "message": "Celé video zobrazuje místo, kam autor obdržel bezplatný nebo dotovaný přístup" - }, - "category_interaction": { - "message": "Připomenutí interakce (odběr)" - }, - "category_interaction_description": { - "message": "Krátká připomínka, abyste dali like, odběr nebo jste sledovali tvůrce uprostřed obsahu. Pokud je segment dlouhý nebo zahrnuje něco specifického, mělo by být místo toho zařazeno do vlastní propagace." - }, - "category_interaction_guideline1": { - "message": "Krátká připomenutí pro lajknutí, odebírání či sledování" - }, - "category_interaction_guideline2": { - "message": "Zahrnuje nepřímé připomenutí komentování" - }, - "category_interaction_guideline3": { - "message": "Není pro obecnou propagaci, pouze výzvy k akci" - }, - "category_interaction_short": { - "message": "Připomenutí interakce" - }, - "category_intro": { - "message": "Přestávka / úvodní animace" - }, - "category_intro_description": { - "message": "Interval bez skutečného obsahu. Může to být pauza, statický obrázek nebo opakující se animace. Nemělo by být použito pro přechody obsahující informace." - }, - "category_intro_short": { - "message": "Přestávka" - }, - "category_intro_guideline1": { - "message": "Část bez skutečného obsahu" - }, - "category_intro_guideline2": { - "message": "Není pro přechody s informacemi" - }, - "category_outro": { - "message": "Koncové karty / titulky" - }, - "category_outro_description": { - "message": "Titulky nebo když se objeví konečné karty YouTube. Není pro závěry s informacemi." - }, - "category_outro_guideline1": { - "message": "Nezahrnuje obsah, i když jsou na obrazovce závěrečné karty" - }, - "category_preview": { - "message": "Náhled / shrnutí" - }, - "category_preview_description": { - "message": "Sbírka klipů, které zobrazují, co se objeví v tomto videu nebo v jiných videích v sérii, kdy jsou všechny informace zopakovány později ve videu." - }, - "category_preview_guideline1": { - "message": "Klipy které se objeví později nebo v budoucím videu" - }, - "category_preview_guideline2": { - "message": "Shrnutí předchozího videa" - }, - "category_preview_guideline3": { - "message": "Není pro sekce, které přidávají další obsah" - }, - "category_filler": { - "message": "Výplň / vtipy" - }, - "category_filler_description": { - "message": "Scény přidané pouze jako výplň nebo humor, které nejsou nutné k pochopení hlavního obsahu videa. Kategorie by neměla zahrnovat segmenty poskytující podrobnosti o kontextu nebo pozadí. Jedná se o velmi agresivní kategorii myšlenou pro chvíle, kdy nemáte náladu na „zábavu“." - }, - "category_filler_short": { - "message": "Výplň" - }, - "category_filler_guideline1": { - "message": "Tangenciální scény pouze pro výplň nebo humor" - }, - "category_filler_guideline2": { - "message": "Rozptýlení, nepovedené scénky, opakování" - }, - "category_filler_guideline3": { - "message": "Není pro scény vyžadované k pochopení tématu" - }, - "category_music_offtopic": { - "message": "Hudba: nehudební sekce" - }, - "category_music_offtopic_description": { - "message": "Použijte pouze u hudebních videí. Mělo by být použito pouze pro části hudebních videí, které nepokrývá jiná kategorie." - }, - "category_music_offtopic_short": { - "message": "Jiné než hudba" - }, - "category_music_offtopic_guideline1": { - "message": "Sekce, které nejsou v oficiálních vydáních" - }, - "category_music_offtopic_guideline2": { - "message": "Nehudební sekce na živém vystoupení" - }, - "category_poi_highlight": { - "message": "Zvýraznění" - }, - "category_poi_highlight_description": { - "message": "Část videa, kterou hledá většina lidí. Podobné komentářům typu \"Video začíná v x\"." - }, - "category_poi_highlight_guideline1": { - "message": "Sekce, kterou hledá většina lidí" - }, - "category_poi_highlight_guideline2": { - "message": "Může pomoci přeskočit předchozí kontext" - }, - "category_poi_highlight_guideline3": { - "message": "Může přeskočit k názvu nebo náhledu" - }, - "category_chapter": { - "message": "Kapitola" - }, - "category_chapter_description": { - "message": "Vlastní názvy kapitol popisující hlavní části videa." - }, - "category_chapter_guideline1": { - "message": "Nezmiňujte názvy značek sponzorů" - }, - "category_chapter_guideline2": { - "message": "Používejte větší kapitoly pro obecné části" - }, - "category_chapter_guideline3": { - "message": "Menší kapitoly mohou být umístěny uvnitř větších" - }, - "category_livestream_messages": { - "message": "Livestream: Čtení donatů / zpráv" - }, - "category_livestream_messages_short": { - "message": "Čtení zpráv" - }, - "autoSkip": { - "message": "Automatické přeskočení" - }, - "manualSkip": { - "message": "Ruční přeskočení" - }, - "showOverlay": { - "message": "Zobrazit v liště" - }, - "disable": { - "message": "Zakázat" - }, - "autoSkip_POI": { - "message": "Automatické přeskočení na začátek" - }, - "manualSkip_POI": { - "message": "Zeptat se při načtení videa" - }, - "showOverlay_POI": { - "message": "Zobrazit v liště" - }, - "showOverlay_full": { - "message": "Zobrazit štítek" - }, - "showOverlay_chapter": { - "message": "Zobrazit kapitoly" - }, - "autoSkipOnMusicVideos": { - "message": "Automaticky přeskočit všechny segmenty, když je ve videu nehudební segment" - }, - "muteSegments": { - "message": "Povolit segmenty, které místo přeskočení ztlumují zvuk" - }, - "fullVideoSegments": { - "message": "Zobrazit ikonu, když je celé video reklama", - "description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo" - }, - "previewColor": { - "message": "Barva neodeslaného segmentu", - "description": "Referring to submissions that have not been sent to the server yet." - }, - "seekBarColor": { - "message": "Barva lišty" - }, - "category": { - "message": "Kategorie" - }, - "skipOption": { - "message": "Možnost přeskočení", - "description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)" - }, - "enableTestingServer": { - "message": "Povolit beta testovací server" - }, - "whatEnableTestingServer": { - "message": "Vaše příspěvky a hlasy SE NEZAPOČÍTAJÍ do hlavního serveru. Použijte pouze pro testování." - }, - "testingServerWarning": { - "message": "Všechny příspěvky a hlasy SE NEZAPOČÍTAJÍ do hlavního serveru při připojování se k testovacímu serveru. Zakažte, pokud chcete vytvářet skutečné příspěvky." - }, - "bracketNow": { - "message": "(Nyní)" - }, - "moreCategories": { - "message": "Další kategorie" - }, - "chooseACategory": { - "message": "Vyberte kategorii" - }, - "enableThisCategoryFirst": { - "message": "Pro odeslání segmentů v kategorii \"{0}\" to nejprve musíte povolit v nastavení. Nyní budete přesměrováni do nastavení.", - "description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options." - }, - "poiOnlyOneSegment": { - "message": "Varování: tento typ segmentu může být aktivní najednou pouze jeden. Odeslání více segmentů způsobí zobrazení náhodného segmentu." - }, - "youMustSelectACategory": { - "message": "Musíte vybrat kategorii pro všechny odeslané segmenty!" - }, - "bracketEnd": { - "message": "(Konec)" - }, - "End": { - "message": "Konec", - "description": "Button that skips to the end of a segment" - }, - "hiddenDueToDownvote": { - "message": "skryté: protihlas" - }, - "hiddenDueToDuration": { - "message": "skryté: moc krátké" - }, - "manuallyHidden": { - "message": "ručně skryto" - }, - "channelDataNotFound": { - "description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.", - "message": "ID kanálu ještě není načteno. Pokud používáte vložené video, zkuste místo toho použít domovskou stránku YouTube. Toto může být také způsobeno změnami v rozložení YouTube, pokud si myslíte, že tomu tak bude, zanechte zde komentář:" - }, - "invidiousPermissionRefresh": { - "message": "Prohlížeč odvolal oprávnění potřebné k funkci na Invidious a dalších webech třetích stran. Klikněte prosím na tlačítko níže pro opětovnou aktivaci tohoto oprávnění." - }, - "acceptPermission": { - "message": "Přijmout oprávnění" - }, - "permissionRequestSuccess": { - "message": "Žádost o oprávnění byla úspěšná!" - }, - "permissionRequestFailed": { - "message": "Žádost o oprávnění se nezdařila, neklikli jste na Odmítnout?" - }, - "adblockerIssueWhitelist": { - "message": "Pokud vám tento problém nepůjde vyřešit, vypněte nastavení 'Vynutit kontrolu kanálu před přeskočením', protože SponsorBlock nemůže zjistit informace o kanálu" - }, - "forceChannelCheck": { - "message": "Vynutit kontrolu kanálu před přeskočením" - }, - "whatForceChannelCheck": { - "message": "Ve výchozím nastavení bude přeskakovat segmenty ještě před tím, než bude rozšíření vědět, jaký je to kanál. Ve výchozím nastavení mohou být některé segmenty na začátku videa přeskočeny na povolených kanálech. Povolením této možnosti tomu zabráníte, ale každé přeskočení bude mít mírné zpoždění, protože získávání ID kanálu může chvíli trvat. Toto zpoždění nemusí být patrné, pokud máte rychlý internet." - }, - "forceChannelCheckPopup": { - "message": "Zvažte povolení možnosti \"Vynutit kontrolu kanálu před přeskočením\"" - }, - "downvoteDescription": { - "message": "Nesprávné / špatné časování" - }, - "incorrectVote": { - "message": "Nesprávné" - }, - "harmfulVote": { - "message": "Škodlivé", - "description": "Used for chapter segments when the text is harmful/offensive to remove it faster" - }, - "incorrectCategory": { - "message": "Změnit kategorii" - }, - "nonMusicCategoryOnMusic": { - "message": "Toto video je kategorizováno jako hudba. Jste si jisti, že je v něm sponzorská sekce? Pokud se opravdu jedná o \"Nehudební segment\", otevřete nastavení a povolte tuto kategorii. Poté budete moct odeslat segment jako \"Nehudební\" místo sponzorského. Pokud jste zmateni, přečtěte si prosím pokyny." - }, - "multipleSegments": { - "message": "Více segmentů" - }, - "guidelines": { - "message": "Pokyny" - }, - "readTheGuidelines": { - "message": "Přečtěte si pokyny!!", - "description": "Show the first time they submit or if they are \"high risk\"" - }, - "categoryUpdate1": { - "message": "Kategorie jsou zde!" - }, - "categoryUpdate2": { - "message": "Otevřít možnosti pro přeskočení intra, outra, merche apod." - }, - "help": { - "message": "Nápověda" - }, - "GotIt": { - "message": "Rozumím", - "description": "Used as the button to dismiss a tooltip" - }, - "fullVideoTooltipWarning": { - "message": "Tento segment je velký. Pokud je celé video o jednom tématu, změňte z \"Přeskočit\" na \"Celé video\". Pro více informací se podívejte na pokyny." - }, - "categoryPillTitleText": { - "message": "Toto celé video je označeno jako tato kategorie a je příliš integrované na to, aby se dalo rozdělit" - }, - "chapterNameTooltipWarning": { - "message": "Jeden z názvů kapitol je podobný kategorii. Pokud je to možné, raději používejte kategorie." - }, - "experiementOptOut": { - "message": "Odhlásit se ze všech budoucích experimentů", - "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": "Skrýt napořád" - }, - "warningChatInfo": { - "message": "Všimli jsme si, že děláte některé běžné chyby, které nejsou úmyslně zlé" - }, - "warningTitle": { - "message": "Dostali jste varování" - }, - "questionButton": { - "message": "Mám otázku" - }, - "warningConfirmButton": { - "message": "Chápu důvod" - }, - "warningError": { - "message": "Chyba při pokusu o potvrzení varování:" - }, - "Donate": { - "message": "Přispět" - }, - "considerDonating": { - "message": "Pomozte s financováním vývoje" - }, - "hideDonationLink": { - "message": "Skrýt odkaz na přispění" - }, - "darkModeOptionsPage": { - "message": "Tmavý režim na stránce možností" - }, - "helpPageThanksForInstalling": { - "message": "Děkujeme za instalaci SponsorBlocku." - }, - "helpPageReviewOptions": { - "message": "Zkontrolujte prosím možnosti níže" - }, - "helpPageFeatureDisclaimer": { - "message": "Spousta funkcí je ve výchozím nastavení zakázána. Pokud chcete přeskakovat intra, outra, používat Invidious atd., povolte je níže. Můžete také zobrazit/skrýt UI prvky." - }, - "helpPageHowSkippingWorks": { - "message": "Jak funguje přeskakování" - }, - "helpPageHowSkippingWorks1": { - "message": "Segmenty videa budou automaticky přeskočeny, pokud budou nalezeny v databázi. Můžete si otevřít vyskakovací okno kliknutím na ikonu rozšíření pro náhled, co jsou zač." - }, - "helpPageHowSkippingWorks2": { - "message": "Kdykoli přeskočíte segment, dostanete oznámení. Pokud je časování nesprávné, můžete hlasovat proti kliknutím na palec dolů! Také můžete hlasovat ve vyskakovacím okně." - }, - "Submitting": { - "message": "Odesílání" - }, - "helpPageSubmitting1": { - "message": "Odeslání může být provedeno buď ve vyskakovacím okně kliknutím na tlačítko \"Nyní začíná segment\" v přehrávači videa nebo na tlačítkách na přehrávači." - }, - "helpPageSubmitting2": { - "message": "Kliknutím na tlačítko přehrávání označí začátek segmentu a kliknutí na ikonu stop označuje konec. Před odesláním si můžete připravit více segmentů. Kliknutím na tlačítko k nahrání odešlete vaše segmenty. Kliknutím na ikonu koše vše smažete." - }, - "Editing": { - "message": "Úprava" - }, - "helpPageEditing1": { - "message": "Pokud jste něco pokazili, můžete kliknutím na šipku nahoru upravit nebo odstranit své segmenty." - }, - "helpPageTooSlow": { - "message": "Je to příliš pomalé" - }, - "helpPageTooSlow1": { - "message": "Pokud je chcete použít, jsou zde zkratky. Stiskněte pomlčku pro označení začátku/konce sponzorského segmentu a klikněte na apostrof pro odeslání. Tyto zkratky lze změnit v možnostech. Pokud nepoužíváte QWERTY, měli byste si je nejspíše změnit." - }, - "helpPageCopyOfDatabase": { - "message": "Mohu získat kopii databáze? Co se stane, pokud zmizíte?" - }, - "helpPageCopyOfDatabase1": { - "message": "Databáze je veřejná a dostupná na" - }, - "helpPageCopyOfDatabase2": { - "message": "Zdrojový kód je volně dostupný. Takže i když se mi něco stane, vaše příspěvky nebudou ztraceny." - }, - "helpPageNews": { - "message": "Novinky a jak to funguje" - }, - "helpPageSourceCode": { - "message": "Kde získám zdrojový kód?" - }, - "Credits": { - "message": "Poděkování" - }, - "LearnMore": { - "message": "Zjistit více" - }, - "FullDetails": { - "message": "Úplné podrobnosti" - }, - "CopyDownvoteButtonInfo": { - "message": "Zahlasuje proti a vytvoří pro vás lokální kopii pro opětovné odeslání" - }, - "OpenCategoryWikiPage": { - "message": "Otevřít wiki stránku této kategorie." - }, - "CopyAndDownvote": { - "message": "Zkopírovat a hlasovat proti" - }, - "ContinueVoting": { - "message": "Pokračovat v hlasování" - }, - "ChangeCategoryTooltip": { - "message": "Toto bude okamžitě platit pro vaše segmenty" - }, - "downvote": { - "message": "Hlas proti" - }, - "upvote": { - "message": "Hlas pro" - }, - "hideSegment": { - "message": "Skrýt segment" - }, - "skipSegment": { - "message": "Přeskočit segment" - }, - "playChapter": { - "message": "Přehrát kapitolu" - }, - "SponsorTimeEditScrollNewFeature": { - "message": "Použijte kolečko myši při přechodu přes editační okno pro rychlou úpravu času. Kombinace kláves Ctrl nebo Shift mohou být použity k doladění změn." - }, - "categoryPillNewFeature": { - "message": "Novinka! Nyní uvidíte, zda je video zcela sponzorované nebo celé obsahuje sebepropagaci" - }, - "dayAbbreviation": { - "message": "d", - "description": "100d" - }, - "hourAbbreviation": { - "message": "h", - "description": "100h" - }, - "optionsTabBehavior": { - "message": "Chování", - "description": "Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabInterface": { - "message": "Rozhraní", - "description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabKeyBinds": { - "message": "Klávesové zkratky", - "description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabBackup": { - "message": "Záloha/obnovení", - "description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabAdvanced": { - "message": "Různé", - "description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "noticeVisibilityLabel": { - "message": "Vzhled oznámení o přeskočení", - "description": "Option label" - }, - "unbind": { - "message": "Odebrat", - "description": "Unbind keyboard shortcut" - }, - "notSet": { - "message": "Nenastaveno" - }, - "change": { - "message": "Změnit" - }, - "youtubeKeybindWarning": { - "message": "Toto je vestavěná zkratka YouTube. Opravdu ji chcete použít?" - }, - "betaServerWarning": { - "message": "BETA server je povolen!" - }, - "openOptionsPage": { - "message": "Otevřít stránku s možnostmi" - }, - "resetToDefault": { - "message": "Obnovit nastavení na výchozí hodnoty" - }, - "confirmResetToDefault": { - "message": "Opravdu chcete obnovit všechna nastavení na jejich výchozí hodnoty? Tato akce je nevratná." - }, - "exportSegments": { - "message": "Exportovat segmenty" - }, - "importSegments": { - "message": "Importovat segmenty" - }, - "Import": { - "message": "Importovat", - "description": "Button to initiate importing segments. Appears under the textbox where they paste in the data" - }, - "redeemSuccess": { - "message": "Uplatnění bylo úspěšné!" - }, - "redeemFailed": { - "message": "Licenční klíč není platný" - }, - "hideUpsells": { - "message": "Skrýt možnosti nedostupné bez další platby" - }, - "chooseACountry": { - "message": "Vyberte zemi" - }, - "noDiscount": { - "message": "Nemáte nárok na slevu" - }, - "discountLink": { - "message": "Slevový odkaz (viz růžová cena)" - }, - "selectYourCountry": { - "message": "Vyberte vaši zemi" - }, - "alreadyDonated": { - "message": "Pokud jste již přispěli jakoukoli částkou, můžete získat bezplatný přístup odesláním e-mailu na:", - "description": "After the colon is an email address" - }, - "cantAfford": { - "message": "Pokud si nemůžete dovolit zakoupení licence, klikněte {sem}, abyste zjistili, zda máte nárok na slevu", - "description": "Keep the curly braces. The word 'here' should be translated as well." - }, - "patreonSignIn": { - "message": "Přihlásit se pomocí Patreonu" - }, - "redeem": { - "message": "Uplatnit" - }, - "joinOnPatreon": { - "message": "Odebírat na Patreonu" - }, - "oneTimePurchase": { - "message": "Jednorázový nákup" - }, - "enterLicenseKey": { - "message": "Zadejte licenční klíč" - }, - "chaptersPage1": { - "message": "Funkce komunitních kapitol je dostupná pouze lidem, kteří si zakoupili licenci, nebo lidem, kteří získali přístup zdarma díky jejich příspěvkům" - }, - "chaptersPage2": { - "message": "Poznámka: Oprávnění k odesílání kapitol je stále založené na vypočítané reputaci. Zakoupení licence vám pouze umožní zobrazit si kapitoly odeslané ostatními uživateli", - "description": "On the chapters page for getting access to the paid chapters feature" - }, - "chapterNewFeature": { - "message": "Nová funkce: komunitní vlastní kapitoly. Jedná se o komunitou vytvořené sekce ve videích, které lze slučovat, aby byly stále přesnější. Zakupte si licenci pro zobrazení kapitol u tohoto videa, jako například: ", - "description": "After the comma, a list of chapters for this video will appear" - }, - "chapterNewFeature2": { - "message": "Nová funkce: komunitní vlastní kapitoly. Jedná se o komunitou vytvořené sekce ve videích, které lze slučovat, aby byly stále přesnější. Přístup máte zdarma, povolte jej v možnostech." - }, - "unsubmittedSegmentCounts": { - "message": "Momentálně máte {0} na {1}", - "description": "Example: You currently have 12 unsubmitted segments on 5 videos" - }, - "unsubmittedSegmentCountsZero": { - "message": "V současné době nemáte žádné neodeslané segmenty", - "description": "Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments" - }, - "unsubmittedSegmentsSingular": { - "message": "neodeslaný segment", - "description": "Example: You currently have 1 *unsubmitted segment* on 1 video" - }, - "unsubmittedSegmentsPlural": { - "message": "neodeslaných segmentů", - "description": "Example: You currently have 12 *unsubmitted segments* on 5 videos" - }, - "videosSingular": { - "message": "videu", - "description": "Example: You currently have 3 unsubmitted segments on 1 *video*" - }, - "videosPlural": { - "message": "videích", - "description": "Example: You currently have 12 unsubmitted segments on 5 *videos*" - }, - "clearUnsubmittedSegments": { - "message": "Vymazat všechny segmenty", - "description": "Label for a button in settings" - }, - "clearUnsubmittedSegmentsConfirm": { - "message": "Opravdu chcete vymazat všechny své neodeslané segmenty?", - "description": "Confirmation message for the Clear unsubmitted segments button" - }, - "showUnsubmittedSegments": { - "message": "Zobrazit segmenty", - "description": "Show/hide button for the unsubmitted segments list" - }, - "hideUnsubmittedSegments": { - "message": "Skrýt segmenty", - "description": "Show/hide button for the unsubmitted segments list" - }, - "videoID": { - "message": "ID videa", - "description": "Header of the unsubmitted segments list" - }, - "segmentCount": { - "message": "Počet segmentů", - "description": "Header of the unsubmitted segments list" - }, - "actions": { - "message": "Akce", - "description": "Header of the unsubmitted segments list" - }, - "exportSegmentsAsURL": { - "message": "Sdílet jako URL" - } -} diff --git a/public/_locales/da/messages.json b/public/_locales/da/messages.json deleted file mode 100644 index 3a0ef136..00000000 --- a/public/_locales/da/messages.json +++ /dev/null @@ -1,1247 +0,0 @@ -{ - "fullName": { - "message": "SponsorBlock til YouTube - Fjern reklamer", - "description": "Name of the extension." - }, - "Description": { - "message": "Fjern reklamer, subscriber tiggeri og mere i youtube videoer. Rapporter reklamer på de videoer du ser for at spare folks tid.", - "description": "Description of the extension." - }, - "400": { - "message": "Serveren sagde at denne efterspørgsel var ugyldig" - }, - "429": { - "message": "Du har indsendt for mange reklamesegmenter til den her video, er du helt sikker på at der er så mange?" - }, - "409": { - "message": "Dette er allerede blevet indsendt" - }, - "channelWhitelisted": { - "message": "Kanal whitelisted!" - }, - "Segment": { - "message": "seg" - }, - "Segments": { - "message": "segmenter" - }, - "SegmentsCap": { - "message": "Segmenter" - }, - "Chapters": { - "message": "Kapitler" - }, - "renderAsChapters": { - "message": "Render segmenter som kapitler", - "description": "Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system" - }, - "showSegmentNameInChapterBar": { - "message": "Vis nuværende segmenter ved siden af videotid" - }, - "upvoteButtonInfo": { - "message": "Stem for dette forslag" - }, - "reportButtonTitle": { - "message": "Anmeld" - }, - "reportButtonInfo": { - "message": "Anmeld dette forslag som forkert." - }, - "Dismiss": { - "message": "Afvis" - }, - "Loading": { - "message": "Indlæser..." - }, - "Hide": { - "message": "Vis aldrig" - }, - "hitGoBack": { - "message": "Tryk på unskip for at gå tilbage til hvor du kom fra." - }, - "unskip": { - "message": "Annuller spring over" - }, - "reskip": { - "message": "Spring over" - }, - "unmute": { - "message": "Lyd til" - }, - "paused": { - "message": "Sat på pause" - }, - "manualPaused": { - "message": "Sat på pause" - }, - "confirmMSG": { - "message": "For at redigere eller slette individuelle værdier, så skal du klikke på info knappen eller åbne udvidelses popupet ved at klikke på udvidelses ikonet i øverste højre hjørne." - }, - "clearThis": { - "message": "Er du sikker på, at du vil fjerne dette?\n\n" - }, - "Unknown": { - "message": "Der skete en fejl da du prøvede at indsende dine reklame tider, prøv lige igen." - }, - "sponsorFound": { - "message": "Denne video har segmenter i databasen!" - }, - "sponsor404": { - "message": "Ingen segmenter fundet" - }, - "sponsorStart": { - "message": "Segment Begynder Nu" - }, - "sponsorEnd": { - "message": "Segment Slutter Nu" - }, - "sponsorCancel": { - "message": "Annuller Oprettelse Af Segment" - }, - "noVideoID": { - "message": "Ingen YouTube-video fundet.\nHvis dette er forkert, så genindlæs siden." - }, - "refreshSegments": { - "message": "Opdater segmenter" - }, - "success": { - "message": "Succes!" - }, - "voted": { - "message": "Stemt!" - }, - "serverDown": { - "message": "Det ser ud til at serveren er nede. Kontakt udvikleren straks." - }, - "connectionError": { - "message": "Der opstod en forbindelsesfejl. Fejlkode: " - }, - "clearTimes": { - "message": "Ryd Segmenter" - }, - "openPopup": { - "message": "Åbn SponsorBloker Pop-op" - }, - "closePopup": { - "message": "Luk Pop-op" - }, - "closeIcon": { - "message": "Luk ikon" - }, - "SubmitTimes": { - "message": "Indsend Segmenter" - }, - "sortSegments": { - "message": "Sortér Segmenter" - }, - "submitCheck": { - "message": "Er du sikker på, at du vil indsende dette?" - }, - "whitelistChannel": { - "message": "Hvidlist kanal" - }, - "removeFromWhitelist": { - "message": "Fjern kanal fra hvidliste" - }, - "voteOnTime": { - "message": "Stem På Et Segment" - }, - "Submissions": { - "message": "Indsendelser" - }, - "savedPeopleFrom": { - "message": "Du har sparret folk " - }, - "viewLeaderboard": { - "message": "Topliste" - }, - "recordTimesDescription": { - "message": "Indsend" - }, - "submissionEditHint": { - "message": "Sektionsredigering vises, når du klikker på afsend", - "description": "Appears in the popup to inform them that editing has been moved to the video player." - }, - "popupHint": { - "message": "Tip: Du kan opsætte keybinds til indsendelse i indstillingerne" - }, - "clearTimesButton": { - "message": "Ryd Tider" - }, - "submitTimesButton": { - "message": "Indsend Tider" - }, - "publicStats": { - "message": "Dette bruges på siden med offentlige statistikker til at vise, hvor meget du har bidraget. Se det" - }, - "Username": { - "message": "Brugernavn" - }, - "setUsername": { - "message": "Angiv Brugernavn" - }, - "copyPublicID": { - "message": "Kopier Offentligt Bruger-ID" - }, - "copySegmentID": { - "message": "Kopier Segment-Id" - }, - "discordAdvert": { - "message": "Kom til den officielle Discord-server for at give forslag og feedback!" - }, - "hideThis": { - "message": "Skjul dette" - }, - "Options": { - "message": "Indstillinger" - }, - "showButtons": { - "message": "Vis Knapper På YouTube-Afspiller" - }, - "hideButtons": { - "message": "Skjul Knapper På YouTube-Afspiller" - }, - "hideButtonsDescription": { - "message": "Dette skjuler knapperne, der vises på YouTube-afspilleren for indsende springe segmenter." - }, - "showSkipButton": { - "message": "Behold Knappen Spring Til Fremhævning På Afspilleren" - }, - "showInfoButton": { - "message": "Vis Info-Knap På YouTube-Afspiller" - }, - "hideInfoButton": { - "message": "Skjul Info-Knap På YouTube-Afspiller" - }, - "autoHideInfoButton": { - "message": "Auto-Skjul Info-Knap" - }, - "hideDeleteButton": { - "message": "Skjul Slet-Knappen på YouTube-Afspiller" - }, - "showDeleteButton": { - "message": "Vis Slet-Knappen på YouTube-Afspiller" - }, - "enableViewTracking": { - "message": "Aktiver Optælling Af Antal Spring Over" - }, - "whatViewTracking": { - "message": "Denne funktion registrerer hvilke segmenter, du har sprunget over, så brugere kan se, hvor meget deres bidrag har hjulpet andre, og bruges som en måleenhed sammen med upvotes for at sikre, at spam ikke kommer ind i databasen. Udvidelsen sender en besked til serveren hver gang, du springer et segment over. Forhåbentlig ændrer de fleste ikke denne indstilling, så visningstallene er korrete. :)" - }, - "enableViewTrackingInPrivate": { - "message": "Aktiver Optælling Af Antal Spring Over I Private-/Inkognitovinduer" - }, - "enableTrackDownvotes": { - "message": "Gem segment nedstemmer" - }, - "whatTrackDownvotes": { - "message": "Ethvert segment, du nedstemmer vil forblive skjult selv efter genindlæsning" - }, - "trackDownvotesWarning": { - "message": "Advarsel: Deaktivering af dette vil slette alle tidligere gemte nedstemmer" - }, - "enableQueryByHashPrefix": { - "message": "Forespørg Efter Hashpræfiks" - }, - "whatQueryByHashPrefix": { - "message": "I stedet for at anmode om segmenter fra serveren ved hjælp af videoID'et, sendes de første 4 tegn i hashen af videoID'et. Serveren sender data tilbage for alle videoer med lignende hashes." - }, - "enableRefetchWhenNotFound": { - "message": "Opdater Segmenter På Nye Videoer" - }, - "whatRefetchWhenNotFound": { - "message": "Hvis videoen er ny, og der ikke er nogle segmenter fundet, vil den opdatere hvert par minutter, mens du ser." - }, - "enableShowCategoryWithoutPermission": { - "message": "Vis kategorier i indsendelsesmenu selv uden indsendelse tilladelse" - }, - "whatShowCategoryWithoutPermission": { - "message": "Nogle kategorier kræver tilladelse til at indsende på grund af minimumskrav til omdømme" - }, - "showNotice": { - "message": "Vis Bemærkning Igen" - }, - "showSkipNotice": { - "message": "Vis Bemærkning Efter Et Segment Skippes" - }, - "showCategoryGuidelines": { - "message": "Vis Kategorihjælp" - }, - "noticeVisibilityMode0": { - "message": "Fuld Størrelse Skip-Bemærkninger" - }, - "noticeVisibilityMode1": { - "message": "Små Skip-Bemærkninger for Auto-Skip" - }, - "noticeVisibilityMode2": { - "message": "Alle Små Skip-Bemærkninger" - }, - "noticeVisibilityMode3": { - "message": "Faded Skip-Bemærkninger for Auto-Skip" - }, - "noticeVisibilityMode4": { - "message": "Alle Faded Skip-Bemærkninger" - }, - "longDescription": { - "message": "SponsoBlock lader dig skippe sponsorer, introer, outroer, abonnement påmindelser og andre irriterende dele af YouTube-Videoer. SponsorBlock er en crowdsourced browerudvidelse, hvor alle kan indsende start- og sluttidspunkter for sponsorerede og andre segmenter i YouTube-Videoer. Du kan også springe over de dele af musikvideoer, som ikke er musik.", - "description": "Full description of the extension on the store pages." - }, - "website": { - "message": "Hjemmeside", - "description": "Used on Firefox Store Page" - }, - "sourceCode": { - "message": "Kildekode", - "description": "Used on Firefox Store Page" - }, - "noticeUpdate": { - "message": "Meddelelsen er blevet opgraderet!", - "description": "The first line of the message displayed after the notice was upgraded." - }, - "noticeUpdate2": { - "message": "Hvis du stadig ikke kan lide det, så tryk på aldrig vis knappen.", - "description": "The second line of the message displayed after the notice was upgraded." - }, - "setSkipShortcut": { - "message": "Spring segment over", - "description": "Keybind label" - }, - "setStartSponsorShortcut": { - "message": "Start/stop segment", - "description": "Keybind label" - }, - "setSubmitKeybind": { - "message": "Indsend segmenter", - "description": "Keybind label" - }, - "nextChapterKeybind": { - "message": "Næste kapitel", - "description": "Keybind label" - }, - "previousChapterKeybind": { - "message": "Forrige kapitel", - "description": "Keybind label" - }, - "keybindDescription": { - "message": "Velg en tast ved at trykke på den og vælg de modificeringstaster du ønsker at bruge." - }, - "0": { - "message": "Forbindelsestimeout. Tjek din internetforbindelse. Hvis dit internet fungerer, er serveren sandsynligvis overbelastet eller nede." - }, - "disableSkipping": { - "message": "Spring over er aktiveret" - }, - "enableSkipping": { - "message": "Spring over er deaktiveret" - }, - "yourWork": { - "message": "Dit Arbejde", - "description": "Used to describe the section that will show you the statistics from your submissions." - }, - "502": { - "message": "Serveren virker at være overbelastet. Prøv igen om et par sekunder." - }, - "errorCode": { - "message": "Fejlkode: " - }, - "skip": { - "message": "Spring Over" - }, - "mute": { - "message": "Gør Tavs" - }, - "full": { - "message": "Fuld Video", - "description": "Used for the name of the option to label an entire video as sponsor or self promotion." - }, - "skip_category": { - "message": "Spring {0} over?" - }, - "mute_category": { - "message": "Gør {0} tavs?" - }, - "skip_to_category": { - "message": "Spring til {0}?", - "description": "Used for skipping to things (Skip to Highlight)" - }, - "skipped": { - "message": "{0} Sprunget Over", - "description": "Example: Sponsor Skipped" - }, - "muted": { - "message": "{0} Tavsgjort", - "description": "Example: Sponsor Muted" - }, - "skipped_to_category": { - "message": "Skipped til {0}", - "description": "Used for skipping to things (Skipped to Highlight)" - }, - "disableAutoSkip": { - "message": "Deaktiver Auto-Skip" - }, - "enableAutoSkip": { - "message": "Aktiver Auto-Skip" - }, - "audioNotification": { - "message": "Lydnofikation på Skip" - }, - "audioNotificationDescription": { - "message": "Lydnotifikation ved skip vil spille en lyd når et segment skippes. Hvis deaktiveret (eller auto-skip er deaktiveret) vil ingen lyd blive spillet." - }, - "showTimeWithSkips": { - "message": "Vis Tid Med Skip Fjernet" - }, - "showTimeWithSkipsDescription": { - "message": "Denne tid vises i parantes ved siden af den aktuelle tid under søgelinjen. Dette viser den totale videovarighed minus alle segmenter. Dette inkluderer segmenter markeret som kun \"Vis I Søgelinjen\"." - }, - "youHaveSkipped": { - "message": "Du har sprunget over " - }, - "minLower": { - "message": "minut" - }, - "minsLower": { - "message": "minutter" - }, - "hourLower": { - "message": "time" - }, - "hoursLower": { - "message": "timer" - }, - "youHaveSavedTime": { - "message": "Du har sparret folk", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "youHaveSavedTimeEnd": { - "message": " af deres liv", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "statusReminder": { - "message": "Tjek status.sponsor.ajay.app for serverstatus." - }, - "changeUserID": { - "message": "Importer/Eksporter Dit Private User-ID" - }, - "whatChangeUserID": { - "message": "Dette bør holdes privat. Det er ligesom en adgangskode og bør ikke deles med nogen. Hvis nogen har dette, kan de udgive sig for at være dig. Hvis du leder efter dit offentlige bruger-ID, skal du klikke på udklipsholderikonet i popup-vinduet." - }, - "setUserID": { - "message": "Set Privat Bruger-ID" - }, - "userIDChangeWarning": { - "message": "Advarsel: Ændring af private Bruger-IDet er permanent. Er du sikker på, at du vil gøre det? Sørg for at sikkerhedskopiere din gamle for en sikkerheds skyld." - }, - "createdBy": { - "message": "Oprettet Af" - }, - "supportOtherSites": { - "message": "Understøtter tredjeparts YouTube sider" - }, - "supportOtherSitesDescription": { - "message": "Understøt tredjeparts YouTube klienter. For at aktivere understøttelse, skal du acceptere de ekstra tilladelser. Dette virker IKKE i inkognito på Chrome og andre Chromium varianter.", - "description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube" - }, - "supportedSites": { - "message": "Understøttede Sider: " - }, - "optionsInfo": { - "message": "Aktiver Invidious understøttelse, deaktiver auto spring over, skjul knapper og mere." - }, - "addInvidiousInstance": { - "message": "Tilføj Tredjeparts Klientinstans" - }, - "addInvidiousInstanceDescription": { - "message": "Tilføj brugerdefineret instans. Dette skal formateres med KUN domænet. Eksempel: invidious.ajay.app" - }, - "add": { - "message": "Tilføj" - }, - "addInvidiousInstanceError": { - "message": "Dette er et ugyldigt domæne. Dette bør KUN omfatte domænedele. Eksempel: invidious.ajay.app" - }, - "resetInvidiousInstance": { - "message": "Nulstil Liste over Invidious-Instanser" - }, - "resetInvidiousInstanceAlert": { - "message": "Du er ved at nulstille listen over Invidious-instancer" - }, - "currentInstances": { - "message": "Nuværende Instans:" - }, - "minDuration": { - "message": "Minimumsvarighed (sekunder):" - }, - "minDurationDescription": { - "message": "Segmenter kortere end den indstillede værdi vil ikke blive sprunget over eller vist i spilleren." - }, - "enableManualSkipOnFullVideo": { - "message": "Spring manuelt over, når en fuld video etiket findes" - }, - "whatManualSkipOnFullVideo": { - "message": "For folk, som ønsker at se videoen uafbrudt, hvis det er fuldt sponsoreret eller selvpromovering." - }, - "skipNoticeDuration": { - "message": "Spring meddelelsesvarighed over (sekunder):" - }, - "skipNoticeDurationDescription": { - "message": "Overspringsmeddelelsen vil blive på skærmen i mindst så længe. For manuel spring, kan den være synlig i længere tid." - }, - "shortCheck": { - "message": "Den følgende indsendelse er kortere end din minimums varighed indstilling. Dette kan betyde, at den allerede er indsendt, og bare bliver ignoreret på grund af denne indstilling. Er du sikker på, at du vil indsende?" - }, - "liveOrPremiere": { - "message": "Indendeslse på en aktiv livestream eller premiere er ikke tilladt. Vent venligst indtil den er færdig og opdater derefter siden og bekræft, at segmenterne stadig er gyldige." - }, - "showUploadButton": { - "message": "Vis Upload-Knap" - }, - "customServerAddress": { - "message": "SponsorBlock Serveradresse" - }, - "customServerAddressDescription": { - "message": "Adressen SponsorBlock bruger til at foretage opkald til serveren. Med mindre du har din egen serverinstans, bør dette ikke ændres." - }, - "save": { - "message": "Gem" - }, - "reset": { - "message": "Nulstil" - }, - "customAddressError": { - "message": "Denne adresse er ikke i den rigtige form. Sørg for at du har http:// eller https:// i begyndelsen og ingen efterfølgende skråstreger." - }, - "areYouSureReset": { - "message": "Er du sikker på, at du ønsker at nulstille dette?" - }, - "mobileUpdateInfo": { - "message": "m.youtube.com understøttes nu" - }, - "exportOptions": { - "message": "Importer/Eksporter Alle Indstillinger" - }, - "exportOptionsCopy": { - "message": "Rediger/kopier" - }, - "exportOptionsDownload": { - "message": "Gem til fil" - }, - "exportOptionsUpload": { - "message": "Indlæs fra fil" - }, - "whatExportOptions": { - "message": "Dette er hele din konfiguration i JSON. Dette inkluderer dit private bruger-ID, så sørg for at dele dette med omtanke." - }, - "setOptions": { - "message": "Indstil Indstillinger" - }, - "exportOptionsWarning": { - "message": "Advarsel: Ændring af indstillingerne er permanent, og kan ødelægge din installation. Er du sikker på, at du vil gøre dette? Sørg for at sikkerhedskopiere din gamle for en sikkerheds skyld." - }, - "incorrectlyFormattedOptions": { - "message": "Denne JSON er ikke formateret korrekt. Dine indstillinger er ikke blevet ændret." - }, - "confirmNoticeTitle": { - "message": "Indsend Segment" - }, - "submit": { - "message": "Indsend" - }, - "cancel": { - "message": "Annuller" - }, - "delete": { - "message": "Slet" - }, - "preview": { - "message": "Forhåndsvisning" - }, - "unsubmitted": { - "message": "Ikke Indsendt" - }, - "inspect": { - "message": "Undersøg" - }, - "edit": { - "message": "Rediger" - }, - "copyDebugInformation": { - "message": "Kopier Fejlretningsoplysninger Til Udklipsholder" - }, - "copyDebugInformationFailed": { - "message": "Det lykkedes ikke at skrive til udklipsholderen" - }, - "copyDebugInformationOptions": { - "message": "Kopierer information til udklipsholderen, der skal leveres til en udvikler, når en fejl indberettes / når en udvikler anmoder om det. Følsomme oplysninger som dit bruger-ID, hvidlistede kanaler og brugerdefineret serveradresse er blevet fjernet. Dog indeholder det oplysninger som din brugeragent, browser, operativsystem og versionsnummer for udvidelsen. " - }, - "copyDebugInformationComplete": { - "message": "Fejlfindingsinformationen er blevet kopieret til klippebordet. Du er velkommen til at fjerne alle oplysninger, du helst ikke vil dele. Gem dette i en tekstfil eller indsæt i fejlrapporten." - }, - "keyAlreadyUsed": { - "message": "Denne genvej er budnet til en anden handling. Vælg venligst en anden." - }, - "to": { - "message": "til", - "description": "Used between segments. Example: 1:20 to 1:30" - }, - "CopiedExclamation": { - "message": "Kopieret!", - "description": "Used after something has been copied to the clipboard. Example: 'Copied!'" - }, - "generic_guideline1": { - "message": "Inkludér segue-overgange" - }, - "generic_guideline2": { - "message": "Spiller som om intet blev sprunget over" - }, - "category_sponsor": { - "message": "Sponsor" - }, - "category_sponsor_description": { - "message": "Betalt kampagne, betalte henvisninger og direkte reklamer. Ikke for selvpromoverende eller gratis shoutouts til årsager/skabere/hjemmesider/produkter, de kan lide." - }, - "category_sponsor_guideline1": { - "message": "Betalt markedsføring" - }, - "category_sponsor_guideline2": { - "message": "Ikke til donationer eller custom merch" - }, - "category_selfpromo": { - "message": "Ubetalt/Egen Markedsføring" - }, - "category_selfpromo_description": { - "message": "Ligesom \"sponsor\" bortset fra ubetalt- eller selfmarkedsføring. Dette inkluderer sektioner om merchandise, donationer eller oplysninger om hvem, de har samarbejdet med." - }, - "category_selfpromo_guideline1": { - "message": "Donationer, medlemskaber og custom merch" - }, - "category_selfpromo_guideline2": { - "message": "Gratis shoutouts, der ikke føjer til videoen" - }, - "category_selfpromo_guideline3": { - "message": "Ikke for produkter og merchandise designet af virksomheder" - }, - "category_exclusive_access": { - "message": "Eksklusiv Adgang" - }, - "category_exclusive_access_description": { - "message": "Kun til mærkning af hele videor. Bruges, når en video viser et produkt, tjeneste eller sted, som de har modtaget gratis eller subsidieret adgang til." - }, - "category_exclusive_access_pill": { - "message": "Denne video viser et produkt, tjeneste eller et sted, som de har modtaget gratis eller subsidieret adgang til", - "description": "Short description for this category" - }, - "category_exclusive_access_guideline1": { - "message": "Hele videoen viser noget med gratis eller subsidieret adgang" - }, - "category_interaction": { - "message": "Påmindelse Om Interaktion (Abonnement)" - }, - "category_interaction_description": { - "message": "Når der er en kort påmindelse om at like, abonnere eller følge dem midt i indholdet. Hvis den er lang eller om noget specifikt, bør den i stedet være under selvpromovering." - }, - "category_interaction_guideline1": { - "message": "Korte påmindelser om at synes godt om, abonnere eller følge" - }, - "category_interaction_guideline2": { - "message": "Indeholder indirekte påmindelser om at kommentere" - }, - "category_interaction_guideline3": { - "message": "Ikke til generel markedsføring, kun opfordringer til handling" - }, - "category_interaction_short": { - "message": "Påmindelse Om Interaktion" - }, - "category_intro": { - "message": "Pause/Intro-Animation" - }, - "category_intro_description": { - "message": "Et interval uden reelt indhold. Kunne være en pause, statisk ramme, gentagelse af animation. Dette bør ikke bruges til overgange som indeholder information." - }, - "category_intro_short": { - "message": "Pause" - }, - "category_intro_guideline1": { - "message": "Interval uden egentligt indhold" - }, - "category_intro_guideline2": { - "message": "Ikke for overgange med information" - }, - "category_outro": { - "message": "Slutkort/Kreditter" - }, - "category_outro_description": { - "message": "Medvirkende eller når YouTube-endcards vises. Ikke for konklusioner med information." - }, - "category_outro_guideline1": { - "message": "Inkludér ikke indhold, selvom endcards er på skærmen" - }, - "category_preview": { - "message": "Forhåndsvisning/Opsamling" - }, - "category_preview_description": { - "message": "Samling af klip, der viser, hvad der kommer op i denne video eller andre videoer i en serie, hvor alle oplysninger gentages senere i videoen." - }, - "category_preview_guideline1": { - "message": "Klip, der vises senere eller i en fremtidig video" - }, - "category_preview_guideline2": { - "message": "Resumé af en tidligere video" - }, - "category_preview_guideline3": { - "message": "Ikke for afsnit, der tilføjer yderligere indhold" - }, - "category_filler": { - "message": "Fyldningstangent/Jokes" - }, - "category_filler_description": { - "message": "Tangential scener kun tilføjet for fyldstof eller humor, som ikke er nødvendige for at forstå videoens hovedindhold. Dette bør ikke omfatte segmenter, der gtiver kontekst eller bagrundsoplysninger\"." - }, - "category_filler_short": { - "message": "Fyldstof" - }, - "category_filler_guideline1": { - "message": "Tangentielle scener kun for fyld eller humor" - }, - "category_filler_guideline2": { - "message": "Distraktioner, bloopers, replays" - }, - "category_filler_guideline3": { - "message": "Ikke for scener, der er nødvendige for at forstå emnet" - }, - "category_music_offtopic": { - "message": "Musik: Ikke-Musikalsk Sektion" - }, - "category_music_offtopic_description": { - "message": "Kun til brug i musikvideoer. Dette bør kun bruges til sektioner af musikvideoer, der ikke allerede er dækket af en anden kategori." - }, - "category_music_offtopic_short": { - "message": "Ikke-Musikalsk" - }, - "category_music_offtopic_guideline1": { - "message": "Afsnit, der ikke findes i officielle udgivelser" - }, - "category_music_offtopic_guideline2": { - "message": "Ikke-musik i en live-optræden" - }, - "category_poi_highlight": { - "message": "Fremhæv" - }, - "category_poi_highlight_description": { - "message": "Den del af videoen, som de fleste mennesker leder efter. Svarende til \"Video starter ved x\" kommentarer." - }, - "category_poi_highlight_guideline1": { - "message": "Afsnit, som de fleste mennesker leder efter" - }, - "category_poi_highlight_guideline2": { - "message": "Kan springe kontekst over" - }, - "category_poi_highlight_guideline3": { - "message": "Kan springe til titlen eller thumbnailen" - }, - "category_chapter": { - "message": "Kapitel" - }, - "category_chapter_description": { - "message": "Brugerdefinerede navngivne kapitler, der beskriver store afsnit af en video." - }, - "category_chapter_guideline1": { - "message": "Undlad at nævne sponsor mærkenavne" - }, - "category_chapter_guideline2": { - "message": "Brug større kapitler til generelle sektioner" - }, - "category_chapter_guideline3": { - "message": "Mindre kapitler kan placeres inde i større kapitler" - }, - "category_livestream_messages": { - "message": "Livestream: Donations-/Beskedsaflæsning" - }, - "category_livestream_messages_short": { - "message": "Læsning Af Meddelelser" - }, - "autoSkip": { - "message": "Auto Spring Over" - }, - "manualSkip": { - "message": "Manuel Spring Over" - }, - "showOverlay": { - "message": "Vis I Søgebar" - }, - "disable": { - "message": "Deaktiver" - }, - "autoSkip_POI": { - "message": "Spring automatisk til starten" - }, - "manualSkip_POI": { - "message": "Spørg, når videoen indlæses" - }, - "showOverlay_POI": { - "message": "Vis I Søgebar" - }, - "showOverlay_full": { - "message": "Vis Etiket" - }, - "showOverlay_chapter": { - "message": "Vis Kapitler" - }, - "autoSkipOnMusicVideos": { - "message": "Spring automatisk over alle segmenter, når der er et ikke-musik-segment" - }, - "muteSegments": { - "message": "Tillad segmenter som dæmper lyden i stedet for at springe over" - }, - "fullVideoSegments": { - "message": "Vis et ikon, når en video udelukkende er en reklame", - "description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo" - }, - "previewColor": { - "message": "Ikke-Indsendt Farve", - "description": "Referring to submissions that have not been sent to the server yet." - }, - "seekBarColor": { - "message": "Søgebarsfarve" - }, - "category": { - "message": "Kategori" - }, - "skipOption": { - "message": "Spring Over Indstillinger", - "description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)" - }, - "enableTestingServer": { - "message": "Aktiver Betatestserver" - }, - "whatEnableTestingServer": { - "message": "Dine indsendelser og stemmer TÆLLER IKKE med i hovedserveren. Brug kun dette til testformål." - }, - "testingServerWarning": { - "message": "Alle indsendelser og stemmer TÆLLES IKKE med i hovedserveren, når du opretter forbindelse til testserveren. Sørg for at deaktivere dette, når du ønsker at foretage rigtige indsendelser." - }, - "bracketNow": { - "message": "(Nu)" - }, - "moreCategories": { - "message": "Flere Kategorier" - }, - "chooseACategory": { - "message": "Vælg en Kategori" - }, - "enableThisCategoryFirst": { - "message": "Hvis du vil indsende segmenter med kategorien \"{0}\", skal du aktivere den i indstillingerne. Du vil blive omdirigeret til indstillingerne nu.", - "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 have maksimalt en aktiv ad gangen. Indsendelse af flere vil få en tilfældig til at blive vist." - }, - "youMustSelectACategory": { - "message": "Du skal vælge en kategori for alle segmenter, du indsender!" - }, - "bracketEnd": { - "message": "(Slut)" - }, - "End": { - "message": "Slutning", - "description": "Button that skips to the end of a segment" - }, - "hiddenDueToDownvote": { - "message": "skjult: nedstem" - }, - "hiddenDueToDuration": { - "message": "skjult: for kort" - }, - "manuallyHidden": { - "message": "manuelt skjult" - }, - "channelDataNotFound": { - "description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.", - "message": "Kanal-ID er ikke indlæst endnu. Hvis du bruger en integreret video, så prøv i stedet at bruge YouTube-hjemmesiden. Dette kunne også være forårsaget af ændringer i YouTube-layout. Hvis du mener det, så lav en kommentar her:" - }, - "invidiousPermissionRefresh": { - "message": "Browseren har ophævet tilladelserne til at fungere på Invidious eller andre tredjepartssider. Klik venligst op knappen nedenfor for at genaktivere denne tilladelse." - }, - "acceptPermission": { - "message": "Accepter tilladelse" - }, - "permissionRequestSuccess": { - "message": "Tilladelsesandmodning lykkedes!" - }, - "permissionRequestFailed": { - "message": "Tilladelsesanmodning mislykkedes, klikkede du på afvis?" - }, - "adblockerIssueWhitelist": { - "message": "Hvis du ikke kan løse dette problem, skal du deaktivere indstillingen 'Tving Kanaltjek Inden Springning', da SponsorBlock ikke er i stand til at hente kanaloplysningerne for denne video" - }, - "forceChannelCheck": { - "message": "Tving Kanaltjek Inden Springning" - }, - "whatForceChannelCheck": { - "message": "Som standard vil den springe segmenter over med det samme, før den overhovedet ved, hvad kanalen er. Som standard kan nogle segmenter i starten af videoen blive sprunget over på kanaler på whitelisten. Hvis du aktiverer denne indstilling, forhindrer du dette, men det vil medføre en lille forsinkelse, da det kan tage noget tid at få kanal-ID'et. Denne forsinkelse kan være umærkelig, hvis du har hurtigt internet." - }, - "forceChannelCheckPopup": { - "message": "Overvej At Aktivere \"Tving Kanaltjek Inden Springning\"" - }, - "downvoteDescription": { - "message": "Ukorrekt/Forkert Timing" - }, - "incorrectVote": { - "message": "Forkert" - }, - "harmfulVote": { - "message": "Skadelig", - "description": "Used for chapter segments when the text is harmful/offensive to remove it faster" - }, - "incorrectCategory": { - "message": "Skift Kategori" - }, - "nonMusicCategoryOnMusic": { - "message": "Denne video er kategoriseret som musik. Er du sikker på, at denne har en sponsor? Hvis dette faktisk er et \"Ikke-musik segment\", skal du åbne udvidelsesindstillingerne og aktivere denne kategori. Derefter kan du indsende dette segment som \"Ikke-musik\" i stedet for sponsor. Læs venligst retningslinjerne, hvis du er forvirret." - }, - "multipleSegments": { - "message": "Adskillige Segmenter" - }, - "guidelines": { - "message": "Retningslinjer" - }, - "readTheGuidelines": { - "message": "Læs Retningslinjerne!!", - "description": "Show the first time they submit or if they are \"high risk\"" - }, - "categoryUpdate1": { - "message": "Kategorier er her!" - }, - "categoryUpdate2": { - "message": "Åbn mulighederne for at springe intros, outros, merch osv. over." - }, - "help": { - "message": "Hjælp" - }, - "GotIt": { - "message": "Forstået", - "description": "Used as the button to dismiss a tooltip" - }, - "fullVideoTooltipWarning": { - "message": "Dette segment er stort. Hvis hele videon handler om et emne, så skift fra \"Skip\" til \"Fuld Video\". Se retningslinjerne for mere information." - }, - "categoryPillTitleText": { - "message": "Hele denne video er mærket som denne kategori og er for tæt integreret til at være i stand til at adskille" - }, - "chapterNameTooltipWarning": { - "message": "Et af dine kapitelnavne er magen til en kategori. Du bør bruge kategorier, når det er muligt i stedet." - }, - "experiementOptOut": { - "message": "Fravælg alle fremtidige eksperimenter", - "description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private." - }, - "hideForever": { - "message": "Skjul for evigt" - }, - "warningChatInfo": { - "message": "Vi bemærkede, at du lavede nogle almindelige fejl, som ikke er ondsindede" - }, - "warningTitle": { - "message": "Du fik en advarsel" - }, - "questionButton": { - "message": "Jeg har et spørgsmål" - }, - "warningConfirmButton": { - "message": "Jeg forstår årsagen" - }, - "warningError": { - "message": "Fejl under anerkendelse af advarsel:" - }, - "Donate": { - "message": "Doner" - }, - "considerDonating": { - "message": "Hjælp til at finansiere udvikling" - }, - "hideDonationLink": { - "message": "Skjul Donationslink" - }, - "darkModeOptionsPage": { - "message": "Mørk Tilstand På Indstillingssiden" - }, - "helpPageThanksForInstalling": { - "message": "Tak for at installere SponsorBlock." - }, - "helpPageReviewOptions": { - "message": "Venligst gennemgå indstillingerne nedenfor" - }, - "helpPageFeatureDisclaimer": { - "message": "Mange funktioner er deaktiveret som standard. Hvis du vil springe intros, outros over, bruge Invidious osv., skal du aktivere dem nedenfor. Du kan også skjule/vise brugergrænsefladeelementer." - }, - "helpPageHowSkippingWorks": { - "message": "Hvordan spring over virker" - }, - "helpPageHowSkippingWorks1": { - "message": "Videosegmenter vil automatisk blive sprunget over, hvis de findes i databasen. Du kan åbne popup-vinduet ved at klikke på ikonet for udvidelsen for at få et eksempel på, hvad de er." - }, - "helpPageHowSkippingWorks2": { - "message": "Når du springer et segment over, får du besked, når du springer et segment over. Hvis timingen virker forkert, kan du stemme ned ved at klikke på nedstem! Du kan også stemme i popup-vinduet." - }, - "Submitting": { - "message": "Indsendelse" - }, - "helpPageSubmitting1": { - "message": "Indsendelse kan enten ske i popup-vinduet ved at trykke på \"Segment Begynder Nu\"-knappen eller i videoafspilleren med knapperne på afspilleren." - }, - "helpPageSubmitting2": { - "message": "Clicking the play button indicated the start of a segment and clicking the stop icon indicates the end. You can prepare multiple sponsors before hitting submit. Clicking the upload button will submit. Clicking the garbage can will delete." - }, - "Editing": { - "message": "Redigering" - }, - "helpPageEditing1": { - "message": "Hvis du har lavet en fejl, kan du redigere eller slette dine segmenter, når du har klikket på pil op knappen." - }, - "helpPageTooSlow": { - "message": "Det er for langsomt" - }, - "helpPageTooSlow1": { - "message": "Der er genvejstaster, hvis du vil bruge dem. Tryk på semikolon-tasten for at angive start/slutning af en sponsor segment og klik på apostrof for at indsende. Disse kan ændres i valgmulighederne. Hvis du ikke bruger QWERTY, bør du sandsynligvis ændre tastebindingen." - }, - "helpPageCopyOfDatabase": { - "message": "Kan jeg få en kopi af databasen? Hvad sker der, hvis du forsvinder?" - }, - "helpPageCopyOfDatabase1": { - "message": "Databasen er offentlig og tilgængelig på" - }, - "helpPageCopyOfDatabase2": { - "message": "Kildekoden er frit tilgængelig. Så selvom der sker noget med mig, går dine indsendelser ikke tabt." - }, - "helpPageNews": { - "message": "Nyheder og hvordan det er lavet" - }, - "helpPageSourceCode": { - "message": "Hvor kan jeg få kildekoden?" - }, - "Credits": { - "message": "Anerkendelser" - }, - "LearnMore": { - "message": "Læs mere" - }, - "FullDetails": { - "message": "Alle Detaljer" - }, - "CopyDownvoteButtonInfo": { - "message": "Nedstemmer og opretter en lokal kopi for dig at genindsende" - }, - "OpenCategoryWikiPage": { - "message": "Åbn denne kategoris wikiside." - }, - "CopyAndDownvote": { - "message": "Kopier og nedstem" - }, - "ContinueVoting": { - "message": "Fortsæt Afstemning" - }, - "ChangeCategoryTooltip": { - "message": "Dette vil øjeblikkeligt gælde for dine indsendelser" - }, - "downvote": { - "message": "Downvote" - }, - "upvote": { - "message": "Upvote" - }, - "hideSegment": { - "message": "Skjul segment" - }, - "skipSegment": { - "message": "Spring segment over" - }, - "playChapter": { - "message": "Afspil kapitel" - }, - "SponsorTimeEditScrollNewFeature": { - "message": "Brug musehjulet, mens du holder musen over redigeringsfeltet for hurtigt at justere tiden. Kombinationer af ctrl eller shift-tastenerne kan bruges til at finjustere ændringerne." - }, - "categoryPillNewFeature": { - "message": "Ny! Se når en video er helt sponsoreret eller selvpromoverende" - }, - "dayAbbreviation": { - "message": "d", - "description": "100d" - }, - "hourAbbreviation": { - "message": "t", - "description": "100h" - }, - "optionsTabBehavior": { - "message": "Adfærd", - "description": "Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabInterface": { - "message": "Grænseflade", - "description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabKeyBinds": { - "message": "Tastaturgenveje", - "description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabBackup": { - "message": "Sikkerhedskopier/Gendan", - "description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabAdvanced": { - "message": "Diverse", - "description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "noticeVisibilityLabel": { - "message": "Spring meddelelsesvisning over", - "description": "Option label" - }, - "unbind": { - "message": "Adskil", - "description": "Unbind keyboard shortcut" - }, - "notSet": { - "message": "Ikke indstillet" - }, - "change": { - "message": "Skift" - }, - "youtubeKeybindWarning": { - "message": "Dette er en indbygget Youtube-genvej. Er du sikker på, at du vil bruge den?" - }, - "betaServerWarning": { - "message": "BETA Server er aktiveret!" - }, - "openOptionsPage": { - "message": "Åbn indstillinger" - }, - "resetToDefault": { - "message": "Nulstil indstillinger til standard" - }, - "confirmResetToDefault": { - "message": "Er du sikker på, at du vil nulstille alle indstillinger til deres standardværdier? Dette kan ikke fortrydes." - }, - "exportSegments": { - "message": "Eksporter segmenter" - }, - "importSegments": { - "message": "Importer segmenter" - }, - "Import": { - "message": "Importer", - "description": "Button to initiate importing segments. Appears under the textbox where they paste in the data" - }, - "redeemSuccess": { - "message": "Indløsning Lykkedes!" - }, - "redeemFailed": { - "message": "Licensnøglen er ugyldig" - }, - "hideUpsells": { - "message": "Skjul utilgængelige muligheder uden ekstra betaling" - }, - "chooseACountry": { - "message": "Vælg et land" - }, - "noDiscount": { - "message": "Du kvalificerer dig ikke til en rabat" - }, - "discountLink": { - "message": "Rabat Link (Se den lyserøde pris)" - }, - "selectYourCountry": { - "message": "Vælg dit land" - }, - "alreadyDonated": { - "message": "Hvis du har doneret et beløb før, kan du indløse gratis adgang via e-mail:", - "description": "After the colon is an email address" - }, - "cantAfford": { - "message": "Hvis du ikke har råd til at købe en licens, så klik på {here} for at se, om du er berettiget til en rabat", - "description": "Keep the curly braces. The word 'here' should be translated as well." - }, - "patreonSignIn": { - "message": "Log på med Patreon" - }, - "redeem": { - "message": "Indløs" - }, - "joinOnPatreon": { - "message": "Abonner på Patreon" - }, - "oneTimePurchase": { - "message": "Engangskøb" - }, - "enterLicenseKey": { - "message": "Indtast Licensnøgle" - }, - "chaptersPage1": { - "message": "SponsorBlock crowd-sourced kapitler funktion er kun tilgængelig for personer, der køber en licens, eller for personer, der har fået gratis adgang på grund af deres tidligere bidrag" - }, - "chaptersPage2": { - "message": "Bemærk: Tilladelse til at indsende kapitler er stadig baseret på beregnet omdømme. Indkøb af en licens giver dig kun mulighed for at se kapitler indsendt af andre", - "description": "On the chapters page for getting access to the paid chapters feature" - }, - "chapterNewFeature": { - "message": "Ny funktion: Crowd-sourced brugerdefinerede kapitler. Disse er brugerdefinerede sektioner i videoer, der kan stables for at få mere og mere præcise. Køb en licens til at se kapitlerne indsendt på denne video såsom: ", - "description": "After the comma, a list of chapters for this video will appear" - }, - "chapterNewFeature2": { - "message": "Ny funktion: Crowd-sourced brugerdefinerede kapitler. Disse er brugerdefinerede sektioner i videoer, der kan stables for at få mere og mere præcise. Du har gratis adgang, aktiver i indstillinger." - }, - "unsubmittedSegmentCounts": { - "message": "Du har lige nu {0} på {1}", - "description": "Example: You currently have 12 unsubmitted segments on 5 videos" - }, - "unsubmittedSegmentCountsZero": { - "message": "Du har i øjeblikket ingen uindsendte segmenter", - "description": "Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments" - }, - "unsubmittedSegmentsSingular": { - "message": "ikke-indsendt segment", - "description": "Example: You currently have 1 *unsubmitted segment* on 1 video" - }, - "unsubmittedSegmentsPlural": { - "message": "ikke-indsendte segmenter", - "description": "Example: You currently have 12 *unsubmitted segments* on 5 videos" - }, - "videosSingular": { - "message": "video", - "description": "Example: You currently have 3 unsubmitted segments on 1 *video*" - }, - "videosPlural": { - "message": "videoer", - "description": "Example: You currently have 12 unsubmitted segments on 5 *videos*" - }, - "clearUnsubmittedSegments": { - "message": "Ryd alle segmenter", - "description": "Label for a button in settings" - }, - "clearUnsubmittedSegmentsConfirm": { - "message": "Er du sikker på, at du vil rydde alle dine uindsendte segmenter?", - "description": "Confirmation message for the Clear unsubmitted segments button" - }, - "showUnsubmittedSegments": { - "message": "Vis segmenter", - "description": "Show/hide button for the unsubmitted segments list" - }, - "hideUnsubmittedSegments": { - "message": "Skjul segmenter", - "description": "Show/hide button for the unsubmitted segments list" - }, - "videoID": { - "message": "Video ID", - "description": "Header of the unsubmitted segments list" - }, - "segmentCount": { - "message": "Segmentantal", - "description": "Header of the unsubmitted segments list" - }, - "actions": { - "message": "Handlinger", - "description": "Header of the unsubmitted segments list" - }, - "exportSegmentsAsURL": { - "message": "Del som URL" - } -} diff --git a/public/_locales/de/messages.json b/public/_locales/de/messages.json deleted file mode 100644 index 304c87a6..00000000 --- a/public/_locales/de/messages.json +++ /dev/null @@ -1,1247 +0,0 @@ -{ - "fullName": { - "message": "SponsorBlock für YouTube - Überspringe gesponserte Videosegmente", - "description": "Name of the extension." - }, - "Description": { - "message": "Überspringe gesponserte Inhalte, Aufforderungen zum Interagieren und mehr in YouTube-Videos. Markiere Sponsoren in Videos, um anderen die Zeit zu ersparen.", - "description": "Description of the extension." - }, - "400": { - "message": "Der Server meldet, dass diese Anfrage ungültig war." - }, - "429": { - "message": "Du hast zu viele Segmente für dieses Video eingereicht. Sind es wirklich so viele?" - }, - "409": { - "message": "Dieser Inhalt wurde bereits eingereicht." - }, - "channelWhitelisted": { - "message": "Der Kanal wurde auf die Whitelist gesetzt!" - }, - "Segment": { - "message": "Segment" - }, - "Segments": { - "message": "Segmente" - }, - "SegmentsCap": { - "message": "Segmente" - }, - "Chapters": { - "message": "Kapitel" - }, - "renderAsChapters": { - "message": "Zeige Segmente als Kapitel", - "description": "Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system" - }, - "showSegmentNameInChapterBar": { - "message": "Aktuelles Segment neben der Videozeit anzeigen" - }, - "upvoteButtonInfo": { - "message": "Diese Einreichung positiv bewerten" - }, - "reportButtonTitle": { - "message": "Melden" - }, - "reportButtonInfo": { - "message": "Beitrag als unzulässig melden." - }, - "Dismiss": { - "message": "Abbrechen" - }, - "Loading": { - "message": "Lädt..." - }, - "Hide": { - "message": "Verstecken" - }, - "hitGoBack": { - "message": "Klicke auf \"Nicht überspringen\" um die Aktion rückgängig zu machen." - }, - "unskip": { - "message": "Nicht überspringen" - }, - "reskip": { - "message": "Nochmal überspringen" - }, - "unmute": { - "message": "Ton an" - }, - "paused": { - "message": "Pausiert" - }, - "manualPaused": { - "message": "Timer angehalten" - }, - "confirmMSG": { - "message": "Um einzelne Werte zu löschen oder zu ändern, klicke auf den Info-Knopf oder öffne die Erweiterungsübersicht, indem du das Erweiterungssymbol in der Ecke oben rechts anklickst." - }, - "clearThis": { - "message": "Bist du sicher, dass du Folgendes löschen möchtest?\n\n" - }, - "Unknown": { - "message": "Dein Beitrag konnte nicht übertragen werden, bitte versuche es später erneut." - }, - "sponsorFound": { - "message": "Die Datenbank enthält überspringbare Segmente für dieses Video!" - }, - "sponsor404": { - "message": "Keine Segmente gefunden" - }, - "sponsorStart": { - "message": "Segment startet jetzt" - }, - "sponsorEnd": { - "message": "Segment endet jetzt" - }, - "sponsorCancel": { - "message": "Segmenterstellung abbrechen" - }, - "noVideoID": { - "message": "Kein YouTube-Video gefunden.\nWenn dies falsch ist, aktualisiere den Tab." - }, - "refreshSegments": { - "message": "Segmente aktualisieren" - }, - "success": { - "message": "Erfolg!" - }, - "voted": { - "message": "Abgestimmt!" - }, - "serverDown": { - "message": "Der Server ist anscheinend offline. Bitte kontaktiere den Entwickler unverzüglich." - }, - "connectionError": { - "message": "Ein Verbindungsfehler ist aufgetreten. Fehlermeldung: " - }, - "clearTimes": { - "message": "Alle Segmente löschen" - }, - "openPopup": { - "message": "SponsorBlock-Pop-up öffnen" - }, - "closePopup": { - "message": "Pop-up schließen" - }, - "closeIcon": { - "message": "Symbol schließen" - }, - "SubmitTimes": { - "message": "Senden" - }, - "sortSegments": { - "message": "Segmente sortieren" - }, - "submitCheck": { - "message": "Bist du sicher, dass du dies übermitteln willst?" - }, - "whitelistChannel": { - "message": "Kanal zur Whitelist hinzufügen" - }, - "removeFromWhitelist": { - "message": "Kanal aus der Whitelist entfernen" - }, - "voteOnTime": { - "message": "Über ein Segment abstimmen" - }, - "Submissions": { - "message": "Beiträge" - }, - "savedPeopleFrom": { - "message": "Andere Nutzer bewahrt vor: " - }, - "viewLeaderboard": { - "message": "Rangliste" - }, - "recordTimesDescription": { - "message": "Senden" - }, - "submissionEditHint": { - "message": "Die Bearbeitung von Beiträgen wird angezeigt, nachdem du auf Senden klickst", - "description": "Appears in the popup to inform them that editing has been moved to the video player." - }, - "popupHint": { - "message": "Tipp: Du kannst Tastenkombinationen in den Optionen festlegen" - }, - "clearTimesButton": { - "message": "Zeiten löschen" - }, - "submitTimesButton": { - "message": "Zeiten übermitteln" - }, - "publicStats": { - "message": "So wirst du in der öffentlichen Rangliste angezeigt. Siehe" - }, - "Username": { - "message": "Benutzername" - }, - "setUsername": { - "message": "Benutzernamen festlegen" - }, - "copyPublicID": { - "message": "Öffentliche Benutzer-ID kopieren" - }, - "copySegmentID": { - "message": "Segment-ID kopieren" - }, - "discordAdvert": { - "message": "Tritt dem offiziellen Discord-Server bei und teile Anregungen und Feedback!" - }, - "hideThis": { - "message": "Verstecken" - }, - "Options": { - "message": "Optionen" - }, - "showButtons": { - "message": "Knöpfe im YouTube-Videoplayer anzeigen" - }, - "hideButtons": { - "message": "Knöpfe im YouTube-Videoplayer deaktivieren" - }, - "hideButtonsDescription": { - "message": "Versteckt die Schaltflächen im YouTube-Videoplayer, um Segmente einzusenden." - }, - "showSkipButton": { - "message": "Behalte „Zum beliebtesten Teil springen“-Schaltfläche im Wiedergabefenster" - }, - "showInfoButton": { - "message": "Zeige Info-Knopf im Youtube-Videoplayer" - }, - "hideInfoButton": { - "message": "Deaktiviere Info-Knopf im Youtube-Videoplayer" - }, - "autoHideInfoButton": { - "message": "Info-Button automatisch ausblenden" - }, - "hideDeleteButton": { - "message": "Deaktiviere den Löschen-Knopf im Youtube-Videoplayer" - }, - "showDeleteButton": { - "message": "Zeige den Löschen-Knopf im Youtube-Videoplayer" - }, - "enableViewTracking": { - "message": "Aktiviere das Zählen übersprungener Segmente" - }, - "whatViewTracking": { - "message": "Diese Funktion erfasst, welche Segmente du übersprungen hast, um andere Nutzer zu zeigen, wie hilfreich ihre Beiträge sind. Außerdem stellt dies zusammen mit positiven Bewertungen sicher, dass keine unerwünschten Inhalte in die Datenbank gelangen. Die Erweiterung sendet jedes Mal, wenn du ein Segment überspringst, eine Meldung an den Server. Hoffentlich verändern die meisten Nutzer diese Einstellung nicht, um unsere Statistik zu verbessern :)" - }, - "enableViewTrackingInPrivate": { - "message": "Aktiviere den Übersprungen Zähler in Privaten/Incognito Tabs" - }, - "enableTrackDownvotes": { - "message": "Speichere Downvotes von Segmenten" - }, - "whatTrackDownvotes": { - "message": "Alle von dir negativ bewerteten Segmente bleiben auch nach neu laden der Seite verborgen" - }, - "trackDownvotesWarning": { - "message": "Warnung: Das Deaktivieren wird alle zuvor gespeicherten negativen Bewertungen löschen" - }, - "enableQueryByHashPrefix": { - "message": "Abfrage nach Hash-Präfix" - }, - "whatQueryByHashPrefix": { - "message": "Anstatt Segmente mit der Video-ID vom Server anzufordern, werden die ersten 4 Zeichen des Hashs der Video-ID gesendet. Der Server sendet Daten für alle Videos mit ähnlichen Hashes zurück." - }, - "enableRefetchWhenNotFound": { - "message": "Segmente bei neuen Videos erneut abrufen" - }, - "whatRefetchWhenNotFound": { - "message": "Wenn das Video neu ist und keine Segmente gefunden wurden, wird während des Betrachtens alle paar Minuten erneut eine Anfrage gesendet." - }, - "enableShowCategoryWithoutPermission": { - "message": "Zeige Kategorien im Einsendungsmenü auch ohne Einreichungsberechtigungen" - }, - "whatShowCategoryWithoutPermission": { - "message": "Einige Kategorien benötigen Erlaubnis zum Übermitteln aufgrund von Mindestanforderungen an Reputation" - }, - "showNotice": { - "message": "Hinweis erneut anzeigen" - }, - "showSkipNotice": { - "message": "Zeige Pop-up nach dem Überspringen eines Segments" - }, - "showCategoryGuidelines": { - "message": "Zeige Kategorien-Hilfe" - }, - "noticeVisibilityMode0": { - "message": "Skip-Meldung in voller größe" - }, - "noticeVisibilityMode1": { - "message": "Kleine Skip-Meldung für Auto-Skips" - }, - "noticeVisibilityMode2": { - "message": "Alles kleine Skip-Meldungen" - }, - "noticeVisibilityMode3": { - "message": "Verblasste Skip-Meldung für Auto-Skip" - }, - "noticeVisibilityMode4": { - "message": "Alles verblasste Skip-Meldungen" - }, - "longDescription": { - "message": "SponsorBlock lässt dich gesponserte Videosegmente, Intros, Outros, Interaktions-Erinnerungen, Musikvideoteile ohne Musik und andere nervige Teile von YouTube-Videos überspringen. SponsorBlock ist eine crowdsourced Browser-Erweiterung, in der jeder die Start- und Endzeit gesponserter Videosegmente und anderer Segmente von YouTube-Videos einreicht. Sobald eine Person diese Informationen einreicht, überspringen alle anderen mit dieser Erweiterung das gesponserte Segment.", - "description": "Full description of the extension on the store pages." - }, - "website": { - "message": "Webseite", - "description": "Used on Firefox Store Page" - }, - "sourceCode": { - "message": "Quellcode", - "description": "Used on Firefox Store Page" - }, - "noticeUpdate": { - "message": "Die Benachrichtigung wurde verbessert!", - "description": "The first line of the message displayed after the notice was upgraded." - }, - "noticeUpdate2": { - "message": "Falls es dir trotzdem nicht gefällt, drücke auf \"Verstecken\".", - "description": "The second line of the message displayed after the notice was upgraded." - }, - "setSkipShortcut": { - "message": "Segment überspringen", - "description": "Keybind label" - }, - "setStartSponsorShortcut": { - "message": "Starte/Stoppe Segment", - "description": "Keybind label" - }, - "setSubmitKeybind": { - "message": "Segmente einreichen", - "description": "Keybind label" - }, - "nextChapterKeybind": { - "message": "Nächstes Kapitel", - "description": "Keybind label" - }, - "previousChapterKeybind": { - "message": "Vorheriges Kapitel", - "description": "Keybind label" - }, - "keybindDescription": { - "message": "Wähle eine Taste durch Eingeben aus, und wähle (optional) gewünschte Hilfstasten." - }, - "0": { - "message": "Zeitüberschreibung. Überprüfe deine Internetverbindung. Bist du mit dem Internet verbunden, ist der Server wahrscheinlich offline." - }, - "disableSkipping": { - "message": "Überspringen ist aktiviert" - }, - "enableSkipping": { - "message": "Überspringen ist deaktiviert" - }, - "yourWork": { - "message": "Deine Statistik", - "description": "Used to describe the section that will show you the statistics from your submissions." - }, - "502": { - "message": "Der Server ist wahrescheinlich überlastet. Probiere es später nochmal." - }, - "errorCode": { - "message": "Fehlermeldung: " - }, - "skip": { - "message": "Überspringen" - }, - "mute": { - "message": "Ton aus" - }, - "full": { - "message": "Vollständiges Video", - "description": "Used for the name of the option to label an entire video as sponsor or self promotion." - }, - "skip_category": { - "message": "{0} überspringen?" - }, - "mute_category": { - "message": "{0} stummschalten?" - }, - "skip_to_category": { - "message": "Zu {0} springen?", - "description": "Used for skipping to things (Skip to Highlight)" - }, - "skipped": { - "message": "{0} übersprungen", - "description": "Example: Sponsor Skipped" - }, - "muted": { - "message": "{0} stumm geschaltet", - "description": "Example: Sponsor Muted" - }, - "skipped_to_category": { - "message": "Zu {0} gesprungen", - "description": "Used for skipping to things (Skipped to Highlight)" - }, - "disableAutoSkip": { - "message": "Automatisches Überspringen deaktivieren" - }, - "enableAutoSkip": { - "message": "Automatisches Überspringen aktivieren" - }, - "audioNotification": { - "message": "Audio-Benachrichtigung beim Überspringen" - }, - "audioNotificationDescription": { - "message": "Es wird ein Ton abgespielt, wenn ein Segment übersprungen wird. Wenn deaktiviert (oder wenn Automatisches-Überspringen deaktiviert ist), wird kein Ton abgespielt." - }, - "showTimeWithSkips": { - "message": "Videodauer nach Abzug der überspringbaren Videosegmente anzeigen" - }, - "showTimeWithSkipsDescription": { - "message": "Diese Zeit wird in Klammern neben der kompletten Videodauer im YouTube-Videoplayer angezeigt. Dies betrifft auch Segmente, die als \"In Suchleiste anzeigen\" markiert sind." - }, - "youHaveSkipped": { - "message": "Du übersprangst " - }, - "minLower": { - "message": "Minute" - }, - "minsLower": { - "message": "Minuten" - }, - "hourLower": { - "message": "Stunde" - }, - "hoursLower": { - "message": "Stunden" - }, - "youHaveSavedTime": { - "message": "Du erspartest anderen", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "youHaveSavedTimeEnd": { - "message": " ihres Lebens", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "statusReminder": { - "message": "Prüfe status.sponsor.ajay.app für den Serverstatus." - }, - "changeUserID": { - "message": "Private Benutzer-ID importieren/exportieren" - }, - "whatChangeUserID": { - "message": "Dies sollte geheim gehalten und wie ein Passwort behandelt, also mit niemandem geteilt werden. Andere könnten sich damit als dich ausgeben. Wenn du nach deiner öffentlichen Profilkennung suchst, klicke auf das „Kopieren“-Symbol neben deinem Anmeldenamen im Pop-up." - }, - "setUserID": { - "message": "Private Benutzer-ID festlegen" - }, - "userIDChangeWarning": { - "message": "Warnung: Das Ändern deiner privaten Benutzer-ID ist permanent. Bist du dir sicher, dass du das tun möchtest? Zur Sicherheit solltest du vorher ein Backup deiner alten ID erstellen." - }, - "createdBy": { - "message": "Erstellt von" - }, - "supportOtherSites": { - "message": "Unterstütze Drittanbieter YouTube-Seiten" - }, - "supportOtherSitesDescription": { - "message": "Unterstütze Drittanbieter YouTube Clients. Zum unterstützen müssen zusätzlichliche Berechtigungen akzeptiert werden. Dies funktioniert NICHT im Incognitomodus auf Chrome oder anderen Chromium Varianten.", - "description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube" - }, - "supportedSites": { - "message": "Unterstützte Seiten: " - }, - "optionsInfo": { - "message": "Zu überspringende Kategorien auswählen, automatisches Überspringen, Tasten ein- & ausblenden und noch viel mehr." - }, - "addInvidiousInstance": { - "message": "Client-Instanz eines Drittanbieters hinzufügen" - }, - "addInvidiousInstanceDescription": { - "message": "Füge eine benutzerdefinierte Invidious-Instanz hinzu. Diese darf nur den Domain-Teil beinhalten. Beispiel: \"invidious.ajay.app\"" - }, - "add": { - "message": "Hinzufügen" - }, - "addInvidiousInstanceError": { - "message": "Dies ist eine ungültige Domain. Dies soll NUR den Domain-Teil beinhalten. Beispiel: invidious.ajay.app" - }, - "resetInvidiousInstance": { - "message": "Invidious-Instanzliste zurücksetzen" - }, - "resetInvidiousInstanceAlert": { - "message": "Du bist dabei, die Liste der Invidious-Instanzen zurückzusetzen" - }, - "currentInstances": { - "message": "Aktuelle Instanzen:" - }, - "minDuration": { - "message": "Minimale Dauer (Sekunden):" - }, - "minDurationDescription": { - "message": "Videosegmente, die kürzer als der festgelegte Wert sind, werden nicht übersprungen oder im Player angezeigt." - }, - "enableManualSkipOnFullVideo": { - "message": "Verwende manuelles Überspringen, wenn ein vollständiges Video Label existiert" - }, - "whatManualSkipOnFullVideo": { - "message": "Für Personen, welche ein Video ohne Unterbrechungen schauen wollen, während es vollständig gesponsert oder Eigenwerbung ist." - }, - "skipNoticeDuration": { - "message": "Dauer des Überspringenhinweises (Sekunden):" - }, - "skipNoticeDurationDescription": { - "message": "Die überspringen Benachrichtigung wird mindestens für so viele Sekunden angezeigt. Für manuelles Überspringen kann sie länger sichtbar sein." - }, - "shortCheck": { - "message": "Die folgende Einsendung ist kürzer als deine Mindestdauer. Das könnte bedeuten, dass dieses Videosegment bereits eingereicht wurde und aufgrund dieser Option einfach ignoriert wird. Bist du dir sicher, dass du es übermitteln möchtest?" - }, - "liveOrPremiere": { - "message": "Das Einreichen eines aktiven Livestreams oder Premiere ist nicht erlaubt. Bitte warte bis es zu ende ist, lade die Seite neu und überprüfe, dass die Segmente noch immer korrekt sind." - }, - "showUploadButton": { - "message": "Upload-Knopf anzeigen" - }, - "customServerAddress": { - "message": "SponsorBlock Serveradresse" - }, - "customServerAddressDescription": { - "message": "Die Adresse die SponsorBlock verwendet um Anfragen an den Server zu senden. Solange du keine eigene Serverinstanz hast, sollte das nicht geändert werden." - }, - "save": { - "message": "Speichern" - }, - "reset": { - "message": "Zurücksetzen" - }, - "customAddressError": { - "message": "Die Adresse sieht nicht richtig aus. Bitte vergewisser dich, dass entweder \"http://\" oder \"https://\" am Anfang steht und keinen abschließenden Schrägstrich am Ende." - }, - "areYouSureReset": { - "message": "Bist du dir sicher, dass du das zurücksetzen möchtest?" - }, - "mobileUpdateInfo": { - "message": "https://m.youtube.com wird jetzt unterstützt" - }, - "exportOptions": { - "message": "Alle Einstellungen importieren/exportieren" - }, - "exportOptionsCopy": { - "message": "Bearbeiten/kopieren" - }, - "exportOptionsDownload": { - "message": "Als Datei speichern" - }, - "exportOptionsUpload": { - "message": "Aus Datei laden" - }, - "whatExportOptions": { - "message": "Dies ist deine gesamte Konfiguration in JSON. Sie enthält deine private Benutzer-ID, stelle also sicher, sie nicht mit jedem zu teilen." - }, - "setOptions": { - "message": "Optionen ändern" - }, - "exportOptionsWarning": { - "message": "Warnung: Das Ändern der Optionen ist permanent und kann deine Installation beschädigen. Bist du dir sicher, dass du das tun willst? Stelle sicher, dass du eine Sicherheitskopie deiner alten Optionen machst." - }, - "incorrectlyFormattedOptions": { - "message": "Dieses JSON ist nicht korrekt formatiert und kann daher nicht geladen werden. Es wurden keine Einstellungen geändert." - }, - "confirmNoticeTitle": { - "message": "Segment übermitteln" - }, - "submit": { - "message": "Übermitteln" - }, - "cancel": { - "message": "Abbrechen" - }, - "delete": { - "message": "Löschen" - }, - "preview": { - "message": "Vorschau" - }, - "unsubmitted": { - "message": "Nicht übermittelt" - }, - "inspect": { - "message": "Überprüfen" - }, - "edit": { - "message": "Bearbeiten" - }, - "copyDebugInformation": { - "message": "Debug-Informationen in Zwischenablage kopieren" - }, - "copyDebugInformationFailed": { - "message": "Fehler beim Kopieren in die Zwischenablage" - }, - "copyDebugInformationOptions": { - "message": "Kopiert Informationen in die Zwischenablage, die Entwickelnden gegebenenfalls bei Fehlermeldungen oder spezifischen Anfragen zur Verfügung gestellt werden können. Personenbezogene Daten wie deine Profilkennung, Kanäle auf der Positivliste und angepasste Server-Adressen wurden entfernt. Die Fehlerinformationen enthalten jedoch unter anderem den User Agent, den Browser, das Betriebssystem und die Versionsnummer der Erweiterung. " - }, - "copyDebugInformationComplete": { - "message": "Die Debug-Informationen wurden in die Zwischenablage kopiert. Du kannst alle Informationen entfernen, die du nicht teilen möchtest. Verwende einen Texteditor um die Informationen in einer Textdatei zu speichern (um diese ggf. einem Fehlerbericht hinzuzufügen)." - }, - "keyAlreadyUsed": { - "message": "Diese Verknüpfung ist an eine andere Aktion gebunden. Bitte wähle eine andere." - }, - "to": { - "message": "bis", - "description": "Used between segments. Example: 1:20 to 1:30" - }, - "CopiedExclamation": { - "message": "Kopiert!", - "description": "Used after something has been copied to the clipboard. Example: 'Copied!'" - }, - "generic_guideline1": { - "message": "Fließende Übergänge einbeziehen" - }, - "generic_guideline2": { - "message": "Wiedergeben, als ob nichts übersprungen worden wäre" - }, - "category_sponsor": { - "message": "Gesponserte Videosegmente" - }, - "category_sponsor_description": { - "message": "Bezahlte Werbung, bezahlte Empfehlungen und direkte Werbung, nicht für Eigenwerbung, kostenlose Fremdwerbung oder Empfehlungen für Anlässe/Personen/Webseiten/Produkte." - }, - "category_sponsor_guideline1": { - "message": "Bezahlte Werbung" - }, - "category_sponsor_guideline2": { - "message": "Nicht für Spenden oder eigene Fanartikel" - }, - "category_selfpromo": { - "message": "Unbezahlt/Eigenwerbung" - }, - "category_selfpromo_description": { - "message": "Ähnlich wie \"Gesponsorte Videosegmente\", jedoch für unbezahlte oder Eigenwerbung. Dies beinhaltet Bereiche über Merchandise, Spenden, oder Informationen darüber, mit wem zusammengearbeitet wurde." - }, - "category_selfpromo_guideline1": { - "message": "Spenden, Mitgliedschaften und eigene Fanartikel" - }, - "category_selfpromo_guideline2": { - "message": "Unentgeltliche Erwähnungen, die nicht zum Video beitragen" - }, - "category_selfpromo_guideline3": { - "message": "Nicht für Produkte und Merch von Firmen" - }, - "category_exclusive_access": { - "message": "Exklusiver Zugriff" - }, - "category_exclusive_access_description": { - "message": "Nur für das Kennzeichnen ganzer Videos. Wird verwendet wenn ein Video ein Produkt, eine Dienstleistung oder einen Ort präsentiert, zu welchem sie freien oder subventionierten Zugriff erhalten haben." - }, - "category_exclusive_access_pill": { - "message": "Dieses Video präsentiert ein Produkt, eine Dienstleistung oder einen Ort, zu welchem sie freien oder subventionierten Zugriff erhalten haben", - "description": "Short description for this category" - }, - "category_exclusive_access_guideline1": { - "message": "Das gesamte Video zeigt etwas, zu dem man kostenlosen oder subventionierten Zugang erhalten hat" - }, - "category_interaction": { - "message": "Interaktions-Erinnerungen (Abonnieren, etc.)" - }, - "category_interaction_description": { - "message": "Wenn es eine kurze Erinnerung zum \"Daumen hoch\", Abonnieren, oder Folgen in der Mitte von Inhalt gibt. Falls es lang oder über etwas bestimmtes ist, sollte es stattdessen \"Unbezahlt/Eigenwerbung\" sein." - }, - "category_interaction_guideline1": { - "message": "Kurze Erinnerungen zum Liken, Abonnieren oder Folgen" - }, - "category_interaction_guideline2": { - "message": "Enthält indirekte Erinnerungen zum Kommentieren" - }, - "category_interaction_guideline3": { - "message": "Nicht für allgemeine Förderung, nur Aufruf zum Handeln" - }, - "category_interaction_short": { - "message": "Interaktions-Erinnerung" - }, - "category_intro": { - "message": "Unterbrechung/Intro-Animation" - }, - "category_intro_description": { - "message": "Ein Videosegment ohne richtigen Inhalt. Kann eine Pause, ein Standbild oder eine sich wiederholende Animation sein. Dies sollte nicht für Übergänge verwendet werden, die Informationen enthalten." - }, - "category_intro_short": { - "message": "Unterbrechung" - }, - "category_intro_guideline1": { - "message": "Intervall ohne tatsächlichen Inhalt" - }, - "category_intro_guideline2": { - "message": "Nicht für Übergänge mit Informationen" - }, - "category_outro": { - "message": "Endkarten/Quellen/Anerkennungen" - }, - "category_outro_description": { - "message": "Credits oder wenn die YouTube-Endkarten erscheinen. Nicht für videobeendende Schlussfolgerungen mit Informationen." - }, - "category_outro_guideline1": { - "message": "Enthalten keinen Inhalt, selbst wenn Endcards zu sehen sind" - }, - "category_preview": { - "message": "Vorschau/Zusammenfassung" - }, - "category_preview_description": { - "message": "Sammlung von Clips, welche zeigen, was in diesem Video oder anderen Videos in einer Serie kommen wird, wo alle Informationen später wiederholt werden." - }, - "category_preview_guideline1": { - "message": "Clips welche später oder in einem zukünftigen Video erscheinen" - }, - "category_preview_guideline2": { - "message": "Recap eines vorherigen Videos" - }, - "category_preview_guideline3": { - "message": "Nicht für Bereiche, welche zusätzliche Inhalte geben" - }, - "category_filler": { - "message": "Füller/Witze" - }, - "category_filler_description": { - "message": "Nebensächliche Szenen, die nur als Füller oder Witz dienen und nicht benötigt sind, um den Hauptinhalt des Videos zu verstehen. Dies bezieht sich nicht auf Segmente, die Kontext oder Hintergrunddetails liefern. Dies ist eine sehr aggressive Kategorie, die dafür gedacht ist, wenn du nicht in der Stimmung für \"Spaß\" bist." - }, - "category_filler_short": { - "message": "Füller" - }, - "category_filler_guideline1": { - "message": "Tangentielle Szenen nur für Füller oder Humor" - }, - "category_filler_guideline2": { - "message": "Ablenkungen, Patzer, Replays" - }, - "category_filler_guideline3": { - "message": "Nicht für Szenen, welche zum verstehen des Topics sind" - }, - "category_music_offtopic": { - "message": "Musik: Nicht-Musik-Abschnitt" - }, - "category_music_offtopic_description": { - "message": "Nur für die Verwendung in Musikvideos. Dies sollte nur für Abschnitte von Musikvideos verwendet werden, die noch nicht von einer anderen Kategorie abgedeckt sind." - }, - "category_music_offtopic_short": { - "message": "Musikvideoteile ohne Musik" - }, - "category_music_offtopic_guideline1": { - "message": "Bereiche nicht in offiziellen Veröffentlichungen" - }, - "category_music_offtopic_guideline2": { - "message": "Nicht-Musik in einer Live-Performance" - }, - "category_poi_highlight": { - "message": "Highlight" - }, - "category_poi_highlight_description": { - "message": "Der Abschnitt des Videos, nach dem die meisten Leute suchen, ähnlich wie \"Video startet bei x\" Kommentare." - }, - "category_poi_highlight_guideline1": { - "message": "Bereiche die die meisten Personen suchen" - }, - "category_poi_highlight_guideline2": { - "message": "Kann helfen, vergangene Inhalte zu überspringen" - }, - "category_poi_highlight_guideline3": { - "message": "Kann zum Titel oder Thumbnail überspringen" - }, - "category_chapter": { - "message": "Kapitel" - }, - "category_chapter_description": { - "message": "Benutzerdefiniert benannte Kapitel, welche große Abschnitte eines Videos beschreiben." - }, - "category_chapter_guideline1": { - "message": "Sponsor-Markennamen nicht erwähnen" - }, - "category_chapter_guideline2": { - "message": "Benutze grössere Kapitel für allgemeine Abschnitte" - }, - "category_chapter_guideline3": { - "message": "Kleinere Kapitel können innerhalb von grösseren platziert werden" - }, - "category_livestream_messages": { - "message": "Livestream: Spenden/Nachrichten vorlesen" - }, - "category_livestream_messages_short": { - "message": "Nachrichten lesen" - }, - "autoSkip": { - "message": "Automatisch überspringen" - }, - "manualSkip": { - "message": "Manuelles Überspringen" - }, - "showOverlay": { - "message": "In der Video-Zeitleiste anzeigen" - }, - "disable": { - "message": "Deaktivieren" - }, - "autoSkip_POI": { - "message": "Automatisch zum Start springen" - }, - "manualSkip_POI": { - "message": "Beim Laden des Videos fragen" - }, - "showOverlay_POI": { - "message": "In Suchleiste anzeigen" - }, - "showOverlay_full": { - "message": "Zeige Label" - }, - "showOverlay_chapter": { - "message": "Kapitel zeigen" - }, - "autoSkipOnMusicVideos": { - "message": "Alle Segmente automatisch überspringen, wenn ein nicht-Musiksegment vorhanden ist" - }, - "muteSegments": { - "message": "Segmente zulassen, die den Ton ausschalten anstatt zu überspringen" - }, - "fullVideoSegments": { - "message": "Zeige ein Icon, wenn ein ganzes Video Werbung ist", - "description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo" - }, - "previewColor": { - "message": "Nicht eingereichte Farbe", - "description": "Referring to submissions that have not been sent to the server yet." - }, - "seekBarColor": { - "message": "Farbe in der Video-Zeitleiste" - }, - "category": { - "message": "Kategorie" - }, - "skipOption": { - "message": "Verhalten", - "description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)" - }, - "enableTestingServer": { - "message": "Betatest-Server aktivieren" - }, - "whatEnableTestingServer": { - "message": "Deine Beiträge und Bewertungen/Meldungen werden NICHT an den Hauptserver übertragen. Benutze diese Option also nur für Tests." - }, - "testingServerWarning": { - "message": "Alle Beiträge und Bewertungen/Meldungen werden NICHT an den Hauptserver übertragen. Deaktiviere die Betatest-Server Option um Einreichungen an den Hauptserver zu senden." - }, - "bracketNow": { - "message": "(jetzt)" - }, - "moreCategories": { - "message": "Weitere Kategorien" - }, - "chooseACategory": { - "message": "Wähle eine Kategorie" - }, - "enableThisCategoryFirst": { - "message": "Um Segmente aus der Kategorie \"{0}\" zu senden, musst du diese in den Optionen aktivieren. Du wirst jetzt zu den Optionen weitergeleitet.", - "description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options." - }, - "poiOnlyOneSegment": { - "message": "Achtung: Diese Art von Segment kann nur einmal pro Video aktiv sein. Sollten mehrere eingereicht werden, wird ein zufälliges angezeigt werden." - }, - "youMustSelectACategory": { - "message": "Du musst eine Kategorie für jedes zu übermittelnde Segment auswählen!" - }, - "bracketEnd": { - "message": "(Ende)" - }, - "End": { - "message": "Ende", - "description": "Button that skips to the end of a segment" - }, - "hiddenDueToDownvote": { - "message": "Ausgeblendet: negativ bewertet" - }, - "hiddenDueToDuration": { - "message": "Ausgeblendet: zu kurz" - }, - "manuallyHidden": { - "message": "Manuell versteckt" - }, - "channelDataNotFound": { - "description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.", - "message": "Kanal-ID ist noch nicht geladen. Falls es sich um ein eingebettetes Video handelt, probiere stattdessen die YouTube-Webseite. Dies könnte auch durch Änderungen im YouTube-Layout verursacht werden. Sollte das der Fall sein, kannst du es hier vermerken:" - }, - "invidiousPermissionRefresh": { - "message": "Der Browser hat die Berechtigung, welche zum vewenden von Invidious und anderen Drittanbieter-Seiten benötigt wird, verweigert. Bitte klicke auf die Schaltfläche unten, um diese Berechtigung zu ractivieren." - }, - "acceptPermission": { - "message": "Berechtigung erteilen" - }, - "permissionRequestSuccess": { - "message": "Die Berechtigungsanfrage war erfolgreich!" - }, - "permissionRequestFailed": { - "message": "Berechtigungsanfrage fehlgeschlagen, hast du sie abgelehnt?" - }, - "adblockerIssueWhitelist": { - "message": "Falls du dies nicht beheben kannst, deaktiviere die Einstellung 'Kanalprüfung vor dem Überspringen von Segmenten erzwingen', da SponsorBlock nicht in der Lage ist die Kanal-Informationen für dieses Video abzurufen" - }, - "forceChannelCheck": { - "message": "Kanalprüfung vor dem Überspringen von Segmenten erzwingen" - }, - "whatForceChannelCheck": { - "message": "Standardmäßig werden Segmente übersprungen, bevor SponsorBlock überhapt weiss, welcher Kanal das ist. Normalerweise führt dies dazu, dass Videosegmente von erlaubten Kanälen am Anfang übersprungen werden. Das aktivieren dieser Option verhindert dies, hat jedoch eine leichte Verzögerung beim überspringen zur folge, da die Kanal-ID erst eingelesen werden muss. Diese sollte bei einer schnellen Internetverbindung jedoch kaum bemerkbar sein." - }, - "forceChannelCheckPopup": { - "message": "Eventuell solltest du die Option \"Kanalprüfung vor dem Überspringen von Segmenten erzwingen\" aktivieren." - }, - "downvoteDescription": { - "message": "Nicht korrekt oder falsches Timing" - }, - "incorrectVote": { - "message": "Falsch" - }, - "harmfulVote": { - "message": "Schädlich", - "description": "Used for chapter segments when the text is harmful/offensive to remove it faster" - }, - "incorrectCategory": { - "message": "Kategorie ändern" - }, - "nonMusicCategoryOnMusic": { - "message": "Dieses Video ist als Musikvideo kategorisiert. Bist du dir sicher, dass es ein gesponsertes Videosegment hat? Wenn dies tatsächlich ein Musikvideoteil ohne Musik ist, öffne die Optionen von SponsorBlock und aktiviere diese Kategorie. Danach kannst du dieses Segment als solches markieren. Bitte lese die Richtlinien, wenn du dir nicht sicher bist." - }, - "multipleSegments": { - "message": "Mehrere Segmente" - }, - "guidelines": { - "message": "Richtlinien" - }, - "readTheGuidelines": { - "message": "Lese die Richtlinien!", - "description": "Show the first time they submit or if they are \"high risk\"" - }, - "categoryUpdate1": { - "message": "Kategorien sind hier!" - }, - "categoryUpdate2": { - "message": "Öffne die Optionen um das Verhalten bei Intros, Outros, Merchandising (Fanartikel) usw. einzustellen." - }, - "help": { - "message": "Hilfe" - }, - "GotIt": { - "message": "Verstanden", - "description": "Used as the button to dismiss a tooltip" - }, - "fullVideoTooltipWarning": { - "message": "Dieses Segment ist lang. Wenn das gesamte Video nur ein Thema behandelt, wechsle von \"Überspringen\" zu \"Ganzes Video\". Erfahre mehr in den Richtlinien." - }, - "categoryPillTitleText": { - "message": "Das gesamte Video fällt unter diese Kategorie und ist zu stark integriert, um es zu trennen" - }, - "chapterNameTooltipWarning": { - "message": "Eines deiner Kapitelnamen ähnlet einer Kategorie. Du solltest Kategorien verwenden, wenn möglich." - }, - "experiementOptOut": { - "message": "Aus allen zukünftigen Experimenten abmelden", - "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": "Dauerhaft verbergen" - }, - "warningChatInfo": { - "message": "Wir haben bemerkt, dass du einige häufige Fehler machst welche nicht bösartig sind" - }, - "warningTitle": { - "message": "Du hast eine Verwarnung erhalten" - }, - "questionButton": { - "message": "Ich habe eine Frage" - }, - "warningConfirmButton": { - "message": "Ich verstehe den Grund" - }, - "warningError": { - "message": "Fehler beim Anerkennen der Verwarnung:" - }, - "Donate": { - "message": "Spenden" - }, - "considerDonating": { - "message": "Unterstütze die Entwicklung mit einer Spende" - }, - "hideDonationLink": { - "message": "Verstecke Spendenlink" - }, - "darkModeOptionsPage": { - "message": "Dunkler Modus auf der Optionsseite" - }, - "helpPageThanksForInstalling": { - "message": "Danke fürs installieren von SponsorBlock." - }, - "helpPageReviewOptions": { - "message": "Bitte überprüfe die unten stehenden Optionen" - }, - "helpPageFeatureDisclaimer": { - "message": "Viele Funktionen sind standardmäßig deaktiviert. Wenn du Intros und Outtros überspringen willst, Invidious verwenden willst, usw. aktiviere sie unten. Du kannst auch UI-Elemente verstecken/anzeigen." - }, - "helpPageHowSkippingWorks": { - "message": "Wie überspringen funktioniert" - }, - "helpPageHowSkippingWorks1": { - "message": "Videosegmente werden automatisch übersprungen, wenn sie in der Datenbank gefunden werden. Du kannst das Popup öffnen, indem du auf das Erweiterungssymbol klickst, um eine Vorschau darüber zu erhalten, was diese sind." - }, - "helpPageHowSkippingWorks2": { - "message": "Wann immer du ein Segment überspringst, erhältst du eine Benachrichtigung. Wenn das Timing falsch erscheint, kannst du das Segment herunter stimmen! Du kannst auch im Pop-up abstimmen." - }, - "Submitting": { - "message": "Übermitteln" - }, - "helpPageSubmitting1": { - "message": "Das übermitteln kann entweder im Popup durch das drücken vom \"Segment Started Jetzt\" Knopf oder im Videoplayer mit den Knöpfen im Player gemacht werden." - }, - "helpPageSubmitting2": { - "message": "Mit einem Klick auf den Play-Button wird der Beginn eines Segments markiert, und mit einem Klick auf den Stop-Button dessen Ende. Du kannst mehrere Segmente anlegen, bevor du durch Klicken des Upload-Buttons zum Einreichen fortfährst. Ein Klick auf die Mülltonne löscht deine angelegten Segmente." - }, - "Editing": { - "message": "Bearbeitung" - }, - "helpPageEditing1": { - "message": "Wenn du etwas falsch gemacht hast, kannst du ein Segment bearbeiten oder löschen nachdem du auf den Auf-Pfeil Knopf gedrückt hast." - }, - "helpPageTooSlow": { - "message": "Das ist zu langsam" - }, - "helpPageTooSlow1": { - "message": "Es gibt Hotkeys, wenn du diese verwenden möchtest. Drücke die Semikolon-Taste um den Anfang/das Ende eines Sponsor-Segments zu markieren und die Abostrophe-Taste um es zu übermitteln. Diese können in den Optionen geändert werden. Wenn du keine QWERTY-Tastatur verwendest, solltest du eventuell die Keybinds ändern." - }, - "helpPageCopyOfDatabase": { - "message": "Kann ich eine kopie der Datenbank erhalten? Was passiert wenn du verschwindest?" - }, - "helpPageCopyOfDatabase1": { - "message": "Die Datenbank ist öffentlich und verfügbar unter" - }, - "helpPageCopyOfDatabase2": { - "message": "Der Quellcode ist frei verfügbar. Selbst wenn mir etwas passieren würde wären deine Übermittlungen nicht verloren." - }, - "helpPageNews": { - "message": "Nachrichten und wie es gemacht wird" - }, - "helpPageSourceCode": { - "message": "Wo kann ich den Quellcode kriegen?" - }, - "Credits": { - "message": "Mitwirkende" - }, - "LearnMore": { - "message": "Erfahre mehr" - }, - "FullDetails": { - "message": "Vollständige Details" - }, - "CopyDownvoteButtonInfo": { - "message": "Downvotet, und erstellt eine lokale Kopie zum erneuten Einreichen" - }, - "OpenCategoryWikiPage": { - "message": "Öffne den Wiki-Artikel dieser Kategorie." - }, - "CopyAndDownvote": { - "message": "Kopieren und abwerten" - }, - "ContinueVoting": { - "message": "Bewerten fortsetzen" - }, - "ChangeCategoryTooltip": { - "message": "Dies wirkt sich sofort auf eigene Segmente aus" - }, - "downvote": { - "message": "Dagegen stimmen" - }, - "upvote": { - "message": "Positiv bewerten" - }, - "hideSegment": { - "message": "Segment verbergen" - }, - "skipSegment": { - "message": "Segment überspringen" - }, - "playChapter": { - "message": "Kapitel abspielen" - }, - "SponsorTimeEditScrollNewFeature": { - "message": "Benutze das Mausrad während der Mauszeiger über dem Eingabefeld schwebt um die Zeit schnell anzupassen. Benutze Strg bzw. Shift für gröbere/genauere Änderungen." - }, - "categoryPillNewFeature": { - "message": "Neu! Sieh, ob ein Video ausschließlich Sponsor oder Eigenwerbung ist" - }, - "dayAbbreviation": { - "message": "T", - "description": "100d" - }, - "hourAbbreviation": { - "message": "Std", - "description": "100h" - }, - "optionsTabBehavior": { - "message": "Verhalten", - "description": "Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabInterface": { - "message": "Oberfläche", - "description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabKeyBinds": { - "message": "Tastenkürzel", - "description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabBackup": { - "message": "Sichern/Wiederherstellen", - "description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabAdvanced": { - "message": "Verschiedenes", - "description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "noticeVisibilityLabel": { - "message": "Aussehen der Überspringen-Meldung", - "description": "Option label" - }, - "unbind": { - "message": "Aufheben", - "description": "Unbind keyboard shortcut" - }, - "notSet": { - "message": "Nicht gesetzt" - }, - "change": { - "message": "Ändern" - }, - "youtubeKeybindWarning": { - "message": "Dies ist ein vorhandenes YouTube-Kürzel. Bist du sicher, dass du es verwenden möchtest?" - }, - "betaServerWarning": { - "message": "BETA Server wurde aktiviert!" - }, - "openOptionsPage": { - "message": "Einstellungen öffnen" - }, - "resetToDefault": { - "message": "Einstellungen zurücksetzen" - }, - "confirmResetToDefault": { - "message": "Sind Sie sicher, dass Sie alle Einstellungen auf ihre Standardwerte zurücksetzen wollen? Dies kann nicht rückgängig gemacht werden." - }, - "exportSegments": { - "message": "Segmente exportieren" - }, - "importSegments": { - "message": "Segmente importieren" - }, - "Import": { - "message": "Importieren", - "description": "Button to initiate importing segments. Appears under the textbox where they paste in the data" - }, - "redeemSuccess": { - "message": "Einlösen erfolgreich!" - }, - "redeemFailed": { - "message": "Lizenzschlüssel ist ungültig" - }, - "hideUpsells": { - "message": "Verstecke Optionen, welche ohne extra Zahlung nicht verfügbar sind" - }, - "chooseACountry": { - "message": "Wähle ein Land" - }, - "noDiscount": { - "message": "Du bist nicht für einen Rabatt qualifiziert" - }, - "discountLink": { - "message": "Rabatt-Link (Siehe rosa Preis)" - }, - "selectYourCountry": { - "message": "Wähle dein Land" - }, - "alreadyDonated": { - "message": "Wenn du zuvor etwas gespendet hast, kannst du einen kostenlosen Zugang per E-Mail einlösen:", - "description": "After the colon is an email address" - }, - "cantAfford": { - "message": "Wenn du dir keine Lizenz leisten kannst, klicke {hier} um zu sehen, ob du für einen Rabatt in Frage kommen", - "description": "Keep the curly braces. The word 'here' should be translated as well." - }, - "patreonSignIn": { - "message": "Mit Patreon anmelden" - }, - "redeem": { - "message": "Einlösen" - }, - "joinOnPatreon": { - "message": "Auf Patreon abonnieren" - }, - "oneTimePurchase": { - "message": "Einmaliger Kauf" - }, - "enterLicenseKey": { - "message": "Lizenzschlüssel eingeben" - }, - "chaptersPage1": { - "message": "Die Crowd-sourced Kapitel-Funktion von SponsorBlock ist nur für Personen verfügbar, welche eine Lizenz kaufen, oder gratis Zugriff für Ihre bisherigen Beiträge erhalten haben" - }, - "chaptersPage2": { - "message": "Hinweis: Erlaubnis zum Einreichen von Kapiteln basiert immer noch auf dem berechneten Ruf. Der kauf einer Lizenz berechtigt dich nur, die eingereichten Kapitel der anderen zu sehen", - "description": "On the chapters page for getting access to the paid chapters feature" - }, - "chapterNewFeature": { - "message": "Neues Feature: Crowdsourced benutzerdefinierte Kapitel. Dies sind benutzerdefinierte Abschnitte in Videos, die gestapelt werden können, um mehr und mehr präzise zu werden. Kauf eine Lizenz, um Kapitel, die in diesem Video eingereicht wurden, anzusehen: ", - "description": "After the comma, a list of chapters for this video will appear" - }, - "chapterNewFeature2": { - "message": "Neues Feature: Crowd-gesourcte benutzerdefinierte Kapitel. Dies sind benutzerdefiniert benannte Abschnitte in Videos, die gestapelt werden können, um mehr und mehr präzise zu werden. Du hast kostenlosen Zugang, aktiviere es in den Optionen." - }, - "unsubmittedSegmentCounts": { - "message": "Du hast derzeit {0} in {1}", - "description": "Example: You currently have 12 unsubmitted segments on 5 videos" - }, - "unsubmittedSegmentCountsZero": { - "message": "Du hast aktuell keine nicht eingereichten Segmente", - "description": "Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments" - }, - "unsubmittedSegmentsSingular": { - "message": "nicht eingereichtes Segment", - "description": "Example: You currently have 1 *unsubmitted segment* on 1 video" - }, - "unsubmittedSegmentsPlural": { - "message": "nicht eingereichte Segmente", - "description": "Example: You currently have 12 *unsubmitted segments* on 5 videos" - }, - "videosSingular": { - "message": "Video", - "description": "Example: You currently have 3 unsubmitted segments on 1 *video*" - }, - "videosPlural": { - "message": "Videos", - "description": "Example: You currently have 12 unsubmitted segments on 5 *videos*" - }, - "clearUnsubmittedSegments": { - "message": "Alle Segmente löschen", - "description": "Label for a button in settings" - }, - "clearUnsubmittedSegmentsConfirm": { - "message": "Möchtest du wirklich alle nicht eingereichten Segmente löschen?", - "description": "Confirmation message for the Clear unsubmitted segments button" - }, - "showUnsubmittedSegments": { - "message": "Segmente anzeigen", - "description": "Show/hide button for the unsubmitted segments list" - }, - "hideUnsubmittedSegments": { - "message": "Segmente ausblenden", - "description": "Show/hide button for the unsubmitted segments list" - }, - "videoID": { - "message": "Video ID", - "description": "Header of the unsubmitted segments list" - }, - "segmentCount": { - "message": "Segmentanzahl", - "description": "Header of the unsubmitted segments list" - }, - "actions": { - "message": "Aktionen", - "description": "Header of the unsubmitted segments list" - }, - "exportSegmentsAsURL": { - "message": "Als URL teilen" - } -} diff --git a/public/_locales/el/messages.json b/public/_locales/el/messages.json deleted file mode 100644 index 835f0e10..00000000 --- a/public/_locales/el/messages.json +++ /dev/null @@ -1,1035 +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": "Τμήματα" - }, - "Chapters": { - "message": "Κεφάλαια" - }, - "renderAsChapters": { - "message": "Θεώρηση τμημάτων ως κεφάλαια", - "description": "Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system" - }, - "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": "Για να επεξεργαστείτε ή να διαγράψετε τα τμήματα ξεχωριστά, ανοίξτε το αναδυόμενο παράθυρο πατώντας το κουμπί πληροφορίες (i) ή πατώντας το εικονίδιο της επέκτασης στην πάνω δεξιά γωνία του προγράμματος περιήγησης σας." - }, - "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": "Κλείσιμο αναδυόμενου παραθύρου" - }, - "SubmitTimes": { - "message": "Υποβολή Τμημάτων" - }, - "sortSegments": { - "message": "Ταξινόμηση Τμημάτων" - }, - "submitCheck": { - "message": "Είσαστε σίγουροι για την υποβολή σας;" - }, - "whitelistChannel": { - "message": "Λίστα αποδοχής καναλιών" - }, - "removeFromWhitelist": { - "message": "Αφαίρεση καναλιού από τη λίστα αποδοχής" - }, - "voteOnTime": { - "message": "Ψηφίστε για κάποιο τμήμα" - }, - "Submissions": { - "message": "Υποβολές" - }, - "savedPeopleFrom": { - "message": "Έχετε γλιτώσει τον κόσμο από " - }, - "viewLeaderboard": { - "message": "Πίνακας βαθμολογίας" - }, - "recordTimesDescription": { - "message": "Υποβολή" - }, - "submissionEditHint": { - "message": "Η επεξεργασία τμήματος θα εμφανιστεί αφότου πατήσετε υποβολή", - "description": "Appears in the popup to inform them that editing has been moved to the video player." - }, - "popupHint": { - "message": "Συμβουλή: Μπορείτε να ρυθμίσετε συντομεύσεις πλήκτρων για υποβολή στις ρυθμίσεις" - }, - "clearTimesButton": { - "message": "Σβήσιμο τμημάτων" - }, - "submitTimesButton": { - "message": "Υποβολή τμημάτων" - }, - "publicStats": { - "message": "Χρησιμοποιείται στη δημόσια σελίδα στατιστικών για να αναδειχθεί πόσο έχετε συμβάλει. Δείτε το" - }, - "Username": { - "message": "Όνομα χρήστη" - }, - "setUsername": { - "message": "Ορισμός ονόματος χρήστη" - }, - "copyPublicID": { - "message": "Αντιγραφή δημόσιου αναγνωριστικού χρήστη" - }, - "copySegmentID": { - "message": "Αντιγραφή ταυτότητας τμήματος" - }, - "discordAdvert": { - "message": "Μπείτε στον επίσημο διακομιστή μας στο Discord για ανατροφοδότηση και προτάσεις!" - }, - "hideThis": { - "message": "Απόκρυψη" - }, - "Options": { - "message": "Ρυθμίσεις" - }, - "showButtons": { - "message": "Εμφάνιση Κουμπιών στην οθόνη αναπαραγωγής YouTube" - }, - "hideButtons": { - "message": "Απόκρυψη Κουμπιών από την οθόνη αναπαραγωγής YouTube" - }, - "hideButtonsDescription": { - "message": "Αυτό αποκρύπτει τα κουμπιά που εμφανίζονται στο πρόγραμμα αναπαραγωγής YouTube ώστε να υποβάλετε τμήματα προς παράλειψη." - }, - "showSkipButton": { - "message": "Διατήρηση του κουμπιού παράλειψης προς το κυριότερο περιεχόμενο του βίντεο στην οθόνη αναπαραγωγής" - }, - "showInfoButton": { - "message": "Εμφάνιση κουμπιού «πληροφορίες» στο πρόγραμμα αναπαραγωγής YouTube" - }, - "hideInfoButton": { - "message": "Απόκρυψη κουμπιού «πληροφορίες» από το πρόγραμμα αναπαραγωγής YouTube" - }, - "autoHideInfoButton": { - "message": "Αυτόματη απόκρυψη του κουμπιού «Πληροφορίες»" - }, - "hideDeleteButton": { - "message": "Απόκρυψη κουμπιού «διαγραφή» από το πρόγραμμα αναπαραγωγής YouTube" - }, - "showDeleteButton": { - "message": "Εμφάνιση κουμπιού «διαγραφή» στο πρόγραμμα αναπαραγωγής YouTube" - }, - "enableViewTracking": { - "message": "Ενεργοποίηση του μετρητή παραλείψεων" - }, - "whatViewTracking": { - "message": "Αυτή η δυνατότητα ανιχνεύει ποια τμήματα έχετε παραλείψει, ώστε να ξέρουν εκείνοι που τα υπέβαλαν, πόσο έχουν βοηθήσει τους συνανθρώπους τους, και χρησιμοποιείται ως μέτρηση μαζί με τις θετικές ψήφους, ώστε να βεβαιωθεί η βάση δεδομένων πως δεν είναι ανεπιθύμητο τμήμα. Κάθε φορά που παραλείπετε κάποιο τμήμα ή επέκταση το στέλνει στον διακομιστή. Ελπίζουμε οι περισσότεροι χρήστες να μην αλλάξουν αυτή τη ρύθμιση, ώστε ο αριθμός μη προβολής τμημάτων να είναι ακριβής. :)" - }, - "enableViewTrackingInPrivate": { - "message": "Ενεργοποίηση του μετρητή παραλείψεων σε καρτέλες Ιδιωτικής/Ανώνυμης περιήγησης" - }, - "enableTrackDownvotes": { - "message": "Αποθήκευση καταψηφίσεων τμημάτων" - }, - "whatTrackDownvotes": { - "message": "Όποια τμήματα καταψηφίζετε θα παραμένουν κρυμμένα ακόμα και μετά από ανανέωση της σελίδας" - }, - "trackDownvotesWarning": { - "message": "Προειδοποίηση: Η απενεργοποίηση αυτής της επιλογής θα διαγράψει όλες τις προηγούμενες αποθηκευμένες καταψηφίσεις" - }, - "enableQueryByHashPrefix": { - "message": "Αιτήματα μέσω προθέματος Hash" - }, - "whatQueryByHashPrefix": { - "message": "Αντί να ζητάτε τα τμήματα από τον διακομιστή μέσω ολόκληρης της ταυτότητας του βίντεο, στέλνονται μόνο οι πρώτοι 4 κομμένοι χαρακτήρες από την ταυτότητα του βίντεο. Ο διακομιστής στέλνει πίσω δεδομένα για όλα τα βίντεο με παρόμοιους κομμένους χαρακτήρες." - }, - "enableRefetchWhenNotFound": { - "message": "Επανάληψη αναζήτησης τμημάτων σε νέα βίντεο" - }, - "whatRefetchWhenNotFound": { - "message": "Εάν το βίντεο είναι καινούργιο, και δεν έχουν βρεθεί τμήματα, θα συνεχιστεί η αναζήτηση κάθε μερικά λεπτά, ενώ το παρακολουθείτε." - }, - "showNotice": { - "message": "Επανεμφάνιση ειδοποιήσεων" - }, - "showSkipNotice": { - "message": "Εμφάνιση ειδοποιήσεων μετά την παράλειψη κάθε τμήματος" - }, - "showCategoryGuidelines": { - "message": "Εμφάνιση βοήθειας κατηγοριών" - }, - "noticeVisibilityMode0": { - "message": "Ειδοποιήσεις παράλειψης πλήρους μεγέθους" - }, - "noticeVisibilityMode1": { - "message": "Μικρές ειδοποιήσεις αυτόματης παράλειψης" - }, - "noticeVisibilityMode2": { - "message": "Να είναι όλες μικρές ειδοποιήσεις" - }, - "noticeVisibilityMode3": { - "message": "Ξεθωριασμένες ειδοποιήσεις αυτόματης παράλειψης" - }, - "noticeVisibilityMode4": { - "message": "Να είναι όλες ξεθωριασμένες ειδοποιήσεις" - }, - "longDescription": { - "message": "Το SponsorBlock σας επιτρέπει να παραλείψετε χορηγίες, εισαγωγές, επίλογους, υπενθυμίσεις εγγραφής, και άλλα ενοχλητικά μέρη των βίντεο YouTube. Το SponsorBlock είναι μια επέκταση που τροφοδοτείται, από τους ίδιους τους χρήστες, επιτρέπει στον κάθε έναν να υποβάλει το πότε ξεκινούν και πότε τελειώνουν τμήματα χορηγιών των βίντεο YouTube. Μόλις κάποιος χρήστης υποβάλει αυτή τη πληροφορία, ο οποιοσδήποτε άλλος που έχει αυτήν την επέκταση μπορεί να παραλείψει όλα αυτά τα ενοχλητικά τμήματα χορηγιών. Μπορείτε επίσης να παραλείψετε τμήματα, που δεν περιέχουν μουσική, σε μουσικά βίντεο.", - "description": "Full description of the extension on the store pages." - }, - "website": { - "message": "Ιστοσελίδα", - "description": "Used on Firefox Store Page" - }, - "sourceCode": { - "message": "Πηγαίος Κώδικας", - "description": "Used on Firefox Store Page" - }, - "noticeUpdate": { - "message": "Οι ειδοποιήσεις αναβαθμίστηκαν!", - "description": "The first line of the message displayed after the notice was upgraded." - }, - "noticeUpdate2": { - "message": "Εάν δεν σας αρέσουν, πατήστε το κουμπί «Να μην ξαναεμφανιστεί».", - "description": "The second line of the message displayed after the notice was upgraded." - }, - "setSkipShortcut": { - "message": "Παράλειψη τμήματος", - "description": "Keybind label" - }, - "setStartSponsorShortcut": { - "message": "Έναρξη/Τέλος τμήματος", - "description": "Keybind label" - }, - "setSubmitKeybind": { - "message": "Υποβολή Τμημάτων", - "description": "Keybind label" - }, - "keybindDescription": { - "message": "Επιλέξτε ένα πλήκτρο πατώντας το και επιλέξτε όποιο πρόσθετο πλήκτρο ελέγχου επιθυμείτε." - }, - "0": { - "message": "Λήξη χρονικού ορίου σύνδεσης. Παρακαλώ ελέγξτε ότι η σύνδεσή σας με το διαδίκτυο λειτουργεί, αλλιώς ο διακομιστής μπορεί να υπερφορτώθηκε ή να έπεσε." - }, - "disableSkipping": { - "message": "Η παράλειψη είναι ενεργή" - }, - "enableSkipping": { - "message": "Η παράλειψη είναι ανενεργή" - }, - "yourWork": { - "message": "Η δουλειά σας", - "description": "Used to describe the section that will show you the statistics from your submissions." - }, - "502": { - "message": "Ο διακομιστής φαίνεται ότι έχει υπερφορτωθεί. Δοκιμάστε ξανά σε μερικά δευτερόλεπτα." - }, - "errorCode": { - "message": "Κωδικός σφάλματος: " - }, - "skip": { - "message": "Παράλειψη" - }, - "mute": { - "message": "Σίγαση" - }, - "full": { - "message": "Όλο το βίντεο", - "description": "Used for the name of the option to label an entire video as sponsor or self promotion." - }, - "skip_category": { - "message": "Παράλειψη {0};" - }, - "mute_category": { - "message": "Σίγαση {0};" - }, - "skip_to_category": { - "message": "Παράλειψη προς το σημείο «{0}»;", - "description": "Used for skipping to things (Skip to Highlight)" - }, - "skipped": { - "message": "Παραλείφθηκε «{0}»", - "description": "Example: Sponsor Skipped" - }, - "muted": { - "message": "Σίγαση {0}", - "description": "Example: Sponsor Muted" - }, - "skipped_to_category": { - "message": "Παραλείφθηκε προς το σημείο «{0}»", - "description": "Used for skipping to things (Skipped to Highlight)" - }, - "disableAutoSkip": { - "message": "Απενεργοποίηση Αυτόματης Παράλειψης" - }, - "enableAutoSkip": { - "message": "Ενεργοποίηση Αυτόματης Παράλειψης" - }, - "audioNotification": { - "message": "Ηχητική ειδοποίηση κατά την παράληψη" - }, - "audioNotificationDescription": { - "message": "Οι ειδοποιήσεις μετά την παράλειψη κάθε τμήματος θα αναπαράγουν ήχο. Εάν είναι ανενεργή αυτή η επιλογή εκτός αν η αυτόματη παράλειψη είναι ανενεργή." - }, - "showTimeWithSkips": { - "message": "Εμφάνιση χρόνου συμπεριλαμβάνοντας τις παραλείψεις" - }, - "showTimeWithSkipsDescription": { - "message": "Αυτός ο χρόνος εμφανίζεται σε παρενθέσεις δίπλα από τον τρέχων χρόνο που είναι κάτω από την μπάρα χρόνου. Αυτό δείχνει την συνολική διάρκεια του βίντεο πλην οποιουδήποτε τμήματος. Αυτό περιλαμβάνει και τα τμήματα που εμφανίζονται μόνο στην μπάρα χρόνου." - }, - "youHaveSkipped": { - "message": "Έχετε παραλείψει " - }, - "minLower": { - "message": "λεπτό" - }, - "minsLower": { - "message": "λεπτά" - }, - "hourLower": { - "message": "ώρα" - }, - "hoursLower": { - "message": "ώρες" - }, - "youHaveSavedTime": { - "message": "Έχετε γλιτώσει τον κόσμο από", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "youHaveSavedTimeEnd": { - "message": " της ζωής τους", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "statusReminder": { - "message": "Ελέγξτε το status.sponsor.ajay.app για την κατάσταση διακομιστή." - }, - "whatChangeUserID": { - "message": "Κρατείστε το μυστικό. Αυτό είναι σαν ένα κωδικό πρόσβασης όπου δε θα έπρεπε να μοιράζεστε με κανένα. Εάν το αποκτήσει κάποιος, μπορεί να σας υποδυθεί. Εάν ψάχνετε για τη δημόσια ταυτότητα χρήστη σας, πατήστε πάνω στο αναδυόμενο εικονίδιο πρόχειρου." - }, - "createdBy": { - "message": "Δημιουργήθηκε από" - }, - "supportOtherSites": { - "message": "Υποστήριξη 3των ιστοσελίδων τύπου YouTube" - }, - "supportOtherSitesDescription": { - "message": "Υποστήριξη 3των πελατών διακομιστή YouTube. Για να ενεργοποιήσετε την υποστήριξη πρέπει να αποδεχτείτε επιπλέον άδειες. Αυτό ΔΕ λειτουργεί σε καρτέλες ανώνυμης περιήγησης του Chrome ή άλλων Chromium εκδοχών.", - "description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube" - }, - "supportedSites": { - "message": "Υποστηριζόμενες Ιστοσελίδες: " - }, - "optionsInfo": { - "message": "Ενεργοποίηση υποστήριξης «Invidious», απενεργοποίηση αυτόματης παράλειψης, απόκρυψη κουμπιών και άλλα." - }, - "addInvidiousInstance": { - "message": "Προσθήκη 3ου πελάτη συνεδρίας" - }, - "addInvidiousInstanceDescription": { - "message": "Προσθέστε μια προσαρμοσμένη συνεδρία. Αυτό πρέπει να είναι μορφοποιημένο MONO με την διεύθυνση. Για παράδειγμα: invidious.ajay.app" - }, - "add": { - "message": "Προσθήκη" - }, - "addInvidiousInstanceError": { - "message": "Μη έγκυρη διεύθυνση. Θα πρέπει να περιλαμβάνεται ΜΟΝΟ αυτό το μέρος της διεύθυνσης.\nΓια παράδειγμα: invidious.ajay.app" - }, - "resetInvidiousInstance": { - "message": "Επαναφορά Λίστας «Invidious»" - }, - "resetInvidiousInstanceAlert": { - "message": "Πρόκειται να επαναφέρετε τη λίστα «Invidious»" - }, - "currentInstances": { - "message": "Τρέχουσες Συνεδρίες:" - }, - "minDuration": { - "message": "Ελάχιστη διάρκεια (σε δευτερόλεπτα):" - }, - "minDurationDescription": { - "message": "Τμήματα μικρότερα από την καθορισμένη τιμή δε θα παραλείπονται ή δε θα εμφανίζονται στην οθόνη αναπαραγωγής." - }, - "skipNoticeDuration": { - "message": "Διάρκεια ειδοποίησης παράλειψης (σε δευτερόλεπτα):" - }, - "skipNoticeDurationDescription": { - "message": "Η ειδοποίηση παράλειψης θα παραμείνει στην οθόνη για τουλάχιστον τόσα δευτερόλεπτα. Στη μη αυτόματη παράκαμψη, μπορεί να είναι ορατή για μεγαλύτερο χρονικό διάστημα." - }, - "shortCheck": { - "message": "Η ακόλουθη υποβολή είναι μικρότερη από την επιλεγμένη ελάχιστη διάρκεια. Αυτό θα μπορούσε να σημαίνει ότι αυτό το τμήμα έχει ήδη υποβληθεί, και απλά αγνοείται λόγω αυτής της επιλογής. Είστε σίγουροι ότι θα θέλατε να το υποβάλετε;" - }, - "liveOrPremiere": { - "message": "Η υποβολή σε μια ζωντανή μετάδοση σε εξέλιξη ή σε μια πρεμιέρα δεν επιτρέπεται. Παρακαλώ περιμένετε μέχρι να τελειώσει, στην συνέχεια ανανεώστε την σελίδα και επαληθεύστε ότι τα τμήματα είναι έγκυρα." - }, - "showUploadButton": { - "message": "Εμφάνιση κουμπιού υποβολής" - }, - "customServerAddress": { - "message": "Διεύθυνση Διακομιστή SponsorBlock" - }, - "customServerAddressDescription": { - "message": "Η διεύθυνση που χρησιμοποιείται για την επικοινωνία με τον διακομιστή του SponsorBlock. Εάν δε διαθέτετε το δικό σας διακομιστή, αυτή η επιλογή δεν πρέπει να αλλάξει." - }, - "save": { - "message": "Αποθήκευση" - }, - "reset": { - "message": "Επαναφορά" - }, - "customAddressError": { - "message": "Η διεύθυνση δεν έχει τη σωστή μορφή. Παρακαλώ ελέγξτε ότι έχετε http:// ή https:// στην αρχή της χωρίς κάθετους στο τέλος." - }, - "areYouSureReset": { - "message": "Είστε σίγουροι ότι θέλετε να το επαναφέρετε;" - }, - "mobileUpdateInfo": { - "message": "Το m.youtube.com υποστηρίζεται πλέον" - }, - "exportOptions": { - "message": "Εισαγωγή/Εξαγωγή όλων των ρυθμίσεων" - }, - "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": "Οι πληροφορίες εντοπισμού σφαλμάτων έχουν αντιγραφεί στο πρόχειρο. Μη διστάσετε να αφαιρέσετε οποιαδήποτε πληροφορία που προτιμάτε να μη μοιραστείτε. Αποθηκεύστε τες σε ένα αρχείο κειμένου ή επικολλήστε στην αναφορά σφάλματός σας." - }, - "keyAlreadyUsed": { - "message": "Αυτό το πλήκτρο έχει οριστεί ως συντόμευση για άλλη ενέργεια. Παρακαλώ επιλέξτε ένα άλλο πλήκτρο." - }, - "to": { - "message": "έως", - "description": "Used between segments. Example: 1:20 to 1:30" - }, - "generic_guideline1": { - "message": "Συμπερίληψη τμημάτων μεταβάσεων" - }, - "generic_guideline2": { - "message": "Ροή περιεχομένου σαν να μην υπήρξε ποτέ παράλειψη" - }, - "category_sponsor": { - "message": "Χορηγία" - }, - "category_sponsor_description": { - "message": "Προώθηση επί πληρωμή, παραπομπές επί πληρωμή και άμεσες διαφημίσεις. Όχι, για προσωπική προώθηση ή δωρεάν αναφορές σε δημιουργούς/ιστοσελίδες/προϊόντα που τους αρέσουν." - }, - "category_sponsor_guideline1": { - "message": "Προώθηση επί πληρωμή" - }, - "category_sponsor_guideline2": { - "message": "Όχι για δωρεές ή προσαρμοσμένα προϊόντα" - }, - "category_selfpromo": { - "message": "Αφιλοκέρδεια/Προσωπική Προώθηση" - }, - "category_selfpromo_description": { - "message": "Παρόμοιο με τη «χορηγία» αλλά για μη κερδοσκοπικό σκοπό ή για προσωπική προώθηση. Αυτό συμπεριλαμβάνει τμήματα από εμπορεύματα, δωρεές, ή πληροφορίες σχετικές με το ποιους συνεργάστηκαν." - }, - "category_selfpromo_guideline1": { - "message": "Δωρεές, συνδρομές και προσαρμοσμένα προϊόντα" - }, - "category_selfpromo_guideline2": { - "message": "Δωρεάν αναφορές που δεν προστίθενται στο βίντεο" - }, - "category_selfpromo_guideline3": { - "message": "Όχι για προϊόντα ή ρουχισμό που έχει κατασκευαστεί από αλυσίδες επιχειρήσεων" - }, - "category_exclusive_access": { - "message": "Αποκλειστική Πρόσβαση" - }, - "category_exclusive_access_description": { - "message": "Μόνο για χαρακτηρισμό ολοκλήρου του βίντεο. Χρησιμοποιείται όταν ένα βίντεο παρουσιάζει ένα προϊόν, υπηρεσία, ή τοποθεσία αποκλειστικής ή δωρεάν πρόσβασής τους." - }, - "category_exclusive_access_pill": { - "message": "Αυτό το βίντεο παρουσιάζει ένα προϊόν, υπηρεσία, ή τοποθεσία αποκλειστικής ή δωρεάν πρόσβασής τους", - "description": "Short description for this category" - }, - "category_exclusive_access_guideline1": { - "message": "Ολόκληρο το βίντεο παρουσιάζει κάτι με δωρεάν ή επιδοτούμενη πρόσβαση" - }, - "category_interaction": { - "message": "Υπενθύμιση Αλληλεπίδρασης (Εγγραφή)" - }, - "category_interaction_description": { - "message": "Όταν υπάρχει μια σύντομη υπενθύμιση για να προσθέσετε το βίντεο στα βίντεο που σας αρέσουν, να εγγραφείτε ή να τους ακολουθήσετε στη μέση του περιεχομένου. Εάν διαρκεί για αρκετή ώρα, τότε αυτό περιλαμβάνεται στη κατηγορία «προσωπική προώθηση»." - }, - "category_interaction_guideline1": { - "message": "Σύντομες υπενθυμίσεις εγγραφής, μου αρέσει και ακολούθησης" - }, - "category_interaction_guideline2": { - "message": "Περιλαμβάνει έμμεσες υπενθυμίσεις για σχόλια" - }, - "category_interaction_guideline3": { - "message": "Όχι για γενικότερες προωθήσεις, μόνο για εκκλήσεις βοήθειας" - }, - "category_interaction_short": { - "message": "Υπενθύμιση Αλληλεπίδρασης" - }, - "category_intro": { - "message": "Παύση/Εισαγωγή με Animation" - }, - "category_intro_description": { - "message": "Ένα διάστημα χωρίς ουσιαστικό περιεχόμενο. Θα μπορούσε να είναι κάποια παύση, στατική εικόνα, επαναλαμβανόμενο animation. Δεν πρέπει να επιλέγεται για μεταβάσεις που περιέχουν πληροφορίες." - }, - "category_intro_short": { - "message": "Διάλειμμα" - }, - "category_intro_guideline1": { - "message": "Χρονικό διάστημα χωρίς ουσιαστικό περιεχόμενο" - }, - "category_intro_guideline2": { - "message": "Όχι για μεταβάσεις που συμπεριλαμβάνουν πληροφορίες" - }, - "category_outro": { - "message": "Προτεινόμενα βίντεο καναλιών/Εύσημα" - }, - "category_outro_description": { - "message": "Όταν εμφανίζονται τα εύσημα ή τα προτεινόμενα βίντεο των καναλιών. Όχι, για επίλογους που περιέχουν πληροφορίες." - }, - "category_outro_guideline1": { - "message": "Μη συμπερίληψη περιεχομένου, ακόμα και αν τα προτεινόμενα βίντεο βρίσκονται στην οθόνη" - }, - "category_preview": { - "message": "Προεπισκόπηση/Αναθεώρηση" - }, - "category_preview_guideline1": { - "message": "Κλιπ που εμφανίζονται μετά, ή σε μελλοντικά βίντεο" - }, - "category_preview_guideline2": { - "message": "Ανακεφαλαίωση προηγούμενου βίντεο" - }, - "category_preview_guideline3": { - "message": "Όχι για μέρη που περιλαμβάνουν πρόσθετο περιεχόμενο" - }, - "category_filler": { - "message": "Σπατάλη Χρόνου/Περιττό σχόλιο" - }, - "category_filler_short": { - "message": "Περιττό" - }, - "category_filler_guideline1": { - "message": "Άσχετες σκηνές μόνο για σπατάλη χρόνου ή περιττά σχόλια" - }, - "category_filler_guideline2": { - "message": "Αποσπάσεις, επαναλήψεις, αποτυχημένες λήψεις" - }, - "category_filler_guideline3": { - "message": "Όχι για σκηνές που απαιτούνται για την κατανόηση του θέματος" - }, - "category_music_offtopic": { - "message": "Μουσική: Τμήμα χωρίς μουσική" - }, - "category_music_offtopic_description": { - "message": "Μόνο για χρήση σε βίντεο μουσικής. Αυτό θα πρέπει να χρησιμοποιείται μόνο για τμήματα βίντεο μουσικής που δεν καλύπτονται ήδη από κάποια άλλη κατηγορία." - }, - "category_music_offtopic_short": { - "message": "Χωρίς Μουσική" - }, - "category_music_offtopic_guideline1": { - "message": "Μέρη τα οποία δεν έχουν κυκλοφορήσει επίσημα" - }, - "category_music_offtopic_guideline2": { - "message": "Χωρίς μουσική σε ζωντανή συναυλία" - }, - "category_poi_highlight": { - "message": "Καλύτερη στιγμή" - }, - "category_poi_highlight_description": { - "message": "Το κομμάτι του βίντεο που ψάχνουν να δουν οι περισσότεροι άνθρωποι. Παρόμοιο με το «Το βίντεο ξεκινάει από το x σημείο» στα σχόλια." - }, - "category_poi_highlight_guideline1": { - "message": "Το μέρος που ψάχνουν οι περισσότεροι" - }, - "category_poi_highlight_guideline2": { - "message": "Ίσως παραλειφθεί κάτι που συμβάλει στην κατανόηση" - }, - "category_poi_highlight_guideline3": { - "message": "Παράλειψη προς το περιεχόμενο όπου παρουσιάζεται στον τίτλο ή το εικονίδιο" - }, - "category_livestream_messages": { - "message": "Ζωντανή μετάδοση: Δωρεές/Ανάγνωση Μηνυμάτων από δωρεές" - }, - "category_livestream_messages_short": { - "message": "Ανάγνωση Μηνυμάτων" - }, - "autoSkip": { - "message": "Αυτόματη Παράλειψη" - }, - "manualSkip": { - "message": "Χειροκίνητη Παράλειψη" - }, - "showOverlay": { - "message": "Εμφάνιση στην μπάρα χρόνου" - }, - "disable": { - "message": "Απενεργοποίηση" - }, - "autoSkip_POI": { - "message": "Αυτόματη παράλειψη στην αρχή του τμήματος" - }, - "manualSkip_POI": { - "message": "Ερώτηση μόλις φορτώνει το βίντεο" - }, - "showOverlay_POI": { - "message": "Εμφάνιση στην μπάρα χρόνου" - }, - "showOverlay_full": { - "message": "Εμφάνιση Ετικέτας" - }, - "autoSkipOnMusicVideos": { - "message": "Αυτόματη παράλειψη όλων των τμημάτων όταν είναι «Χωρίς μουσική»" - }, - "muteSegments": { - "message": "Επιτρέψτε τμήματα που κάνουν σίγαση αντί για παράλειψη" - }, - "fullVideoSegments": { - "message": "Εμφάνιση εικονιδίου όταν όλο το βίντεο είναι διαφημιστικό εξολοκλήρου", - "description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo" - }, - "previewColor": { - "message": "Χρώμα Μη Υποβληθέντων", - "description": "Referring to submissions that have not been sent to the server yet." - }, - "seekBarColor": { - "message": "Χρώμα Μπάρας Χρόνου" - }, - "category": { - "message": "Κατηγορία" - }, - "skipOption": { - "message": "Παράλειψη Επιλογής", - "description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)" - }, - "enableTestingServer": { - "message": "Ενεργοποίηση διακομιστή δοκιμαστικών λειτουργιών" - }, - "whatEnableTestingServer": { - "message": "Οι υποβολές και οι ψήφοι ΔΕΝ ΘΑ ΜΕΤΡΗΣΟΥΝ προς τον κεντρικό διακομιστή. Χρησιμοποίησέ το μόνο για δοκιμή." - }, - "testingServerWarning": { - "message": "Όλες οι υποβολές και οι ψήφοι ΔΕΝ ΘΑ ΜΕΤΡΙΣΟΥΝ στον κύριο διακομιστή κατά τη σύνδεση με τον δοκιμαστικό διακομιστή. Σιγουρευτείτε για να την απενεργοποιήσετε όταν θέλετε να κάνετε πραγματικές υποβολές." - }, - "bracketNow": { - "message": "(εδώ)" - }, - "moreCategories": { - "message": "Περισσότερες κατηγορίες" - }, - "chooseACategory": { - "message": "Επιλέξτε μια κατηγορία" - }, - "enableThisCategoryFirst": { - "message": "Για να υποβάλετε τμήματα της «{0}» κατηγορίας, πρέπει να την ενεργοποιήσετε στις ρυθμίσεις. Θα μεταφερθείτε στις ρυθμίσεις τώρα.", - "description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options." - }, - "poiOnlyOneSegment": { - "message": "Προσοχή: Αυτός ο τύπος τμήματος μπορεί να υπάρξει μόνο μια φορά. Εάν υποβάλετε πολλαπλά τότε εμφανίζεται ένα από τα τμήματα στην τύχη." - }, - "youMustSelectACategory": { - "message": "Πρέπει να επιλέξετε Κατηγορία για όλα τα τμήματα που υποβάλετε!" - }, - "bracketEnd": { - "message": "(τέλος)" - }, - "hiddenDueToDownvote": { - "message": "κρυφό: αρνητική ψήφος" - }, - "hiddenDueToDuration": { - "message": "κρυφό: πολύ κοντό" - }, - "manuallyHidden": { - "message": "χειροκίνητη απόκρυψη" - }, - "channelDataNotFound": { - "description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.", - "message": "Η ταυτότητα καναλιού δεν έχει φορτώσει ακόμα. Εάν χρησιμοποιείτε ενσωματωμένο βίντεο, δοκιμάστε αντιθέτως να το ανοίξετε στο YouTube. Μπορεί επίσης να ευθύνονται αλλαγές στη διάταξη του YouTube, εάν το πιστεύετε, γράψτε ένα σχόλιο εδώ:" - }, - "acceptPermission": { - "message": "Αποδεχτείτε την άδεια" - }, - "permissionRequestSuccess": { - "message": "Επιτυχείς αίτηση της άδειας!" - }, - "permissionRequestFailed": { - "message": "Η αίτηση της άδειας απέτυχε, πατήσατε απόρριψη;" - }, - "adblockerIssueWhitelist": { - "message": "Εάν δεν μπορείτε να το επιδιορθώσετε, απενεργοποιείστε την επιλογή «Εξαναγκασμός Ελέγχου Καναλιού πριν την παράλειψη», καθώς το SponsorBlock δεν μπόρεσε να ανακτήσει τις πληροφορίες του καναλιού αυτού του βίντεο" - }, - "forceChannelCheck": { - "message": "Εξαναγκασμός Ελέγχου Καναλιού πριν την παράλειψη" - }, - "whatForceChannelCheck": { - "message": "Από προεπιλογή, παραλείπονται τμήματα αμέσως πριν ακόμα ανοιχνευτεί ποιό κανάλι είναι. Από προεπιλογή, ορισμένα τμήματα στην αρχή του βίντεο μπορεί να παραλείπονται στα επιτρεπόμενα κανάλια που είναι στην «Λίστα αποδοχής». Η ενεργοποίηση αυτής της επιλογής θα το αποτρέψει αυτό, αλλά μετά η παράλειψη όλων των τμημάτων θα έχει μια μικρή καθυστέρηση, καθώς η απόκτυση της ταυτότητας καναλιού μπορεί να πάρει κάμποσο χρόνο. Αυτή η καθυστέρηση μπορεί να είναι μη αντιληπτή αν έχετε γρήγορη σύνδεση στο διαδίκτυο." - }, - "forceChannelCheckPopup": { - "message": "Σκεφτείτε να ενεργοποιήσετε τη ρύθμιση «Εξαναγκασμός Ελέγχου Καναλιού πριν την παράλειψη»" - }, - "downvoteDescription": { - "message": "Λάθος Συγχρονισμός" - }, - "incorrectCategory": { - "message": "Αλλαγή κατηγορίας" - }, - "nonMusicCategoryOnMusic": { - "message": "Αυτό το βίντεο έχει κατηγοριοποιηθεί ως μουσική. Είσαστε σίγουροι ότι έχει χορηγία; Εάν είναι ένα τμήμα «Χωρίς μουσική», ανοίξτε τις επιλογές της επέκτασης και ενεργοποιήστε αυτήν την κατηγορία. Μετά μπορείτε, να υποβάλετε αυτό το τμήμα ως «Χωρίς μουσική», αντί για χορηγία. Παρακαλώ διαβάστε τις οδηγίες, εάν είστε μπερδεμένοι." - }, - "multipleSegments": { - "message": "Πολλαπλά Τμήματα" - }, - "guidelines": { - "message": "Οδηγίες" - }, - "readTheGuidelines": { - "message": "Διάβασε τις οδηγίες!!", - "description": "Show the first time they submit or if they are \"high risk\"" - }, - "categoryUpdate1": { - "message": "Οι κατηγορίες είναι εδώ!" - }, - "categoryUpdate2": { - "message": "Άνοιξε τις επιλογές για την παράλειψη τίτλων αρχής-τέλους, πωλήσεων κ. α." - }, - "help": { - "message": "Βοήθεια" - }, - "GotIt": { - "message": "Το' χω", - "description": "Used as the button to dismiss a tooltip" - }, - "fullVideoTooltipWarning": { - "message": "Αυτό το τμήμα είναι μεγάλο. Αν όλο το βίντεο έχει να κάνει με ένα θέμα, τότε αλλάξτε την επιλογή από \"Παράλειψη\" σε \"Όλο το βίντεο\". Δείτε τις οδηγίες για περισσότερες πληροφορίες." - }, - "categoryPillTitleText": { - "message": "Ολόκληρο το βίντεο έχει χαρακτηριστεί ως αυτής της κατηγορίας οπότε είναι αυστηρά ενσωματωμένη ώστε να μπορείτε να το διαφοροποιήσετε σε τμήματα" - }, - "experiementOptOut": { - "message": "Αποχή από μελλοντικά πειράματα", - "description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private." - }, - "hideForever": { - "message": "Απόκρυψη για πάντα" - }, - "warningChatInfo": { - "message": "Παρατηρήσαμε ότι κάνατε συνηθισμένα μη κακόβουλα λάθη" - }, - "warningTitle": { - "message": "Λάβατε προειδοποίηση" - }, - "questionButton": { - "message": "Έχω μια ερώτηση" - }, - "warningConfirmButton": { - "message": "Κατανοώ το λόγο" - }, - "warningError": { - "message": "Σφάλμα κατά τη γνωστοποίηση της προειδοποίησης:" - }, - "Donate": { - "message": "Δωρεά" - }, - "considerDonating": { - "message": "Χρηματική βοήθεια για την ανάπτυξή μας" - }, - "hideDonationLink": { - "message": "Απόκρυψη Συνδέσμου Δωρεάς" - }, - "darkModeOptionsPage": { - "message": "Σκουρόχρωμη Λειτουργία στη σελίδα Ρυθμίσεις" - }, - "helpPageThanksForInstalling": { - "message": "Ευχαριστούμε που εγκαταστήσατε το SponsorBlock." - }, - "helpPageReviewOptions": { - "message": "Παρακαλώ ελέγξτε τις παρακάτω ρυθμίσεις" - }, - "helpPageFeatureDisclaimer": { - "message": "Πολλές δυνατότητες είναι ανενεργές από προεπιλογή. Εάν θέλετε να παραλείπετε εισαγωγές, επίλογους, χρήση «Invidious», κτλ., ενεργοποιήστε τα παρακάτω. Μπορείτε επίσης να κρύψετε/εμφανίσετε στοιχεία της διεπαφής." - }, - "helpPageHowSkippingWorks": { - "message": "Πως λειτουργεί η παράλειψη" - }, - "helpPageHowSkippingWorks1": { - "message": "Τα τμήματα βίντεο θα παραλειφθούν αυτόματα αν βρεθούν στη βάση δεδομένων. Μπορείτε να ανοίξετε το αναδυόμενο παράθυρο κάνοντας κλικ στο εικονίδιο της επέκτασης για να πάρετε μια ιδέα του τι είναι." - }, - "helpPageHowSkippingWorks2": { - "message": "Κάθε φορά που παραλείπετε κάποιο τμήμα, θα λαμβάνετε ειδοποίηση. Εάν ο συγχρονισμός σας φαίνεται λάθος, ψηφίστε αρνητικά πατώντας το εικονίδιο! Μπορείτε επίσης να ψηφίσετε μέσω του αναδυόμενου παράθυρου." - }, - "Submitting": { - "message": "Υποβολή" - }, - "helpPageSubmitting1": { - "message": "Η υποβολή μπορεί είτε να γίνει στο αναδυόμενο παράθυρο πατώντας το κουμπί «Το τμήμα ξεκινάει εδώ» είτε στα κουμπιά κάτω από την μπάρα χρόνου κατά την αναπαραγωγή βίντεο." - }, - "helpPageSubmitting2": { - "message": "Πατώντας το κουμπί αναπαραγωγής δείχνετε την αρχή του τμήματος και πατώντας το κουμπί της διακοπής δείχνετε το τέλος του τμήματος. Μπορείτε να ετοιμάσετε πολλαπλά τμήματα χορηγιών πρώτου πατήσετε υποβολή. Πατώντας το κουμπί της αποστολής τα τμήματα υποβάλλονται, ενώ πατώντας το εικονίδιο του κάδου απορριμάτων τα διαγραφεί." - }, - "Editing": { - "message": "Επεξεργασία" - }, - "helpPageEditing1": { - "message": "Αν κάνατε κάτι λάθος, μπορείτε να διορθώσετε ή να διαγράψετε τα τμήματα σας πατώντας το εικονίδιο πάνω βελάκι." - }, - "helpPageTooSlow": { - "message": "Το να υποβάλεις τμήματα παίρνει χρόνο, υπάρχει ποιο γρήγορος τρόπος;" - }, - "helpPageTooSlow1": { - "message": "Συντομεύσεις που μπορείτε να χρησιμοποιήσετε εάν το επιθυμείτε. Πατήστε την αγγλική άνω τελεία «;» για να δείξετε την αρχή/το τέλος ενός τμήματος χορηγίας και πατήστε την απόστροφο για υποβολή. Αυτές οι συντομεύσεις αλλάζουν στις ρυθμίσεις. Εάν δεν χρησιμοποιείτε το σύστημα πληκτρολόγησης «QWERTY», θα ήταν καλύτερο τα τις αλλάξετε." - }, - "helpPageCopyOfDatabase": { - "message": "Μπορώ να λάβω ένα αντίγραφο της βάσης δεδομένων; Τι θα συμβεί αν η επέκταση εξαφανιστεί;" - }, - "helpPageCopyOfDatabase1": { - "message": "Η βάση δεδομένων είναι δημόσια διαθέσιμη στη σελίδα" - }, - "helpPageCopyOfDatabase2": { - "message": "Ο πηγαίος κώδικας είναι δημόσια διαθέσιμος. Έτσι ώστε, ακόμα και αν συμβεί κάτι σε εμάς, οι υποβολές σας δε θα χαθούν." - }, - "helpPageNews": { - "message": "Νέα και πως δημιουργήθηκε η επέκταση" - }, - "helpPageSourceCode": { - "message": "Πού μπορώ να βρω τον πηγαίο κώδικα;" - }, - "Credits": { - "message": "Εύσημα" - }, - "LearnMore": { - "message": "Μάθετε περισσότερα" - }, - "FullDetails": { - "message": "Πλήρεις Λεπτομέρειες" - }, - "CopyDownvoteButtonInfo": { - "message": "Καταψήφιση και δημιουργία τοπικού αντίγραφου για επανάληψη υποβολής" - }, - "OpenCategoryWikiPage": { - "message": "Άνοιγμα σελίδας wiki της κατηγορίας." - }, - "CopyAndDownvote": { - "message": "Αντίγραφο και καταψήφιση" - }, - "ContinueVoting": { - "message": "Συνεχίστε την ψηφοφορία" - }, - "ChangeCategoryTooltip": { - "message": "Αυτό θα εφαρμοστεί απευθείας στα τμήματά σας" - }, - "downvote": { - "message": "Αρνητική ψήφος" - }, - "upvote": { - "message": "Θετική ψήφος" - }, - "hideSegment": { - "message": "Απόκρυψη τμήματος" - }, - "SponsorTimeEditScrollNewFeature": { - "message": "Χρήση της ροδέλας ποντικιού καθώς είναι πάνω από το παράθυρο επεξεργασίας για να αλλάξετε γρηγορότερα τον χρόνο. Συνδυασμοί όπως το ctrl ή το shift χρησιμοποιούνται για να τελειοποιήσετε τις αλλαγές." - }, - "categoryPillNewFeature": { - "message": "Νέο! Δείτε ποτέ ένα βίντεο αποτελείται εξολοκλήρου από προσωπικές προωθήσεις ή χορηγίες" - }, - "dayAbbreviation": { - "message": "ημ", - "description": "100d" - }, - "hourAbbreviation": { - "message": "ω", - "description": "100h" - }, - "optionsTabBehavior": { - "message": "Συμπεριφορά παραλ.", - "description": "Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabInterface": { - "message": "Διεπαφή", - "description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabKeyBinds": { - "message": "Συντομεύσεις πλήκτρων", - "description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabBackup": { - "message": "Αντίγραφο/Επαναφορά", - "description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabAdvanced": { - "message": "Διάφορα", - "description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "noticeVisibilityLabel": { - "message": "Εμφάνιση ειδοποίησης παράλειψης", - "description": "Option label" - }, - "unbind": { - "message": "Αφαίρεση", - "description": "Unbind keyboard shortcut" - }, - "notSet": { - "message": "Δεν έχει οριστεί" - }, - "change": { - "message": "Αλλαγή" - }, - "youtubeKeybindWarning": { - "message": "Αυτή η συντόμευση χρησιμοποιείται από το YouTube. Σίγουρα θέλετε να την χρησιμοποιήσετε;" - }, - "betaServerWarning": { - "message": "Ο Δοκιμαστικός Διακομιστής είναι ενεργός!" - }, - "openOptionsPage": { - "message": "Άνοιγμα σελίδας ρυθμίσεων" - }, - "resetToDefault": { - "message": "Επαναφορά των προκαθορισμένων ρυθμίσεων" - }, - "confirmResetToDefault": { - "message": "Είστε βέβαιοι ότι θέλετε να επαναφέρετε όλες τις ρυθμίσεις στις προεπιλεγμένες τιμές τους; Αυτό δεν μπορεί να αναιρεθεί." - } -} diff --git a/public/_locales/en/messages.json b/public/_locales/en/messages.json deleted file mode 100644 index b3b9e152..00000000 --- a/public/_locales/en/messages.json +++ /dev/null @@ -1,1247 +0,0 @@ -{ - "fullName": { - "message": "SponsorBlock for YouTube - Skip Sponsorships", - "description": "Name of the extension." - }, - "Description": { - "message": "Skip sponsorships, subscription begging and more on YouTube videos. Report sponsors on videos you watch to save others' time.", - "description": "Description of the extension." - }, - "400": { - "message": "Server said this request was invalid" - }, - "429": { - "message": "You have submitted too many sponsor times for this one video, are you sure there are this many?" - }, - "409": { - "message": "This has already been submitted before" - }, - "channelWhitelisted": { - "message": "Channel Whitelisted!" - }, - "Segment": { - "message": "segment" - }, - "Segments": { - "message": "segments" - }, - "SegmentsCap": { - "message": "Segments" - }, - "Chapters": { - "message": "Chapters" - }, - "renderAsChapters": { - "message": "Render segments as chapters", - "description": "Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system" - }, - "showSegmentNameInChapterBar": { - "message": "Show Current Segment Beside Video Time" - }, - "upvoteButtonInfo": { - "message": "Upvote this submission" - }, - "reportButtonTitle": { - "message": "Report" - }, - "reportButtonInfo": { - "message": "Report this submission as incorrect." - }, - "Dismiss": { - "message": "Dismiss" - }, - "Loading": { - "message": "Loading..." - }, - "Hide": { - "message": "Never Show" - }, - "hitGoBack": { - "message": "Hit unskip to get to where you came from." - }, - "unskip": { - "message": "Unskip" - }, - "reskip": { - "message": "Reskip" - }, - "unmute": { - "message": "Unmute" - }, - "paused": { - "message": "Paused" - }, - "manualPaused": { - "message": "Timer Stopped" - }, - "confirmMSG": { - "message": "To edit or delete individual values, click the info button or open the extension popup by clicking the extension icon in the top right corner." - }, - "clearThis": { - "message": "Are you sure you want to clear this?\n\n" - }, - "Unknown": { - "message": "There was an error submitting your sponsor times, please try again later." - }, - "sponsorFound": { - "message": "This video has segments in the database!" - }, - "sponsor404": { - "message": "No segments found" - }, - "sponsorStart": { - "message": "Start Segment Now" - }, - "sponsorEnd": { - "message": "End Segment Now" - }, - "sponsorCancel": { - "message": "Cancel Creating Segment" - }, - "noVideoID": { - "message": "No YouTube video found.\nIf this is incorrect, refresh the tab." - }, - "refreshSegments": { - "message": "Refresh segments" - }, - "success": { - "message": "Success!" - }, - "voted": { - "message": "Voted!" - }, - "serverDown": { - "message": "It seems the server is down. Contact the dev immediately." - }, - "connectionError": { - "message": "A connection error has occurred. Error code: " - }, - "clearTimes": { - "message": "Clear Segments" - }, - "openPopup": { - "message": "Open SponsorBlock Popup" - }, - "closePopup": { - "message": "Close Popup" - }, - "closeIcon": { - "message": "Close Icon" - }, - "SubmitTimes": { - "message": "Submit Segments" - }, - "sortSegments": { - "message": "Sort Segments" - }, - "submitCheck": { - "message": "Are you sure you want to submit this?" - }, - "whitelistChannel": { - "message": "Whitelist channel" - }, - "removeFromWhitelist": { - "message": "Remove channel from whitelist" - }, - "voteOnTime": { - "message": "Vote On A Segment" - }, - "Submissions": { - "message": "Submissions" - }, - "savedPeopleFrom": { - "message": "You've saved people from " - }, - "viewLeaderboard": { - "message": "Leaderboard" - }, - "recordTimesDescription": { - "message": "Submit" - }, - "submissionEditHint": { - "message": "Section editing will appear after you click submit", - "description": "Appears in the popup to inform them that editing has been moved to the video player." - }, - "popupHint": { - "message": "Hint: You can setup keybinds for submitting in the options" - }, - "clearTimesButton": { - "message": "Clear Times" - }, - "submitTimesButton": { - "message": "Submit Times" - }, - "publicStats": { - "message": "This is used on the public stats page to show off how much you've contributed. See it" - }, - "Username": { - "message": "Username" - }, - "setUsername": { - "message": "Set Username" - }, - "copyPublicID": { - "message": "Copy Public UserID" - }, - "copySegmentID": { - "message": "Copy Segment ID" - }, - "discordAdvert": { - "message": "Come join the official discord server to give suggestions and feedback!" - }, - "hideThis": { - "message": "Hide this" - }, - "Options": { - "message": "Options" - }, - "showButtons": { - "message": "Show Buttons On YouTube Player" - }, - "hideButtons": { - "message": "Hide Buttons On YouTube Player" - }, - "hideButtonsDescription": { - "message": "This hides the buttons that appear on the YouTube player to submit skip segments." - }, - "showSkipButton": { - "message": "Keep Skip To Highlight Button On Player" - }, - "showInfoButton": { - "message": "Show Info Button On YouTube Player" - }, - "hideInfoButton": { - "message": "Hide Info Button On YouTube Player" - }, - "autoHideInfoButton": { - "message": "Auto-hide Info Button" - }, - "hideDeleteButton": { - "message": "Hide Delete Button On YouTube Player" - }, - "showDeleteButton": { - "message": "Show Delete Button On YouTube Player" - }, - "enableViewTracking": { - "message": "Enable Skip Count Tracking" - }, - "whatViewTracking": { - "message": "This feature tracks which segments you have skipped to let users know how much their submission has helped others and used as a metric along with upvotes to ensure that spam doesn't get into the database. The extension sends a message to the server each time you skip a segment. Hopefully most people don't change this setting so that the view numbers are accurate. :)" - }, - "enableViewTrackingInPrivate": { - "message": "Enable Skip Count Tracking In Private/Incognito tabs" - }, - "enableTrackDownvotes": { - "message": "Store segment downvotes" - }, - "whatTrackDownvotes": { - "message": "Any segments you downvote will remain hidden even after refreshing" - }, - "trackDownvotesWarning": { - "message": "Warning: Disabling this will delete all previously stored downvotes" - }, - "enableQueryByHashPrefix": { - "message": "Query By Hash Prefix" - }, - "whatQueryByHashPrefix": { - "message": "Instead of requesting segments from the server using the videoID, the first 4 characters of the hash of the videoID are sent. This server will send back data for all videos with similar hashes." - }, - "enableRefetchWhenNotFound": { - "message": "Refetch Segments On New Videos" - }, - "whatRefetchWhenNotFound": { - "message": "If the video is new, and there are no segments found, it will keep refetching every few minutes while you watch." - }, - "enableShowCategoryWithoutPermission": { - "message": "Show categories in submission menu even without submission permission" - }, - "whatShowCategoryWithoutPermission": { - "message": "Some categories require permission to submit due to minimum reputation requirements" - }, - "showNotice": { - "message": "Show Notice Again" - }, - "showSkipNotice": { - "message": "Show Notice After A Segment Is Skipped" - }, - "showCategoryGuidelines": { - "message": "Show Category Help" - }, - "noticeVisibilityMode0": { - "message": "Full Size Skip Notices" - }, - "noticeVisibilityMode1": { - "message": "Small Skip Notices for Auto Skip" - }, - "noticeVisibilityMode2": { - "message": "All Small Skip Notices" - }, - "noticeVisibilityMode3": { - "message": "Faded Skip Notices for Auto Skip" - }, - "noticeVisibilityMode4": { - "message": "All Faded Skip Notices" - }, - "longDescription": { - "message": "SponsorBlock lets you skip over sponsors, intros, outros, subscription reminders, and other annoying parts of YouTube videos. SponsorBlock is a crowdsourced browser extension that lets anyone submit the start and end times of sponsored segments and other segments of YouTube videos. Once one person submits this information, everyone else with this extension will skip right over the sponsored segment. You can also skip over non music sections of music videos.", - "description": "Full description of the extension on the store pages." - }, - "website": { - "message": "Website", - "description": "Used on Firefox Store Page" - }, - "sourceCode": { - "message": "Source Code", - "description": "Used on Firefox Store Page" - }, - "noticeUpdate": { - "message": "The notice has been upgraded!", - "description": "The first line of the message displayed after the notice was upgraded." - }, - "noticeUpdate2": { - "message": "If you still don't like it, hit the never show button.", - "description": "The second line of the message displayed after the notice was upgraded." - }, - "setSkipShortcut": { - "message": "Skip segment", - "description": "Keybind label" - }, - "setStartSponsorShortcut": { - "message": "Start/stop segment", - "description": "Keybind label" - }, - "setSubmitKeybind": { - "message": "Submit segments", - "description": "Keybind label" - }, - "nextChapterKeybind": { - "message": "Next chapter", - "description": "Keybind label" - }, - "previousChapterKeybind": { - "message": "Previous chapter", - "description": "Keybind label" - }, - "keybindDescription": { - "message": "Select a key by typing it and choose any modifier keys you wish to use." - }, - "0": { - "message": "Connection Timeout. Check your internet connection. If your internet is working, the server is probably overloaded or down." - }, - "disableSkipping": { - "message": "Skipping is enabled" - }, - "enableSkipping": { - "message": "Skipping is disabled" - }, - "yourWork": { - "message": "Your Work", - "description": "Used to describe the section that will show you the statistics from your submissions." - }, - "502": { - "message": "The server seems to be overloaded. Try again in a few seconds." - }, - "errorCode": { - "message": "Error Code: " - }, - "skip": { - "message": "Skip" - }, - "mute": { - "message": "Mute" - }, - "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": "Skip {0}?" - }, - "mute_category": { - "message": "Mute {0}?" - }, - "skip_to_category": { - "message": "Skip to {0}?", - "description": "Used for skipping to things (Skip to Highlight)" - }, - "skipped": { - "message": "{0} Skipped", - "description": "Example: Sponsor Skipped" - }, - "muted": { - "message": "{0} Muted", - "description": "Example: Sponsor Muted" - }, - "skipped_to_category": { - "message": "Skipped to {0}", - "description": "Used for skipping to things (Skipped to Highlight)" - }, - "disableAutoSkip": { - "message": "Disable Auto Skip" - }, - "enableAutoSkip": { - "message": "Enable Auto Skip" - }, - "audioNotification": { - "message": "Audio Notification On Skip" - }, - "audioNotificationDescription": { - "message": "Audio notification on skip will play a sound whenever a segment is skipped. If disabled (or auto skip is disabled), no sound will be played." - }, - "showTimeWithSkips": { - "message": "Show Time With Skips Removed" - }, - "showTimeWithSkipsDescription": { - "message": "This time appears in brackets next to the current time on below the Seek Bar. This shows the total video duration minus any segments. This includes segments marked as only \"Show In Seek Bar\"." - }, - "youHaveSkipped": { - "message": "You've skipped " - }, - "minLower": { - "message": "minute" - }, - "minsLower": { - "message": "minutes" - }, - "hourLower": { - "message": "hour" - }, - "hoursLower": { - "message": "hours" - }, - "youHaveSavedTime": { - "message": "You've saved people", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "youHaveSavedTimeEnd": { - "message": " of their lives", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "statusReminder": { - "message": "Check status.sponsor.ajay.app for server status." - }, - "changeUserID": { - "message": "Import/Export Your Private UserID" - }, - "whatChangeUserID": { - "message": "This should be kept private. This is like a password and should not be shared with anyone. If someone has this, they can impersonate you. If you are looking for your public userID, click the clipboard icon in the popup." - }, - "setUserID": { - "message": "Set Private UserID" - }, - "userIDChangeWarning": { - "message": "Warning: Changing the Private UserID is permanent. Are you sure you would like to do this? Make sure to backup your old one just in case." - }, - "createdBy": { - "message": "Created By" - }, - "supportOtherSites": { - "message": "Support 3rd Party YouTube-Sites" - }, - "supportOtherSitesDescription": { - "message": "Support third party YouTube clients. To enable support, you must accept the extra permissions. This does NOT work in incognito on Chrome and other Chromium variants.", - "description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube" - }, - "supportedSites": { - "message": "Supported Sites: " - }, - "optionsInfo": { - "message": "Enable Invidious support, disable auto skip, hide buttons and more." - }, - "addInvidiousInstance": { - "message": "Add 3rd-Party Client Instance" - }, - "addInvidiousInstanceDescription": { - "message": "Add a custom instance. This must be formatted with JUST the domain. Example: invidious.ajay.app" - }, - "add": { - "message": "Add" - }, - "addInvidiousInstanceError": { - "message": "This is an invalid domain. This should JUST include the domain part. Example: invidious.ajay.app" - }, - "resetInvidiousInstance": { - "message": "Reset Invidious Instance List" - }, - "resetInvidiousInstanceAlert": { - "message": "You are about to reset the Invidious instance list" - }, - "currentInstances": { - "message": "Current Instances:" - }, - "minDuration": { - "message": "Minimum duration (seconds):" - }, - "minDurationDescription": { - "message": "Segments shorter than the set value will not be skipped or show in the player." - }, - "enableManualSkipOnFullVideo": { - "message": "Use manual skip when a full video label exists" - }, - "whatManualSkipOnFullVideo": { - "message": "For people who want to watch the video uninterrupted if it is fully sponsored or self promotion." - }, - "skipNoticeDuration": { - "message": "Skip notice duration (seconds):" - }, - "skipNoticeDurationDescription": { - "message": "The skip notice will stay on screen for at least this many seconds. For manual skipping, it may be visible for longer." - }, - "shortCheck": { - "message": "The following submission is shorter than your minimum duration option. This could mean that this is already submitted, and just being ignored due to this option. Are you sure you would like to submit?" - }, - "liveOrPremiere": { - "message": "Submitting on an active livestream or premiere is not allowed. Please wait until it finishes, then refresh the page and verify that the segments are still valid." - }, - "showUploadButton": { - "message": "Show Upload Button" - }, - "customServerAddress": { - "message": "SponsorBlock Server Address" - }, - "customServerAddressDescription": { - "message": "The address SponsorBlock uses to make calls to the server.\nUnless you have your own server instance, this should not be changed." - }, - "save": { - "message": "Save" - }, - "reset": { - "message": "Reset" - }, - "customAddressError": { - "message": "This address is not in the right form. Make sure you have http:// or https:// at the beginning and no trailing slashes." - }, - "areYouSureReset": { - "message": "Are you sure you would like to reset this?" - }, - "mobileUpdateInfo": { - "message": "m.youtube.com is now supported" - }, - "exportOptions": { - "message": "Import/Export All Options" - }, - "exportOptionsCopy": { - "message": "Edit/copy" - }, - "exportOptionsDownload": { - "message": "Save to file" - }, - "exportOptionsUpload": { - "message": "Load from file" - }, - "whatExportOptions": { - "message": "This is your entire configuration in JSON. This includes your Private UserID, so be sure to share this wisely." - }, - "setOptions": { - "message": "Set Options" - }, - "exportOptionsWarning": { - "message": "Warning: Changing the options is permanent and can break your install. Are you sure you would like to do this? Make sure to backup your old one just in case." - }, - "incorrectlyFormattedOptions": { - "message": "This JSON is not formatted correctly. Your options have not been changed." - }, - "confirmNoticeTitle": { - "message": "Submit Segment" - }, - "submit": { - "message": "Submit" - }, - "cancel": { - "message": "Cancel" - }, - "delete": { - "message": "Delete" - }, - "preview": { - "message": "Preview" - }, - "unsubmitted": { - "message": "Unsubmitted" - }, - "inspect": { - "message": "Inspect" - }, - "edit": { - "message": "Edit" - }, - "copyDebugInformation": { - "message": "Copy Debug Information To Clipboard" - }, - "copyDebugInformationFailed": { - "message": "Failed to write to clipboard" - }, - "copyDebugInformationOptions": { - "message": "Copies information to the clipboard to be provided to a developer when raising a bug / when a developer requests it. Sensitive information such as your user ID, whitelisted channels, and custom server address have been removed. However it does contain information such as your useragent, browser, operating system, and extension version number. " - }, - "copyDebugInformationComplete": { - "message": "The debug information has been copied to the clip board. Feel free to remove any information you would rather not share. Save this in a text file or paste into the bug report." - }, - "keyAlreadyUsed": { - "message": "This shortcut is bound to another action. Please select a different one." - }, - "to": { - "message": "to", - "description": "Used between segments. Example: 1:20 to 1:30" - }, - "CopiedExclamation": { - "message": "Copied!", - "description": "Used after something has been copied to the clipboard. Example: 'Copied!'" - }, - "generic_guideline1": { - "message": "Include segue transitions" - }, - "generic_guideline2": { - "message": "Plays as if nothing was skipped" - }, - "category_sponsor": { - "message": "Sponsor" - }, - "category_sponsor_description": { - "message": "Paid promotion, paid referrals and direct advertisements. Not for self-promotion or free shoutouts to causes/creators/websites/products they like." - }, - "category_sponsor_guideline1": { - "message": "Paid promotions" - }, - "category_sponsor_guideline2": { - "message": "Not for donations or custom merch" - }, - "category_selfpromo": { - "message": "Unpaid/Self Promotion" - }, - "category_selfpromo_description": { - "message": "Similar to \"sponsor\" except for unpaid or self promotion. This includes sections about merchandise, donations, or information about who they collaborated with." - }, - "category_selfpromo_guideline1": { - "message": "Donations, memberships and custom merch" - }, - "category_selfpromo_guideline2": { - "message": "Free shoutouts that don't add to the video" - }, - "category_selfpromo_guideline3": { - "message": "Not for corporate designed products and merch" - }, - "category_exclusive_access": { - "message": "Exclusive Access" - }, - "category_exclusive_access_description": { - "message": "Only for labeling entire videos. Used when a video showcases a product, service or location that they've received free or subsidized access to." - }, - "category_exclusive_access_pill": { - "message": "This video showcases a product, service or location that they've received free or subsidized access to", - "description": "Short description for this category" - }, - "category_exclusive_access_guideline1": { - "message": "Entire video showcases something with free or subsidized access" - }, - "category_interaction": { - "message": "Interaction Reminder (Subscribe)" - }, - "category_interaction_description": { - "message": "When there is a short reminder to like, subscribe or follow them in the middle of content. If it is long or about something specific, it should be under self promotion instead." - }, - "category_interaction_guideline1": { - "message": "Short reminders to like, subscribe or follow" - }, - "category_interaction_guideline2": { - "message": "Includes indirect reminders to comment" - }, - "category_interaction_guideline3": { - "message": "Not for general promotion, only calls to action" - }, - "category_interaction_short": { - "message": "Interaction Reminder" - }, - "category_intro": { - "message": "Intermission/Intro Animation" - }, - "category_intro_description": { - "message": "An interval without actual content. Could be a pause, static frame, repeating animation. This should not be used for transitions containing information." - }, - "category_intro_short": { - "message": "Intermission" - }, - "category_intro_guideline1": { - "message": "Interval without actual content" - }, - "category_intro_guideline2": { - "message": "Not for transitions with information" - }, - "category_outro": { - "message": "Endcards/Credits" - }, - "category_outro_description": { - "message": "Credits or when the YouTube endcards appear. Not for conclusions with information." - }, - "category_outro_guideline1": { - "message": "Don't include content, even if endcards are on screen" - }, - "category_preview": { - "message": "Preview/Recap" - }, - "category_preview_description": { - "message": "Collection of clips that show what is coming up in in this video or other videos in a series where all information is repeated later in the video." - }, - "category_preview_guideline1": { - "message": "Clips that appear later, or in a future video" - }, - "category_preview_guideline2": { - "message": "Recap of a previous video" - }, - "category_preview_guideline3": { - "message": "Not for sections that add additional content" - }, - "category_filler": { - "message": "Filler Tangent/Jokes" - }, - "category_filler_description": { - "message": "Tangential scenes added only for filler or humor that are not required to understand the main content of the video. This should not include segments providing context or background details. This is a very aggressive category meant for when you aren't in the mood for \"fun\"." - }, - "category_filler_short": { - "message": "Filler" - }, - "category_filler_guideline1": { - "message": "Tangential scenes only for filler or humor" - }, - "category_filler_guideline2": { - "message": "Distractions, bloopers, replays" - }, - "category_filler_guideline3": { - "message": "Not for scenes required to understand the topic" - }, - "category_music_offtopic": { - "message": "Music: Non-Music Section" - }, - "category_music_offtopic_description": { - "message": "Only for use in music videos. This only should be used for sections of music videos that aren't already covered by another category." - }, - "category_music_offtopic_short": { - "message": "Non-Music" - }, - "category_music_offtopic_guideline1": { - "message": "Sections not in official releases" - }, - "category_music_offtopic_guideline2": { - "message": "Non-music in a live performance" - }, - "category_poi_highlight": { - "message": "Highlight" - }, - "category_poi_highlight_description": { - "message": "The part of the video that most people are looking for. Similar to \"Video starts at x\" comments." - }, - "category_poi_highlight_guideline1": { - "message": "Section most people are looking for" - }, - "category_poi_highlight_guideline2": { - "message": "Can skip context" - }, - "category_poi_highlight_guideline3": { - "message": "Can skip to the title or thumbnail" - }, - "category_chapter": { - "message": "Chapter" - }, - "category_chapter_description": { - "message": "Custom named chapters describing major sections of a video." - }, - "category_chapter_guideline1": { - "message": "Don't mention sponsor brand names" - }, - "category_chapter_guideline2": { - "message": "Use larger chapters for general sections" - }, - "category_chapter_guideline3": { - "message": "Smaller chapters can be placed inside larger ones" - }, - "category_livestream_messages": { - "message": "Livestream: Donation/Message Readings" - }, - "category_livestream_messages_short": { - "message": "Message Reading" - }, - "autoSkip": { - "message": "Auto Skip" - }, - "manualSkip": { - "message": "Manual Skip" - }, - "showOverlay": { - "message": "Show In Seek Bar" - }, - "disable": { - "message": "Disable" - }, - "autoSkip_POI": { - "message": "Auto skip to the start" - }, - "manualSkip_POI": { - "message": "Ask when video loads" - }, - "showOverlay_POI": { - "message": "Show In Seek Bar" - }, - "showOverlay_full": { - "message": "Show Label" - }, - "showOverlay_chapter": { - "message": "Show Chapters" - }, - "autoSkipOnMusicVideos": { - "message": "Auto skip all segments when there is a non-music segment" - }, - "muteSegments": { - "message": "Allow segments that mute audio instead of skip" - }, - "fullVideoSegments": { - "message": "Show an icon when a video is entirely an advertisement", - "description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo" - }, - "previewColor": { - "message": "Unsubmitted Color", - "description": "Referring to submissions that have not been sent to the server yet." - }, - "seekBarColor": { - "message": "Seek Bar Color" - }, - "category": { - "message": "Category" - }, - "skipOption": { - "message": "Skip Option", - "description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)" - }, - "enableTestingServer": { - "message": "Enable Beta Testing Server" - }, - "whatEnableTestingServer": { - "message": "Your submissions and votes WILL NOT COUNT towards the main server. Only use this for testing." - }, - "testingServerWarning": { - "message": "All submissions and votes WILL NOT COUNT towards the main server while connecting to the test server. Make sure to disable this when you want to make real submissions." - }, - "bracketNow": { - "message": "(Now)" - }, - "moreCategories": { - "message": "More Categories" - }, - "chooseACategory": { - "message": "Choose a Category" - }, - "enableThisCategoryFirst": { - "message": "To submit segments with the category of \"{0}\", you must enable it in the options. You will be redirected to the options now.", - "description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options." - }, - "poiOnlyOneSegment": { - "message": "Warning: This type of segment can have a maximum of one active at a time. Submitting multiple will cause a random one to be shown." - }, - "youMustSelectACategory": { - "message": "You must select a category for all segments you are submitting!" - }, - "bracketEnd": { - "message": "(End)" - }, - "End": { - "message": "End", - "description": "Button that skips to the end of a segment" - }, - "hiddenDueToDownvote": { - "message": "hidden: downvote" - }, - "hiddenDueToDuration": { - "message": "hidden: too short" - }, - "manuallyHidden": { - "message": "manually hidden" - }, - "channelDataNotFound": { - "description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.", - "message": "Channel ID is not loaded yet. If you are using an embedded video, try using the YouTube homepage instead. This could also be caused by changes in the YouTube layout, if you think so, make a comment here:" - }, - "invidiousPermissionRefresh": { - "message": "The browser has revoked the permission needed to function on Invidious and other 3rd-party sites. Please click the button below to reactivate this permission." - }, - "acceptPermission": { - "message": "Accept permission" - }, - "permissionRequestSuccess": { - "message": "Permission request succeeded!" - }, - "permissionRequestFailed": { - "message": "Permission request failed, did you click deny?" - }, - "adblockerIssueWhitelist": { - "message": "If you are unable to resolve this, then disable the setting 'Force Channel Check Before Skipping', as SponsorBlock is unable to retrieve the channel information for this video" - }, - "forceChannelCheck": { - "message": "Force Channel Check Before Skipping" - }, - "whatForceChannelCheck": { - "message": "By default, it will skip segments right away before it even knows what the channel is. By default, some segments at the start of the video might be skipped on whitelisted channels. Enabling this option will prevent this but making all skipping have a slight delay as getting the channelID can take some time. This delay might be unnoticeable if you have fast internet." - }, - "forceChannelCheckPopup": { - "message": "Consider Enabling \"Force Channel Check Before Skipping\"" - }, - "downvoteDescription": { - "message": "Incorrect/Wrong Timing" - }, - "incorrectVote": { - "message": "Incorrect" - }, - "harmfulVote": { - "message": "Harmful", - "description": "Used for chapter segments when the text is harmful/offensive to remove it faster" - }, - "incorrectCategory": { - "message": "Change Category" - }, - "nonMusicCategoryOnMusic": { - "message": "This video is categorized as music. Are you sure this has a sponsor? If this is actually a \"Non-Music segment\", open up the extension options and enable this category. Then, you can submit this segment as \"Non-Music\" instead of sponsor. Please read the guidelines if you are confused." - }, - "multipleSegments": { - "message": "Multiple Segments" - }, - "guidelines": { - "message": "Guidelines" - }, - "readTheGuidelines": { - "message": "Read The Guidelines!!", - "description": "Show the first time they submit or if they are \"high risk\"" - }, - "categoryUpdate1": { - "message": "Categories are here!" - }, - "categoryUpdate2": { - "message": "Open the options to skip intros, outros, merch, etc." - }, - "help": { - "message": "Help" - }, - "GotIt": { - "message": "Got it", - "description": "Used as the button to dismiss a tooltip" - }, - "fullVideoTooltipWarning": { - "message": "This segment is large. If the whole video is about one topic, then change from \"Skip\" to \"Full Video\". See the guidelines for more information." - }, - "categoryPillTitleText": { - "message": "This entire video is labeled as this category and is too tightly integrated to be able to separate" - }, - "chapterNameTooltipWarning": { - "message": "One of your chapter names is similar to a category. You should use categories when possible instead." - }, - "experiementOptOut": { - "message": "Opt-out of all future experiments", - "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": "Hide forever" - }, - "warningChatInfo": { - "message": "We noticed you were making some common mistakes that are not malicious" - }, - "warningTitle": { - "message": "You got a warning" - }, - "questionButton": { - "message": "I have a question" - }, - "warningConfirmButton": { - "message": "I understand the reason" - }, - "warningError": { - "message": "Error when trying to acknowledge warning:" - }, - "Donate": { - "message": "Donate" - }, - "considerDonating": { - "message": "Help fund development" - }, - "hideDonationLink": { - "message": "Hide Donation Link" - }, - "darkModeOptionsPage": { - "message": "Dark Mode On Options Page" - }, - "helpPageThanksForInstalling": { - "message": "Thanks for installing SponsorBlock." - }, - "helpPageReviewOptions": { - "message": "Please review the options below" - }, - "helpPageFeatureDisclaimer": { - "message": "Many features are disabled by default. If you want to skip intros, outros, use Invidious, etc., enable them below. You can also hide/show UI elements." - }, - "helpPageHowSkippingWorks": { - "message": "How skipping works" - }, - "helpPageHowSkippingWorks1": { - "message": "Video segments will automatically be skipped if they are found in the database. You can open the popup by clicking the extension icon to get a preview of what they are." - }, - "helpPageHowSkippingWorks2": { - "message": "Whenever you skip a segment, you will get notice. If the timing seems wrong vote down by clicking downvote! You can also vote in the popup." - }, - "Submitting": { - "message": "Submitting" - }, - "helpPageSubmitting1": { - "message": "Submitting can either be done in the popup by hitting the \"Segment Starts Now\" button or in the video player with the buttons on the player." - }, - "helpPageSubmitting2": { - "message": "Clicking the play button indicated the start of a segment and clicking the stop icon indicates the end. You can prepare multiple sponsors before hitting submit. Clicking the upload button will submit. Clicking the garbage can will delete." - }, - "Editing": { - "message": "Editing" - }, - "helpPageEditing1": { - "message": "If you messed up, you can edit or delete your segments after clicking the up arrow button." - }, - "helpPageTooSlow": { - "message": "This is too slow" - }, - "helpPageTooSlow1": { - "message": "There are hotkeys if you want to use them. Press the semicolon key to indicate the start/end of a sponsor segment and click the apostrophe to submit. These can be changed in the options. If you don't use QWERTY, you should probably change the keybinding." - }, - "helpPageCopyOfDatabase": { - "message": "Can I get a copy of the Database? What happens if you disappear?" - }, - "helpPageCopyOfDatabase1": { - "message": "The database is public and available at" - }, - "helpPageCopyOfDatabase2": { - "message": "The source code is freely available. So, even if something happens to me, your submissions are not lost." - }, - "helpPageNews": { - "message": "News and how it is made" - }, - "helpPageSourceCode": { - "message": "Where can I get the source code?" - }, - "Credits": { - "message": "Credits" - }, - "LearnMore": { - "message": "Learn More" - }, - "FullDetails": { - "message": "Full Details" - }, - "CopyDownvoteButtonInfo": { - "message": "Downvotes and creates a local copy for you to resubmit" - }, - "OpenCategoryWikiPage": { - "message": "Open this category's wiki page." - }, - "CopyAndDownvote": { - "message": "Copy and downvote" - }, - "ContinueVoting": { - "message": "Continue Voting" - }, - "ChangeCategoryTooltip": { - "message": "This will instantly apply to your segments" - }, - "downvote": { - "message": "Downvote" - }, - "upvote": { - "message": "Upvote" - }, - "hideSegment": { - "message": "Hide segment" - }, - "skipSegment": { - "message": "Skip segment" - }, - "playChapter": { - "message": "Play chapter" - }, - "SponsorTimeEditScrollNewFeature": { - "message": "Use your mousewheel while hovering over the edit box to quickly adjust the time. Combinations of the ctrl or shift key can be used to fine tune the changes." - }, - "categoryPillNewFeature": { - "message": "New! See when a video is entirely sponsored or self-promotion" - }, - "dayAbbreviation": { - "message": "d", - "description": "100d" - }, - "hourAbbreviation": { - "message": "h", - "description": "100h" - }, - "optionsTabBehavior": { - "message": "Behavior", - "description": "Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabInterface": { - "message": "Interface", - "description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabKeyBinds": { - "message": "Keyboard shortcuts", - "description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabBackup": { - "message": "Backup/Restore", - "description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabAdvanced": { - "message": "Miscellaneous", - "description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "noticeVisibilityLabel": { - "message": "Skip notice appearance", - "description": "Option label" - }, - "unbind": { - "message": "Unbind", - "description": "Unbind keyboard shortcut" - }, - "notSet": { - "message": "Not set" - }, - "change": { - "message": "Change" - }, - "youtubeKeybindWarning": { - "message": "This is a built-in YouTube shortcut. Are you sure you want to use it?" - }, - "betaServerWarning": { - "message": "BETA Server is enabled!" - }, - "openOptionsPage": { - "message": "Open options page" - }, - "resetToDefault": { - "message": "Reset settings to default" - }, - "confirmResetToDefault": { - "message": "Are you sure you want to reset all settings to their default values? This cannot be undone." - }, - "exportSegments": { - "message": "Export segments" - }, - "importSegments": { - "message": "Import segments" - }, - "Import": { - "message": "Import", - "description": "Button to initiate importing segments. Appears under the textbox where they paste in the data" - }, - "redeemSuccess": { - "message": "Redeem Successful!" - }, - "redeemFailed": { - "message": "License key is invalid" - }, - "hideUpsells": { - "message": "Hide options not available without extra payment" - }, - "chooseACountry": { - "message": "Choose a country" - }, - "noDiscount": { - "message": "You do not qualify for a discount" - }, - "discountLink": { - "message": "Discount Link (See the pink price)" - }, - "selectYourCountry": { - "message": "Select your country" - }, - "alreadyDonated": { - "message": "If you've donated any amount before now, you may redeem free access by emailing:", - "description": "After the colon is an email address" - }, - "cantAfford": { - "message": "If you can't afford to purchase a license, click {here} to see if you are eligible for a discount", - "description": "Keep the curly braces. The word 'here' should be translated as well." - }, - "patreonSignIn": { - "message": "Sign in with Patreon" - }, - "redeem": { - "message": "Redeem" - }, - "joinOnPatreon": { - "message": "Subscribe on Patreon" - }, - "oneTimePurchase": { - "message": "One Time Purchase" - }, - "enterLicenseKey": { - "message": "Enter License Key" - }, - "chaptersPage1": { - "message": "SponsorBlock crowd-sourced chapters feature is only available to people who purchase a license, or for people who are granted access for free due their past contributions" - }, - "chaptersPage2": { - "message": "Note: Permission to submit chapters is still based on calculated reputation. Purchasing a license only allows you to view chapters submitted by others", - "description": "On the chapters page for getting access to the paid chapters feature" - }, - "chapterNewFeature": { - "message": "New Feature: Crowd-sourced custom chapters. These are custom-named sections in videos that can be stacked to get more and more precise. Purchase a license to view the chapters submitted on this video such as: ", - "description": "After the comma, a list of chapters for this video will appear" - }, - "chapterNewFeature2": { - "message": "New Feature: Crowd-sourced custom chapters. These are custom-named sections in videos that can be stacked to get more and more precise. You have access for free, enable in options." - }, - "unsubmittedSegmentCounts": { - "message": "You currently have {0} on {1}", - "description": "Example: You currently have 12 unsubmitted segments on 5 videos" - }, - "unsubmittedSegmentCountsZero": { - "message": "You currently have no unsubmitted segments", - "description": "Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments" - }, - "unsubmittedSegmentsSingular": { - "message": "unsubmitted segment", - "description": "Example: You currently have 1 *unsubmitted segment* on 1 video" - }, - "unsubmittedSegmentsPlural": { - "message": "unsubmitted segments", - "description": "Example: You currently have 12 *unsubmitted segments* on 5 videos" - }, - "videosSingular": { - "message": "video", - "description": "Example: You currently have 3 unsubmitted segments on 1 *video*" - }, - "videosPlural": { - "message": "videos", - "description": "Example: You currently have 12 unsubmitted segments on 5 *videos*" - }, - "clearUnsubmittedSegments": { - "message": "Clear all segments", - "description": "Label for a button in settings" - }, - "clearUnsubmittedSegmentsConfirm": { - "message": "Are you sure you want to clear all your unsubmitted segments?", - "description": "Confirmation message for the Clear unsubmitted segments button" - }, - "showUnsubmittedSegments": { - "message": "Show segments", - "description": "Show/hide button for the unsubmitted segments list" - }, - "hideUnsubmittedSegments": { - "message": "Hide segments", - "description": "Show/hide button for the unsubmitted segments list" - }, - "videoID": { - "message": "Video ID", - "description": "Header of the unsubmitted segments list" - }, - "segmentCount": { - "message": "Segment Count", - "description": "Header of the unsubmitted segments list" - }, - "actions": { - "message": "Actions", - "description": "Header of the unsubmitted segments list" - }, - "exportSegmentsAsURL": { - "message": "Share as URL" - } -} diff --git a/public/_locales/es/messages.json b/public/_locales/es/messages.json deleted file mode 100644 index 2bce7601..00000000 --- a/public/_locales/es/messages.json +++ /dev/null @@ -1,1247 +0,0 @@ -{ - "fullName": { - "message": "SponsorBlock para YouTube - Omitir Sponsors", - "description": "Name of the extension." - }, - "Description": { - "message": "Salte todos los sponsors, súplicas de suscripción y más en vídeos de YouTube. Reporta sponsors en los vídeos que veas para ahorrarle tiempo a los demás.", - "description": "Description of the extension." - }, - "400": { - "message": "El servidor dijo que esta solicitud no era válida" - }, - "429": { - "message": "Has enviado demasiados tiempos de sponsor en este video, ¿estas seguro de que hay tantos?" - }, - "409": { - "message": "Esto ya ha sido enviado antes" - }, - "channelWhitelisted": { - "message": "¡Canal Permitido!" - }, - "Segment": { - "message": "segmento" - }, - "Segments": { - "message": "segmentos" - }, - "SegmentsCap": { - "message": "Segmentos" - }, - "Chapters": { - "message": "Capítulos" - }, - "renderAsChapters": { - "message": "Procesar 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 actual al lado del tiempo del video" - }, - "upvoteButtonInfo": { - "message": "Votar positivamente este envío" - }, - "reportButtonTitle": { - "message": "Reportar" - }, - "reportButtonInfo": { - "message": "Reportar este envío como incorrecto." - }, - "Dismiss": { - "message": "Descartar" - }, - "Loading": { - "message": "Cargando..." - }, - "Hide": { - "message": "Nunca Mostrar" - }, - "hitGoBack": { - "message": "Haz clic en no omitir para volver a donde estabas." - }, - "unskip": { - "message": "No omitir" - }, - "reskip": { - "message": "Volver a saltar" - }, - "unmute": { - "message": "Quitar silencio" - }, - "paused": { - "message": "Pausado" - }, - "manualPaused": { - "message": "Temporizador Detenido" - }, - "confirmMSG": { - "message": "Para editar o eliminar valores individuales, haz clic en el botón de información o abre la ventana de extensión haciendo clic en el icono de extensión en la esquina superior derecha." - }, - "clearThis": { - "message": "¿Estas seguro de que quieres eliminar esto?\n\n" - }, - "Unknown": { - "message": "Se ha producido un error enviando tus tiempos de sponsor, por favor inténtalo de nuevo más tarde." - }, - "sponsorFound": { - "message": "¡Este video tiene segmentos en la base de datos!" - }, - "sponsor404": { - "message": "No se han encontrado segmentos" - }, - "sponsorStart": { - "message": "Marcar inicio de segmento" - }, - "sponsorEnd": { - "message": "Marcar final de segmento" - }, - "sponsorCancel": { - "message": "Cancelar Creación de Segmento" - }, - "noVideoID": { - "message": "No se encontró vídeo de YouTube.\nSi esto es incorrecto, actualice la pestaña." - }, - "refreshSegments": { - "message": "Actualizar segmentos" - }, - "success": { - "message": "¡Completado!" - }, - "voted": { - "message": "¡Votado!" - }, - "serverDown": { - "message": "Parece que el servidor está desconectado. Póngase en contacto con el desarrollador inmediatamente." - }, - "connectionError": { - "message": "Ha ocurrido un error de conexión. Código de error: " - }, - "clearTimes": { - "message": "Borrar Segmentos" - }, - "openPopup": { - "message": "Abrir Ventana de SponsorBlock" - }, - "closePopup": { - "message": "Cerrar la ventana" - }, - "closeIcon": { - "message": "Icono de cerrar" - }, - "SubmitTimes": { - "message": "Enviar Segmentos" - }, - "sortSegments": { - "message": "Ordenar Segmentos" - }, - "submitCheck": { - "message": "¿Estás seguro de que quieres enviar esto?" - }, - "whitelistChannel": { - "message": "Permitir Canal" - }, - "removeFromWhitelist": { - "message": "Quitar canal de la lista blanca" - }, - "voteOnTime": { - "message": "Vote En Un Segmento" - }, - "Submissions": { - "message": "Envíos" - }, - "savedPeopleFrom": { - "message": "Has salvado a personas de " - }, - "viewLeaderboard": { - "message": "Tablas de clasificación" - }, - "recordTimesDescription": { - "message": "Enviar" - }, - "submissionEditHint": { - "message": "La edición de la sección aparecerá después de hacer clic en enviar", - "description": "Appears in the popup to inform them that editing has been moved to the video player." - }, - "popupHint": { - "message": "Sugerencia: Puede asignar teclas para el envío en las opciones" - }, - "clearTimesButton": { - "message": "Eliminar Tiempos" - }, - "submitTimesButton": { - "message": "Enviar Tiempos" - }, - "publicStats": { - "message": "Esto se utiliza en la página de estadísticas públicas para mostrar cuánto has contribuido. Véala" - }, - "Username": { - "message": "Nombre de Usuario" - }, - "setUsername": { - "message": "Escoger Nombre De Usuario" - }, - "copyPublicID": { - "message": "Copiar el ID de usuario Público" - }, - "copySegmentID": { - "message": "Copiar ID de Segmento" - }, - "discordAdvert": { - "message": "¡Únete al servidor oficial de discord para darnos sugerencias y comentarios!" - }, - "hideThis": { - "message": "No mostrar esto" - }, - "Options": { - "message": "Opciones" - }, - "showButtons": { - "message": "Mostrar botones en el reproductor de YouTube" - }, - "hideButtons": { - "message": "Ocultar botones en el reproductor de YouTube" - }, - "hideButtonsDescription": { - "message": "Esto oculta los botones que aparecen en el reproductor de YouTube que se usan para enviar segmentos saltados." - }, - "showSkipButton": { - "message": "Mantener el Botón de \"Saltar a Destacado\" en el Reproductor" - }, - "showInfoButton": { - "message": "Mostrar botón de información en el reproductor de YouTube" - }, - "hideInfoButton": { - "message": "Ocultar botón de información en el reproductor de YouTube" - }, - "autoHideInfoButton": { - "message": "Ocular automáticamente el Botón de Información" - }, - "hideDeleteButton": { - "message": "Ocultar botón de eliminar en el reproductor de YouTube" - }, - "showDeleteButton": { - "message": "Mostrar botón de eliminar en el reproductor de YouTube" - }, - "enableViewTracking": { - "message": "Habilitar el conteo de omisiones" - }, - "whatViewTracking": { - "message": "Esta función rastrea los segmentos que se han saltado para que los usuarios sepan en qué medida sus envíos ayudaron a los demás y se utilizan como una métrica junto con los votos positivos para garantizar que no aparezca spam en la base de datos. La extensión envía un mensaje al servidor cada vez que se salta un segmento. Esperemos que la mayoría de la gente no cambie esta configuración para que los números de vistas sean exactos. :)" - }, - "enableViewTrackingInPrivate": { - "message": "Activar el seguimiento del número de saltos en las pestañas privadas/de incógnito" - }, - "enableTrackDownvotes": { - "message": "Almacenar los votos negativos de los segmentos" - }, - "whatTrackDownvotes": { - "message": "Los segmentos que votes negativamente permanecerán ocultos incluso después de actualizar la página" - }, - "trackDownvotesWarning": { - "message": "Advertencia: Desactivar esto eliminará todos los votos negativos previamente almacenados" - }, - "enableQueryByHashPrefix": { - "message": "Consulta Por Prefijo Hash" - }, - "whatQueryByHashPrefix": { - "message": "En el lugar de solicitar segmentos del servidor usando el videoID, se envían los primeros 4 caracteres del hash del videoID. Este servidor devolverá los datos de todos los vídeos con hashes similares." - }, - "enableRefetchWhenNotFound": { - "message": "Actualizar Segmentos En Nuevos Vídeos" - }, - "whatRefetchWhenNotFound": { - "message": "Si el video es nuevo, y no hay segmentos encontrados, seguirá recuperándose cada pocos minutos mientras veas." - }, - "enableShowCategoryWithoutPermission": { - "message": "Mostrar categorías en el menú de envío, incluso al no tener permiso de envío" - }, - "whatShowCategoryWithoutPermission": { - "message": "Algunas categorías requieren permiso para enviar debido a los requisitos mínimos de reputación" - }, - "showNotice": { - "message": "Mostrar aviso de nuevo" - }, - "showSkipNotice": { - "message": "Mostrar aviso después de que se omita un segmento" - }, - "showCategoryGuidelines": { - "message": "Mostrar Ayuda de la Categoría" - }, - "noticeVisibilityMode0": { - "message": "Avisos de Omisión de Tamaño Completo" - }, - "noticeVisibilityMode1": { - "message": "Avisos de Omisión Pequeños para la Omisión Automática" - }, - "noticeVisibilityMode2": { - "message": "Todos los Avisos de Omisión Pequeños" - }, - "noticeVisibilityMode3": { - "message": "Avisos de Omisión Desvanecidos para la Omisión Automática" - }, - "noticeVisibilityMode4": { - "message": "Todos los Avisos de Omisión Desvanecidos" - }, - "longDescription": { - "message": "SponsorBlock te permite saltarte los patrocinadores, intros, outros, recordatorios de suscripción y otras partes molestas de los videos de YouTube. SponsorBlock es una extensión de navegador de código abierto que permite a cualquiera enviar el tiempo de inicio y fin de los segmentos de patrocinadores y otros segmentos de los videos de YouTube. Una vez que una persona envía esta información, todos los que tengan esta extensión podrán saltearse ese segmento. También es posible saltar las secciones no musicales de los videos musicales.", - "description": "Full description of the extension on the store pages." - }, - "website": { - "message": "Sitio Web", - "description": "Used on Firefox Store Page" - }, - "sourceCode": { - "message": "Código Fuente", - "description": "Used on Firefox Store Page" - }, - "noticeUpdate": { - "message": "¡El aviso ha sido actualizado!", - "description": "The first line of the message displayed after the notice was upgraded." - }, - "noticeUpdate2": { - "message": "Si aún no te gusta, pulsa el botón de nunca mostrar.", - "description": "The second line of the message displayed after the notice was upgraded." - }, - "setSkipShortcut": { - "message": "Omitir segmento", - "description": "Keybind label" - }, - "setStartSponsorShortcut": { - "message": "Iniciar/detener segmento", - "description": "Keybind label" - }, - "setSubmitKeybind": { - "message": "Enviar segmentos", - "description": "Keybind label" - }, - "nextChapterKeybind": { - "message": "Siguiente capítulo", - "description": "Keybind label" - }, - "previousChapterKeybind": { - "message": "Capítulo anterior", - "description": "Keybind label" - }, - "keybindDescription": { - "message": "Selecciona una tecla escribiéndola y elige las teclas modificadoras que desees utilizar." - }, - "0": { - "message": "Tiempo de espera agotado. Compruebe su conexión a Internet. Si su internet está funcionando, el servidor probablemente esta sobrecargado o desconectado." - }, - "disableSkipping": { - "message": "Saltar está activado" - }, - "enableSkipping": { - "message": "Saltar está desactivado" - }, - "yourWork": { - "message": "Tu trabajo", - "description": "Used to describe the section that will show you the statistics from your submissions." - }, - "502": { - "message": "El servidor parece estar sobrecargado. Inténtalo de nuevo en unos segundos." - }, - "errorCode": { - "message": "Código de error: " - }, - "skip": { - "message": "Omitir" - }, - "mute": { - "message": "Silenciar" - }, - "full": { - "message": "Video 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": "¿Saltar a {0}?", - "description": "Used for skipping to things (Skip to Highlight)" - }, - "skipped": { - "message": "{0} Omitido/as", - "description": "Example: Sponsor Skipped" - }, - "muted": { - "message": "{0} Silenciado", - "description": "Example: Sponsor Muted" - }, - "skipped_to_category": { - "message": "Se ha saltado a {0}", - "description": "Used for skipping to things (Skipped to Highlight)" - }, - "disableAutoSkip": { - "message": "Desactivar la omisión automática" - }, - "enableAutoSkip": { - "message": "Activar la omisión automática" - }, - "audioNotification": { - "message": "Notificación de audio al omitir" - }, - "audioNotificationDescription": { - "message": "Si se salta un segmento, se oirá un sonido de notificación de audio. Si se desactiva (o si se desactiva la función de omisión automática), no se reproducirá ningún sonido." - }, - "showTimeWithSkips": { - "message": "Mostrar la duración del video con las secciones omitidas" - }, - "showTimeWithSkipsDescription": { - "message": "Esta duración aparece entre paréntesis junto al tiempo actual del video, debajo de la barra de navegación. Esta muestra la duración total del vídeo menos cualquier segmento eliminado. Esto incluye los segmentos marcados como solo \"Mostrar en la barra de navegación\"." - }, - "youHaveSkipped": { - "message": "Has saltado " - }, - "minLower": { - "message": "minuto" - }, - "minsLower": { - "message": "minutos" - }, - "hourLower": { - "message": "hora" - }, - "hoursLower": { - "message": "horas" - }, - "youHaveSavedTime": { - "message": "Has salvado personas", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "youHaveSavedTimeEnd": { - "message": " de sus vidas", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "statusReminder": { - "message": "Comprueba status.sponsor.ajay.app para ver el estado del servidor." - }, - "changeUserID": { - "message": "Importar/Exportar su ID de usuario Privado" - }, - "whatChangeUserID": { - "message": "Esto se debería mantener privado. Esto es como una contraseña y no debe ser compartido con nadie. Si alguien tiene esto, puede suplantarte. Si estás buscando tu ID de usuario Público, haz clic en el icono de portapapeles en la ventana emergente." - }, - "setUserID": { - "message": "Establecer ID de usuario Privado" - }, - "userIDChangeWarning": { - "message": "Advertencia: El cambio del ID de usuario Privado es permanente. ¿Está seguro/a de que desea hacer esto? Asegúrese de respaldar el antiguo por si acaso." - }, - "createdBy": { - "message": "Creado Por" - }, - "supportOtherSites": { - "message": "Soportar sitios de YouTube de terceros" - }, - "supportOtherSitesDescription": { - "message": "Soportar clientes de YouTube de terceros. Para habilitar el soporte, debes aceptar los permisos extra. Esto NO funciona en incógnito en Chrome y otras variantes de Chromium.", - "description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube" - }, - "supportedSites": { - "message": "Sitios soportados: " - }, - "optionsInfo": { - "message": "Activar el soporte para Invidious, desactivar la omisión automática, oculta botones y más." - }, - "addInvidiousInstance": { - "message": "Añadir instancia de cliente de terceros" - }, - "addInvidiousInstanceDescription": { - "message": "Añadir una instancia personalizada. Esta debe formatearse SÓLO con el dominio. Ejemplo: invidious.ajay.app" - }, - "add": { - "message": "Agregar" - }, - "addInvidiousInstanceError": { - "message": "Este es un dominio inválido. SÓLO debería incluir la parte del dominio. Ejemplo: invidious.ajay.app" - }, - "resetInvidiousInstance": { - "message": "Restablecer la lista de instancias de Invidious" - }, - "resetInvidiousInstanceAlert": { - "message": "Está a punto de reiniciar la lista de instancias del Invidious" - }, - "currentInstances": { - "message": "Instancias actuales:" - }, - "minDuration": { - "message": "Duración mínima (segundos):" - }, - "minDurationDescription": { - "message": "Los segmentos más cortos que el valor configurado no se omitirán ni se mostrarán en el reproductor." - }, - "enableManualSkipOnFullVideo": { - "message": "Usar omisión manual cuando existe una etiqueta de vídeo completa" - }, - "whatManualSkipOnFullVideo": { - "message": "Para las personas que quieren ver el video sin interrupción si es totalmente patrocinado o autopromoción." - }, - "skipNoticeDuration": { - "message": "Duración del aviso de omisión (segundos):" - }, - "skipNoticeDurationDescription": { - "message": "El aviso de omisión permanecerá en la pantalla por lo menos este tiempo. Si la omisión es manual, podría ser visible por más tiempo." - }, - "shortCheck": { - "message": "El siguiente envío es más corto que su opción de duración mínima. Esto podría significar que esto ya se ha enviado y que simplemente se ha ignorado debido a esta opción. ¿Está seguro de que desea enviar?" - }, - "liveOrPremiere": { - "message": "No se permite enviar en una transmisión en vivo activa o estreno. Espere hasta que finalice, luego actualice la página y verifique que los segmentos aún sean válidos." - }, - "showUploadButton": { - "message": "Mostrar botón de subida" - }, - "customServerAddress": { - "message": "Dirección del servidor SponsorBlock" - }, - "customServerAddressDescription": { - "message": "La dirección que SponsorBlock utiliza para hacer llamadas al servidor.\nA menos que tengas tu propia instancia del servidor, no debería cambiarse." - }, - "save": { - "message": "Guardar" - }, - "reset": { - "message": "Restablecer" - }, - "customAddressError": { - "message": "La dirección no tiene el formato adecuado. Asegúrese de que tenga http:// o https:// al principio y que no haya barras al final." - }, - "areYouSureReset": { - "message": "¿Estás seguro de que te gustaría reiniciar esto?" - }, - "mobileUpdateInfo": { - "message": "m.youtube.com ahora es compatible" - }, - "exportOptions": { - "message": "Importar/Exportar todas las opciones" - }, - "exportOptionsCopy": { - "message": "Editar/copiar" - }, - "exportOptionsDownload": { - "message": "Guardar en archivo" - }, - "exportOptionsUpload": { - "message": "Cargar desde archivo" - }, - "whatExportOptions": { - "message": "Esta es toda su configuración en JSON. Esto incluye tu ID de usuario Privado, asegúrese de compartir esto con prudencia." - }, - "setOptions": { - "message": "Configurar opciones" - }, - "exportOptionsWarning": { - "message": "Advertencia: cambiar las opciones es permanente y puede romper la instalación. ¿Estás seguro de que te gustaría hacer esto? Asegúrate de hacer una copia de seguridad de la antigua por si acaso." - }, - "incorrectlyFormattedOptions": { - "message": "Este JSON no está correctamente formateado. Sus opciones no han sido cambiadas." - }, - "confirmNoticeTitle": { - "message": "Enviar segmento" - }, - "submit": { - "message": "Enviar" - }, - "cancel": { - "message": "Cancelar" - }, - "delete": { - "message": "Eliminar" - }, - "preview": { - "message": "Vista Previa" - }, - "unsubmitted": { - "message": "No enviado" - }, - "inspect": { - "message": "Inspeccionar" - }, - "edit": { - "message": "Editar" - }, - "copyDebugInformation": { - "message": "Copiar información de depuración al portapapeles" - }, - "copyDebugInformationFailed": { - "message": "Error al escribir al portapapeles" - }, - "copyDebugInformationOptions": { - "message": "Copia la información al portapapeles para ser proporcionada a un desarrollador cuando levanta un error / cuando un desarrollador lo solicita. Información sensible como su ID de usuario, canales de la lista blanca y la dirección del servidor personalizado han sido eliminados. Sin embargo, contiene información como su agente de usuario, navegador, sistema operativo y número de versión de la extensión. " - }, - "copyDebugInformationComplete": { - "message": "La información de depuración ha sido copiada al portapapeles. Siéntase libre de eliminar cualquier información que prefiera no compartir. Guarde esto en un archivo de texto o péguelo en el informe de errores." - }, - "keyAlreadyUsed": { - "message": "Este atajo está vinculado a otra acción. Por favor, selecciona uno diferente." - }, - "to": { - "message": "a", - "description": "Used between segments. Example: 1:20 to 1:30" - }, - "CopiedExclamation": { - "message": "¡Copiado!", - "description": "Used after something has been copied to the clipboard. Example: 'Copied!'" - }, - "generic_guideline1": { - "message": "Incluye transiciones entre segmentos" - }, - "generic_guideline2": { - "message": "Se reproduce como si no se hubiera omitido nada" - }, - "category_sponsor": { - "message": "Sponsor" - }, - "category_sponsor_description": { - "message": "Promoción pagada, recomendaciones pagadas y anuncios directos. No para promoción propia o agradecimientos gratuitos a causas/creadores/sitios web/productos que les gusten." - }, - "category_sponsor_guideline1": { - "message": "Promociones pagadas" - }, - "category_sponsor_guideline2": { - "message": "No para donaciones o mercancía personalizada" - }, - "category_selfpromo": { - "message": "Promoción Propia/No Remunerada" - }, - "category_selfpromo_description": { - "message": "Similar a \"sponsor\", excepto que para la promoción propia o no remunerada. Esto incluye secciones sobre mercancía, donaciones o información sobre con quiénes colaboraron." - }, - "category_selfpromo_guideline1": { - "message": "Donaciones, membresías y mercancía personalizada" - }, - "category_selfpromo_guideline2": { - "message": "Agradecimientos gratuitos que no contribuyen al video" - }, - "category_selfpromo_guideline3": { - "message": "No para productos ni mercancía diseñados por empresas" - }, - "category_exclusive_access": { - "message": "Acceso Exclusivo" - }, - "category_exclusive_access_description": { - "message": "Solo para etiquetar videos completos. Utilizado cuando un video exhibe un producto, servicio o ubicación al que han recibido acceso gratuito o subsidiado." - }, - "category_exclusive_access_pill": { - "message": "Este video exhibe un producto, servicio o ubicación al que han recibido acceso gratuito o subsidiado", - "description": "Short description for this category" - }, - "category_exclusive_access_guideline1": { - "message": "Todo el video muestra algo con acceso gratuito o subsidiado" - }, - "category_interaction": { - "message": "Recordatorio de Interacción (Suscribir)" - }, - "category_interaction_description": { - "message": "Cuando hay un breve recordatorio para dar me gusta, suscribirse o seguirlos en medio del contenido. Si es largo o sobre algo específico, debería estar bajo promoción propia en su lugar." - }, - "category_interaction_guideline1": { - "message": "Breve recordatorio para dar me gusta, suscribirse o seguir" - }, - "category_interaction_guideline2": { - "message": "Incluye recordatorios indirectos para comentar" - }, - "category_interaction_guideline3": { - "message": "No para promoción general, solo llamadas a la acción" - }, - "category_interaction_short": { - "message": "Recordatorio de Interacción" - }, - "category_intro": { - "message": "Intermisión/Animación de Introducción" - }, - "category_intro_description": { - "message": "Un intervalo sin contenido real. Podría ser una pausa, un cuadro estático, una animación repetida. Esto no debe ser usado para transiciones que contengan información." - }, - "category_intro_short": { - "message": "Intermisión" - }, - "category_intro_guideline1": { - "message": "Intervalo sin contenido real" - }, - "category_intro_guideline2": { - "message": "No para transiciones con información" - }, - "category_outro": { - "message": "Tarjetas/Créditos" - }, - "category_outro_description": { - "message": "Créditos o cuando aparecen las tarjetas finales de YouTube. No para conclusiones con información." - }, - "category_outro_guideline1": { - "message": "No incluyas contenido, aun si las tarjetas finales están en pantalla" - }, - "category_preview": { - "message": "Vista previa/Recapitulación" - }, - "category_preview_description": { - "message": "Colección de clips que muestran lo que vendrá en este video u otros videos en una serie en la cual toda la información es repetida en el video." - }, - "category_preview_guideline1": { - "message": "Clips que aparecen más tarde o en un video futuro" - }, - "category_preview_guideline2": { - "message": "Recapitulación de un video anterior" - }, - "category_preview_guideline3": { - "message": "No para secciones que añaden contenido adicional" - }, - "category_filler": { - "message": "Tangentes de Relleno/Chistes" - }, - "category_filler_description": { - "message": "Escenas tangenciales añadidas solo de relleno o humor que no son necesarias para entender el contenido principal del video. Esto no debe incluir segmentos que proporcionen contexto o detalles de fondo. Esta es una categoría muy agresiva para cuando no está de humor para la \"diversión\"." - }, - "category_filler_short": { - "message": "Relleno" - }, - "category_filler_guideline1": { - "message": "Escenas tangenciales solo de relleno o humor" - }, - "category_filler_guideline2": { - "message": "Distracciones, bloopers, repeticiones" - }, - "category_filler_guideline3": { - "message": "No para escenas requeridas para entender el tema" - }, - "category_music_offtopic": { - "message": "Música: Sección sin musica" - }, - "category_music_offtopic_description": { - "message": "Sólo para el uso en vídeos musicales. Esto sólo debe utilizarse para secciones de vídeos musicales que no están ya cubiertos por otra categoría." - }, - "category_music_offtopic_short": { - "message": "Sin Música" - }, - "category_music_offtopic_guideline1": { - "message": "Secciones que no están en versiones oficiales" - }, - "category_music_offtopic_guideline2": { - "message": "Secciones sin música en un espectáculo en vivo" - }, - "category_poi_highlight": { - "message": "Destacado" - }, - "category_poi_highlight_description": { - "message": "La parte del video que la mayoría de gente está buscando. Similar a los comentarios que dicen \"El video comienza en x\"." - }, - "category_poi_highlight_guideline1": { - "message": "La sección que la mayoría de personas están buscando" - }, - "category_poi_highlight_guideline2": { - "message": "Puede omitir contexto" - }, - "category_poi_highlight_guideline3": { - "message": "Puede saltar al título o miniatura" - }, - "category_chapter": { - "message": "Capítulo" - }, - "category_chapter_description": { - "message": "Capítulos con nombre personalizado que describen las secciones principales de un vídeo." - }, - "category_chapter_guideline1": { - "message": "No mencione las marcas del patrocinador" - }, - "category_chapter_guideline2": { - "message": "Usar capítulos más grandes para secciones generales" - }, - "category_chapter_guideline3": { - "message": "Los capítulos más pequeños pueden colocarse dentro de capítulos más grandes" - }, - "category_livestream_messages": { - "message": "Directo: Lecturas de donaciones y mensajes" - }, - "category_livestream_messages_short": { - "message": "Lectura del mensaje" - }, - "autoSkip": { - "message": "Omitir automáticamente" - }, - "manualSkip": { - "message": "Omisión manual" - }, - "showOverlay": { - "message": "Mostrar en la barra de búsqueda" - }, - "disable": { - "message": "Desactivar" - }, - "autoSkip_POI": { - "message": "Omitir automáticamente al inicio" - }, - "manualSkip_POI": { - "message": "Preguntar cuando cargue el video" - }, - "showOverlay_POI": { - "message": "Mostrar en la barra de búsqueda" - }, - "showOverlay_full": { - "message": "Mostrar Etiqueta" - }, - "showOverlay_chapter": { - "message": "Mostrar capítulos" - }, - "autoSkipOnMusicVideos": { - "message": "Omitir automáticamente todos los segmentos cuando hay un segmento sin música" - }, - "muteSegments": { - "message": "Permitir segmentos que silencian el audio en lugar de omitir" - }, - "fullVideoSegments": { - "message": "Mostrar un icono cuando un video es enteramente un anuncio", - "description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo" - }, - "previewColor": { - "message": "Color No Enviado", - "description": "Referring to submissions that have not been sent to the server yet." - }, - "seekBarColor": { - "message": "Busca el color de la barra" - }, - "category": { - "message": "Categoría" - }, - "skipOption": { - "message": "Opción de Saltar", - "description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)" - }, - "enableTestingServer": { - "message": "Habilitar Servidor de Pruebas Beta" - }, - "whatEnableTestingServer": { - "message": "Sus envíos y votos NO CONTABILIZARÁN hacia el servidor principal. Sólo use esto para probar." - }, - "testingServerWarning": { - "message": "Todos los envíos y votos NO CONTABILIZARÁN hacia el servidor principal mientras se conecten al servidor de prueba. Asegúrate de desactivar esto cuando quieras hacer presentaciones reales." - }, - "bracketNow": { - "message": "(Ahora)" - }, - "moreCategories": { - "message": "Más categorías" - }, - "chooseACategory": { - "message": "Elija una categoría" - }, - "enableThisCategoryFirst": { - "message": "Para enviar segmentos con la categoría de \"{0}\", debes activarlo en las opciones. Serás redirigido a las opciones ahora.", - "description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options." - }, - "poiOnlyOneSegment": { - "message": "Advertencia: Solo puede haber uno de este tipo de segmento activo a la vez. Enviar múltiples causará que se muestre uno al azar." - }, - "youMustSelectACategory": { - "message": "¡Debes seleccionar una categoría para todos los segmentos que estés presentando!" - }, - "bracketEnd": { - "message": "(Final)" - }, - "End": { - "message": "Final", - "description": "Button that skips to the end of a segment" - }, - "hiddenDueToDownvote": { - "message": "oculto: voto negativo" - }, - "hiddenDueToDuration": { - "message": "oculto: demasiado corto" - }, - "manuallyHidden": { - "message": "manualmente oculto" - }, - "channelDataNotFound": { - "description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.", - "message": "El ID del canal no está cargado todavía. Si está usando un vídeo incrustado, intente usar la página de inicio de YouTube en su lugar. Esto también podría ser causado por cambios en el diseño de YouTube, si lo cree, haga un comentario aquí:" - }, - "invidiousPermissionRefresh": { - "message": "El navegador ha revocado el permiso necesario para funcionar en Invidious y otros sitios de terceros. Por favor, haga clic en el botón de abajo para reactivar este permiso." - }, - "acceptPermission": { - "message": "Aceptar permiso" - }, - "permissionRequestSuccess": { - "message": "¡Petición de permiso realizada con éxito!" - }, - "permissionRequestFailed": { - "message": "La petición de permiso ha fallado, ¿ha hecho clic en denegar?" - }, - "adblockerIssueWhitelist": { - "message": "Si no puede resolverlo, desactive la opción \"Forzar Comprobación de Canal antes de Saltar\", ya que SponsorBlock no puede recuperar la información del canal de este video" - }, - "forceChannelCheck": { - "message": "Forzar Comprobación de Canal antes de Saltar" - }, - "whatForceChannelCheck": { - "message": "Por defecto, se saltará los segmentos inmediatamente antes de saber cuál es el canal. Por defecto, algunos segmentos al principio del vídeo pueden ser salteados en los canales de la lista blanca. Al activar esta opción se evitará esto, pero haciendo que todos los saltos tengan un ligero retraso, ya que obtener el ID del canal puede llevar algún tiempo. Este retraso podría ser imperceptible si tienes una Internet rápida." - }, - "forceChannelCheckPopup": { - "message": "Considere la posibilidad de activar \"Forzar Comprobación de Canal antes de Saltar\"" - }, - "downvoteDescription": { - "message": "Tiempo incorrecto/equivocado" - }, - "incorrectVote": { - "message": "Incorrecto" - }, - "harmfulVote": { - "message": "Perjudicial", - "description": "Used for chapter segments when the text is harmful/offensive to remove it faster" - }, - "incorrectCategory": { - "message": "Cambiar Categoría" - }, - "nonMusicCategoryOnMusic": { - "message": "Este video está clasificado como música. ¿Estás seguro de que esto tiene un sponsor? Si esto es realmente un \"Segmento Sin Música\", abre las opciones de la extensión y activa esta categoría. Entonces, puedes enviar este segmento como \"Sin Música\" en lugar de sponsor. Por favor, lee las instrucciones si estás confundido/a." - }, - "multipleSegments": { - "message": "Múltiples segmentos" - }, - "guidelines": { - "message": "Instrucciones" - }, - "readTheGuidelines": { - "message": "¡¡¡Lee las instrucciones!!!", - "description": "Show the first time they submit or if they are \"high risk\"" - }, - "categoryUpdate1": { - "message": "¡Las categorías están aquí!" - }, - "categoryUpdate2": { - "message": "Abre las opciones de saltarse intros, outros, mercancía, etc." - }, - "help": { - "message": "Ayuda" - }, - "GotIt": { - "message": "Entendido", - "description": "Used as the button to dismiss a tooltip" - }, - "fullVideoTooltipWarning": { - "message": "Este segmento es grande. Si todo el video es acerca de un tema, entonces cámbielo de \"Omitir\" a \"Video completo\". Consulte las instrucciones para más información." - }, - "categoryPillTitleText": { - "message": "Todo el video está etiquetado como esta categoría y está muy estrechamente integrado como para poder separarlo" - }, - "chapterNameTooltipWarning": { - "message": "Uno de los nombres de sus capítulos es similar a una categoría. Debería usar categorías cuando sea posible en su lugar." - }, - "experiementOptOut": { - "message": "No participar en futuros experimentos", - "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": "Ocultar para siempre" - }, - "warningChatInfo": { - "message": "Hemos notado que has estado cometiendo algunos errores comunes que no son maliciosos" - }, - "warningTitle": { - "message": "Tienes una advertencia" - }, - "questionButton": { - "message": "Tengo una pregunta" - }, - "warningConfirmButton": { - "message": "Entiendo la razón" - }, - "warningError": { - "message": "Error al intentar confirmar la advertencia:" - }, - "Donate": { - "message": "Donar" - }, - "considerDonating": { - "message": "Ayuda a financiar el desarrollo" - }, - "hideDonationLink": { - "message": "Ocular Enlace de Donación" - }, - "darkModeOptionsPage": { - "message": "Modo Oscuro en la página de Opciones" - }, - "helpPageThanksForInstalling": { - "message": "Gracias por instalar SponsorBlock." - }, - "helpPageReviewOptions": { - "message": "Por favor, revise las siguientes opciones" - }, - "helpPageFeatureDisclaimer": { - "message": "Muchas funciones están desactivadas por defecto. Si quiere saltar intros, outros, usar Invidious, etc., actívelos a continuación. También puede ocular/mostrar los elementos de la interfaz." - }, - "helpPageHowSkippingWorks": { - "message": "Como funciona el salteo" - }, - "helpPageHowSkippingWorks1": { - "message": "Los segmentos de video serán omitidos automáticamente si son encontrados en la base de datos. Puede abrir la ventana emergente haciendo clic en el ícono de la extensión para obtener una vista previa de los que son." - }, - "helpPageHowSkippingWorks2": { - "message": "Cada vez que salte un segmento, recibirá un aviso. ¡Si el tiempo parece equivocado, dele un voto negativo! También puede votar en la ventana emergente." - }, - "Submitting": { - "message": "Envío" - }, - "helpPageSubmitting1": { - "message": "El envío puede realizarse desde la ventana emergente pulsando el botón \"El Segmento Inicia Ahora\" o en el reproductor de video con los botones de este." - }, - "helpPageSubmitting2": { - "message": "Hacer clic en el botón de reproducir indica el inicio de un segmento y hacer clic en el icono de detener indica el final de este. Puede preparar múltiples sponsors antes de enviarlos. Hacer clic en el botón de subida lo(s) enviará. Hacer clic en la papelera lo(s) borrará." - }, - "Editing": { - "message": "Edición" - }, - "helpPageEditing1": { - "message": "Si se equivoca, puede editar o eliminar sus segmentos después de hacer clic en el botón de flecha hacia arriba." - }, - "helpPageTooSlow": { - "message": "Esto es muy lento" - }, - "helpPageTooSlow1": { - "message": "Hay teclas de acceso directo, si quiere usarlas. Presione la tecla de punto y coma para indicar el inicio/final de un segmento de sponsor y haga clic en el apóstrofe para enviar. Estas se pueden cambiar en las opciones. Si no usa un teclado QWERTY, probablemente debería cambiar la asignación de teclas." - }, - "helpPageCopyOfDatabase": { - "message": "¿Puedo obtener una copia de la base de datos? ¿Qué sucede si tú desapareces?" - }, - "helpPageCopyOfDatabase1": { - "message": "La base de datos es pública y disponible en" - }, - "helpPageCopyOfDatabase2": { - "message": "El código fuente está disponible libremente. Así que, aun si algo me sucede, sus envíos no se perderán." - }, - "helpPageNews": { - "message": "Noticias y cómo se hace" - }, - "helpPageSourceCode": { - "message": "¿Dónde puedo conseguir el código fuente?" - }, - "Credits": { - "message": "Créditos" - }, - "LearnMore": { - "message": "Aprenda Más" - }, - "FullDetails": { - "message": "Detalles Completos" - }, - "CopyDownvoteButtonInfo": { - "message": "Vota negativamente y crea una copia local para que la puedas volver a enviar" - }, - "OpenCategoryWikiPage": { - "message": "Abrir la página de la wiki de esta categoría." - }, - "CopyAndDownvote": { - "message": "Copiar y votar negativamente" - }, - "ContinueVoting": { - "message": "Continuar Votando" - }, - "ChangeCategoryTooltip": { - "message": "Esto se aplicará instantáneamente a tus segmentos" - }, - "downvote": { - "message": "Votar negativamente" - }, - "upvote": { - "message": "Votar positivamente" - }, - "hideSegment": { - "message": "Ocultar segmento" - }, - "skipSegment": { - "message": "Omitir segmento" - }, - "playChapter": { - "message": "Reproducir capítulo" - }, - "SponsorTimeEditScrollNewFeature": { - "message": "Utilice la rueda del ratón mientras pasa el cursor por encima del cuadro de edición para ajustar el tiempo. Se pueden utilizar combinaciones de la tecla ctrl o shift para afinar los cambios." - }, - "categoryPillNewFeature": { - "message": "¡Nuevo! Mira cuando un video es enteramente un sponsor o una promoción propia" - }, - "dayAbbreviation": { - "message": "d", - "description": "100d" - }, - "hourAbbreviation": { - "message": "h", - "description": "100h" - }, - "optionsTabBehavior": { - "message": "Comportamiento", - "description": "Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabInterface": { - "message": "Interfaz", - "description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabKeyBinds": { - "message": "Atajos de teclado", - "description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabBackup": { - "message": "Respaldar/Restaurar", - "description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabAdvanced": { - "message": "Miscelánea", - "description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "noticeVisibilityLabel": { - "message": "Apariencia del aviso de omisión", - "description": "Option label" - }, - "unbind": { - "message": "Desvincular", - "description": "Unbind keyboard shortcut" - }, - "notSet": { - "message": "No establecido" - }, - "change": { - "message": "Cambiar" - }, - "youtubeKeybindWarning": { - "message": "Este un atajo incorporado de YouTube. ¿Estás seguro de que quieres usarlo?" - }, - "betaServerWarning": { - "message": "¡El servidor BETA está activado!" - }, - "openOptionsPage": { - "message": "Abrir página de opciones" - }, - "resetToDefault": { - "message": "Restablecer los ajustes por defecto" - }, - "confirmResetToDefault": { - "message": "¿Estás seguro de que quieres restablecer todos los ajustes a sus valores por defecto? Esto no se puede deshacer." - }, - "exportSegments": { - "message": "Exportar segmentos" - }, - "importSegments": { - "message": "Importar segmentos" - }, - "Import": { - "message": "Importar", - "description": "Button to initiate importing segments. Appears under the textbox where they paste in the data" - }, - "redeemSuccess": { - "message": "¡Canje exitoso!" - }, - "redeemFailed": { - "message": "La clave de la licencia no es válida" - }, - "hideUpsells": { - "message": "Ocultar opciones no disponibles sin pago extra" - }, - "chooseACountry": { - "message": "Seleccione un país" - }, - "noDiscount": { - "message": "No calificas para un descuento" - }, - "discountLink": { - "message": "Enlace del descuento (ver el precio rosado)" - }, - "selectYourCountry": { - "message": "Seleccione su país" - }, - "alreadyDonated": { - "message": "Si has donado cualquier cantidad antes del presente, puedes canjear el acceso gratuito vía correo electrónico:", - "description": "After the colon is an email address" - }, - "cantAfford": { - "message": "Si no puedes permitirte comprar una licencia, haz clic en {here} para ver si eres elegible para un descuento", - "description": "Keep the curly braces. The word 'here' should be translated as well." - }, - "patreonSignIn": { - "message": "Iniciar sesión con Patreon" - }, - "redeem": { - "message": "Canje" - }, - "joinOnPatreon": { - "message": "Danos tu apoyo en Patreon" - }, - "oneTimePurchase": { - "message": "Compra única" - }, - "enterLicenseKey": { - "message": "Ingresar clave de licencia" - }, - "chaptersPage1": { - "message": "La característica de los capítulos de origen de SponsorBlock sólo está disponible para personas que compran una licencia, o para las personas a las que se les concede acceso gratis debido a sus contribuciones anteriores" - }, - "chaptersPage2": { - "message": "Nota: El permiso para enviar capítulos todavía está basado en la reputación calculada. Comprar una licencia solo le permite ver los capítulos enviados por otros", - "description": "On the chapters page for getting access to the paid chapters feature" - }, - "chapterNewFeature": { - "message": "Nueva Función: Capítulos personalizados marcados por la comunidad. Estos son secciones con nombres personalizados en los videos que pueden ser acumulados para ser cada vez más precisos. Compre una licencia para ver los capítulos enviados en este video, como: ", - "description": "After the comma, a list of chapters for this video will appear" - }, - "chapterNewFeature2": { - "message": "Nueva Función: Capítulos personalizados marcados por la comunidad. Estos son secciones con nombres personalizados en los videos que pueden ser acumulados para ser cada vez más precisos. Tiene acceso gratuito, habilítelo en opciones." - }, - "unsubmittedSegmentCounts": { - "message": "Actualmente tienes {0} en {1}", - "description": "Example: You currently have 12 unsubmitted segments on 5 videos" - }, - "unsubmittedSegmentCountsZero": { - "message": "Actualmente no tiene segmentos no enviados", - "description": "Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments" - }, - "unsubmittedSegmentsSingular": { - "message": "segmento no enviado", - "description": "Example: You currently have 1 *unsubmitted segment* on 1 video" - }, - "unsubmittedSegmentsPlural": { - "message": "segmentos no enviados", - "description": "Example: You currently have 12 *unsubmitted segments* on 5 videos" - }, - "videosSingular": { - "message": "video", - "description": "Example: You currently have 3 unsubmitted segments on 1 *video*" - }, - "videosPlural": { - "message": "vídeos", - "description": "Example: You currently have 12 unsubmitted segments on 5 *videos*" - }, - "clearUnsubmittedSegments": { - "message": "Borrar todos los segmentos", - "description": "Label for a button in settings" - }, - "clearUnsubmittedSegmentsConfirm": { - "message": "¿Estás seguro de que quieres borrar todos tus segmentos no enviados?", - "description": "Confirmation message for the Clear unsubmitted segments button" - }, - "showUnsubmittedSegments": { - "message": "Mostrar segmentos", - "description": "Show/hide button for the unsubmitted segments list" - }, - "hideUnsubmittedSegments": { - "message": "Ocultar segmentos", - "description": "Show/hide button for the unsubmitted segments list" - }, - "videoID": { - "message": "ID del vídeo", - "description": "Header of the unsubmitted segments list" - }, - "segmentCount": { - "message": "Conteo de segmentos", - "description": "Header of the unsubmitted segments list" - }, - "actions": { - "message": "Acciones", - "description": "Header of the unsubmitted segments list" - }, - "exportSegmentsAsURL": { - "message": "Compartir como URL" - } -} diff --git a/public/_locales/et/messages.json b/public/_locales/et/messages.json deleted file mode 100644 index ecb8daeb..00000000 --- a/public/_locales/et/messages.json +++ /dev/null @@ -1,1144 +0,0 @@ -{ - "fullName": { - "message": "SponsorBlock YouTube'ile - jäta sponsorid vahele", - "description": "Name of the extension." - }, - "Description": { - "message": "Jäta sponsorid, tellimise palumine ja muud YouTube'i videote tüütused vahele. Teata vaadatavate videote sponsoritest, et säästa teiste aega.", - "description": "Description of the extension." - }, - "400": { - "message": "Server ütles, et see taotlus oli sobimatu" - }, - "429": { - "message": "Sa oled sellele ühele videole liiga palju sponsoriaegu saatnud, kas oled kindel, et neid on tõesti nii palju?" - }, - "409": { - "message": "See on juba varasemalt saadetud" - }, - "channelWhitelisted": { - "message": "Kanal ignoreerimisnimekirjas!" - }, - "Segment": { - "message": "segmendi" - }, - "Segments": { - "message": "segmenti" - }, - "SegmentsCap": { - "message": "Segmendid" - }, - "Chapters": { - "message": "Peatükid" - }, - "renderAsChapters": { - "message": "Kuva segmendid peatükkidena", - "description": "Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system" - }, - "showSegmentNameInChapterBar": { - "message": "Kuva praegune segment video kõrval" - }, - "upvoteButtonInfo": { - "message": "Anna segmendile poolthääl" - }, - "reportButtonTitle": { - "message": "Teavita" - }, - "reportButtonInfo": { - "message": "Teavita sellest segmendist kui sobimatust." - }, - "Dismiss": { - "message": "Sulge" - }, - "Loading": { - "message": "Laadimine..." - }, - "Hide": { - "message": "Ära kunagi näita" - }, - "hitGoBack": { - "message": "Vajuta \"kuva uuesti\", et jõuda sinna, kust tulid." - }, - "unskip": { - "message": "Kuva uuesti" - }, - "reskip": { - "message": "Jäta uuesti vahele" - }, - "unmute": { - "message": "Tühista vaigistus" - }, - "paused": { - "message": "Pausil" - }, - "manualPaused": { - "message": "Taimer peatatud" - }, - "confirmMSG": { - "message": "Üksikute väärtuste muutmiseks või kustutamiseks vajuta infonuppu või ava laienduse hüpik, vajutades selle ikoonile üleval paremal nurgas." - }, - "clearThis": { - "message": "Kas soovid tõesti selle tühjendada?\n\n" - }, - "Unknown": { - "message": "Sinu sponsoriaegade saatmisel esines tõrge, palun proovi hiljem uuesti." - }, - "sponsorFound": { - "message": "Sellel videol on andmebaasis segmente!" - }, - "sponsor404": { - "message": "Segmente ei leitud" - }, - "sponsorStart": { - "message": "Segment algab nüüd" - }, - "sponsorEnd": { - "message": "Segment lõpeb nüüd" - }, - "sponsorCancel": { - "message": "Tühista segmendi loomine" - }, - "noVideoID": { - "message": "YouTube'i videot ei leitud.\nKui see ei vasta tõele, laadi kaart uuesti." - }, - "refreshSegments": { - "message": "Värskenda segmendid" - }, - "success": { - "message": "Õnnestus!" - }, - "voted": { - "message": "Hääletatud!" - }, - "serverDown": { - "message": "Tundub, et server on maas. Anna sellest koheselt arendajale teada." - }, - "connectionError": { - "message": "Ühendusega esines tõrge. Veakood: " - }, - "clearTimes": { - "message": "Tühjenda segmendid" - }, - "openPopup": { - "message": "Ava SponsorBlocki hüpik" - }, - "closePopup": { - "message": "Sulge hüpik" - }, - "closeIcon": { - "message": "Sulgemisikoon" - }, - "SubmitTimes": { - "message": "Esita segmendid" - }, - "sortSegments": { - "message": "Sorteeri segmendid" - }, - "submitCheck": { - "message": "Kas soovid kindlasti selle saata?" - }, - "whitelistChannel": { - "message": "Lisa kanal ignoreerimisnimekirja" - }, - "removeFromWhitelist": { - "message": "Eemalda kanal ignoreerimisnimekirjast" - }, - "voteOnTime": { - "message": "Hääleta segmendi sobivust" - }, - "Submissions": { - "message": "Saadetud segmendid" - }, - "savedPeopleFrom": { - "message": "Oled inimeste aega säästnud " - }, - "viewLeaderboard": { - "message": "Edetabel" - }, - "recordTimesDescription": { - "message": "Saada" - }, - "submissionEditHint": { - "message": "Segmendi töötlemine avaneb pärast saatmist", - "description": "Appears in the popup to inform them that editing has been moved to the video player." - }, - "popupHint": { - "message": "Vihje: sa võid saatmiseks määrata valikutes klaviatuuriotseteid" - }, - "clearTimesButton": { - "message": "Tühjenda ajad" - }, - "submitTimesButton": { - "message": "Saada ajad" - }, - "publicStats": { - "message": "Seda kasutatakse avaliku statistika lehel, et näidata välja, kui palju oled panustanud. Vaata seda" - }, - "Username": { - "message": "Kasutajanimi" - }, - "setUsername": { - "message": "Määra kasutajanimi" - }, - "copyPublicID": { - "message": "Kopeeri avalik UserID" - }, - "copySegmentID": { - "message": "Kopeeri segmendi ID" - }, - "discordAdvert": { - "message": "Tule liitu ametliku Discordi serveriga, et anda soovitusi ja tagasisidet!" - }, - "hideThis": { - "message": "Peida see" - }, - "Options": { - "message": "Valikud" - }, - "showButtons": { - "message": "Kuva YouTube'i mängijal nupud" - }, - "hideButtons": { - "message": "Peida YouTube'i mängijal nupud" - }, - "hideButtonsDescription": { - "message": "See peidab nupud, mis kuvatakse YouTube'i mängijal vahelejätmiste segmentide saatmiseks." - }, - "showSkipButton": { - "message": "Hoia esiletõstuni vahelejätmise nuppu mängijal" - }, - "showInfoButton": { - "message": "Kuva YouTube'i mängijal infonupp" - }, - "hideInfoButton": { - "message": "Peida YouTube'i mängijal infonupp" - }, - "autoHideInfoButton": { - "message": "Peida infonupp automaatselt" - }, - "hideDeleteButton": { - "message": "Peida YouTube'i mängijal kustutusnupp" - }, - "showDeleteButton": { - "message": "Kuva YouTube'i mängijal kustutusnupp" - }, - "enableViewTracking": { - "message": "Luba vahelejätmiste arvu jälgimine" - }, - "whatViewTracking": { - "message": "See funktsioon jälgib, milliseid segmente sa oled vahele jätnud, et kasutajad teaksid, kui palju nende sisestus on teisi aidanud ning et koos poolthäältega veenduda rämpsu mittesattumises andmebaasi. Laiendus saadab iga segmendi vahelejätmisel serverisse sõnumi. Loodetavasti enamus inimesi ei muuda seda seadistust, et vaatamisarvud oleksid täpsed. :)" - }, - "enableViewTrackingInPrivate": { - "message": "Luba vahelejätmiste arvu jälgimine privaatsetel/inkognito kaartidel" - }, - "enableTrackDownvotes": { - "message": "Säilita segmentide vastuhääled" - }, - "whatTrackDownvotes": { - "message": "Segmendid, millele annad vastuhääle, peidetakse ka pärast lehe uuesti laadimist" - }, - "trackDownvotesWarning": { - "message": "Hoiatus: selle keelamine kustutab kõik varasemalt säilitatud vastuhääled" - }, - "enableQueryByHashPrefix": { - "message": "Küsi räsi eesliite järgi" - }, - "whatQueryByHashPrefix": { - "message": "VideoID järgi segmentide küsimise asemel saadetakse videoID räsi 4 esimest märki ning server saadab tagasi kõigi sarnaste räsidega videote andmed." - }, - "enableRefetchWhenNotFound": { - "message": "Too segmendid uutel videotel uuesti" - }, - "whatRefetchWhenNotFound": { - "message": "Kui video on uus ning segmente ei leitud, proovitakse vaatamise ajal iga paari minuti tagant uuesti segmente tuua." - }, - "showNotice": { - "message": "Kuva märkus uuesti" - }, - "showSkipNotice": { - "message": "Kuva segmendi vahelejätmisel teatis" - }, - "showCategoryGuidelines": { - "message": "Kuva kategooria abi" - }, - "noticeVisibilityMode0": { - "message": "Täissuuruses vahelejätmise teavitused" - }, - "noticeVisibilityMode1": { - "message": "Väikesed vahelejätmise teavitused autom. vahelejätmistele" - }, - "noticeVisibilityMode2": { - "message": "Kõik vahelejätmise teavitused on väikesed" - }, - "noticeVisibilityMode3": { - "message": "Hääbuvad vahelejätmise teavitused autom. vahelejätmistele" - }, - "noticeVisibilityMode4": { - "message": "Kõik vahelejätmise teavitused hääbuvad" - }, - "longDescription": { - "message": "SponsorBlock lubab sul vahele jätta sponsorid, vaheajad, kanali tellimise meeldetuletused ja muud YouTube'i videote tüütud kohad. SponsorBlock on rahva ühistööna toimiv brauserilaiendus, mis lubab igaühel saata sponsoreeritud segmendi algus- ja lõpuaegu ning teiste video segmentide aegu. Kui üks inimene saadab sponsoreeritud segmendi, jätavad teised laienduse kasutajad kohe selle vahele. Laiendus võimaldab ka muusikavideotel mitte-muusika jaotised vahele jätta.", - "description": "Full description of the extension on the store pages." - }, - "website": { - "message": "Veebileht", - "description": "Used on Firefox Store Page" - }, - "sourceCode": { - "message": "Lähtekood", - "description": "Used on Firefox Store Page" - }, - "noticeUpdate": { - "message": "Teavitus on uuendatud!", - "description": "The first line of the message displayed after the notice was upgraded." - }, - "noticeUpdate2": { - "message": "Kui sulle see ikka ei meeldi, vajuta \"ära kunagi näita\" nuppu.", - "description": "The second line of the message displayed after the notice was upgraded." - }, - "setSkipShortcut": { - "message": "Jäta segment vahele", - "description": "Keybind label" - }, - "setStartSponsorShortcut": { - "message": "Alusta/lõpeta segmenti", - "description": "Keybind label" - }, - "setSubmitKeybind": { - "message": "Esita segmendid", - "description": "Keybind label" - }, - "nextChapterKeybind": { - "message": "Järgmine peatükk", - "description": "Keybind label" - }, - "previousChapterKeybind": { - "message": "Eelmine peatükk", - "description": "Keybind label" - }, - "0": { - "message": "Ühenduse ajalõpp. Kontrolli oma võrguühendust. Kui internet töötab, on ilmselt server ülekoormatud või maas." - }, - "disableSkipping": { - "message": "Vahelejätmine on lubatud" - }, - "enableSkipping": { - "message": "Vahelejätmine on keelatud" - }, - "yourWork": { - "message": "Sinu töö", - "description": "Used to describe the section that will show you the statistics from your submissions." - }, - "502": { - "message": "Server paistab olevat ülekoormatud. Proovi uuesti mõne sekundi pärast." - }, - "errorCode": { - "message": "Veakood: " - }, - "skip": { - "message": "Jäta vahele" - }, - "mute": { - "message": "Vaigista" - }, - "full": { - "message": "Terve video", - "description": "Used for the name of the option to label an entire video as sponsor or self promotion." - }, - "skip_category": { - "message": "Jätad {0} vahele?" - }, - "mute_category": { - "message": "Vaigistad {0}?" - }, - "skip_to_category": { - "message": "Jäta {0}-ni vahele?", - "description": "Used for skipping to things (Skip to Highlight)" - }, - "skipped": { - "message": "{0} vahelejäetud", - "description": "Example: Sponsor Skipped" - }, - "muted": { - "message": "{0} vaigistatud", - "description": "Example: Sponsor Muted" - }, - "skipped_to_category": { - "message": "{0}-ni vahelejäetud", - "description": "Used for skipping to things (Skipped to Highlight)" - }, - "disableAutoSkip": { - "message": "Keela automaatne vahelejätmine" - }, - "enableAutoSkip": { - "message": "Luba automaatne vahelejätmine" - }, - "audioNotification": { - "message": "Heliteavitus vahelejätmisel" - }, - "audioNotificationDescription": { - "message": "Heliteavitus vahelejätmisel esitab igal korral heli, kui segment vahele jäetakse. Keelamisel (või autom. vahelejätmise keelamisel) heli ei esitata." - }, - "showTimeWithSkips": { - "message": "Kuva vahelejäetud segmentidega aeg" - }, - "showTimeWithSkipsDescription": { - "message": "See aeg kuvatakse sulgudes praeguse aja kõrval, ajariba all. See näitab video, millest on segmendid eemaldatud, kogukestvust. Sealhulgas arvestatakse ka segmente, mis on märgitud valikuga \"kuva mängija ajaribal\"." - }, - "youHaveSkipped": { - "message": "Oled vahele jätnud " - }, - "minLower": { - "message": "minut" - }, - "minsLower": { - "message": "minutit" - }, - "hourLower": { - "message": "tund" - }, - "hoursLower": { - "message": "tundi" - }, - "youHaveSavedTime": { - "message": "Oled inimestel säästnud", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "youHaveSavedTimeEnd": { - "message": " nende eludest", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "statusReminder": { - "message": "Serveri oleku saamiseks vaata status.sponsor.ajay.app" - }, - "whatChangeUserID": { - "message": "Seda tuleks privaatsena hoida. See on nagu parool ning seda ei tohiks kellegagi jagada. Kui kellelgi see on, saavad nad sinuna esineda.\nKui otsid avalikku UserID'd, klõpsa hüpikus olevat lõikelaua ikooni." - }, - "createdBy": { - "message": "Autor" - }, - "supportOtherSites": { - "message": "Toeta 3. osapoole YouTube-saite" - }, - "supportOtherSitesDescription": { - "message": "Kolmanda osapoole YouTube'i klientide tugi. Selle toe lubamiseks pead nõustuma lisalubadega. See EI tööta inkognito-režiimis nii Chromes kui ka teistes Chromiumi brauserites.", - "description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube" - }, - "supportedSites": { - "message": "Toetatud saidid: " - }, - "optionsInfo": { - "message": "Luba Invidiouse tugi, keela automaatne vahelejätmine, peida nupud ja muud valikud." - }, - "addInvidiousInstance": { - "message": "Lisa 3. osapoole kliendi eksemplar" - }, - "addInvidiousInstanceDescription": { - "message": "Lisa kohandatud eksemplar. See tuleb vormistada AINULT domeeniga. Näide: invidious.ajay.app" - }, - "add": { - "message": "Lisa" - }, - "addInvidiousInstanceError": { - "message": "See on sobimatu domeen. Siia tuleks kirjutada AINULT domeeniosa, nt invidious.ajay.app" - }, - "resetInvidiousInstance": { - "message": "Lähtesta Invidiouse eksemplaride nimekiri" - }, - "resetInvidiousInstanceAlert": { - "message": "Lähtestad Invidiouse eksemplaride nimekirja" - }, - "currentInstances": { - "message": "Praegused eksemplarid:" - }, - "minDuration": { - "message": "Minimaalne kestus (sekundit):" - }, - "minDurationDescription": { - "message": "Segmendid, mis on lühemad kui määratud väärtus ei jäeta vahele või ei kuvata mängijal." - }, - "skipNoticeDuration": { - "message": "Vahelejätmise teavituse kestus (sekundites):" - }, - "skipNoticeDurationDescription": { - "message": "Vahelejätmise teavitus püsib ekraanil vähemalt nii kaua. Käsitsi vahelejätmise puhul võib see kauem püsida." - }, - "shortCheck": { - "message": "See saadetav segment on lühem, kui sinu lühima pikkuse valik. See võib tähendada, et see on juba saadetud ning on selle valiku tõttu lihtsalt ignoreeritud. Kas soovid kindlasti seda saata?" - }, - "showUploadButton": { - "message": "Kuva üleslaadimisnupp" - }, - "customServerAddress": { - "message": "SponsorBlocki serveri aadress" - }, - "customServerAddressDescription": { - "message": "Aadress, mida SponsorBlock kasutab serveriga info vahetamiseks.\nKui sul just oma serverit pole, ei peaks sa seda valikut muutma." - }, - "save": { - "message": "Salvesta" - }, - "reset": { - "message": "Lähtesta" - }, - "customAddressError": { - "message": "Aadress ei ole õiges vormingus. Veendu, et sul on alguses http:// või https:// ning lõpus ei ole kaldkriipsu." - }, - "areYouSureReset": { - "message": "Kas soovid kindlasti selle lähtestada?" - }, - "mobileUpdateInfo": { - "message": "m.youtube.com on nüüd toetatud" - }, - "exportOptions": { - "message": "Impordi/ekspordi kõik valikud" - }, - "exportOptionsCopy": { - "message": "Muuda/kopeeri" - }, - "exportOptionsDownload": { - "message": "Salvesta faili" - }, - "exportOptionsUpload": { - "message": "Laadi failist" - }, - "setOptions": { - "message": "Määra valikud" - }, - "exportOptionsWarning": { - "message": "Hoiatus: valikute muutmine on püsiv ning võib su paigalduse lõhkuda. Kas soovid kindlasti seda teha? Varunda kindlasti igaks juhuks varasemad valikud." - }, - "incorrectlyFormattedOptions": { - "message": "See JSON ei ole korralikult vormistatud. Sinu valikuid ei muudetud." - }, - "confirmNoticeTitle": { - "message": "Saada segment" - }, - "submit": { - "message": "Saada" - }, - "cancel": { - "message": "Katkesta" - }, - "delete": { - "message": "Kustuta" - }, - "preview": { - "message": "Eelvaade" - }, - "unsubmitted": { - "message": "Saatmata" - }, - "inspect": { - "message": "Inspekteeri" - }, - "edit": { - "message": "Muuda" - }, - "copyDebugInformation": { - "message": "Kopeeri silumisteave lõikelauale" - }, - "copyDebugInformationFailed": { - "message": "Lõikelauale kirjutamine ebaõnnestus" - }, - "copyDebugInformationOptions": { - "message": "Kopeerib lõikelauale info, mida saad arendajale anda veast teatamisel või siis, kui arendaja seda sinult taotleb. Tundlik info, sealhulgas sinu kasutaja ID, ignoreerimisnimekirjas kanalid ning kohandatud serveri aadress on eemaldatud. Siiski see sisaldab teatud infot, nagu sinu kasutajaagent, brauser, opsüsteem ning laienduse versiooninumber." - }, - "copyDebugInformationComplete": { - "message": "Silumisinfo on lõikelauale kopeeritud. Võid sellelt vabalt eemaldada mistahes info, mida ei soovi jagada. Salvesta see tekstifaili või kleebi vearaportisse." - }, - "to": { - "message": "kuni", - "description": "Used between segments. Example: 1:20 to 1:30" - }, - "CopiedExclamation": { - "message": "Kopeeritud!", - "description": "Used after something has been copied to the clipboard. Example: 'Copied!'" - }, - "generic_guideline1": { - "message": "Kasuta sujuvaid üleminekuid" - }, - "generic_guideline2": { - "message": "Mängib nii, nagu midagi poleks vahele jäetud" - }, - "category_sponsor": { - "message": "Sponsor" - }, - "category_sponsor_description": { - "message": "Tasulised promod, tasulised viited ja otsesed reklaamid. Pole mõeldud enesepromo või tasuta petitsioonide/autorite/veebilehtede/toodete mainimiste puhul." - }, - "category_sponsor_guideline1": { - "message": "Tasulised kampaaniad" - }, - "category_sponsor_guideline2": { - "message": "Mitte annetuste ja omaloodud kauba jaoks" - }, - "category_selfpromo": { - "message": "Tasumata/enesepromo" - }, - "category_selfpromo_description": { - "message": "Sarnaneb \"sponsorile\", ent on mõeldud tasumata või enesepromo jaoks. Selle alla kuuluvad jaotised oma müüdava kauba, annetuste ja koostööpartnerite kohta." - }, - "category_selfpromo_guideline1": { - "message": "Annetused, liikmesused ja omaloodud kaup" - }, - "category_selfpromo_guideline2": { - "message": "Tasuta mainimised, mis ei anna videole lisaväärtust" - }, - "category_selfpromo_guideline3": { - "message": "Mitte ettevõtete-disainitud toodete ja kauba jaoks" - }, - "category_exclusive_access": { - "message": "Eksklusiivne ligipääs" - }, - "category_exclusive_access_description": { - "message": "Ainult tervete videote märkimiseks. Kasutatakse, kui video esitleb toodet, teenust või asukohta, millele isik on tasuta või toetusega ligipääsu saanud." - }, - "category_exclusive_access_pill": { - "message": "See video esitleb toodet, teenust või asukohta, millele isik on tasuta või toetusega ligipääsu saanud", - "description": "Short description for this category" - }, - "category_exclusive_access_guideline1": { - "message": "Kogu video esitleb midagi, millele autor on saanud tasuta või toetusega ligipääsu" - }, - "category_interaction": { - "message": "Tegutsemise meeldetuletus (kanali tellimine)" - }, - "category_interaction_description": { - "message": "Lühike sisukeskne meeldetuletus anda videole meeldib, tellida kanalit või jälgida autorit. Kui see on pikk või millegi kindlaga seotud, peaks see olema enesepromo all." - }, - "category_interaction_guideline1": { - "message": "Lühikesed meeldetuletused vajutada \"meeldib\", \"telli\" või \"jälgi\"" - }, - "category_interaction_guideline2": { - "message": "Sisaldab mitteotseseid meeldetuletusi kommenteerimiseks" - }, - "category_interaction_guideline3": { - "message": "Mitte üldise promo jaoks, vaid üleskutsed tegevustele" - }, - "category_interaction_short": { - "message": "Tegutsemise meeldetuletus" - }, - "category_intro": { - "message": "Vaheaeg/sissejuhatav animatsioon" - }, - "category_intro_description": { - "message": "Tegeliku sisuta intervall. Võib olla paus, seisev pilt, korduv animatsioon. Seda ei peaks kasutama üleminekutel, milles on teabega sisu." - }, - "category_intro_short": { - "message": "Vaheaeg" - }, - "category_intro_guideline1": { - "message": "Intervall ilma tegeliku sisuta" - }, - "category_intro_guideline2": { - "message": "Mitte informatsiooniga üleminekute jaoks" - }, - "category_outro": { - "message": "Lõpukaardid/-tiitrid" - }, - "category_outro_description": { - "message": "Tiitrid või YouTube'i lõpukaardid. Pole mõeldud informatsiooniga järelduste jaoks." - }, - "category_outro_guideline1": { - "message": "Ära kaasa sisu, isegi kui lõputiitrid on ekraanil" - }, - "category_preview": { - "message": "Eelvaade/kokkuvõte" - }, - "category_preview_description": { - "message": "Klippide kogum, mis näitab selles või teistes videotes tulevat sisu seerias, kus kogu info kuvatakse uuesti video sees." - }, - "category_preview_guideline1": { - "message": "Klipid, mida kuvatakse hiljem või tulevases videos" - }, - "category_preview_guideline2": { - "message": "Eelmise video kokkuvõte" - }, - "category_preview_guideline3": { - "message": "Mitte jaotistele, mis lisavad täiendavat sisu" - }, - "category_filler": { - "message": "Täitesisu/naljad" - }, - "category_filler_short": { - "message": "Täide" - }, - "category_filler_guideline1": { - "message": "Sisuga mitteseonduvad täite- või huumoristseenid" - }, - "category_filler_guideline2": { - "message": "Tähelepanu hajutajad, saatevead, kordused" - }, - "category_filler_guideline3": { - "message": "Mitte stseenid, mida on teema mõistmiseks vaja vaadata" - }, - "category_music_offtopic": { - "message": "Muusika: mitte-muusika jaotis" - }, - "category_music_offtopic_description": { - "message": "Ainult muusikavideotes kasutamiseks. Seda peaks kasutama vaid muusikavideote jaotiste puhul, mis ei läheks mõne teise kategooria alla." - }, - "category_music_offtopic_short": { - "message": "Mitte-muusika" - }, - "category_music_offtopic_guideline1": { - "message": "Jaotised, mida avalikes väljalasetes pole" - }, - "category_music_offtopic_guideline2": { - "message": "Mitte-muusika kontserdil" - }, - "category_poi_highlight": { - "message": "Esiletõst" - }, - "category_poi_highlight_description": { - "message": "Video osa, mida enamus inimesed otsivad. Sarnaneb kommentaaridele stiilis \"video algab ajal x\"." - }, - "category_poi_highlight_guideline1": { - "message": "Jaotis, mida inimesed enim otsivad" - }, - "category_poi_highlight_guideline2": { - "message": "Aitab konteksti vahele jätta" - }, - "category_poi_highlight_guideline3": { - "message": "Aitab pealkirja või pisipildi sisuni viia" - }, - "category_chapter": { - "message": "Peatükk" - }, - "category_livestream_messages": { - "message": "Otseülekanne: annetuste ja sõnumite lugemine" - }, - "category_livestream_messages_short": { - "message": "Sõnumite lugemine" - }, - "autoSkip": { - "message": "Autom. vahelejätmine" - }, - "manualSkip": { - "message": "Käsitsi vahelejätmine" - }, - "showOverlay": { - "message": "Kuva mängija ajaribal" - }, - "disable": { - "message": "Keela" - }, - "autoSkip_POI": { - "message": "Jäta automaatselt alguseni vahele" - }, - "manualSkip_POI": { - "message": "Küsi video laadimisel" - }, - "showOverlay_POI": { - "message": "Kuva mängija ajaribal" - }, - "showOverlay_full": { - "message": "Kuva silt" - }, - "showOverlay_chapter": { - "message": "Kuva peatükid" - }, - "autoSkipOnMusicVideos": { - "message": "Jäta automaatselt kõik segmendid vahele, kui eksisteerib mitte-muusika segment" - }, - "muteSegments": { - "message": "Luba segmente, mis vahelejätmise asemel vaigistavad heli" - }, - "fullVideoSegments": { - "message": "Kuva ikoon, kui terve video on reklaam", - "description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo" - }, - "previewColor": { - "message": "Saatmata värv", - "description": "Referring to submissions that have not been sent to the server yet." - }, - "seekBarColor": { - "message": "Ajariba värv" - }, - "category": { - "message": "Kategooria" - }, - "skipOption": { - "message": "Vahelejätmise valik", - "description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)" - }, - "enableTestingServer": { - "message": "Luba beetatestimise server" - }, - "whatEnableTestingServer": { - "message": "Sinu saadetud segmendid ja hääled EI LÄHE põhiserveri alla. Kasuta seda vaid katsetamiseks." - }, - "testingServerWarning": { - "message": "Kõik segmendid ja hääled EI LÄHE põhiserveri alla, kuni oled ühendatud testserveriga. Veendu, et keelad selle valiku, kui soovid tegelikult segmente saata." - }, - "bracketNow": { - "message": "(nüüd)" - }, - "moreCategories": { - "message": "Rohkem kategooriaid" - }, - "chooseACategory": { - "message": "Vali kategooria" - }, - "enableThisCategoryFirst": { - "message": "Kategooriaga \"{0}\" segmentide saatmiseks pead selle enne valikutes lubama. Sind suunatakse nüüd valikutesse.", - "description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options." - }, - "poiOnlyOneSegment": { - "message": "Hoiatus: Seda tüüpi segmenti saab korraga aktiivne olla vaid üks. Mitme saatmine põhjustab suvalise segmendi kuvamise." - }, - "youMustSelectACategory": { - "message": "Sa pead enne saatmist igale segmendile kategooria valima!" - }, - "bracketEnd": { - "message": "(lõpp)" - }, - "End": { - "message": "Lõpp", - "description": "Button that skips to the end of a segment" - }, - "hiddenDueToDownvote": { - "message": "peidetud: vastuhääl" - }, - "hiddenDueToDuration": { - "message": "peidetud: liiga lühike" - }, - "manuallyHidden": { - "message": "käsitsi peidetud" - }, - "channelDataNotFound": { - "description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.", - "message": "Kanali ID pole veel laaditud. Kui vaatad manustatud videot, proovi seda vaadata YouTube'i kodulehelt. See võib olla põhjustatud ka YouTube'i paigutuse muudatustest - kui arvad et see nii on, kommenteeri siin:" - }, - "acceptPermission": { - "message": "Nõustu loaga" - }, - "permissionRequestSuccess": { - "message": "Loataotlus õnnestus!" - }, - "permissionRequestFailed": { - "message": "Loataotlus ebaõnnestus, kas sa keeldusid?" - }, - "adblockerIssueWhitelist": { - "message": "Kui sa ei suuda seda lahendada, keela valik \"sunnitud kanalikontroll enne vahelejätmist\", kuna SponsorBlock ei leia selle video kanaliteavet" - }, - "forceChannelCheck": { - "message": "Sunnitud kanalikontroll enne vahelejätmist" - }, - "whatForceChannelCheck": { - "message": "Vaikimisi jätab see segmendid vahele juba siis, kui veel kanalitki ei tea. Vaikimisi võidakse mõned video alguses olevad segmendid ignoreerimisnimekirjas olevatel kanalitel vahele jätta. Selle valiku lubamine väldib seda, kuid võib lisada vahelejätmistele väikese viivituse, sest kanali ID hankimine võib aega võtta. Viivitus võib kiire interneti puhul olla märkamatu." - }, - "forceChannelCheckPopup": { - "message": "Kaalu valiku \"Sunnitud kanalikontroll enne vahelejätmist\" lubamist" - }, - "downvoteDescription": { - "message": "Sobimatu/vale ajastus" - }, - "incorrectVote": { - "message": "Ebakorrektne" - }, - "harmfulVote": { - "message": "Kahjulik", - "description": "Used for chapter segments when the text is harmful/offensive to remove it faster" - }, - "incorrectCategory": { - "message": "Muuda kategooriat" - }, - "nonMusicCategoryOnMusic": { - "message": "See video on muusikana kategoriseeritud. Kas oled kindel, et sellel on sponsor? Kui see on tegelikult \"mitte-muusika segment\", ava laienduse valikud ning luba see kategooria. Seejärel saad selle segmendi saata \"mitte-muusika\" kategoorias. Segaduse korral palun loe üle juhised." - }, - "multipleSegments": { - "message": "Mitu segmenti" - }, - "guidelines": { - "message": "Juhised" - }, - "readTheGuidelines": { - "message": "Loe juhiseid!!", - "description": "Show the first time they submit or if they are \"high risk\"" - }, - "categoryUpdate1": { - "message": "Kategooriad on siin!" - }, - "categoryUpdate2": { - "message": "Ava valikud, et jätta vahele vaheaegu, müüdavat kaupa jms." - }, - "help": { - "message": "Abi" - }, - "GotIt": { - "message": "Sain aru", - "description": "Used as the button to dismiss a tooltip" - }, - "categoryPillTitleText": { - "message": "See terve video on selle kategooriaga sildistatud ning on liiga tihedalt integreeritud, et eraldada saaks" - }, - "experiementOptOut": { - "message": "Keeldu kõigist tulevikus tehtavatatest eksperimentidest", - "description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private." - }, - "hideForever": { - "message": "Peida igaveseks" - }, - "warningChatInfo": { - "message": "Panime tähele, et tegid teatud sagedasi vigu, mis ei olnud pahatahtlikud" - }, - "warningTitle": { - "message": "Sa said hoiatuse" - }, - "questionButton": { - "message": "Mul on küsimus" - }, - "warningConfirmButton": { - "message": "Ma mõistan põhjust" - }, - "warningError": { - "message": "Hoiatuse mõistmise kinnitamisel esines viga:" - }, - "Donate": { - "message": "Anneta" - }, - "considerDonating": { - "message": "Aita arendust toetada" - }, - "hideDonationLink": { - "message": "Peida annetuste link" - }, - "darkModeOptionsPage": { - "message": "Tume režiim valikute lehel" - }, - "helpPageThanksForInstalling": { - "message": "Täname SponsorBlocki paigaldamise eest." - }, - "helpPageReviewOptions": { - "message": "Palun vaata allolevad valikud üle" - }, - "helpPageHowSkippingWorks": { - "message": "Kuidas vahelejätmine töötab" - }, - "Submitting": { - "message": "Saatmine" - }, - "Editing": { - "message": "Redigeerimine" - }, - "helpPageTooSlow": { - "message": "See on liiga aeglane" - }, - "helpPageCopyOfDatabase": { - "message": "Kas ma saaksin andmebaasist koopia? Mis juhtub, kui sa kaod?" - }, - "helpPageCopyOfDatabase1": { - "message": "Andmebaas on avalik ning saadaval aadressil" - }, - "helpPageCopyOfDatabase2": { - "message": "Lähtekood on vabalt saadaval. Seega, isegi kui minuga midagi juhtub, ei ole sinu saadetud segmendid kadunud." - }, - "helpPageNews": { - "message": "Uudised ja kuidas see on valmistatud" - }, - "helpPageSourceCode": { - "message": "Kust ma saan selle lähtekoodi?" - }, - "Credits": { - "message": "Tiitrid" - }, - "LearnMore": { - "message": "Lisateave" - }, - "FullDetails": { - "message": "Täielikud üksikasjad" - }, - "CopyDownvoteButtonInfo": { - "message": "Annab vastuhääle ja loob kohaliku koopia, mida saad uuesti saata" - }, - "OpenCategoryWikiPage": { - "message": "Ava selle kategooria vikileht." - }, - "CopyAndDownvote": { - "message": "Kopeeri ja anna vastuhääl" - }, - "ContinueVoting": { - "message": "Jätka hääletamist" - }, - "ChangeCategoryTooltip": { - "message": "See rakendub sinu segmentidele koheselt" - }, - "downvote": { - "message": "Vastuhääl" - }, - "upvote": { - "message": "Poolthääl" - }, - "hideSegment": { - "message": "Peida segment" - }, - "skipSegment": { - "message": "Jäta segment vahele" - }, - "playChapter": { - "message": "Esita peatükk" - }, - "SponsorTimeEditScrollNewFeature": { - "message": "Kiireks aja reguleerimiseks keri hiirega muutmiskasti kohal. Täpsemaks reguleerimiseks hoia kerimise ajal all Ctrl või Shift klahvi." - }, - "categoryPillNewFeature": { - "message": "Uus! Näe, kui video on täielikult sponsoreeritud või enesepromo" - }, - "dayAbbreviation": { - "message": "p", - "description": "100d" - }, - "hourAbbreviation": { - "message": "t", - "description": "100h" - }, - "optionsTabBehavior": { - "message": "Käitumine", - "description": "Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabInterface": { - "message": "Liides", - "description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabKeyBinds": { - "message": "Klaviatuuriotseteed", - "description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabBackup": { - "message": "Varunda/taasta", - "description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabAdvanced": { - "message": "Varia", - "description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "noticeVisibilityLabel": { - "message": "Vahelejätmise teavituse välimus", - "description": "Option label" - }, - "unbind": { - "message": "Tühista määrang", - "description": "Unbind keyboard shortcut" - }, - "notSet": { - "message": "Määramata" - }, - "change": { - "message": "Muuda" - }, - "youtubeKeybindWarning": { - "message": "See on YouTube'i sisseehitatud otsetee. Kas soovid kindlasti seda kasutada?" - }, - "betaServerWarning": { - "message": "BEETAserver on lubatud!" - }, - "openOptionsPage": { - "message": "Ava valikute leht" - }, - "resetToDefault": { - "message": "Lähtesta sätted vaikeväärtustele" - }, - "confirmResetToDefault": { - "message": "Kas soovid kindlasti kõik sätted vaikeväärtustele lähtestada? Seda ei saa tagasi võtta." - }, - "exportSegments": { - "message": "Ekspordi segmendid" - }, - "importSegments": { - "message": "Impordi segmendid" - }, - "Import": { - "message": "Impordi", - "description": "Button to initiate importing segments. Appears under the textbox where they paste in the data" - }, - "redeemSuccess": { - "message": "Lunastamine õnnestus!" - }, - "redeemFailed": { - "message": "Litsentsivõti on sobimatu" - }, - "chooseACountry": { - "message": "Vali riik" - }, - "discountLink": { - "message": "Soodushinna link (vaata roosat hinda)" - }, - "selectYourCountry": { - "message": "Vali oma riik" - }, - "patreonSignIn": { - "message": "Logi Patreoniga sisse" - }, - "redeem": { - "message": "Lunasta" - }, - "joinOnPatreon": { - "message": "Telli Patreonis" - }, - "oneTimePurchase": { - "message": "Ühekordne ost" - }, - "enterLicenseKey": { - "message": "Sisesta litsentsivõti" - }, - "chaptersPage1": { - "message": "SponsorBlocki kogukonna-loodud peatükkide funktsioon on saadaval vaid inimestele, kes ostavad litsentsi või neile, kes saavad tasuta ligipääsu varasemate panuste tõttu" - }, - "unsubmittedSegmentCounts": { - "message": "Sul on hetkel {0} {1}", - "description": "Example: You currently have 12 unsubmitted segments on 5 videos" - }, - "unsubmittedSegmentCountsZero": { - "message": "Sul pole hetkel saatmata segmente", - "description": "Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments" - }, - "unsubmittedSegmentsSingular": { - "message": "esitamata segment", - "description": "Example: You currently have 1 *unsubmitted segment* on 1 video" - }, - "unsubmittedSegmentsPlural": { - "message": "esitamata segmenti", - "description": "Example: You currently have 12 *unsubmitted segments* on 5 videos" - }, - "videosSingular": { - "message": "videol", - "description": "Example: You currently have 3 unsubmitted segments on 1 *video*" - }, - "videosPlural": { - "message": "videol", - "description": "Example: You currently have 12 unsubmitted segments on 5 *videos*" - }, - "clearUnsubmittedSegments": { - "message": "Tühjenda kõik segmendid", - "description": "Label for a button in settings" - }, - "clearUnsubmittedSegmentsConfirm": { - "message": "Kas soovid kindlasti tühjendada kõik oma saatmata segmendid?", - "description": "Confirmation message for the Clear unsubmitted segments button" - }, - "showUnsubmittedSegments": { - "message": "Kuva segmendid", - "description": "Show/hide button for the unsubmitted segments list" - }, - "hideUnsubmittedSegments": { - "message": "Peida segmendid", - "description": "Show/hide button for the unsubmitted segments list" - }, - "videoID": { - "message": "Video ID", - "description": "Header of the unsubmitted segments list" - }, - "segmentCount": { - "message": "Segmentide arv", - "description": "Header of the unsubmitted segments list" - }, - "actions": { - "message": "Tegevused", - "description": "Header of the unsubmitted segments list" - }, - "exportSegmentsAsURL": { - "message": "Jaga URLina" - } -} diff --git a/public/_locales/fa/messages.json b/public/_locales/fa/messages.json deleted file mode 100644 index 203dc9c6..00000000 --- a/public/_locales/fa/messages.json +++ /dev/null @@ -1,394 +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": "بستن پنجره" - }, - "SubmitTimes": { - "message": "ثبت بخشها" - }, - "submitCheck": { - "message": "مطمئن هستید که میخواهید این را ثبت کنید؟" - }, - "whitelistChannel": { - "message": "قرار دادن کانال در لیست سفید" - }, - "removeFromWhitelist": { - "message": "حذف کانال از لیست سفید" - }, - "voteOnTime": { - "message": "رأی دهی به یک بخش" - }, - "Submissions": { - "message": "ارسالیها" - }, - "savedPeopleFrom": { - "message": "شما دیگران را نجات دادید از " - }, - "viewLeaderboard": { - "message": "نفرات برتر" - }, - "recordTimesDescription": { - "message": "ثبت" - }, - "clearTimesButton": { - "message": "حذف دفعات" - }, - "submitTimesButton": { - "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" - } -} diff --git a/public/_locales/fi/messages.json b/public/_locales/fi/messages.json deleted file mode 100644 index 2fedec6f..00000000 --- a/public/_locales/fi/messages.json +++ /dev/null @@ -1,1247 +0,0 @@ -{ - "fullName": { - "message": "SponsorBlock YouTubelle - Ohita sponsoroinnit", - "description": "Name of the extension." - }, - "Description": { - "message": "Ohita sponsoroitu mainonta, tilausten kerjääminen ja muuta YouTube-videoissa. Ilmoita katsomasi videoiden sponsorit säästääksesi muilta aikaa.", - "description": "Description of the extension." - }, - "400": { - "message": "Palvelin sanoi tämän pyynnön olevan virheellinen" - }, - "429": { - "message": "Olet lähettänyt liian monta sponsorointiaikaa tälle yhdelle videolle. Oletko varma, että niitä on näin monta?" - }, - "409": { - "message": "Tämä on jo lähetetty aiemmin" - }, - "channelWhitelisted": { - "message": "Kanava lisätty valkolistalle!" - }, - "Segment": { - "message": "osio" - }, - "Segments": { - "message": "osiota" - }, - "SegmentsCap": { - "message": "Osiot" - }, - "Chapters": { - "message": "Kappaleet" - }, - "renderAsChapters": { - "message": "Piirrä osiot kappaleina", - "description": "Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system" - }, - "showSegmentNameInChapterBar": { - "message": "Näytä nykyinen osio videon ajan vieressä" - }, - "upvoteButtonInfo": { - "message": "Äänestä lähetystä" - }, - "reportButtonTitle": { - "message": "Ilmoita" - }, - "reportButtonInfo": { - "message": "Ilmoita tämän lähetyksen olevan virheellinen." - }, - "Dismiss": { - "message": "Hylkää" - }, - "Loading": { - "message": "Ladataan..." - }, - "Hide": { - "message": "Älä näytä koskaan" - }, - "hitGoBack": { - "message": "Paina 'älä ohita' palataksesi kohtaan, jossa olit." - }, - "unskip": { - "message": "Älä ohita" - }, - "reskip": { - "message": "Ohita uudelleen" - }, - "unmute": { - "message": "Poista mykistys" - }, - "paused": { - "message": "Pysäytetty" - }, - "manualPaused": { - "message": "Ajastin pysäytetty" - }, - "confirmMSG": { - "message": "Muokataksesi tai poistaaksesi yksittäisiä arvoja, klikkaa info-painiketta tai avaa laajennuksen ponnahdusikkuna klikkaamalla laajennuksen kuvaketta oikeassa yläkulmassa." - }, - "clearThis": { - "message": "Haluatko varmasti poistaa tämän?\n\n" - }, - "Unknown": { - "message": "Sponsorointiaikoja lähetettäessä tapahtui virhe, yritä myöhemmin uudelleen." - }, - "sponsorFound": { - "message": "Tällä videolla on osioita tietokannassa!" - }, - "sponsor404": { - "message": "Osioita ei löytynyt" - }, - "sponsorStart": { - "message": "Osio alkaa nyt" - }, - "sponsorEnd": { - "message": "Osio päättyy nyt" - }, - "sponsorCancel": { - "message": "Peruuta osion luominen" - }, - "noVideoID": { - "message": "YouTube-videota ei löytynyt.\nJos tämä ei pidä paikkaansa, päivitä välilehti." - }, - "refreshSegments": { - "message": "Päivitä osiot" - }, - "success": { - "message": "Onnistui!" - }, - "voted": { - "message": "Äänestetty!" - }, - "serverDown": { - "message": "Palvelin näyttää olevan alhaalla. Ota heti yhteyttä kehittäjään." - }, - "connectionError": { - "message": "Yhteysvirhe on tapahtunut. Virhekoodi: " - }, - "clearTimes": { - "message": "Tyhjennä osiot" - }, - "openPopup": { - "message": "Avaa SponsorBlock-ponnahdusikkuna" - }, - "closePopup": { - "message": "Sulje ponnahdusikkuna" - }, - "closeIcon": { - "message": "Sulkukuvake" - }, - "SubmitTimes": { - "message": "Lähetä osiot" - }, - "sortSegments": { - "message": "Järjestä osiot" - }, - "submitCheck": { - "message": "Haluatko varmasti lähettää tämän?" - }, - "whitelistChannel": { - "message": "Lisää kanava valkolistalle" - }, - "removeFromWhitelist": { - "message": "Poista kanava valkolistalta" - }, - "voteOnTime": { - "message": "Äänestä osiota" - }, - "Submissions": { - "message": "Lähetykset" - }, - "savedPeopleFrom": { - "message": "Olet säästänyt ihmisiltä " - }, - "viewLeaderboard": { - "message": "Tulostaulu" - }, - "recordTimesDescription": { - "message": "Lähetä" - }, - "submissionEditHint": { - "message": "Osioiden muokkaus ilmestyy klikattuasi lähetä", - "description": "Appears in the popup to inform them that editing has been moved to the video player." - }, - "popupHint": { - "message": "Vihje: Voit määrittää lähetyksen pikanäppäimet asetuksista" - }, - "clearTimesButton": { - "message": "Tyhjennä ajat" - }, - "submitTimesButton": { - "message": "Lähetä ajat" - }, - "publicStats": { - "message": "Tätä käytetään julkisella tilastosivulla näyttääksesi kuinka paljon olet osallistunut. Näytä" - }, - "Username": { - "message": "Käyttäjänimi" - }, - "setUsername": { - "message": "Aseta käyttäjänimi" - }, - "copyPublicID": { - "message": "Kopioi julkinen UserID" - }, - "copySegmentID": { - "message": "Kopioi osion ID" - }, - "discordAdvert": { - "message": "Liity viralliselle Discord-palvelimelle antaaksesi ehdotuksia ja palautetta!" - }, - "hideThis": { - "message": "Piilota tämä" - }, - "Options": { - "message": "Asetukset" - }, - "showButtons": { - "message": "Näytä painikkeet YouTuben soittimessa" - }, - "hideButtons": { - "message": "Piilota painikkeet YouTuben soittimessa" - }, - "hideButtonsDescription": { - "message": "Tämä piilottaa YouTuben soittimessa näkyvät, ohitettavien aikojen lähettämiseen käytetyt painikkeet." - }, - "showSkipButton": { - "message": "Pidä \"Ohita kohtaan: Kohokohta\" -painike soittimessa" - }, - "showInfoButton": { - "message": "Näytä info-painike YouTuben soittimessa" - }, - "hideInfoButton": { - "message": "Piilota info-painike YouTuben soittimesta" - }, - "autoHideInfoButton": { - "message": "Piilota info-painike automaattisesti" - }, - "hideDeleteButton": { - "message": "Piilota poista-painike YouTuben soittimessa" - }, - "showDeleteButton": { - "message": "Näytä poista-painike YouTuben soittimessa" - }, - "enableViewTracking": { - "message": "Käytä ohitusten lukumäärän seurantaa" - }, - "whatViewTracking": { - "message": "Tämä toiminto seuraa, mitä osioita olet ohittanut. Sen avulla käyttäjät saavat tietää, kuinka paljon heidän lähetyksensä ovat auttaneet muita, ja sitä käytetään myös mittarina äänestysten kanssa estääksemme spämmin pääsyn tietokantaan. Laajennus lähettää viestin palvelimelle aina kun ohitat osion. Toivottavasti useimmat eivät muuta tätä asetusta, jotta katselunumerot pysyisivät tarkkoina. :)" - }, - "enableViewTrackingInPrivate": { - "message": "Ota ohitusten lukumäärän seuranta käyttöön yksityis-/incognito-välilehdissä" - }, - "enableTrackDownvotes": { - "message": "Säilytä osion negatiiviset äänet" - }, - "whatTrackDownvotes": { - "message": "Negatiivisesti äänestämäsi osiot pysyvät piilotettuina myös päivityksen jälkeen" - }, - "trackDownvotesWarning": { - "message": "Varoitus: Tämän poistaminen käytöstä poistaa kaikki aiemmin tallennetut alaäänet" - }, - "enableQueryByHashPrefix": { - "message": "Kysely tiiviste-etuliittellä" - }, - "whatQueryByHashPrefix": { - "message": "Sen sijaan, että videoID:tä käyttäen pyydettäisiin osioita palvelimelta, videoID:n tiivisteen 4 ensimmäistä merkkiä lähetetään. Palvelin lähettää takaisin dataa kaikista videoista, joilla on samankaltaiset tiivisteet." - }, - "enableRefetchWhenNotFound": { - "message": "Hae osiot uudelleen uusissa videoissa" - }, - "whatRefetchWhenNotFound": { - "message": "Jos video on uusi, eikä osioita löydy, niitä haetaan uudelleen muutaman minuutin välein katsoessasi." - }, - "enableShowCategoryWithoutPermission": { - "message": "Näytä kategoriat lähetysvalikossa myös ilman lähetyslupaa" - }, - "whatShowCategoryWithoutPermission": { - "message": "Jotkin kategoriat vaativat lähetysluvan maineen vähimmäisvaatimusten vuoksi" - }, - "showNotice": { - "message": "Näytä ilmoitus uudelleen" - }, - "showSkipNotice": { - "message": "Näytä ilmoitus ohitetun osion jälkeen" - }, - "showCategoryGuidelines": { - "message": "Näytä kategorian ohje" - }, - "noticeVisibilityMode0": { - "message": "Täysikokoiset ohitusilmoitukset" - }, - "noticeVisibilityMode1": { - "message": "Pienet ohitusilmoitukset automaattiselle ohitukselle" - }, - "noticeVisibilityMode2": { - "message": "Kaikki pienet ohitusilmoitukset" - }, - "noticeVisibilityMode3": { - "message": "Haalistuneet ohitusilmoitukset automaattiselle ohitukselle" - }, - "noticeVisibilityMode4": { - "message": "Kaikki haalistuneet ohitusilmoitukset" - }, - "longDescription": { - "message": "SponsorBlockin avulla voit ohittaa sponsorit, introt, outrot, tilausmuistutukset ja muut ärsyttävät osat YouTube-videoissa. SponsorBlock on käyttäjälähteinen selainlaajennus, jonka avulla kuka tahansa voi lähettää Youtube-videoiden sponsoroitujen ja muiden osioiden aloitus- ja päättymisajat. Kun yksi henkilö on lähettänyt tämän tiedon, kaikki muut, joilla on tämä laajennus, ohittavat sponsoroidun osion. Voit myös ohittaa musiikkivideoiden musiikittomat osat.", - "description": "Full description of the extension on the store pages." - }, - "website": { - "message": "Sivusto", - "description": "Used on Firefox Store Page" - }, - "sourceCode": { - "message": "Lähdekoodi", - "description": "Used on Firefox Store Page" - }, - "noticeUpdate": { - "message": "Ilmoitus on päivitetty!", - "description": "The first line of the message displayed after the notice was upgraded." - }, - "noticeUpdate2": { - "message": "Jos et vieläkään pidä siitä, paina \"älä näytä koskaan\" -painiketta.", - "description": "The second line of the message displayed after the notice was upgraded." - }, - "setSkipShortcut": { - "message": "Ohita osio", - "description": "Keybind label" - }, - "setStartSponsorShortcut": { - "message": "Aloita/lopeta osio", - "description": "Keybind label" - }, - "setSubmitKeybind": { - "message": "Lähetä osiot", - "description": "Keybind label" - }, - "nextChapterKeybind": { - "message": "Seuraava kappale", - "description": "Keybind label" - }, - "previousChapterKeybind": { - "message": "Edellinen kappale", - "description": "Keybind label" - }, - "keybindDescription": { - "message": "Valitse näppäin painamalla sitä ja valitse haluamasi vaihtonäppäin." - }, - "0": { - "message": "Yhteyden aikakatkaisu. Tarkista internet-yhteytesi. Jos internetyhteytesi toimii, palvelin on todennäköisesti ylikuormittunut tai alhaalla." - }, - "disableSkipping": { - "message": "Ohitus on käytössä" - }, - "enableSkipping": { - "message": "Ohitus on poistettu käytöstä" - }, - "yourWork": { - "message": "Työsi", - "description": "Used to describe the section that will show you the statistics from your submissions." - }, - "502": { - "message": "Palvelin näyttää olevan ylikuormitettu. Yritä uudelleen muutaman sekunnin kuluttua." - }, - "errorCode": { - "message": "Virhekoodi: " - }, - "skip": { - "message": "Ohita" - }, - "mute": { - "message": "Mykistä" - }, - "full": { - "message": "Koko video", - "description": "Used for the name of the option to label an entire video as sponsor or self promotion." - }, - "skip_category": { - "message": "Ohita {0}?" - }, - "mute_category": { - "message": "Mykistä {0}?" - }, - "skip_to_category": { - "message": "Ohita kohtaan: {0}", - "description": "Used for skipping to things (Skip to Highlight)" - }, - "skipped": { - "message": "{0} ohitettu", - "description": "Example: Sponsor Skipped" - }, - "muted": { - "message": "{0} Mykistetty", - "description": "Example: Sponsor Muted" - }, - "skipped_to_category": { - "message": "Ohitettiin kohtaan: {0}", - "description": "Used for skipping to things (Skipped to Highlight)" - }, - "disableAutoSkip": { - "message": "Poista automaattinen ohitus käytöstä" - }, - "enableAutoSkip": { - "message": "Ota automaattinen ohitus käyttöön" - }, - "audioNotification": { - "message": "Ääni-ilmoitus ohitettaessa" - }, - "audioNotificationDescription": { - "message": "Ääni-ilmoitus ohittaessa toistaa äänen kun osio ohitetaan. Jos asetus on pois päältä (tai automaattinen ohitus on pois käytöstä), ääntä ei soiteta." - }, - "showTimeWithSkips": { - "message": "Näytä kesto ilman ohitettuja osioita" - }, - "showTimeWithSkipsDescription": { - "message": "Tämä aika näkyy sulkeissa nykyisen ajan vieressä liukusäätimen alapuolella. Se näyttää videon koko pituuden ilman osioita. Se sisältää vain osiot, jotka on merkitty \"Näytä liukusäätimessä\"." - }, - "youHaveSkipped": { - "message": "Olet ohittanut " - }, - "minLower": { - "message": "minuutin" - }, - "minsLower": { - "message": "minuuttia" - }, - "hourLower": { - "message": "tunnin" - }, - "hoursLower": { - "message": "tuntia" - }, - "youHaveSavedTime": { - "message": "Olet säästänyt ihmisiltä", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "youHaveSavedTimeEnd": { - "message": " heidän elämistään", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "statusReminder": { - "message": "Tarkista palvelimen tila osoitteessa status.sponsor.ajay.app." - }, - "changeUserID": { - "message": "Tuo/vie yksityinen UserID" - }, - "whatChangeUserID": { - "message": "Tämä pitäisi pitää yksityisenä. Tämä on kuin salasana, eikä sitä pitäisi jakaa kenenkään kanssa. Jos jollakulla on tämä, he voivat esiintyä sinuna. Jos etsit julkista userID:täsi, napsauta leikepöydän kuvaketta ponnahdusikkunassa." - }, - "setUserID": { - "message": "Määritä yksityinen UserID" - }, - "userIDChangeWarning": { - "message": "Varoitus: Yksityisen UserID:n vaihto on pysyvää. Haluatko varmasti tehdä tämän? Varmuuskopioi vanha UserID varmuuden vuoksi." - }, - "createdBy": { - "message": "Luonut" - }, - "supportOtherSites": { - "message": "Tue kolmansien osapuolien YouTube-sivustoja" - }, - "supportOtherSitesDescription": { - "message": "Tue kolmannen osapuolen YouTube-asiakasohjelmia. Jotta voit ottaa käyttöön tuen, sinun täytyy hyväksyä lisäkäyttöoikeudet. Tämä EI toimi incognitossa Chromessa ja muissa Chromium varianteissa.", - "description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube" - }, - "supportedSites": { - "message": "Tuetut sivustot: " - }, - "optionsInfo": { - "message": "Ota käyttöön Invidious tuki, poista käytöstä automaattinen ohitus, piilota painikkeet ja muuta." - }, - "addInvidiousInstance": { - "message": "Lisää kolmannen osapuolen asiakasohjelmainstanssi" - }, - "addInvidiousInstanceDescription": { - "message": "Lisää mukautettu instanssi. Tämän täytyy olla formatoitu VAIN verkkotunnuksella. Esimerkki: invidious.ajay.app" - }, - "add": { - "message": "Lisää" - }, - "addInvidiousInstanceError": { - "message": "Tämä on virheellinen verkkotunnus. Tämän pitäisi sisältää VAIN verkkotunnus. Esimerkiksi: invidious.ajay.app" - }, - "resetInvidiousInstance": { - "message": "Nollaa Invidious-instanssien lista" - }, - "resetInvidiousInstanceAlert": { - "message": "Olet nollaamassa Invidious-instanssien listan" - }, - "currentInstances": { - "message": "Nykyiset instanssit:" - }, - "minDuration": { - "message": "Vähimmäiskesto (sekuntia):" - }, - "minDurationDescription": { - "message": "Osioita jotka ovat asetettua arvoa lyhyempiä ei ohiteta tai näytetä soittimessa." - }, - "enableManualSkipOnFullVideo": { - "message": "Käytä manuaalista ohitusta, kun video on merkitty \"Koko video\" osiolla" - }, - "whatManualSkipOnFullVideo": { - "message": "Niille, jotka haluavat katsella täysin sponsoroitua sisältöä tai julkaisijan omaa markkinointia sisältävät videot keskeytyksettä." - }, - "skipNoticeDuration": { - "message": "Ohitusilmoituksen kesto (sekuntia):" - }, - "skipNoticeDurationDescription": { - "message": "Ohitusimoitus pysyy näytöllä ainakin näin kauan.\nManuaalisella ohituksella se saattaa pysyä pitempäänkin." - }, - "shortCheck": { - "message": "Seuraava lähetys on lyhyempi kuin vähimmäiskeston asetuksesi. Tämä voi tarkoittaa sitä, että tämä on jo lähetetty, ja sitä ei vain oteta huomioon tämän asetuksen vuoksi. Oletko varma, että haluat lähettää?" - }, - "liveOrPremiere": { - "message": "Aktiivisen livestriimin tai ensiesityksen aikana lähettäminen ei ole sallittua. Odota kunnes se loppuu, sitten päivitä sivu ja varmista, että osiot ovat yhä oikein." - }, - "showUploadButton": { - "message": "Näytä lähetä-painike" - }, - "customServerAddress": { - "message": "SponsorBlock-palvelimen osoite" - }, - "customServerAddressDescription": { - "message": "Osoite, jota SponsorBlock käyttää lähettääkseen kutsuja palvelimelle.\nEllei sinulla ole omaa palvelininstanssia, tätä ei pitäisi muuttaa." - }, - "save": { - "message": "Tallenna" - }, - "reset": { - "message": "Palauta" - }, - "customAddressError": { - "message": "Tämä osoite ei ole oikeassa muodossa. Varmista, että sinulla on http:// tai https:// alussa eikä perässä kauttaviivoja." - }, - "areYouSureReset": { - "message": "Oletko varma, että haluat nollata tämän?" - }, - "mobileUpdateInfo": { - "message": "m.youtube.com-osoitetta tuetaan nyt" - }, - "exportOptions": { - "message": "Vie/tuo kaikki asetukset" - }, - "exportOptionsCopy": { - "message": "Muokkaa/kopioi" - }, - "exportOptionsDownload": { - "message": "Tallenna tiedostoon" - }, - "exportOptionsUpload": { - "message": "Lataa tiedostosta" - }, - "whatExportOptions": { - "message": "Tässä ovat kaikki määrityksesi JSON-muodossa. Myös yksityinen UserID sisältyy näihin tietoihin, joten jaa tiedostoa harkiten." - }, - "setOptions": { - "message": "Käytä asetuksia" - }, - "exportOptionsWarning": { - "message": "Varoitus: Asetusten vaihtaminen on pysyvää ja voi rikkoa asennuksesi. Oletko varma, että haluat tehdä tämän? Varmuuskopioi vanha varmuuden vuoksi." - }, - "incorrectlyFormattedOptions": { - "message": "Tämä JSON ei ole muotoiltu oikein. Asetuksiasi ei ole muutettu." - }, - "confirmNoticeTitle": { - "message": "Lähetä osio" - }, - "submit": { - "message": "Lähetä" - }, - "cancel": { - "message": "Peruuta" - }, - "delete": { - "message": "Poista" - }, - "preview": { - "message": "Esikatsele" - }, - "unsubmitted": { - "message": "Lähettämätön" - }, - "inspect": { - "message": "Tarkista" - }, - "edit": { - "message": "Muokkaa" - }, - "copyDebugInformation": { - "message": "Kopioi vianetsintätiedot leikepöydälle" - }, - "copyDebugInformationFailed": { - "message": "Kirjoittaminen leikepöydälle epäonnistui" - }, - "copyDebugInformationOptions": { - "message": "Kopioi tiedot leikepöydälle, joka annetaan kehittäjälle kun ilmoitetaan viasta / kun kehittäjä pyytää sitä. Arkaluonteiset tiedot, kuten käyttäjätunnus, sallitut kanavat ja mukautettu palvelimen osoite on poistettu. Se sisältää kuitenkin tietoja, kuten käyttäjäagentin, selaimen, käyttöjärjestelmän ja laajennuksen versionumeron. " - }, - "copyDebugInformationComplete": { - "message": "Virheenkorjaustiedot on kopioitu leikepöydälle. Voit poistaa mitä tahansa tietoa mitä et mielummin jakaisi. Tallenna tämä tekstitiedostoon tai liitä se virheraporttiin." - }, - "keyAlreadyUsed": { - "message": "Pikänäppäin on jo liitetty toiselle toiminnolle. Valitse eri näppäin." - }, - "to": { - "message": "-", - "description": "Used between segments. Example: 1:20 to 1:30" - }, - "CopiedExclamation": { - "message": "Kopioitu!", - "description": "Used after something has been copied to the clipboard. Example: 'Copied!'" - }, - "generic_guideline1": { - "message": "Sisällytä siirtymät osioon" - }, - "generic_guideline2": { - "message": "Video toistuu ikään kuin mitään ei olisi ohitettu" - }, - "category_sponsor": { - "message": "Sponsori" - }, - "category_sponsor_description": { - "message": "Maksettu mainostus, maksetut viittaukset ja suorat mainokset. Ei itsensä mainostukselle tai ilmaisille maininnoille kampanjoista/luojista/nettisivuista/tuotteista, joista he pitävät." - }, - "category_sponsor_guideline1": { - "message": "Maksetut mainostukset" - }, - "category_sponsor_guideline2": { - "message": "Ei lahjoituksille tai omalle kauppatavaralle" - }, - "category_selfpromo": { - "message": "Maksamaton/Itsensä mainostus" - }, - "category_selfpromo_description": { - "message": "Samankaltainen \"sponsorin\" kanssa, mutta maksamattomalle tai itsensä mainostukselle. Tämä sisältää osioita kauppatavarasta, lahjoituksista tai tietoa siitä, kenen kanssa he ovat tehneet yhteistyötä." - }, - "category_selfpromo_guideline1": { - "message": "Lahjoitukset, jäsenyydet ja oma kauppatavara" - }, - "category_selfpromo_guideline2": { - "message": "Ilmaiset maininnat, jotka eivät tuo videolle lisäarvoa" - }, - "category_selfpromo_guideline3": { - "message": "Ei yritysten luomille tuotteille tai kauppatavaralle" - }, - "category_exclusive_access": { - "message": "Yksinoikeudellinen ensikatsaus" - }, - "category_exclusive_access_description": { - "message": "Vain kokonaisten videoiden merkitsemiseen. Käytetään kun videossa esitellään tuote, palvelu tai sijainti, johon he ovat saaneet ilmaisen tai tuetun käyttöoikeuden." - }, - "category_exclusive_access_pill": { - "message": "Tämä video esittelee tuotteen, palvelun tai sijainnin, johon he ovat saaneet ilmaisen tai tuetun käyttöoikeuden", - "description": "Short description for this category" - }, - "category_exclusive_access_guideline1": { - "message": "Koko video esittelee jotakin, jonka käyttöoikeus on saatu veloituksetta tai tuetusti" - }, - "category_interaction": { - "message": "Vuorovaikutusmuistutus (tilaaminen)" - }, - "category_interaction_description": { - "message": "Lyhyt muistutus tykätä, tilata tai seurata sisällön keskellä. Jos se on pitkä tai koskee jotain tiettyä asiaa, tulisi se merkitä mielummin itsensä mainostamiseksi." - }, - "category_interaction_guideline1": { - "message": "Lyhyet muistutukset tykätä, tilata tai seurata" - }, - "category_interaction_guideline2": { - "message": "Sisältää epäsuorat muistutukset kommenttien jättämisestä" - }, - "category_interaction_guideline3": { - "message": "Ei yleiselle mainostukselle, vain toimintapyynnöille" - }, - "category_interaction_short": { - "message": "Vuorovaikutusmuistutus" - }, - "category_intro": { - "message": "Tauko/Introanimaatio" - }, - "category_intro_description": { - "message": "Aikaväli ilman varsinaista sisältöä. Voi olla tauko, staattinen kehys, toistuva animaatio. Tätä ei pitäisi käyttää siirtymisiin, jotka sisältävät tietoa." - }, - "category_intro_short": { - "message": "Tauko" - }, - "category_intro_guideline1": { - "message": "Tauko ilman varsinaista sisältöä" - }, - "category_intro_guideline2": { - "message": "Ei tietoa sisältäville siirtymille" - }, - "category_outro": { - "message": "Loppukortit/-tekstit" - }, - "category_outro_description": { - "message": "Lopputekstit tai kun YouTuben loppukortit tulevat näkyviin. Ei lopetuksille joissa on tietoa." - }, - "category_outro_guideline1": { - "message": "Älä sisällytä sisältöä, vaikka loppukortit olisivatkin näytöllä" - }, - "category_preview": { - "message": "Esikatselu/Kertaus" - }, - "category_preview_description": { - "message": "Kokoelma leikkeitä, jotka kertovat mitä video sisältää tai sarjan muut videot sisältävät ja joiden kaikki informaatio toistuu videossa myöhemmin." - }, - "category_preview_guideline1": { - "message": "Myöhemmin tai tulevassa videossa ilmestyvät klipit" - }, - "category_preview_guideline2": { - "message": "Kertaus edellisestä videosta" - }, - "category_preview_guideline3": { - "message": "Ei osioille, jotka lisäävät uutta sisältöä" - }, - "category_filler": { - "message": "Epäolennainen täytesisältö/Vitsit" - }, - "category_filler_description": { - "message": "Täytteeksi tai huumoriksi lisättyjä toissijaisia kohtauksia, joita videon pääsisällön ymmärrys ei edellytä. Tämän ei tulisi sisältää aiheeseen liittyviä tai taustatietoja tarjoavia osioita. Tämä on erittäin aggressiivinen kategoria niihin hetkiin, kun et välitä \"huvituksista\"." - }, - "category_filler_short": { - "message": "Täytesisältö" - }, - "category_filler_guideline1": { - "message": "Täytteeksi tai huumoriksi lisätyt toissijaiset kohtaukset" - }, - "category_filler_guideline2": { - "message": "Häiriöt, blooperit, uusinnat" - }, - "category_filler_guideline3": { - "message": "Ei aiheen ymmärtämiseen tarvittavia kohtauksia varten" - }, - "category_music_offtopic": { - "message": "Musiikki: Musiikiton osa" - }, - "category_music_offtopic_description": { - "message": "Vain musiikkivideoille. Tätä tulee käyttää vain musiikkivideoiden osissa, jotka eivät jo kuulu toiseen kategoriaan." - }, - "category_music_offtopic_short": { - "message": "Musiikiton" - }, - "category_music_offtopic_guideline1": { - "message": "Osat, jotka eivät ole virallisissa julkaisuissa" - }, - "category_music_offtopic_guideline2": { - "message": "Musiikittomat kohdat live-esityksissä" - }, - "category_poi_highlight": { - "message": "Kohokohta" - }, - "category_poi_highlight_description": { - "message": "Kohta videossa, mitä suurin osa ihmisistä etsivät.\nSamankaltainen \"Video alkaa kohdassa x\" kommenttien kanssa." - }, - "category_poi_highlight_guideline1": { - "message": "Kohta mitä useimmat ihmiset etsivät" - }, - "category_poi_highlight_guideline2": { - "message": "Voi ohittaa kontekstin" - }, - "category_poi_highlight_guideline3": { - "message": "Voi ohittaa otsikon tai pikkukuvan viittaamaan kohtaan" - }, - "category_chapter": { - "message": "Kappale" - }, - "category_chapter_description": { - "message": "Nimetyt kappaleet, jotka kuvaavat videon merkittäviä osia." - }, - "category_chapter_guideline1": { - "message": "Älä mainitse sponsoreiden tuotemerkkejä" - }, - "category_chapter_guideline2": { - "message": "Käytä yleisille osille suurempia kappaleita" - }, - "category_chapter_guideline3": { - "message": "Pienemmät kappaleet voidaan sijoittaa suurempien kappaleiden sisälle" - }, - "category_livestream_messages": { - "message": "Livestream: lahjoitusten/viestien lukeminen" - }, - "category_livestream_messages_short": { - "message": "Viestien lukeminen" - }, - "autoSkip": { - "message": "Ohita automaattisesti" - }, - "manualSkip": { - "message": "Manuaalinen ohitus" - }, - "showOverlay": { - "message": "Näytä liukusäätimessä" - }, - "disable": { - "message": "Poista käytöstä" - }, - "autoSkip_POI": { - "message": "Ohita automaattisesti alkuun" - }, - "manualSkip_POI": { - "message": "Kysy kun video latautuu" - }, - "showOverlay_POI": { - "message": "Näytä liukusäätimessä" - }, - "showOverlay_full": { - "message": "Näytä merkki" - }, - "showOverlay_chapter": { - "message": "Näytä kappaleet" - }, - "autoSkipOnMusicVideos": { - "message": "Ohita kaikki osiot automaattisesti, kun videossa on \"Musiikiton\" osio" - }, - "muteSegments": { - "message": "Salli osiot, jotka mykistävät äänen ohittamisen sijaan" - }, - "fullVideoSegments": { - "message": "Näytä kuvake, kun video on kokonaan mainos", - "description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo" - }, - "previewColor": { - "message": "Lähettämättömien väri", - "description": "Referring to submissions that have not been sent to the server yet." - }, - "seekBarColor": { - "message": "Siirtymispalkin väri" - }, - "category": { - "message": "Kategoria" - }, - "skipOption": { - "message": "Ohitusvalinta", - "description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)" - }, - "enableTestingServer": { - "message": "Käytä betatestauspalvelinta" - }, - "whatEnableTestingServer": { - "message": "Lähetyksiäsi ja ääniäsi EI LASKETA pääpalvelimella. Käytä tätä vain testaamiseen." - }, - "testingServerWarning": { - "message": "Kaikki lähetykset ja äänet EIVÄT LASKE pääpalvelinta kohti, kun muodostat yhteyden testipalvelimeen. Varmista, että poistat tämän käytöstä, kun haluat tehdä oikeita lähetyksiä." - }, - "bracketNow": { - "message": "(Nyt)" - }, - "moreCategories": { - "message": "Lisää kategorioita" - }, - "chooseACategory": { - "message": "Valitse kategoria" - }, - "enableThisCategoryFirst": { - "message": "Lähettääksesi osioita \"{0}\" kategorialla, sinun täytyy aktivoida se asetuksista. Sinut uudelleenohjataan asetuksiin nyt.", - "description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options." - }, - "poiOnlyOneSegment": { - "message": "Varoitus: Tämäntyyppisiä osioita voi olla aktiivisena enintään yksi. Usean lähettäminen aiheuttaa sen, että satunnainen osio näytetään." - }, - "youMustSelectACategory": { - "message": "Sinun täytyy valita kategoria kaikille osioille, joita olet lähettämässä!" - }, - "bracketEnd": { - "message": "(Loppu)" - }, - "End": { - "message": "Loppu", - "description": "Button that skips to the end of a segment" - }, - "hiddenDueToDownvote": { - "message": "piilotettu: miinusääniä" - }, - "hiddenDueToDuration": { - "message": "piilotettu: liian lyhyt" - }, - "manuallyHidden": { - "message": "manuaalisesti piilotettu" - }, - "channelDataNotFound": { - "description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.", - "message": "Kanavan ID ei ole vielä latautunut. Jos käytät upotettua videota, kokeile sen sijaan käyttää YouTuben kotisivua. Tämä voi myös johtua muutoksista YouTuben ulkoasussa. Jos luulet luulet niin, tee kommenti tänne:" - }, - "invidiousPermissionRefresh": { - "message": "Selain on perunut laajennuksen oikeuden toimia Invidious- ja muilla kolmannen osapuolen sivustoilla. Palauta käyttöoikeus painamalla alla olevaa painiketta." - }, - "acceptPermission": { - "message": "Hyväksy käyttöoikeus" - }, - "permissionRequestSuccess": { - "message": "Käyttöoikeuspyyntö onnistui!" - }, - "permissionRequestFailed": { - "message": "Käyttöoikeuspyyntö epäonnistui, klikkasitko kiellä?" - }, - "adblockerIssueWhitelist": { - "message": "Jos et pysty ratkaisemaan tätä, poista käytöstä asetus 'Pakota kanavan tarkistus ennen ohittamista', koska SponsorBlock ei pysty noutamaan tämän videon kanavatietoja" - }, - "forceChannelCheck": { - "message": "Pakota kanavan tarkistus ennen ohittamista" - }, - "whatForceChannelCheck": { - "message": "Oletuksena osiot ohitetaan heti ennen kuin kanava tiedetään. Oletuksena, jotkut osiot videon alussa saattavat tulla ohitetuiksi sallituilla kanavilla. Tämän vaihtoehdon ottaminen käyttöön estää sen, mutta kaikki ohitukset viivästyvät hieman, koska kanavatunnuksen saaminen voi kestää jonkin aikaa. Tämä viive saattaa olla huomaamaton, jos sinulla on nopea internetyhteys." - }, - "forceChannelCheckPopup": { - "message": "Harkitse asetuksen \"Pakota kanavan tarkistus ennen ohittamista\" käyttöön ottaminen" - }, - "downvoteDescription": { - "message": "Virheellinen/väärä aika" - }, - "incorrectVote": { - "message": "Väärä" - }, - "harmfulVote": { - "message": "Haitallinen", - "description": "Used for chapter segments when the text is harmful/offensive to remove it faster" - }, - "incorrectCategory": { - "message": "Vaihda kategoria" - }, - "nonMusicCategoryOnMusic": { - "message": "Tämä video on luokiteltu musiikiksi. Oletko varma, että siinä on sponsori? Jos tämä on oikeasti \"Musiikiton osio\", avaa laajennuksen asetukset ja ota tämä kategoria käyttöön. Sitten voit lähettää tämän osion oikeassa kategoriassa. Lue säännöt, jos olet vielä hämilläsi." - }, - "multipleSegments": { - "message": "Useita osioita" - }, - "guidelines": { - "message": "Säännöt" - }, - "readTheGuidelines": { - "message": "Lue säännöt!!", - "description": "Show the first time they submit or if they are \"high risk\"" - }, - "categoryUpdate1": { - "message": "Kategoriat ovat täällä!" - }, - "categoryUpdate2": { - "message": "Avaa asetukset ohittaaksesi introt, outrot, kauppatavarat, jne." - }, - "help": { - "message": "Ohje" - }, - "GotIt": { - "message": "Selvä", - "description": "Used as the button to dismiss a tooltip" - }, - "fullVideoTooltipWarning": { - "message": "Tämä osio on suuri. Jos koko video koskee yhtä aihetta, vaihda \"Ohita\" valintaan \"Koko video\". Katso lisätietoja säännöistä." - }, - "categoryPillTitleText": { - "message": "Koko video on merkitty tällä kategorialla ja on erotettavaksi liian tiiviisti integroitu" - }, - "chapterNameTooltipWarning": { - "message": "Jonkin kappaleesi nimi on samankaltainen kategorian kanssa. Kun mahdollista, kappaleiden sijaan on suositeltavaa käyttää kategorioita." - }, - "experiementOptOut": { - "message": "Jättäydy pois kaikista tulevista kokeiluista", - "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": "Piilota ikuisesti" - }, - "warningChatInfo": { - "message": "Huomasimme, että teit joitakin yleisiä virheitä, jotka eivät ole tahalleen tehtyjä" - }, - "warningTitle": { - "message": "Sait varoituksen" - }, - "questionButton": { - "message": "Minulla on kysymys" - }, - "warningConfirmButton": { - "message": "Ymmärrän syyn" - }, - "warningError": { - "message": "Virhe yritettäessä kuitata varoitusta:" - }, - "Donate": { - "message": "Lahjoita" - }, - "considerDonating": { - "message": "Auta rahoittamalla kehitystä" - }, - "hideDonationLink": { - "message": "Piilota lahjoituslinkki" - }, - "darkModeOptionsPage": { - "message": "Tumma tila asetussivulla" - }, - "helpPageThanksForInstalling": { - "message": "Kiitos, että asensit SponsorBlockin." - }, - "helpPageReviewOptions": { - "message": "Tarkista alla olevat vaihtoehdot kiitos" - }, - "helpPageFeatureDisclaimer": { - "message": "Monet ominaisuudet ovat oletuksena pois päältä. Jos haluat ohittaa introt, outrot, käyttää Invidiousta, jne., ota ne käyttöön alhaalla. Voit myös piilottaa/näyttää käyttöliittymäelementtejä." - }, - "helpPageHowSkippingWorks": { - "message": "Miten ohittaminen toimii" - }, - "helpPageHowSkippingWorks1": { - "message": "Video-osiot ohitetaan automaattisesti, jos ne löytyvät tietokannasta. Voit avata ponnahdusikkunan klikkaamalla laajennuksen kuvaketta saadaksesi esikatselun siitä, mitä ne ovat." - }, - "helpPageHowSkippingWorks2": { - "message": "Aina kun ohitat osion, saat ilmoituksen. Jos ajoitus näyttää väärältä, äänestä alaspäin klikkaamalla 👎! Voit myös äänestää ponnahdusikkunassa." - }, - "Submitting": { - "message": "Lähettäminen" - }, - "helpPageSubmitting1": { - "message": "Lähettäminen voidaan tehdä joko ponnahdusikkunassa painamalla \"Osio alkaa nyt\" -painiketta, tai videosoittimessa olevilla painikkeilla." - }, - "helpPageSubmitting2": { - "message": "Toistopainikkeen klikkaaminen osoittaa osion alun ja pysäytyskuvakkeen klikkaaminen sen lopun. Voit valmistella useita sponsoreita ennen kuin painat lähetä. Lähetä-painikkeen klikkaaminen lähettää osion. Roskakorin klikkaaminen poistaa." - }, - "Editing": { - "message": "Muokkaus" - }, - "helpPageEditing1": { - "message": "Jos jokin meni pieleen, voit muokata tai poistaa osiosi ylänuolipainikkeen klikkaamisen jälkeen." - }, - "helpPageTooSlow": { - "message": "Tämä on liian hidasta" - }, - "helpPageTooSlow1": { - "message": "Voit käyttää pikanäppäimiä jos haluat. Paina puolipiste näppäintä merkitäksesi sponsori osion alun/lopun, ja paina heittomerkkiä lähettääksesi sen. Nämä voidaan vaihtaa asetuksista. Jos et käytä QWERTYä, sinun varmaan kannattaisi vaihtaa pikanäppäimet." - }, - "helpPageCopyOfDatabase": { - "message": "Voinko saada kopion tietokannasta? Mitä tapahtuu, jos katoat?" - }, - "helpPageCopyOfDatabase1": { - "message": "Tietokanta on julkinen ja saatavilla osoitteessa" - }, - "helpPageCopyOfDatabase2": { - "message": "Lähdekoodi on vapaasti saatavilla. Joten, vaikka jotain tapahtuisi minulle, sinun lähetyksesi eivät katoa." - }, - "helpPageNews": { - "message": "Uutiset ja miten se on tehty" - }, - "helpPageSourceCode": { - "message": "Mistä voin saada lähdekoodin?" - }, - "Credits": { - "message": "Tekijät" - }, - "LearnMore": { - "message": "Opi lisää" - }, - "FullDetails": { - "message": "Täydet tiedot" - }, - "CopyDownvoteButtonInfo": { - "message": "Äänestää alas ja luo paikallisen kopion, jonka voit lähettää uudelleen" - }, - "OpenCategoryWikiPage": { - "message": "Avaa tämän kategorian wiki-sivu." - }, - "CopyAndDownvote": { - "message": "Kopioi ja äänestä alas" - }, - "ContinueVoting": { - "message": "Jatka äänestystä" - }, - "ChangeCategoryTooltip": { - "message": "Tämä vaikuttaa sinun osioihin välittömästi" - }, - "downvote": { - "message": "Äänestä alas" - }, - "upvote": { - "message": "Äänestä ylös" - }, - "hideSegment": { - "message": "Piilota osio" - }, - "skipSegment": { - "message": "Ohita osio" - }, - "playChapter": { - "message": "Toista kappale" - }, - "SponsorTimeEditScrollNewFeature": { - "message": "Käytä hiiren rullaa samalla kun osoitin on muokkauslaatikon päällä säätääksesi aikaa nopeasti. Ctrl- tai Shift-näppäimen yhdistelmiä voi käyttää muutoksien hienosäätelyyn." - }, - "categoryPillNewFeature": { - "message": "Uutta! Näe, kun video on kokonaan sponsoroitu tai itsensä mainostusta" - }, - "dayAbbreviation": { - "message": "vrk", - "description": "100d" - }, - "hourAbbreviation": { - "message": "t", - "description": "100h" - }, - "optionsTabBehavior": { - "message": "Käyttäytyminen", - "description": "Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabInterface": { - "message": "Käyttöliittymä", - "description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabKeyBinds": { - "message": "Pikanäppäimet", - "description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabBackup": { - "message": "Varmuuskopioi/palauta", - "description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabAdvanced": { - "message": "Sekalaiset", - "description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "noticeVisibilityLabel": { - "message": "Ohitusilmoituksen ulkoasu", - "description": "Option label" - }, - "unbind": { - "message": "Poista kytkös", - "description": "Unbind keyboard shortcut" - }, - "notSet": { - "message": "Ei määritetty" - }, - "change": { - "message": "Vaihda" - }, - "youtubeKeybindWarning": { - "message": "Tämä on YouTuben sisäänrakennettu pikanäppäin. Haluatko varmasti käyttää sitä?" - }, - "betaServerWarning": { - "message": "BETA-palvelin on käytössä!" - }, - "openOptionsPage": { - "message": "Avaa asetussivu" - }, - "resetToDefault": { - "message": "Palauta oletusasetukset" - }, - "confirmResetToDefault": { - "message": "Haluatko varmasti palauttaa kaikki asetukset oletusarvoihin? Tätä ei voi perua." - }, - "exportSegments": { - "message": "Vie osiot" - }, - "importSegments": { - "message": "Tuo osiot" - }, - "Import": { - "message": "Tuo", - "description": "Button to initiate importing segments. Appears under the textbox where they paste in the data" - }, - "redeemSuccess": { - "message": "Lunastus onnistui!" - }, - "redeemFailed": { - "message": "Lisenssiavain on virheellinen" - }, - "hideUpsells": { - "message": "Piilotusvalinnat ovat käytettävissä vain lisämaksusta" - }, - "chooseACountry": { - "message": "Valitse maa" - }, - "noDiscount": { - "message": "Et ole oikeutettu alennukseen" - }, - "discountLink": { - "message": "Alennuslinkki (ks. pinkki hinta)" - }, - "selectYourCountry": { - "message": "Valitse maasi" - }, - "alreadyDonated": { - "message": "Jos olet aiemmin lahjoittanut jonkin summan, voit lunastaa käyttöoikeuden veloituksetta sähköpostitse:", - "description": "After the colon is an email address" - }, - "cantAfford": { - "message": "Jos sinulla ei ole varaa lisenssiin, paina {tästä} nähdäksesi oletko oikeutettu alennukseen", - "description": "Keep the curly braces. The word 'here' should be translated as well." - }, - "patreonSignIn": { - "message": "Kirjaudu sisään Patreonilla" - }, - "redeem": { - "message": "Lunasta" - }, - "joinOnPatreon": { - "message": "Tilaa Patreonissa" - }, - "oneTimePurchase": { - "message": "Kertaluontoinen osto" - }, - "enterLicenseKey": { - "message": "Syötä lisenssiavain" - }, - "chaptersPage1": { - "message": "SponsorBlockin joukkolähteinen kappaletoiminto on vain lisenssin ostaneiden tai aiempien tukien perusteella veloituksettoman käyttöoikeuden saaneiden henkilöiden käytettävissä" - }, - "chaptersPage2": { - "message": "Huomioi: Kappaleiden lähetysoikeus perustuu edelleen laskettuun maineeseen. Lisenssin hankinta sallii sinun ainoastaan tarkastella muiden lähettämiä kappaleita", - "description": "On the chapters page for getting access to the paid chapters feature" - }, - "chapterNewFeature": { - "message": "Uusi ominaisuus: Joukkolähteisesti nimetyt kappaleet. Nämä ovat nimettyjä osia videoissa, joita voi pinota yhä paremman tarkkuuden saavuttamiseksi. Osta lisenssi nähdäksesi tähän videoon lisätyt kappaleet, kuten: ", - "description": "After the comma, a list of chapters for this video will appear" - }, - "chapterNewFeature2": { - "message": "Uusi ominaisuus: Joukkolähteisesti nimetyt kappaleet. Nämä ovat nimettyjä osia videoissa, joita voi pinota yhä paremman tarkkuuden saavuttamiseksi. Sinulla on pääsy ominaisuuteen ilmaiseksi, ota se käyttöön asetuksissa." - }, - "unsubmittedSegmentCounts": { - "message": "Sinulla on tällä hetkellä {0} {1}", - "description": "Example: You currently have 12 unsubmitted segments on 5 videos" - }, - "unsubmittedSegmentCountsZero": { - "message": "Sinulla ei ole lähettämättömiä osioita", - "description": "Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments" - }, - "unsubmittedSegmentsSingular": { - "message": "lähettämätön osio", - "description": "Example: You currently have 1 *unsubmitted segment* on 1 video" - }, - "unsubmittedSegmentsPlural": { - "message": "lähettämätöntä osiota", - "description": "Example: You currently have 12 *unsubmitted segments* on 5 videos" - }, - "videosSingular": { - "message": "videossa", - "description": "Example: You currently have 3 unsubmitted segments on 1 *video*" - }, - "videosPlural": { - "message": "videossa", - "description": "Example: You currently have 12 unsubmitted segments on 5 *videos*" - }, - "clearUnsubmittedSegments": { - "message": "Tyhjennä kaikki osiot", - "description": "Label for a button in settings" - }, - "clearUnsubmittedSegmentsConfirm": { - "message": "Haluatko varmasti tyhjentää kaikki lähettämättömät osiosi?", - "description": "Confirmation message for the Clear unsubmitted segments button" - }, - "showUnsubmittedSegments": { - "message": "Näytä osiot", - "description": "Show/hide button for the unsubmitted segments list" - }, - "hideUnsubmittedSegments": { - "message": "Piilota osiot", - "description": "Show/hide button for the unsubmitted segments list" - }, - "videoID": { - "message": "Videon ID", - "description": "Header of the unsubmitted segments list" - }, - "segmentCount": { - "message": "Osiomäärä", - "description": "Header of the unsubmitted segments list" - }, - "actions": { - "message": "Toiminnot", - "description": "Header of the unsubmitted segments list" - }, - "exportSegmentsAsURL": { - "message": "Jaa URL-osoitteena" - } -} diff --git a/public/_locales/fil/messages.json b/public/_locales/fil/messages.json deleted file mode 100644 index 70fc79bc..00000000 --- a/public/_locales/fil/messages.json +++ /dev/null @@ -1,118 +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" - }, - "SubmitTimes": { - "message": "I-submit ang mga segments" - }, - "submitCheck": { - "message": "Sigurado ka bang gusto mong isumite ito?" - }, - "whitelistChannel": { - "message": "I-whitelist itong channel" - } -} diff --git a/public/_locales/fr/messages.json b/public/_locales/fr/messages.json deleted file mode 100644 index 67bd3b14..00000000 --- a/public/_locales/fr/messages.json +++ /dev/null @@ -1,1207 +0,0 @@ -{ - "fullName": { - "message": "SponsorBlock pour YouTube - Supprime les publicités intégrées", - "description": "Name of the extension." - }, - "Description": { - "message": "Ignorez les sponsors, les rappels d'interaction et plus encore sur les vidéos YouTube. Signalez les sponsors sur les vidéos que vous regardez pour sauver le temps des autres.", - "description": "Description of the extension." - }, - "400": { - "message": "Soumission invalide" - }, - "429": { - "message": "Vous cherchez à envoyer beaucoup de segments, y en a-t-il vraiment autant ?" - }, - "409": { - "message": "Ce segment a déjà été soumis auparavant" - }, - "channelWhitelisted": { - "message": "Chaîne mise sur liste blanche !" - }, - "Segment": { - "message": "segment" - }, - "Segments": { - "message": "segments" - }, - "SegmentsCap": { - "message": "Segments" - }, - "Chapters": { - "message": "Chapitres" - }, - "renderAsChapters": { - "message": "Affiche les segments en tant que chapitre", - "description": "Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system" - }, - "upvoteButtonInfo": { - "message": "Voter pour cette entrée" - }, - "reportButtonTitle": { - "message": "Signaler" - }, - "reportButtonInfo": { - "message": "Signaler que cette soumission est incorrecte." - }, - "Dismiss": { - "message": "Fermer" - }, - "Loading": { - "message": "Chargement..." - }, - "Hide": { - "message": "Ne plus montrer" - }, - "hitGoBack": { - "message": "Cliquez sur revenir en arrière pour revenir avant le saut du segment commercial." - }, - "unskip": { - "message": "Revenir en arrière" - }, - "reskip": { - "message": "Sauter" - }, - "unmute": { - "message": "Réactiver le son" - }, - "paused": { - "message": "En pause" - }, - "manualPaused": { - "message": "Minuteur arrêté" - }, - "confirmMSG": { - "message": "Pour modifier ou supprimer des soumissions, cliquez sur le bouton d'info ou ouvrez la fenêtre de l'extension en cliquant sur son icône dans le coin en haut à droite." - }, - "clearThis": { - "message": "Êtes-vous certain(e) de vouloir supprimer vos soumissions ?\n\n" - }, - "Unknown": { - "message": "Une erreur s'est produite lors de la soumission, veuillez réessayer plus tard." - }, - "sponsorFound": { - "message": "Cette vidéo a des segments dans la base de données!" - }, - "sponsor404": { - "message": "Aucun segment trouvé" - }, - "sponsorStart": { - "message": "Début du segment" - }, - "sponsorEnd": { - "message": "Fin du segment" - }, - "sponsorCancel": { - "message": "Annuler la création de segment" - }, - "noVideoID": { - "message": "Aucune vidéo YouTube trouvée.\nActualisez l'onglet s'il s'agit d'une erreur." - }, - "refreshSegments": { - "message": "Rafraîchir les segments" - }, - "success": { - "message": "Succès !" - }, - "voted": { - "message": "A voté !" - }, - "serverDown": { - "message": "Il semblerait que le serveur soit hors service. Contactez le développeur." - }, - "connectionError": { - "message": "Erreur de connexion. Code d'erreur : " - }, - "clearTimes": { - "message": "Effacer les segments" - }, - "openPopup": { - "message": "Ouvrir l'encart SponsorBlock" - }, - "closePopup": { - "message": "Fermer le Popup" - }, - "SubmitTimes": { - "message": "Soumettre des segments" - }, - "sortSegments": { - "message": "Trier les segments" - }, - "submitCheck": { - "message": "Êtes-vous sûr de vouloir soumettre ces segments?" - }, - "whitelistChannel": { - "message": "Ajouter la chaîne à la liste blanche" - }, - "removeFromWhitelist": { - "message": "Enlever la chaîne de la liste blanche" - }, - "voteOnTime": { - "message": "Voter pour un segment" - }, - "Submissions": { - "message": "Contributions" - }, - "savedPeopleFrom": { - "message": "Vous avez sauvé les utilisateurs de " - }, - "viewLeaderboard": { - "message": "Classement" - }, - "recordTimesDescription": { - "message": "Envoyer" - }, - "submissionEditHint": { - "message": "Le menu d'édition apparaîtra après que vous avez cliqué sur envoyer", - "description": "Appears in the popup to inform them that editing has been moved to the video player." - }, - "popupHint": { - "message": "Astuce : vous pouvez configurer des raccourcis clavier dans les options" - }, - "clearTimesButton": { - "message": "Supprimer les temps" - }, - "submitTimesButton": { - "message": "Soumettre les temps" - }, - "publicStats": { - "message": "Votre pseudo est inscrit dans le classement public pour afficher vos contributions. Le consulter" - }, - "Username": { - "message": "Pseudo" - }, - "setUsername": { - "message": "Choisir un pseudonyme" - }, - "copyPublicID": { - "message": "Copier l'ID utilisateur" - }, - "copySegmentID": { - "message": "Copier l'identifiant du segment" - }, - "discordAdvert": { - "message": "Rejoignez le serveur Discord officiel pour toutes suggestions ou remarques!" - }, - "hideThis": { - "message": "Cacher" - }, - "Options": { - "message": "Options" - }, - "showButtons": { - "message": "Montrer les boutons sur le lecteur YouTube" - }, - "hideButtons": { - "message": "Cacher les boutons sur le lecteur YouTube" - }, - "hideButtonsDescription": { - "message": "Ceci enlève du lecteur YouTube les boutons permettant de soumettre des segments." - }, - "showSkipButton": { - "message": "Conserver le bouton \"Aller au point essentiel\" sur le lecteur" - }, - "showInfoButton": { - "message": "Montrer le bouton Info sur le lecteur YouTube" - }, - "hideInfoButton": { - "message": "Cacher le bouton Info sur le lecteur YouTube" - }, - "autoHideInfoButton": { - "message": "Masquer automatiquement le bouton Info" - }, - "hideDeleteButton": { - "message": "Cacher le bouton Supprimer sur le lecteur YouTube" - }, - "showDeleteButton": { - "message": "Montrer le bouton Supprimer sur le lecteur YouTube" - }, - "enableViewTracking": { - "message": "Activer le suivi du nombre de sauts de segments" - }, - "whatViewTracking": { - "message": "Cette fonctionnalité permet de suivre les segments que vous avez sautés pour faire savoir aux utilisateurs à quel point leur soumission a aidé les autres et est utilisée comme donnée avec les votes positifs pour s'assurer que des spams n'entrent pas dans la base de données. L'extension envoie un message au serveur chaque fois que vous sautez un segment. Il est à espérer que la plupart des gens ne modifient pas ce paramètre pour que les données sur le nombre d'affichages soient exactes. :)" - }, - "enableViewTrackingInPrivate": { - "message": "Activer le suivi du nombre de sauts dans les onglets privés/incognito" - }, - "enableTrackDownvotes": { - "message": "Enregistrer les segments contre lesquels vous avez voté" - }, - "whatTrackDownvotes": { - "message": "Tous les segments votés négativement resteront cachés même après rafraîchissement de la page" - }, - "trackDownvotesWarning": { - "message": "Attention : Désactiver ceci supprimera tous les contre-votes précédemment enregistrés" - }, - "enableQueryByHashPrefix": { - "message": "Requête par préfixe du hash" - }, - "whatQueryByHashPrefix": { - "message": "Au lieu de demander des segments au serveur à l'aide de l'identifiant de la vidéo, les 4 premiers caractères du hash de l'identifiant de la vidéo sont envoyés. Ce serveur renverra les données pour toutes les vidéos ayant des hash similaires." - }, - "enableRefetchWhenNotFound": { - "message": "Récupérer les segments sur les nouvelles vidéos" - }, - "whatRefetchWhenNotFound": { - "message": "Si la vidéo vient de sortir et qu'aucun segment n'a été encore trouvé, SponsorBlock en cherchera durant la lecture de la vidéo." - }, - "showNotice": { - "message": "Afficher la notification" - }, - "showSkipNotice": { - "message": "Notifier après qu'un segment ait été sauté" - }, - "showCategoryGuidelines": { - "message": "Affiche l'aide de la catégorie" - }, - "noticeVisibilityMode0": { - "message": "Notifications de passage" - }, - "noticeVisibilityMode1": { - "message": "Petite notifications de passage pour l'auto skip" - }, - "noticeVisibilityMode2": { - "message": "Toute les petites notifications de passage" - }, - "noticeVisibilityMode3": { - "message": "Notifications de passage qui disparaissent pour l'auto skip" - }, - "noticeVisibilityMode4": { - "message": "Toute les notifications de passage qui disparaissent" - }, - "longDescription": { - "message": "SponsorBlock vous permet de passer les sponsors, les intros, les outros, les rappels d'abonnement et autres parties ennuyeuses des vidéos YouTube. SponsorBlock est une extension de navigateur qui permet à n'importe qui de soumettre les temps de début et de fin des segments sponsorisés et d'autres segments de vidéos YouTube. Une fois qu'une personne a soumis ces informations, toutes les autres personnes possédant cette extension passeront directement les segments sponsorisés. Vous pouvez également sauter les sections non musicales des vidéos musicales.", - "description": "Full description of the extension on the store pages." - }, - "website": { - "message": "Site web", - "description": "Used on Firefox Store Page" - }, - "sourceCode": { - "message": "Code source", - "description": "Used on Firefox Store Page" - }, - "noticeUpdate": { - "message": "La notification a été mise à jour !", - "description": "The first line of the message displayed after the notice was upgraded." - }, - "noticeUpdate2": { - "message": "Si elle ne vous plaît pas, cliquez sur le bouton \"Ne plus montrer\".", - "description": "The second line of the message displayed after the notice was upgraded." - }, - "setSkipShortcut": { - "message": "Passer le segment", - "description": "Keybind label" - }, - "setStartSponsorShortcut": { - "message": "Commencer/arrêter le segment", - "description": "Keybind label" - }, - "setSubmitKeybind": { - "message": "Soumettre les segments", - "description": "Keybind label" - }, - "nextChapterKeybind": { - "message": "Chapitre suivant", - "description": "Keybind label" - }, - "previousChapterKeybind": { - "message": "Chapitre précédent", - "description": "Keybind label" - }, - "keybindDescription": { - "message": "Sélectionnez une touche en utilisant le clavier et choisissez les touches de modification que vous souhaitez utiliser." - }, - "0": { - "message": "Délai de connexion dépassé. Vérifiez votre connexion internet. Si votre connexion internet fonctionne, le serveur est probablement surchargé ou hors service." - }, - "disableSkipping": { - "message": "Saut automatique activé" - }, - "enableSkipping": { - "message": "Saut automatique désactivé" - }, - "yourWork": { - "message": "Votre travail", - "description": "Used to describe the section that will show you the statistics from your submissions." - }, - "502": { - "message": "Le serveur semble être surchargé. Réessayez dans quelques secondes." - }, - "errorCode": { - "message": "Code d'erreur : " - }, - "skip": { - "message": "Passer" - }, - "mute": { - "message": "Couper le son" - }, - "full": { - "message": "Vidéo entière", - "description": "Used for the name of the option to label an entire video as sponsor or self promotion." - }, - "skip_category": { - "message": "Passer {0} ?" - }, - "mute_category": { - "message": "Mettre en sourdine {0} ?" - }, - "skip_to_category": { - "message": "Passer à {0} ?", - "description": "Used for skipping to things (Skip to Highlight)" - }, - "skipped": { - "message": "{0} ignoré", - "description": "Example: Sponsor Skipped" - }, - "muted": { - "message": "{0} mis en sourdine", - "description": "Example: Sponsor Muted" - }, - "skipped_to_category": { - "message": "Sauté à {0}", - "description": "Used for skipping to things (Skipped to Highlight)" - }, - "disableAutoSkip": { - "message": "Désactiver le passage automatique" - }, - "enableAutoSkip": { - "message": "Activer le passage automatique" - }, - "audioNotification": { - "message": "Notification audio lors du passage" - }, - "audioNotificationDescription": { - "message": "Une notification audio sera jouée chaque fois qu'un segment est passé. Si désactivé (ou si le passage automatique est désactivé), aucun son ne sera joué." - }, - "showTimeWithSkips": { - "message": "Afficher le temps avec les passages supprimés" - }, - "showTimeWithSkipsDescription": { - "message": "Ce temps apparaît entre crochets à côté du temps actuel sous la barre de défilement. Cela indique la durée totale de la vidéo après déduction de tous les segments. Ceci comprend les segments marqués comme étant uniquement à \"Afficher dans la barre de recherche\"." - }, - "youHaveSkipped": { - "message": "Vous avez passé " - }, - "minLower": { - "message": "minute" - }, - "minsLower": { - "message": "minutes" - }, - "hourLower": { - "message": "heure" - }, - "hoursLower": { - "message": "heures" - }, - "youHaveSavedTime": { - "message": "Vous avez fait économiser les utilisateurs", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "youHaveSavedTimeEnd": { - "message": " de leurs vies", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "statusReminder": { - "message": "Vérifiez status.sponsor.ajay.app pour le status du serveur." - }, - "whatChangeUserID": { - "message": "Il doit rester privé. 0 l'instar d'un mot de passe, il ne doit être partagé avec personne. Si une autre personne est en possession de cette information, elle peut usurper votre identité SponsorBlock. Si vous cherchez votre UserID public, cliquez sur l'icône du presse-papiers dans l'encart." - }, - "createdBy": { - "message": "Créé par" - }, - "supportOtherSites": { - "message": "Support de sites tiers YouTube" - }, - "supportOtherSitesDescription": { - "message": "Support de clients YouTube tierces. Pour habiliter le support, vous devez accepter les autorisations supplémentaires. Cela ne fonctionne PAS en incognito sur Chrome et d'autres variantes de Chromium.", - "description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube" - }, - "supportedSites": { - "message": "Sites pris en charge : " - }, - "optionsInfo": { - "message": "Activer Invidious, désactiver le passage automatique, masquer les boutons et plus encore." - }, - "addInvidiousInstance": { - "message": "Ajouter une instance de client tiers" - }, - "addInvidiousInstanceDescription": { - "message": "Ajouter une instance personnalisée. Elle doit être formaté avec SEULEMENT le domaine. Exemple: invidious.ajay.app" - }, - "add": { - "message": "Ajouter" - }, - "addInvidiousInstanceError": { - "message": "Ce domaine n'est pas valide. Il devrait JUSTE inclure le domaine. Exemple: invidious.ajay.app" - }, - "resetInvidiousInstance": { - "message": "Réinitialiser la liste d'instances Invidious" - }, - "resetInvidiousInstanceAlert": { - "message": "Vous êtes sur le point de réinitialiser la liste des instances Invidious" - }, - "currentInstances": { - "message": "Instances actuelles:" - }, - "minDuration": { - "message": "Durée minimale (en secondes):" - }, - "minDurationDescription": { - "message": "Les segments plus courts que la valeur fixée ne seront pas sautés ou affichés dans le lecteur." - }, - "enableManualSkipOnFullVideo": { - "message": "Utiliser le saut manuel quand une étiquette vidéo complète existe" - }, - "whatManualSkipOnFullVideo": { - "message": "Pour les personnes qui veulent regarder la vidéo sans interruptions si elle est complétement sponsorisée ou auto-promu." - }, - "skipNoticeDuration": { - "message": "Durée du saut de segment (secondes):" - }, - "skipNoticeDurationDescription": { - "message": "L'avis du saut restera à l'écran pendant au moins aussi longtemps. Pour passer manuellement, il peut être visible plus longtemps." - }, - "shortCheck": { - "message": "Le segment suivant est plus court que votre option de durée minimale. Cela pourrait signifier qu'il a déjà été soumis et est simplement ignoré à cause de cette option. Êtes-vous sûr de vouloir soumettre ce segment ?" - }, - "liveOrPremiere": { - "message": "La soumission de segments sur un direct en cours ou une première n'est pas autorisée. Veuillez attendre qu'il soit terminé puis actualisez la page et vérifiez que les segments sont toujours valides." - }, - "showUploadButton": { - "message": "Afficher le bouton de téléchargement" - }, - "customServerAddress": { - "message": "Adresse du serveur SponsorBlock" - }, - "customServerAddressDescription": { - "message": "L'adresse que SponsorBlock utilise pour faire des appels au serveur.\nSauf si vous avez votre propre instance de serveur, cela ne devrait pas être changé." - }, - "save": { - "message": "Sauvegarder" - }, - "reset": { - "message": "Réinitialiser" - }, - "customAddressError": { - "message": "Le format de l'adresse est incorrect. Assurez-vous qu'elle commence bien par http:// ou https:// et ne termine pas par un slash." - }, - "areYouSureReset": { - "message": "Voulez-vous vraiment remettre à zéro ?" - }, - "mobileUpdateInfo": { - "message": "m.youtube.com est maintenant pris en charge" - }, - "exportOptions": { - "message": "Importer/Exporter toutes les options" - }, - "exportOptionsCopy": { - "message": "Modifier/copier" - }, - "exportOptionsDownload": { - "message": "Enregistrer dans un fichier" - }, - "exportOptionsUpload": { - "message": "Charger à partir du fichier" - }, - "setOptions": { - "message": "Définir les options" - }, - "exportOptionsWarning": { - "message": "Attention : La modification des options est définitive et peut rendre instable voire planter votre installation. Êtes-vous sûr de vouloir faire ça ? Faites une sauvegarde de votre ancienne configuration au cas où." - }, - "incorrectlyFormattedOptions": { - "message": "Ce JSON n'est pas formaté correctement. Vos options n'ont pas été modifiées." - }, - "confirmNoticeTitle": { - "message": "Soumettre le segment" - }, - "submit": { - "message": "Soumettre" - }, - "cancel": { - "message": "Annuler" - }, - "delete": { - "message": "Supprimer" - }, - "preview": { - "message": "Aperçu" - }, - "unsubmitted": { - "message": "Non soumis" - }, - "inspect": { - "message": "Inspecter" - }, - "edit": { - "message": "Éditer" - }, - "copyDebugInformation": { - "message": "Copier les informations de débogage dans le presse-papiers" - }, - "copyDebugInformationFailed": { - "message": "Impossible de copier dans le presse-papiers" - }, - "copyDebugInformationOptions": { - "message": "Copie les informations dans le presse-papiers de manière à les fournir à l'équipe de développement dans un rapport de bug ou si on vous le demande. Les informations personnelles telles que le UserID privé, les chaînes sur liste blanche ou l'adresse du serveur personnalisé sont retirées des données copiées. Cependant, des informations telles que votre user-agent, votre navigateur web, votre système d'exploitation ou le numéro de version d'extension de SponsorBlock font partie des données copiées. " - }, - "copyDebugInformationComplete": { - "message": "Les informations de débogage ont été copiées dans le presse-papiers. N'hésitez pas à supprimer toute information que vous ne souhaitez pas partager. Enregistrez-les dans un fichier texte ou collez-les dans le rapport de bug." - }, - "keyAlreadyUsed": { - "message": "Ce raccourci est lié à une autre action. Veuillez en choisir un autre." - }, - "to": { - "message": "à", - "description": "Used between segments. Example: 1:20 to 1:30" - }, - "CopiedExclamation": { - "message": "Copié!", - "description": "Used after something has been copied to the clipboard. Example: 'Copied!'" - }, - "generic_guideline1": { - "message": "Inclure les transitions entre les segments" - }, - "generic_guideline2": { - "message": "Jouer comme si rien n'avait été passé" - }, - "category_sponsor": { - "message": "Message sponsorisé" - }, - "category_sponsor_description": { - "message": "Promotion rémunérée, parrainage rémunéré et publicité directe. Pas pour l'autopromotion ou les présentations gratuites de causes, de créateurs, de sites web ou de produits qu'ils aiment." - }, - "category_sponsor_guideline1": { - "message": "Promotions rémunérées" - }, - "category_sponsor_guideline2": { - "message": "Pas pour les dons ou les produits dérivés" - }, - "category_selfpromo": { - "message": "Non rémunéré/autopromotion" - }, - "category_selfpromo_description": { - "message": "Semblable aux \"messages commerciaux\", excepté pour la promotion non rémunérée ou l'autopromotion. Cela inclut les marchandises, les dons et les informations sur leurs collaborateurs." - }, - "category_selfpromo_guideline1": { - "message": "Dons, abonnements (payant) et produits dérivés" - }, - "category_selfpromo_guideline2": { - "message": "Remerciements gratuits qui n'apportent aucune information à la vidéo" - }, - "category_selfpromo_guideline3": { - "message": "Pas pour des produits dérivés fait par des marques" - }, - "category_exclusive_access": { - "message": "Accès exclusif" - }, - "category_exclusive_access_description": { - "message": "Sert uniquement à étiqueter les vidéos entièrement sponsorisées. Utilisé quand une vidéo présente un produit, un service ou un emplacement pour lesquels un accès gratuit ou subventionné a été reçu." - }, - "category_exclusive_access_pill": { - "message": "Cette vidéo présente un produit, un service ou un lieu pour lequel un accès gratuit ou subventionné a été reçu", - "description": "Short description for this category" - }, - "category_exclusive_access_guideline1": { - "message": "Toute la vidéo présente quelque chose dont le créateur a eu un accès gratuit ou subventionné" - }, - "category_interaction": { - "message": "Rappel d'interaction (abonnement)" - }, - "category_interaction_description": { - "message": "Bref rappel d'aimer la vidéo ou de s'abonner à la chaîne au milieu de la vidéo. Si le message est long ou porte sur quelque chose de précis, classez plutôt le segment comme autopromotion." - }, - "category_interaction_guideline1": { - "message": "Rappels courts à like, s'abonner ou suivre" - }, - "category_interaction_guideline2": { - "message": "Inclut des rappels indirects à commenter" - }, - "category_interaction_guideline3": { - "message": "Pas pour la promotion générale, seulement les appels à l'interaction" - }, - "category_interaction_short": { - "message": "Rappel d'interaction" - }, - "category_intro": { - "message": "Entracte/Animation d'intro" - }, - "category_intro_description": { - "message": "Un intervalle sans réel contenu, par exemple une pause, une image statique ou une animation répétitive. N'utilisez pas cette catégorie pour les transitions contenant de l'information." - }, - "category_intro_short": { - "message": "Entracte" - }, - "category_intro_guideline1": { - "message": "Intervalle sans contenu réel" - }, - "category_intro_guideline2": { - "message": "Pas pour les transitions avec des informations" - }, - "category_outro": { - "message": "Générique de fin" - }, - "category_outro_description": { - "message": "Crédits ou écrans de fin YouTube. Pas pour les conclusions contenant des informations." - }, - "category_outro_guideline1": { - "message": "Ne dois pas inclure de contenu, même si les écrans de fin sont apparus" - }, - "category_preview": { - "message": "Aperçu/Résumé" - }, - "category_preview_description": { - "message": "Collection de clips qui montrent ce qui se passe dans cette vidéo ou d'autres vidéos d'une série où toutes les informations sont répétées plus tard dans la vidéo." - }, - "category_preview_guideline1": { - "message": "Clips apparaissant plus tard ou dans une prochaine vidéo" - }, - "category_preview_guideline2": { - "message": "Récapitulatif d'une vidéo précédente" - }, - "category_preview_guideline3": { - "message": "Pas pour les sections qui ajoutent du contenu supplémentaire" - }, - "category_filler": { - "message": "Digressions/Blagues" - }, - "category_filler_short": { - "message": "Remplissage" - }, - "category_filler_guideline1": { - "message": "Scènes digressives uniquement pour le remplissage ou l'humour" - }, - "category_filler_guideline2": { - "message": "Distractions, bêtisiers, replays" - }, - "category_filler_guideline3": { - "message": "Pas pour les scènes requises pour comprendre le sujet" - }, - "category_music_offtopic": { - "message": "Musique : Segment non musical" - }, - "category_music_offtopic_description": { - "message": "A utiliser seulement pour les vidéos de musiques. Ceci ne devrait qu'être utilisé que pour des morceaux de vidéos de musiques qui ne sont pas couvert par d'autres catégories." - }, - "category_music_offtopic_short": { - "message": "Hors musique" - }, - "category_music_offtopic_guideline1": { - "message": "Sections qui ne sont pas dans la musique officielle" - }, - "category_music_offtopic_guideline2": { - "message": "Pas de musique pendant les concerts en direct" - }, - "category_poi_highlight": { - "message": "Point essentiel" - }, - "category_poi_highlight_description": { - "message": "La partie de la vidéo que la plupart des gens veulent voir. Similaire à \"la vidéo commence à x mins\"." - }, - "category_poi_highlight_guideline1": { - "message": "Section la plus regardée" - }, - "category_poi_highlight_guideline2": { - "message": "Peut sauter le contexte" - }, - "category_poi_highlight_guideline3": { - "message": "Peut passer au sujet cité dans le titre ou la miniature" - }, - "category_chapter": { - "message": "Chapitre" - }, - "category_chapter_description": { - "message": "Noms de chapitres personnalisés décrivant les sections importantes d'une vidéo." - }, - "category_chapter_guideline1": { - "message": "Ne pas mentionner les marques du sponsor" - }, - "category_chapter_guideline2": { - "message": "Utiliser de plus grands chapitres pour les sections générales" - }, - "category_chapter_guideline3": { - "message": "Les plus petits chapitres peuvent être placés dans les plus grands" - }, - "category_livestream_messages": { - "message": "Stream : lecture de dons et messages" - }, - "category_livestream_messages_short": { - "message": "Lecture de messages" - }, - "autoSkip": { - "message": "Passage automatique" - }, - "manualSkip": { - "message": "Passer manuellement" - }, - "showOverlay": { - "message": "Afficher dans la barre de progression" - }, - "disable": { - "message": "Désactiver" - }, - "autoSkip_POI": { - "message": "Passer automatiquement au début" - }, - "manualSkip_POI": { - "message": "Demander lors du chargement de la vidéo" - }, - "showOverlay_POI": { - "message": "Afficher dans la barre de recherche" - }, - "showOverlay_full": { - "message": "Afficher l'étiquette" - }, - "showOverlay_chapter": { - "message": "Montre les chapitres" - }, - "autoSkipOnMusicVideos": { - "message": "Ignorer automatiquement tous les segments lorsqu'il y a un segment non-musical" - }, - "muteSegments": { - "message": "Autoriser les segments qui bloquent l'audio au lieu de le passer" - }, - "fullVideoSegments": { - "message": "Afficher une icône lorsqu'une vidéo est entièrement promotionnelle", - "description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo" - }, - "previewColor": { - "message": "Couleur non soumise", - "description": "Referring to submissions that have not been sent to the server yet." - }, - "seekBarColor": { - "message": "Couleur dans la barre de progression" - }, - "category": { - "message": "Catégorie" - }, - "skipOption": { - "message": "Option de saut", - "description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)" - }, - "enableTestingServer": { - "message": "Activer le serveur de test bêta" - }, - "whatEnableTestingServer": { - "message": "Vos soumissions et votes NE COMPTERONT PAS sur le serveur principal. Utilisez ceci uniquement pour faire des tests." - }, - "testingServerWarning": { - "message": "AUCUNE SOUMISSION OU VOTE NE COMPTERA sur le serveur principal tant que vous serez connecté au serveur de test. Désactivez ceci quand vous voudrez réellement soumettre ou voter." - }, - "bracketNow": { - "message": "(Maintenant)" - }, - "moreCategories": { - "message": "Autres catégories" - }, - "chooseACategory": { - "message": "Choisissez une catégorie" - }, - "enableThisCategoryFirst": { - "message": "Pour envoyer des segments de la catégorie \"{0}\", vous devez l'activer dans les options. Vous allez être redirigé vers les options maintenant.", - "description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options." - }, - "poiOnlyOneSegment": { - "message": "Attention : un seul segment de ce type de segment peut être actif à la fois. En soumettant plusieurs segments, un seul d'entre eux sera aléatoirement affiché." - }, - "youMustSelectACategory": { - "message": "Vous devez sélectionner une catégorie pour tous les segments que vous soumettez !" - }, - "bracketEnd": { - "message": "(Fin)" - }, - "End": { - "message": "Fin", - "description": "Button that skips to the end of a segment" - }, - "hiddenDueToDownvote": { - "message": "masqué : vote négatif" - }, - "hiddenDueToDuration": { - "message": "masqué : trop court" - }, - "manuallyHidden": { - "message": "masqué manuellement" - }, - "channelDataNotFound": { - "description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.", - "message": "Le Channel ID n'est pas encore chargé. Si vous utilisez une vidéo intégrée, essayez plutôt d'utiliser la page d'accueil de YouTube. Le problème peut également être causé par des changements dans l'interface de YouTube, si vous pensez que c'est le cas, écrivez un commentaire ici :" - }, - "invidiousPermissionRefresh": { - "message": "Le navigateur a refusé l'autorisation nécessaire pour pouvoir fonctionner sur Invidious et d'autres sites tiers. Veuillez cliquer sur le bouton ci-dessous pour réactiver cette autorisation." - }, - "acceptPermission": { - "message": "Accepter l'autorisation" - }, - "permissionRequestSuccess": { - "message": "Demande de permission réussie !" - }, - "permissionRequestFailed": { - "message": "La demande d'autorisation a échoué, avez-vous cliqué sur refuser ?" - }, - "adblockerIssueWhitelist": { - "message": "Si vous ne parvenez pas à résoudre ce problème, désactivez le paramètre 'Force Channel Check Before Skipping' car SponsorBlock est incapable de récupérer les informations de la chaine pour cette vidéo" - }, - "forceChannelCheck": { - "message": "Forcer la vérification du canal avant de passer" - }, - "whatForceChannelCheck": { - "message": "Par défaut, les segments sont passés avant même de savoir à quelle chaîne la vidéo appartient. Par défaut, certains segments en début de vidéo des chaînes sur liste blanche peuvent être involontairement passés. Activer cette option évitera ce problème mais le passage des segments aura un léger retard, du fait que l'obtention du ChannelID prend du temps. Ce retard devrait être imperceptible si vous avez un haut débit internet." - }, - "forceChannelCheckPopup": { - "message": "Envisagez d'activer \"Forcez la vérification de la chaîne avant de passer\"" - }, - "downvoteDescription": { - "message": "Segment de mauvaise qualité" - }, - "incorrectVote": { - "message": "Incorrect" - }, - "harmfulVote": { - "message": "Néfaste", - "description": "Used for chapter segments when the text is harmful/offensive to remove it faster" - }, - "incorrectCategory": { - "message": "Changer de catégorie" - }, - "nonMusicCategoryOnMusic": { - "message": "Cette vidéo est catégorisée comme de la musique. Êtes-vous sûr qu'elle est sponsorisée? S'il s'agit en fait d'un \"Segment non musical\", allez dans les options de l'extension et activez cette catégorie. Ensuite, vous pourrez soumettre ce segment en tant que \"Segment non musical\" au lieu de sponsor. Lisez les instructions en cas de confusion." - }, - "multipleSegments": { - "message": "Plusieurs segments" - }, - "guidelines": { - "message": "Instructions" - }, - "readTheGuidelines": { - "message": "Lisez les instructions !!", - "description": "Show the first time they submit or if they are \"high risk\"" - }, - "categoryUpdate1": { - "message": "Les catégories sont là !" - }, - "categoryUpdate2": { - "message": "Ouvrir les options pour sauter les intros, outros, marchandises, etc." - }, - "help": { - "message": "Aide" - }, - "GotIt": { - "message": "Compris", - "description": "Used as the button to dismiss a tooltip" - }, - "fullVideoTooltipWarning": { - "message": "Ce segment est long. Si toute la vidéo parle d'un seul sujet, changer de \"Passer\" à \"Toute la vidéo\". Voir les instructions pour plus d'informations." - }, - "categoryPillTitleText": { - "message": "L'intégralité de cette vidéo est classée dans cette catégorie ce qui la rend trop intriquée pour l'en séparer" - }, - "chapterNameTooltipWarning": { - "message": "Un des noms du chapitre est similaire à la catégorie. Tu devrais plutôt utiliser une catégorie si possible." - }, - "experiementOptOut": { - "message": "Se désinscrire de toutes les futures expériences", - "description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private." - }, - "hideForever": { - "message": "Cacher pour toujours" - }, - "warningChatInfo": { - "message": "Nous avons remarqué que vous faisiez des erreurs courantes qui ne sont pas intentionnelles" - }, - "warningTitle": { - "message": "Vous avez reçu un avertissement" - }, - "questionButton": { - "message": "J’ai une question" - }, - "warningConfirmButton": { - "message": "Je comprends les risques" - }, - "warningError": { - "message": "Erreur lors de la tentative de reconnaissance de l'avertissement :" - }, - "Donate": { - "message": "Faire un don" - }, - "considerDonating": { - "message": "Aider à financer le développement" - }, - "hideDonationLink": { - "message": "Cacher le lien de don" - }, - "darkModeOptionsPage": { - "message": "Page options affichée en mode sombre" - }, - "helpPageThanksForInstalling": { - "message": "Merci d'avoir installé SponsorBlock." - }, - "helpPageReviewOptions": { - "message": "Veuillez vérifier les options ci-dessous" - }, - "helpPageFeatureDisclaimer": { - "message": "De nombreuses fonctionnalités sont désactivées par défaut. Si vous voulez ignorer les intros, outros, utiliser Invidious, etc., activez-les ci-dessous. Vous pouvez également masquer/afficher les éléments de l'interface." - }, - "helpPageHowSkippingWorks": { - "message": "Comment fonctionne le saut d'un segment" - }, - "helpPageHowSkippingWorks1": { - "message": "Les segments vidéo seront automatiquement ignorés s'ils sont trouvés dans la base de données. Vous pouvez ouvrir le popup en cliquant sur l'icône de l'extension pour obtenir un aperçu de ces segments." - }, - "helpPageHowSkippingWorks2": { - "message": "À chaque fois que vous sautez un segment, vous en serez averti. Si le timing semble incorrect, vous pouvez disliker le segment, vous pouvez également voter dans le popup." - }, - "Submitting": { - "message": "Soumission en cours" - }, - "helpPageSubmitting1": { - "message": "La soumission peut être effectuée dans le popup en appuyant sur le bouton \"le segment commence maintenant\" ou dans le lecteur vidéo avec les boutons du lecteur." - }, - "helpPageSubmitting2": { - "message": "Cliquer sur le bouton de lecture indique le début d'un segment et cliquer sur l'icône d'arrêt indique sa fin. Vous pouvez préparer plusieurs messages commerciaux avant d'appuyer sur Soumettre. Cliquer sur le bouton Téléverser soumettra vos segments. Cliquer sur la poubelle supprimera vos segments." - }, - "Editing": { - "message": "Édition en cours" - }, - "helpPageEditing1": { - "message": "Si vous avez fait une erreur, vous pouvez modifier ou supprimer vos segments après avoir cliqué sur le bouton avec la flèche vers le haut." - }, - "helpPageTooSlow": { - "message": "Ceci est trop lent" - }, - "helpPageTooSlow1": { - "message": "Il y a des raccourcis clavier si vous voulez les utiliser. Appuyez sur la touche point-virgule pour indiquer le début / la fin d'un segment sponsorisé et cliquez sur l'apostrophe pour soumettre. Cela peut être modifié dans les options. Si vous n'utilisez pas un clavier QWERTY, vous devriez probablement changer la touche assignée de base." - }, - "helpPageCopyOfDatabase": { - "message": "Puis-je obtenir une copie de la base de données ? Que se passe-t-il si vous disparaissez ?" - }, - "helpPageCopyOfDatabase1": { - "message": "La base de données est publique et disponible à" - }, - "helpPageCopyOfDatabase2": { - "message": "Le code source est librement disponible. Donc, même si il m'arrive quelque chose, vos soumissions ne seront pas perdues." - }, - "helpPageNews": { - "message": "Nouvelles et comment elles sont faites" - }, - "helpPageSourceCode": { - "message": "Où puis-je obtenir le code source ?" - }, - "Credits": { - "message": "Crédits" - }, - "LearnMore": { - "message": "En savoir plus" - }, - "FullDetails": { - "message": "Tous les détails" - }, - "CopyDownvoteButtonInfo": { - "message": "Vote contre et crée une copie locale à soumettre à nouveau" - }, - "OpenCategoryWikiPage": { - "message": "Ouvrir la page wiki de cette catégorie." - }, - "CopyAndDownvote": { - "message": "Copier et voter contre" - }, - "ContinueVoting": { - "message": "Continuer à voter" - }, - "ChangeCategoryTooltip": { - "message": "Cela s'appliquera instantanément à vos segments" - }, - "downvote": { - "message": "Voter contre" - }, - "upvote": { - "message": "Voter pour" - }, - "hideSegment": { - "message": "Cacher le segment" - }, - "SponsorTimeEditScrollNewFeature": { - "message": "Utilisez la molette de votre souris en survolant la boîte d'édition pour ajuster rapidement le minutage. Les combinaisons de touches ctrl ou maj peuvent être utilisées pour affiner les modifications." - }, - "categoryPillNewFeature": { - "message": "Nouveau ! Soyez prévenu-e quand une vidéo est entièrement sponsorisée ou autopromotionnelle" - }, - "dayAbbreviation": { - "message": "j", - "description": "100d" - }, - "hourAbbreviation": { - "message": "h", - "description": "100h" - }, - "optionsTabBehavior": { - "message": "Comportement", - "description": "Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabInterface": { - "message": "Interface", - "description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabKeyBinds": { - "message": "Raccourcis clavier", - "description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabBackup": { - "message": "Sauvegarde/Restauration", - "description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabAdvanced": { - "message": "Divers", - "description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "noticeVisibilityLabel": { - "message": "Sauter l'affichage de l'avertissement", - "description": "Option label" - }, - "unbind": { - "message": "Délier", - "description": "Unbind keyboard shortcut" - }, - "notSet": { - "message": "Non configuré" - }, - "change": { - "message": "Changer" - }, - "youtubeKeybindWarning": { - "message": "Il s'agit d'un raccourci intégré à YouTube. Êtes-vous sûr de vouloir l'utiliser ?" - }, - "betaServerWarning": { - "message": "Le serveur BETA est actif !" - }, - "openOptionsPage": { - "message": "Ouvrir la page d'options" - }, - "resetToDefault": { - "message": "Rétablir les paramètres par défaut" - }, - "confirmResetToDefault": { - "message": "Êtes-vous sûr de vouloir rétablir tous les paramètres ? Cette action ne peut pas être annulée." - }, - "exportSegments": { - "message": "Exporter les segments" - }, - "importSegments": { - "message": "Importer des segments" - }, - "Import": { - "message": "Importer", - "description": "Button to initiate importing segments. Appears under the textbox where they paste in the data" - }, - "redeemSuccess": { - "message": "Code échangé avec succès!" - }, - "redeemFailed": { - "message": "La clé de licence est invalide" - }, - "hideUpsells": { - "message": "Cache les potions non disponibles sans paiement supplémentaire" - }, - "chooseACountry": { - "message": "Sélectionnez un pays" - }, - "noDiscount": { - "message": "Vous n'êtes pas éligibles à une réduction" - }, - "discountLink": { - "message": "Lien de réduction (Voir le prix rose)" - }, - "selectYourCountry": { - "message": "Sélectionne ton pays" - }, - "alreadyDonated": { - "message": "Si tu as fait un don de n'importe quel montant avant, tu peux avoir un accès gratuit en envoyant un e-mail :", - "description": "After the colon is an email address" - }, - "cantAfford": { - "message": "Si vous ne pouvez pas vous permettre d'acheter une licence, cliquez sur {here} pour voir si vous êtes admissible à une réduction", - "description": "Keep the curly braces. The word 'here' should be translated as well." - }, - "patreonSignIn": { - "message": "Se connecter avec Patreon" - }, - "redeem": { - "message": "Réclamer" - }, - "joinOnPatreon": { - "message": "Soutenir sur Patreon" - }, - "oneTimePurchase": { - "message": "Achat unique" - }, - "enterLicenseKey": { - "message": "Entrer la clé de licence" - }, - "chaptersPage1": { - "message": "La fonctionnalité participative des chapitres de SponsorBlock n'est disponible que pour les personnes qui achètent une licence, ou pour les personnes qui en ont l'accès gratuitement grâce à leurs contributions passées" - }, - "chapterNewFeature": { - "message": "Nouvelle fonctionnalité : Chapitres personnalisés crowd-sourcés. Ce sont des sections dans les vidéos avec un nom personnalisé qui s'améliore au fur et à mesure. Achetez une licence pour voir les chapitres soumis sur cette vidéo tels que: ", - "description": "After the comma, a list of chapters for this video will appear" - }, - "unsubmittedSegmentCounts": { - "message": "Vous avez actuellement {0} sur {1}", - "description": "Example: You currently have 12 unsubmitted segments on 5 videos" - }, - "unsubmittedSegmentCountsZero": { - "message": "Vous avez actuellement soumis aucun segment", - "description": "Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments" - }, - "unsubmittedSegmentsSingular": { - "message": "segment non soumis", - "description": "Example: You currently have 1 *unsubmitted segment* on 1 video" - }, - "unsubmittedSegmentsPlural": { - "message": "segments non soumis", - "description": "Example: You currently have 12 *unsubmitted segments* on 5 videos" - }, - "videosSingular": { - "message": "vidéo", - "description": "Example: You currently have 3 unsubmitted segments on 1 *video*" - }, - "videosPlural": { - "message": "vidéos", - "description": "Example: You currently have 12 unsubmitted segments on 5 *videos*" - }, - "clearUnsubmittedSegments": { - "message": "Effacer tous les segments", - "description": "Label for a button in settings" - }, - "clearUnsubmittedSegmentsConfirm": { - "message": "Êtes-vous sûr de vouloir effacer tout les segments non soumis?", - "description": "Confirmation message for the Clear unsubmitted segments button" - }, - "showUnsubmittedSegments": { - "message": "Montrer les segments", - "description": "Show/hide button for the unsubmitted segments list" - }, - "hideUnsubmittedSegments": { - "message": "Cacher les segments", - "description": "Show/hide button for the unsubmitted segments list" - }, - "videoID": { - "message": "ID de la vidéo", - "description": "Header of the unsubmitted segments list" - }, - "segmentCount": { - "message": "Nombre de segments", - "description": "Header of the unsubmitted segments list" - }, - "actions": { - "message": "Actions", - "description": "Header of the unsubmitted segments list" - }, - "exportSegmentsAsURL": { - "message": "Partager un URL" - } -} diff --git a/public/_locales/gu/messages.json b/public/_locales/gu/messages.json deleted file mode 100644 index 41d76841..00000000 --- a/public/_locales/gu/messages.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "fullName": { - "message": "યુટ્યુબ માટે સ્પોન્સરબ્લોક - સ્પોન્સરશિપ છોડી દો", - "description": "Name of the extension." - }, - "400": { - "message": "સર્વરે કહ્યું કે આ વિનંતી અમાન્ય છે" - }, - "429": { - "message": "તમે આ એક વિડિઓ માટે ઘણી પ્રાયોજક વખત સબમિટ કરી છે, શું તમને ખાતરી છે કે આ ઘણા છે?" - }, - "409": { - "message": "આ અગાઉ રજુ કરવામાં આવી છે" - }, - "channelWhitelisted": { - "message": "ચેનલ વ્હાઇટલિસ્ટેડ!" - } -} diff --git a/public/_locales/he/messages.json b/public/_locales/he/messages.json deleted file mode 100644 index c420fefc..00000000 --- a/public/_locales/he/messages.json +++ /dev/null @@ -1,484 +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": "סגור חלון" - }, - "SubmitTimes": { - "message": "הגש מקטעים" - }, - "submitCheck": { - "message": "אתה בטוח שאתה רוצה להזין את זה?" - }, - "whitelistChannel": { - "message": "הרשה ערוץ" - }, - "removeFromWhitelist": { - "message": "הסר ערוץ מרשימת ערוצים מורשים" - }, - "voteOnTime": { - "message": "הצבע על מקטע" - }, - "Submissions": { - "message": "הזנות" - }, - "savedPeopleFrom": { - "message": "הצלת אנשים מ " - }, - "viewLeaderboard": { - "message": "לוח מובילים" - }, - "recordTimesDescription": { - "message": "הגש" - }, - "submissionEditHint": { - "message": "עריכת מקטע תופיע אחרי שתלחץ הגש", - "description": "Appears in the popup to inform them that editing has been moved to the video player." - }, - "popupHint": { - "message": "רמז: אתה יכול להגדיר קיצורים מהמקלדת דרך תפריט אפשרויות כדי להזין זמנים" - }, - "clearTimesButton": { - "message": "נקה זמנים" - }, - "submitTimesButton": { - "message": "הגש זמנים" - }, - "publicStats": { - "message": "זה משומש בעמוד הסטטים הפומביים כדי להראות כמה תרמת. צפה בזה" - }, - "Username": { - "message": "שם משתמש" - }, - "setUsername": { - "message": "הגדר שם משתמש" - }, - "copyPublicID": { - "message": "העתק קוד משתמש פומבי" - }, - "discordAdvert": { - "message": "הצטרף לשרת הדיסקורד הרשמי כדי לביא הצעות וחוות דעת!" - }, - "hideThis": { - "message": "הסתר" - }, - "Options": { - "message": "אפשרויות" - }, - "showButtons": { - "message": "הראה כפתורים על הנגן של יוטיוב" - }, - "hideButtons": { - "message": "הסתר כפתורים על הנגן של יוטיוב" - }, - "hideButtonsDescription": { - "message": "זה מחביא את הכפתורים שמופיעים בנגן YouTube להגיש מקטעי דילוג." - }, - "showSkipButton": { - "message": "השאר את כפתור הדילוג לשיא הסרטון על הנגן באופן קבוע" - }, - "showInfoButton": { - "message": "הראה כפתור מידע בנגן YouTube" - }, - "hideInfoButton": { - "message": "החבא כפתור מידע בנגן YouTube" - }, - "autoHideInfoButton": { - "message": "הסתר אוטומטית כפתורי אינפורמציה" - }, - "hideDeleteButton": { - "message": "הסתר כפתור מחיקה על הנגן של יוטיוב" - }, - "showDeleteButton": { - "message": "הצג כפתור מחיקה על הנגן של יוטיוב" - }, - "whatViewTracking": { - "message": "הפיצ'ר הזה עוקב אחרי מקטעים שדילגת עליהם בכדי ליידע משתמשים אחרים כמה ההגשות שלך עזרו לאחרים ושומשו כמטריקה יחד עם ההצבעות בעד בכדי להבטיח שלא ייכנס ספאם אל תוך המערכת. ההרחבה שולחת הודעה לשרת בכל פעם שאתה מדלג על מקטע. התקווה היא שרוב האנשים לא ישנו את ההגדרה הזו כדי שהמספרי צפייה יהיו מדוייקים :)" - }, - "website": { - "message": "אתר", - "description": "Used on Firefox Store Page" - }, - "sourceCode": { - "message": "קוד מקור", - "description": "Used on Firefox Store Page" - }, - "nextChapterKeybind": { - "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": "השתק" - }, - "mute_category": { - "message": "השתק {0}?" - }, - "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": "הוסף" - }, - "save": { - "message": "שמור" - }, - "reset": { - "message": "אתחל" - }, - "exportOptionsCopy": { - "message": "ערוך/העתק" - }, - "exportOptionsDownload": { - "message": "שמור לקובץ" - }, - "exportOptionsUpload": { - "message": "טען מקובץ" - }, - "setOptions": { - "message": "הגדר אפשרויות" - }, - "confirmNoticeTitle": { - "message": "הגש מקטע" - }, - "submit": { - "message": "הגש" - }, - "cancel": { - "message": "ביטול" - }, - "delete": { - "message": "מחק" - }, - "preview": { - "message": "תצוגה מקדימה" - }, - "unsubmitted": { - "message": "לא מוגש" - }, - "inspect": { - "message": "סקור" - }, - "edit": { - "message": "עריכה" - }, - "to": { - "message": "עד ל", - "description": "Used between segments. Example: 1:20 to 1:30" - }, - "category_sponsor": { - "message": "נותן חסות" - }, - "category_exclusive_access": { - "message": "גישה אקסקלוסיבית" - }, - "category_music_offtopic": { - "message": "מוזיקה: קטעים ללא מוזיקה" - }, - "category_music_offtopic_short": { - "message": "ללא מוזיקה" - }, - "category_poi_highlight": { - "message": "קטע חשוב" - }, - "autoSkip": { - "message": "דילוג אוטומטי" - }, - "manualSkip": { - "message": "דלג ידנית" - }, - "showOverlay": { - "message": "הראה בטיימליין" - }, - "showOverlay_POI": { - "message": "הראה בטיימליין" - }, - "category": { - "message": "קטגוריה" - }, - "skipOption": { - "message": "אפשרות דילוג", - "description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)" - }, - "bracketNow": { - "message": "(עכשיו)" - }, - "moreCategories": { - "message": "עוד קטגוריות" - }, - "chooseACategory": { - "message": "בחר קטגוריה" - }, - "bracketEnd": { - "message": "(סוף)" - }, - "downvoteDescription": { - "message": "זמן שגוי/לא נכון" - }, - "incorrectCategory": { - "message": "שנה קטגוריה" - }, - "multipleSegments": { - "message": "מספר מקטעים" - }, - "guidelines": { - "message": "הנחיות" - }, - "readTheGuidelines": { - "message": "קראו את ההנחיות!!", - "description": "Show the first time they submit or if they are \"high risk\"" - }, - "categoryUpdate1": { - "message": "קטגוריות נמצאות כאן!" - }, - "help": { - "message": "עזרה" - }, - "GotIt": { - "message": "הבנתי", - "description": "Used as the button to dismiss a tooltip" - }, - "experiementOptOut": { - "message": "לא מעוניין להשתתף בניסויים עתידיים", - "description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private." - }, - "hideForever": { - "message": "הסתר לעד" - }, - "Donate": { - "message": "תרום" - }, - "considerDonating": { - "message": "עזרו לממן את הפיתוח" - }, - "hideDonationLink": { - "message": "הסתר כפתור תרומה" - }, - "helpPageThanksForInstalling": { - "message": "תודה שהתקנת את ספונסרבלוק." - }, - "helpPageReviewOptions": { - "message": "אנא סקור את האפשרויות הבאות" - }, - "helpPageHowSkippingWorks": { - "message": "כיצד דילוג עובד" - }, - "Submitting": { - "message": "שולח" - }, - "Editing": { - "message": "עריכה" - }, - "helpPageTooSlow": { - "message": "הקצב איטי מדי" - }, - "helpPageCopyOfDatabase2": { - "message": "קוד המקור זמין באופן חופשי ובחינם. אז, אפילו אם משהו יקרה לי, המקטעים שהגשתם לא יאבדו." - }, - "helpPageNews": { - "message": "חדשות וכיצד זה נעשה" - }, - "helpPageSourceCode": { - "message": "היכן אוכל להשיג את קוד המקור?" - }, - "Credits": { - "message": "קרדיטים" - }, - "LearnMore": { - "message": "למידע נוסף" - }, - "CopyAndDownvote": { - "message": "העתק ועשה דיסלייק" - }, - "ContinueVoting": { - "message": "המשך להצביע" - }, - "ChangeCategoryTooltip": { - "message": "זה מיידית ישפיע על כל המקטעים שלך" - }, - "SponsorTimeEditScrollNewFeature": { - "message": "השתמש בגלגלת בזמן שהעכבר מעל הזמן בשלב העריכה על מנת לשנות את הזמן יותר מהר. שילוב של הלחצן Ctrl/Shift יכולים לשנות את מהירות השינוי." - }, - "categoryPillNewFeature": { - "message": "חדש! ראה מתי וידאו בשלמותו הוא פרסומת או פרסום עצמי" - }, - "dayAbbreviation": { - "message": "ימים", - "description": "100d" - }, - "hourAbbreviation": { - "message": "שעות", - "description": "100h" - }, - "optionsTabBehavior": { - "message": "התנהגות", - "description": "Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabInterface": { - "message": "ממשק", - "description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabKeyBinds": { - "message": "קיצורי מקלדת", - "description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabBackup": { - "message": "גיבוי/שחזור", - "description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "notSet": { - "message": "לא הוגדר" - }, - "change": { - "message": "שנה" - }, - "youtubeKeybindWarning": { - "message": "זה הוא קיצור דרך מובנה ביוטיוב. האם אתה בטוח שאתה רוצה להשתמש בו?" - } -} diff --git a/public/_locales/hi/messages.json b/public/_locales/hi/messages.json deleted file mode 100644 index e20c3da1..00000000 --- a/public/_locales/hi/messages.json +++ /dev/null @@ -1,49 +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": "खंडों" - }, - "Dismiss": { - "message": "रद्द करें" - }, - "Loading": { - "message": "लोड कर रहा है..." - }, - "paused": { - "message": "रुका हुआ" - }, - "clearThis": { - "message": "क्या आप वाकई इसे साफ़ करना चाहते हैं?\n\n" - }, - "sponsorEnd": { - "message": "खंड अब समाप्त होता है" - }, - "success": { - "message": "सफल!" - }, - "Options": { - "message": "विकल्प" - } -} diff --git a/public/_locales/hr/messages.json b/public/_locales/hr/messages.json deleted file mode 100644 index 55a50345..00000000 --- a/public/_locales/hr/messages.json +++ /dev/null @@ -1,856 +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: " - }, - "clearTimes": { - "message": "Očisti isječke" - }, - "openPopup": { - "message": "Otvori okvir SponsorBlock" - }, - "closePopup": { - "message": "Zatvori izbornik" - }, - "SubmitTimes": { - "message": "Podnesi isječke" - }, - "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" - }, - "submitTimesButton": { - "message": "Unesi vremena" - }, - "publicStats": { - "message": "Ovo se koristi na stranici sa javnim statistikama da se pokaže koliko se pridonijeli. Pogledajte" - }, - "Username": { - "message": "Korisničko ime" - }, - "setUsername": { - "message": "Postavi korisničko ime" - }, - "copyPublicID": { - "message": "Kopiraj javni UserID" - }, - "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." - }, - "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" - }, - "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_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_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_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" - }, - "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" - }, - "Donate": { - "message": "Doniraj" - }, - "helpPageThanksForInstalling": { - "message": "Hvala na instaliranju SponsorBlocka." - }, - "helpPageFeatureDisclaimer": { - "message": "Mnoge funkcije su standardno deaktivirane. Ako želiš preskočiti uvode, završne dijelove, koristiti Invidious, itd., aktiviraj ih niže dolje. Također možeš sakriti/prikazati elemente korisničkog sučelja." - }, - "Submitting": { - "message": "Slanje" - }, - "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" - }, - "hideSegment": { - "message": "Sakri odsječak" - }, - "dayAbbreviation": { - "message": "d", - "description": "100d" - }, - "hourAbbreviation": { - "message": "h", - "description": "100h" - }, - "optionsTabBehavior": { - "message": "Ponašanje", - "description": "Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabInterface": { - "message": "Sučelje", - "description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabKeyBinds": { - "message": "Tipkovni prečaci", - "description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabBackup": { - "message": "Sigurnosna kopija/Obnova", - "description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabAdvanced": { - "message": "Razno", - "description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "noticeVisibilityLabel": { - "message": "Izgled napomene preskakanja", - "description": "Option label" - }, - "notSet": { - "message": "Nije postavljeno" - }, - "change": { - "message": "Promijeni" - }, - "youtubeKeybindWarning": { - "message": "Ovo je ugrađeni YouTube prečac. Stvarno ga želiš koristiti?" - }, - "betaServerWarning": { - "message": "BETA poslužitelj je aktiviran!" - }, - "openOptionsPage": { - "message": "Otvori stranicu opcija" - }, - "resetToDefault": { - "message": "Vrati standardne postavke" - }, - "confirmResetToDefault": { - "message": "Stvarno želiš vratiti sve postavke na standardne vrijednosti? To je nepovratna radnja." - }, - "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č" - } -} diff --git a/public/_locales/hu/messages.json b/public/_locales/hu/messages.json deleted file mode 100644 index b0500d2d..00000000 --- a/public/_locales/hu/messages.json +++ /dev/null @@ -1,1247 +0,0 @@ -{ - "fullName": { - "message": "SponsorBlock YouTube-ra - Szponzorok átugrására", - "description": "Name of the extension." - }, - "Description": { - "message": "Szponzorok, feliratkozás-kérelmek és több átugrása a YouTube videókon. Jelöljön meg szponzorokat videókon amiket néz, hogy mások idejét is megtakarítsa.", - "description": "Description of the extension." - }, - "400": { - "message": "Szerver: Ez a kérés érvénytelen" - }, - "429": { - "message": "Túl sok szponzoridőt jelöltél be ezen a videón. Biztosan van ennyi?" - }, - "409": { - "message": "Ez már korábban be lett küldve" - }, - "channelWhitelisted": { - "message": "A csatorna az engedélyezőlistára került!" - }, - "Segment": { - "message": "szegmens" - }, - "Segments": { - "message": "szegmens" - }, - "SegmentsCap": { - "message": "Szegmensek" - }, - "Chapters": { - "message": "Fejezetek" - }, - "renderAsChapters": { - "message": "Szegmensek megjelenítése fejezetekként", - "description": "Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system" - }, - "showSegmentNameInChapterBar": { - "message": "Aktuális szegmens megjelenítése a videó ideje mellett" - }, - "upvoteButtonInfo": { - "message": "Részlet felszavazása" - }, - "reportButtonTitle": { - "message": "Jelentés" - }, - "reportButtonInfo": { - "message": "Szegmens jelentése helytelenként." - }, - "Dismiss": { - "message": "Elvetés" - }, - "Loading": { - "message": "Betöltés..." - }, - "Hide": { - "message": "Ne mutassa többé" - }, - "hitGoBack": { - "message": "Kattints a visszaugrásra, hogy visszakerülj oda, ahonnan ugrottál." - }, - "unskip": { - "message": "Visszaugrás" - }, - "reskip": { - "message": "Újra-átugrás" - }, - "unmute": { - "message": "Némítás feloldása" - }, - "paused": { - "message": "Szüneteltetve" - }, - "manualPaused": { - "message": "Időzítő megállítva" - }, - "confirmMSG": { - "message": "Az egyes értékek szerkesztéséhez vagy törléséhez kattints az info gombra, vagy nyisd meg a bővítmény felugró ablakát a bővítmény ikonjával a jobb felső sarokban." - }, - "clearThis": { - "message": "Biztosan törölni szeretnéd?\n\n" - }, - "Unknown": { - "message": "Hiba történt a szponzoridők beküldésekor. Kérjük, próbáld újra később." - }, - "sponsorFound": { - "message": "Ennek a videónak már vannak szegmensei az adatbázisban!" - }, - "sponsor404": { - "message": "Nem találhatóak szegmensek" - }, - "sponsorStart": { - "message": "Szegmens eleje" - }, - "sponsorEnd": { - "message": "Szegmens vége" - }, - "sponsorCancel": { - "message": "Szegmens készítés visszavonása" - }, - "noVideoID": { - "message": "Nem találtunk YouTube videót.\nHa ez helytelen, frissítsd a lapot." - }, - "refreshSegments": { - "message": "Szegmensek frissítése" - }, - "success": { - "message": "Siker!" - }, - "voted": { - "message": "Szavaztál!" - }, - "serverDown": { - "message": "Úgy tűnik, a szerver nem működik. Kérjük, mihamarabb értesítsd a fejlesztőket!" - }, - "connectionError": { - "message": "Kapcsolódási probléma merült fel. Hibakód: " - }, - "clearTimes": { - "message": "Szegmensek törlése" - }, - "openPopup": { - "message": "SponsorBlock felugró ablak megnyitása" - }, - "closePopup": { - "message": "Felugró ablak bezárása" - }, - "closeIcon": { - "message": "Bezárás ikon" - }, - "SubmitTimes": { - "message": "Szegmensek beküldése" - }, - "sortSegments": { - "message": "Szegmensek rendezése" - }, - "submitCheck": { - "message": "Biztosan be akarod küldeni?" - }, - "whitelistChannel": { - "message": "Csatorna fehérlistára tétele" - }, - "removeFromWhitelist": { - "message": "Csatorna törlése fehérlistáról" - }, - "voteOnTime": { - "message": "Szavazzon a szegmensről" - }, - "Submissions": { - "message": "Beküldések" - }, - "savedPeopleFrom": { - "message": "Megspóroltál másoknak: " - }, - "viewLeaderboard": { - "message": "Ranglista" - }, - "recordTimesDescription": { - "message": "Beküldés" - }, - "submissionEditHint": { - "message": "A szegmens szerkesztés azután fog megjelenni, hogy a beküldésre kattintasz", - "description": "Appears in the popup to inform them that editing has been moved to the video player." - }, - "popupHint": { - "message": "Tipp: A beállításokban megadhatsz gyorsbillentyűket a beküldéshez" - }, - "clearTimesButton": { - "message": "Időpontok törlése" - }, - "submitTimesButton": { - "message": "Időpontok beküldése" - }, - "publicStats": { - "message": "Ez a nyilvános ranglistán használatos, ami mutatja, mennyit segítettél. Nézd meg" - }, - "Username": { - "message": "Felhasználónév" - }, - "setUsername": { - "message": "Felhasználónév megadása" - }, - "copyPublicID": { - "message": "Nyilvános UserID másolása" - }, - "copySegmentID": { - "message": "Szegmens ID másolása" - }, - "discordAdvert": { - "message": "Gyere, csatlakozz a hivatalos discord szerverhez, hogy javaslatokat és visszajelzést adhass!" - }, - "hideThis": { - "message": "Elrejtés" - }, - "Options": { - "message": "Beállítások" - }, - "showButtons": { - "message": "Gombok mutatása a YouTube lejátszón" - }, - "hideButtons": { - "message": "Gombok elrejtése a YouTube lejátszón" - }, - "hideButtonsDescription": { - "message": "Ez elrejti az átugrandó szegmensek megjelöléséhez használt gombokat a YouTube lejátszón." - }, - "showSkipButton": { - "message": "Kiemeléshez ugrás gomb maradjon a lejátszón" - }, - "showInfoButton": { - "message": "Info gomb mutatása a YouTube lejátszón" - }, - "hideInfoButton": { - "message": "Info gomb elrejtése a YouTube lejátszón" - }, - "autoHideInfoButton": { - "message": "Info gomb automatikus elrejtése" - }, - "hideDeleteButton": { - "message": "Törlés gomb elrejtése a YouTube lejátszón" - }, - "showDeleteButton": { - "message": "Törlés gomb mutatása a YouTube lejátszón" - }, - "enableViewTracking": { - "message": "Átugrás-számláló követés bekapcsolása" - }, - "whatViewTracking": { - "message": "Ez a funkció követi, mely szegmenseket ugrottad át, hogy a felhasználók megtudhassák mennyit segítettek a bejelentéseik, és a szavazatokkal együtt egy mértékegységként van használva, hogy ne kerülhessen szemét az adatbázisba. A bővítmény küld egy üzenetet a szervernek, minden alkalommal, mikor átugrasz egy szegmenst. Remélhetőleg nem sokan állítják át ezt a beállítást, hogy a számok pontosak maradhassanak. :)" - }, - "enableViewTrackingInPrivate": { - "message": "Átugrások számlálásának engedélyezése privát/inkognitó füleken" - }, - "enableTrackDownvotes": { - "message": "Leszavazások tárolása" - }, - "whatTrackDownvotes": { - "message": "Minden szegmens amit leszavazol rejtve marad újratöltés után is" - }, - "trackDownvotesWarning": { - "message": "Figyelem: A beállítás kikapcsolása letöröl minden korábban eltárolt szavazatot" - }, - "enableQueryByHashPrefix": { - "message": "Lekérdezés Hash előtaggal" - }, - "whatQueryByHashPrefix": { - "message": "A szerverről videoID helyett, a videoID hash első négy karaktere lesz elküldve szegmenslekéréskor. A szerver visszaküldi az összes hasonló hashel rendelkező videó adatait." - }, - "enableRefetchWhenNotFound": { - "message": "Szegmensek újrakeresése új videókon" - }, - "whatRefetchWhenNotFound": { - "message": "Ha a videó új, és még nem találhatóak szegmensek, a bővítmény pár percenkét újra keresi őket, miközben nézed." - }, - "enableShowCategoryWithoutPermission": { - "message": "Kategóriák megjelenítése a beküldési menüben beküldési engedély nélkül is" - }, - "whatShowCategoryWithoutPermission": { - "message": "Néhány kategóriánál a beküldés engedélyhez kötött, ami egy minimum hírnév-szinttől függ" - }, - "showNotice": { - "message": "Értesítés megjelenítése ismét" - }, - "showSkipNotice": { - "message": "Jelezzen, ha egy szegmens át lett ugorva" - }, - "showCategoryGuidelines": { - "message": "Kategória útmutató megjelenítése" - }, - "noticeVisibilityMode0": { - "message": "Teljes méretű átugrási értesítők" - }, - "noticeVisibilityMode1": { - "message": "Kis méretű átugrási értesítők Auto átugrás esetén" - }, - "noticeVisibilityMode2": { - "message": "Csak kis méretű átugrási értesítők" - }, - "noticeVisibilityMode3": { - "message": "Halvány átugrási értesítők Auto átugrás esetén" - }, - "noticeVisibilityMode4": { - "message": "Csak halvány átugrási értesítők" - }, - "longDescription": { - "message": "A SponsorBlockkal átugorhatja a szponzorokat, introkat, outrokat, feliratkozás emlékeztetőket és a YouTube videók többi idegesítő részeit. A SponsorBlock egy közösség által vezérelt böngészőbővítmény, ami lehetővé teszi bárkinek, hogy megjelölhesse egy szponzor vagy más szegmens kezdő és végpontjait. Amint valaki megosztja ezt az információt, mindenki más ennek a bővítménynek a birtokában egyenesen átugorja majd ezt a szponzorszegmenst. Emellett például a videóklipek nem-zene részei is átugorhatóak.", - "description": "Full description of the extension on the store pages." - }, - "website": { - "message": "Weboldal", - "description": "Used on Firefox Store Page" - }, - "sourceCode": { - "message": "Forráskód", - "description": "Used on Firefox Store Page" - }, - "noticeUpdate": { - "message": "Az értesítést frissítettük!", - "description": "The first line of the message displayed after the notice was upgraded." - }, - "noticeUpdate2": { - "message": "Ha még mindig nem tetszik, kattints a ne mutassa többé gombra.", - "description": "The second line of the message displayed after the notice was upgraded." - }, - "setSkipShortcut": { - "message": "Szegmens átugrása", - "description": "Keybind label" - }, - "setStartSponsorShortcut": { - "message": "Szegmens kezdése/befejezése", - "description": "Keybind label" - }, - "setSubmitKeybind": { - "message": "Szegmensek beküldése", - "description": "Keybind label" - }, - "nextChapterKeybind": { - "message": "Következő fejezet", - "description": "Keybind label" - }, - "previousChapterKeybind": { - "message": "Előző fejezet", - "description": "Keybind label" - }, - "keybindDescription": { - "message": "Válassz egy billentyűt azzal, hogy lenyomod és válaszd ki a módosító billentyű(ke)t, amiket használni szeretnél." - }, - "0": { - "message": "Kapcsolati időtúllépés. Ellenőrizd az internetkapcsolatodat! Ha az internet működik, a kiszolgáló valószínűleg túlterhelt vagy leállt." - }, - "disableSkipping": { - "message": "Átugrás bekapcsolva" - }, - "enableSkipping": { - "message": "Átugrás kikapcsolva" - }, - "yourWork": { - "message": "Te munkád", - "description": "Used to describe the section that will show you the statistics from your submissions." - }, - "502": { - "message": "Úgy tűnik, hogy a szerver túlterhelt. Próbálkozz újra néhány másodperc múlva." - }, - "errorCode": { - "message": "Hibakód: " - }, - "skip": { - "message": "Átugrás" - }, - "mute": { - "message": "Némítás" - }, - "full": { - "message": "Teljes videó", - "description": "Used for the name of the option to label an entire video as sponsor or self promotion." - }, - "skip_category": { - "message": "Átugorja ezt: {0}?" - }, - "mute_category": { - "message": "{0} némítása?" - }, - "skip_to_category": { - "message": "Ugrás ide: {0}?", - "description": "Used for skipping to things (Skip to Highlight)" - }, - "skipped": { - "message": "{0} átugorva", - "description": "Example: Sponsor Skipped" - }, - "muted": { - "message": "{0} némítva", - "description": "Example: Sponsor Muted" - }, - "skipped_to_category": { - "message": "Ide ugorva: {0}", - "description": "Used for skipping to things (Skipped to Highlight)" - }, - "disableAutoSkip": { - "message": "Auto átugrás kikapcsolása" - }, - "enableAutoSkip": { - "message": "Auto átugrás bekapcsolása" - }, - "audioNotification": { - "message": "Hangjelzés átugráskor" - }, - "audioNotificationDescription": { - "message": "A hangjelzés átugráskor lejátszik egy hangot minden alkalommal, amikor egy szegmens átugrásra kerül. Ha kikapcsolod (vagy az auto átugrás ki van kapcsolva), nem lesz hangjelzés lejátszva." - }, - "showTimeWithSkips": { - "message": "Idő megtekintése az átugrandók nélkül" - }, - "showTimeWithSkipsDescription": { - "message": "Ez az idő zárójelben jelenik meg az aktuális idő mellett a keresősáv alatt. Megmutatja a videó teljes időtartamát, levonva a szegmenseket. Beletartoznak a csak \"Megjelenítés a keresősávban\" jelöléssel ellátott szegmensek is." - }, - "youHaveSkipped": { - "message": "Átugrottál: " - }, - "minLower": { - "message": "perc" - }, - "minsLower": { - "message": "perc" - }, - "hourLower": { - "message": "óra" - }, - "hoursLower": { - "message": "óra" - }, - "youHaveSavedTime": { - "message": "Megspóroltál másoknak", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "youHaveSavedTimeEnd": { - "message": " az életükből", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "statusReminder": { - "message": "A szerver állapotához tekintsd meg a status.sponsor.ajay.app oldalt." - }, - "changeUserID": { - "message": "Titkos UserID importálása / exportálása" - }, - "whatChangeUserID": { - "message": "Ez privát információnak minősül. Ez olyan, mint egy jelszó, így nem ajánlott megosztani senkivel. Ha valakinek birtokában van, megszemélyesíthet téged. Ha a nyilvános userID-dat keresed, kattints a vágólap ikonra a felugró ablakban." - }, - "setUserID": { - "message": "Titkos UserID beállítása" - }, - "userIDChangeWarning": { - "message": "Figyelem: A Titkos UserID megváltoztatása végleges. Biztosan szeretnéd megtenni? Minden esetben készíts biztonsági másolatot a régiről!" - }, - "createdBy": { - "message": "Készítette" - }, - "supportOtherSites": { - "message": "Harmadik fél Youtube oldalainak támogatása" - }, - "supportOtherSitesDescription": { - "message": "Harmadik fél YouTube oldalainak támogatása. A támogatás bekapcsolásához el kell fogadnod az extra engedélyeket. NEM működik inkognitó módban Chrome-ban és egyéb Chromium változatokban.", - "description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube" - }, - "supportedSites": { - "message": "Támogatott oldalak: " - }, - "optionsInfo": { - "message": "Invidious támogatás engedélyezése, autoátugrás kikapcsolása, gombok eltűntetése és több." - }, - "addInvidiousInstance": { - "message": "Harmadik fél kliens példányának hozzáadása" - }, - "addInvidiousInstanceDescription": { - "message": "Egyedi példány hozzáadása. Formátuma CSAK a domain legyen. Például: invidious.ajay.app" - }, - "add": { - "message": "Hozzáadás" - }, - "addInvidiousInstanceError": { - "message": "Érvénytelen domain. CSAK a domain részt tartalmazhatja. Például: invidious.ajay.app" - }, - "resetInvidiousInstance": { - "message": "Invidious példányok listájának visszaállítása" - }, - "resetInvidiousInstanceAlert": { - "message": "Az Invidious példányok listájának visszaállítására készülsz" - }, - "currentInstances": { - "message": "Jelenlegi példányok:" - }, - "minDuration": { - "message": "Minimális időtartam (másodpercekben):" - }, - "minDurationDescription": { - "message": "A beállított értéknél rövidebb szegmenseket nem ugorja át és nem jeleníti meg a lejátszó." - }, - "enableManualSkipOnFullVideo": { - "message": "Manuális átugrás használata, ha van teljes videó címke" - }, - "whatManualSkipOnFullVideo": { - "message": "Azoknak, akik megszakítás nélkül szeretnék végignézni a videót, ha az teljes egészében szponzorált, vagy önpromóció." - }, - "skipNoticeDuration": { - "message": "Átugrási értesítés hossza (másodpercekben):" - }, - "skipNoticeDurationDescription": { - "message": "Az átugrási értesítés ennyi ideig marad a képernyőn. Manuális átugrásnál tovább is látható maradhat." - }, - "shortCheck": { - "message": "A következő szegmens rövidebb, mint az általad beállított minimális időtartam. Ez azt jelentheti, hogy már beküldhették, csak emiatt az opció miatt nálad nem jelenik meg. Biztosan beküldöd?" - }, - "liveOrPremiere": { - "message": "Aktív élő közvetítés vagy premier közben nem lehet szegmenseket beküldeni. Kérjük várd meg a végét, majd frissítsd az oldalt és ellenőrizd, hogy a szegmensek nem csúsztak-e el." - }, - "showUploadButton": { - "message": "Feltöltés gomb megjelenítése" - }, - "customServerAddress": { - "message": "SponsorBlock szerver címe" - }, - "customServerAddressDescription": { - "message": "A SponsorBlock által használt cím a szerverre történő hívások kezdeményezésére szolgál.\nHacsak nincs saját szerverpéldányod, ezt nem szabad megváltoztatni." - }, - "save": { - "message": "Mentés" - }, - "reset": { - "message": "Visszaállítás" - }, - "customAddressError": { - "message": "A cím helytelenül van formázva. Győződj meg róla, hogy http:// vagy https:// van az elején, és nincsenek perjelek a végén." - }, - "areYouSureReset": { - "message": "Biztosan vissza szeretnéd állítani?" - }, - "mobileUpdateInfo": { - "message": "az m.youtube.com már támogatott" - }, - "exportOptions": { - "message": "Összes beállítás importálása / exportálása" - }, - "exportOptionsCopy": { - "message": "Szerkesztés/másolás" - }, - "exportOptionsDownload": { - "message": "Mentés fájlba" - }, - "exportOptionsUpload": { - "message": "Betöltés fájlból" - }, - "whatExportOptions": { - "message": "Ez az összes beállításod JSON formátumban. Ebbe bele tartozik a Titkos UserID-d is, úgyhogy csak elővigyázatosan oszd meg." - }, - "setOptions": { - "message": "Beállítások módosítása" - }, - "exportOptionsWarning": { - "message": "Figyelem: A beállítások megváltoztatása végleges, és tönkreteheti a bővítményed. Biztosan meg szeretnéd tenni? Készíts egy biztonsági mentést a régi beállításaidról, biztos, ami biztos." - }, - "incorrectlyFormattedOptions": { - "message": "Ez a JSON helytelenül van formázva. A beállításaid nem lettek megváltoztatva." - }, - "confirmNoticeTitle": { - "message": "Szegmens beküldése" - }, - "submit": { - "message": "Beküld" - }, - "cancel": { - "message": "Mégse" - }, - "delete": { - "message": "Törlés" - }, - "preview": { - "message": "Előnézet" - }, - "unsubmitted": { - "message": "Nincs beküldve" - }, - "inspect": { - "message": "Megvizsgál" - }, - "edit": { - "message": "Szerkesztés" - }, - "copyDebugInformation": { - "message": "Hibakeresési információ másolása a vágólapra" - }, - "copyDebugInformationFailed": { - "message": "Hiba a vágólapra másoláskor" - }, - "copyDebugInformationOptions": { - "message": "Információt másol a vágólapra, amit megadhatsz egy fejlesztőnek, ha bejelentesz egy hibát, vagy egy fejlesztő kéri tőled. Az érzékeny információkat, például a userID-t, az engedélyezőlistán szereplő csatornákat és az egyéni szerver címét eltávolítottuk. Azonban tartalmaz olyan információkat, mint a böngésző, az operációs rendszer és a bővítmény verziószáma. " - }, - "copyDebugInformationComplete": { - "message": "A hibakeresési információ másolva lett a vágólapjára. Nyugodtan távolíts el belőle olyan információkat, amiket nem szívesen osztanál meg. Mentsd el szöveges fájlként, vagy másold a hibajelentésbe." - }, - "keyAlreadyUsed": { - "message": "Ez a billentyűparancs egy másik művelethez tartozik. Kérjük, válassz egy újat." - }, - "to": { - "message": "–", - "description": "Used between segments. Example: 1:20 to 1:30" - }, - "CopiedExclamation": { - "message": "Másolva!", - "description": "Used after something has been copied to the clipboard. Example: 'Copied!'" - }, - "generic_guideline1": { - "message": "Tartalmazza a felkonferálást/átvezetőket is" - }, - "generic_guideline2": { - "message": "Olyan a lejátszás, mintha semmi sem lett volna átugorva" - }, - "category_sponsor": { - "message": "Szponzor" - }, - "category_sponsor_description": { - "message": "Fizetett promóció, vagy közvetlen reklám. Nem önpromóció, vagy ingyenes említése ügyeknek/tartalomkészítőknek/weboldalaknak/termékeknek amik tetszenek nekik." - }, - "category_sponsor_guideline1": { - "message": "Fizetett promóciók" - }, - "category_sponsor_guideline2": { - "message": "Nem adományok vagy saját termékek" - }, - "category_selfpromo": { - "message": "Nem fizetett/önpromóció" - }, - "category_selfpromo_description": { - "message": "Hasonló a szponzorhoz, de nem fizetett, vagy önpromóció. Beletartozik a saját ruhaáru, adományok, vagy infó arról, hogy kivel működtek együtt." - }, - "category_selfpromo_guideline1": { - "message": "Adományok, tagságok és saját termékek" - }, - "category_selfpromo_guideline2": { - "message": "Ingyenes köszönetnyilvánítások/említések, amik nem adnak hozzá a videóhoz" - }, - "category_selfpromo_guideline3": { - "message": "Nem cégek által tervezett termékekhez" - }, - "category_exclusive_access": { - "message": "Exkluzív hozzáférés" - }, - "category_exclusive_access_description": { - "message": "Csak teljes videók megjelölésére. Akkor használt, amikor egy videó egy olyan terméket, szolgáltatást vagy helyszínt mutat be, amihez ingyenes vagy kedvezményes hozzáférést kaptak." - }, - "category_exclusive_access_pill": { - "message": "Ez a videó olyan terméket, szolgáltatást vagy helyszínt mutat be, amihez ingyenes vagy kedvezményes hozzáférést kaptak", - "description": "Short description for this category" - }, - "category_exclusive_access_guideline1": { - "message": "A teljes videó olyan dolgot mutat be, amihez ingyenes vagy kedvezményes hozzáférést kaptak" - }, - "category_interaction": { - "message": "Emlékeztető (Feliratkozás)" - }, - "category_interaction_description": { - "message": "Egy rövid emlékeztető arról, hogy likeoljunk, iratkozzunk fel, vagy kövessük a tartalom közben. Ha hosszabb szakasz, vagy egy adott témáról van, inkább az önpromóció alá tartozik." - }, - "category_interaction_guideline1": { - "message": "Rövid emlékeztető lájkolásra, feliratkozásra, vagy követésre" - }, - "category_interaction_guideline2": { - "message": "Beletartoznak a közvetett emlékeztetők kommentelésre" - }, - "category_interaction_guideline3": { - "message": "Nem általános promóciók, csak felhívások cselekvésre" - }, - "category_interaction_short": { - "message": "Emlékeztető" - }, - "category_intro": { - "message": "Megszakítás/Intro animáció" - }, - "category_intro_description": { - "message": "Egy részlet tartalom nélkül. Lehet szünet, álló képkocka, vagy ismétlődő animáció. Nem használandó információt tartalmazó átmeneteknél." - }, - "category_intro_short": { - "message": "Megszakítás" - }, - "category_intro_guideline1": { - "message": "Tényleges tartalom nélküli szakasz" - }, - "category_intro_guideline2": { - "message": "Nem információt is tartalmazó átmenetekhez" - }, - "category_outro": { - "message": "Záróképernyő/ Stáblista" - }, - "category_outro_description": { - "message": "Stáblista, vagy amikor megjelennek a YouTube zárókártyák. Nem használandó információt tartalmazó következtetésekkor." - }, - "category_outro_guideline1": { - "message": "Ne legyen benne tartalom, akkor sem, ha a zárókártyák már a képernyőn vannak" - }, - "category_preview": { - "message": "Előzetes/Ismétlés" - }, - "category_preview_description": { - "message": "Olyan klipek gyűjteménye, amik azt mutatják, hogy mi következik majd ebben, vagy a sorozat más videóiban és minden információ megismétlődik később a videóban." - }, - "category_preview_guideline1": { - "message": "Klipek amik megjelennek később, vagy egy jövőbeli videóban" - }, - "category_preview_guideline2": { - "message": "Korábbi videó összefoglalója" - }, - "category_preview_guideline3": { - "message": "Nem olyan részekhez, amik új tartalmat adnak a videóhoz" - }, - "category_filler": { - "message": "Témától eltérő töltelék/viccek" - }, - "category_filler_description": { - "message": "Csak töltelékként, vagy humornak hozzáadott részek, amik nem szükségesek a videó fő tartalmának megértéséhez. Ne tartalmazzon olyan szegmenseket, amik kontextust, vagy alapvető információkat szolgáltatnak\". Ez egy nagyon agresszív kategória arra, amikor nincs kedved a \"szórakozáshoz\"." - }, - "category_filler_short": { - "message": "Töltelék" - }, - "category_filler_guideline1": { - "message": "Témától eltérő jelenetek tölteléknek, vagy humornak" - }, - "category_filler_guideline2": { - "message": "Figyelemelterelődés, bakik, újrajátszások" - }, - "category_filler_guideline3": { - "message": "Nem olyan jelenetek, amik a téma megértéséhez szükségesek" - }, - "category_music_offtopic": { - "message": "Zene: nem-zene szegmens" - }, - "category_music_offtopic_description": { - "message": "Csak videóklipekhez. Ezt csak videóklipek olyan részeihez szabad használni, amiket nem fed le a többi kategória." - }, - "category_music_offtopic_short": { - "message": "Nem-Zene" - }, - "category_music_offtopic_guideline1": { - "message": "Olyan részek, amik nincsenek a hivatalos kiadásokban" - }, - "category_music_offtopic_guideline2": { - "message": "Nem zene egy élő előadásban" - }, - "category_poi_highlight": { - "message": "Kiemelés" - }, - "category_poi_highlight_description": { - "message": "A videónak az a része, amelyiket a legtöbb ember látni szeretne. Hasonlít az \"A videó x percnél kezdődik\" jellegű hozzászólásokhoz." - }, - "category_poi_highlight_guideline1": { - "message": "A rész, amit a legtöbb ember keres" - }, - "category_poi_highlight_guideline2": { - "message": "Segíthet a kontextus átugrásában" - }, - "category_poi_highlight_guideline3": { - "message": "A címhez, vagy indexképhez ugorhat" - }, - "category_chapter": { - "message": "Fejezet" - }, - "category_chapter_description": { - "message": "Egyedileg elnevezett fejezetek a videó nagyobb részeinek leírására." - }, - "category_chapter_guideline1": { - "message": "Ne említs szponzor márkaneveket" - }, - "category_chapter_guideline2": { - "message": "Használj hosszabb fejezeteket általános részekhez" - }, - "category_chapter_guideline3": { - "message": "Nagyobb fejezeteken belül lehetnek kisebb fejezetek" - }, - "category_livestream_messages": { - "message": "Élő adás: Adomány / üzenet olvasások" - }, - "category_livestream_messages_short": { - "message": "Üzenet beolvasása" - }, - "autoSkip": { - "message": "Auto átugrás" - }, - "manualSkip": { - "message": "Átugrás manuálisan" - }, - "showOverlay": { - "message": "Megjelenítés a keresősávban" - }, - "disable": { - "message": "Kikapcsol" - }, - "autoSkip_POI": { - "message": "Auto ugrás a kezdetéhez" - }, - "manualSkip_POI": { - "message": "Kérdezzen rá a videó betöltésekor" - }, - "showOverlay_POI": { - "message": "Megjelenítés a keresősávban" - }, - "showOverlay_full": { - "message": "Címke megjelenítése" - }, - "showOverlay_chapter": { - "message": "Fejezetek megtekintése" - }, - "autoSkipOnMusicVideos": { - "message": "Minden szegmens automatikus átugrása, ha van nem-zene szegmens" - }, - "muteSegments": { - "message": "Szegmensek engedélyezése, amelyek lenémítják a hangot az átugrás helyett" - }, - "fullVideoSegments": { - "message": "Mutasson egy ikont, amikor egy videó egésze reklám", - "description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo" - }, - "previewColor": { - "message": "Beküldetlen színe", - "description": "Referring to submissions that have not been sent to the server yet." - }, - "seekBarColor": { - "message": "Keresősáv színe" - }, - "category": { - "message": "Kategória" - }, - "skipOption": { - "message": "Átugrás beállítása", - "description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)" - }, - "enableTestingServer": { - "message": "Bétateszt szerver bekapcsolása" - }, - "whatEnableTestingServer": { - "message": "A beküldéseid és szavazataid NEM FOGNAK SZÁMÍTANI a fő szerveren. Csak tesztelésre használd." - }, - "testingServerWarning": { - "message": "Egyik beküldésed vagy szavazatod SEM FOG SZÁMÍTANI a fő szerverhez, amíg a tesztszerverhez kapcsolódsz. Győződj meg róla, hogy ki van kapcsolva, ha valódi beküldéseket akarsz végezni." - }, - "bracketNow": { - "message": "(Most)" - }, - "moreCategories": { - "message": "További kategóriák" - }, - "chooseACategory": { - "message": "Válassz egy kategóriát" - }, - "enableThisCategoryFirst": { - "message": "Hogy \"{0}\" kategóriájú szegmenst küldhess be, először engedélyezned kell a beállításokban. Most átirányításra kerülsz a beállításokhoz.", - "description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options." - }, - "poiOnlyOneSegment": { - "message": "Figyelem: Az ilyen típusú szegmensekből egyszerre csak egy lehet aktív. Több beküldése esetén véletlenszerűen az egyik fog megjelenni." - }, - "youMustSelectACategory": { - "message": "Minden szegmenshez kategóriát kell választani beküldés előtt!" - }, - "bracketEnd": { - "message": "(Vége)" - }, - "End": { - "message": "Vége", - "description": "Button that skips to the end of a segment" - }, - "hiddenDueToDownvote": { - "message": "elrejtve: leszavazva" - }, - "hiddenDueToDuration": { - "message": "elrejtve: túl rövid" - }, - "manuallyHidden": { - "message": "kézzel elrejtve" - }, - "channelDataNotFound": { - "description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.", - "message": "A csatorna ID még nem került betöltésre. Ha beágyazott videót használsz, próbáld meg inkább a YouTube oldalon keresztül. Ezt okozhatja még a YouTube elrendezésének változása is. Ha így gondolod, hagyj egy kommentet itt:" - }, - "invidiousPermissionRefresh": { - "message": "A böngésző visszavonta az engedélyt, ami az Invidious és egyéb oldalakon való működéshez szükséges. Kérjük, kattints a lenti gombra az engedély újbóli megadásához!" - }, - "acceptPermission": { - "message": "Engedély jóváhagyása" - }, - "permissionRequestSuccess": { - "message": "Engedélykérés sikeres!" - }, - "permissionRequestFailed": { - "message": "Engedélykérés sikertelen. Nem nyomtál az elutasításra?" - }, - "adblockerIssueWhitelist": { - "message": "Ha nem sikerül megoldani a problémát, kapcsold ki a \"Csatorna ellenőrzése átugrás előtt\" opciót, mert a SponsorBlock nem tudja megszerezni a csatorna-információkat ehhez a videóhoz" - }, - "forceChannelCheck": { - "message": "Csatorna ellenőrzése átugrás előtt" - }, - "whatForceChannelCheck": { - "message": "Alapértelmezett állapotban a bővítmény átugorhat szegmenseket, mielőtt tudná melyik csatornán van. Alapból ezért néhány videó eleji szegmens engedélyezett csatornákon is átugródhat. Ennek a bekapcsolásával ez elkerülhető, de minden átugrás előtt lesz egy kis késleltetés, hiszen a channelID megszerzéséhez kell egy kis idő. Ez a késleltetés akár észrevehetetlen is lehet, ha elég gyors a kapcsolatod." - }, - "forceChannelCheckPopup": { - "message": "Fontold meg a \"Csatorna ellenőrzése átugrás előtt\" bekapcsolását" - }, - "downvoteDescription": { - "message": "Helytelen/rossz időzítés" - }, - "incorrectVote": { - "message": "Helytelen" - }, - "harmfulVote": { - "message": "Káros", - "description": "Used for chapter segments when the text is harmful/offensive to remove it faster" - }, - "incorrectCategory": { - "message": "Kategória módosítása" - }, - "nonMusicCategoryOnMusic": { - "message": "Ez a videó zeneként van kategorizálva. Biztos vagy benne, hogy ennek van szponzora? Ha ez valójában egy \"nem-zene szegmens\", nyisd meg a bővítmény beállításait és kapcsold be ezt a kategóriát. Ezt követően beküldheted a szegmenst \"nem-zene\"-ként szponzor helyett. Ha nem érthető, kérjük olvasd el az irányelveket." - }, - "multipleSegments": { - "message": "Több szegmens" - }, - "guidelines": { - "message": "Irányelvek" - }, - "readTheGuidelines": { - "message": "Olvasd el az irányelveket!!", - "description": "Show the first time they submit or if they are \"high risk\"" - }, - "categoryUpdate1": { - "message": "Itt vannak a kategóriák!" - }, - "categoryUpdate2": { - "message": "Nyisd meg a beállításokat, hogy átugorhass introkat, outrokat stb." - }, - "help": { - "message": "Segítség" - }, - "GotIt": { - "message": "Értettem", - "description": "Used as the button to dismiss a tooltip" - }, - "fullVideoTooltipWarning": { - "message": "Ez a szegmens nagy. Ha az egész videó egy témáról szól, akkor válts \"Átugrás\"-ról \"Teljes videó\"-ra. További információkért lásd az irányelveket." - }, - "categoryPillTitleText": { - "message": "Az egész videó ezzel a kategóriával van megjelölve és túl szorosan kapcsolódik hozzá, hogy le lehessen választani" - }, - "chapterNameTooltipWarning": { - "message": "Az egyik fejezeted neve hasonlít egy kategóriára. Amikor lehetséges, mindig használj kategóriákat." - }, - "experiementOptOut": { - "message": "Minden további kísérlet elutasítása", - "description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private." - }, - "hideForever": { - "message": "Eltüntetés örökre" - }, - "warningChatInfo": { - "message": "Észrevettük, hogy néhány nem rossz szándékú, gyakran előforduló hibát ejtettél" - }, - "warningTitle": { - "message": "Figyelmeztetést kaptál" - }, - "questionButton": { - "message": "Kérdésem van" - }, - "warningConfirmButton": { - "message": "Megértettem az okot" - }, - "warningError": { - "message": "Hiba a figyelmeztetés nyugtázása közben:" - }, - "Donate": { - "message": "Támogatás" - }, - "considerDonating": { - "message": "Segíts a fejlesztés támogatásában" - }, - "hideDonationLink": { - "message": "Támogatás link elrejtése" - }, - "darkModeOptionsPage": { - "message": "Sötét téma a Beállításokban" - }, - "helpPageThanksForInstalling": { - "message": "Köszönjük, hogy telepítetted a SponsorBlockot." - }, - "helpPageReviewOptions": { - "message": "Kérjük, nézd át az alábbi beállításokat" - }, - "helpPageFeatureDisclaimer": { - "message": "Sok funkció le van tiltva alapból. Ha át akarsz ugrani bevezetőket, záróképernyőket, Invidioust használnál, stb., engedélyezd őket alább. Lehetőség van a felület különböző elemeinek elrejtésére/megjelenítésére is." - }, - "helpPageHowSkippingWorks": { - "message": "Az átugrás működése" - }, - "helpPageHowSkippingWorks1": { - "message": "A videók szegmensei automatikusan átugrásra kerülnek, ha szerepelnek az adatbázisban. Megnyithatod a felugró ablakot a bővítmény ikonjára kattintva, hogy megtekinthesd őket." - }, - "helpPageHowSkippingWorks2": { - "message": "Ahányszor átugrasz egy szegmenst, kapni fogsz egy értesítést. Ha rossznak tűnik az időzítés, szavazd le a leszavazás gombra kattintva! A felugró ablakban is szavazhatsz." - }, - "Submitting": { - "message": "Beküldés" - }, - "helpPageSubmitting1": { - "message": "Beküldeni lehet a felugró ablakban a \"Szegmens eleje\" gombra kattintva, vagy a videó lejátszón lévő gombokkal." - }, - "helpPageSubmitting2": { - "message": "A lejátszás gomb megnyomása jelezte a szegmens kezdetét és a stop gomb megnyomása jelzi a végét. Több szponzort is előkészíthetsz, mielőtt a beküldésre nyomnál. A feltöltés gombra kattintva beküldésre kerülnek a szegmensek. A szemetesre kattintva kitörlődnek." - }, - "Editing": { - "message": "Szerkesztés" - }, - "helpPageEditing1": { - "message": "Ha hibáztál, szerkesztheted vagy törölheted a szegmenseid, a felfele nyílra kattintást követően." - }, - "helpPageTooSlow": { - "message": "Ez túl lassú" - }, - "helpPageTooSlow1": { - "message": "Vannak gyorsbillentyűk is, ha használni szeretnéd őket. Nyomd meg a pontosvessző billentyűt egy szponzor szegmens elejének/végének jelzéséhez és nyomd meg a vesszőt a beküldéshez. Ezek módosíthatók a beállításokban. Ha nem QWERTY-t használsz, valószínűleg szükséges lesz megváltoztatni a billentyűket." - }, - "helpPageCopyOfDatabase": { - "message": "Szerezhetek egy másolatot az adatbázisról? Mi történik, ha eltűnik a fejlesztő?" - }, - "helpPageCopyOfDatabase1": { - "message": "Az adatbázis nyilvános, és elérhető itt:" - }, - "helpPageCopyOfDatabase2": { - "message": "A forráskód szabadon elérhető. Tehát még ha valami történne is velem, a beküldések nem vesznek el." - }, - "helpPageNews": { - "message": "Hírek és hogyan készül" - }, - "helpPageSourceCode": { - "message": "Hol szerezhetem meg a forráskódot?" - }, - "Credits": { - "message": "Készítők" - }, - "LearnMore": { - "message": "Tudj meg többet" - }, - "FullDetails": { - "message": "Teljes részletek" - }, - "CopyDownvoteButtonInfo": { - "message": "Leszavazza és készít egy helyi másolatot, amit beküldhetsz" - }, - "OpenCategoryWikiPage": { - "message": "A kategória wiki lapjának megnyitása." - }, - "CopyAndDownvote": { - "message": "Másol és leszavaz" - }, - "ContinueVoting": { - "message": "Szavazás folytatása" - }, - "ChangeCategoryTooltip": { - "message": "Ez azonnal érvényes lesz a szegmenseidre" - }, - "downvote": { - "message": "Leszavazás" - }, - "upvote": { - "message": "Felszavazás" - }, - "hideSegment": { - "message": "Szegmens elrejtése" - }, - "skipSegment": { - "message": "Szegmens átugrása" - }, - "playChapter": { - "message": "Fejezet lejátszása" - }, - "SponsorTimeEditScrollNewFeature": { - "message": "Használd egérgörgődet a szerkesztő mező fölött, hogy gyorsan módosíthasd az időt. A ctrl vagy shift billentyűk kombinációjával finomhangolhatod a változás mértékét." - }, - "categoryPillNewFeature": { - "message": "Új! Láthatod, ha egy videó teljes egészében szponzorált, vagy önpromóció" - }, - "dayAbbreviation": { - "message": "n", - "description": "100d" - }, - "hourAbbreviation": { - "message": "ó", - "description": "100h" - }, - "optionsTabBehavior": { - "message": "Működés", - "description": "Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabInterface": { - "message": "Felület", - "description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabKeyBinds": { - "message": "Gyorsbillentyűk", - "description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabBackup": { - "message": "Biztonsági mentés", - "description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabAdvanced": { - "message": "Egyéb", - "description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "noticeVisibilityLabel": { - "message": "Átugrási értesítés kinézete", - "description": "Option label" - }, - "unbind": { - "message": "Megszüntetés", - "description": "Unbind keyboard shortcut" - }, - "notSet": { - "message": "Nincs beállítva" - }, - "change": { - "message": "Megváltoztat" - }, - "youtubeKeybindWarning": { - "message": "Ez egy beépített YouTube gyorsbillentyű. Biztosan ezt szeretnéd használni?" - }, - "betaServerWarning": { - "message": "BÉTA szerver engedélyezve van!" - }, - "openOptionsPage": { - "message": "Beállítások megnyitása" - }, - "resetToDefault": { - "message": "Beállítások visszaállítása alapértelmezettre" - }, - "confirmResetToDefault": { - "message": "Biztosan vissza szeretnéd állítani az összes beállítást az alapértelmezett értékekre? A műveletet nem lehet visszavonni." - }, - "exportSegments": { - "message": "Szegmensek exportálása" - }, - "importSegments": { - "message": "Szegmensek importálása" - }, - "Import": { - "message": "Importálás", - "description": "Button to initiate importing segments. Appears under the textbox where they paste in the data" - }, - "redeemSuccess": { - "message": "Beváltás sikeres!" - }, - "redeemFailed": { - "message": "A licenc kulcs érvénytelen" - }, - "hideUpsells": { - "message": "Fizetős opciók elrejtése" - }, - "chooseACountry": { - "message": "Válassz országot" - }, - "noDiscount": { - "message": "Nem vagy jogosult kedvezményre" - }, - "discountLink": { - "message": "Kedvezményes link (A rózsaszín árat figyeld)" - }, - "selectYourCountry": { - "message": "Válaszd ki az országodat" - }, - "alreadyDonated": { - "message": "Ha korábban már támogattad a bővítményt, kérhetsz ingyenes hozzáférést emailben:", - "description": "After the colon is an email address" - }, - "cantAfford": { - "message": "Ha nem engedheted meg magadnak a licenc megvásárlását, kattints {ide}, hogy megtudd, jogosult vagy-e kedvezményre", - "description": "Keep the curly braces. The word 'here' should be translated as well." - }, - "patreonSignIn": { - "message": "Bejelentkezés Patreonnal" - }, - "redeem": { - "message": "Beváltás" - }, - "joinOnPatreon": { - "message": "Feliratkozás Patreonon" - }, - "oneTimePurchase": { - "message": "Egyszeri vásárlás" - }, - "enterLicenseKey": { - "message": "Add meg a licenc kulcsot" - }, - "chaptersPage1": { - "message": "A SponsorBlock közösség által karbantartott fejezetek funkció csak azok számára érhető el, akik licencet vásárolnak, vagy ingyenes hozzáférést kaptak múltbeli hozzájárulásaikért" - }, - "chaptersPage2": { - "message": "Fontos: A fejezetek beküldésére való engedély még mindig a számolt hírnévtől függ. A megvásárolt licenc csak a mások által beküldött fejezetek megtekintésére vonatkozik.", - "description": "On the chapters page for getting access to the paid chapters feature" - }, - "chapterNewFeature": { - "message": "Új funkció: Közösség által karbantartott fejezetek. Ezek egyedileg elnevezett részei a videóknak, amiket egymásba is lehet ágyazni, hogy egyre pontosabbak lehessenek. Vásárolj licencet, hogy láthasd az ezen a videón beküldött fejezeteket, mint: ", - "description": "After the comma, a list of chapters for this video will appear" - }, - "chapterNewFeature2": { - "message": "Új funkció: Közösség által karbantartott fejezetek. Ezek egyedileg elnevezett részei a videóknak, amiket egymásba is lehet ágyazni, hogy egyre pontosabbak lehessenek. Neked van igyenes hozzáférésed, engedélyezd a beállításokban." - }, - "unsubmittedSegmentCounts": { - "message": "Jelenleg {0} van {1}", - "description": "Example: You currently have 12 unsubmitted segments on 5 videos" - }, - "unsubmittedSegmentCountsZero": { - "message": "Jelenleg nincsenek beküldetlen szegmensek", - "description": "Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments" - }, - "unsubmittedSegmentsSingular": { - "message": "beküldetlen szegmensed", - "description": "Example: You currently have 1 *unsubmitted segment* on 1 video" - }, - "unsubmittedSegmentsPlural": { - "message": "beküldetlen szegmensed", - "description": "Example: You currently have 12 *unsubmitted segments* on 5 videos" - }, - "videosSingular": { - "message": "videón", - "description": "Example: You currently have 3 unsubmitted segments on 1 *video*" - }, - "videosPlural": { - "message": "videón", - "description": "Example: You currently have 12 unsubmitted segments on 5 *videos*" - }, - "clearUnsubmittedSegments": { - "message": "Szegmensek törlése", - "description": "Label for a button in settings" - }, - "clearUnsubmittedSegmentsConfirm": { - "message": "Biztosan törölni szeretnéd az összes beküldetlen szegmensedet?", - "description": "Confirmation message for the Clear unsubmitted segments button" - }, - "showUnsubmittedSegments": { - "message": "Szegmensek mutatása", - "description": "Show/hide button for the unsubmitted segments list" - }, - "hideUnsubmittedSegments": { - "message": "Szegmensek elrejtése", - "description": "Show/hide button for the unsubmitted segments list" - }, - "videoID": { - "message": "Videó ID", - "description": "Header of the unsubmitted segments list" - }, - "segmentCount": { - "message": "Szegmensek", - "description": "Header of the unsubmitted segments list" - }, - "actions": { - "message": "Műveletek", - "description": "Header of the unsubmitted segments list" - }, - "exportSegmentsAsURL": { - "message": "Megosztás linkként" - } -} diff --git a/public/_locales/id/messages.json b/public/_locales/id/messages.json deleted file mode 100644 index 8215b6a4..00000000 --- a/public/_locales/id/messages.json +++ /dev/null @@ -1,1010 +0,0 @@ -{ - "fullName": { - "message": "SponsorBlock untuk YouTube - Lewati Sponsor", - "description": "Name of the extension." - }, - "Description": { - "message": "Lewati sponsor, meminta subscriber dan lain-lain di video YouTube. Laporkan sponsor di video yang anda tonton untuk menghemat waktu orang lain.", - "description": "Description of the extension." - }, - "400": { - "message": "Server menyatakan permintaan ini tidak valid" - }, - "429": { - "message": "Anda terlalu banyak mengirim waktu sponsor pada video ini, apakah anda yakin ada sebanyak ini?" - }, - "409": { - "message": "Ini sudah dikirim sebelumnya" - }, - "channelWhitelisted": { - "message": "Channel Didaftar-putihkan!" - }, - "Segment": { - "message": "segmen" - }, - "Segments": { - "message": "segmen" - }, - "upvoteButtonInfo": { - "message": "Upvote submisi ini" - }, - "reportButtonTitle": { - "message": "Laporkan" - }, - "reportButtonInfo": { - "message": "Laporkan submisi ini sebagai kesalahan." - }, - "Dismiss": { - "message": "Hilangkan" - }, - "Loading": { - "message": "Memuat..." - }, - "Hide": { - "message": "Jangan tampilkan" - }, - "hitGoBack": { - "message": "Tekan jangan lewati untuk kembali ke asal." - }, - "unskip": { - "message": "Jangan Lewati" - }, - "reskip": { - "message": "Lewati Ulang" - }, - "unmute": { - "message": "Batalkan bisu" - }, - "paused": { - "message": "Dijeda" - }, - "manualPaused": { - "message": "Timer Berhenti" - }, - "confirmMSG": { - "message": "Untuk mengedit atau menghapus nilai masing-masing, klik tombol info atau buka popup ekstensi dengan mengklik ikon ekstensi di ujung kanan atas." - }, - "clearThis": { - "message": "Apa anda yakin ingin menghapus ini?\n\n" - }, - "Unknown": { - "message": "Terjadi kesalahan mengirim waktu sponsor, mohon coba lagi nanti." - }, - "sponsorFound": { - "message": "Video ini memiliki segmen di basis data!" - }, - "sponsor404": { - "message": "Tidak ada segmen ditemukan" - }, - "sponsorStart": { - "message": "Segmen Dimulai Sekarang" - }, - "sponsorEnd": { - "message": "Segmen Berakhir Sekarang" - }, - "sponsorCancel": { - "message": "Batalkan Membuat Segmen" - }, - "noVideoID": { - "message": "Video YouTube tidak ditemukan.\nJika terjadi kesalahan, segarkan halaman." - }, - "refreshSegments": { - "message": "Perbarui segmen" - }, - "success": { - "message": "Sukses!" - }, - "voted": { - "message": "Divote!" - }, - "serverDown": { - "message": "Sepertinya server sedang down. Kontak pengembang segera." - }, - "connectionError": { - "message": "Kesalahan koneksi terjadi. Kode kesalahan: " - }, - "clearTimes": { - "message": "Hapus Segmen" - }, - "openPopup": { - "message": "Buka Popup SponsorBlock" - }, - "closePopup": { - "message": "Tutup Popup" - }, - "SubmitTimes": { - "message": "Kirim Segmen" - }, - "submitCheck": { - "message": "Apakah anda yakin ingin mengirim ini?" - }, - "whitelistChannel": { - "message": "Daftar putih channel" - }, - "removeFromWhitelist": { - "message": "Hapus channel dari daftar putih" - }, - "voteOnTime": { - "message": "Beri Segmen Vote" - }, - "Submissions": { - "message": "Submisi" - }, - "savedPeopleFrom": { - "message": "Anda telah menyelamatkan orang dari " - }, - "viewLeaderboard": { - "message": "Papan peringkat" - }, - "recordTimesDescription": { - "message": "Kirim" - }, - "submissionEditHint": { - "message": "Pengeditan bagian akan muncul setelah anda mengklik kirim", - "description": "Appears in the popup to inform them that editing has been moved to the video player." - }, - "popupHint": { - "message": "Petunjuk: Anda dapat mengatur keybinds untuk pengiriman dalam opsi" - }, - "clearTimesButton": { - "message": "Hapus Waktu" - }, - "submitTimesButton": { - "message": "Kirim Waktu" - }, - "publicStats": { - "message": "Ini digunakan di halaman statistik publik untuk menampilkan berapa banyak anda berkontribusi. Lihat disini" - }, - "Username": { - "message": "Nama pengguna" - }, - "setUsername": { - "message": "Atur Nama Pengguna" - }, - "copyPublicID": { - "message": "Salin UserID Publik" - }, - "copySegmentID": { - "message": "Salin ID Segmen" - }, - "discordAdvert": { - "message": "Gabung dengan server resmi discord untuk memberikan kritik dan saran!" - }, - "hideThis": { - "message": "Sembunyikan ini" - }, - "Options": { - "message": "Opsi" - }, - "showButtons": { - "message": "Tampilkan Tombol Di Pemutar Video YouTube" - }, - "hideButtons": { - "message": "Sembunyikan Tombol Di Pemutar Video YouTube" - }, - "hideButtonsDescription": { - "message": "Ini akan menyembunyikan tombol yang muncul di pemutar YouTube untuk mengirimkan segmen yang dilewati." - }, - "showSkipButton": { - "message": "Tetap lewati ke tombol Highlight di Pemutar" - }, - "showInfoButton": { - "message": "Tampilkan Tombol Info Di Pemutar Video YouTube" - }, - "hideInfoButton": { - "message": "Sembunyikan Tombol Info Di Pemutar Video YouTube" - }, - "autoHideInfoButton": { - "message": "Otomatis Sembunyikan Tombol Info" - }, - "hideDeleteButton": { - "message": "Sembunyikan Tombol Hapus Di Pemutar Video YouTube" - }, - "showDeleteButton": { - "message": "Tampilkan Tombol Hapus Di Pemutar Video YouTube" - }, - "enableViewTracking": { - "message": "Aktifkan Pelacakan Jumlah Lewati" - }, - "whatViewTracking": { - "message": "Fitur ini melacak segmen mana yang sudah anda lewati untuk memberitahu pengguna berapa banyak submisi mereka telah membantu orang lain dan digunakan sebagai metrik bersamaan dengan upvote untuk memastikan tidak ada spam dalam basis data. Ekstensi mengirim pesan ke server tiap kali anda melewati segmen. Harapannya kebanyakan orang tidak akan mengubah opsi ini agar jumlah tayangan akurat. :)" - }, - "enableViewTrackingInPrivate": { - "message": "Aktifkan Pelacakan Jumlah Lewati Pada Tab Privat/Penyamaran" - }, - "enableTrackDownvotes": { - "message": "Tampung segmen yang dijempolbawahkan" - }, - "whatTrackDownvotes": { - "message": "Semua segmen yang dijempolbawahkan akan tetap tersembunyi bahkan jika disegarkan" - }, - "trackDownvotesWarning": { - "message": "Peringatan: Menonaktifkan ini akan menghapus semua jempol bawah yang ditampung" - }, - "enableQueryByHashPrefix": { - "message": "Kueri dengan Hash Prefix" - }, - "whatQueryByHashPrefix": { - "message": "Daripada meminta segmen dari server menggunakan videoID, 4 huruf pertama dari hash dari videoID dikirim. Server akan mengirim kembali data untuk semua video dengan hash yang mirip." - }, - "enableRefetchWhenNotFound": { - "message": "Fetch Ulang Segmen Di Video Baru" - }, - "whatRefetchWhenNotFound": { - "message": "Jika ini merupakan video baru, dan tidak ada segmen yang ditemukan, SponsorBlock akan terus merefetch setiap beberapa menit saat anda menonton." - }, - "showNotice": { - "message": "Tampilkan Pemberitahuan Lagi" - }, - "showSkipNotice": { - "message": "Tampilkan pemberitahuan setelah melewati segmen" - }, - "showCategoryGuidelines": { - "message": "Tampilkan Bantuan Kategori" - }, - "noticeVisibilityMode0": { - "message": "Lewati maklumat ukuran penuh" - }, - "noticeVisibilityMode1": { - "message": "Maklumat lewati kecil untuk lewati otomatis" - }, - "noticeVisibilityMode2": { - "message": "Lewati semua maklumat kecil" - }, - "noticeVisibilityMode3": { - "message": "Pudar maklumat lewati untuk semua lewati otomatis" - }, - "noticeVisibilityMode4": { - "message": "Lewati semua maklumat pudar" - }, - "longDescription": { - "message": "SponsorBlock membuat anda melewati sponsor, intro, outro, pengingat berlangganan dan segmen mengganggu lainnya di video YouTube. SponsorBlock adalah ekstensi browser crowdsourced yang membolehkan siapa saja mengirim waktu awal dan akhir dari segmen sponsor dan segmen video YouTube lainnya. Setelah seseorang mengirim informasi ini, orang lain yang memakai ekstensi ini akan melewati segmen sponsor di video yang sama. Anda juga dapat melewati bagian non-musik di musik video.", - "description": "Full description of the extension on the store pages." - }, - "website": { - "message": "Situs", - "description": "Used on Firefox Store Page" - }, - "sourceCode": { - "message": "Kode Sumber", - "description": "Used on Firefox Store Page" - }, - "noticeUpdate": { - "message": "Pemberitahuan sudah ditingkatkan!", - "description": "The first line of the message displayed after the notice was upgraded." - }, - "noticeUpdate2": { - "message": "Jika anda masih tidak menyukainya, tekan tombol jangan tampilkan.", - "description": "The second line of the message displayed after the notice was upgraded." - }, - "setSkipShortcut": { - "message": "Lewati segmen", - "description": "Keybind label" - }, - "setStartSponsorShortcut": { - "message": "Mulai/hentikan segmen", - "description": "Keybind label" - }, - "setSubmitKeybind": { - "message": "Kirim segmen", - "description": "Keybind label" - }, - "keybindDescription": { - "message": "Pilih sebuah tombol dengan mengetikkannya dan pilih tombol modifier apa saja yang Anda ingin gunakan." - }, - "0": { - "message": "Koneksi Timeout. Cek koneksi internet anda. Jika internet anda berfungsi, server mungkin kewalahan atau down." - }, - "disableSkipping": { - "message": "Melewati diaktifkan" - }, - "enableSkipping": { - "message": "Melewati dinonaktifkan" - }, - "yourWork": { - "message": "Hasil Kerja Anda", - "description": "Used to describe the section that will show you the statistics from your submissions." - }, - "502": { - "message": "Tampaknya server sedang kewalahan. Coba lagi beberapa detik." - }, - "errorCode": { - "message": "Kode Kesalahan: " - }, - "skip": { - "message": "Lewati" - }, - "mute": { - "message": "Bisukan" - }, - "full": { - "message": "Video Penuh", - "description": "Used for the name of the option to label an entire video as sponsor or self promotion." - }, - "skip_category": { - "message": "Lewati {0}?" - }, - "mute_category": { - "message": "Bisukan {0}?" - }, - "skip_to_category": { - "message": "Lompat ke {0}?", - "description": "Used for skipping to things (Skip to Highlight)" - }, - "skipped": { - "message": "{0} dilewati", - "description": "Example: Sponsor Skipped" - }, - "muted": { - "message": "{0} Dibisukan", - "description": "Example: Sponsor Muted" - }, - "skipped_to_category": { - "message": "Melewati ke {0}", - "description": "Used for skipping to things (Skipped to Highlight)" - }, - "disableAutoSkip": { - "message": "Nonaktifkan Lewati Otomatis" - }, - "enableAutoSkip": { - "message": "Aktifkan Lewati Otomatis" - }, - "audioNotification": { - "message": "Notifikasi Audio Saat Dilewati" - }, - "audioNotificationDescription": { - "message": "Notifikasi audio akan berbunyi saat melewati sebuah segmen. Jika nonaktif (atau lewati otomatis nonaktif), tidak ada suara yang akan diputar." - }, - "showTimeWithSkips": { - "message": "Tampilkan Waktu Dikurangi Yang Dilewati" - }, - "showTimeWithSkipsDescription": { - "message": "Waktu ini muncul di dalam kurung disamping waktu asli di bilah waktu. Ini menunjukkan durasi total video yang tidak termasuk segmen apapun. Ini termasuk segmen yang ditandai hanya \"Tampilkan Di Bilah Waktu\"." - }, - "youHaveSkipped": { - "message": "Anda sudah melewati " - }, - "minLower": { - "message": "menit" - }, - "minsLower": { - "message": "menit" - }, - "hourLower": { - "message": "jam" - }, - "hoursLower": { - "message": "jam" - }, - "youHaveSavedTime": { - "message": "Anda sudah menghemat waktu orang lain", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "youHaveSavedTimeEnd": { - "message": " dari hidup mereka", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "statusReminder": { - "message": "Cek status.sponsor.ajay.app untuk status server." - }, - "whatChangeUserID": { - "message": "Ini harus dirahasiakan. Ini seperti kata sandi dan tidak boleh dibagikan kepada siapa pun. Jika seseorang mempunyai ini, mereka bisa menyamar jadi anda. Jika anda mencari UserID publik anda, klik ikon papan tulis di popup." - }, - "createdBy": { - "message": "Dibuat Oleh" - }, - "supportOtherSites": { - "message": "Dukung Situs Youtube Pihak Ketiga" - }, - "supportOtherSitesDescription": { - "message": "Dukung klien YouTube pihak ketiga. Untuk mengaktifkan dukungan, anda harus menerima izin tambahan. Ini tidak akan bekerja di Mode Samaran di Chrome dan varian Chromium lainnya.", - "description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube" - }, - "supportedSites": { - "message": "Situs yang didukung: " - }, - "optionsInfo": { - "message": "Aktifkan dukungan Invidious, nonaktifkan lewati otomatis, tombol sembunyi dan lainnya." - }, - "addInvidiousInstance": { - "message": "Tambah Instansi Klien Pihak Ketiga" - }, - "addInvidiousInstanceDescription": { - "message": "Tambahkan instansi khusus. Ini harus diformat Hanya dengan domain. Contoh: invidious.ajay.app" - }, - "add": { - "message": "Tambah" - }, - "addInvidiousInstanceError": { - "message": "Domain ini tidak valid. Ini harus HANYA mengandung bagian domainnya. Contoh: invidious.ajay.app" - }, - "resetInvidiousInstance": { - "message": "Reset Daftar Instansi Invidious" - }, - "resetInvidiousInstanceAlert": { - "message": "Anda akan mereset daftar instansi invidious" - }, - "currentInstances": { - "message": "Instansi sekarang:" - }, - "minDuration": { - "message": "Durasi minimal (detik):" - }, - "minDurationDescription": { - "message": "Segmen yang lebih kecil dari nilai yang diatur tidak akan dilewati atau tampil di pemutar." - }, - "whatManualSkipOnFullVideo": { - "message": "Untuk yang ingin menonton video tanpa gangguan jika sepenuhnya disponsori atau promosi sendiri." - }, - "skipNoticeDuration": { - "message": "Lewati maklumat berdurasi (detik):" - }, - "skipNoticeDurationDescription": { - "message": "Maklumat lewati akan tetap di layar setidaknya selama ini. Untuk lewati manual, mungkin akan terlihat lebih lama." - }, - "shortCheck": { - "message": "Submisi ini lebih pendek dari opsi durasi minimalmu. Ini dapat berarti ini sudah dikirim, dan hanya akan diabaikan karena opsi ini. Apakah anda yakin ingin mengirim?" - }, - "liveOrPremiere": { - "message": "Mengirim pada livestream atau premiere tidak diperbolehkan. Mohon tunggu sampai selesai, lalu muat ulang halamannya dan verifikasi bahwa segmentnya masih valid." - }, - "showUploadButton": { - "message": "Tampilkan Tombol Unggah" - }, - "customServerAddress": { - "message": "Alamat Server SponsorBlock" - }, - "customServerAddressDescription": { - "message": "Alamat yang SponsorBlock gunakan untuk memanggil server.\nKecuali jika anda mempunyai instansi server sendiri, ini tidak perlu diubah." - }, - "save": { - "message": "Simpan" - }, - "reset": { - "message": "Atur ulang" - }, - "customAddressError": { - "message": "Alamat ini tidak berada di bentuk yang benar. Pastikan kamu menggunakan http:// atau https:// di awal dan tidak ada garis mengikuti." - }, - "areYouSureReset": { - "message": "Apakah anda yakin ingin mengatur ulang ini?" - }, - "mobileUpdateInfo": { - "message": "m.youtube.com sekarang didukung" - }, - "exportOptions": { - "message": "Impor/Ekspor Semua Pengaturan" - }, - "exportOptionsCopy": { - "message": "Edit/salin" - }, - "exportOptionsDownload": { - "message": "Simpan ke file" - }, - "exportOptionsUpload": { - "message": "Muat dari file" - }, - "setOptions": { - "message": "Atur Opsi" - }, - "exportOptionsWarning": { - "message": "Peringatan: Mengubah opsi bersifat permanen dan bisa merusak pemasangan anda. Apakah anda yakin ingin melakukan ini? Pastikan untuk mencadangkan yang lama untuk berjaga." - }, - "incorrectlyFormattedOptions": { - "message": "JSON ini tidak diformat dengan benar. Pengaturan anda tidak berubah." - }, - "confirmNoticeTitle": { - "message": "Kirim Segmen" - }, - "submit": { - "message": "Kirim" - }, - "cancel": { - "message": "Batal" - }, - "delete": { - "message": "Hapus" - }, - "preview": { - "message": "Pratinjau" - }, - "unsubmitted": { - "message": "Belum dikirim" - }, - "inspect": { - "message": "Inspeksi" - }, - "edit": { - "message": "Ubah" - }, - "copyDebugInformation": { - "message": "Salin Informasi Debug Ke Papan Klip" - }, - "copyDebugInformationFailed": { - "message": "Gagal menyalin ke papan klip" - }, - "copyDebugInformationOptions": { - "message": "Salin informasi ke papan klip untuk menyediakan pengembang saat mengangkat bug / saat pengembang memintanya. Informasi sensitif seperti user ID, channel yang didaftar-putihkan, dan alamat server kustom akan dihapus. Namun itu mengandung informasi seperti useragent anda, browser, sistem operasi, dan nomor versi ekstensi. " - }, - "copyDebugInformationComplete": { - "message": "Informasi debug telah disalin ke papan klip. Jangan ragu untuk menghapus informasi yang tidak ingin anda bagikan. Simpan ini di file teks atau salin ke laporan bug." - }, - "keyAlreadyUsed": { - "message": "Pintasan ini telah diatur ke aksi yang lain. Mohon pilih yang lain." - }, - "to": { - "message": "sampai", - "description": "Used between segments. Example: 1:20 to 1:30" - }, - "generic_guideline1": { - "message": "Tampilkan transisi segue" - }, - "generic_guideline2": { - "message": "Memainkan sebagai tidak apa pun yang dilewati" - }, - "category_sponsor": { - "message": "Sponsor" - }, - "category_sponsor_description": { - "message": "Promosi dibayar, tautan dibayar dan iklan langsung. Tidak untuk promosi diri sendiri atau dukungan gratis untuk gerakan/kreator/situs/produk yang mereka suka." - }, - "category_sponsor_guideline1": { - "message": "Promosi berbayar" - }, - "category_sponsor_guideline2": { - "message": "Bukan untuk donasi atau barang dagangan kustom" - }, - "category_selfpromo": { - "message": "Promosi Diri Sendiri/Tidak Dibayar" - }, - "category_selfpromo_description": { - "message": "Mirip dengan \"sponsor\" kecuali ini tidak dibayar atau promosi diri sendiri. Ini termasuk merchandise, donasi, atau informasi tentang siapa yang berkolaborasi dengan mereka." - }, - "category_selfpromo_guideline1": { - "message": "Donasi, langganan, dan barang dagangan kustom" - }, - "category_selfpromo_guideline2": { - "message": "Sebutan gratis yang tidak menambahkan apa pun ke videonya" - }, - "category_selfpromo_guideline3": { - "message": "Bukan untuk produk dan barang dagangan yang didesain oleh koperasi" - }, - "category_exclusive_access": { - "message": "Akses Eksklusif" - }, - "category_exclusive_access_description": { - "message": "Hanya untuk menandai seluruh video. Digunakan ketika sebuah video mempromosikan sebuah produk, layanan atau lokasi yang diterima secara gratis atau mendapatkan izin." - }, - "category_exclusive_access_pill": { - "message": "Video ini mempromosikan sebuah produk, layanan atau lokasi yang diterima secara gratis atau mendapatkan izin", - "description": "Short description for this category" - }, - "category_exclusive_access_guideline1": { - "message": "Seluruh video pertunjukkan sesuatu dengan akses gratis atau berbayar" - }, - "category_interaction": { - "message": "Pengingat Interaksi (Berlangganan)" - }, - "category_interaction_description": { - "message": "Saat ada pengingat singkat untuk meminta suka, berlangganan atau mengikuti mereka di tengah konten. Jika panjang atau tentang sesuatu yang spesifik, sebaiknya pakai kategori promosi diri sendiri." - }, - "category_interaction_guideline1": { - "message": "Pengingat pendek untuk menyukai video, berlangganan, atau ikuti" - }, - "category_interaction_guideline2": { - "message": "Menampilkan pengingat tidak langsung untuk berkomentar" - }, - "category_interaction_guideline3": { - "message": "Bukan untuk promosi umum, hanya bilang untuk melakukan tindakan" - }, - "category_interaction_short": { - "message": "Pengingat Interaksi" - }, - "category_intro": { - "message": "Jeda/Animasi Intro" - }, - "category_intro_description": { - "message": "Bagian yang bukan konten sebenarnya. Dapat berupa jeda, gambar statik, atau animasi berulang. Ini tidak boleh digunakan untuk transisi yang berisi informasi." - }, - "category_intro_short": { - "message": "Jeda" - }, - "category_intro_guideline1": { - "message": "Interval tanpa konten aslinya" - }, - "category_intro_guideline2": { - "message": "Bukan untuk transisi dengan informasi" - }, - "category_outro": { - "message": "Kartu Akhir/Kredit" - }, - "category_outro_description": { - "message": "Kredit atau saat kartu akhir YouTube muncul. Tidak untuk kesimpulan dengan informasi." - }, - "category_outro_guideline1": { - "message": "Jangan tampilkan konten, bahkan jika kartu akhir ada di layar" - }, - "category_preview": { - "message": "Pratinjau/Rekap" - }, - "category_preview_guideline1": { - "message": "Klip yang ditampilkan nanti, atau di video di masa mendatang" - }, - "category_preview_guideline2": { - "message": "Rekap dari video sebelumnya" - }, - "category_preview_guideline3": { - "message": "Bukan untuk bagian yang menambahkan konten tambahan" - }, - "category_filler": { - "message": "Pengisi Tak berkaitan/Lawakan" - }, - "category_filler_short": { - "message": "Isian" - }, - "category_filler_guideline1": { - "message": "Scene tangen hanya untuk isian atau humor" - }, - "category_filler_guideline2": { - "message": "Gangguan, blooper, replay" - }, - "category_filler_guideline3": { - "message": "Bukan untuk scene yang dibutuhkan untuk mengerti topik" - }, - "category_music_offtopic": { - "message": "Musik: Bagian Non-Musik" - }, - "category_music_offtopic_description": { - "message": "Hanya digunakan untuk video musik. Ini seharusnya hanya digunakan untuk bagian dari video musik yang tidak tercakup kategori lain." - }, - "category_music_offtopic_short": { - "message": "Non-Musik" - }, - "category_music_offtopic_guideline1": { - "message": "Bagian bukan di rilis resmi" - }, - "category_music_offtopic_guideline2": { - "message": "Non-musik di pertunjukkan langsung" - }, - "category_poi_highlight": { - "message": "Sorotan" - }, - "category_poi_highlight_description": { - "message": "Bagian video yang banyak orang lihat. Sama untuk komentar \"Video dimulai di x\"." - }, - "category_poi_highlight_guideline1": { - "message": "Bagian banyak orang yang mencari" - }, - "category_poi_highlight_guideline2": { - "message": "Dapat melewati topik" - }, - "category_poi_highlight_guideline3": { - "message": "Dapat melewati ke judul atau thumbnail" - }, - "category_livestream_messages": { - "message": "Livestream: Baca Pesan/Donasi" - }, - "category_livestream_messages_short": { - "message": "Membaca Pesan Chat" - }, - "autoSkip": { - "message": "Lewati Otomatis" - }, - "manualSkip": { - "message": "Lewati Manual" - }, - "showOverlay": { - "message": "Tampilkan Di Bilah Waktu" - }, - "disable": { - "message": "Nonaktif" - }, - "autoSkip_POI": { - "message": "Otomatis lewati ke awal" - }, - "manualSkip_POI": { - "message": "Tanya saat video dimuat" - }, - "showOverlay_POI": { - "message": "Tampilkan di Bilah Waktu" - }, - "showOverlay_full": { - "message": "Tampilkan Label" - }, - "autoSkipOnMusicVideos": { - "message": "Lewati semua segmen secara otomatis ketika ada segmen non-music" - }, - "muteSegments": { - "message": "Perbolehkan segmen untuk bisu daripada melewati" - }, - "fullVideoSegments": { - "message": "Tunjukkan ikon ketika keseluruhan video merupakan iklan", - "description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo" - }, - "previewColor": { - "message": "Warna yang Belum Dikirim", - "description": "Referring to submissions that have not been sent to the server yet." - }, - "seekBarColor": { - "message": "Warna Bilah Waktu" - }, - "category": { - "message": "Kategori" - }, - "skipOption": { - "message": "Opsi Lewati", - "description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)" - }, - "enableTestingServer": { - "message": "Aktifkan Server Beta Testing" - }, - "whatEnableTestingServer": { - "message": "Submisi dan vote anda TIDAK TERHITUNG pada server utama. Hanya gunakan ini untuk percobaan." - }, - "testingServerWarning": { - "message": "Semua submisi dan vote TIDAK TERHITUNG pada server utama saat terkoneksi ke server percobaan." - }, - "bracketNow": { - "message": "(Sekarang)" - }, - "moreCategories": { - "message": "Kategori Lain" - }, - "chooseACategory": { - "message": "Pilih Kategori" - }, - "enableThisCategoryFirst": { - "message": "Untuk mengirimkan segmen dengan kategori \"{0}\", Anda harus mengaktifkannya di opsi. Anda akan diarahkan ke opsi sekarang.", - "description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options." - }, - "poiOnlyOneSegment": { - "message": "Perhatian: Tipe segmen ini hanya bisa maksimum aktif satu kali. Mengirimkan beberapa dapat mengakibatkan muncul pada kondisi acak." - }, - "youMustSelectACategory": { - "message": "Anda harus memilih kategori untuk semua segmen yang anda kirimkan!" - }, - "bracketEnd": { - "message": "(Selesai)" - }, - "hiddenDueToDownvote": { - "message": "disembunyikan: voting rendah" - }, - "hiddenDueToDuration": { - "message": "disembunyikan: terlalu pendek" - }, - "manuallyHidden": { - "message": "disembunyikan sendiri" - }, - "channelDataNotFound": { - "description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.", - "message": "ID Channel belum dimuat. Apabila anda menggunakan video yang tersematkan, coba menggunakan halaman utama YouTube. Hal ini juga dapat disebabkan oleh perubahan yang ada pada tampilan YouTUbe, apabila anda mengira seperti itu, buat komentar disini:" - }, - "acceptPermission": { - "message": "Terima permintaan izin" - }, - "permissionRequestSuccess": { - "message": "Permintaan izin berhasil!" - }, - "permissionRequestFailed": { - "message": "Permintaan izin gagal, apakah anda mengklik tolak?" - }, - "adblockerIssueWhitelist": { - "message": "Apabila anda tidak dapat menyelesaikan masalah ini, maka nonaktifkan pengaturan 'Paksa Cek Channel Sebelum Melewati', dikarenakan SponsorBlock tidak dapat menerima informasi channel untuk video ini" - }, - "forceChannelCheck": { - "message": "Paksa Cek Channel Sebelum Melewati" - }, - "whatForceChannelCheck": { - "message": "Secara standar, ini akan melewati segmen segera bahkan sebelum tahu apa channelnya. Secara standar, beberapa segmen pada awal video mungkin terlewati pada channel yang didaftar-putihkan. Mengaktifkan opsi ini akan mencegah ini namun membuat semua pelewatan mempunyai sedikit delay karena mendapatkan channelID membutuhkan waktu. Delay ini mungkin menjadi tidak terasa jika anda mempunyai internet yang cepat." - }, - "forceChannelCheckPopup": { - "message": "Pertimbangkan Mengaktifkan \"Paksa Pengecekan Channel Sebelum Pelewatan\"" - }, - "downvoteDescription": { - "message": "Salah, Waktu Tidak Tepat" - }, - "incorrectCategory": { - "message": "Ubah Kategori" - }, - "nonMusicCategoryOnMusic": { - "message": "Video ini dikategorikan sebagai musik. Apakah anda yakin ini berisi sponsor? Jika ini ternyata adalah \"Segmen non-musik\", buka pengaturan ekstensi dan aktifkan kategorinya. Lalu, anda bisa mengirim segmen ini sebagai \"Non-musik\" bukannya sponsor. Harap membaca panduan jika anda kebingungan." - }, - "multipleSegments": { - "message": "Banyak Segmen" - }, - "guidelines": { - "message": "Pedoman" - }, - "readTheGuidelines": { - "message": "Baca Pedomannya!!", - "description": "Show the first time they submit or if they are \"high risk\"" - }, - "categoryUpdate1": { - "message": "Kategori disini!" - }, - "categoryUpdate2": { - "message": "Buka opsi untuk melewati intro, outro, merch, dll." - }, - "help": { - "message": "Bantuan" - }, - "GotIt": { - "message": "Mengerti", - "description": "Used as the button to dismiss a tooltip" - }, - "fullVideoTooltipWarning": { - "message": "Segmen ini besar. Jika seluruh video tentang satu topik, ubah dari \"Lewati\" ke \"Video Penuh\". Lihat pedoman untuk informasi lanjutan." - }, - "categoryPillTitleText": { - "message": "Seluruh video ini ditandai sebagai kategori ini dan terlalu terintegrasi untuk dapat dipisahkan" - }, - "experiementOptOut": { - "message": "Tidak ikut eksperimen masa depan", - "description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private." - }, - "hideForever": { - "message": "Sembunyikan selamanya" - }, - "Donate": { - "message": "Donasi" - }, - "considerDonating": { - "message": "Bantu danai perkembangan" - }, - "hideDonationLink": { - "message": "Sembunyikan tautan donasi" - }, - "darkModeOptionsPage": { - "message": "Mode Gelap Di Halaman Opsi" - }, - "helpPageThanksForInstalling": { - "message": "Terima kasih telah menginstall SponsorBlock." - }, - "helpPageReviewOptions": { - "message": "Haram ditinjau opsi di bawah ini" - }, - "helpPageFeatureDisclaimer": { - "message": "Banyak fitur yang dinonaktifkan secara bawaan. Jika kamu ingin lewati mula, akhir, gunakan Invidious, dll, aktifkan mereka dibawah ini.\nKamu bisa menyembunyikan/menghadirkan elemen UI." - }, - "helpPageHowSkippingWorks": { - "message": "Cara kerja melewati segmen" - }, - "helpPageHowSkippingWorks1": { - "message": "Segmen video akan otomatis dilewati jika ditemukan di databasis. Kamu bisa buka munculan dengan klik ikon ekstensi untuk mendapatkan pratinjau apa adanya." - }, - "helpPageHowSkippingWorks2": { - "message": "Kapanpun kamu melewati segmen, kamu akan mendapatkan maklumat. Jika waktu terlihat salah dapat menyuarakan turun dengan klik turun-suara! Kamu juga bisa menyuarakan di maklumat." - }, - "Submitting": { - "message": "Mengirim" - }, - "helpPageSubmitting1": { - "message": "Mengirim bisa baik dilakukan di maklumat dengan menekan tombol \"Mulai Segmen Sekarang\" atau di pemutar video dengan tombol di pemutar." - }, - "helpPageSubmitting2": { - "message": "Klik tombol putar indikasikan memulai segmen dan klik tombol ikon stop indikasikan mengakhiri. Kamu bisa persiapkan beberapa sponsor sebelum menekan kirim. Klik tombol unggah akan mengirimkan. Klik tombol sampah akan menghapuskan." - }, - "Editing": { - "message": "Sunting" - }, - "helpPageEditing1": { - "message": "Jika kamu mengacaukan, kamu bisa sunting atau hapus segmen setelah klik tombol panah atas." - }, - "helpPageTooSlow": { - "message": "Ini terlalu lambat" - }, - "helpPageTooSlow1": { - "message": "Terdapat tombol pintas jika kamu ingin menggunakannya. Tekan tombol semikolon untuk indikasi mulai/akhir segmen sponsor dan tekan tombol kutip untuk mengirimkan. Ini bisa diganti di opsi. Jika kamu tidak menggunakan QWERTY, kamu dimungkinkan harus mengubah tombol." - }, - "helpPageCopyOfDatabase": { - "message": "Bisakah saya mendapatkan salinan Databasis? Apa yang terjadi jika kamu tiada?" - }, - "helpPageCopyOfDatabase1": { - "message": "Databasis adalah publik dan tersedia di" - }, - "helpPageCopyOfDatabase2": { - "message": "Sumber kode tersedia secara bebas. Jadi, jika sesuatu terjadi pada saya, pengajuan kamu tidak akan hilang." - }, - "helpPageNews": { - "message": "Berita dan bagaimana ini diciptakan" - }, - "helpPageSourceCode": { - "message": "Dimana saya mendapatkankan sumber kode?" - }, - "Credits": { - "message": "Kredit" - }, - "LearnMore": { - "message": "Pelajari Lebih Lanjut" - }, - "FullDetails": { - "message": "Detail Penuh" - }, - "CopyDownvoteButtonInfo": { - "message": "Menurunkan suara dan membuat salinan lokal untuk Anda kirim ulang" - }, - "OpenCategoryWikiPage": { - "message": "Membuka halaman wiki kategori ini." - }, - "CopyAndDownvote": { - "message": "Salin dan berikan turunkan suara" - }, - "ContinueVoting": { - "message": "Lanjutkan Memvoting" - }, - "ChangeCategoryTooltip": { - "message": "Ini akan menerapkan ke segmen Anda" - }, - "downvote": { - "message": "Jempol bawah" - }, - "upvote": { - "message": "Jempol atas" - }, - "hideSegment": { - "message": "Sembunyikan segmen" - }, - "SponsorTimeEditScrollNewFeature": { - "message": "Gunakan roda mouse ketika berada di kotak edit untuk mengatur waktu dengan cepat. Kombinasi dengan tombol [Ctrl + Shift] bisa digunakan untuk perubahan yang halus." - }, - "categoryPillNewFeature": { - "message": "Baru! Lihat jika sebuah video disponsori seluruhnya atau mempromosikan diri" - }, - "dayAbbreviation": { - "message": "h", - "description": "100d" - }, - "hourAbbreviation": { - "message": "j", - "description": "100h" - }, - "optionsTabBehavior": { - "message": "Perilaku", - "description": "Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabInterface": { - "message": "Tampilan", - "description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabKeyBinds": { - "message": "Pintasan keyboard", - "description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabBackup": { - "message": "Cadangkan/Pulihkan", - "description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabAdvanced": { - "message": "Lain-lain", - "description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "noticeVisibilityLabel": { - "message": "Lewati pelihatan pemberitahuan", - "description": "Option label" - }, - "unbind": { - "message": "Lepaskan", - "description": "Unbind keyboard shortcut" - }, - "notSet": { - "message": "Tidak diatur" - }, - "change": { - "message": "Ubah" - }, - "youtubeKeybindWarning": { - "message": "Ini adalah pintasan YouTube. Apakah Anda yakin untuk menggunakannya?" - }, - "betaServerWarning": { - "message": "Server BETA diaktifkan!" - }, - "openOptionsPage": { - "message": "Buka laman opsi" - }, - "resetToDefault": { - "message": "Atur ulang pengaturan ke bawaan" - }, - "confirmResetToDefault": { - "message": "Apakah Anda yakin ingin mengatur ulang semua pengaturan ke nilai bawaan?\nTindakan ini tidak dapat diurungkan." - } -} diff --git a/public/_locales/it/messages.json b/public/_locales/it/messages.json deleted file mode 100644 index f9327a76..00000000 --- a/public/_locales/it/messages.json +++ /dev/null @@ -1,1247 +0,0 @@ -{ - "fullName": { - "message": "SponsorBlock per YouTube - Salta gli sponsor", - "description": "Name of the extension." - }, - "Description": { - "message": "Salta sponsorizzazioni, richieste d'iscrizione ai canali e molto altro sui video di YouTube. Segnala gli sponsor sui video che guardi per salvare il tempo agli altri.", - "description": "Description of the extension." - }, - "400": { - "message": "Richiesta non valida" - }, - "429": { - "message": "Stai inviando troppi segmenti per questo video, sei sicuro che ce ne siano così tanti?" - }, - "409": { - "message": "Questo è già stato inviato" - }, - "channelWhitelisted": { - "message": "Canale aggiunto alla lista delle esclusioni!" - }, - "Segment": { - "message": "segmento" - }, - "Segments": { - "message": "segmenti" - }, - "SegmentsCap": { - "message": "Segmenti" - }, - "Chapters": { - "message": "Capitoli" - }, - "renderAsChapters": { - "message": "Visualizza segmenti come capitoli", - "description": "Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system" - }, - "showSegmentNameInChapterBar": { - "message": "Mostra il Segmento Corrente Affianco al Tempo del Video" - }, - "upvoteButtonInfo": { - "message": "Vota questo contributo" - }, - "reportButtonTitle": { - "message": "Segnala" - }, - "reportButtonInfo": { - "message": "Segnala questo contributo come non corretto." - }, - "Dismiss": { - "message": "Chiudi" - }, - "Loading": { - "message": "Caricamento..." - }, - "Hide": { - "message": "Non mostrare più" - }, - "hitGoBack": { - "message": "Premi non saltare per tornare da dove sei venuto." - }, - "unskip": { - "message": "Non saltare" - }, - "reskip": { - "message": "Salta ancora" - }, - "unmute": { - "message": "Riattiva il microfono" - }, - "paused": { - "message": "In pausa" - }, - "manualPaused": { - "message": "Timer fermato" - }, - "confirmMSG": { - "message": "\n\nPer modificare o eliminare valori specifici, premi il pulsante delle informazioni o apri il popup cliccando l'icona dell'estensione nell'angolo in alto a destra." - }, - "clearThis": { - "message": "Sei sicuro di volerlo cancellare?\n\n" - }, - "Unknown": { - "message": "Si è verificato un errore durante l'invio del segmento, per favore riprova più tardi." - }, - "sponsorFound": { - "message": "Questo video ha dei segmenti nel database!" - }, - "sponsor404": { - "message": "Nessun segmento trovato" - }, - "sponsorStart": { - "message": "Il segmento inizia qui" - }, - "sponsorEnd": { - "message": "Il segmento finisce ora" - }, - "sponsorCancel": { - "message": "Annulla Creazione del Segmento" - }, - "noVideoID": { - "message": "Nessun video YouTube trovato.\nSe è un errore, ricarica la scheda." - }, - "refreshSegments": { - "message": "Ricarica i segmenti" - }, - "success": { - "message": "Ha funzionato!" - }, - "voted": { - "message": "Votato!" - }, - "serverDown": { - "message": "Sembra che il server non funzioni. Contatta subito lo sviluppatore." - }, - "connectionError": { - "message": "Si è verificato un errore durante la connessione. Codice errore: " - }, - "clearTimes": { - "message": "Rimuovi i segmenti" - }, - "openPopup": { - "message": "Apri il popup di SponsorBlock" - }, - "closePopup": { - "message": "Chiudi il popup" - }, - "closeIcon": { - "message": "Icona Chiudi" - }, - "SubmitTimes": { - "message": "Invia i segmenti" - }, - "sortSegments": { - "message": "Ordina segmenti" - }, - "submitCheck": { - "message": "Sei sicuro di volerlo inviare?" - }, - "whitelistChannel": { - "message": "Aggiungi il canale alle eccezioni" - }, - "removeFromWhitelist": { - "message": "Rimuovi il canale dalle eccezioni" - }, - "voteOnTime": { - "message": "Vota un segmento" - }, - "Submissions": { - "message": "Contributi" - }, - "savedPeopleFrom": { - "message": "Hai fatto risparmiare in totale " - }, - "viewLeaderboard": { - "message": "Classifica" - }, - "recordTimesDescription": { - "message": "Invia" - }, - "submissionEditHint": { - "message": "La modifica della sezione comparirà dopo che hai cliccato su Inviare", - "description": "Appears in the popup to inform them that editing has been moved to the video player." - }, - "popupHint": { - "message": "Suggerimento: puoi configurare dei comandi rapidi nelle opzioni" - }, - "clearTimesButton": { - "message": "Cancella minutaggio" - }, - "submitTimesButton": { - "message": "Invia minutaggio" - }, - "publicStats": { - "message": "Questo è usato nelle pagine pubbliche delle statistiche per mostrare quanto hai contribuito. Vedilo" - }, - "Username": { - "message": "Nome utente" - }, - "setUsername": { - "message": "Imposta nome utente" - }, - "copyPublicID": { - "message": "Copia UserID Pubblico" - }, - "copySegmentID": { - "message": "Copia ID Segmento" - }, - "discordAdvert": { - "message": "Entra nel server Discord ufficiale per darci suggerimenti e feedback!" - }, - "hideThis": { - "message": "Nascondi" - }, - "Options": { - "message": "Opzioni" - }, - "showButtons": { - "message": "Mostra i pulsanti sul video" - }, - "hideButtons": { - "message": "Nascondi i pulsanti sul video" - }, - "hideButtonsDescription": { - "message": "Nasconde i pulsanti che appaiono sul video per inviare i segmenti da nascondere." - }, - "showSkipButton": { - "message": "Mantieni l'Highlight del Video sulla Barra del Video" - }, - "showInfoButton": { - "message": "Mostra il pulsante delle informazioni sopra al video" - }, - "hideInfoButton": { - "message": "Nascondi il pulsante d'informazioni sopra al video" - }, - "autoHideInfoButton": { - "message": "Nascondi in automatico il Pulsante di Informazioni" - }, - "hideDeleteButton": { - "message": "Nascondi il pulsante elimina" - }, - "showDeleteButton": { - "message": "Mostra il pulsante elimina" - }, - "enableViewTracking": { - "message": "Attiva il conteggio dei salti" - }, - "whatViewTracking": { - "message": "Questa funzionalità tiene traccia dei segmenti che hai saltato per far sapere agli utenti quanto il loro contributo abbia aiutato gli altri e anche come statistica, insieme ai voti positivi, per garantire che lo spam non entri nel database. L'estensione invierà un messaggio al server ogni volta che salterai un segmento. Si spera che la maggior parte delle persone non modifichino questa impostazione, in modo da non intaccare l'accuratezza dei numeri di visualizzazione. :)" - }, - "enableViewTrackingInPrivate": { - "message": "Abilita il conteggio dei salti nelle schede private/anonime" - }, - "enableTrackDownvotes": { - "message": "Memorizza i voti negativi del segmento" - }, - "whatTrackDownvotes": { - "message": "Segmenti votati negativamente rimarranno nascosti anche dopo aver ricaricato la pagina" - }, - "trackDownvotesWarning": { - "message": "Attenzione: Disabilitarlo eliminerà tutti i voti negativi precedentemente memorizzati" - }, - "enableQueryByHashPrefix": { - "message": "Ricerca tramite prefisso hash" - }, - "whatQueryByHashPrefix": { - "message": "Invece di richiedere i segmenti dal server utilizzando l'ID del video, viene inviato un hash dei primi 4 caratteri dell'ID. Questo server invierà i dati per tutti i video con hash simili." - }, - "enableRefetchWhenNotFound": { - "message": "Ricarica i segmenti su nuovi video" - }, - "whatRefetchWhenNotFound": { - "message": "Se il video è nuovo, e non risultano esserci segmenti, continueremo a cercarne di nuovi ogni pochi minuti." - }, - "enableShowCategoryWithoutPermission": { - "message": "Mostra le categorie nel menu d'invio anche senza l'autorizzazione all'invio" - }, - "whatShowCategoryWithoutPermission": { - "message": "Alcune categorie richiedono l'autorizzazione all'invio a causa dei requisiti di reputazione minimi" - }, - "showNotice": { - "message": "Mostra di nuovo l'avviso" - }, - "showSkipNotice": { - "message": "Mostra Avviso Dopo Aver Saltato un Segmento" - }, - "showCategoryGuidelines": { - "message": "Mostra Aiuto della Categoria" - }, - "noticeVisibilityMode0": { - "message": "Salta Avvisi di Dimensioni Complete" - }, - "noticeVisibilityMode1": { - "message": "Piccoli Salta Avvisi per Salto Automatico" - }, - "noticeVisibilityMode2": { - "message": "Tutti i Piccoli Salta Avvisi" - }, - "noticeVisibilityMode3": { - "message": "Salta Avvisi Offuscati per Salto Automatico" - }, - "noticeVisibilityMode4": { - "message": "Tutti i Salta Avvisi Offuscati" - }, - "longDescription": { - "message": "SponsorBlock ti consente di saltare sponsorizzazioni, introduzioni, conclusioni, promemoria di iscrizione e altri elementi fastidiosi dai video YouTube. SponsorBlock è un'estensione per browser di crowdsourcing, cioè che consente a chiunque di inviare l'ora di inizio e di fine dei segmenti sponsorizzati e di altro tipo. Quando una persona invia queste informazioni, chiunque altro in possesso di questa estensione sarà in grado di saltare automaticamente il segmento sponsorizzato. È possibile saltare anche le sezioni non musicali dei video musicali.", - "description": "Full description of the extension on the store pages." - }, - "website": { - "message": "Sito web", - "description": "Used on Firefox Store Page" - }, - "sourceCode": { - "message": "Codice sorgente", - "description": "Used on Firefox Store Page" - }, - "noticeUpdate": { - "message": "L'avviso è stato aggiornato!", - "description": "The first line of the message displayed after the notice was upgraded." - }, - "noticeUpdate2": { - "message": "Se non ti piace ancora, premi il pulsante \"non mostrare mai\".", - "description": "The second line of the message displayed after the notice was upgraded." - }, - "setSkipShortcut": { - "message": "Salta segmento", - "description": "Keybind label" - }, - "setStartSponsorShortcut": { - "message": "Inizia/Finisci segmento", - "description": "Keybind label" - }, - "setSubmitKeybind": { - "message": "Invia i segmenti", - "description": "Keybind label" - }, - "nextChapterKeybind": { - "message": "Capitolo successivo", - "description": "Keybind label" - }, - "previousChapterKeybind": { - "message": "Capitolo precedente", - "description": "Keybind label" - }, - "keybindDescription": { - "message": "Seleziona un tasto digitandolo e scegli qualsiasi tasto modificatore che desideri utilizzare." - }, - "0": { - "message": "Timeout della connessione. Controlla la tua connessione a Internet. Se internet sta funzionando, il server è probabilmente sovraccarico oppure giù." - }, - "disableSkipping": { - "message": "Abilitato" - }, - "enableSkipping": { - "message": "Disabilitato" - }, - "yourWork": { - "message": "Il Tuo Lavoro", - "description": "Used to describe the section that will show you the statistics from your submissions." - }, - "502": { - "message": "Il server sembra essere sovraccaricato. Riprova tra pochi secondi." - }, - "errorCode": { - "message": "Codice Errore: " - }, - "skip": { - "message": "Salta" - }, - "mute": { - "message": "Silenzia" - }, - "full": { - "message": "Video Completo", - "description": "Used for the name of the option to label an entire video as sponsor or self promotion." - }, - "skip_category": { - "message": "Vuoi saltare {0}?" - }, - "mute_category": { - "message": "Silenziare {0}?" - }, - "skip_to_category": { - "message": "Salta a {0}?", - "description": "Used for skipping to things (Skip to Highlight)" - }, - "skipped": { - "message": "{0} Saltato", - "description": "Example: Sponsor Skipped" - }, - "muted": { - "message": "{0} silenziato", - "description": "Example: Sponsor Muted" - }, - "skipped_to_category": { - "message": "Saltato a {0}", - "description": "Used for skipping to things (Skipped to Highlight)" - }, - "disableAutoSkip": { - "message": "Disabilita Salto Automatico" - }, - "enableAutoSkip": { - "message": "Abilita Salto Automatico" - }, - "audioNotification": { - "message": "Notifiche Audio per Salta" - }, - "audioNotificationDescription": { - "message": "La notifica audio riprodurrà un suono ogni volta che un segmento verrà saltato. Se questa opzione (o quella del salto automatico) è disattivata, non verrà riprodotto alcun suono." - }, - "showTimeWithSkips": { - "message": "Mostra Tempo Con Salti Rimossi" - }, - "showTimeWithSkipsDescription": { - "message": "Questo tempo appare tra parentesi accanto al tempo attuale sotto alla barra di progresso. Questo mostra la durata totale del video meno gli spezzoni. Include spezzoni marcati come \"Mostra solo nella barra di progresso\"." - }, - "youHaveSkipped": { - "message": "Hai saltato " - }, - "minLower": { - "message": "minuto" - }, - "minsLower": { - "message": "minuti" - }, - "hourLower": { - "message": "ora" - }, - "hoursLower": { - "message": "ore" - }, - "youHaveSavedTime": { - "message": "Hai fatto risparmiare", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "youHaveSavedTimeEnd": { - "message": " delle loro vite", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "statusReminder": { - "message": "Controlla status.sponsor.ajay.app per lo stato del server." - }, - "changeUserID": { - "message": "Importa/Esporta il Tuo UserID Privato" - }, - "whatChangeUserID": { - "message": "Questo dovrebbe esser mantenuto privato. È come una password e non dovrebbe esser condiviso con nessuno. Se qualcuno lo possiede, può impersonarti. Se stai cercando il tuo userID pubblico, clicca l'icona degli appunti nel popup." - }, - "setUserID": { - "message": "Imposta UserID Privato" - }, - "userIDChangeWarning": { - "message": "Attenzione: La modifica dell'UserID Privato è permanente. Sei sicuro di volerlo fare? Assicurati di effettuare il backup di quello precedente." - }, - "createdBy": { - "message": "Creato da" - }, - "supportOtherSites": { - "message": "Supporta siti di YouTube di terze parti" - }, - "supportOtherSitesDescription": { - "message": "Supporta client YouTube di terze parti. Per abilitare il supporto, devi accettare i permessi aggiuntivi. Questo NON funziona in incognito su Chrome e altre varianti di Chromium.", - "description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube" - }, - "supportedSites": { - "message": "Pagine supportate: " - }, - "optionsInfo": { - "message": "Abilita supporto invidioso, disabilita salto automatico, nascondi i pulsanti e altro ancora." - }, - "addInvidiousInstance": { - "message": "Aggiungi Istanza Client 3Rd-Party" - }, - "addInvidiousInstanceDescription": { - "message": "Aggiungi un'istanza personalizzata. Deve essere formattata SOLO con il dominio. Esempio: invidious.ajay.app" - }, - "add": { - "message": "Aggiungi" - }, - "addInvidiousInstanceError": { - "message": "Questo è un dominio non valido. Questo dovrebbe includere SOLO la parte del dominio. Esempio: invidious.ajay.app" - }, - "resetInvidiousInstance": { - "message": "Reimposta la lista di istanze Invidious" - }, - "resetInvidiousInstanceAlert": { - "message": "Stai per reimpostare la lista di istanze di Invidious" - }, - "currentInstances": { - "message": "Istanze Attuali:" - }, - "minDuration": { - "message": "Durata minima (secondi):" - }, - "minDurationDescription": { - "message": "I segmenti più brevi del valore impostato non verranno saltati o visualizzati nel lettore." - }, - "enableManualSkipOnFullVideo": { - "message": "Usa il salto manuale quando esiste un'etichetta del video completo" - }, - "whatManualSkipOnFullVideo": { - "message": "Per le persone che vogliono guardare il video senza interruzioni se contiene sponsorizzazioni o auto-promozioni." - }, - "skipNoticeDuration": { - "message": "Salta durata avviso (secondi):" - }, - "skipNoticeDurationDescription": { - "message": "L'avviso salta rimarrà sullo schermo per almeno questo tempo. Per saltarlo manualmente, potrebbe esser visibile più a lungo." - }, - "shortCheck": { - "message": "Il seguente contributo è più breve della tua opzione di durata minima. Ciò potrebbe significare che questo è già stato inviato e viene semplicemente ignorato a causa di questa opzione. Sei sicuro di voler inviare?" - }, - "liveOrPremiere": { - "message": "Inviare segmenti per una live o premiere non è consentito. Per favore aspetta che finisca, poi ricarica la pagina e verifica che i segmenti siano ancora validi." - }, - "showUploadButton": { - "message": "Mostra Pulsante di Caricamento" - }, - "customServerAddress": { - "message": "Indirizzo Server SponsorBlock" - }, - "customServerAddressDescription": { - "message": "L'indirizzo che SponsorBlock usa per effettuare richieste al server. Questo non dovrebbe essere modificato a meno che tu non abbia un tuo server." - }, - "save": { - "message": "Salva" - }, - "reset": { - "message": "Reimposta" - }, - "customAddressError": { - "message": "Questo indirizzo non è nel formatto corretto. Assicurati di avere http:// o https:// all'inizio e nessuno slash alla fine." - }, - "areYouSureReset": { - "message": "Sei sicuro di voler eseguire il reset?" - }, - "mobileUpdateInfo": { - "message": "m.youtube.com è ora supportato" - }, - "exportOptions": { - "message": "Importa/Esporta Tutte Le Opzioni" - }, - "exportOptionsCopy": { - "message": "Modifica/copia" - }, - "exportOptionsDownload": { - "message": "Salva su file" - }, - "exportOptionsUpload": { - "message": "Carica da file" - }, - "whatExportOptions": { - "message": "Questa è la tua intera configurazione in JSON. Ciò include il tuo UserID Privato, quindi assicurati di condividerla saggiamente." - }, - "setOptions": { - "message": "Imposta Opzioni" - }, - "exportOptionsWarning": { - "message": "Attezione: La modifica delle opzioni è permanente e può interrompere l'installazione. Sei sicuro di voler proseguire? Assicurati di aver eseguito un backup per ogni evenienza." - }, - "incorrectlyFormattedOptions": { - "message": "Questo JSON non è stato correttamente formattato. Le tue opzioni non sono state modificate." - }, - "confirmNoticeTitle": { - "message": "Invia Segmento" - }, - "submit": { - "message": "Invia" - }, - "cancel": { - "message": "Annulla" - }, - "delete": { - "message": "Elimina" - }, - "preview": { - "message": "Anteprima" - }, - "unsubmitted": { - "message": "Non inviato" - }, - "inspect": { - "message": "Esamina" - }, - "edit": { - "message": "Modifica" - }, - "copyDebugInformation": { - "message": "Copia Informazioni di Debug Negli Appunti" - }, - "copyDebugInformationFailed": { - "message": "Impossibile scrivere negli Appunti" - }, - "copyDebugInformationOptions": { - "message": "Copia le informazioni negli appunti da fornire a uno sviluppatore quando si registra un bug / quando uno sviluppatore lo richiede. Le informazioni sensibili come l'ID utente, i canali e l'indirizzo del server personalizzato sono stati rimossi. Tuttavia contiene informazioni come il tuo useragent, browser, sistema operativo e numero di versione di estensione. " - }, - "copyDebugInformationComplete": { - "message": "Le informazioni di debug sono state copiate nel clip board. Sentiti libero di rimuovere tutte le informazioni che preferisci non condividere. Salva in un file di testo o incollale nella segnalazione di bug." - }, - "keyAlreadyUsed": { - "message": "Questa scorciatoia è associata ad un'altra azione. Selezionane una diversa." - }, - "to": { - "message": "a", - "description": "Used between segments. Example: 1:20 to 1:30" - }, - "CopiedExclamation": { - "message": "Copiato!", - "description": "Used after something has been copied to the clipboard. Example: 'Copied!'" - }, - "generic_guideline1": { - "message": "Includi transizioni" - }, - "generic_guideline2": { - "message": "Riproduci come se nulla fosse stato saltato" - }, - "category_sponsor": { - "message": "Sponsorizzazione" - }, - "category_sponsor_description": { - "message": "Promozione a pagamento, referral a pagamento e pubblicità diretta. Non per auto-promozione o ringraziamenti gratuiti a cause/creatori/siti web/ prodotti di loro gradimento." - }, - "category_sponsor_guideline1": { - "message": "Promozioni a pagamento" - }, - "category_sponsor_guideline2": { - "message": "Non per donazioni o merchandise personalizzato" - }, - "category_selfpromo": { - "message": "Promozione non pagata/Autopromozione" - }, - "category_selfpromo_description": { - "message": "Simile alle \"sponsorizzazioni\" tranne che per promozioni non pagate o autopromozioni. Ciò include sezioni riguardanti vendita di merce, donazioni o informazioni in merito a collaboratori." - }, - "category_selfpromo_guideline1": { - "message": "Donazioni, abbonamenti e merce personalizzata" - }, - "category_selfpromo_guideline2": { - "message": "Shoutout non pagati che non aggiungono nulla al video" - }, - "category_selfpromo_guideline3": { - "message": "Non per prodotti progettati da aziende e merce" - }, - "category_exclusive_access": { - "message": "Accesso Esclusivo" - }, - "category_exclusive_access_description": { - "message": "Solo per etichettare interi video. Usato quando un video mostra un prodotto, un servizio o un posto che hanno ricevuto gratuitamente o a cui hanno avuto un accesso sovvenzionato." - }, - "category_exclusive_access_pill": { - "message": "Questo video mostra un prodotto, un servizio o un posto che hanno ricevuto gratuitamente o a cui hanno avuto un accesso sovvenzionato", - "description": "Short description for this category" - }, - "category_exclusive_access_guideline1": { - "message": "L'intero video mostra qualcosa con accesso gratuito o sovvenzionato" - }, - "category_interaction": { - "message": "Promemoria d'Interazione (Iscrizione)" - }, - "category_interaction_description": { - "message": "Quando nel punto centrale del contenuto è presente un breve promemoria per like, iscrizione o follow. Se dovesse risultare esteso o riguardante qualcosa di specifico, potrebbe essere auto-promozione." - }, - "category_interaction_guideline1": { - "message": "Brevi promemoria per mi piace, iscrizioni o follow" - }, - "category_interaction_guideline2": { - "message": "Include promemoria indiretti al commento" - }, - "category_interaction_guideline3": { - "message": "Non per promozione generale, solo chiamata all'azione" - }, - "category_interaction_short": { - "message": "Promemoria d'Interazione" - }, - "category_intro": { - "message": "Intermezzo/Intro Animata" - }, - "category_intro_description": { - "message": "Un intervallo senza contenuto effettivo. Potrebbe essere una pausa, una schermata statica, un'animazione ripetuta. Non dovrebbe essere usato per transizioni contenenti informazioni." - }, - "category_intro_short": { - "message": "Intermezzo" - }, - "category_intro_guideline1": { - "message": "Intervallo senza contenuto effettivo" - }, - "category_intro_guideline2": { - "message": "Non per transizioni con informazioni" - }, - "category_outro": { - "message": "Conclusioni/Titoli di Coda" - }, - "category_outro_description": { - "message": "I titoli di coda o quando vengono mostrate annotazioni a fine video su YouTube. Non per conclusioni provviste di informazioni." - }, - "category_outro_guideline1": { - "message": "Non include contenuti, anche se le schede finali sono a schermo" - }, - "category_preview": { - "message": "Anteprima/Riepilogo" - }, - "category_preview_description": { - "message": "Raccolta di clip che mostra cosa succederà in questo video o altri video in una serie, in cui tutte le informazioni sono ripetute in seguito nel video." - }, - "category_preview_guideline1": { - "message": "Clip che appaiono più tardi in questo video, oppure in un video futuro" - }, - "category_preview_guideline2": { - "message": "Riepilogo o riassunto di un video precedente" - }, - "category_preview_guideline3": { - "message": "Non per sezioni che aggiungono contenuti in più" - }, - "category_filler": { - "message": "Riempitivi irrilevanti/Battute" - }, - "category_filler_description": { - "message": "Scene tangenziali aggiunte solo come riempimento o per umorismo, non necessarie alla comprensione del contenuto principale del video. Questo non dovrebbe includere i segmenti che forniscono contesto o dettagli di background. Questa è una categoria molto aggressiva, pensata per quanto non hai voglia di \"divertirti\"." - }, - "category_filler_short": { - "message": "Filler" - }, - "category_filler_guideline1": { - "message": "Scene non correlate usate solo per filler o umorismo" - }, - "category_filler_guideline2": { - "message": "Distrazioni, blooper, replay" - }, - "category_filler_guideline3": { - "message": "Non per scene necessarie a capire l'argomento" - }, - "category_music_offtopic": { - "message": "Musica: Sezione Non-Musicale" - }, - "category_music_offtopic_description": { - "message": "Solo per video musicali. Dovrebbe essere usata solo per sezioni di video musicali non già comprese in un'altra categoria." - }, - "category_music_offtopic_short": { - "message": "Non-Musicale" - }, - "category_music_offtopic_guideline1": { - "message": "Sezioni non presenti nelle release ufficiali" - }, - "category_music_offtopic_guideline2": { - "message": "Sezioni senza musica in una performance dal vivo" - }, - "category_poi_highlight": { - "message": "Highlight" - }, - "category_poi_highlight_description": { - "message": "La parte del video che gran parte delle persone stanno cercando. Simile ai commenti \"Il video inizia a x\"." - }, - "category_poi_highlight_guideline1": { - "message": "La parte che la maggior parte delle persone sta cercando" - }, - "category_poi_highlight_guideline2": { - "message": "Può ignorare il contesto" - }, - "category_poi_highlight_guideline3": { - "message": "Può portare al titolo o alla miniatura del video" - }, - "category_chapter": { - "message": "Capitolo" - }, - "category_chapter_description": { - "message": "Capitoli personalizzati che descrivono le sezioni principali di un video." - }, - "category_chapter_guideline1": { - "message": "Non menzionare i nomi degli sponsor" - }, - "category_chapter_guideline2": { - "message": "Usa capitoli più grandi per le sezioni generali" - }, - "category_chapter_guideline3": { - "message": "I capitoli più piccoli possono essere collocati all'interno di quelli più grandi" - }, - "category_livestream_messages": { - "message": "Livestream: Donazione/Letture dei Messaggi" - }, - "category_livestream_messages_short": { - "message": "Lettura Messaggi" - }, - "autoSkip": { - "message": "Salta Automaticamente" - }, - "manualSkip": { - "message": "Salto Manuale" - }, - "showOverlay": { - "message": "Mostra nella Barra di Ricerca" - }, - "disable": { - "message": "Disattiva" - }, - "autoSkip_POI": { - "message": "Salta automaticamente all'avvio" - }, - "manualSkip_POI": { - "message": "Chiedi quando il video carica" - }, - "showOverlay_POI": { - "message": "Mostra Nella Barra di Ricerca" - }, - "showOverlay_full": { - "message": "Mostra Etichetta" - }, - "showOverlay_chapter": { - "message": "Mostra Capitoli" - }, - "autoSkipOnMusicVideos": { - "message": "Salta automaticamente tutti i segmenti quando c'è un segmento non musicale" - }, - "muteSegments": { - "message": "Silenzia i segmenti invece di saltarli, quando possibile" - }, - "fullVideoSegments": { - "message": "Mostra un'icona quando un video è interamente una pubblicità", - "description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo" - }, - "previewColor": { - "message": "Segmento non inviato", - "description": "Referring to submissions that have not been sent to the server yet." - }, - "seekBarColor": { - "message": "Colore Barra di Ricerca" - }, - "category": { - "message": "Categoria" - }, - "skipOption": { - "message": "Salta Opzione", - "description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)" - }, - "enableTestingServer": { - "message": "Attiva Server di Beta Testing" - }, - "whatEnableTestingServer": { - "message": "I tuoi invii e voti NON CONTERANNO nel il server principale. Usa questa opzione solo per test." - }, - "testingServerWarning": { - "message": "Tutti i contributi e i voti NON VERRANNO CONTATI verso il server principale durante la connessione al server di prova. Assicurarsi di disabilitare questa opzione quando si desidera fare reali contributi." - }, - "bracketNow": { - "message": "(Ora)" - }, - "moreCategories": { - "message": "Più Categorie" - }, - "chooseACategory": { - "message": "Scegli una Categoria" - }, - "enableThisCategoryFirst": { - "message": "Per inviare segmenti della categoria \"{0}\", è necessario abilitarlo nelle opzioni. Sarai reindirizzato alle opzioni.", - "description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options." - }, - "poiOnlyOneSegment": { - "message": "Attenzione: questo tipo di segmento può essere presente una sola volta. Inviarne più di uno causerà la visualizzazione casuale di uno solo." - }, - "youMustSelectACategory": { - "message": "Devi selezionare una categoria per tutti i segmenti che stai inviando!" - }, - "bracketEnd": { - "message": "(Fine)" - }, - "End": { - "message": "Fine", - "description": "Button that skips to the end of a segment" - }, - "hiddenDueToDownvote": { - "message": "nascosto: downvote" - }, - "hiddenDueToDuration": { - "message": "nascosto: troppo corto" - }, - "manuallyHidden": { - "message": "nascosta manualmente" - }, - "channelDataNotFound": { - "description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.", - "message": "L'ID del canale non è ancora caricato. Se stai usando un video incorporato, prova piuttosto a usare la pagina principale di YouTube. Questo potrebbe esser causato dalle modifiche al layout di YouTube, se pensi che sia così, scrivi qui un commento:" - }, - "invidiousPermissionRefresh": { - "message": "Il browser ha revocato il permesso necessario per funzionare su Invidious e altri siti di terze parti. Clicca sul pulsante qui sotto per riattivare questo permesso." - }, - "acceptPermission": { - "message": "Accetta autorizzazione" - }, - "permissionRequestSuccess": { - "message": "Richiesta di autorizzazione riuscita!" - }, - "permissionRequestFailed": { - "message": "Richiesta di assicurazione fallita, hai cliccato nega?" - }, - "adblockerIssueWhitelist": { - "message": "Se non riesci a risolverlo, disabilita allora l'impostazione 'Forza Controllo Canale Prima di Saltare', poiché SponsorBlock non è in grado di recuperare le informazioni del canale per questo video" - }, - "forceChannelCheck": { - "message": "Forza controllo canale prima di andare avanti" - }, - "whatForceChannelCheck": { - "message": "Di default, verranno saltati i segmenti subito, anche prima che si sappia il canale. Di default, alcuni segmenti all'inizio del video potrebbero essere saltati sui canali nella whitelist. L'attivazione di questa opzione eviterà che ciò accada, ma ogni salto avrà un leggero ritardo in quanto ottenere l'ID del canale può richiedere un certo tempo. Questo ritardo potrebbe essere impercettibile se si dispone di una connessione internet veloce." - }, - "forceChannelCheckPopup": { - "message": "Considera l'Attivazione dell'opzione \"Forza la Verifica del Canale Prima del Salto\"" - }, - "downvoteDescription": { - "message": "Tempo Non Corretto/Errato" - }, - "incorrectVote": { - "message": "Non corretto" - }, - "harmfulVote": { - "message": "Dannoso", - "description": "Used for chapter segments when the text is harmful/offensive to remove it faster" - }, - "incorrectCategory": { - "message": "Cambia Categoria" - }, - "nonMusicCategoryOnMusic": { - "message": "Questo video è classificato come musica. Sei sicuro che questo video contenga uno sponsor? Se questo è in realtà un \"Segmento Non-Musica\", apri le opzioni di questa estensione e abilita questa categoria. Quindi, è possibile inviare questo segmento come \"Non-Music\" invece di sponsor. Si prega di leggere la guida se si è confusi." - }, - "multipleSegments": { - "message": "Segmenti Multipli" - }, - "guidelines": { - "message": "Linee guida" - }, - "readTheGuidelines": { - "message": "Leggi Le Linee Guide!!", - "description": "Show the first time they submit or if they are \"high risk\"" - }, - "categoryUpdate1": { - "message": "Le categorie sono qui!" - }, - "categoryUpdate2": { - "message": "Apri queste opzioni per saltare le introduzioni, conclusioni, vendita di prodotti ecc." - }, - "help": { - "message": "Aiuto" - }, - "GotIt": { - "message": "Capito", - "description": "Used as the button to dismiss a tooltip" - }, - "fullVideoTooltipWarning": { - "message": "Questo segmento è grande. Se l'intero video è su un argomento, passa da \"Salta\" a \"Video Completo\". Vedi le linee guida per ulteriori informazioni." - }, - "categoryPillTitleText": { - "message": "Questo intero video è etichettato come questa categoria ed è troppo integrato per poterlo separarare" - }, - "chapterNameTooltipWarning": { - "message": "Uno dei nomi dei tuoi capitoli è simile a una categoria. Quando possibile dovresti usare le categorie." - }, - "experiementOptOut": { - "message": "Disiscriviti dagli esperimenti futuri", - "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": "Nascondi per sempre" - }, - "warningChatInfo": { - "message": "Abbiamo notato che stavi facendo alcuni errori comuni che non sono dannosi" - }, - "warningTitle": { - "message": "Hai ricevuto un avviso" - }, - "questionButton": { - "message": "Ho una domanda" - }, - "warningConfirmButton": { - "message": "Capisco il motivo" - }, - "warningError": { - "message": "Errore durante il tentativo di riconoscere l'avviso:" - }, - "Donate": { - "message": "Dona" - }, - "considerDonating": { - "message": "Contribuisci allo sviluppo del fondo" - }, - "hideDonationLink": { - "message": "Nascondi Link di Donazione" - }, - "darkModeOptionsPage": { - "message": "Pagina Delle Opzioni In Modalità Scura" - }, - "helpPageThanksForInstalling": { - "message": "Grazie per aver installato SponsorBlock." - }, - "helpPageReviewOptions": { - "message": "Sei pregato di revisionare le seguenti opzioni" - }, - "helpPageFeatureDisclaimer": { - "message": "Molte funzionalità sono disabilitate di default. Se vuoi saltare intro, outro, usare Invidious, etc. abilitale sotto. Puoi anche nascondere/mostrare gli elementi dell'UI." - }, - "helpPageHowSkippingWorks": { - "message": "Come funziona il salto" - }, - "helpPageHowSkippingWorks1": { - "message": "I segmenti video saranno automaticamente ignorati se sono trovati nel database. Puoi aprire il popup cliccando l'icona dell'estensione per ottenere un'anteprima di cosa sono." - }, - "helpPageHowSkippingWorks2": { - "message": "Ogni volta che salti un segmento, sarai avvisato. Se il momento sembra sbagliato, vota in negativo cliccando downvote! Puoi anche votare nel popup." - }, - "Submitting": { - "message": "Inviando" - }, - "helpPageSubmitting1": { - "message": "L'invio può esser eseguito nel popup cliccando il pulsante il \"Segmento Inizia Ora\" o nel lettore video con i pulsanti sul lettore." - }, - "helpPageSubmitting2": { - "message": "Cliccare il pulsante di riproduzione indica l'inizio di un segmento e cliccare l'icona di interruzione indica la fine. Puoi preparare più sponsor prima di cliccare invio. Cliccare il pulsante carica invierà. Cliccare il cestino eliminerà." - }, - "Editing": { - "message": "Modifica" - }, - "helpPageEditing1": { - "message": "Se hai fatto casino, puoi modificare o eliminare i tuoi segmenti dopo aver cliccato il pulsante della freccia in su." - }, - "helpPageTooSlow": { - "message": "Questo è troppo lento" - }, - "helpPageTooSlow1": { - "message": "Esistono dei tasti di scelta rapida se desideri usarli. Premi il tasto del punto e virgola per indicare l'inizio/la fine di un segmento dello sponsor e clicca l'apostrofo per inviare. Questi sono modificabili nelle opzioni. Se non usi QWERTY, dovresti probabilmente cambiare l'associazione dei tasti." - }, - "helpPageCopyOfDatabase": { - "message": "Posso ottenere una copia del Database? Che succede se scompari?" - }, - "helpPageCopyOfDatabase1": { - "message": "Il database è pubblico e disponibile a" - }, - "helpPageCopyOfDatabase2": { - "message": "Il codice sorgente è liberamente disponibile. Quindi, anche se mi succede qualcosa, i tuoi contributi non saranno persi." - }, - "helpPageNews": { - "message": "Notizie e come è fatto" - }, - "helpPageSourceCode": { - "message": "Dove posso ottenere il codice sorgente?" - }, - "Credits": { - "message": "Crediti" - }, - "LearnMore": { - "message": "Scopri di Più" - }, - "FullDetails": { - "message": "Visualizza Dettagli Completi" - }, - "CopyDownvoteButtonInfo": { - "message": "Vota negativamente e crea una copia locale da reinviare" - }, - "OpenCategoryWikiPage": { - "message": "Apri la pagina della wiki di questa categoria." - }, - "CopyAndDownvote": { - "message": "Copia e vota negativamente" - }, - "ContinueVoting": { - "message": "Continua a Votare" - }, - "ChangeCategoryTooltip": { - "message": "Questo si applicherà istantaneamente ai tuoi segmenti" - }, - "downvote": { - "message": "Voto negativo" - }, - "upvote": { - "message": "Voto positivo" - }, - "hideSegment": { - "message": "Nascondi segmento" - }, - "skipSegment": { - "message": "Salta segmento" - }, - "playChapter": { - "message": "Riproduci capitolo" - }, - "SponsorTimeEditScrollNewFeature": { - "message": "Usa la rotellina del mouse passando sulla casella di modifica per regolare rapidamente il tempo. Le combinazioni dei tasti ctrl o shift sono utilizzabili per perfezionare le modifiche." - }, - "categoryPillNewFeature": { - "message": "Novità! Vedi quando un video è interamente sponsorizzato o auto-promosso" - }, - "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": "Interfaccia", - "description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabKeyBinds": { - "message": "Scorciatoie da tastiera", - "description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabBackup": { - "message": "Backup/Ripristina", - "description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabAdvanced": { - "message": "Varie", - "description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "noticeVisibilityLabel": { - "message": "Salta l'aspetto del preavviso", - "description": "Option label" - }, - "unbind": { - "message": "Dissocia", - "description": "Unbind keyboard shortcut" - }, - "notSet": { - "message": "Non impostato" - }, - "change": { - "message": "Modifica" - }, - "youtubeKeybindWarning": { - "message": "Questa è una scorciatoia integrata da YouTube. Sei sicuro di volerla usare?" - }, - "betaServerWarning": { - "message": "Il server BETA è abilitato!" - }, - "openOptionsPage": { - "message": "Apri la pagina delle opzioni" - }, - "resetToDefault": { - "message": "Ripristina le impostazioni predefinite" - }, - "confirmResetToDefault": { - "message": "Sei sicuro di voler reimpostare tutte le impostazioni ai valori predefiniti? Questo non può essere annullato." - }, - "exportSegments": { - "message": "Esporta segmenti" - }, - "importSegments": { - "message": "Importa i segmenti" - }, - "Import": { - "message": "Importa", - "description": "Button to initiate importing segments. Appears under the textbox where they paste in the data" - }, - "redeemSuccess": { - "message": "Riscattato correttamente!" - }, - "redeemFailed": { - "message": "Chiave di licenza non valida" - }, - "hideUpsells": { - "message": "Nascondi opzioni non disponibili senza pagamento aggiuntivo" - }, - "chooseACountry": { - "message": "Scegli un paese" - }, - "noDiscount": { - "message": "Non ti qualifichi per uno sconto" - }, - "discountLink": { - "message": "Link Sconto (Vedi il prezzo rosa)" - }, - "selectYourCountry": { - "message": "Seleziona il tuo paese" - }, - "alreadyDonated": { - "message": "Se hai donato qualsiasi importo prima di ora, puoi riscattare l'accesso gratuito contattando:", - "description": "After the colon is an email address" - }, - "cantAfford": { - "message": "Se non puoi permetterti di acquistare una licenza, premi {here} per vedere se hai diritto a uno sconto", - "description": "Keep the curly braces. The word 'here' should be translated as well." - }, - "patreonSignIn": { - "message": "Accedi con Patreon" - }, - "redeem": { - "message": "Riscatta" - }, - "joinOnPatreon": { - "message": "Supportami su Patreon" - }, - "oneTimePurchase": { - "message": "Acquisto una tantum" - }, - "enterLicenseKey": { - "message": "Inserisci chiave di licenza" - }, - "chaptersPage1": { - "message": "La funzionalità dei capitoli in crowd-sourcing di SponsorBlock è disponibile soltanto a coloro che acquistano una licenza o a coloro aventi l'accesso garantito gratuitamente grazie ai loro contributi passati" - }, - "chaptersPage2": { - "message": "Nota: L'autorizzazione a inviare i capitoli si basa ancora sulla reputazione calcolata. Acquistare una licenza ti consente di visualizzare soltanto i capitoli inviati dagli altri", - "description": "On the chapters page for getting access to the paid chapters feature" - }, - "chapterNewFeature": { - "message": "Nuova Funzionalità: Capitoli personalizzati in crowdsourcing. Sono sezioni dal nome personalizzato nei video, che possono esser impilate per essere sempre più precise. Acquista una licenza per visualizzare i capitoli inviati in questo video come: ", - "description": "After the comma, a list of chapters for this video will appear" - }, - "chapterNewFeature2": { - "message": "Nuova Funzionalità: Capitoli personalizzati in crowdsourcing. Sono sezioni dal nome personalizzato nei video, che possono esser impilate per essere sempre più precise. Hai accesso gratuitamente, abilitalo nelle opzioni." - }, - "unsubmittedSegmentCounts": { - "message": "Al momento hai {0} su {1}", - "description": "Example: You currently have 12 unsubmitted segments on 5 videos" - }, - "unsubmittedSegmentCountsZero": { - "message": "Al momento non hai segmenti non inviati", - "description": "Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments" - }, - "unsubmittedSegmentsSingular": { - "message": "segmento non inviato", - "description": "Example: You currently have 1 *unsubmitted segment* on 1 video" - }, - "unsubmittedSegmentsPlural": { - "message": "segmenti non inviati", - "description": "Example: You currently have 12 *unsubmitted segments* on 5 videos" - }, - "videosSingular": { - "message": "video", - "description": "Example: You currently have 3 unsubmitted segments on 1 *video*" - }, - "videosPlural": { - "message": "video", - "description": "Example: You currently have 12 unsubmitted segments on 5 *videos*" - }, - "clearUnsubmittedSegments": { - "message": "Elimina tutti i segmenti", - "description": "Label for a button in settings" - }, - "clearUnsubmittedSegmentsConfirm": { - "message": "Sei sicuro di voler cancellare tutti i segmenti non inviati?", - "description": "Confirmation message for the Clear unsubmitted segments button" - }, - "showUnsubmittedSegments": { - "message": "Mostra segmenti", - "description": "Show/hide button for the unsubmitted segments list" - }, - "hideUnsubmittedSegments": { - "message": "Nascondi segmenti", - "description": "Show/hide button for the unsubmitted segments list" - }, - "videoID": { - "message": "ID Video", - "description": "Header of the unsubmitted segments list" - }, - "segmentCount": { - "message": "Numero di segmenti", - "description": "Header of the unsubmitted segments list" - }, - "actions": { - "message": "Azioni", - "description": "Header of the unsubmitted segments list" - }, - "exportSegmentsAsURL": { - "message": "Condividi URL" - } -} diff --git a/public/_locales/ja/messages.json b/public/_locales/ja/messages.json deleted file mode 100644 index e77ae3e2..00000000 --- a/public/_locales/ja/messages.json +++ /dev/null @@ -1,1247 +0,0 @@ -{ - "fullName": { - "message": "SponserBlock for 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": "セグメント" - }, - "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": "閉じるアイコン" - }, - "SubmitTimes": { - "message": "セグメントを送信" - }, - "sortSegments": { - "message": "セグメントを並び替え" - }, - "submitCheck": { - "message": "本当に提出してよろしいですか?" - }, - "whitelistChannel": { - "message": "チャンネルをホワイトリストに追加" - }, - "removeFromWhitelist": { - "message": "ホワイトリストからチャンネルを削除" - }, - "voteOnTime": { - "message": "セグメントに投票" - }, - "Submissions": { - "message": "提案数" - }, - "savedPeopleFrom": { - "message": "みんなの時間をこれだけ節約しました: " - }, - "viewLeaderboard": { - "message": "リーダーボード" - }, - "recordTimesDescription": { - "message": "提出" - }, - "submissionEditHint": { - "message": "提出をクリックするとセクション編集画面が表示されます", - "description": "Appears in the popup to inform them that editing has been moved to the video player." - }, - "popupHint": { - "message": "心得: 利用者設定で提出時のキーバインドを設定できます" - }, - "clearTimesButton": { - "message": "時間を消去" - }, - "submitTimesButton": { - "message": "時間を提出" - }, - "publicStats": { - "message": "これは公開の統計ページであなたがどれだけ貢献したかを示すために使用され、ここで確認することができます: " - }, - "Username": { - "message": "ユーザー名" - }, - "setUsername": { - "message": "ユーザー名を設定" - }, - "copyPublicID": { - "message": "パブリックユーザIDをコピー" - }, - "copySegmentID": { - "message": "セグメントIDをコピー" - }, - "discordAdvert": { - "message": "公式Discordサーバーに参加して意見やフィードバックをお寄せください!" - }, - "hideThis": { - "message": "非表示にする" - }, - "Options": { - "message": "オプション" - }, - "showButtons": { - "message": "YouTube プレイヤーにボタンを表示" - }, - "hideButtons": { - "message": "YouTube プレイヤーにボタンを表示しない" - }, - "hideButtonsDescription": { - "message": "YouTube再生画面のセグメント提出ボタンを非表示にします。" - }, - "showSkipButton": { - "message": "「ハイライトまでスキップ」ボタンをプレイヤーに常に表示する" - }, - "showInfoButton": { - "message": "YouTubeプレイヤーに情報ボタンを表示する" - }, - "hideInfoButton": { - "message": "YouTubeプレイヤーに情報ボタンを表示しない" - }, - "autoHideInfoButton": { - "message": "情報ボタンを自動的に隠す" - }, - "hideDeleteButton": { - "message": "YouTube プレイヤーから削除ボタンを隠す" - }, - "showDeleteButton": { - "message": "YouTubeプレーヤーに削除ボタンを表示" - }, - "enableViewTracking": { - "message": "スキップの集計を有効にする" - }, - "whatViewTracking": { - "message": "この機能は、あなたがスキップしたセグメントを追跡して、そのセグメントがどれだけ役に立ったかを他のユーザーに知らせることで、スパムがデータベースに紛れないようにするための評価基準として使用されます。あなたがセグメントをスキップするたびに、拡張機能はサーバーにメッセージを送信します。使用回数の統計が正確になるよう、できる限り多くの人がこの設定を変更しないことを望みます。:)" - }, - "enableViewTrackingInPrivate": { - "message": "プライベート/シークレット タブでのスキップ回数の集計を有効にする" - }, - "enableTrackDownvotes": { - "message": "セグメントの低評価を記録" - }, - "whatTrackDownvotes": { - "message": "あなたが低評価したセグメントが再読み込み後も非表示のままになります" - }, - "trackDownvotesWarning": { - "message": "警告: 無効化するとこれまでの低評価記録が全て削除されます" - }, - "enableQueryByHashPrefix": { - "message": "ハッシュプレフィックスを使って要求" - }, - "whatQueryByHashPrefix": { - "message": "サーバーに区域を要求する際に,動画IDの代わりに動画IDのハッシュから最初の4文字を送信します。それに対して,サーバーは類似したハッシュを持つすべての動画の情報を応答します。" - }, - "enableRefetchWhenNotFound": { - "message": "新しい動画ではセグメントを再取得する" - }, - "whatRefetchWhenNotFound": { - "message": "動画がまだ新しくセグメントが見つからない場合は、動画を視聴している間、数分おきにセグメントを検索し続けます。" - }, - "enableShowCategoryWithoutPermission": { - "message": "提出権限を持っていないカテゴリーも提出メニューに表示する" - }, - "whatShowCategoryWithoutPermission": { - "message": "一部のカテゴリーは提出に一定以上の評判が必要です" - }, - "showNotice": { - "message": "再度通知を表示する" - }, - "showSkipNotice": { - "message": "セグメントがスキップされた後に通知を表示する" - }, - "showCategoryGuidelines": { - "message": "カテゴリーのヘルプを表示" - }, - "noticeVisibilityMode0": { - "message": "通常サイズのスキップ通知" - }, - "noticeVisibilityMode1": { - "message": "自動スキップ時に小サイズの通知" - }, - "noticeVisibilityMode2": { - "message": "常に小サイズのスキップ通知" - }, - "noticeVisibilityMode3": { - "message": "自動スキップ時に透過タイプの通知" - }, - "noticeVisibilityMode4": { - "message": "常に透過タイプのスキップ通知" - }, - "longDescription": { - "message": "SponsorBlockはスポンサー、イントロ、アウトロ、チャンネル登録のお願いなど、YouTube動画の煩わしい部分をスキップします。SponsorBlockはYouTube動画のスポンサー付きセグメントなどの開始時間と終了時間を誰でも投稿できる、クラウドソースのブラウザ拡張機能です。一人がセグメントの情報を送信すると、この拡張機能を使用している他の全員が、スポンサー付きセグメントをスキップできるようになります。また、ミュージックビデオの音楽がない部分をスキップすることもできます。", - "description": "Full description of the extension on the store pages." - }, - "website": { - "message": "ウェブサイト", - "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" - }, - "nextChapterKeybind": { - "message": "次のチャプター", - "description": "Keybind label" - }, - "previousChapterKeybind": { - "message": "前のチャプター", - "description": "Keybind label" - }, - "keybindDescription": { - "message": "使用したいキーをキーボードで入力し、修飾キーを以下から選択してください。" - }, - "0": { - "message": "接続がタイムアウトになりました。インターネット接続をご確認ください。接続に問題がない場合、サーバーが混雑またはダウンしている可能性があります。" - }, - "disableSkipping": { - "message": "スキップ有効" - }, - "enableSkipping": { - "message": "スキップ無効" - }, - "yourWork": { - "message": "あなたの貢献", - "description": "Used to describe the section that will show you the statistics from your submissions." - }, - "502": { - "message": "サーバー側で問題が起きているようです。時間をおいて再び試してください。" - }, - "errorCode": { - "message": "エラーコード: " - }, - "skip": { - "message": "スキップ" - }, - "mute": { - "message": "ミュート" - }, - "full": { - "message": "動画全体", - "description": "Used for the name of the option to label an entire video as sponsor or self promotion." - }, - "skip_category": { - "message": "{0} をスキップしますか?" - }, - "mute_category": { - "message": "{0} をミュートしますか?" - }, - "skip_to_category": { - "message": "{0}までスキップしますか?", - "description": "Used for skipping to things (Skip to Highlight)" - }, - "skipped": { - "message": "{0}をスキップしました", - "description": "Example: Sponsor Skipped" - }, - "muted": { - "message": "{0}をミュートしました", - "description": "Example: Sponsor Muted" - }, - "skipped_to_category": { - "message": "{0}までスキップしました", - "description": "Used for skipping to things (Skipped to Highlight)" - }, - "disableAutoSkip": { - "message": "自動スキップを無効にする" - }, - "enableAutoSkip": { - "message": "自動スキップを有効にする" - }, - "audioNotification": { - "message": "スキップ時に通知音を鳴らす" - }, - "audioNotificationDescription": { - "message": "セグメントがスキップされた時に音を鳴らします。 無効 (もしくは自動スキップが無効) の場合、音は再生されません。" - }, - "showTimeWithSkips": { - "message": "スキップした分を除いた時間を表示する" - }, - "showTimeWithSkipsDescription": { - "message": "この時間は、シークバーの下にある現在の時間の隣に表示されます。これは、動画の合計時間からすべてのセグメントの時間を差し引いたもので「シークバーに表示」として設定されているセグメントも含まれます。" - }, - "youHaveSkipped": { - "message": "スキップした数: " - }, - "minLower": { - "message": "分" - }, - "minsLower": { - "message": "分" - }, - "hourLower": { - "message": "時間" - }, - "hoursLower": { - "message": "時間" - }, - "youHaveSavedTime": { - "message": "他の人々の時間をこれだけ節約しました:", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "youHaveSavedTimeEnd": { - "message": "(彼らの人生のうち)", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "statusReminder": { - "message": "サーバーの状態についてはstatus.sponsor.ajay.appを確認してください。" - }, - "changeUserID": { - "message": "プライベートユーザーIDをインポート/エクスポート" - }, - "whatChangeUserID": { - "message": "これは厳重に保管してください。これはパスワードのようなもので、誰とも共有すべきではありません。 他の誰かがこれを使って、あなたになりすますことができてしまいます。なおパブリックユーザーIDを探している場合は、ポップアップ内のクリップボードアイコンをクリックしてください。" - }, - "setUserID": { - "message": "プライベートユーザーIDを設定" - }, - "userIDChangeWarning": { - "message": "警告: プライベートユーザーIDの変更は恒久的です。本当に実行しますか? 念のため以前のユーザーIDは控えておいてください。" - }, - "createdBy": { - "message": "作成者:" - }, - "supportOtherSites": { - "message": "第三者製のYouTube関連サイトに対応" - }, - "supportOtherSitesDescription": { - "message": "第三者製のYouTubeクライアントに対応しました。有効にするには,追加の権限を受け入れる必要があります。これはChromeやその他のChromium系列の匿名閲覧状態では動作しません。", - "description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube" - }, - "supportedSites": { - "message": "対応サイト: " - }, - "optionsInfo": { - "message": "Invidious対応を有効にし、自動スキップを無効、GUIを非表示にします。" - }, - "addInvidiousInstance": { - "message": "サードパーティーのクライアントインスタンスを追加" - }, - "addInvidiousInstanceDescription": { - "message": "任意のインスタンスを追加できます。ドメイン名だけを記入してください。例: invidious.ajay.app" - }, - "add": { - "message": "追加" - }, - "addInvidiousInstanceError": { - "message": "無効なドメイン名です。ドメイン部分だけを含めてください。例: invidious.ajay.app" - }, - "resetInvidiousInstance": { - "message": "Invidiousインスタンス一覧を初期化" - }, - "resetInvidiousInstanceAlert": { - "message": "Invidiousインスタンス一覧を初期化しようとしています" - }, - "currentInstances": { - "message": "現在のインスタンス:" - }, - "minDuration": { - "message": "最小持続時間(秒):" - }, - "minDurationDescription": { - "message": "設定値より短いセグメントはスキップされず、プレーヤーにも表示されません。" - }, - "enableManualSkipOnFullVideo": { - "message": "動画全体のラベルが存在する場合は手動スキップを使用する" - }, - "whatManualSkipOnFullVideo": { - "message": "動画全体がスポンサー付きまたはセルフプロモーションである場合に、動画を邪魔されずに観たい方向け。" - }, - "skipNoticeDuration": { - "message": "スキップ通知の表示時間(秒):" - }, - "skipNoticeDurationDescription": { - "message": "飛び越し通知が画面上に表示され続ける時間です。手動で飛び越した場合は,より長く表示される可能性があります。" - }, - "shortCheck": { - "message": "提出しようとしている区間の長さが個人設定における最短時間よりも短かいです。これは,既に当区間は提出されており,個人設定によって無視されていることを意味します。本当に提出しますか?" - }, - "liveOrPremiere": { - "message": "ライブ配信中の動画やプレミア公開中の動画ではセグメントの提出はできません。配信が終了するまで待つか、ページを再読み込みしてセグメントがまだ有効かご確認ください。" - }, - "showUploadButton": { - "message": "アップロードボタンを表示" - }, - "customServerAddress": { - "message": "SponsorBlock サーバーアドレス" - }, - "customServerAddressDescription": { - "message": "SponsorBlockがサーバーへの呼び出しに用いるアドレスです。\n自分のサーバー実体を持っていない限り,この設定を変更してはいけません。" - }, - "save": { - "message": "保存" - }, - "reset": { - "message": "リセット" - }, - "customAddressError": { - "message": "このアドレスの形式は正しくありません。最初にhttp://あるいはhttps://があり,最後が斜線で終わっていないことを確かめてください。" - }, - "areYouSureReset": { - "message": "初期設定に戻します。よろしいですか?" - }, - "mobileUpdateInfo": { - "message": "m.youtube.com は現在サポートされています" - }, - "exportOptions": { - "message": "全ての設定をインポート/エクスポート" - }, - "exportOptionsCopy": { - "message": "編集/コピー" - }, - "exportOptionsDownload": { - "message": "ファイルに保存" - }, - "exportOptionsUpload": { - "message": "ファイルから読み込み" - }, - "whatExportOptions": { - "message": "これがJSON形式の設定項目全体になります。これにはあなたのプライベートユーザーIDが含まれているので、共有するときは注意してください。" - }, - "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": "不具合があった,あるいは開発者から要求があった際に提供する為の情報をクリップボードに写します。利用者ID,許可表にある番組,および個人サーバーのアドレスなどの機密情報は含まれていません。ただし,利用者エージェント,Web閲覧機,OS,および拡張機能の版番などの情報は含まれています。" - }, - "copyDebugInformationComplete": { - "message": "診断用情報がクリップボードに複製されました。共有したくない情報があればそこから削除できます。これをファイルに保存したり,不具合報告に貼り付けてください。" - }, - "keyAlreadyUsed": { - "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!'" - }, - "generic_guideline1": { - "message": "場面転換のつなぎ目も含める" - }, - "generic_guideline2": { - "message": "スキップしても自然に見えるようにする" - }, - "category_sponsor": { - "message": "スポンサー" - }, - "category_sponsor_description": { - "message": "報酬のある販売促進・製品紹介,および直接広告です。自己販促や好きな運動・製作者・Webサイト・製品に対する無報酬での宣伝とは違います。" - }, - "category_sponsor_guideline1": { - "message": "有料のプロモーション" - }, - "category_sponsor_guideline2": { - "message": "寄付やオリジナルグッズには使わない" - }, - "category_selfpromo": { - "message": "無報酬 / セルフプロモーション" - }, - "category_selfpromo_description": { - "message": "無報酬での宣伝あるいは自己販促であるという点を除いては「スポンサー」と同様です。商品、寄付、コラボ情報に関する内容を含みます。" - }, - "category_selfpromo_guideline1": { - "message": "寄付、メンバーシップ、オリジナルグッズ" - }, - "category_selfpromo_guideline2": { - "message": "動画とは関係のない呼びかけ" - }, - "category_selfpromo_guideline3": { - "message": "企業がデザインした製品やグッズには使わない" - }, - "category_exclusive_access": { - "message": "限定アクセス" - }, - "category_exclusive_access_description": { - "message": "動画全体に対してのみ付与できます。無償または補助金を受けて、製品、サービス、場所を紹介する動画に使用。" - }, - "category_exclusive_access_pill": { - "message": "この動画は無償または補助金を受けて利用した製品、サービス、または場所を紹介するものです", - "description": "Short description for this category" - }, - "category_exclusive_access_guideline1": { - "message": "動画全体が無料または補助金を受けてアクセスしたものを紹介するものである" - }, - "category_interaction": { - "message": "行動を促すメッセージ(チャンネル登録)" - }, - "category_interaction_description": { - "message": "動画の途中に挟まれる,高評価,チャンネル登録・通知の有効化を促す短かい場面。長かったり具体的な商品についての場面は,中断ではなく自己販売促進に分類するべきです。" - }, - "category_interaction_guideline1": { - "message": "高評価、登録、フォローの短いお願い" - }, - "category_interaction_guideline2": { - "message": "間接的なコメントのお願いも含む" - }, - "category_interaction_guideline3": { - "message": "一般的なプロモーションではなく、直接的な呼びかけのみに使用すること" - }, - "category_interaction_short": { - "message": "動画の間に挟まる告知" - }, - "category_intro": { - "message": "インターミッション / イントロアニメーション" - }, - "category_intro_description": { - "message": "意味のある内容を含まない場面です。一時停止,静止画面,繰り返される動作などが相等します。意味のある情報を含む転換場面に対しては使わないでください。" - }, - "category_intro_short": { - "message": "インターミッション" - }, - "category_intro_guideline1": { - "message": "実際のコンテンツを含まないインターバル" - }, - "category_intro_guideline2": { - "message": "情報を含むトランジションには使用しない" - }, - "category_outro": { - "message": "エンドカード/クレジット" - }, - "category_outro_description": { - "message": "提供表示やYouTubeの終了画面が表示されている場面。動画の内容を結論している場面には使用しないで下さい。" - }, - "category_outro_guideline1": { - "message": "画面上にエンドカードが表示されているかに関わらず、コンテンツを含めない" - }, - "category_preview": { - "message": "予告と前回の粗筋" - }, - "category_preview_description": { - "message": "この動画や他の動画でこのあと起きる内容など、今後再び登場する場面を連続的にまとめたクリップ。" - }, - "category_preview_guideline1": { - "message": "動画後ほどや将来の動画に登場する場面" - }, - "category_preview_guideline2": { - "message": "前回の動画のあらすじ" - }, - "category_preview_guideline3": { - "message": "新たなコンテンツを含むセクションには使用しない" - }, - "category_filler": { - "message": "繋ぎの話/冗談" - }, - "category_filler_description": { - "message": "動画の本編を理解するのに必要のない、繋ぎの話やユーモアによって脱線したシーン。これには、文脈や背景にある情報を含むセグメントを含めないでください。これは、あなたが楽しい気分になれないときなどのための、非常にアグレッシブなカテゴリーです。" - }, - "category_filler_short": { - "message": "繋ぎの話" - }, - "category_filler_guideline1": { - "message": "繋ぎの話やユーモアのみを含む本筋とは無関係な場面" - }, - "category_filler_guideline2": { - "message": "逸脱シーン、NGシーン、リプレイ" - }, - "category_filler_guideline3": { - "message": "トピックの理解に必要な場面には使用しない" - }, - "category_music_offtopic": { - "message": "音楽: 音楽以外のセクション" - }, - "category_music_offtopic_description": { - "message": "ミュージックビデオでの使用に限ります。他のカテゴリーに含まれていないミュージックビデオのセクションにのみ使用してください。" - }, - "category_music_offtopic_short": { - "message": "音楽以外の部分" - }, - "category_music_offtopic_guideline1": { - "message": "公式リリースには含まれないセクション" - }, - "category_music_offtopic_guideline2": { - "message": "ライブパフォーマンスにおける音楽以外の部分" - }, - "category_poi_highlight": { - "message": "ハイライト" - }, - "category_poi_highlight_description": { - "message": "多くの人が求めている動画の部分。「本編はXから開始」といったコメントのような機能です。" - }, - "category_poi_highlight_guideline1": { - "message": "多くの人々が求めているであろう内容のセクション" - }, - "category_poi_highlight_guideline2": { - "message": "それまでの文脈はスキップできるものである" - }, - "category_poi_highlight_guideline3": { - "message": "タイトルやサムネイルの場面までスキップできるものである" - }, - "category_chapter": { - "message": "チャプター" - }, - "category_chapter_description": { - "message": "動画の主要なセクションを説明するカスタムのチャプター名" - }, - "category_chapter_guideline1": { - "message": "スポンサーのブランド名には言及しない" - }, - "category_chapter_guideline2": { - "message": "全般的なセクションには大きなチャプターを使用する" - }, - "category_chapter_guideline3": { - "message": "大きいチャプターの中には小さいチャプターを設けられます" - }, - "category_livestream_messages": { - "message": "ライブ配信: 寄付/メッセージの読み上げ" - }, - "category_livestream_messages_short": { - "message": "寄付などの読み上げ" - }, - "autoSkip": { - "message": "自動スキップ" - }, - "manualSkip": { - "message": "手動スキップ" - }, - "showOverlay": { - "message": "シークバーに表示" - }, - "disable": { - "message": "無効" - }, - "autoSkip_POI": { - "message": "冒頭へ自動スキップ" - }, - "manualSkip_POI": { - "message": "動画を読み込んだ際に確認する" - }, - "showOverlay_POI": { - "message": "シークバーに表示" - }, - "showOverlay_full": { - "message": "ラベルを表示" - }, - "showOverlay_chapter": { - "message": "チャプターを表示" - }, - "autoSkipOnMusicVideos": { - "message": "非音楽区域がある場合,全区域を自動的に飛び越す" - }, - "muteSegments": { - "message": "スキップする代わりに音声をミュートしてセグメントを許可" - }, - "fullVideoSegments": { - "message": "動画全体が広告の場合にアイコンを表示", - "description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo" - }, - "previewColor": { - "message": "未確定の色", - "description": "Referring to submissions that have not been sent to the server yet." - }, - "seekBarColor": { - "message": "シークバーのカラー" - }, - "category": { - "message": "カテゴリ" - }, - "skipOption": { - "message": "スキップ設定", - "description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)" - }, - "enableTestingServer": { - "message": "ベータテストサーバーを有効にする" - }, - "whatEnableTestingServer": { - "message": "提出したセグメントと投票がメインサーバーで**取り扱われなく**なります。試験目的にのみ利用してください。" - }, - "testingServerWarning": { - "message": "テストサーバーに接続している間、全ての提出・投票はメインサーバーでは取り扱われなくなります。実際の提出・投票を行う際は、この設定を無効にしてください。" - }, - "bracketNow": { - "message": "(今)" - }, - "moreCategories": { - "message": "カテゴリーをさらに表示" - }, - "chooseACategory": { - "message": "カテゴリーを選択" - }, - "enableThisCategoryFirst": { - "message": "\"{0}\" のカテゴリでセグメントを送信するには、オプションでセグメントを有効にする必要があります。オプション画面にリダイレクトします。", - "description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options." - }, - "poiOnlyOneSegment": { - "message": "警告: このタイプのセグメントは一度に最大一つだけ有効にすることができます。複数送信するとランダムなものが表示されます。" - }, - "youMustSelectACategory": { - "message": "送信するすべてのセグメントにカテゴリを選択する必要があります!" - }, - "bracketEnd": { - "message": "(終了)" - }, - "End": { - "message": "終端へ", - "description": "Button that skips to the end of a segment" - }, - "hiddenDueToDownvote": { - "message": "低い評価の区間を無視する" - }, - "hiddenDueToDuration": { - "message": "あまりに短かい区間を無視する" - }, - "manuallyHidden": { - "message": "手動で非表示" - }, - "channelDataNotFound": { - "description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.", - "message": "番組IDがまだ読み込まれていません。埋め込み動画でご覧になっている場合は,代わりにYouTubeの公式サイトで再生してみてください。この問題はYouTubeの画面構成を変えた際にも発生する可能性があります。その場合は,こちらに意見をお書きください:" - }, - "invidiousPermissionRefresh": { - "message": "Invidiousなどのサードパーティーサイトで機能するために必要な権限をブラウザーが拒否しています。この権限を許可するには下のボタンをクリックしてください。" - }, - "acceptPermission": { - "message": "許可を承認する" - }, - "permissionRequestSuccess": { - "message": "許可リクエストが成功しました!" - }, - "permissionRequestFailed": { - "message": "権限要求に失敗しました。拒否をクリックしましたか?" - }, - "adblockerIssueWhitelist": { - "message": "これを解決できない場合は、設定「スキップする前にチャンネルチェックを強制」を無効にしてください。 SponsorBlockはこのビデオのチャンネル情報を取得できません。" - }, - "forceChannelCheck": { - "message": "スキップする前にチャンネルチェックを強制する" - }, - "whatForceChannelCheck": { - "message": "デフォルト設定では、チャンネル情報を取得する前にセグメントをスキップします。デフォルト設定では、ホワイトリストに追加されているチャンネルでも動画の先頭部分にあるセグメントがスキップされる場合があります。この設定を有効にするとこの挙動が回避されますが、channelIDの取得に時間がかかるため、すべてのスキップに遅延が発生します。高速なインターネット回線を使用している場合は気にならないかもしれません。" - }, - "forceChannelCheckPopup": { - "message": "「飛び越し前に強制的に番組を検査する」を有効にすることを検討してください" - }, - "downvoteDescription": { - "message": "不正確あるいは間違った時刻です" - }, - "incorrectVote": { - "message": "間違っている" - }, - "harmfulVote": { - "message": "有害である", - "description": "Used for chapter segments when the text is harmful/offensive to remove it faster" - }, - "incorrectCategory": { - "message": "カテゴリーを変更" - }, - "nonMusicCategoryOnMusic": { - "message": "この動画は音楽として分類されています。本当にこの動画にスポンサー部分がありますか? このセグメントが実際には「音楽以外のセグメント」である場合、設定画面からこのカテゴリーを有効にしてください。「スポンサー」の代わりに「音楽以外」としてセグメントを提出できます。お困りの場合は、ガイドラインを参照してください。" - }, - "multipleSegments": { - "message": "複数のセグメント" - }, - "guidelines": { - "message": "ガイドライン" - }, - "readTheGuidelines": { - "message": "ガイドラインを読んでください!!", - "description": "Show the first time they submit or if they are \"high risk\"" - }, - "categoryUpdate1": { - "message": "カテゴリはこちらです!" - }, - "categoryUpdate2": { - "message": "導入画面・終了画面・商品紹介などを飛び越す個人設定を開きます。" - }, - "help": { - "message": "ヘルプ" - }, - "GotIt": { - "message": "了解", - "description": "Used as the button to dismiss a tooltip" - }, - "fullVideoTooltipWarning": { - "message": "このセグメントは大きすぎます。動画全体が一つのトピックに当てはまる場合は「スキップ」を「動画全体」に変更してください。詳細はガイドラインを参照してください。" - }, - "categoryPillTitleText": { - "message": "この動画は全体がこのカテゴリーとして指定されており、密に結合されているため分割することができません" - }, - "chapterNameTooltipWarning": { - "message": "一部のチャプター名はカテゴリーにした方が良さそうです。可能な場合はカテゴリーを使用してください。" - }, - "experiementOptOut": { - "message": "実験的機能をすべて無効にする", - "description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private." - }, - "hideForever": { - "message": "二度と表示しない" - }, - "warningChatInfo": { - "message": "悪意によるものではないよくある間違いを犯していたようです" - }, - "warningTitle": { - "message": "警告を付与されました" - }, - "questionButton": { - "message": "質問があります" - }, - "warningConfirmButton": { - "message": "理由を理解しました" - }, - "warningError": { - "message": "警告の確認中にエラーが発生しました:" - }, - "Donate": { - "message": "寄付" - }, - "considerDonating": { - "message": "開発を支援する" - }, - "hideDonationLink": { - "message": "寄付のお願いを表示しない" - }, - "darkModeOptionsPage": { - "message": "オプション画面でダークモードを使用" - }, - "helpPageThanksForInstalling": { - "message": "SponsorBlockを導入いただきありがとうございます。" - }, - "helpPageReviewOptions": { - "message": "以下の設定を確認してください" - }, - "helpPageFeatureDisclaimer": { - "message": "多くの機能がデフォルトでは無効となっています。イントロ・アウトロをスキップしたり、Invidiousで使用したりするにはこの下で有効にしてください。また画面の表示設定を切り替えることもできます。" - }, - "helpPageHowSkippingWorks": { - "message": "スキップの仕組み" - }, - "helpPageHowSkippingWorks1": { - "message": "データベースにある動画区域が自動的に飛び越されます。この拡張機能のアイコンをクリックすると,区域の位置や範囲を確かめることができます。" - }, - "helpPageHowSkippingWorks2": { - "message": "区域を飛び越すたびに通知されます。区域の範囲がおかしいと思ったら,その区域を低評価してください。ポップアップ画面でも同様に投票ができます。" - }, - "Submitting": { - "message": "提出する" - }, - "helpPageSubmitting1": { - "message": "提出するにはポップアップの「セグメント開始を記録」ボタン、またはビデオプレーヤー内にあるボタンを押してください。" - }, - "helpPageSubmitting2": { - "message": "再生ボタンをクリックするとセグメントの開始、停止アイコンをクリックすると終了となります。 複数のスポンサーを用意してから送信ボタンを押すことができます。アップロードボタンをクリックすると提出されます。ゴミ箱をクリックすると削除されます。" - }, - "Editing": { - "message": "編集する" - }, - "helpPageEditing1": { - "message": "もし間違えてしまっても、上矢印ボタンをクリックでセグメントを編集・削除することができます。" - }, - "helpPageTooSlow": { - "message": "こんな操作は面倒?" - }, - "helpPageTooSlow1": { - "message": "ショートカットキーが利用可能です。セミコロンキーでスポンサーセグメントを開始/終了し、アポストロフィキーで送信できます。またこれらはオプションで変更できます。QWERTYキーを使わない場合は、キー割り当てを変更したほうがいいでしょう。" - }, - "helpPageCopyOfDatabase": { - "message": "データベースのコピーを利用できますか? 作者が失踪した場合はどうなりますか?" - }, - "helpPageCopyOfDatabase1": { - "message": "データベースは公開されており、こちらから利用できます:" - }, - "helpPageCopyOfDatabase2": { - "message": "ソースコードは自由に利用できます。運営になにがあろうとも,あなたの貢献(提出された区域)が失われることはありません。" - }, - "helpPageNews": { - "message": "お知らせと作成方法" - }, - "helpPageSourceCode": { - "message": "ソースコードの入手先" - }, - "Credits": { - "message": "謝辞" - }, - "LearnMore": { - "message": "さらに詳しく" - }, - "FullDetails": { - "message": "詳細" - }, - "CopyDownvoteButtonInfo": { - "message": "低評価を押し、再提出するためのローカルコピーを作成" - }, - "OpenCategoryWikiPage": { - "message": "このカテゴリーのWikiページを開きます。" - }, - "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": "これはYouTubeにデフォルトで使用されているショートカットです。本当にこれを使用しますか?" - }, - "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": "ライセンスを購入する余裕がない方は、{こちら} をクリックして割引が適用されるかどうか確認できます", - "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": "SponsorBlockのクラウドソーシングによるチャプター機能は、ライセンス購入をされた方、もしくは過去の貢献により許可された方のみが利用できます" - }, - "chaptersPage2": { - "message": "注: チャプターの提出権限は算出された評判に基づいています。ライセンスを購入することで、他の人が提出したチャプターを閲覧できるようになります", - "description": "On the chapters page for getting access to the paid chapters feature" - }, - "chapterNewFeature": { - "message": "新機能: クラウドソーシングによるカスタムチャプター。動画内のセクションを入れ子構造にできるので、より精密な区分けができます。この動画に登録されたチャプターを表示するにはライセンスをご購入ください。チャプターはこのように表示されます: ", - "description": "After the comma, a list of chapters for this video will appear" - }, - "chapterNewFeature2": { - "message": "新機能: クラウドソーシングによるカスタムチャプター。動画内のセクションを入れ子構造にできるので、より精密な区分けができます。あなたはこの機能に無料でアクセスできます。オプションより有効化してください。" - }, - "unsubmittedSegmentCounts": { - "message": "現在、{1} に {0} があります", - "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": "動画ID", - "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": "URLとして共有" - } -} diff --git a/public/_locales/kn/messages.json b/public/_locales/kn/messages.json deleted file mode 100644 index 0967ef42..00000000 --- a/public/_locales/kn/messages.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/public/_locales/ko/messages.json b/public/_locales/ko/messages.json deleted file mode 100644 index e3c04ece..00000000 --- a/public/_locales/ko/messages.json +++ /dev/null @@ -1,1247 +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": "닫기 아이콘" - }, - "SubmitTimes": { - "message": "구간 제출" - }, - "sortSegments": { - "message": "구간 정렬" - }, - "submitCheck": { - "message": "정말로 이걸 제출하시겠어요?" - }, - "whitelistChannel": { - "message": "화이트리스트에 채널 추가" - }, - "removeFromWhitelist": { - "message": "화이트리스트에서 채널 제거" - }, - "voteOnTime": { - "message": "구간 투표" - }, - "Submissions": { - "message": "제출" - }, - "savedPeopleFrom": { - "message": "나 덕분에 다른 분이 건너뛴 구간: " - }, - "viewLeaderboard": { - "message": "순위표" - }, - "recordTimesDescription": { - "message": "제출" - }, - "submissionEditHint": { - "message": "제출하고 나면 구간을 수정할 수 있게 돼요", - "description": "Appears in the popup to inform them that editing has been moved to the video player." - }, - "popupHint": { - "message": "도움말: 설정에서 제출 단축키를 설정하실 수 있어요" - }, - "clearTimesButton": { - "message": "구간 초기화" - }, - "submitTimesButton": { - "message": "구간 제출" - }, - "publicStats": { - "message": "얼마나 기여했는지 확인할 수 있는 공개 통계 페이지로 다음에서 확인하실 수 있어요." - }, - "Username": { - "message": "사용자명" - }, - "setUsername": { - "message": "사용자명 설정" - }, - "copyPublicID": { - "message": "공개 사용자 ID 복사" - }, - "copySegmentID": { - "message": "구간 ID 복사" - }, - "discordAdvert": { - "message": "공식 Discord 서버에 참가해서 의견과 피드백을 남겨주세요!" - }, - "hideThis": { - "message": "숨기기" - }, - "Options": { - "message": "설정" - }, - "showButtons": { - "message": "YouTube 탐색 바에서 버튼 표시" - }, - "hideButtons": { - "message": "YouTube 탐색 바에서 버튼 숨김" - }, - "hideButtonsDescription": { - "message": "건너뛸 구간을 제출할 수 있는 YouTube 탐색 바에 있는 버튼을 숨겨요." - }, - "showSkipButton": { - "message": "탐색 바에 하이라이트로 이동 버튼 표시" - }, - "showInfoButton": { - "message": "YouTube 탐색 바에서 정보 버튼 표시" - }, - "hideInfoButton": { - "message": "YouTube 탐색 바에서 정보 버튼 숨김" - }, - "autoHideInfoButton": { - "message": "정보 버튼 자동 숨김" - }, - "hideDeleteButton": { - "message": "YouTube 탐색 바에서 삭제 버튼 숨김" - }, - "showDeleteButton": { - "message": "YouTube 탐색 바에서 삭제 버튼 표시" - }, - "enableViewTracking": { - "message": "건너뛴 횟수 추적 사용" - }, - "whatViewTracking": { - "message": "이 기능으로 건너뛴 구간을 추적해서 사용자가 제출한 내용이 다른 분께 얼마나 도움이 되는지 알려주고 잘못된 구간이 데이터베이스에 들어가지 않도록 추천과 함께 분석에 사용해요. 이 확장 프로그램이 구간을 건너뛸 때마다 서버에 메시지를 보낼 거예요. 조회수가 정확하기 위해서는 이 설정을 변경하지 않기를 바라요. :)" - }, - "enableViewTrackingInPrivate": { - "message": "시크릿/사생활 보호 탭에서 건너뛴 횟수 추적 사용" - }, - "enableTrackDownvotes": { - "message": "비추천한 구간 저장" - }, - "whatTrackDownvotes": { - "message": "비추천한 구간을 새로고침 이후에도 계속 숨겨요" - }, - "trackDownvotesWarning": { - "message": "경고: 사용하지 않으면 이전에 저장된 비추천 구간이 삭제돼요" - }, - "enableQueryByHashPrefix": { - "message": "해시 접두사로 요청 전송" - }, - "whatQueryByHashPrefix": { - "message": "동영상 ID로 구간을 요청하는 대신, 동영상 ID의 처음 해시 4자리를 전송해요. 서버가 유사한 해시가 포함된 동영상의 데이터를 보낼 거예요." - }, - "enableRefetchWhenNotFound": { - "message": "새로운 동영상에서 구간 정보 자동 갱신" - }, - "whatRefetchWhenNotFound": { - "message": "새로운 동영상이고 구간을 찾지 못했다면, 동영상을 보는 동안 몇 분 단위로 구간 정보를 갱신해요." - }, - "enableShowCategoryWithoutPermission": { - "message": "제출 권한이 없는 카테고리도 제출 메뉴에 표시" - }, - "whatShowCategoryWithoutPermission": { - "message": "일부 카테고리는 최소 평판 요건을 만족해야 제출할 수 있는 권한이 부여돼요" - }, - "showNotice": { - "message": "알림을 다시 표시하기" - }, - "showSkipNotice": { - "message": "구간을 건너뛴 후 알림 표시" - }, - "showCategoryGuidelines": { - "message": "카테고리 도움말 표시" - }, - "noticeVisibilityMode0": { - "message": "모든 건너뛰기 알림 표시" - }, - "noticeVisibilityMode1": { - "message": "자동 건너뛰기 시 알림 축소" - }, - "noticeVisibilityMode2": { - "message": "모든 건너뛰기 알림 축소" - }, - "noticeVisibilityMode3": { - "message": "자동 건너뛰기 시 알림 숨김" - }, - "noticeVisibilityMode4": { - "message": "모든 건너뛰기 알림 숨김" - }, - "longDescription": { - "message": "SponsorBlock은 스폰서 광고, 인트로, 아웃트로, 구독 요청 구간과 같은 동영상 감상에 짜증 나는 구간을 건너뛸 수 있게 해줘요. SponsorBlock은 여러분이 참여하는 확장 프로그램으로 누구나 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" - }, - "nextChapterKeybind": { - "message": "다음 챕터", - "description": "Keybind label" - }, - "previousChapterKeybind": { - "message": "이전 챕터", - "description": "Keybind label" - }, - "keybindDescription": { - "message": "등록하고 싶은 키를 눌러주세요. 필요하다면 보조 키를 선택하실 수도 있어요." - }, - "0": { - "message": "연결에 실패했어요. 인터넷 연결을 확인하세요. 인터넷 연결이 되어 있는 경우, 서버가 과부화됐거나 다운된 것일 수도 있어요." - }, - "disableSkipping": { - "message": "건너뛰기 켜짐" - }, - "enableSkipping": { - "message": "건너뛰기 꺼짐" - }, - "yourWork": { - "message": "내가 한 일", - "description": "Used to describe the section that will show you the statistics from your submissions." - }, - "502": { - "message": "서버가 과부하 된 것 같아요. 몇 초 후에 다시 시도해보세요." - }, - "errorCode": { - "message": "오류 코드: " - }, - "skip": { - "message": "건너뛰기" - }, - "mute": { - "message": "음소거" - }, - "full": { - "message": "동영상 전체", - "description": "Used for the name of the option to label an entire video as sponsor or self promotion." - }, - "skip_category": { - "message": "{0} 카테고리를 건너뛸까요?" - }, - "mute_category": { - "message": "{0} 카테고리를 음소거할까요?" - }, - "skip_to_category": { - "message": "{0}로 이동할까요?", - "description": "Used for skipping to things (Skip to Highlight)" - }, - "skipped": { - "message": "{0}을 건너뜀", - "description": "Example: Sponsor Skipped" - }, - "muted": { - "message": "{0}이 음소거됨", - "description": "Example: Sponsor Muted" - }, - "skipped_to_category": { - "message": "{0}로 건너뛰었어요", - "description": "Used for skipping to things (Skipped to Highlight)" - }, - "disableAutoSkip": { - "message": "자동 건너뛰기 사용 안 함" - }, - "enableAutoSkip": { - "message": "자동 건너뛰기 사용" - }, - "audioNotification": { - "message": "건너뛸 때 소리 재생" - }, - "audioNotificationDescription": { - "message": "구간을 건너뛸 때마다 소리를 재생해요. 자동 건너뛰기를 사용하지 않는 경우, 아무 소리도 재생되지 않아요." - }, - "showTimeWithSkips": { - "message": "건너뛰기로 제외된 시간 표시" - }, - "showTimeWithSkipsDescription": { - "message": "탐색 바 아래에 있는 동영상 시간 옆 괄호에 시간이 표시돼요. 건너뛸 구간을 제외할 실제로 재생하게 될 동영상의 길이를 보여줘요. \"탐색 바에 표시\"로만 지정된 구간도 포함해요." - }, - "youHaveSkipped": { - "message": "건너뛴 구간: " - }, - "minLower": { - "message": "분" - }, - "minsLower": { - "message": "분" - }, - "hourLower": { - "message": "시간" - }, - "hoursLower": { - "message": "시간" - }, - "youHaveSavedTime": { - "message": "나 덕분에 다른 분이 건너뛴 구간:", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "youHaveSavedTimeEnd": { - "message": " 정도를 절약함", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "statusReminder": { - "message": "Status.sponsor.ajay.app 사이트를 확인하여 서버 상태를 확인하세요." - }, - "changeUserID": { - "message": "비공개 사용자 ID 가져오기/내보내기" - }, - "whatChangeUserID": { - "message": "이 정보를 다른 분께 공개하지 마세요. 비밀번호처럼 알려주면 위험한 정보랍니다. 다른 분이 이 정보를 가지고 나를 사칭할 수도 있어요. 공개 사용자 ID를 찾고 있다면, 팝업 내 클립보드 아이콘을 눌러주세요." - }, - "setUserID": { - "message": "비공개 사용자 ID 설정" - }, - "userIDChangeWarning": { - "message": "경고: 비공개 사용자 ID를 변경하면 되돌릴 수 없어요. 정말로 확실한가요? 혹시 모르니 예전 사용자 ID를 백업해두는 걸 권장해요." - }, - "createdBy": { - "message": "개발자: " - }, - "supportOtherSites": { - "message": "제3자 YouTube 사이트 지원" - }, - "supportOtherSitesDescription": { - "message": "제3자 YouTube 클라이언트에서도 기능을 지원하도록 해요. 이 기능을 사용하려면 추가 권한을 허용해야 해요. Chrome 및 다른 Chromium 계열 브라우저의 시크릿 모드에서는 작동하지 않아요. ", - "description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube" - }, - "supportedSites": { - "message": "지원되는 사이트: " - }, - "optionsInfo": { - "message": "Invidious 지원 활성화, 자동 건너뛰기 사용 안 함, 버튼 숨기기 등이 있어요." - }, - "addInvidiousInstance": { - "message": "제3자 클라이언트 인스턴스 추가" - }, - "addInvidiousInstanceDescription": { - "message": "맞춤 인스턴스를 추가해요. 도메인 형식으로 되어있어야 해요. 예시: invidious.ajay.app" - }, - "add": { - "message": "추가" - }, - "addInvidiousInstanceError": { - "message": "잘못된 도메인이에요. 도메인 부분만 포함해야 해요. 예시: invious.ajay.app" - }, - "resetInvidiousInstance": { - "message": "Invidious 인스턴스 목록 초기화" - }, - "resetInvidiousInstanceAlert": { - "message": "Invidious 인스턴스 목록을 초기화하시겠어요?" - }, - "currentInstances": { - "message": "현재 인스턴스:" - }, - "minDuration": { - "message": "최소 기간 (초):" - }, - "minDurationDescription": { - "message": "설정한 값보다 작은 구간은 건너뛰지 않으며 탐색 바에 표시되지 않아요." - }, - "enableManualSkipOnFullVideo": { - "message": "동영상 전체 라벨이 존재하는 경우 수동 건너뛰기 사용" - }, - "whatManualSkipOnFullVideo": { - "message": "전반적인 동영상 내용이 협찬이거나 자체 홍보인 경우에도 동영상을 계속 시청하고자 하는 분을 위한 설정이에요." - }, - "skipNoticeDuration": { - "message": "건너뛰기 알림 길이 (초):" - }, - "skipNoticeDurationDescription": { - "message": "몇 초간 건너뛰기 알림이 표시될지 지정해요. 수동 건너뛰기를 한 경우, 알림이 더 길게 표시될 수 있어요." - }, - "shortCheck": { - "message": "이 제출은 설정된 최소 기간보다 작아요. 이미 제출되었을 수도 있으며, 설정으로 인해 무시되었을 수도 있어요. 정말 제출하시겠어요?" - }, - "liveOrPremiere": { - "message": "진행 중인 실시간 스트림 및 최초 공개 동영상에는 제출할 수 없어요. 끝날 때까지 기다리신 후, 페이지를 새로고침한 후 유효한 구간을 확인해주세요." - }, - "showUploadButton": { - "message": "업로드 버튼 표시" - }, - "customServerAddress": { - "message": "SponsorBlock 서버 주소" - }, - "customServerAddressDescription": { - "message": "SponsorBlock이 서버에 연결을 보낼 주소예요.\n따로 구축한 서버 인스턴스가 없으면, 이 주소를 변경하지 않는 게 좋아요." - }, - "save": { - "message": "저장" - }, - "reset": { - "message": "초기화" - }, - "customAddressError": { - "message": "올바르지 않은 주소예요. http:// 또는 https://로 시작해야 하고 마지막 문자에 빗금이 있지 않아야 해요." - }, - "areYouSureReset": { - "message": "이걸 정말로 초기화하시겠어요?" - }, - "mobileUpdateInfo": { - "message": "이제 m.youtube.com 링크를 지원해요." - }, - "exportOptions": { - "message": "모든 설정 가져오기/내보내기" - }, - "exportOptionsCopy": { - "message": "수정/복사" - }, - "exportOptionsDownload": { - "message": "파일로 저장하기" - }, - "exportOptionsUpload": { - "message": "파일에서 불러오기" - }, - "whatExportOptions": { - "message": "JSON의 전체 구성 파일이에요. 나의 비공개 사용자 ID가 포함되어 있으니, 공유할 때 주의하세요." - }, - "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": "버그를 신고할 때나 개발자가 요청했을 때 필요한 디버그 정보를 클립보드에 복사해요. 사용자 ID, 화이트리스트 채널 목록, 맞춤 서버 주소 같은 민감한 정보는 포함되지 않아요. 디버그 정보에는 사용자 에이전트, 브라우저 정보, 사용 중인 운영 체제, 확장 프로그램의 버전 정보가 포함돼요. " - }, - "copyDebugInformationComplete": { - "message": "디버그 정보가 복사됐어요. 공유하고 싶지 않은 정보를 지우셔도 돼요. 텍스트 파일로 저장하거나 버그 신고 시 이걸 붙여넣기 해주세요." - }, - "keyAlreadyUsed": { - "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!'" - }, - "generic_guideline1": { - "message": "연속적인 전환이 포함된 구간이어야 함" - }, - "generic_guideline2": { - "message": "건너뛰더라도 동영상 내용이 자연스럽게 흘러가야 함" - }, - "category_sponsor": { - "message": "스폰서 광고 구간" - }, - "category_sponsor_description": { - "message": "이 구간은 유료 광고, 유료 협찬과 같은 직접적인 광고 내용이 포함됐어요. 대가 없는 광고, 자발적인 홍보 등은 여기에 해당하지 않아요." - }, - "category_sponsor_guideline1": { - "message": "유료 광고 구간" - }, - "category_sponsor_guideline2": { - "message": "후원과 자체 상품은 해당하지 않음" - }, - "category_selfpromo": { - "message": "홍보 구간" - }, - "category_selfpromo_description": { - "message": "이 구간은 \"스폰서 광고 구간\"과 유사하지만, 자발적으로 홍보하는 내용이 포함됐어요. 여기에는 채널 굿즈 광고, 기부 광고와 영상 제작에 참여한 사람을 홍보하는 광고가 해당돼요." - }, - "category_selfpromo_guideline1": { - "message": "후원, 멤버십, 자체 상품을 소개하는 구간이어야 함" - }, - "category_selfpromo_guideline2": { - "message": "동영상과 관련 없는 자발적인 홍보가 담긴 구간이어야 함" - }, - "category_selfpromo_guideline3": { - "message": "기업 제품과 상품은 해당하지 않음" - }, - "category_exclusive_access": { - "message": "협찬 구간" - }, - "category_exclusive_access_description": { - "message": "이 구간은 동영상이 유/무료 협찬을 받은 제품, 서비스, 장소를 소개하는 내용이 포함됐어요. 또한 이 카테고리는 동영상 전체에 해당돼요." - }, - "category_exclusive_access_pill": { - "message": "이 구간 내 동영상은 유/무료 협찬을 받은 제품, 서비스, 장소를 소개하는 내용이 포함됐어요.", - "description": "Short description for this category" - }, - "category_exclusive_access_guideline1": { - "message": "전반적인 동영상의 주제가 협찬을 받은 대상을 소개해야 함" - }, - "category_interaction": { - "message": "상호작용 알림 구간" - }, - "category_interaction_description": { - "message": "이 구간은 동영상 속에 좋아요, 구독, 팔로우를 요청하는 내용이 포함됐어요. 특정 무언가에 관한 내용이라면, \"홍보 구간\" 카테고리로 지정해야 해요." - }, - "category_interaction_guideline1": { - "message": "좋아요, 구독, 팔로우 등을 요청하는 구간이어야 함" - }, - "category_interaction_guideline2": { - "message": "간접적인 댓글 작성을 유도하는 구간이어야 함" - }, - "category_interaction_guideline3": { - "message": "일반적인 홍보가 아닌 행동을 요청하는 구간이어야 함" - }, - "category_interaction_short": { - "message": "상호작용 알림 구간" - }, - "category_intro": { - "message": "인트로/무음 구간" - }, - "category_intro_description": { - "message": "이 구간은 동영상 속에 반복되는 애니메이션이나 정적 프레임과 같은 내용이 포함됐어요. 전환 시 정보를 포함하는 구간은 여기에 해당하지 않아요." - }, - "category_intro_short": { - "message": "인트로/무음 구간" - }, - "category_intro_guideline1": { - "message": "콘텐츠가 없는 구간이어야 함" - }, - "category_intro_guideline2": { - "message": "정보가 포함된 구간이 아니어야 함" - }, - "category_outro": { - "message": "최종 화면 구간" - }, - "category_outro_description": { - "message": "이 구간은 최종 화면이나 크레딧 내용이 포함됐어요. 정보가 포함된 결론 부분은 여기에 해당하지 않아요." - }, - "category_outro_guideline1": { - "message": "최종 화면이 표시됐더라도, 콘텐츠가 포함되는 구간이 아니어야 함" - }, - "category_preview": { - "message": "미리보기/요약 구간" - }, - "category_preview_description": { - "message": "이 구간은 동영상의 뒷부분에서 반복되는 현재 동영상 또는 시리즈의 다른 동영상에 나온 정보를 보여주는 클립 모음이 해당돼요." - }, - "category_preview_guideline1": { - "message": "향후 동영상에 나타나는 장면이 있는 구간이어야 함" - }, - "category_preview_guideline2": { - "message": "이전 동영상을 요약하는 구간이어야 함" - }, - "category_preview_guideline3": { - "message": "추가 콘텐츠가 있는 구간이 아니어야 함" - }, - "category_filler": { - "message": "주제와 관련 없는 구간" - }, - "category_filler_description": { - "message": "이 구간은 전반적인 동영상의 주제를 이해하는 데 필요 없는 내용이 포함됐어요. 상세한 배경지식이나 맥락을 설명하는 구간은 여기에 해당하지 않아요. \"재미\"가 없다는 걸 의미하는 적극적인 카테고리예요." - }, - "category_filler_short": { - "message": "주제와 관련 없는 구간" - }, - "category_filler_guideline1": { - "message": "잡담이나 유머가 포함됐고 동영상 주제와 관련이 없는 구간이어야 함" - }, - "category_filler_guideline2": { - "message": "주제와 관련 없는 내용이 포함된 구간이어야 함" - }, - "category_filler_guideline3": { - "message": "주제 이해와 관련 없는 구간이어야 함" - }, - "category_music_offtopic": { - "message": "음악이 아닌 구간" - }, - "category_music_offtopic_description": { - "message": "이 구간은 뮤직비디오에서만 해당돼요. 다른 카테고리에 속하지 않는 뮤직비디오에서만 이 카테고리를 사용하세요." - }, - "category_music_offtopic_short": { - "message": "음악이 아닌 구간" - }, - "category_music_offtopic_guideline1": { - "message": "정식 음악에는 없는 구간이어야 함" - }, - "category_music_offtopic_guideline2": { - "message": "실시간 공연에서 음악이 아닌 구간이어야 함" - }, - "category_poi_highlight": { - "message": "하이라이트" - }, - "category_poi_highlight_description": { - "message": "이 구간은 많은 분이 찾는 동영상의 내용이 포함됐어요. \"바쁘신 분들은...\" 댓글과 유사해요." - }, - "category_poi_highlight_guideline1": { - "message": "많은 사람이 찾는 구간이어야 함" - }, - "category_poi_highlight_guideline2": { - "message": "전반적인 동영상의 맥락과 일치하는 구간이어야 함" - }, - "category_poi_highlight_guideline3": { - "message": "제목, 미리보기 이미지와 연관 있는 구간이어야 함" - }, - "category_chapter": { - "message": "챕터" - }, - "category_chapter_description": { - "message": "챕터는 동영상의 주요 구간을 설명해요." - }, - "category_chapter_guideline1": { - "message": "스폰서 브랜드 이름을 언급하지 않아야 함" - }, - "category_chapter_guideline2": { - "message": "일반적인 부분에서는 큰 챕터를 사용해야 함" - }, - "category_chapter_guideline3": { - "message": "큰 챕터 속에 작은 챕터를 배치할 수 있음" - }, - "category_livestream_messages": { - "message": "실시간: 후원자 메시지 구간" - }, - "category_livestream_messages_short": { - "message": "후원자 메시지 구간" - }, - "autoSkip": { - "message": "자동 건너뛰기" - }, - "manualSkip": { - "message": "수동 건너뛰기" - }, - "showOverlay": { - "message": "탐색 바에 표시" - }, - "disable": { - "message": "사용 안 함" - }, - "autoSkip_POI": { - "message": "시점으로 자동 이동" - }, - "manualSkip_POI": { - "message": "동영상을 클릭했을 때 묻기" - }, - "showOverlay_POI": { - "message": "탐색 바에 표시" - }, - "showOverlay_full": { - "message": "라벨 표시" - }, - "showOverlay_chapter": { - "message": "챕터 표시" - }, - "autoSkipOnMusicVideos": { - "message": "음악이 아닌 구간이 있을 때 모든 구간 자동 건너뛰기" - }, - "muteSegments": { - "message": "구간을 건너뛰지 않고 음소거 처리" - }, - "fullVideoSegments": { - "message": "동영상 전체가 광고인 경우 아이콘 표시", - "description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo" - }, - "previewColor": { - "message": "미제출 색상", - "description": "Referring to submissions that have not been sent to the server yet." - }, - "seekBarColor": { - "message": "탐색 바 색상" - }, - "category": { - "message": "카테고리" - }, - "skipOption": { - "message": "건너뛰기 설정", - "description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)" - }, - "enableTestingServer": { - "message": "테스트 서버 활성화" - }, - "whatEnableTestingServer": { - "message": "제출과 투표가 메인 서버에 반영되지 않을 거예요. 테스트를 목적으로 사용하세요." - }, - "testingServerWarning": { - "message": "제출과 투표가 테스트 서버에 연결하는 동안은 메인 서버에 반영되지 않을 거예요. 실제 제출을 원하시면 비활성화하는 걸 잊지 마세요." - }, - "bracketNow": { - "message": "(현재)" - }, - "moreCategories": { - "message": "추가 카테고리" - }, - "chooseACategory": { - "message": "카테고리 선택" - }, - "enableThisCategoryFirst": { - "message": "\"{0}\" 카테고리의 구간을 제출하려면, 설정에서 사용을 해주셔야 해요. 바로 설정 창으로 이동하실 거예요.", - "description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options." - }, - "poiOnlyOneSegment": { - "message": "경고: 이 유형의 구간은 한 개만 있을 수 있어요. 여러 구간을 제출하게 되면 다른 분께는 구간 중 하나가 무작위로 표시돼요." - }, - "youMustSelectACategory": { - "message": "제출해야 하는 모든 구간의 카테고리를 선택해 주세요!" - }, - "bracketEnd": { - "message": "(끝)" - }, - "End": { - "message": "끝", - "description": "Button that skips to the end of a segment" - }, - "hiddenDueToDownvote": { - "message": "숨겨짐: 비추천" - }, - "hiddenDueToDuration": { - "message": "숨겨짐: 너무 짧음" - }, - "manuallyHidden": { - "message": "수동으로 숨겨짐" - }, - "channelDataNotFound": { - "description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.", - "message": "채널 ID를 불러오지 못했어요. 임베디드 동영상인 경우, YouTube 홈페이지에서 시도해보세요. YouTube 레이아웃 변화로 인해 발생한 문제일 수도 있어요. 그렇게 생각하신다면 다음 사이트에서 의견을 남겨주세요: " - }, - "invidiousPermissionRefresh": { - "message": "브라우저가 Invidious와 다른 제삼자 사이트에서 동작하기 위한 권한을 회수했어요. 권한을 다시 부여하려면 아래 버튼을 눌러주세요." - }, - "acceptPermission": { - "message": "권한 허용" - }, - "permissionRequestSuccess": { - "message": "권한 요청에 성공했어요!" - }, - "permissionRequestFailed": { - "message": "권한 요청에 실패했어요. 거부를 누르셨나요?" - }, - "adblockerIssueWhitelist": { - "message": "이 문제를 해결할 수 없는 경우 SponsorBlock이 이 동영상의 채널 정보를 찾을 수 없는 것일 수 있으니, '건너뛰기 전 채널 강제 확인' 설정을 사용하지 않아야 해요" - }, - "forceChannelCheck": { - "message": "건너뛰기 전 채널 강제 확인" - }, - "whatForceChannelCheck": { - "message": "기본적으로, 무슨 채널인지 알기 전 구간을 건너뛰어요. 화이트리스트 내 채널의 동영상 시작 부분에 있는 일부 구간이 건너뛰어질 수 있는 현상을 방지할 수 있지만 채널 ID를 가져오는 데 시간이 소요되어 건너뛰기에 지연이 발생할 수 있어요. 고속 인터넷을 사용하고 있다면 체감되지 않을 수도 있어요." - }, - "forceChannelCheckPopup": { - "message": "\"건너뛰기 전 채널 강제 확인\"을 설정에서 활성화하는 것을 고려해보세요." - }, - "downvoteDescription": { - "message": "구간의 시간이 잘못 입력됐어요" - }, - "incorrectVote": { - "message": "잘못됨" - }, - "harmfulVote": { - "message": "유해함", - "description": "Used for chapter segments when the text is harmful/offensive to remove it faster" - }, - "incorrectCategory": { - "message": "카테고리 변경" - }, - "nonMusicCategoryOnMusic": { - "message": "이 동영상은 음악 동영상으로 분류되어 있어요. 동영상에 스폰서 광고 구간이 있나요? \"음악이 아닌 구간\"으로 지정된 카테고리인 경우, 확장 프로그램 설정을 열어 이 카테고리를 사용하세요. 그리고, 이 구간을 \"스폰서 광고 구간\" 대신 \"음악이 아닌 구간\"으로 지정하세요. 혼동된다면 가이드라인을 읽어주세요." - }, - "multipleSegments": { - "message": "여러 구간" - }, - "guidelines": { - "message": "가이드라인" - }, - "readTheGuidelines": { - "message": "가이드라인을 꼭 읽어주세요!!!", - "description": "Show the first time they submit or if they are \"high risk\"" - }, - "categoryUpdate1": { - "message": "카테고리가 여기 있어요!" - }, - "categoryUpdate2": { - "message": "인트로, 아웃트로 등을 건너뛸 수 있는 설정을 열어보세요." - }, - "help": { - "message": "도움말" - }, - "GotIt": { - "message": "확인", - "description": "Used as the button to dismiss a tooltip" - }, - "fullVideoTooltipWarning": { - "message": "제출될 구간이 길어요. 전반적인 동영상의 내용이 한 주제에 대한 것이라면, \"건너뛰기\"를 \"동영상 전체\"로 변경해주세요. 자세한 정보는 가이드라인을 확인하세요." - }, - "categoryPillTitleText": { - "message": "동영상 전체가 해당 카테고리로 지정됐고 부분적으로 나누기 어려워요" - }, - "chapterNameTooltipWarning": { - "message": "챕터의 이름 중 하나가 카테고리와 유사해요. 가능한 경우 카테고리를 대신 사용해 주세요." - }, - "experiementOptOut": { - "message": "향후 모든 실험 기능 비활성화", - "description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private." - }, - "hideForever": { - "message": "다시 보지 않음" - }, - "warningChatInfo": { - "message": "악의적인 의도는 없었던 듯 보이지만 제출하신 구간 중에 일부 문제가 있는 것 같아요." - }, - "warningTitle": { - "message": "경고를 받으셨어요" - }, - "questionButton": { - "message": "질문이 있어요" - }, - "warningConfirmButton": { - "message": "사유를 이해했어요" - }, - "warningError": { - "message": "경고를 확인하던 도중 오류가 발생했어요:" - }, - "Donate": { - "message": "후원" - }, - "considerDonating": { - "message": "개발 자금을 지원해주세요" - }, - "hideDonationLink": { - "message": "후원 링크 숨김" - }, - "darkModeOptionsPage": { - "message": "설정 페이지에서 어두운 테마 사용" - }, - "helpPageThanksForInstalling": { - "message": "SponsorBlock을 설치해 주셔서 감사드려요." - }, - "helpPageReviewOptions": { - "message": "아래 설정을 확인해 보세요" - }, - "helpPageFeatureDisclaimer": { - "message": "기본값으로 많은 기능이 사용되지 않아요. 인트로, 아웃트로 같은 부분을 건너뛰고 싶으시다면 아래 설정을 사용해야 해요. 또한 UI 요소를 숨기거나 표시할 수 있답니다." - }, - "helpPageHowSkippingWorks": { - "message": "건너뛰기가 작동하는 방법" - }, - "helpPageHowSkippingWorks1": { - "message": "데이터베이스에서 찾은 구간이 있다면 자동으로 건너뛰어요. 확장 프로그램 아이콘을 눌러 팝업 창을 열어서 구간을 미리 확인하실 수도 있답니다." - }, - "helpPageHowSkippingWorks2": { - "message": "구간을 건너뛰면 알림을 받게 돼요. 알림 창에서 투표를 진행할 수 있어서, 구간의 시간이 잘못 입력됐다면 비추천 버튼을 누르실 수도 있답니다." - }, - "Submitting": { - "message": "제출하는 방법" - }, - "helpPageSubmitting1": { - "message": "\"구간 시작\" 버튼을 누른 다음 팝업 창으로 제출할 수도 있으며 동영상 탐색 바에 있는 버튼으로 제출할 수도 있답니다." - }, - "helpPageSubmitting2": { - "message": "시작 아이콘을 누르면 구간의 시점을 정할 수 있고 정지 아이콘을 누르면 구간의 종점을 정할 수 있어요. 제출하기 전 여러 구간을 설정할 수 있는데, 업로드 아이콘을 눌러 제출할 수 있어요. 휴지통 아이콘을 눌러 구간을 삭제하실 수도 있어요." - }, - "Editing": { - "message": "구간 수정 방법" - }, - "helpPageEditing1": { - "message": "구간을 잘못 설정했다면, 위쪽 화살표 버튼을 누른 다음 구간을 수정하거나 삭제할 수 있어요." - }, - "helpPageTooSlow": { - "message": "이건 너무 느린 거 같아요" - }, - "helpPageTooSlow1": { - "message": "원하는 경우 단축키를 사용할 수 있어요. 쌍반점(세미콜론) 키를 눌러 스폰서 광고 구간의 시점/종점을 설정할 수 있으며 작은따옴표 키를 눌러 구간을 제출할 수 있답니다. 언제든지 설정에서 변경할 수 있어요. QWERTY 자판을 사용하지 않는 경우, 단축키를 변경해야 할 수도 있어요." - }, - "helpPageCopyOfDatabase": { - "message": "데이터베이스의 복사본을 구할 수 있나요? 개발자분께 무슨 일이 생기면 어떻게 되는 거죠?" - }, - "helpPageCopyOfDatabase1": { - "message": "데이터베이스는 여기에서 확인하실 수 있어요:" - }, - "helpPageCopyOfDatabase2": { - "message": "또한 소스 코드는 자유롭게 사용할 수 있어요. 따라서 데이터베이스에 무슨 일이 생기더라도, 제출된 구간이 사라지는 일은 없을 거예요." - }, - "helpPageNews": { - "message": "새로운 변경 사항은 어디에서 확인하나요?" - }, - "helpPageSourceCode": { - "message": "소스 코드는 어디에서 볼 수 있나요?" - }, - "Credits": { - "message": "크레딧" - }, - "LearnMore": { - "message": "자세히 보기" - }, - "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": "설정한 키와 기존 YouTube 단축키가 중복돼요. 그래도 사용하시겠어요?" - }, - "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": "요금을 결제할 여력이 아니시라면, {여기}서 할인 혜택을 받을 수 있는지 확인해 보세요", - "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": "SponsorBlock 사용자 참여 챕터 기능은 라이선스 결제 사용자나, 이전 기여를 통해 접근을 허가받은 사용자만 사용할 수 있어요" - }, - "chaptersPage2": { - "message": "참고: 여전히 챕터 제출 권한은 산정된 평판만을 바탕으로 부여돼요. 라이선스를 결제하면 다른 분이 제출한 챕터를 확인하는 기능만 추가로 사용할 수 있어요", - "description": "On the chapters page for getting access to the paid chapters feature" - }, - "chapterNewFeature": { - "message": "새로운 기능: 사용자 참여 챕터 기능. 챕터는 사용자가 직접 이름을 지정할 수 있고 중첩시킬 수 있어 더욱 더 정확해요. 이 동영상에 제출된 챕터를 보려면 라이선스를 결제하세요. 챕터 목록 미리보기: ", - "description": "After the comma, a list of chapters for this video will appear" - }, - "chapterNewFeature2": { - "message": "새로운 기능: 사용자 참여 챕터 기능. 챕터는 사용자가 직접 이름을 지정할 수 있고 중첩시킬 수 있어 더욱 더 정확해요. 설정에서 사용해서 무료로 사용할 수 있어요." - }, - "unsubmittedSegmentCounts": { - "message": "You currently have {0} on {1}", - "description": "Example: You currently have 12 unsubmitted segments on 5 videos" - }, - "unsubmittedSegmentCountsZero": { - "message": "You currently have no unsubmitted segments", - "description": "Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments" - }, - "unsubmittedSegmentsSingular": { - "message": "unsubmitted segment", - "description": "Example: You currently have 1 *unsubmitted segment* on 1 video" - }, - "unsubmittedSegmentsPlural": { - "message": "unsubmitted segments", - "description": "Example: You currently have 12 *unsubmitted segments* on 5 videos" - }, - "videosSingular": { - "message": "video", - "description": "Example: You currently have 3 unsubmitted segments on 1 *video*" - }, - "videosPlural": { - "message": "videos", - "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": "동영상 ID", - "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": "URL로 공유" - } -} diff --git a/public/_locales/lt/messages.json b/public/_locales/lt/messages.json deleted file mode 100644 index 0967ef42..00000000 --- a/public/_locales/lt/messages.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/public/_locales/lv/messages.json b/public/_locales/lv/messages.json deleted file mode 100644 index 9fb59dde..00000000 --- a/public/_locales/lv/messages.json +++ /dev/null @@ -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" - } -} diff --git a/public/_locales/ml/messages.json b/public/_locales/ml/messages.json deleted file mode 100644 index 08a32660..00000000 --- a/public/_locales/ml/messages.json +++ /dev/null @@ -1,539 +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": "പോപ്പ്അപ്പ് അടയ്ക്കുക" - }, - "SubmitTimes": { - "message": "സെഗ്മെന്റുകൾ സമർപ്പിക്കുക" - }, - "submitCheck": { - "message": "ഇത് സമർപ്പിക്കാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ?" - }, - "whitelistChannel": { - "message": "വൈറ്റ്ലിസ്റ്റ് ചാനൽ" - }, - "removeFromWhitelist": { - "message": "വൈറ്റ്ലിസ്റ്റിൽ നിന്ന് ചാനൽ നീക്കംചെയ്യുക" - }, - "voteOnTime": { - "message": "ഒരു സെഗ്മെന്റിൽ വോട്ടുചെയ്യുക" - }, - "Submissions": { - "message": "സമർപ്പിക്കലുകൾ" - }, - "savedPeopleFrom": { - "message": "നിങ്ങൾ ആളുകളെ സംരക്ഷിച്ചു " - }, - "viewLeaderboard": { - "message": "ലീഡർബോർഡ്" - }, - "recordTimesDescription": { - "message": "സമർപ്പിക്കുക" - }, - "submissionEditHint": { - "message": "സമർപ്പിക്കുക ക്ലിക്കുചെയ്തതിനുശേഷം വിഭാഗം എഡിറ്റിംഗ് ദൃശ്യമാകും", - "description": "Appears in the popup to inform them that editing has been moved to the video player." - }, - "popupHint": { - "message": "സൂചന: ഓപ്ഷനുകളിൽ സമർപ്പിക്കുന്നതിന് നിങ്ങൾക്ക് കീബൈൻഡുകൾ സജ്ജമാക്കാൻ കഴിയും" - }, - "clearTimesButton": { - "message": "ടൈംസ് മായ്ക്കുക" - }, - "submitTimesButton": { - "message": "സമയം സമർപ്പിക്കുക" - }, - "publicStats": { - "message": "നിങ്ങൾ എത്രമാത്രം സംഭാവന നൽകി എന്ന് കാണിക്കുന്നതിന് ഇത് പൊതു സ്ഥിതിവിവരക്കണക്ക് പേജിൽ ഉപയോഗിക്കുന്നു. അത് കാണുക" - }, - "Username": { - "message": "ഉപയോക്തൃനാമം" - }, - "setUsername": { - "message": "ഉപയോക്തൃനാമം സജ്ജമാക്കുക" - }, - "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": "ആമുഖങ്ങൾ, ഉൽപ്പന്നങ്ങൾ, ചരക്കുകൾ മുതലായവ ഒഴിവാക്കുന്നതിനുള്ള ഓപ്ഷനുകൾ തുറക്കുക." - } -} diff --git a/public/_locales/mr/messages.json b/public/_locales/mr/messages.json deleted file mode 100644 index 0967ef42..00000000 --- a/public/_locales/mr/messages.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/public/_locales/ms/messages.json b/public/_locales/ms/messages.json deleted file mode 100644 index 2eec3b1f..00000000 --- a/public/_locales/ms/messages.json +++ /dev/null @@ -1,539 +0,0 @@ -{ - "fullName": { - "message": "SponsorBlock untuk YouTube - Lewati Sponsor", - "description": "Name of the extension." - }, - "Description": { - "message": "Lewati sponsor, meminta subscriber dan lain-lain di video YouTube. Laporkan sponsor di video yang anda tonton untuk menghemat waktu orang lain.", - "description": "Description of the extension." - }, - "400": { - "message": "Pelayan mengatakan permintaan ini tidak sah" - }, - "429": { - "message": "Anda telah menghantar terlalu banyak masa penaja untuk video yang satu ini, adakah anda pasti ada banyak ini?" - }, - "409": { - "message": "Perkara ini telah dikemukakan sebelumnya" - }, - "channelWhitelisted": { - "message": "Saluran Senarai Putih!" - }, - "Segment": { - "message": "segmen" - }, - "Segments": { - "message": "segmen" - }, - "upvoteButtonInfo": { - "message": "Sokong penyerahan ini" - }, - "reportButtonTitle": { - "message": "Lapor" - }, - "reportButtonInfo": { - "message": "Laporkan penyerahan ini sebagai tidak betul." - }, - "Dismiss": { - "message": "Ketepikan" - }, - "Loading": { - "message": "Memuat..." - }, - "Hide": { - "message": "Jangan Tunjukkan" - }, - "hitGoBack": { - "message": "Tekan langgan untuk sampai ke tempat asal anda." - }, - "unskip": { - "message": "Hentikan" - }, - "reskip": { - "message": "Reskip" - }, - "paused": { - "message": "Dijeda" - }, - "manualPaused": { - "message": "Pemasa Berhenti" - }, - "confirmMSG": { - "message": "Untuk mengedit atau menghapus nilai individu, klik butang maklumat atau buka pop timbul pelanjutan dengan mengklik ikon pelanjutan di sudut kanan atas." - }, - "clearThis": { - "message": "Adakah anda pasti mahu membersihkannya?\n\n" - }, - "Unknown": { - "message": "Terdapat kesalahan semasa menghantar masa penaja anda, sila cuba sebentar lagi." - }, - "sponsorFound": { - "message": "Video ini mempunyai segmen dalam pangkalan data!" - }, - "sponsor404": { - "message": "Tidak terdapat segmen" - }, - "sponsorStart": { - "message": "Segmen Bermula Sekarang" - }, - "sponsorEnd": { - "message": "Segmen Berakhir Sekarang" - }, - "noVideoID": { - "message": "Tiada video YouTube dijumpai.\nSekiranya ini tidak betul, muat semula tab." - }, - "success": { - "message": "Berjaya!" - }, - "voted": { - "message": "Mengundi!" - }, - "serverDown": { - "message": "Nampaknya pelayan tidak berfungsi. Segera hubungi dev." - }, - "connectionError": { - "message": "Ralat sambungan telah berlaku. Kod salah: " - }, - "clearTimes": { - "message": "Kosongkan Segmen" - }, - "openPopup": { - "message": "Buka Pop timbul PenajaBlokir" - }, - "closePopup": { - "message": "Tutup Pop timbul" - }, - "SubmitTimes": { - "message": "Hantar Segmen" - }, - "submitCheck": { - "message": "Adakah anda pasti mahu menghantarnya?" - }, - "whitelistChannel": { - "message": "Saluran senarai putih" - }, - "removeFromWhitelist": { - "message": "Alih keluar saluran dari senarai putih" - }, - "voteOnTime": { - "message": "Undi Segmen" - }, - "Submissions": { - "message": "Penyerahan" - }, - "savedPeopleFrom": { - "message": "Anda telah menyelamatkan orang dari " - }, - "viewLeaderboard": { - "message": "Papan pendahulu" - }, - "recordTimesDescription": { - "message": "Hantar" - }, - "submissionEditHint": { - "message": "Penyuntingan bahagian akan muncul setelah anda mengklik hantar", - "description": "Appears in the popup to inform them that editing has been moved to the video player." - }, - "popupHint": { - "message": "Petunjuk: Anda boleh menetapkan kunci untuk dihantar dalam pilihan" - }, - "clearTimesButton": { - "message": "Jelas Masa" - }, - "submitTimesButton": { - "message": "Hantar Masa" - }, - "publicStats": { - "message": "Ini digunakan di halaman statistik awam untuk menunjukkan berapa banyak yang anda sumbangkan. Lihatlah" - }, - "Username": { - "message": "Nama pengguna" - }, - "setUsername": { - "message": "Tetapkan Nama Pengguna" - }, - "discordAdvert": { - "message": "Mari sertai pelayan perselisihan rasmi untuk memberi cadangan dan maklum balas!" - }, - "hideThis": { - "message": "Sembunyikan ini" - }, - "Options": { - "message": "Pilihan" - }, - "showButtons": { - "message": "Tunjukkan Butang Pada Pemain YouTube" - }, - "hideButtons": { - "message": "Sembunyikan Butang Pada Pemain YouTube" - }, - "hideButtonsDescription": { - "message": "Ini menyembunyikan butang yang muncul di pemain YouTube untuk menyerahkan segmen langkau." - }, - "showInfoButton": { - "message": "Tunjukkan Butang Maklumat Pada Pemain YouTube" - }, - "hideInfoButton": { - "message": "Sembunyikan Butang Maklumat Pada Pemain YouTube" - }, - "hideDeleteButton": { - "message": "Sembunyikan Butang Padam Pada Pemain YouTube" - }, - "showDeleteButton": { - "message": "Tunjukkan Butang Padam Pada Pemain YouTube" - }, - "enableViewTracking": { - "message": "Dayakan Skip Count Tracking" - }, - "whatViewTracking": { - "message": "Fungsi ini mengesan segmen mana yang telah anda lewati untuk memberi tahu pengguna seberapa banyak penyerahan mereka telah membantu orang lain dan digunakan sebagai metrik bersama dengan suara positif untuk memastikan bahawa spam tidak masuk ke dalam pangkalan data. Sambungan tersebut menghantar mesej ke pelayan setiap kali anda melewatkan segmen. Mudah-mudahan kebanyakan orang tidak mengubah tetapan ini supaya nombor paparan tepat. :)" - }, - "enableQueryByHashPrefix": { - "message": "Pertanyaan Oleh Awalan Hash" - }, - "whatQueryByHashPrefix": { - "message": "Daripada meminta segmen dari pelayan menggunakan videoID, 4 watak pertama hash videoID dihantar. Pelayan ini akan menghantar kembali data untuk semua video dengan hash yang serupa." - }, - "enableRefetchWhenNotFound": { - "message": "Perbaharui Segmen Pada Video Baru" - }, - "whatRefetchWhenNotFound": { - "message": "Sekiranya videonya baru, dan tidak ada segmen yang dijumpai, video akan terus diambil setiap beberapa minit semasa anda menonton." - }, - "showNotice": { - "message": "Tunjukkan Notis Lagi" - }, - "showSkipNotice": { - "message": "Tunjukkan Makluman Setelah Segmen Dilangkau" - }, - "longDescription": { - "message": "SponsorBlock membolehkan anda melewati penaja, intro, outro, peringatan langganan, dan bahagian lain dari video YouTube yang menjengkelkan. SponsorBlock adalah pelanjutan penyemak imbas yang banyak untuk membolehkan sesiapa sahaja menghantar segmen tajaan dan masa tayangan dari segmen video YouTube yang lain. Setelah satu orang menyerahkan maklumat ini, semua orang yang mempunyai pelanjutan ini akan melangkau segmen yang ditaja. Anda juga boleh melangkau bahagian muzik video muzik bukan.", - "description": "Full description of the extension on the store pages." - }, - "website": { - "message": "Laman web", - "description": "Used on Firefox Store Page" - }, - "sourceCode": { - "message": "Kod sumber", - "description": "Used on Firefox Store Page" - }, - "noticeUpdate": { - "message": "Notis telah ditingkatkan!", - "description": "The first line of the message displayed after the notice was upgraded." - }, - "noticeUpdate2": { - "message": "Sekiranya anda masih tidak menyukainya, tekan butang jangan tunjukkan.", - "description": "The second line of the message displayed after the notice was upgraded." - }, - "0": { - "message": "Masa sambungan telah tamat. Periksa sambungan internet anda. Sekiranya internet anda berfungsi, pelayan mungkin berlebihan atau tidak berfungsi." - }, - "disableSkipping": { - "message": "Melangkau diaktifkan" - }, - "enableSkipping": { - "message": "Melangkau dilumpuhkan" - }, - "yourWork": { - "message": "Kerja awak", - "description": "Used to describe the section that will show you the statistics from your submissions." - }, - "502": { - "message": "Pelayan nampaknya berlebihan. Cuba lagi dalam beberapa saat." - }, - "errorCode": { - "message": "Kod ralat: " - }, - "skip": { - "message": "Langkau" - }, - "skip_category": { - "message": "Langkau {0}?" - }, - "disableAutoSkip": { - "message": "Lumpuhkan Langkau Auto" - }, - "enableAutoSkip": { - "message": "Dayakan Langkau Auto" - }, - "audioNotification": { - "message": "Pemberitahuan Audio Semasa Langkau" - }, - "audioNotificationDescription": { - "message": "Pemberitahuan audio di langkau akan memainkan suara setiap kali segmen dilangkau. Sekiranya dilumpuhkan (atau langkau automatik dinonaktifkan), suara tidak akan dimainkan." - }, - "showTimeWithSkips": { - "message": "Tunjukkan Masa Dengan Langkau Dihapus" - }, - "showTimeWithSkipsDescription": { - "message": "Kali ini muncul dalam tanda kurung di sebelah waktu semasa di bawah bar carian. Ini menunjukkan jumlah durasi video tolak segmen mana pun. Ini merangkumi segmen yang ditandai sebagai \"Show In Seekbar\" sahaja." - }, - "youHaveSkipped": { - "message": "Anda telah melangkau " - }, - "minLower": { - "message": "minit" - }, - "minsLower": { - "message": "minit" - }, - "hourLower": { - "message": "jam" - }, - "hoursLower": { - "message": "jam" - }, - "youHaveSavedTime": { - "message": "Anda telah menyelamatkan orang", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "youHaveSavedTimeEnd": { - "message": " kehidupan mereka", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "statusReminder": { - "message": "Periksa status.sponsor.ajay.app untuk status pelayan." - }, - "createdBy": { - "message": "Dicipta oleh" - }, - "optionsInfo": { - "message": "Dayakan sokongan Invidious, lumpuhkan autoskip, sembunyikan butang dan banyak lagi." - }, - "add": { - "message": "Tambah" - }, - "addInvidiousInstanceError": { - "message": "Ini adalah domain yang tidak sah. Ini mesti HANYA merangkumi bahagian domain. Contoh: invidious.ajay.app" - }, - "resetInvidiousInstance": { - "message": "Tetapkan semula Senarai Instance Invidious yang Tidak Diingini" - }, - "resetInvidiousInstanceAlert": { - "message": "Anda akan menetapkan semula senarai contoh Invidious" - }, - "currentInstances": { - "message": "Contoh Semasa:" - }, - "minDuration": { - "message": "Tempoh minimum (saat):" - }, - "minDurationDescription": { - "message": "Segmen yang lebih pendek daripada nilai yang ditetapkan tidak akan dilangkau atau ditunjukkan dalam pemain." - }, - "shortCheck": { - "message": "Penyerahan berikut lebih pendek daripada pilihan tempoh minimum anda. Ini mungkin bermaksud ini sudah dihantar, dan hanya diabaikan kerana pilihan ini. Adakah anda pasti mahu menghantar?" - }, - "showUploadButton": { - "message": "Tunjukkan Butang Muat Naik" - }, - "customServerAddress": { - "message": "Alamat Pelayan Sponsorblock" - }, - "customServerAddressDescription": { - "message": "Alamat yang digunakan SponsorBlock untuk membuat panggilan ke pelayan.\nKecuali anda mempunyai contoh pelayan anda sendiri, ini tidak boleh diubah." - }, - "save": { - "message": "Simpan" - }, - "reset": { - "message": "Tetapkan semula" - }, - "customAddressError": { - "message": "Alamat ini tidak dalam bentuk yang betul. Pastikan anda mempunyai http: // atau https: // pada awalnya dan tiada garis miring." - }, - "areYouSureReset": { - "message": "Adakah anda pasti mahu menetapkan semula ini?" - }, - "mobileUpdateInfo": { - "message": "m.youtube.com kini disokong" - }, - "exportOptions": { - "message": "Import / Eksport Semua Pilihan" - }, - "setOptions": { - "message": "Tetapkan Pilihan" - }, - "exportOptionsWarning": { - "message": "Amaran: Mengubah pilihan adalah kekal dan boleh menghentikan pemasangan anda. Adakah anda pasti mahu melakukan ini? Pastikan untuk membuat sandaran lama anda sekiranya berlaku." - }, - "incorrectlyFormattedOptions": { - "message": "JSON ini tidak diformat dengan betul. Pilihan anda belum diubah." - }, - "confirmNoticeTitle": { - "message": "Hantar Segmen" - }, - "submit": { - "message": "Hantar" - }, - "cancel": { - "message": "Batal" - }, - "delete": { - "message": "Padam" - }, - "preview": { - "message": "Pratonton" - }, - "inspect": { - "message": "Periksa" - }, - "edit": { - "message": "Sunting" - }, - "copyDebugInformation": { - "message": "Salin Maklumat Debug Ke Papan Keratan" - }, - "copyDebugInformationFailed": { - "message": "Gagal menulis ke papan keratan" - }, - "copyDebugInformationOptions": { - "message": "Menyalin maklumat ke papan keratan untuk diberikan kepada pembangun semasa menaikkan pepijat / ketika pembangun memintanya. Maklumat sensitif seperti ID pengguna anda, saluran dalam senarai putih, dan alamat pelayan tersuai telah dikeluarkan. Namun, ia mengandungi maklumat seperti agen pengguna, penyemak imbas, sistem operasi, dan nombor versi pelanjutan anda. " - }, - "copyDebugInformationComplete": { - "message": "Maklumat debug telah disalin ke papan klip. Jangan ragu untuk membuang maklumat yang anda tidak mahu kongsi Simpan ini dalam fail teks atau tampal ke laporan pepijat." - }, - "to": { - "message": "ke", - "description": "Used between segments. Example: 1:20 to 1:30" - }, - "category_sponsor": { - "message": "Penaja" - }, - "category_sponsor_description": { - "message": "Promosi berbayar, rujukan berbayar dan iklan langsung. Bukan untuk promosi diri atau sapaan percuma kepada penyebab / pencipta / laman web / produk yang mereka suka." - }, - "category_selfpromo": { - "message": "Promosi Tanpa Bayaran / Diri" - }, - "category_selfpromo_description": { - "message": "Sama dengan \"penaja\" kecuali untuk promosi tanpa gaji atau diri. Ini merangkumi bahagian mengenai barang dagangan, sumbangan, atau maklumat tentang siapa mereka bekerjasama." - }, - "category_interaction": { - "message": "Peringatan Interaksi (Langgan)" - }, - "category_interaction_description": { - "message": "Apabila ada peringatan pendek untuk menyukai, melanggan atau mengikutinya di tengah-tengah kandungan. Sekiranya ia panjang atau mengenai sesuatu yang spesifik, ia harus dipromosikan sendiri." - }, - "category_interaction_short": { - "message": "Peringatan Interaksi" - }, - "category_intro": { - "message": "Intermission / Pengenalan Animasi" - }, - "category_intro_description": { - "message": "Selang tanpa kandungan sebenar. Boleh jadi jeda, bingkai statik, mengulangi animasi. Ini tidak boleh digunakan untuk peralihan yang mengandungi maklumat." - }, - "category_intro_short": { - "message": "Selang" - }, - "category_outro": { - "message": "Kad Akhir / Kredit" - }, - "category_outro_description": { - "message": "Kredit atau ketika kad akhir YouTube muncul. Bukan untuk kesimpulan dengan maklumat." - }, - "category_music_offtopic": { - "message": "Muzik: Bahagian Bukan Muzik" - }, - "category_music_offtopic_description": { - "message": "Hanya untuk digunakan dalam video muzik. Ini hanya harus digunakan untuk bahagian video muzik yang belum dilindungi oleh kategori lain." - }, - "category_music_offtopic_short": { - "message": "Bukan Muzik" - }, - "category_livestream_messages": { - "message": "Strim Langsung: Bacaan Derma / Mesej" - }, - "category_livestream_messages_short": { - "message": "Bacaan Mesej" - }, - "autoSkip": { - "message": "Langkau Auto" - }, - "manualSkip": { - "message": "Langkau Manual" - }, - "showOverlay": { - "message": "Tunjukkan Di Bar Mencari" - }, - "disable": { - "message": "Nyahaktifkan" - }, - "seekBarColor": { - "message": "Cari Warna Bar" - }, - "category": { - "message": "Kategori" - }, - "skipOption": { - "message": "Langkau Pilihan", - "description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)" - }, - "enableTestingServer": { - "message": "Dayakan Pelayan Pengujian Beta" - }, - "whatEnableTestingServer": { - "message": "Penyerahan dan undian anda TIDAK AKAN DITUNTUT ke pelayan utama. Gunakan ini hanya untuk ujian." - }, - "testingServerWarning": { - "message": "Semua penyerahan dan undian TIDAK AKAN DITETAPKAN ke pelayan utama semasa menyambung ke pelayan ujian. Pastikan untuk melumpuhkan ini semasa anda ingin membuat penghantaran sebenar." - }, - "bracketNow": { - "message": "(Sekarang)" - }, - "moreCategories": { - "message": "Lebih banyak kategori" - }, - "chooseACategory": { - "message": "Pilih Kategori" - }, - "enableThisCategoryFirst": { - "message": "Untuk menghantar segmen dengan kategori \"{0}\", anda mesti mengaktifkannya dalam pilihan. Anda akan diarahkan ke pilihan sekarang.", - "description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options." - }, - "youMustSelectACategory": { - "message": "Anda mesti memilih kategori untuk semua segmen yang anda kirimkan!" - }, - "bracketEnd": { - "message": "(Tamat)" - }, - "hiddenDueToDownvote": { - "message": "tersembunyi: undi" - }, - "hiddenDueToDuration": { - "message": "tersembunyi: terlalu pendek" - }, - "forceChannelCheck": { - "message": "Pakai Pemeriksaan Saluran Sebelum Melangkau" - }, - "whatForceChannelCheck": { - "message": "Secara lalai, ia akan melangkau segmen dengan segera sebelum mengetahui saluran itu. Secara lalai, beberapa segmen pada permulaan video mungkin dilangkau pada saluran yang disenaraikan. Mengaktifkan pilihan ini akan mengelakkannya tetapi membuat semua melangkau sedikit kelewatan kerana mendapatkan saluran Id memerlukan sedikit masa. Kelewatan ini mungkin tidak dapat dilihat jika anda mempunyai internet yang pantas." - }, - "forceChannelCheckPopup": { - "message": "Pertimbangkan untuk Mengaktifkan \"Paksa Pemeriksaan Saluran Sebelum Melangkau\"" - }, - "downvoteDescription": { - "message": "Pemasaan Tidak Betul / Salah" - }, - "nonMusicCategoryOnMusic": { - "message": "Video ini dikategorikan sebagai muzik. Adakah anda pasti ini mempunyai penaja? Sekiranya ini sebenarnya adalah \"Segmen Bukan Muzik\", buka pilihan peluasan dan aktifkan kategori ini. Kemudian, anda boleh menghantar segmen ini sebagai \"Bukan Muzik\" dan bukannya penaja. Sila baca panduan sekiranya anda keliru." - }, - "multipleSegments": { - "message": "Pelbagai Segmen" - }, - "guidelines": { - "message": "Garis Panduan" - }, - "readTheGuidelines": { - "message": "Baca Garis Panduan!!", - "description": "Show the first time they submit or if they are \"high risk\"" - }, - "categoryUpdate1": { - "message": "Kategori ada di sini!" - }, - "categoryUpdate2": { - "message": "Buka pilihan untuk melangkau perkenalan, pengeluaran luar, barang dagangan, dll." - } -} diff --git a/public/_locales/nl/messages.json b/public/_locales/nl/messages.json deleted file mode 100644 index 79723454..00000000 --- a/public/_locales/nl/messages.json +++ /dev/null @@ -1,1235 +0,0 @@ -{ - "fullName": { - "message": "SponsorBlock voor YouTube - Sponsorberichten overslaan", - "description": "Name of the extension." - }, - "Description": { - "message": "Overslaan van sponsors, vragen om te abonneren en meer in YouTube-video's. Rapporteer sponsors in video's die u bekijkt om anderen tijd te besparen.", - "description": "Description of the extension." - }, - "400": { - "message": "Server zegt dat het verzoek ongeldig is" - }, - "429": { - "message": "U heeft te veel sponsortijdstippen ingediend voor deze video. Weet u zeker dat er zoveel zijn?" - }, - "409": { - "message": "Dit is al eerder ingediend" - }, - "channelWhitelisted": { - "message": "Kanaal gewhitelist!" - }, - "Segment": { - "message": "segment" - }, - "Segments": { - "message": "segmenten" - }, - "SegmentsCap": { - "message": "Segmenten" - }, - "Chapters": { - "message": "Hoofdstukken" - }, - "renderAsChapters": { - "message": "Segmenten weergeven als hoofdstukken", - "description": "Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system" - }, - "upvoteButtonInfo": { - "message": "Stemmen op deze inzending" - }, - "reportButtonTitle": { - "message": "Rapporteren" - }, - "reportButtonInfo": { - "message": "Deze inzending als onjuist rapporteren." - }, - "Dismiss": { - "message": "Verwerpen" - }, - "Loading": { - "message": "Laden..." - }, - "Hide": { - "message": "Nooit weergeven" - }, - "hitGoBack": { - "message": "Druk op \"overslaan ongedaan maken\" om terug te gaan naar waar u vandaan komt." - }, - "unskip": { - "message": "Overslaan ongedaan maken" - }, - "reskip": { - "message": "Opnieuw overslaan" - }, - "unmute": { - "message": "Niet meer dempen" - }, - "paused": { - "message": "Gepauzeerd" - }, - "manualPaused": { - "message": "Timer gestopt" - }, - "confirmMSG": { - "message": "Om individuele waarden te bewerken of te verwijderen, klikt u op de info-knop of opent u de extensie-pop-up door op het extensie-pictogram in de rechterbovenhoek te klikken." - }, - "clearThis": { - "message": "Weet u zeker dat u dit wilt wissen?\n\n" - }, - "Unknown": { - "message": "Er was een fout bij het indienen van uw sponsortijdstippen. Probeer het later nog eens." - }, - "sponsorFound": { - "message": "Deze video heeft segmenten in de database!" - }, - "sponsor404": { - "message": "Geen segmenten gevonden" - }, - "sponsorStart": { - "message": "Segment begint nu" - }, - "sponsorEnd": { - "message": "Segment eindigt nu" - }, - "sponsorCancel": { - "message": "Segment aanmaken annuleren" - }, - "noVideoID": { - "message": "Geen YouTube-video gevonden.\nVernieuw het tabblad als dit onjuist is." - }, - "refreshSegments": { - "message": "Segmenten vernieuwen" - }, - "success": { - "message": "Gelukt!" - }, - "voted": { - "message": "Gestemd!" - }, - "serverDown": { - "message": "Het lijkt erop dat de server offline is. Neem onmiddellijk contact op met de ontwikkelaar." - }, - "connectionError": { - "message": "Er is een verbindingsfout opgetreden. Foutcode: " - }, - "clearTimes": { - "message": "Segmenten verwijderen" - }, - "openPopup": { - "message": "SponsorBlock-pop-up openen" - }, - "closePopup": { - "message": "Pop-up sluiten" - }, - "SubmitTimes": { - "message": "Segmenten indienen" - }, - "sortSegments": { - "message": "Segmenten sorteren" - }, - "submitCheck": { - "message": "Weet u zeker dat u dit wilt indienen?" - }, - "whitelistChannel": { - "message": "Kanaal whitelisten" - }, - "removeFromWhitelist": { - "message": "Kanaal verwijderen van whitelist" - }, - "voteOnTime": { - "message": "Stemmen op een segment" - }, - "Submissions": { - "message": "Inzendingen" - }, - "savedPeopleFrom": { - "message": "U heeft mensen gered van " - }, - "viewLeaderboard": { - "message": "Ranglijst" - }, - "recordTimesDescription": { - "message": "Indienen" - }, - "submissionEditHint": { - "message": "Sectiebewerking verschijnt nadat u op indienen hebt geklikt", - "description": "Appears in the popup to inform them that editing has been moved to the video player." - }, - "popupHint": { - "message": "Tip: u kunt sneltoetsen voor het indienen instellen in de opties" - }, - "clearTimesButton": { - "message": "Tijdstippen wissen" - }, - "submitTimesButton": { - "message": "Tijdstippen indienen" - }, - "publicStats": { - "message": "Dit wordt gebruikt op de publieke statistiekenpagina om te laten zien hoeveel u heeft bijgedragen. Bekijk het" - }, - "Username": { - "message": "Gebruikersnaam" - }, - "setUsername": { - "message": "Gebruikersnaam instellen" - }, - "copyPublicID": { - "message": "Publieke gebruikers-ID kopiëren" - }, - "copySegmentID": { - "message": "Segment-ID kopiëren" - }, - "discordAdvert": { - "message": "Word lid van de officiële Discord-server om suggesties en feedback te geven!" - }, - "hideThis": { - "message": "Dit verbergen" - }, - "Options": { - "message": "Opties" - }, - "showButtons": { - "message": "Knoppen op YouTube-speler weergeven" - }, - "hideButtons": { - "message": "Knoppen op YouTube-speler verbergen" - }, - "hideButtonsDescription": { - "message": "Dit verbergt de knoppen die verschijnen op de YouTube-speler om segmenten over te slaan." - }, - "showSkipButton": { - "message": "Knop voor \"overslaan naar hoogtepunt\" op speler houden" - }, - "showInfoButton": { - "message": "Info-knop op YouTube-speler weergeven" - }, - "hideInfoButton": { - "message": "Info-knop op YouTube-speler verbergen" - }, - "autoHideInfoButton": { - "message": "Infoknop automatisch verbergen" - }, - "hideDeleteButton": { - "message": "Verwijderen-knop op YouTube-speler verbergen" - }, - "showDeleteButton": { - "message": "Verwijderen-knop op YouTube-speler weergeven" - }, - "enableViewTracking": { - "message": "Bijhouden van het aantal keren overslaan inschakelen" - }, - "whatViewTracking": { - "message": "Deze functie houdt bij welke segmenten u heeft overgeslagen om gebruikers te laten weten hoezeer hun inzending anderen heeft geholpen en wordt samen met upvotes als meetwaarde gebruikt om ervoor te zorgen dat spam niet in de database terechtkomt. De extensie stuurt telkens wanneer u een segment overslaat een bericht naar de server. Hopelijk veranderen de meeste mensen deze instelling niet zodat de weergavenummers accuraat zijn. :)" - }, - "enableViewTrackingInPrivate": { - "message": "Bijhouden van het aantal keren overslaan inschakelen in privé-/incognito-tabbladen" - }, - "enableTrackDownvotes": { - "message": "Segment-tegenstemmen opslaan" - }, - "whatTrackDownvotes": { - "message": "Segmenten waarop u een tegenstem doet, blijven verborgen, zelfs na vernieuwen" - }, - "trackDownvotesWarning": { - "message": "Waarschuwing: als u dit uitschakelt, worden alle eerder opgeslagen tegenstemmen verwijderd" - }, - "enableQueryByHashPrefix": { - "message": "Opvragen via hash-voorvoegsel" - }, - "whatQueryByHashPrefix": { - "message": "In plaats van segmenten op te vragen bij de server met behulp van de video-ID, worden de eerste 4 tekens van de hash van de video-ID verzonden. Deze server zal gegevens terugsturen voor alle video's met een vergelijkbare hash." - }, - "enableRefetchWhenNotFound": { - "message": "Segmenten voor nieuwe video's opnieuw ophalen" - }, - "whatRefetchWhenNotFound": { - "message": "Als de video nieuw is en er geen segmenten worden gevonden, zal om de zoveel minuten opnieuw worden gecontroleerd terwijl u kijkt." - }, - "enableShowCategoryWithoutPermission": { - "message": "Categorieën in indieningsmenu weergeven, zelfs zonder toestemming voor indienen" - }, - "whatShowCategoryWithoutPermission": { - "message": "Voor sommige categorieën is toestemming nodig om in te dienen vanwege minimale reputatie-eisen" - }, - "showNotice": { - "message": "Melding opnieuw weergeven" - }, - "showSkipNotice": { - "message": "Melding weergeven nadat een segment is overgeslagen" - }, - "showCategoryGuidelines": { - "message": "Categorie-hulp weergeven" - }, - "noticeVisibilityMode0": { - "message": "Volledige grootte overslaan-meldingen" - }, - "noticeVisibilityMode1": { - "message": "Kleine overslaan-meldingen voor automatisch overslaan" - }, - "noticeVisibilityMode2": { - "message": "Allemaal kleine overslaan-meldingen" - }, - "noticeVisibilityMode3": { - "message": "Vervaagde overslaan-meldingen" - }, - "noticeVisibilityMode4": { - "message": "Allemaal vervaagde overslaan-meldingen" - }, - "longDescription": { - "message": "SponsorBlock laat u sponsoring, intro's, outro's, herinneringen om te abonneren en andere vervelende onderdelen van YouTube-video's overslaan. SponsorBlock is een gecrowdsourcete browser-extensie waarmee iedereen de begin- en eindtijd van gesponsorde segmenten en andere segmenten van YouTube-video's kan indienen. Zodra één persoon deze informatie indient, zal iedereen met deze extensie het gesponsorde segment overslaan. U kunt ook secties zonder muziek in muziekvideo's overslaan.", - "description": "Full description of the extension on the store pages." - }, - "website": { - "message": "Website", - "description": "Used on Firefox Store Page" - }, - "sourceCode": { - "message": "Broncode", - "description": "Used on Firefox Store Page" - }, - "noticeUpdate": { - "message": "De melding is bijgewerkt!", - "description": "The first line of the message displayed after the notice was upgraded." - }, - "noticeUpdate2": { - "message": "Als het u nog steeds niet bevalt, druk dan op de knop \"nooit weergeven\".", - "description": "The second line of the message displayed after the notice was upgraded." - }, - "setSkipShortcut": { - "message": "Segment overslaan", - "description": "Keybind label" - }, - "setStartSponsorShortcut": { - "message": "Segment starten/stoppen", - "description": "Keybind label" - }, - "setSubmitKeybind": { - "message": "Segmenten indienen", - "description": "Keybind label" - }, - "nextChapterKeybind": { - "message": "Volgend hoofdstuk", - "description": "Keybind label" - }, - "previousChapterKeybind": { - "message": "Vorig hoofdstuk", - "description": "Keybind label" - }, - "keybindDescription": { - "message": "Selecteer een toets door hem in te typen en kies de modificatietoetsen die u wilt gebruiken." - }, - "0": { - "message": "Time-out van de verbinding. Controleer uw internetverbinding. Als uw internet werkt, is de server waarschijnlijk overbelast of offline." - }, - "disableSkipping": { - "message": "Overslaan is ingeschakeld" - }, - "enableSkipping": { - "message": "Overslaan is uitgeschakeld" - }, - "yourWork": { - "message": "Uw werk", - "description": "Used to describe the section that will show you the statistics from your submissions." - }, - "502": { - "message": "De server lijkt overbelast te zijn. Probeer het over een paar seconden opnieuw." - }, - "errorCode": { - "message": "Foutcode: " - }, - "skip": { - "message": "Overslaan" - }, - "mute": { - "message": "Dempen" - }, - "full": { - "message": "Volledige video", - "description": "Used for the name of the option to label an entire video as sponsor or self promotion." - }, - "skip_category": { - "message": "{0} overslaan?" - }, - "mute_category": { - "message": "{0} dempen?" - }, - "skip_to_category": { - "message": "Overslaan naar {0}?", - "description": "Used for skipping to things (Skip to Highlight)" - }, - "skipped": { - "message": "{0} overgeslagen", - "description": "Example: Sponsor Skipped" - }, - "muted": { - "message": "{0} gedempt", - "description": "Example: Sponsor Muted" - }, - "skipped_to_category": { - "message": "Overgeslagen naar {0}", - "description": "Used for skipping to things (Skipped to Highlight)" - }, - "disableAutoSkip": { - "message": "Automatisch overslaan uitschakelen" - }, - "enableAutoSkip": { - "message": "Automatisch overslaan inschakelen" - }, - "audioNotification": { - "message": "Geluidsmelding bij overslaan" - }, - "audioNotificationDescription": { - "message": "Geluidsmelding bij overslaan zal een geluid afspelen wanneer een segment wordt overgeslagen. Indien uitgeschakeld (of als automatisch overslaan uitgeschakeld is), wordt er geen geluid afgespeeld." - }, - "showTimeWithSkips": { - "message": "Tijd weergeven met overslaan verwijderd" - }, - "showTimeWithSkipsDescription": { - "message": "Deze tijd verschijnt tussen haakjes naast de huidige tijd onder de tijdbalk. Dit geeft de totale videoduur min alle segmenten weer. Dit is inclusief segmenten die gemarkeerd zijn als alleen \"weergeven in tijdbalk\"." - }, - "youHaveSkipped": { - "message": "U heeft overgeslagen: " - }, - "minLower": { - "message": "minuut" - }, - "minsLower": { - "message": "minuten" - }, - "hourLower": { - "message": "uur" - }, - "hoursLower": { - "message": "uren" - }, - "youHaveSavedTime": { - "message": "U heeft mensen bespaard:", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "youHaveSavedTimeEnd": { - "message": " van hun leven", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "statusReminder": { - "message": "Controleer status.sponsor.ajay.app voor de serverstatus." - }, - "changeUserID": { - "message": "Uw privé-gebruikers-ID importeren/exporteren" - }, - "whatChangeUserID": { - "message": "Dit moet privé gehouden worden. Dit is als een wachtwoord en mag met niemand gedeeld worden. Als iemand dit heeft, kan hij zich voordoen als u. Klik op het klembordpictogram in de pop-up als u op zoek bent naar uw publieke gebruikers-ID." - }, - "setUserID": { - "message": "Privé-gebruikers-ID instellen" - }, - "userIDChangeWarning": { - "message": "Waarschuwing: wijzigen van de privé-gebruikers-ID is permanent. Weet u zeker dat u dit wilt doen? Zorg ervoor dat u een back-up maakt van uw oude ID, voor het geval dat." - }, - "createdBy": { - "message": "Gemaakt door" - }, - "supportOtherSites": { - "message": "Ondersteuning voor YouTube-sites van derden" - }, - "supportOtherSitesDescription": { - "message": "Ondersteuning voor YouTube-clients van derden. Om ondersteuning in te schakelen moet u de extra machtigingen accepteren. Dit werkt NIET in incognito in Chrome en andere Chromium-varianten.", - "description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube" - }, - "supportedSites": { - "message": "Ondersteunde sites: " - }, - "optionsInfo": { - "message": "Ondersteuning voor Invidious inschakelen, automatisch overslaan uitschakelen, knoppen verbergen en meer." - }, - "addInvidiousInstance": { - "message": "Client-instantie van derden toevoegen" - }, - "addInvidiousInstanceDescription": { - "message": "Een aangepaste instantie toevoegen. Dit moet worden opgemaakt met ALLEEN het domein. Bijvoorbeeld: invidious.ajay.app" - }, - "add": { - "message": "Toevoegen" - }, - "addInvidiousInstanceError": { - "message": "Dit is een ongeldig domein. Dit moet ALLEEN het domeindeel bevatten. Voorbeeld: invidious.ajay.app" - }, - "resetInvidiousInstance": { - "message": "Lijst met Invidious-instanties herstellen" - }, - "resetInvidiousInstanceAlert": { - "message": "U staat op het punt om de lijst met Invidious-instanties te herstellen" - }, - "currentInstances": { - "message": "Huidige instanties:" - }, - "minDuration": { - "message": "Minimale tijdsduur (seconden):" - }, - "minDurationDescription": { - "message": "Segmenten korter dan de ingestelde waarde worden niet overgeslagen of weergegeven in de speler." - }, - "enableManualSkipOnFullVideo": { - "message": "Handmatig overslaan gebruiken wanneer een label voor volledige video bestaat" - }, - "whatManualSkipOnFullVideo": { - "message": "Voor mensen die de video ononderbroken willen bekijken als deze volledig gesponsord of zelfpromotie is." - }, - "skipNoticeDuration": { - "message": "Duur van overslaan-melding (seconden):" - }, - "skipNoticeDurationDescription": { - "message": "De overslaan-melding blijft ten minste zo lang op het scherm staan. Voor handmatig overslaan kan dit misschien zelfs langer zichtbaar zijn." - }, - "shortCheck": { - "message": "De volgende inzending is korter dan uw \"minimale tijdsduur\"-instelling. Dit kan betekenen dat dit al is ingediend en genegeerd wordt door deze optie. Weet u zeker dat u dit wilt indienen?" - }, - "liveOrPremiere": { - "message": "Indienen op een actieve livesteam of première is niet toegestaan. Wacht tot hij geëindigd is, vernieuw dan de pagina en controleer of de segmenten nog geldig zijn." - }, - "showUploadButton": { - "message": "Uploaden-knop weergeven" - }, - "customServerAddress": { - "message": "SponsorBlock-serveradres" - }, - "customServerAddressDescription": { - "message": "Het adres dat SponsorBlock gebruikt om oproepen te doen naar de server.\nTenzij u uw eigen serverinstantie heeft, moet dit niet worden gewijzigd." - }, - "save": { - "message": "Opslaan" - }, - "reset": { - "message": "Herstellen" - }, - "customAddressError": { - "message": "Dit adres is niet in de juiste vorm. Zorg ervoor dat u http:// of https:// aan het begin heeft staan en geen schuine streep op het einde." - }, - "areYouSureReset": { - "message": "Weet u zeker dat u dit wilt herstellen?" - }, - "mobileUpdateInfo": { - "message": "m.youtube.com wordt nu ondersteund" - }, - "exportOptions": { - "message": "Alle opties importeren/exporteren" - }, - "exportOptionsCopy": { - "message": "Bewerken/kopiëren" - }, - "exportOptionsDownload": { - "message": "Opslaan naar bestand" - }, - "exportOptionsUpload": { - "message": "Laden uit bestand" - }, - "whatExportOptions": { - "message": "Dit is uw volledige configuratie in JSON. Dit is inclusief uw privé-gebruikers-ID, dus zorg ervoor dat u dit verstandig deelt." - }, - "setOptions": { - "message": "Opties instellen" - }, - "exportOptionsWarning": { - "message": "Waarschuwing: het wijzigen van de opties is permanent en kan uw installatie breken. Weet u zeker dat u dit wilt doen? Zorg ervoor dat u een back-up maakt van uw oude installatie, voor het geval dat." - }, - "incorrectlyFormattedOptions": { - "message": "Deze JSON is niet correct opgemaakt. Uw opties zijn niet gewijzigd." - }, - "confirmNoticeTitle": { - "message": "Segment indienen" - }, - "submit": { - "message": "Indienen" - }, - "cancel": { - "message": "Annuleren" - }, - "delete": { - "message": "Verwijderen" - }, - "preview": { - "message": "Voorbeeld" - }, - "unsubmitted": { - "message": "Niet ingediend" - }, - "inspect": { - "message": "Inspecteren" - }, - "edit": { - "message": "Bewerken" - }, - "copyDebugInformation": { - "message": "Foutopsporingsinformatie kopiëren naar klembord" - }, - "copyDebugInformationFailed": { - "message": "Kon niet schrijven naar klembord" - }, - "copyDebugInformationOptions": { - "message": "Kopieert informatie naar het klembord die aan een ontwikkelaar moet worden doorgegeven bij het melden van een bug of wanneer een ontwikkelaar dit vraagt. Gevoelige informatie zoals uw gebruikers-ID, gewhiteliste kanalen en aangepast serveradres zijn verwijderd. Het bevat echter wel informatie zoals uw useragent, browser, besturingssysteem en extensie-versienummer. " - }, - "copyDebugInformationComplete": { - "message": "De foutopsporingsinformatie is gekopieerd naar het klembord. Voel u vrij om alle informatie die u liever niet wilt delen, te verwijderen. Sla dit op in een tekstbestand of plak het in het foutenrapport." - }, - "keyAlreadyUsed": { - "message": "Deze snelkoppeling is gebonden aan een andere actie. Kies een andere." - }, - "to": { - "message": "tot", - "description": "Used between segments. Example: 1:20 to 1:30" - }, - "CopiedExclamation": { - "message": "Gekopieerd!", - "description": "Used after something has been copied to the clipboard. Example: 'Copied!'" - }, - "generic_guideline1": { - "message": "Inclusief vlotte overgangen" - }, - "generic_guideline2": { - "message": "Speelt af alsof niets overgeslagen werd" - }, - "category_sponsor": { - "message": "Sponsor" - }, - "category_sponsor_description": { - "message": "Betaalde promotie, betaalde aanbevelingen en directe reclame. Niet voor zelfpromotie of gratis uitroepen naar zaken/makers/websites/producten waar ze van houden." - }, - "category_sponsor_guideline1": { - "message": "Betaalde promoties" - }, - "category_sponsor_guideline2": { - "message": "Niet voor donaties of aangepaste koopwaar" - }, - "category_selfpromo": { - "message": "Onbetaalde promotie of zelfpromotie" - }, - "category_selfpromo_description": { - "message": "Vergelijkbaar met \"sponsor\", behalve voor onbetaalde of zelfpromotie. Dit is inclusief secties over koopwaar, donaties of informatie over met wie ze hebben samengewerkt." - }, - "category_selfpromo_guideline1": { - "message": "Donaties, lidmaatschappen en aangepaste koopwaar" - }, - "category_selfpromo_guideline2": { - "message": "Gratis uitroepen die niets aan de video toevoegen" - }, - "category_selfpromo_guideline3": { - "message": "Niet voor bedrijfsontworpen producten en koopwaar" - }, - "category_exclusive_access": { - "message": "Exclusieve toegang" - }, - "category_exclusive_access_description": { - "message": "Alleen voor het labelen van volledige video's. Wordt gebruikt wanneer een video een product, dienst of locatie laat zien waartoe men gratis of gesubsidieerd toegang heeft gekregen." - }, - "category_exclusive_access_pill": { - "message": "Deze video toont een product, dienst of locatie waartoe men gratis of gesubsidieerd toegang heeft gekregen", - "description": "Short description for this category" - }, - "category_exclusive_access_guideline1": { - "message": "Volledige video laat iets zien met gratis of gesubsidieerde toegang" - }, - "category_interaction": { - "message": "Interactieherinnering (abonneren)" - }, - "category_interaction_description": { - "message": "Als er een korte herinnering is om ze leuk te vinden, u te abonneren of ze te volgen in het midden van de inhoud. Als het lang is of over iets specifieks gaat, moet het in plaats daarvan onder zelfpromotie vallen." - }, - "category_interaction_guideline1": { - "message": "Korte herinneringen om leuk te vinden, te abonneren of te volgen" - }, - "category_interaction_guideline2": { - "message": "Bevat indirecte herinneringen voor commentaar" - }, - "category_interaction_guideline3": { - "message": "Niet voor algemene promotie, roept alleen op tot actie" - }, - "category_interaction_short": { - "message": "Interactieherinnering" - }, - "category_intro": { - "message": "Onderbreking/intro-animatie" - }, - "category_intro_description": { - "message": "Een interval zonder werkelijke inhoud. Kan een pauze zijn, een statisch beeld, een herhalende animatie. Dit moet niet worden gebruikt voor overgangen die informatie bevatten." - }, - "category_intro_short": { - "message": "Onderbreking" - }, - "category_intro_guideline1": { - "message": "Interval zonder werkelijke inhoud" - }, - "category_intro_guideline2": { - "message": "Niet voor overgangen met informatie" - }, - "category_outro": { - "message": "Eindkaarten/aftiteling" - }, - "category_outro_description": { - "message": "Aftiteling of wanneer de YouTube-eindkaarten verschijnen. Niet voor conclusies met informatie." - }, - "category_outro_guideline1": { - "message": "Inhoud niet toevoegen, zelfs niet als eindkaarten op het scherm staan" - }, - "category_preview": { - "message": "Voorbeeld/samenvatting" - }, - "category_preview_description": { - "message": "Collectie van clips die laten zien wat er in deze video of andere video's komt in een serie waar alle informatie later in de video wordt herhaald." - }, - "category_preview_guideline1": { - "message": "Clips die later of in een toekomstige video verschijnen" - }, - "category_preview_guideline2": { - "message": "Samenvatting van een vorige video" - }, - "category_preview_guideline3": { - "message": "Niet voor secties die extra inhoud toevoegen" - }, - "category_filler": { - "message": "Opvulling zijspoor/humor" - }, - "category_filler_description": { - "message": "Zijspoor-scènes die alleen ter opvulling of als humor worden toegevoegd en niet noodzakelijk zijn om de hoofdinhoud van de video te begrijpen. Segmenten die context of achtergrondinformatie verschaffen, mogen hier niet onder vallen. Dit is een zeer agressieve categorie, bedoeld voor als u niet in de stemming bent voor \"plezier\"." - }, - "category_filler_short": { - "message": "Opvulling" - }, - "category_filler_guideline1": { - "message": "Zijspoor-scènes alleen voor opvulling of humor" - }, - "category_filler_guideline2": { - "message": "Afleidingen, bloopers, herhalingen" - }, - "category_filler_guideline3": { - "message": "Niet voor scènes vereist om het onderwerp te begrijpen" - }, - "category_music_offtopic": { - "message": "Muziek: sectie niet-muziek" - }, - "category_music_offtopic_description": { - "message": "Alleen voor gebruik in muziekvideo's. Dit mag alleen worden gebruikt voor secties van muziekvideo's die nog niet door een andere categorie worden bedekt." - }, - "category_music_offtopic_short": { - "message": "Niet-muziek" - }, - "category_music_offtopic_guideline1": { - "message": "Secties niet in officiële releases" - }, - "category_music_offtopic_guideline2": { - "message": "Niet-muziek in een live optreden" - }, - "category_poi_highlight": { - "message": "Hoogtepunt" - }, - "category_poi_highlight_description": { - "message": "Het deel van de video waar de meeste mensen naar op zoek zijn. Gelijkaardig aan \"video begint bij x\"-opmerkingen." - }, - "category_poi_highlight_guideline1": { - "message": "Sectie die de meeste mensen zoeken" - }, - "category_poi_highlight_guideline2": { - "message": "Kan context overslaan" - }, - "category_poi_highlight_guideline3": { - "message": "Kan naar titel of pictogram overslaan" - }, - "category_chapter": { - "message": "Hoofdstuk" - }, - "category_chapter_description": { - "message": "Hoofdstukken met een aangepaste naam die de belangrijkste delen van een video beschrijven." - }, - "category_chapter_guideline1": { - "message": "Merknamen van sponsors niet vermelden" - }, - "category_chapter_guideline2": { - "message": "Grotere hoofdstukken gebruiken voor algemene secties" - }, - "category_chapter_guideline3": { - "message": "Kleinere hoofdstukken kunnen in grotere worden geplaatst" - }, - "category_livestream_messages": { - "message": "Livestream: donaties/lezen van berichten" - }, - "category_livestream_messages_short": { - "message": "Lezen van berichten" - }, - "autoSkip": { - "message": "Automatisch overslaan" - }, - "manualSkip": { - "message": "Handmatig overslaan" - }, - "showOverlay": { - "message": "Weergeven in tijdbalk" - }, - "disable": { - "message": "Uitschakelen" - }, - "autoSkip_POI": { - "message": "Automatisch overslaan naar het begin" - }, - "manualSkip_POI": { - "message": "Vragen wanneer de video wordt geladen" - }, - "showOverlay_POI": { - "message": "Weergeven in tijdbalk" - }, - "showOverlay_full": { - "message": "Label weergeven" - }, - "showOverlay_chapter": { - "message": "Hoofdstukken weergeven" - }, - "autoSkipOnMusicVideos": { - "message": "Automatisch alle segmenten overslaan wanneer er een niet-muziek-segment is" - }, - "muteSegments": { - "message": "Segmenten toestaan die audio dempen in plaats van overslaan" - }, - "fullVideoSegments": { - "message": "Een pictogram weergeven wanneer de volledige video een advertentie is", - "description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo" - }, - "previewColor": { - "message": "Niet ingediend kleur", - "description": "Referring to submissions that have not been sent to the server yet." - }, - "seekBarColor": { - "message": "Kleur van tijdbalk" - }, - "category": { - "message": "Categorie" - }, - "skipOption": { - "message": "Manier van overslaan", - "description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)" - }, - "enableTestingServer": { - "message": "Bèta-testserver inschakelen" - }, - "whatEnableTestingServer": { - "message": "Uw inzendingen en stemmen ZULLEN NIET GEREGISTREERD WORDEN op de hoofdserver. Gebruik dit alleen om te testen." - }, - "testingServerWarning": { - "message": "Alle inzendingen en stemmen ZULLEN NIET GEREGISTREERD WORDEN op de hoofdserver wanneer u met de testserver verbonden bent. Zorg ervoor dat u dit uitschakelt wanneer u echte inzendingen wilt maken." - }, - "bracketNow": { - "message": "(nu)" - }, - "moreCategories": { - "message": "Meer categorieën" - }, - "chooseACategory": { - "message": "Een categorie kiezen" - }, - "enableThisCategoryFirst": { - "message": "Om segmenten met de categorie \"{0}\" in te dienen, moet u deze in de opties inschakelen. U wordt nu doorgestuurd naar de opties.", - "description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options." - }, - "poiOnlyOneSegment": { - "message": "Waarschuwing: dit type segment kan maximaal één keer tegelijk actief zijn. Meerdere segmenten indienen zal weergave van een willekeurig segment veroorzaken." - }, - "youMustSelectACategory": { - "message": "U moet een categorie selecteren voor alle segmenten die u indient!" - }, - "bracketEnd": { - "message": "(einde)" - }, - "End": { - "message": "Einde", - "description": "Button that skips to the end of a segment" - }, - "hiddenDueToDownvote": { - "message": "verborgen: tegenstem" - }, - "hiddenDueToDuration": { - "message": "verborgen: te kort" - }, - "manuallyHidden": { - "message": "handmatig verborgen" - }, - "channelDataNotFound": { - "description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.", - "message": "Kanaal-ID is nog niet geladen. Als u een ingesloten video gebruikt, probeer dan in plaats daarvan de YouTube-homepagina. Dit kan ook worden veroorzaakt door wijzigingen in de YouTube-lay-out. Als u denkt dat dit het geval is, maak dan hier een opmerking:" - }, - "invidiousPermissionRefresh": { - "message": "De browser heeft de toestemming ingetrokken die nodig is om te functioneren op Invidious en andere sites van derden. Klik op de knop hieronder om deze toestemming opnieuw te activeren." - }, - "acceptPermission": { - "message": "Machtiging accepteren" - }, - "permissionRequestSuccess": { - "message": "Verzoek om machtiging gelukt!" - }, - "permissionRequestFailed": { - "message": "Verzoek om machtiging mislukt. Heeft u op geweigerd geklikt?" - }, - "adblockerIssueWhitelist": { - "message": "Als u dit niet kunt oplossen, schakel dan de instelling 'kanaalcontrole forceren vóór overslaan' uit omdat SponsorBlock niet in staat is de kanaalinformatie voor deze video op te halen" - }, - "forceChannelCheck": { - "message": "Kanaalcontrole forceren vóór overslaan" - }, - "whatForceChannelCheck": { - "message": "Standaard worden segmenten direct overgeslagen voordat het kanaal bekend is. Sommige segmenten aan het begin van de video kunnen worden overgeslagen op gewhiteliste kanalen. Het inschakelen van deze optie voorkomt dit, maar zorgt ervoor dat het overslaan een kleine vertraging heeft omdat het verkrijgen van de kanaal-ID enige tijd kan duren. Deze vertraging kan onopgemerkt blijven als u snel internet heeft." - }, - "forceChannelCheckPopup": { - "message": "Overweeg om \"kanaalcontrole forceren vóór overslaan\" in te schakelen" - }, - "downvoteDescription": { - "message": "Verkeerde timing" - }, - "incorrectVote": { - "message": "Onjuist" - }, - "harmfulVote": { - "message": "Schadelijk", - "description": "Used for chapter segments when the text is harmful/offensive to remove it faster" - }, - "incorrectCategory": { - "message": "Categorie wijzigen" - }, - "nonMusicCategoryOnMusic": { - "message": "Deze video is gecategoriseerd als muziek. Weet u zeker dat dit een sponsor heeft? Als dit eigenlijk een \"niet-muzieksegment\" is, open dan de extensie-opties en schakel deze categorie in. Vervolgens kunt u dit segment indienen als \"niet-muziek\" in plaats van als sponsor. Lees de richtlijnen als u in de war bent." - }, - "multipleSegments": { - "message": "Meerdere segmenten" - }, - "guidelines": { - "message": "Richtlijnen" - }, - "readTheGuidelines": { - "message": "Lees de richtlijnen!!", - "description": "Show the first time they submit or if they are \"high risk\"" - }, - "categoryUpdate1": { - "message": "Categorieën zijn er!" - }, - "categoryUpdate2": { - "message": "Open de opties om intro's, outro's, koopwaar,... over te slaan." - }, - "help": { - "message": "Help" - }, - "GotIt": { - "message": "Begrepen", - "description": "Used as the button to dismiss a tooltip" - }, - "fullVideoTooltipWarning": { - "message": "Dit segment is groot. Als de hele video over één onderwerp gaat, verander dan van \"overslaan\" naar \"volledige video\". Zie de richtlijnen voor meer informatie." - }, - "categoryPillTitleText": { - "message": "De hele video is gelabeld als deze categorie en is te strak geïntegreerd om te kunnen scheiden" - }, - "chapterNameTooltipWarning": { - "message": "Een van uw hoofdstuknamen lijkt op een categorie. Gebruik in plaats daarvan waar mogelijk categorieën." - }, - "experiementOptOut": { - "message": "Uitschrijven van alle toekomstige experimenten", - "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": "Voor altijd verbergen" - }, - "warningChatInfo": { - "message": "We hebben gemerkt dat u een aantal veelvoorkomende fouten maakte zonder slechte bedoelingen" - }, - "warningTitle": { - "message": "U heeft een waarschuwing gekregen" - }, - "questionButton": { - "message": "Ik heb een vraag" - }, - "warningConfirmButton": { - "message": "Ik begrijp de reden" - }, - "warningError": { - "message": "Fout bij het bevestigen van de waarschuwing:" - }, - "Donate": { - "message": "Doneren" - }, - "considerDonating": { - "message": "Ontwikkeling steunen" - }, - "hideDonationLink": { - "message": "Donatiekoppeling verbergen" - }, - "darkModeOptionsPage": { - "message": "Donkere modus op opties-pagina" - }, - "helpPageThanksForInstalling": { - "message": "Bedankt voor het installeren van SponsorBlock." - }, - "helpPageReviewOptions": { - "message": "Bekijk de onderstaande opties" - }, - "helpPageFeatureDisclaimer": { - "message": "Veel functies zijn standaard uitgeschakeld. Als u intro's of outro's wilt overslaan, Invidious wilt gebruiken, enz., schakelt u ze hieronder in. U kunt ook UI-elementen verbergen/weergeven." - }, - "helpPageHowSkippingWorks": { - "message": "Hoe overslaan werkt" - }, - "helpPageHowSkippingWorks1": { - "message": "Videosegmenten zullen automatisch worden overgeslagen als ze in de database worden gevonden. U kunt de pop-up openen door op het pictogram van de extensie te klikken om een voorbeeld te krijgen van wat ze zijn." - }, - "helpPageHowSkippingWorks2": { - "message": "Als u een segment overslaat, krijgt u een bericht. Als de timing verkeerd lijkt, stem dan door op tegenstemmen te klikken! U kunt ook stemmen in de pop-up." - }, - "Submitting": { - "message": "Indienen" - }, - "helpPageSubmitting1": { - "message": "Indienen kan ofwel in de pop-up door op de knop \"segment begint nu\" te drukken of in de videospeler met de knoppen op de speler." - }, - "helpPageSubmitting2": { - "message": "Klikken op de afspelen-knop geeft het begin van een segment aan en klikken op het stop-pictogram geeft het einde aan. U kunt meerdere sponsors voorbereiden voordat u op indienen klikt. Klikken op de uploadknop zal indienen. Klikken op de vuilnisbak zal verwijderen." - }, - "Editing": { - "message": "Bewerken" - }, - "helpPageEditing1": { - "message": "Als u een fout hebt gemaakt, kunt u uw segmenten bewerken of verwijderen nadat u op de knop met de pijl omhoog hebt geklikt." - }, - "helpPageTooSlow": { - "message": "Dit is te traag" - }, - "helpPageTooSlow1": { - "message": "Er zijn sneltoetsen als u die wilt gebruiken. Druk op de puntkomma-toets om het begin/einde van een sponsorsegment aan te geven en klik op de apostrof om in te dienen. Deze kunnen worden veranderd in de opties. Als u geen QWERTY gebruikt, moet u waarschijnlijk de toetsencombinatie veranderen." - }, - "helpPageCopyOfDatabase": { - "message": "Kan ik een kopie van de database krijgen? Wat gebeurt er als u verdwijnt?" - }, - "helpPageCopyOfDatabase1": { - "message": "De database is openbaar en beschikbaar op" - }, - "helpPageCopyOfDatabase2": { - "message": "De broncode is vrij beschikbaar. Dus, zelfs als mij iets overkomt, zijn uw inzendingen niet verloren." - }, - "helpPageNews": { - "message": "Nieuws en hoe het gemaakt is" - }, - "helpPageSourceCode": { - "message": "Waar kan ik de broncode krijgen?" - }, - "Credits": { - "message": "Dank aan" - }, - "LearnMore": { - "message": "Meer informatie" - }, - "FullDetails": { - "message": "Volledige details" - }, - "CopyDownvoteButtonInfo": { - "message": "Doet een tegenstem en maakt een lokale kopie aan die u opnieuw kunt indienen" - }, - "OpenCategoryWikiPage": { - "message": "Wikipagina van deze categorie openen." - }, - "CopyAndDownvote": { - "message": "Kopiëren en tegenstemmen" - }, - "ContinueVoting": { - "message": "Doorgaan met stemmen" - }, - "ChangeCategoryTooltip": { - "message": "Dit is direct van toepassing op uw segmenten" - }, - "downvote": { - "message": "Tegenstemmen" - }, - "upvote": { - "message": "Stemmen" - }, - "hideSegment": { - "message": "Segment verbergen" - }, - "SponsorTimeEditScrollNewFeature": { - "message": "Gebruik het muiswiel terwijl u over het invoerveld beweegt om de tijd snel aan te passen. Combinaties van de ctrl- of shift-toets kunnen worden gebruikt om de wijzigingen te verfijnen." - }, - "categoryPillNewFeature": { - "message": "Nieuw! Zie wanneer een video volledig gesponsord of zelfpromotie is" - }, - "dayAbbreviation": { - "message": " d", - "description": "100d" - }, - "hourAbbreviation": { - "message": " h", - "description": "100h" - }, - "optionsTabBehavior": { - "message": "Gedrag", - "description": "Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabInterface": { - "message": "Interface", - "description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabKeyBinds": { - "message": "Sneltoetsen", - "description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabBackup": { - "message": "Back-up maken/herstellen", - "description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabAdvanced": { - "message": "Overige", - "description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "noticeVisibilityLabel": { - "message": "Uiterlijk van overslaan-meldingen", - "description": "Option label" - }, - "unbind": { - "message": "Ontkoppelen", - "description": "Unbind keyboard shortcut" - }, - "notSet": { - "message": "Niet ingesteld" - }, - "change": { - "message": "Wijzigen" - }, - "youtubeKeybindWarning": { - "message": "Dit is een ingebouwde YouTube-snelkoppeling. Weet u zeker dat u deze wilt gebruiken?" - }, - "betaServerWarning": { - "message": "BETAserver is ingeschakeld!" - }, - "openOptionsPage": { - "message": "Pagina met opties openen" - }, - "resetToDefault": { - "message": "Instellingen terugzetten op standaard" - }, - "confirmResetToDefault": { - "message": "Weet u zeker dat u alle instellingen wilt terugzetten naar hun standaardwaarden? Dit kan niet ongedaan gemaakt worden." - }, - "exportSegments": { - "message": "Segmenten exporteren" - }, - "importSegments": { - "message": "Segmenten importeren" - }, - "Import": { - "message": "Importeren", - "description": "Button to initiate importing segments. Appears under the textbox where they paste in the data" - }, - "redeemSuccess": { - "message": "Inwisselen geslaagd!" - }, - "redeemFailed": { - "message": "Licentiesleutel is ongeldig" - }, - "hideUpsells": { - "message": "Opties verbergen die niet beschikbaar zijn zonder extra betaling" - }, - "chooseACountry": { - "message": "Land kiezen" - }, - "noDiscount": { - "message": "U komt niet in aanmerking voor een korting" - }, - "discountLink": { - "message": "Kortingslink (zie de roze prijs)" - }, - "selectYourCountry": { - "message": "Selecteer uw land" - }, - "alreadyDonated": { - "message": "Als u al eerder een bedrag hebt gedoneerd, kunt u gratis toegang krijgen door een e-mail te sturen:", - "description": "After the colon is an email address" - }, - "cantAfford": { - "message": "Als u het zich niet kunt veroorloven om een licentie aan te schaffen, klik dan {hier} om te zien of u in aanmerking komt voor een korting", - "description": "Keep the curly braces. The word 'here' should be translated as well." - }, - "patreonSignIn": { - "message": "Aanmelden met Patreon" - }, - "redeem": { - "message": "Inwisselen" - }, - "joinOnPatreon": { - "message": "Abonneren op Patreon" - }, - "oneTimePurchase": { - "message": "Eenmalige aankoop" - }, - "enterLicenseKey": { - "message": "Licentiesleutel invoeren" - }, - "chaptersPage1": { - "message": "De SponsorBlock-functie voor crowd-sourced hoofdstukken is alleen beschikbaar voor mensen die een licentie kopen of voor mensen die gratis toegang krijgen vanwege hun bijdragen in het verleden" - }, - "chaptersPage2": { - "message": "Opmerking: toestemming om hoofdstukken in te dienen is nog steeds gebaseerd op berekende reputatie. Door een licentie te kopen kunt u enkel hoofdstukken bekijken die door anderen zijn ingediend", - "description": "On the chapters page for getting access to the paid chapters feature" - }, - "chapterNewFeature": { - "message": "Nieuwe functie: gecrowdsourcete aangepaste hoofdstukken. Dit zijn hoofdstukken met een eigen naam in video's die gestapeld kunnen worden om steeds preciezer te worden. Koop een licentie om de ingezonden hoofdstukken op deze video te bekijken, zoals: ", - "description": "After the comma, a list of chapters for this video will appear" - }, - "chapterNewFeature2": { - "message": "Nieuwe functie: gecrowdsourcete aangepaste hoofdstukken. Dit zijn hoofdstukken met een eigen naam in video's die gestapeld kunnen worden om steeds preciezer te worden. U heeft gratis toegang. In te schakelen via de opties." - }, - "unsubmittedSegmentCounts": { - "message": "U hebt momenteel {0} in {1}", - "description": "Example: You currently have 12 unsubmitted segments on 5 videos" - }, - "unsubmittedSegmentCountsZero": { - "message": "U hebt momenteel geen niet-ingediende segmenten", - "description": "Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments" - }, - "unsubmittedSegmentsSingular": { - "message": "niet-ingediend segment", - "description": "Example: You currently have 1 *unsubmitted segment* on 1 video" - }, - "unsubmittedSegmentsPlural": { - "message": "niet-ingediende segmenten", - "description": "Example: You currently have 12 *unsubmitted segments* on 5 videos" - }, - "videosSingular": { - "message": "video", - "description": "Example: You currently have 3 unsubmitted segments on 1 *video*" - }, - "videosPlural": { - "message": "video's", - "description": "Example: You currently have 12 unsubmitted segments on 5 *videos*" - }, - "clearUnsubmittedSegments": { - "message": "Alle segmenten wissen", - "description": "Label for a button in settings" - }, - "clearUnsubmittedSegmentsConfirm": { - "message": "Weet u zeker dat u al uw niet-ingediende segmenten wilt wissen?", - "description": "Confirmation message for the Clear unsubmitted segments button" - }, - "showUnsubmittedSegments": { - "message": "Segmenten weergeven", - "description": "Show/hide button for the unsubmitted segments list" - }, - "hideUnsubmittedSegments": { - "message": "Segmenten verbergen", - "description": "Show/hide button for the unsubmitted segments list" - }, - "videoID": { - "message": "Video-ID", - "description": "Header of the unsubmitted segments list" - }, - "segmentCount": { - "message": "Aantal segmenten", - "description": "Header of the unsubmitted segments list" - }, - "actions": { - "message": "Acties", - "description": "Header of the unsubmitted segments list" - }, - "exportSegmentsAsURL": { - "message": "Delen als URL" - } -} diff --git a/public/_locales/no/messages.json b/public/_locales/no/messages.json deleted file mode 100644 index 68cd1ee8..00000000 --- a/public/_locales/no/messages.json +++ /dev/null @@ -1,902 +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" - }, - "SubmitTimes": { - "message": "Send inn segmenter" - }, - "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" - }, - "submitTimesButton": { - "message": "Send inn 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" - }, - "supportOtherSitesDescription": { - "message": "Støtt tredjeparts YouTube-klienter. For å aktivere støtte må du akseptere ytterlige vilkår. Dette fungerer IKKE i inkognitomodus i Chrome og andre Chromium-varianter.", - "description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube" - }, - "supportedSites": { - "message": "Støttede nettsteder: " - }, - "optionsInfo": { - "message": "Skru på Invidious-støtte, skru av autohopp, skjul knapper, og mer." - }, - "addInvidiousInstance": { - "message": "Legg til tredjeparts klientinstans" - }, - "addInvidiousInstanceDescription": { - "message": "Legg til en egendefinert instans. Den må formatteres med KUN domenet. Eksempel: invidious.ajay.app" - }, - "add": { - "message": "Legg til" - }, - "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." - } -} diff --git a/public/_locales/pl/messages.json b/public/_locales/pl/messages.json deleted file mode 100644 index 6cdddc31..00000000 --- a/public/_locales/pl/messages.json +++ /dev/null @@ -1,1238 +0,0 @@ -{ - "fullName": { - "message": "SponsorBlock na YouTube - Pomiń fragmenty sponsorowane", - "description": "Name of the extension." - }, - "Description": { - "message": "Pomijaj sponsorów, prośby o subskrypcje i inne fragmenty filmów na YouTube. Zgłaszaj segmenty sponsorów na filmach, które oglądasz, by oszczędzić czas innym.", - "description": "Description of the extension." - }, - "400": { - "message": "Serwer odpowiedział, że to zapytanie jest niepoprawne" - }, - "429": { - "message": "Zgłoszono za dużo segmentów sponsora dla tego jednego filmu. Czy na pewno jest ich tak dużo?" - }, - "409": { - "message": "To już zostało wysłane wcześniej" - }, - "channelWhitelisted": { - "message": "Kanał dodany do wyjątków!" - }, - "Segment": { - "message": "segment" - }, - "Segments": { - "message": "segmentów" - }, - "SegmentsCap": { - "message": "Segmenty" - }, - "Chapters": { - "message": "Rozdziały" - }, - "renderAsChapters": { - "message": "Pokazuj segmenty jako rozdziały", - "description": "Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system" - }, - "showSegmentNameInChapterBar": { - "message": "Pokaż bieżący segment poza czasem wideo" - }, - "upvoteButtonInfo": { - "message": "Zagłosuj na ten segment" - }, - "reportButtonTitle": { - "message": "Zgłoś" - }, - "reportButtonInfo": { - "message": "Zgłoś ten segment jako nieprawidłowy." - }, - "Dismiss": { - "message": "Odrzuć" - }, - "Loading": { - "message": "Ładowanie..." - }, - "Hide": { - "message": "Nie pokazuj więcej" - }, - "hitGoBack": { - "message": "Kliknij cofnij aby przenieść się do miejsca przed przewinięciem." - }, - "unskip": { - "message": "Cofnij" - }, - "reskip": { - "message": "Pomiń" - }, - "unmute": { - "message": "Anuluj wyciszenie" - }, - "paused": { - "message": "Zatrzymany" - }, - "manualPaused": { - "message": "Timer zatrzymany" - }, - "confirmMSG": { - "message": "Aby edytować lub usuwać poszczególne wartości, kliknij na przycisk info lub otwórz okno rozszerzenia, klikając na ikonę rozszerzenia w prawym górnym rogu." - }, - "clearThis": { - "message": "Czy na pewno chcesz to usunąć?\n\n" - }, - "Unknown": { - "message": "Wystąpił błąd podczas przesyłania twojego segmentu. Proszę spróbować ponownie później." - }, - "sponsorFound": { - "message": "Ten film ma segmenty w bazie danych!" - }, - "sponsor404": { - "message": "Nie znaleziono segmentów" - }, - "sponsorStart": { - "message": "Początek segmentu" - }, - "sponsorEnd": { - "message": "Koniec segmentu" - }, - "sponsorCancel": { - "message": "Anuluj tworzenie segmentu" - }, - "noVideoID": { - "message": "Nie znaleziono filmu YouTube.\nJeżeli to błąd, odśwież stronę." - }, - "refreshSegments": { - "message": "Odśwież segmenty" - }, - "success": { - "message": "Sukces!" - }, - "voted": { - "message": "Zagłosowano!" - }, - "serverDown": { - "message": "Wygląda na to, że serwer nie działa. Skontaktuj się niezwłocznie z deweloperem." - }, - "connectionError": { - "message": "Wystąpił błąd połączenia. Kod błędu: " - }, - "clearTimes": { - "message": "Wyczyść segmenty" - }, - "openPopup": { - "message": "Otwórz okno SponsorBlock" - }, - "closePopup": { - "message": "Zamknij okno" - }, - "closeIcon": { - "message": "Wyłącz ikonę" - }, - "SubmitTimes": { - "message": "Prześlij segmenty" - }, - "sortSegments": { - "message": "Sortuj segmenty" - }, - "submitCheck": { - "message": "Czy na pewno chcesz to zamieścić?" - }, - "whitelistChannel": { - "message": "Dodaj kanał do wyjątków" - }, - "removeFromWhitelist": { - "message": "Usuń kanał z listy wyjątków" - }, - "voteOnTime": { - "message": "Oceń segment" - }, - "Submissions": { - "message": "Zgłoszenia" - }, - "savedPeopleFrom": { - "message": "Oszczędziłeś innym " - }, - "viewLeaderboard": { - "message": "Ranking" - }, - "recordTimesDescription": { - "message": "Wyślij" - }, - "submissionEditHint": { - "message": "Edycja sekcji pojawi się po wciśnięciu „Wyślij”", - "description": "Appears in the popup to inform them that editing has been moved to the video player." - }, - "popupHint": { - "message": "Wskazówka: Możesz skonfigurować skróty klawiszowe do zatwierdzania w opcjach" - }, - "clearTimesButton": { - "message": "Usuń czasy" - }, - "submitTimesButton": { - "message": "Wyślij czasy" - }, - "publicStats": { - "message": "Ten dane są używane na naszej stronie żeby pokazać twój wkład. Zobacz to" - }, - "Username": { - "message": "Nazwa użytkownika" - }, - "setUsername": { - "message": "Ustaw nazwę użytkownika" - }, - "copyPublicID": { - "message": "Kopiuj publiczny identyfikator użytkownika" - }, - "copySegmentID": { - "message": "Kopiuj ID segmentu" - }, - "discordAdvert": { - "message": "Dołącz do oficjalnego serwera na discordzie i podziel się wrażeniami i sugestiami!" - }, - "hideThis": { - "message": "Ukryj to" - }, - "Options": { - "message": "Opcje" - }, - "showButtons": { - "message": "Pokaż przyciski na odtwarzaczu YouTube" - }, - "hideButtons": { - "message": "Ukryj przyciski na odtwarzaczu YouTube" - }, - "hideButtonsDescription": { - "message": "Ta opcja ukrywa przyciski do zamieszczania segmentów pojawiające się na odtwarzaczu YouTube." - }, - "showSkipButton": { - "message": "Wyświetlaj przycisk \"Przejść do wyróżnione?\" na odtwarzaczu" - }, - "showInfoButton": { - "message": "Pokaż przycisk informacyjny na odtwarzaczu YouTube" - }, - "hideInfoButton": { - "message": "Ukryj przycisk informacyjny na odtwarzaczu YouTube" - }, - "autoHideInfoButton": { - "message": "Autoukrywanie przycisku informacji" - }, - "hideDeleteButton": { - "message": "Ukryj przycisk usuwania na odtwarzaczu YouTube" - }, - "showDeleteButton": { - "message": "Pokaż przycisk usuwania na odtwarzaczu YouTube" - }, - "enableViewTracking": { - "message": "Włącz monitorowanie liczby pominięć" - }, - "whatViewTracking": { - "message": "Ta opcja monitoruje pomijane przez Ciebie segmenty, by dać znać użytkownikom, jak bardzo ich wkład pomógł innym, oraz w połączeniu z systemem głosowania zapobiegać dostawaniu się spamu do bazy danych. Rozszerzenie wysyła wiadomość do serwera za każdym razem, kiedy pomijasz segment. Miejmy nadzieję, że większość ludzi tego nie wyłączy i liczniki wyświetleń będą wiarygodne. :)" - }, - "enableViewTrackingInPrivate": { - "message": "Włącz licznik śledzenia pominięć w zakładkach Prywatnych/Incognito" - }, - "enableTrackDownvotes": { - "message": "Zapamiętaj segmenty z łapkami w dół" - }, - "whatTrackDownvotes": { - "message": "Wszystkie segmenty, którym dasz łapkę w dół, pozostaną ukryte nawet po odświeżeniu" - }, - "trackDownvotesWarning": { - "message": "Uwaga: Wyłączenie tego usunie wszystkie poprzednio zapisane łapki w dół" - }, - "enableQueryByHashPrefix": { - "message": "Zapytanie według prefiksu Hash" - }, - "whatQueryByHashPrefix": { - "message": "Zamiast wysyłać do serwera zapytanie o segmenty używając ID filmu, wysyłane są 4 pierwsze znaki hashu tego ID. Serwer zwróci dane dla wszystkich filmów z podobnymi hashami." - }, - "enableRefetchWhenNotFound": { - "message": "Ponawiaj pobieranie segmentów na nowych filmach" - }, - "whatRefetchWhenNotFound": { - "message": "Jeśli film jest nowy i nie znaleziono żadnych segmentów, dane będą pobierane na nowo co kilka minut w czasie oglądania." - }, - "enableShowCategoryWithoutPermission": { - "message": "Pokaż kategorie w menu zgłoszeń, nawet bez uprawnień do zgłaszania" - }, - "showNotice": { - "message": "Pokaż informacje ponownie" - }, - "showSkipNotice": { - "message": "Pokaż informację po pominięciu segmentu" - }, - "showCategoryGuidelines": { - "message": "Pokaż pomoc kategorii" - }, - "noticeVisibilityMode0": { - "message": "Pełnowymiarowe powiadomienia o przewinięciu" - }, - "noticeVisibilityMode1": { - "message": "Małe powiadomienia o automatycznym przewinięciu" - }, - "noticeVisibilityMode2": { - "message": "Małe powiadomienia o przewinięciu" - }, - "noticeVisibilityMode3": { - "message": "Półprzezroczyste powiadomienie o automatycznym przewinięciu" - }, - "noticeVisibilityMode4": { - "message": "Półprzezroczyste powiadomienie dla wszystkich przewinięć" - }, - "longDescription": { - "message": "SponsorBlock pozwala pomijać sponsorów, intra, outra, przypomnienia o subskrypcjach i inne irytujące fragmenty filmów na YouTube. SponsorBlock jest opartym na crowdsourcingu rozszerzeniem do przeglądarki, które pozwala każdemu zgłosić początek i koniec segmentów sponsorowanych oraz innych segmentów w filmach na YouTube. Kiedy ktoś już zamieści te informacje, wszyscy pozostali z tym rozszerzeniem będą pomijać segment sponsorowany. Możesz również pomijać fragmenty teledysków bez muzyki.", - "description": "Full description of the extension on the store pages." - }, - "website": { - "message": "Strona", - "description": "Used on Firefox Store Page" - }, - "sourceCode": { - "message": "Kod źródłowy", - "description": "Used on Firefox Store Page" - }, - "noticeUpdate": { - "message": "Informacje zostały zaktualizowane!", - "description": "The first line of the message displayed after the notice was upgraded." - }, - "noticeUpdate2": { - "message": "Jeśli nadal jej nie lubisz wybierz opcje nie pokazuj więcej.", - "description": "The second line of the message displayed after the notice was upgraded." - }, - "setSkipShortcut": { - "message": "Pomiń segment", - "description": "Keybind label" - }, - "setStartSponsorShortcut": { - "message": "Rozpocznij/zatrzymaj segment", - "description": "Keybind label" - }, - "setSubmitKeybind": { - "message": "Prześlij segmenty", - "description": "Keybind label" - }, - "nextChapterKeybind": { - "message": "Następny rozdział", - "description": "Keybind label" - }, - "previousChapterKeybind": { - "message": "Poprzedni rozdział", - "description": "Keybind label" - }, - "keybindDescription": { - "message": "Wybierz przycisk, wpisując go i wybierz dowolne klucze modyfikujące, których chcesz użyć." - }, - "0": { - "message": "Połączenie przerwane z powodu braku odpowiedzi. Sprawdź swoje połączenie z internetem. Jeśli wszystko z nim w porządku oznacza to, że serwer jest prawdopodobnie przeciążony lub nie działa." - }, - "disableSkipping": { - "message": "Pomijanie jest włączone" - }, - "enableSkipping": { - "message": "Pomijanie jest wyłączone" - }, - "yourWork": { - "message": "Twój wkład", - "description": "Used to describe the section that will show you the statistics from your submissions." - }, - "502": { - "message": "Serwer jest prawdopodobnie przeciążony, spróbuj ponownie za kilka sekund." - }, - "errorCode": { - "message": "Kod błędu: " - }, - "skip": { - "message": "Pomiń" - }, - "mute": { - "message": "Wycisz" - }, - "full": { - "message": "Cały film", - "description": "Used for the name of the option to label an entire video as sponsor or self promotion." - }, - "skip_category": { - "message": "{0} — pominąć?" - }, - "mute_category": { - "message": "{0} — wyciszyć?" - }, - "skip_to_category": { - "message": "Przejść do {0}?", - "description": "Used for skipping to things (Skip to Highlight)" - }, - "skipped": { - "message": "Pominięto {0}", - "description": "Example: Sponsor Skipped" - }, - "muted": { - "message": "Wyciszono {0}", - "description": "Example: Sponsor Muted" - }, - "skipped_to_category": { - "message": "Przewinięto do {0}", - "description": "Used for skipping to things (Skipped to Highlight)" - }, - "disableAutoSkip": { - "message": "Wyłącz autopomijanie" - }, - "enableAutoSkip": { - "message": "Włącz autopomijanie" - }, - "audioNotification": { - "message": "Powiadomienie dźwiękowe przy pominięciu" - }, - "audioNotificationDescription": { - "message": "Powiadomienie dźwiękowe będzie odtwarzane za każdym razem, gdy pomijany jest segment. Jeśli jest wyłączone (lub automatyczne pomijanie jest wyłączone), nie będzie żadnego dźwięku." - }, - "showTimeWithSkips": { - "message": "Pokaż czas po usunięciu segmentów" - }, - "showTimeWithSkipsDescription": { - "message": "Czas ten pojawia się w nawiasie obok czasu bieżącego, pod paskiem postępu. Pokazuje on długość całego filmu po odjęciu wszystkich segmentów. Wliczają się w to segmenty ustawione jako \"pokaż na pasku\"." - }, - "youHaveSkipped": { - "message": "Przewinięto " - }, - "minLower": { - "message": "min" - }, - "minsLower": { - "message": "min" - }, - "hourLower": { - "message": "godz." - }, - "hoursLower": { - "message": "godz." - }, - "youHaveSavedTime": { - "message": "Oszczędzono innym", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "youHaveSavedTimeEnd": { - "message": " życia", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "statusReminder": { - "message": "Sprawdź status serwera na status.sponsor.ajay.app" - }, - "changeUserID": { - "message": "Importuj/Eksportuj swój prywatny UserID" - }, - "whatChangeUserID": { - "message": "To powinno pozostać prywatne. Jest to niczym hasło i nie powinno zostać nikomu udostępnione. Przy jego użyciu ktoś może się pod ciebie podszywać. Jeśli szukasz publicznego ID użytkownika, kliknij ikonę schowka w wyskakującym oknie." - }, - "setUserID": { - "message": "Ustaw prywatny UserID" - }, - "userIDChangeWarning": { - "message": "Uwaga: Zmiana ID użytkownika jest trwała. Czy na pewno chcesz to zrobić? Na wszelki wypadek skopiuj swój poprzedni ID." - }, - "createdBy": { - "message": "Stworzony przez" - }, - "supportOtherSites": { - "message": "Obsługa stron YouTube firm trzecich" - }, - "supportOtherSitesDescription": { - "message": "Wspieraj nieoficjalne klienty YouTube'a. Aby włączyć dla nich wsparcie, musisz przyznać dodatkowe uprawnienia. Ta opcja nie działa w trybie incognito w Chrome i innych przeglądarkach bazujących na Chromium.", - "description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube" - }, - "supportedSites": { - "message": "Wspierane strony: " - }, - "optionsInfo": { - "message": "Włącz wsparcie dla Invidious, wyłącz autopomijanie, ukryj przyciski i więcej." - }, - "addInvidiousInstance": { - "message": "Dodaj instancję zewnętrznego klienta" - }, - "addInvidiousInstanceDescription": { - "message": "Dodaj niestandardową instancję. Musi to być w formie samej domeny. Przykładowo: invidious.ajay.app" - }, - "add": { - "message": "Dodaj" - }, - "addInvidiousInstanceError": { - "message": "Ta domena jest nieprawidłowa. Wartość powinna zawierać TYLKO domenę. Na przykład: invidious.ajay.app" - }, - "resetInvidiousInstance": { - "message": "Zresetuj listę instancji Invidious" - }, - "resetInvidiousInstanceAlert": { - "message": "Zresetujesz listę instancji Invidious" - }, - "currentInstances": { - "message": "Obecne instancje:" - }, - "minDuration": { - "message": "Minimalny czas trwania (sekundy):" - }, - "minDurationDescription": { - "message": "Segmenty krótsze niż ustawiona wartość nie będą pomijane ani pokazywane w odtwarzaczu." - }, - "enableManualSkipOnFullVideo": { - "message": "Użyj ręcznego pomijania, gdy istnieje etykieta na całym filmie" - }, - "skipNoticeDuration": { - "message": "Czas trwania powiadomienia pominięcia (sekundy):" - }, - "skipNoticeDurationDescription": { - "message": "Powiadomienie o pominięciu pozostanie na ekranie przez co najmniej tyle. Po ręcznym pominięciu, może być widoczna przez dłuższy czas." - }, - "shortCheck": { - "message": "Ten segment jest krótszy od ustawionego przez Ciebie minimalnego czasu trwania. Może to oznaczać, że ktoś już to zamieścił, ale nie widzisz tego przez to ustawienie. Czy na pewno chcesz to zamieścić?" - }, - "liveOrPremiere": { - "message": "Przesyłanie segmentów podczas transmisji na żywo lub trwającej premiery jest niedozwolone. Poczekaj, aż się zakończy, a następnie odśwież stronę i sprawdź, czy te segmenty są nadal prawidłowe." - }, - "showUploadButton": { - "message": "Pokaż przycisk wysyłania" - }, - "customServerAddress": { - "message": "Adres serwera SponsorBlock" - }, - "customServerAddressDescription": { - "message": "Adres, którego SponsorBlock używa do wykonywania połączeń z serwerem. O ile nie posiadasz własnego serwera, nie powinno to być zmieniane." - }, - "save": { - "message": "Zapisz" - }, - "reset": { - "message": "Resetuj" - }, - "customAddressError": { - "message": "Ten adres nie jest w prawidłowej formie. Upewnij się, że http:// lub https:// znajduje się na początku i nie ma końcowych ukośników." - }, - "areYouSureReset": { - "message": "Czy na pewno chcesz to zresetować?" - }, - "mobileUpdateInfo": { - "message": "m.youtube.com jest teraz wspierany" - }, - "exportOptions": { - "message": "Importuj/Eksportuj wszystkie ustawienia" - }, - "exportOptionsCopy": { - "message": "Edytuj/kopiuj" - }, - "exportOptionsDownload": { - "message": "Zapisz do pliku" - }, - "exportOptionsUpload": { - "message": "Wczytaj z pliku" - }, - "whatExportOptions": { - "message": "Jest to cała twoja konfiguracja w formacie JSON. Zawarty jest w niej twój prywatny UserID, więc uważaj, komu ją udostępniasz." - }, - "setOptions": { - "message": "Zapisz ustawienia" - }, - "exportOptionsWarning": { - "message": "Uwaga: Zmiana ustawień jest trwała i może popsuć twoją instalację. Czy na pewno chcesz to zrobić? Na wszelki wypadek utwórz kopię poprzednich." - }, - "incorrectlyFormattedOptions": { - "message": "Ten JSON nie został poprawnie sformatowany. Twoje opcje nie zostały zmienione." - }, - "confirmNoticeTitle": { - "message": "Zgłoś segment" - }, - "submit": { - "message": "Wyślij" - }, - "cancel": { - "message": "Anuluj" - }, - "delete": { - "message": "Usuń" - }, - "preview": { - "message": "Podgląd" - }, - "unsubmitted": { - "message": "Niewysłane" - }, - "inspect": { - "message": "Sprawdź" - }, - "edit": { - "message": "Edytuj" - }, - "copyDebugInformation": { - "message": "Skopiuj informacje debugowania do schowka" - }, - "copyDebugInformationFailed": { - "message": "Nie udało się skopiować do schowka" - }, - "copyDebugInformationOptions": { - "message": "Kopiuje do schowka informacje do dostarczenia deweloperowi podczas zgłaszania błędu / gdy deweloper ich sobie zażyczy. Poufne informacje, takie jak ID użytkownika, kanały dodane do wyjątków i adres niestandardowego serwera zostały usunięte. Wciąż zawiera to jednak informacje takie jak twój user agent, przeglądarka, system operacyjny i wersja rozszerzenia. " - }, - "copyDebugInformationComplete": { - "message": "Informacje do debugowania zostały skopiowane do schowka. Możesz usunąć dane, których nie chcesz udostępniać. Zapisz je w pliku tekstowym albo wklej do raportu podczas zgłaszania błędu." - }, - "keyAlreadyUsed": { - "message": "Ten skrót jest przypisany do innej czynności. Wybierz inny." - }, - "to": { - "message": "do", - "description": "Used between segments. Example: 1:20 to 1:30" - }, - "CopiedExclamation": { - "message": "Skopiowano!", - "description": "Used after something has been copied to the clipboard. Example: 'Copied!'" - }, - "generic_guideline1": { - "message": "Zawiera płynne przejścia" - }, - "generic_guideline2": { - "message": "Pominięcie bez zauważalnego przeskoku" - }, - "category_sponsor": { - "message": "Sponsor" - }, - "category_sponsor_description": { - "message": "Płatna promocja, płatne rekomendacje oraz bezpośrednie reklamy. Nie do autopromocji ani darmowych wyrazów uznania dla kwestii/twórców/stron/produktów, które im się podobają." - }, - "category_sponsor_guideline1": { - "message": "Segmenty sponsorowane" - }, - "category_sponsor_guideline2": { - "message": "Nie dla donateów lub merchu" - }, - "category_selfpromo": { - "message": "Nieopłacona/Własna promocja" - }, - "category_selfpromo_description": { - "message": "Podobnie jak \"sponsor\", ale nieodpłatnie bądź w ramach promocji własnej. Obejmuje to sekcje o własnych produktach, donacjach czy informacje o tym, z kim współpracowali." - }, - "category_selfpromo_guideline1": { - "message": "Dotacje, płatne członkostwo i merch" - }, - "category_selfpromo_guideline2": { - "message": "Szybkie przypomnienia, które nie wnoszą nic do filmu" - }, - "category_selfpromo_guideline3": { - "message": "Nie dla produktów zaprojektowanych przez duże firmy" - }, - "category_exclusive_access": { - "message": "Dostęp na wyłączność" - }, - "category_exclusive_access_description": { - "message": "Tylko do oznaczania całych filmów. Używane, gdy materiał wideo przedstawia produkt, usługę lub miejsce, do którego dostęp został otrzymany bezpłatnie lub dzięki dofinansowaniu." - }, - "category_exclusive_access_pill": { - "message": "Ten materiał wideo przedstawia produkt, usługę lub miejsce, do którego dostęp został otrzymany bezpłatnie lub dzięki dofinansowaniu", - "description": "Short description for this category" - }, - "category_exclusive_access_guideline1": { - "message": "Cały film jest poświęcony czemuś z darmowym lub płatnym dostępem" - }, - "category_interaction": { - "message": "Przypomnienie o interakcji (Subskrybuj)" - }, - "category_interaction_description": { - "message": "Gdy w materiale zostaje zawarte krótkie przypomnienie o polubieniu, subskrypcji lub obserwowaniu. Jeśli trwa długo lub dotyczy czegoś konkretnego, powinno być oznaczone jako autopromocja." - }, - "category_interaction_guideline1": { - "message": "Krótkie przypomnienia, by polubić lub zasubskrybować" - }, - "category_interaction_guideline2": { - "message": "Zawiera niebezpośrednie zachęcanie do komentowania" - }, - "category_interaction_guideline3": { - "message": "Nie dla ogólnej promocji, tylko zaproszenia do działania" - }, - "category_interaction_short": { - "message": "Przypomnienie o interakcji" - }, - "category_intro": { - "message": "Przerwa/Animowane intro" - }, - "category_intro_description": { - "message": "Fragment bez faktycznej treści. Może to być pauza, statyczna klatka, powtarzająca się animacja. Nie powinno to być używane do przejść zawierających informacje." - }, - "category_intro_short": { - "message": "Przerwa" - }, - "category_intro_guideline1": { - "message": "Przerwy bez rzeczywistej zawartości" - }, - "category_intro_guideline2": { - "message": "Nie dla przejść zawierających informacje" - }, - "category_outro": { - "message": "Ekran końcowy/Napisy" - }, - "category_outro_description": { - "message": "Napisy końcowe lub gdy pojawia się ekran końcowy. Nie do konkluzji zawierających informacje." - }, - "category_outro_guideline1": { - "message": "Nie zawiera treści, nawet jeśli na ekranie są karty końcowe" - }, - "category_preview": { - "message": "Zapowiedź/Podsumowanie" - }, - "category_preview_description": { - "message": "Zbiór klipów pokazujących to, co pojawi się w tym filmie lub innych filmach w serii, w której wszystkie informacje są powtarzane później w filmie." - }, - "category_preview_guideline1": { - "message": "Klipy, które pojawiają się później lub w następnym filmie" - }, - "category_preview_guideline2": { - "message": "Podsumowanie poprzedniego filmu" - }, - "category_preview_guideline3": { - "message": "Nie dla sekcji, które zawierają potrzebne informacje" - }, - "category_filler": { - "message": "Wypełniacz nietematyczny/żart" - }, - "category_filler_short": { - "message": "Wypełniacz" - }, - "category_filler_guideline1": { - "message": "Przerywniki lub sceny czysto humorystyczne" - }, - "category_filler_guideline2": { - "message": "Rozpraszacze, wpadki, powtórki" - }, - "category_filler_guideline3": { - "message": "Nie nadaje się do scen wymaganych do zrozumienia tematu" - }, - "category_music_offtopic": { - "message": "Muzyka: Sekcja niemuzyczna" - }, - "category_music_offtopic_description": { - "message": "Do użytku jedynie w filmach muzycznych. Powinno to być używane jedynie do tych sekcji filmów muzycznych, które nie są uwzględnione w innej kategorii." - }, - "category_music_offtopic_short": { - "message": "Bez muzyki" - }, - "category_music_offtopic_guideline1": { - "message": "Sekcje, których nie ma w oficjalnych wydaniach" - }, - "category_music_offtopic_guideline2": { - "message": "Niemuzyczna część wystąpienia na żywo" - }, - "category_poi_highlight": { - "message": "Wyróżnione" - }, - "category_poi_highlight_description": { - "message": "Część filmu, która interesuje większość osób. Podobne do komentarzy typu „Filmik zaczyna się od x”." - }, - "category_poi_highlight_guideline1": { - "message": "Część filmu, której szuka większość osób" - }, - "category_poi_highlight_guideline2": { - "message": "Może pomóc pominąć kontekst" - }, - "category_poi_highlight_guideline3": { - "message": "Może pominąć do karty tytułowej lub miniaturki" - }, - "category_chapter": { - "message": "Rozdział" - }, - "category_chapter_description": { - "message": "Innaczej nazwane rozdziały opisujące znaczące fragmenty filmu." - }, - "category_chapter_guideline1": { - "message": "Nie wspominaj o nazwach sponsorów" - }, - "category_chapter_guideline2": { - "message": "Używaj większych rozdziałów dla ogólnych sekcji" - }, - "category_chapter_guideline3": { - "message": "Mniejsze rozdziały mogą być wstawione w większe" - }, - "category_livestream_messages": { - "message": "Transmisja live: Dotacja/Czytanie wiadomości" - }, - "category_livestream_messages_short": { - "message": "Czytanie wiadomości" - }, - "autoSkip": { - "message": "Autopomijanie" - }, - "manualSkip": { - "message": "Ręczne pomijanie" - }, - "showOverlay": { - "message": "Pokaż na pasku" - }, - "disable": { - "message": "Wyłączone" - }, - "autoSkip_POI": { - "message": "Automatycznie przewiń do początku" - }, - "manualSkip_POI": { - "message": "Zapytaj, gdy film się załaduje" - }, - "showOverlay_POI": { - "message": "Pokaż na pasku" - }, - "showOverlay_full": { - "message": "Wyświetl etykietę" - }, - "showOverlay_chapter": { - "message": "Pokaż rozdziały" - }, - "autoSkipOnMusicVideos": { - "message": "Automatycznie pomiń wszystkie segmenty, gdy istnieje segment niemuzyczny" - }, - "muteSegments": { - "message": "Zezwalaj na segmenty, które wyciszą dźwięk zamiast pomijać" - }, - "fullVideoSegments": { - "message": "Pokaż ikonę, gdy film jest w całości reklamą", - "description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo" - }, - "previewColor": { - "message": "Kolor nieprzesłanego segmentu", - "description": "Referring to submissions that have not been sent to the server yet." - }, - "seekBarColor": { - "message": "Kolor paska postępu" - }, - "category": { - "message": "Kategoria" - }, - "skipOption": { - "message": "Tryb pomijania", - "description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)" - }, - "enableTestingServer": { - "message": "Aktywuj serwer beta-testów" - }, - "whatEnableTestingServer": { - "message": "Twoje segmenty i głosy NIE BĘDĄ uwzględniane na głównym serwerze. Używaj tego tylko do testowania." - }, - "testingServerWarning": { - "message": "Żadne segmenty ani głosy NIE BĘDĄ uwzględniane na głównym serwerze podczas połączenia z serwerem testowym. Pamiętaj, żeby to wyłączyć, gdy zechcesz dodać realny wkład." - }, - "bracketNow": { - "message": "(Teraz)" - }, - "moreCategories": { - "message": "Więcej kategorii" - }, - "chooseACategory": { - "message": "Wybierz kategorię" - }, - "enableThisCategoryFirst": { - "message": "Aby przesyłać segmenty o kategorii „{0}”, musisz ją włączyć w opcjach. Za chwilę nastąpi przekierowanie do ustawień.", - "description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options." - }, - "poiOnlyOneSegment": { - "message": "Ostrzeżenie: Ten typ segmentu może być maksymalnie jeden. Przesyłanie kilku na raz spowoduje, że pojawi się losowy." - }, - "youMustSelectACategory": { - "message": "Musisz wybrać kategorię dla każdego segmentu, który zamieszczasz!" - }, - "bracketEnd": { - "message": "(Koniec)" - }, - "End": { - "message": "Koniec", - "description": "Button that skips to the end of a segment" - }, - "hiddenDueToDownvote": { - "message": "ukryty: zminusowany" - }, - "hiddenDueToDuration": { - "message": "ukryty: zbyt krótki" - }, - "manuallyHidden": { - "message": "ręcznie ukryty" - }, - "channelDataNotFound": { - "description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.", - "message": "ID kanału nie zostało jeszcze załadowane. Jeśli używasz embeddowanego filmu, spróbuj użyć strony głównej YouTube'a. Może to być również spowodowane zmianami w layout'cie YouTube'a, jeśli myślisz, że to przez to, dodaj swój komentarz tutaj:" - }, - "invidiousPermissionRefresh": { - "message": "Przeglądarka cofnęła uprawnienia potrzebne do działania na witrynach Invidious i innych witrynach stron trzecich. Kliknij poniższy przycisk, aby reaktywować to uprawnienie." - }, - "acceptPermission": { - "message": "Zaakceptuj uprawnienie" - }, - "permissionRequestSuccess": { - "message": "Uzyskano uprawnienia!" - }, - "permissionRequestFailed": { - "message": "Prośba odrzucona. Może kliknięto „Odmów”?" - }, - "adblockerIssueWhitelist": { - "message": "Jeśli nie możesz rozwiązać tego problemu, wyłącz opcję „Wymuś sprawdzanie kanału przed pomijaniem”, ponieważ SponsorBlock nie jest w stanie pobrać informacji o kanale dla tego wideo" - }, - "forceChannelCheck": { - "message": "Wymuś sprawdzanie kanału przed pomijaniem" - }, - "whatForceChannelCheck": { - "message": "Domyślnie, rozszerzenie pominie segmenty od razu, jeszcze zanim dowie się jaki to kanał. Domyślnie, pewne segmenty na początku filmu mogą zostać pominięte na kanałach dodanych do wyjątków. Włączenie tej opcji temu zapobiegnie, ale wszystkie pominięcia będą nieco opóźnione, gdyż uzyskanie ID kanału może chwilę potrwać. Opóźnienie to może być nieodczuwalne, jeśli masz szybki internet." - }, - "forceChannelCheckPopup": { - "message": "Rozważ włączenie opcji \"Wymuś sprawdzanie kanału przed pomijaniem\"" - }, - "downvoteDescription": { - "message": "Niepoprawne/Zły czas" - }, - "incorrectVote": { - "message": "Nieprawidłowy" - }, - "harmfulVote": { - "message": "Szkodliwy", - "description": "Used for chapter segments when the text is harmful/offensive to remove it faster" - }, - "incorrectCategory": { - "message": "Zmień kategorię" - }, - "nonMusicCategoryOnMusic": { - "message": "Ten film jest skategoryzowany jako muzyka. Czy masz pewność, że jest tutaj sponsor? Jeśli w rzeczywistości jest to „Sekcja Niemuzyczna”, otwórz opcje rozszerzenia i włącz tę kategorię. Wtedy będziesz w stanie zamieścić ten segment jako „Bez Muzyki” zamiast sponsora. Przeczytaj proszę wytyczne, jeśli masz wątpliwości." - }, - "multipleSegments": { - "message": "Wiele segmentów" - }, - "guidelines": { - "message": "Wytyczne" - }, - "readTheGuidelines": { - "message": "Przeczytaj wytyczne!!", - "description": "Show the first time they submit or if they are \"high risk\"" - }, - "categoryUpdate1": { - "message": "Kategorie są tutaj!" - }, - "categoryUpdate2": { - "message": "Otwórz opcje, aby pominąć intra, outra, merch, itp." - }, - "help": { - "message": "Pomoc" - }, - "GotIt": { - "message": "Rozumiem", - "description": "Used as the button to dismiss a tooltip" - }, - "fullVideoTooltipWarning": { - "message": "Ten segment jest duży. Jeśli cały film dotyczy jednego tematu, zmień z \"Pomiń\" na \"Cały film\". Zobacz wytyczne, po więcej informacji." - }, - "categoryPillTitleText": { - "message": "Cały film jest oznaczony jako ta kategoria i jest za bardzo zintegrowany, aby można było go podzielić" - }, - "chapterNameTooltipWarning": { - "message": "Jedna z nazw twojego rozdziału jest podobna do kategorii. Powinieneś używać kategorii, jeśli to możliwe." - }, - "experiementOptOut": { - "message": "Wyłączenie wszystkich przyszłych eksperymentów", - "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": "Schowaj na zawsze" - }, - "warningChatInfo": { - "message": "Zauważyliśmy, że popełniałeś pewne powszechne błędy, które nie są złośliwe" - }, - "warningTitle": { - "message": "Otrzymałeś ostrzeżenie" - }, - "questionButton": { - "message": "Mam pytanie" - }, - "warningConfirmButton": { - "message": "Rozumiem powód" - }, - "warningError": { - "message": "Błąd podczas próby potwierdzenia ostrzeżenia:" - }, - "Donate": { - "message": "Wesprzyj nas" - }, - "considerDonating": { - "message": "Wesprzyj rozwój wtyczki" - }, - "hideDonationLink": { - "message": "Ukryj link do darowizny" - }, - "darkModeOptionsPage": { - "message": "Tryb ciemny na stronie opcji" - }, - "helpPageThanksForInstalling": { - "message": "Dziękujemy za zainstalowanie SponsorBlock." - }, - "helpPageReviewOptions": { - "message": "Przejrzyj poniższe opcje" - }, - "helpPageFeatureDisclaimer": { - "message": "Wiele funkcji jest domyślnie wyłączonych. Jeśli chcesz pomijać intra, outra, używać Invidious, itp., włącz je poniżej. Możesz również ukryć/pokazać elementy interfejsu użytkownika." - }, - "helpPageHowSkippingWorks": { - "message": "Jak działa pomijanie" - }, - "helpPageHowSkippingWorks1": { - "message": "Segmenty filmu zostaną automatycznie pominięte, jeśli znajdują się w bazie danych. Możesz kliknąć na ikonę rozszerzenia, aby podejrzeć, czym one są." - }, - "helpPageHowSkippingWorks2": { - "message": "Za każdym razem, gdy pominiesz segment, otrzymasz powiadomienie. Jeśli moment nie wydaje się być poprawny, kliknij łapkę w dół! Możesz również głosować w okienku pop-up." - }, - "Submitting": { - "message": "Przesyłanie" - }, - "helpPageSubmitting1": { - "message": "Zgłoszenia można dokonać w wyskakującym okienku, naciskając przycisk „Początek segmentu”, lub za pomocą przycisków w odtwarzaczu wideo." - }, - "helpPageSubmitting2": { - "message": "Kliknięcie przycisku odtwarzania wskazuje początek segmentu a kliknięcie ikony stop wskazuje koniec segmentu. Możesz przygotować wielu segmentów przed wysłaniem. Aby wysłać kliknij przycisk potwierdzający, a aby usunąć - na śmietnik." - }, - "Editing": { - "message": "Edytowanie" - }, - "helpPageEditing1": { - "message": "Jeśli się pomyliłeś, możesz edytować i usuwać swoje segmenty poprzez kliknięcie przycisku ze strzałką w górę." - }, - "helpPageTooSlow": { - "message": "Zbyt wolno" - }, - "helpPageTooSlow1": { - "message": "Istnieją skróty klawiszowe, jeśli chcesz ich używać. Naciśnij klawisz średnika, aby wskazać początek/koniec segmentu sponsora i kliknij w apostrof, aby przesłać. Można je zmienić w opcjach. Jeśli nie używasz QWERTY, prawdopodobnie powinieneś zmienić skrót klawiszowy." - }, - "helpPageCopyOfDatabase": { - "message": "Czy mogę otrzymać kopię bazy danych? Co się stanie, jeśli przestaniecie istnieć?" - }, - "helpPageCopyOfDatabase1": { - "message": "Baza danych jest publiczna i dostępna na stronie" - }, - "helpPageCopyOfDatabase2": { - "message": "Kod źródłowy jest dostępny. Tak więc, nawet jeśli coś się ze mną stanie, wasze zgłoszenia nie zostaną utracone." - }, - "helpPageNews": { - "message": "Wiadomości i jak to jest zrobione" - }, - "helpPageSourceCode": { - "message": "Gdzie mogę otrzymać kod źródłowy?" - }, - "Credits": { - "message": "Autorzy" - }, - "LearnMore": { - "message": "Dowiedz się więcej" - }, - "FullDetails": { - "message": "Pełne szczegóły" - }, - "CopyDownvoteButtonInfo": { - "message": "Daje łapkę w dół i tworzy lokalną kopię, abyś mógł przesłać poprawioną wersję" - }, - "OpenCategoryWikiPage": { - "message": "Otwórz stronę wiki dla tej kategorii." - }, - "CopyAndDownvote": { - "message": "Skopiuj i daj łapkę w dół" - }, - "ContinueVoting": { - "message": "Kontynuuj głosowanie" - }, - "ChangeCategoryTooltip": { - "message": "To natychmiastowo zostanie zastosowane do twoich segmentów" - }, - "downvote": { - "message": "Głos przeciw" - }, - "upvote": { - "message": "Głos za" - }, - "hideSegment": { - "message": "Ukryj segment" - }, - "skipSegment": { - "message": "Pomiń segment" - }, - "playChapter": { - "message": "Odtwórz rozdział" - }, - "SponsorTimeEditScrollNewFeature": { - "message": "Użyj scroll'a myszy po najechaniu nad pole edycji, aby szybko dostosować czas. Kombinacje z ctrl'em i shift'em mogą być użyte, aby doszlifować zmiany." - }, - "categoryPillNewFeature": { - "message": "Nowość! Zobacz, kiedy film jest w całości sponsorowany lub jest autopromocją" - }, - "dayAbbreviation": { - "message": "d", - "description": "100d" - }, - "hourAbbreviation": { - "message": "h", - "description": "100h" - }, - "optionsTabBehavior": { - "message": "Zachowanie", - "description": "Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabInterface": { - "message": "Interfejs", - "description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabKeyBinds": { - "message": "Skróty klawiszowe", - "description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabBackup": { - "message": "Kopia/przywracanie", - "description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabAdvanced": { - "message": "Różne", - "description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "noticeVisibilityLabel": { - "message": "Wygląd okna pomijania", - "description": "Option label" - }, - "unbind": { - "message": "Usuń przypisanie", - "description": "Unbind keyboard shortcut" - }, - "notSet": { - "message": "Nie ustawiono" - }, - "change": { - "message": "Zmień" - }, - "youtubeKeybindWarning": { - "message": "To jest wbudowany skrót YouTube. Czy na pewno chcesz go użyć?" - }, - "betaServerWarning": { - "message": "Serwer BETA jest włączony!" - }, - "openOptionsPage": { - "message": "Otwórz stronę ustawień" - }, - "resetToDefault": { - "message": "Resetuj do ustawień domyślnych" - }, - "confirmResetToDefault": { - "message": "Czy na pewno chcesz przywrócić wszystkie ustawienia do ich domyślnych wartości? Tego nie można cofnąć." - }, - "exportSegments": { - "message": "Eksportuj segmenty" - }, - "importSegments": { - "message": "Importuj segmenty" - }, - "Import": { - "message": "Importuj", - "description": "Button to initiate importing segments. Appears under the textbox where they paste in the data" - }, - "redeemSuccess": { - "message": "Pomyślnie zrealizowano!" - }, - "redeemFailed": { - "message": "Klucz licencji jest nieprawidłowy" - }, - "hideUpsells": { - "message": "Ukryj opcje niedostępne bez dodatkowej płatności" - }, - "chooseACountry": { - "message": "Wybierz kraj" - }, - "noDiscount": { - "message": "Nie kwalifikujesz się do przeceny" - }, - "discountLink": { - "message": "Link rabatowy" - }, - "selectYourCountry": { - "message": "Wybierz swój kraj" - }, - "alreadyDonated": { - "message": "Jeśli do tej pory przekazałeś jakąkolwiek darowiznę, możesz odebrać darmowy dostęp poprzez wysyłanie maila do:", - "description": "After the colon is an email address" - }, - "cantAfford": { - "message": "Jeśli nie możesz sobie pozwolić na zakup licencji, kliknij {tutaj} aby sprawdzić, czy kwalifikujesz się do zniżki", - "description": "Keep the curly braces. The word 'here' should be translated as well." - }, - "patreonSignIn": { - "message": "Zaloguj się za pomocą Patreon" - }, - "redeem": { - "message": "Wykorzystaj" - }, - "joinOnPatreon": { - "message": "Wesprzyj na Patreon" - }, - "oneTimePurchase": { - "message": "Jednorazowy zakup" - }, - "enterLicenseKey": { - "message": "Wprowadź klucz licencyjny" - }, - "chaptersPage1": { - "message": "Funkcja społecznościowych rozdziałów SponsorBlock jest dostępna tylko dla osób, które wykupią licencję, albo którym przyznano dostęp za darmo ze względu na swoje wcześniejszy wkład" - }, - "chaptersPage2": { - "message": "Uwaga: Przesyłanie rozdziałów jest nadal oparte na skalkulowanej reputacji. Kupowanie licencji pozwala tylko przeglądać rozdziały przesłane przez innych", - "description": "On the chapters page for getting access to the paid chapters feature" - }, - "chapterNewFeature": { - "message": "Nowa funkcja: niestandardowe rozdziały ze źródeł społecznościowych. Są to sekcje niestandardowo nazwane w filmach, które mogą być ustawione w sposób bardziej precyzyjny. Kup licencję, aby wyświetlić rozdziały przedstawione na tym filmie, takie jak: ", - "description": "After the comma, a list of chapters for this video will appear" - }, - "chapterNewFeature2": { - "message": "Nowa funkcja: niestandardowe rozdziały ze źródeł społecznościowych. Są to sekcje niestandardowo nazwane w filmach, które mogą być ustawione w sposób bardziej precyzyjny." - }, - "unsubmittedSegmentCounts": { - "message": "Aktualnie masz {0} na {1}", - "description": "Example: You currently have 12 unsubmitted segments on 5 videos" - }, - "unsubmittedSegmentCountsZero": { - "message": "Aktualnie nie masz żadnych nieprzesłanych segmentów", - "description": "Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments" - }, - "unsubmittedSegmentsSingular": { - "message": "nieprzesłany segment", - "description": "Example: You currently have 1 *unsubmitted segment* on 1 video" - }, - "unsubmittedSegmentsPlural": { - "message": "nieprzesłanych segmentów", - "description": "Example: You currently have 12 *unsubmitted segments* on 5 videos" - }, - "videosSingular": { - "message": "filmie", - "description": "Example: You currently have 3 unsubmitted segments on 1 *video*" - }, - "videosPlural": { - "message": "filmach", - "description": "Example: You currently have 12 unsubmitted segments on 5 *videos*" - }, - "clearUnsubmittedSegments": { - "message": "Wyczyść wszystkie segmenty", - "description": "Label for a button in settings" - }, - "clearUnsubmittedSegmentsConfirm": { - "message": "Czy na pewno chcesz wyczyścić wszystkie nieprzesłane segmenty?", - "description": "Confirmation message for the Clear unsubmitted segments button" - }, - "showUnsubmittedSegments": { - "message": "Pokaż segmenty", - "description": "Show/hide button for the unsubmitted segments list" - }, - "hideUnsubmittedSegments": { - "message": "Ukryj segmenty", - "description": "Show/hide button for the unsubmitted segments list" - }, - "videoID": { - "message": "ID filmu", - "description": "Header of the unsubmitted segments list" - }, - "segmentCount": { - "message": "Liczba segmentów", - "description": "Header of the unsubmitted segments list" - }, - "actions": { - "message": "Akcje", - "description": "Header of the unsubmitted segments list" - }, - "exportSegmentsAsURL": { - "message": "Udostępnij jako adres URL" - } -} diff --git a/public/_locales/pt_BR/messages.json b/public/_locales/pt_BR/messages.json deleted file mode 100644 index 0b8082ad..00000000 --- a/public/_locales/pt_BR/messages.json +++ /dev/null @@ -1,1150 +0,0 @@ -{ - "fullName": { - "message": "SponsorBlock para YouTube - Pule patrocínios", - "description": "Name of the extension." - }, - "Description": { - "message": "Pule patrocinadores, pedidos para se inscrever, e outros nos vídeos do YouTube. Reporte patrocinadores nos vídeos que você assistir para economizar o tempo dos outros.", - "description": "Description of the extension." - }, - "400": { - "message": "O servidor disse que esse pedido foi inválido" - }, - "429": { - "message": "Você enviou muitos segmentos para esse vídeo, tem certeza que tem tantos assim?" - }, - "409": { - "message": "Isso já foi enviado antes" - }, - "channelWhitelisted": { - "message": "Canal adicionado à lista branca!" - }, - "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 nesse segmento positivamente" - }, - "reportButtonTitle": { - "message": "Reportar" - }, - "reportButtonInfo": { - "message": "Reportar esse segmento como inválido." - }, - "Dismiss": { - "message": "Ignorar" - }, - "Loading": { - "message": "Carregando..." - }, - "Hide": { - "message": "Nunca mostrar" - }, - "hitGoBack": { - "message": "Aperta \"reverter pulo\" para voltar onde estava." - }, - "unskip": { - "message": "Reverter pulo" - }, - "reskip": { - "message": "Pular novamente" - }, - "unmute": { - "message": "Ativar som" - }, - "paused": { - "message": "Pausado" - }, - "manualPaused": { - "message": "Temporizador parado" - }, - "confirmMSG": { - "message": "\n\nPara editar ou remover linhas individuais, clique com o botão direito ou abra o popup da extensão pelo icone no canto superior direito." - }, - "clearThis": { - "message": "Tem certeza que quer limpar isso?\n\n" - }, - "Unknown": { - "message": "Houve um erro ao enviar seus segmentos, tente novamente mais tarde." - }, - "sponsorFound": { - "message": "Este vídeo tem segmentos no banco de dados!" - }, - "sponsor404": { - "message": "Nenhum segmento encontrado" - }, - "sponsorStart": { - "message": "O Segmento Começa Agora" - }, - "sponsorEnd": { - "message": "O Segmento Termina Agora" - }, - "sponsorCancel": { - "message": "Cancelar Criação de Segmento" - }, - "noVideoID": { - "message": "Nenhum vídeo do YouTube encontrado.\nSe isto estiver incorreto, atualize a aba." - }, - "refreshSegments": { - "message": "Atualizar segmentos" - }, - "success": { - "message": "Sucesso!" - }, - "voted": { - "message": "Votado!" - }, - "serverDown": { - "message": "Parece que o servidor caiu. Contate o desenvolvedor o quanto antes." - }, - "connectionError": { - "message": "Ocorreu um erro de conexão. Código de erro: " - }, - "clearTimes": { - "message": "Limpar Segmentos" - }, - "openPopup": { - "message": "Abrir o Popup SponsorBlock" - }, - "closePopup": { - "message": "Fechar Popup" - }, - "closeIcon": { - "message": "Ícone de Fechar" - }, - "SubmitTimes": { - "message": "Enviar Segmentos" - }, - "sortSegments": { - "message": "Organizar Segmentos" - }, - "submitCheck": { - "message": "Você tem certeza que deseja enviar isto?" - }, - "whitelistChannel": { - "message": "Adicionar canal à lista branca" - }, - "removeFromWhitelist": { - "message": "Remover canal da lista branca" - }, - "voteOnTime": { - "message": "Votar Em Um Segmento" - }, - "Submissions": { - "message": "Envios" - }, - "savedPeopleFrom": { - "message": "Você poupou as pessoas de " - }, - "viewLeaderboard": { - "message": "Placar de classificação" - }, - "recordTimesDescription": { - "message": "Enviar" - }, - "submissionEditHint": { - "message": "A edição da seção aparecerá após 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 os atalhos de tecla para enviar nas opções" - }, - "clearTimesButton": { - "message": "Limpar Intervalos" - }, - "submitTimesButton": { - "message": "Enviar Intervalos" - }, - "publicStats": { - "message": "Isso é usado na página pública de estatísticas que mostra o quanto você já contribuiu. Veja-a" - }, - "Username": { - "message": "Nome de usuário" - }, - "setUsername": { - "message": "Definir nome de usuário" - }, - "copyPublicID": { - "message": "Copiar ID Pública de Usuário" - }, - "copySegmentID": { - "message": "Copiar ID do segmento" - }, - "discordAdvert": { - "message": "Junte-se ao servidor do discord oficial para dar dicas e sugestões!" - }, - "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": "Esta opção esconde os botões que aparecem para enviar segmentos no player do YouTube." - }, - "showSkipButton": { - "message": "Manter botão Pular para os Destaques no player" - }, - "showInfoButton": { - "message": "Mostrar botão de Informações no player do Youtube" - }, - "hideInfoButton": { - "message": "Esconder botão de Informações no player do Youtube" - }, - "autoHideInfoButton": { - "message": "Esconder 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 Contador de Segmentos Pulados" - }, - "whatViewTracking": { - "message": "Este recurso controla quais segmentos você pulou para permitir que os usuários saibam o quanto a submissão deles ajudou outros e foi usada como métrica, juntamente com votos positivos para garantir que nenhum spam entre no banco de dados. A extensão envia uma mensagem ao servidor cada vez que você pular um segmento. Espera-se que a maioria das pessoas não mude essa configuração, para que os números de exibição estejam corretos. :)" - }, - "enableViewTrackingInPrivate": { - "message": "Ativar Pular Contagem de Rastreamento em Abas Privadas/Incógnito" - }, - "enableTrackDownvotes": { - "message": "Armazenar votos negativos de segmentos" - }, - "whatTrackDownvotes": { - "message": "Qualquer segmento que você der voto negative permanecerá oculto mesmo após recarregar" - }, - "trackDownvotesWarning": { - "message": "Aviso: Desativar isto excluirá todos os votos negativos armazenados anteriormente" - }, - "enableQueryByHashPrefix": { - "message": "Consulta Por Prefixo Hash" - }, - "whatQueryByHashPrefix": { - "message": "Em vez de solicitar segmentos do servidor usando o videoID, os 4 primeiros caracteres do hash do videoID foram enviados. Este servidor enviará dados de volta para todos os vídeos com hashes similares." - }, - "enableRefetchWhenNotFound": { - "message": "Recuperar Segmentos Em Novos Vídeos" - }, - "whatRefetchWhenNotFound": { - "message": "Se o vídeo for novo e nenhum segmento for encontrado, continuaremos buscando enquanto você assiste." - }, - "enableShowCategoryWithoutPermission": { - "message": "Mostrar categorias no menu de envios mesmo sem permissão de envio" - }, - "whatShowCategoryWithoutPermission": { - "message": "Algumas categorias exigem autorização de envio devido a 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 de Ignorar pequenos quando Pulado Automaticamente" - }, - "noticeVisibilityMode2": { - "message": "Todos os Avisos de Ignorar em Tamanho Pequeno" - }, - "noticeVisibilityMode3": { - "message": "Avisos de Ignorar semi-transparentes quando Pulado Automaticamente" - }, - "noticeVisibilityMode4": { - "message": "Todos os Avisos de Ignorar semi-transparentes" - }, - "longDescription": { - "message": "O SponsorBlock permite que você pule patrocinadores, introduções, créditos finais, lembretes de inscrição, e outras partes irritantes dos vídeos do YouTube. O SponsorBlock é uma extensão de navegador de crowdsourcing que permite enviar a qualquer um o tempo inicial e final de segmentos patrocinados de vídeos do YouTube. Assim que uma pessoa enviar essa informação, todas as outras pessoas com essa extensão irão pular o segmento patrocinado. Você também pode pular seções que não são de música dos vídeos de música.", - "description": "Full description of the extension on the store pages." - }, - "website": { - "message": "Site", - "description": "Used on Firefox Store Page" - }, - "sourceCode": { - "message": "Código fonte", - "description": "Used on Firefox Store Page" - }, - "noticeUpdate": { - "message": "A notificação foi atualizada!", - "description": "The first line of the message displayed after the notice was upgraded." - }, - "noticeUpdate2": { - "message": "Se você ainda não gostar dessa, aperte o botão não mostrar novamente.", - "description": "The second line of the message displayed after the notice was upgraded." - }, - "setSkipShortcut": { - "message": "Pular segmento", - "description": "Keybind label" - }, - "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" - }, - "keybindDescription": { - "message": "Pressione a tecla desejada e escolha quaisquer teclas modificadoras deseja utilizar." - }, - "0": { - "message": "Tempo limite de conexão excedida. Cheque a sua conexão de internet. Se a sua internet estiver funcionando, o servidor está sobrecarregado ou fora do ar." - }, - "disableSkipping": { - "message": "Pular está habilitado" - }, - "enableSkipping": { - "message": "Pular está desabilitado" - }, - "yourWork": { - "message": "Suas submissões", - "description": "Used to describe the section that will show you the statistics from your submissions." - }, - "502": { - "message": "O servidor parece estar sobrecarregado. Tente novamente em alguns segundos." - }, - "errorCode": { - "message": "Código de erro: " - }, - "skip": { - "message": "Pular" - }, - "mute": { - "message": "Silenciar" - }, - "full": { - "message": "Vídeo completo", - "description": "Used for the name of the option to label an entire video as sponsor or self promotion." - }, - "skip_category": { - "message": "Pular {0}?" - }, - "mute_category": { - "message": "Silenciar {0}?" - }, - "skip_to_category": { - "message": "Pular 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" - }, - "skipped_to_category": { - "message": "Pulado para {0}", - "description": "Used for skipping to things (Skipped to Highlight)" - }, - "disableAutoSkip": { - "message": "Desativar Salto Automático" - }, - "enableAutoSkip": { - "message": "Ativar Salto Automático" - }, - "audioNotification": { - "message": "Notificação de áudio ao pular" - }, - "audioNotificationDescription": { - "message": "A notificação de áudio ao pular irá tocar um som sempre que um segmento for pulado. Se desativado (ou o pulo automático estiver desativado), nenhum som será reproduzido." - }, - "showTimeWithSkips": { - "message": "Mostrar tempo com pulos removidos" - }, - "showTimeWithSkipsDescription": { - "message": "Este tempo aparece em parênteses ao lado do tempo atual, abaixo da barra de procura. Isto mostra a duração total do vídeo menos qualquer segmento. Isto inclui segmentos marcados apenas como \"Mostrar na Barra de Procura\"." - }, - "youHaveSkipped": { - "message": "Você pulou " - }, - "minLower": { - "message": "minuto" - }, - "minsLower": { - "message": "minutos" - }, - "hourLower": { - "message": "hora" - }, - "hoursLower": { - "message": "horas" - }, - "youHaveSavedTime": { - "message": "Você poupou das pessoas", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "youHaveSavedTimeEnd": { - "message": " das vidas dos outros", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "statusReminder": { - "message": "Verifique status.sponsor.ajay.app para o status do servidor." - }, - "changeUserID": { - "message": "Importar/Exportar Seu UserID Privado" - }, - "whatChangeUserID": { - "message": "Esta informação deve se mantida privada. Ela é como uma senha e não deve ser compartilhada. Outras pessoas poderão se passar por você caso obtenham acesso. Se estiver procurando por sua ID Pública de Usuário, clique no ícone de prancheta no popup." - }, - "setUserID": { - "message": "Definir UserID Privado" - }, - "userIDChangeWarning": { - "message": "Aviso: A modificação do ID de usuário privado é permanente. Você tem certeza de que quer fazer isso? Certifique-se de fazer backup do anterior." - }, - "createdBy": { - "message": "Criado por" - }, - "supportOtherSites": { - "message": "Suporte a Sites do YouTube de Terceiros" - }, - "supportOtherSitesDescription": { - "message": "Suporte a clientes de terceiros do YouTube. Para habilitar o suporte, você deve aceitar as permissões extras. Isso NÃO funciona em incógnito no Chrome e outras variantes do Chromium.", - "description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube" - }, - "supportedSites": { - "message": "Sites Suportados: " - }, - "optionsInfo": { - "message": "Ativar apoio ao Invidious, desabilitar pular automaticamente, ocultar botões e mais." - }, - "addInvidiousInstance": { - "message": "Adicionar Instância de Cliente de Terceiros" - }, - "addInvidiousInstanceDescription": { - "message": "Adicionar uma instância personalizada. Isso deve ser formatado APENAS com o domínio. Exemplo: invidious.ajay.app" - }, - "add": { - "message": "Adicionar" - }, - "addInvidiousInstanceError": { - "message": "Este é um domínio inválido. Ele deve incluir APENAS a parte do domínio. Exemplo: invidious.ajay.app" - }, - "resetInvidiousInstance": { - "message": "Redefinir Lista de Instâncias do Invidious" - }, - "resetInvidiousInstanceAlert": { - "message": "Você está prestes a redefinir a lista de instâncias do Invidious" - }, - "currentInstances": { - "message": "Instâncias Atuais:" - }, - "minDuration": { - "message": "Duração mínima (segundos):" - }, - "minDurationDescription": { - "message": "Segmentos menores do que o valor definido não serão pulados ou mostrados no reprodutor." - }, - "enableManualSkipOnFullVideo": { - "message": "Usar o pulo manual quando houver um rótulo de vídeo completo" - }, - "whatManualSkipOnFullVideo": { - "message": "Para pessoas que desejam assistir ao vídeo sem interrupção se ele for totalmente patrocinado ou autopromoção." - }, - "skipNoticeDuration": { - "message": "Duração do aviso prévio de pular (segundos):" - }, - "skipNoticeDurationDescription": { - "message": "O aviso de pular ficará na tela por pelo menos este tempo. Para o pulo manual, pode ser visível por mais tempo." - }, - "shortCheck": { - "message": "A seguinte submissão é mais curta do que sua opção de duração mínima. Isto significa que já foi enviada e que está sendo ignorada devido a esta opção. Tem certeza que deseja enviar mesmo assim?" - }, - "liveOrPremiere": { - "message": "Não é permitido o envio de segmentos em livestreams ou premieres ainda em andamento. Por favor, aguarde até que terminem, e em seguida, atualize a página e verifique se os segmentos ainda são válidos." - }, - "showUploadButton": { - "message": "Mostrar botão de envio" - }, - "customServerAddress": { - "message": "Endereço do servidor do SponsorBlock" - }, - "customServerAddressDescription": { - "message": "Endereço que o SponsorBlock usa para fazer chamadas ao servidor.\nA menos que você tenha sua própria instância de servidor, isso não deve ser alterado." - }, - "save": { - "message": "Salvar" - }, - "reset": { - "message": "Redefinir" - }, - "customAddressError": { - "message": "Este endereço não está na forma correta. Certifique-se de que possui http:// ou https:// no início e sem barras no final." - }, - "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": "Exportar para arquivo" - }, - "exportOptionsUpload": { - "message": "Importar de um arquivo" - }, - "setOptions": { - "message": "Definir Opções" - }, - "exportOptionsWarning": { - "message": "Aviso: Alterar as opções é permanente e pode fazer a extensão parar de funcionar. Tem certeza que deseja fazer isso? Certifique-se de fazer um backup por precaução." - }, - "incorrectlyFormattedOptions": { - "message": "Este JSON não está formatado corretamente. Suas opções não foram alteradas." - }, - "confirmNoticeTitle": { - "message": "Enviar Segmento" - }, - "submit": { - "message": "Enviar" - }, - "cancel": { - "message": "Cancelar" - }, - "delete": { - "message": "Deletar" - }, - "preview": { - "message": "Pré-visualizar" - }, - "unsubmitted": { - "message": "Não enviado" - }, - "inspect": { - "message": "Inspecionar" - }, - "edit": { - "message": "Editar" - }, - "copyDebugInformation": { - "message": "Copiar Informações de Depuração Para Área de Transferência" - }, - "copyDebugInformationFailed": { - "message": "Erro ao copiar para a área de transferência" - }, - "copyDebugInformationOptions": { - "message": "Copia informações para a área de transferência para serem fornecidas a um desenvolvedor quando houver um bug / quando um solicitado pelo desenvolvedor. Informações sensíveis como seu ID de usuário, canais na lista de permissões e endereço personalizado do servidor foram removidos. No entanto, ele contém informações como seu useragent, navegador, sistema operacional e número de versão de extensão. " - }, - "copyDebugInformationComplete": { - "message": "A informação de depuração foi copiada para a área de transferência. Sinta-se à vontade para remover qualquer informação que prefira não compartilhar. Salve em um arquivo de texto ou cole-a no relatório de bug." - }, - "keyAlreadyUsed": { - "message": "Este atalho está vinculado a outra ação. Por favor, selecione um atalho diferente." - }, - "to": { - "message": "até", - "description": "Used between segments. Example: 1:20 to 1:30" - }, - "CopiedExclamation": { - "message": "Copiado!", - "description": "Used after something has been copied to the clipboard. Example: 'Copied!'" - }, - "generic_guideline1": { - "message": "Inclui âncoras de transição" - }, - "generic_guideline2": { - "message": "Reproduzir como se nada tivesse sido pulado" - }, - "category_sponsor": { - "message": "Patrocinador" - }, - "category_sponsor_description": { - "message": "Promoção paga, referências pagas e anúncios diretos. Não deve ser usado para Auto promoção ou mensagens grátis para causas/criadores/sites/produtos que eles gostam." - }, - "category_sponsor_guideline1": { - "message": "Promoções pagas" - }, - "category_sponsor_guideline2": { - "message": "Não é para doações ou mercadoria personalizada" - }, - "category_selfpromo": { - "message": "Não-pago/Auto promoção" - }, - "category_selfpromo_description": { - "message": "Similar a \"patrocinador\", mas para auto promoções e segmentos não-pagos. Isso inclui seções sobre vendas, doações ou informações sobre com quem colaboraram." - }, - "category_selfpromo_guideline1": { - "message": "Doações, programa de membros e mercadoria personalizada" - }, - "category_selfpromo_guideline2": { - "message": "Divulgação gratuita que não acrescenta ao vídeo" - }, - "category_selfpromo_guideline3": { - "message": "Não é para produtos de origem corporativa ou mercadorias" - }, - "category_exclusive_access": { - "message": "Acesso Exclusivo" - }, - "category_exclusive_access_description": { - "message": "Apenas para rotular vídeos inteiros. Usado quando um vídeo apresenta um produto, serviço ou local ao qual eles receberam acesso gratuito ou subsidiado." - }, - "category_exclusive_access_pill": { - "message": "Este vídeo apresenta um produto, serviço ou local ao qual eles receberam acesso gratuito ou subsidiado", - "description": "Short description for this category" - }, - "category_exclusive_access_guideline1": { - "message": "Todo o vídeo promove algo de acesso gratuito ou subsidiado" - }, - "category_interaction": { - "message": "Lembrete de interação (inscrever-se)" - }, - "category_interaction_description": { - "message": "Quando houver um pequeno lembrete para curtir, inscrever-se ou segui-los no meio do conteúdo. Se é longo ou sobre algo em específico, deveria ser sob Não-pago/Auto promoção." - }, - "category_interaction_guideline1": { - "message": "Lembretes rápidos para curtir, inscrever ou seguir" - }, - "category_interaction_guideline2": { - "message": "Inclui lembretes indiretos para comentar" - }, - "category_interaction_guideline3": { - "message": "Não é para promoção geral, apenas chamado à ação" - }, - "category_interaction_short": { - "message": "Lembrete de interação" - }, - "category_intro": { - "message": "Intervalo/Animação de Introdução" - }, - "category_intro_description": { - "message": "Um intervalo sem conteúdo real. Pode ser uma pausa, um quadro estático, uma animação repetitiva. Isso não deve ser usado em transições que contenham informação." - }, - "category_intro_short": { - "message": "Intervalo" - }, - "category_intro_guideline1": { - "message": "Intervalo sem conteúdo real" - }, - "category_intro_guideline2": { - "message": "Não é para transições com informações" - }, - "category_outro": { - "message": "Finalização/Créditos" - }, - "category_outro_description": { - "message": "Créditos ou quando os cards finais do YouTube aparecem. Não deve ser usado para conclusões informativas." - }, - "category_outro_guideline1": { - "message": "Não inclue conteúdo, mesmo que cartões de finalização estejam na tela" - }, - "category_preview": { - "message": "Pré-visualização/Recapitulação" - }, - "category_preview_description": { - "message": "Coleção de clipes que mostram o que está por vir neste vídeo ou em outros vídeos em uma série onde todas as informações são repetidas mais tarde no vídeo." - }, - "category_preview_guideline1": { - "message": "Clipes que aparecem mais tarde ou em um vídeo futuro" - }, - "category_preview_guideline2": { - "message": "Recapitulação de um vídeo anterior" - }, - "category_preview_guideline3": { - "message": "Não é para seções que adicionam conteúdo adicional" - }, - "category_filler": { - "message": "Enrolação/Piadas" - }, - "category_filler_short": { - "message": "Enrolação" - }, - "category_filler_guideline1": { - "message": "Cenas tangenciais apenas para enrolação ou humor" - }, - "category_filler_guideline2": { - "message": "Distrações, erros de gravação, replays" - }, - "category_filler_guideline3": { - "message": "Não é para cenas necessárias para o entendimento do tópico" - }, - "category_music_offtopic": { - "message": "Música: Seção sem música" - }, - "category_music_offtopic_description": { - "message": "Apenas para uso em vídeos musicais. Deve ser usado exclusivamente para seções de vídeos musicais que já não pertençam à outra categoria." - }, - "category_music_offtopic_short": { - "message": "Não musical" - }, - "category_music_offtopic_guideline1": { - "message": "Seções que não estão nos lançamentos oficiais" - }, - "category_music_offtopic_guideline2": { - "message": "Sem música numa performance ao vivo" - }, - "category_poi_highlight": { - "message": "Destaques" - }, - "category_poi_highlight_description": { - "message": "A parte do vídeo que a maioria das pessoas procura. Similar aos comentários \"Vídeo começa aos x\"." - }, - "category_poi_highlight_guideline1": { - "message": "A seção que maioria das pessoas está procurando" - }, - "category_poi_highlight_guideline2": { - "message": "Pode pular o contexto" - }, - "category_poi_highlight_guideline3": { - "message": "Pode pular para o título ou miniatura" - }, - "category_chapter": { - "message": "Capítulo" - }, - "category_chapter_description": { - "message": "Capítulos personalizados que descrevem as principais seções de um vídeo." - }, - "category_chapter_guideline1": { - "message": "Não mencione os nomes dos patrocinadores" - }, - "category_livestream_messages": { - "message": "Livestream: Leituras de Doação/Mensagem" - }, - "category_livestream_messages_short": { - "message": "Leitura de mensagens" - }, - "autoSkip": { - "message": "Pular automaticamente" - }, - "manualSkip": { - "message": "Pular manualmente" - }, - "showOverlay": { - "message": "Mostrar barra de progresso" - }, - "disable": { - "message": "Desativar" - }, - "autoSkip_POI": { - "message": "Pular automaticamente para o início" - }, - "manualSkip_POI": { - "message": "Perguntar quando o vídeo carregar" - }, - "showOverlay_POI": { - "message": "Mostrar na barra de progresso" - }, - "showOverlay_full": { - "message": "Mostrar Rótulo" - }, - "showOverlay_chapter": { - "message": "Mostrar Capítulos" - }, - "autoSkipOnMusicVideos": { - "message": "Pular automaticamente todos os segmentos quando há um segmento que não é música" - }, - "muteSegments": { - "message": "Permitir segmentos que silenciem o áudio ao invés de pular" - }, - "fullVideoSegments": { - "message": "Mostrar um ícone quando um vídeo é inteiramente um anúncio", - "description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo" - }, - "previewColor": { - "message": "Cor Não Enviada", - "description": "Referring to submissions that have not been sent to the server yet." - }, - "seekBarColor": { - "message": "Cor da barra" - }, - "category": { - "message": "Categoria" - }, - "skipOption": { - "message": "Opção de pulo", - "description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)" - }, - "enableTestingServer": { - "message": "Habilitar Servidor em teste Beta" - }, - "whatEnableTestingServer": { - "message": "Seus envios e votos NÃO SERÃO ENVIADOS para o servidor principal. Use isso apenas para testes." - }, - "testingServerWarning": { - "message": "Todas os envios e votos NÃO SERÃO ENVIADOS para o servidor principal enquanto se conecta ao servidor de teste. Certifique-se de desativar isso quando você quiser fazer envios reais." - }, - "bracketNow": { - "message": "(agora)" - }, - "moreCategories": { - "message": "Mais categorias" - }, - "chooseACategory": { - "message": "Selecione uma Categoria" - }, - "enableThisCategoryFirst": { - "message": "Para enviar os segmentos com a categoria de \"{0}\", você deve ativá-la nas opções. Você será redirecionado para as opções agora.", - "description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options." - }, - "poiOnlyOneSegment": { - "message": "Aviso: Este tipo de segmento pode ter no máximo um ativo por vez. Enviar múltiplos fará com que um aleatório seja mostrado." - }, - "youMustSelectACategory": { - "message": "Você deve selecionar uma categoria para todos os segmentos que você está enviando!" - }, - "bracketEnd": { - "message": "(Fim)" - }, - "hiddenDueToDownvote": { - "message": "oculto: Downvote" - }, - "hiddenDueToDuration": { - "message": "oculto: muito curto" - }, - "manuallyHidden": { - "message": "oculto manualmente" - }, - "channelDataNotFound": { - "description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.", - "message": "O ID do canal ainda não foi carregado. Se você estiver usando um vídeo embutido, tente usar a página inicial do YouTube. Isso também pode ser causado por mudanças no layout do YouTube, se você achar que este é o caso, faça um comentário aqui:" - }, - "acceptPermission": { - "message": "Aceitar permissão" - }, - "permissionRequestSuccess": { - "message": "Solicitação de permissão bem-sucedida!" - }, - "permissionRequestFailed": { - "message": "Falha na solicitação de permissão, você clicou em negar?" - }, - "adblockerIssueWhitelist": { - "message": "Se você não consegue resolver isso, desative a configuração 'Forçar Verificação do Canal Antes de Pular', pois o SponsorBlock não pode recuperar as informações deste vídeo" - }, - "forceChannelCheck": { - "message": "Forçar Verificação do Canal Antes de Pular" - }, - "whatForceChannelCheck": { - "message": "Por padrão, isso pulará os seguimentos imediatamente, mesmo antes de saber qual é o canal. Por padrão, alguns seguimentos no inicio do vídeo podem ser ignorados nos canais da lista branca. Habilitar esta opção evitará isso, mas fará com que todos os pulos tenham um ligeiro atraso, já que obter o channelID pode levar algum tempo. Este atraso pode não ser perceptível se você tiver internet rápida." - }, - "forceChannelCheckPopup": { - "message": "Considere Ativar a \"Forçar Verificação de Canal Antes de Pular\"" - }, - "downvoteDescription": { - "message": "Tempo errado ou incorreto" - }, - "incorrectCategory": { - "message": "Mudar Categoria" - }, - "nonMusicCategoryOnMusic": { - "message": "Este vídeo é categorizado como música. Tem certeza de que isto tem um patrocinador? Se este é realmente um \"Segmento Não Musical\", abra as opções da extensão e habilite esta categoria. Assim você pode enviar este segmento como \"Não-Musical\" ao invés de patrocinador. Por favor leia as diretrizes se estiver confuso." - }, - "multipleSegments": { - "message": "Múltiplos segmentos" - }, - "guidelines": { - "message": "Diretrizes" - }, - "readTheGuidelines": { - "message": "Leia as Diretrizes!!", - "description": "Show the first time they submit or if they are \"high risk\"" - }, - "categoryUpdate1": { - "message": "As categorias estão aqui!" - }, - "categoryUpdate2": { - "message": "Abra as opções para ignorar as introduções, créditos finais, promoção de mercadoria, etc." - }, - "help": { - "message": "Ajuda" - }, - "GotIt": { - "message": "Entendi", - "description": "Used as the button to dismiss a tooltip" - }, - "fullVideoTooltipWarning": { - "message": "Este segmento é grande. Se o vídeo inteiro for sobre um tópico, altere de \"Pular\" para \"Vídeo completo\". Consulte as diretrizes para obter mais informações." - }, - "categoryPillTitleText": { - "message": "Este vídeo inteiro está rotulado como esta categoria e está muito integrado para poder ser separado" - }, - "chapterNameTooltipWarning": { - "message": "Um de seus nomes de capítulo é semelhante a uma categoria. Sempre que possível, você deve usar categorias." - }, - "experiementOptOut": { - "message": "Optar por sair de todos os experimentos futuros", - "description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private." - }, - "hideForever": { - "message": "Ocultar para sempre" - }, - "warningChatInfo": { - "message": "Percebemos que você estava cometendo alguns erros comuns que não são prejudiciais" - }, - "Donate": { - "message": "Doar" - }, - "considerDonating": { - "message": "Ajude a financiar o desenvolvimento" - }, - "hideDonationLink": { - "message": "Ocultar o Link de Doação" - }, - "darkModeOptionsPage": { - "message": "Modo Escuro na página de Opções" - }, - "helpPageThanksForInstalling": { - "message": "Obrigado por instalar o SponsorBlock." - }, - "helpPageReviewOptions": { - "message": "Por favor revise as opções abaixo" - }, - "helpPageFeatureDisclaimer": { - "message": "Muitoa recursos são desativados por padrão. Se você deseja pular introduções, encerramentos, usar o Invidious, etc, ative as opções abaixo. Você também pode ocultar/mostrar elementos da interface." - }, - "helpPageHowSkippingWorks": { - "message": "Como a função pular funciona" - }, - "helpPageHowSkippingWorks1": { - "message": "Segmentos do vídeo serão pulados automaticamente se forem encontrados na base de dados. Você pode abrir a pop-up clicando no ícone da extensão para ter uma prévia de quais são." - }, - "helpPageHowSkippingWorks2": { - "message": "Sempre que você pular um segmento, você receberá um aviso. Se o tempo estiver errado vote contra clicando no voto negativo! Você também pode votar na pop-up." - }, - "Submitting": { - "message": "Enviando" - }, - "helpPageSubmitting1": { - "message": "O envio pode ser feito no pop-up apertando o botão \"Segmento começa Agora\" ou no reprodutor de vídeo com os botões no reprodutor." - }, - "helpPageSubmitting2": { - "message": "Clicar no botão inicio indica o começo de um segmento e clicar no ícone parar indica o fim. Você pode preparar vários patrocinadores antes de clicar em enviar. Clicar no botão upload irá enviar. Clicar no lixo irá excluir." - }, - "Editing": { - "message": "Editando" - }, - "helpPageEditing1": { - "message": "Se você errar, você pode editar ou deletar seus segmentos clicando na seta para cima." - }, - "helpPageTooSlow": { - "message": "Isto está muito devagar" - }, - "helpPageTooSlow1": { - "message": "Há teclas de atalho se você quiser usá-las. Pressione a tecla ponto e vírgula para indicar o início/fim de um segmento de patrocinador e clique no apóstrofo para enviar. Estas podem ser alteradas nas opções. Se você não usa QWERTY, você provavelmente deve alterar as teclas vinculadas." - }, - "helpPageCopyOfDatabase": { - "message": "Posso baixar uma cópia do banco de dados? O que acontece se vocês desaparecerem?" - }, - "helpPageCopyOfDatabase1": { - "message": "O banco de dados é público e está disponível em" - }, - "helpPageCopyOfDatabase2": { - "message": "O código-fonte está disponível gratuitamente. Então, mesmo que algo aconteça comigo, seus envios não estarão perdidos." - }, - "helpPageNews": { - "message": "Notícias e como tudo é feito" - }, - "helpPageSourceCode": { - "message": "Onde posso obter o código-fonte?" - }, - "Credits": { - "message": "Créditos" - }, - "LearnMore": { - "message": "Saiba mais" - }, - "FullDetails": { - "message": "Ver Detalhes Completos" - }, - "CopyDownvoteButtonInfo": { - "message": "Dá voto negativo e cria uma cópia local para você reenviar" - }, - "OpenCategoryWikiPage": { - "message": "Abrir a wiki dessa categoria." - }, - "CopyAndDownvote": { - "message": "Copiar e dar voto negativo" - }, - "ContinueVoting": { - "message": "Continuar Votando" - }, - "ChangeCategoryTooltip": { - "message": "Isto irá aplicar instantaneamente seus segmentos" - }, - "downvote": { - "message": "Voto negativo" - }, - "upvote": { - "message": "Voto positivo" - }, - "hideSegment": { - "message": "Ocultar segmento" - }, - "skipSegment": { - "message": "Pular segmento" - }, - "playChapter": { - "message": "Reproduzir capítulo" - }, - "SponsorTimeEditScrollNewFeature": { - "message": "Use a roda do mouse enquanto mantêm o cursor sobre a caixa de edição para ajustar o tempo rapidamente. Combinações das teclas ctrl e shift podem ser usadas para refinar as mudanças." - }, - "categoryPillNewFeature": { - "message": "Novo! Veja quando um vídeo é inteiramente patrocinado ou de autopromoção" - }, - "dayAbbreviation": { - "message": "d", - "description": "100d" - }, - "hourAbbreviation": { - "message": "h", - "description": "100h" - }, - "optionsTabBehavior": { - "message": "Comportamento", - "description": "Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabInterface": { - "message": "Interface", - "description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabKeyBinds": { - "message": "Atalhos de teclado", - "description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabBackup": { - "message": "Backup/Restauração", - "description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabAdvanced": { - "message": "Miscelânea", - "description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "noticeVisibilityLabel": { - "message": "Aparência da notificação de pulo", - "description": "Option label" - }, - "unbind": { - "message": "Desvincular", - "description": "Unbind keyboard shortcut" - }, - "notSet": { - "message": "Não configurado" - }, - "change": { - "message": "Alterar" - }, - "youtubeKeybindWarning": { - "message": "Este já é um atalho padrão do YouTube. Tem certeza que deseja utilizá-lo?" - }, - "betaServerWarning": { - "message": "Os Servidores BETA estão ativos!" - }, - "openOptionsPage": { - "message": "Abrir página de opções" - }, - "resetToDefault": { - "message": "Redefinir configurações para o padrão" - }, - "confirmResetToDefault": { - "message": "Tem certeza de que deseja redefinir todas as configurações para os valores padrão? Essa ação não poderá ser desfeita." - }, - "exportSegments": { - "message": "Exportar segmentos" - }, - "importSegments": { - "message": "Importar segmentos" - }, - "Import": { - "message": "Importar", - "description": "Button to initiate importing segments. Appears under the textbox where they paste in the data" - }, - "selectYourCountry": { - "message": "Selecione o seu país" - }, - "unsubmittedSegmentCountsZero": { - "message": "No momento, você não tem segmentos não enviados", - "description": "Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments" - }, - "unsubmittedSegmentsSingular": { - "message": "segmento não enviado", - "description": "Example: You currently have 1 *unsubmitted segment* on 1 video" - }, - "unsubmittedSegmentsPlural": { - "message": "segmentos não enviados", - "description": "Example: You currently have 12 *unsubmitted segments* on 5 videos" - }, - "videosSingular": { - "message": "vídeo", - "description": "Example: You currently have 3 unsubmitted segments on 1 *video*" - }, - "videosPlural": { - "message": "vídeos", - "description": "Example: You currently have 12 unsubmitted segments on 5 *videos*" - }, - "clearUnsubmittedSegments": { - "message": "Excluir todos os segmentos", - "description": "Label for a button in settings" - }, - "clearUnsubmittedSegmentsConfirm": { - "message": "Tem certeza de que deseja excluir todos os segmentos não enviados?", - "description": "Confirmation message for the Clear unsubmitted segments button" - }, - "showUnsubmittedSegments": { - "message": "Mostrar segmentos", - "description": "Show/hide button for the unsubmitted segments list" - }, - "hideUnsubmittedSegments": { - "message": "Ocultar segmentos", - "description": "Show/hide button for the unsubmitted segments list" - }, - "videoID": { - "message": "ID do Vídeo", - "description": "Header of the unsubmitted segments list" - }, - "segmentCount": { - "message": "Número de segmentos", - "description": "Header of the unsubmitted segments list" - }, - "actions": { - "message": "Ações", - "description": "Header of the unsubmitted segments list" - }, - "exportSegmentsAsURL": { - "message": "Compartilhar como URL" - } -} diff --git a/public/_locales/pt_PT/messages.json b/public/_locales/pt_PT/messages.json deleted file mode 100644 index 5b625013..00000000 --- a/public/_locales/pt_PT/messages.json +++ /dev/null @@ -1,500 +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" - }, - "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: " - }, - "clearTimes": { - "message": "Limpar Segmentos" - }, - "openPopup": { - "message": "Abrir o Popup SponsorBlock" - }, - "closePopup": { - "message": "Fechar Popup" - }, - "SubmitTimes": { - "message": "Submeter 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" - }, - "submitTimesButton": { - "message": "Submeter 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." - }, - "showNotice": { - "message": "Mostrar notificação outra vez" - }, - "showSkipNotice": { - "message": "Mostrar aviso após um segmento ser ignorado" - }, - "noticeVisibilityMode0": { - "message": "Avisos de ignorar em tamanho inteiro" - }, - "noticeVisibilityMode1": { - "message": "Avisos pequenos quando ignorado automaticamente" - }, - "noticeVisibilityMode2": { - "message": "Todos os avisos de ignorar em tamanho pequeno" - }, - "website": { - "message": "Site", - "description": "Used on Firefox Store Page" - }, - "sourceCode": { - "message": "Código-fonte", - "description": "Used on Firefox Store Page" - }, - "errorCode": { - "message": "Código de erro: " - }, - "skip": { - "message": "Saltar" - }, - "mute": { - "message": "Silenciar" - }, - "full": { - "message": "Vídeo completo", - "description": "Used for the name of the option to label an entire video as sponsor or self promotion." - }, - "skip_category": { - "message": "Saltar {0}?" - }, - "mute_category": { - "message": "Silenciar {0}?" - }, - "skip_to_category": { - "message": "Avançar para {0}?", - "description": "Used for skipping to things (Skip to Highlight)" - }, - "skipped": { - "message": "{0} ignorado", - "description": "Example: Sponsor Skipped" - }, - "muted": { - "message": "{0} silenciado", - "description": "Example: Sponsor Muted" - }, - "minLower": { - "message": "minuto" - }, - "minsLower": { - "message": "minutos" - }, - "hourLower": { - "message": "hora" - }, - "hoursLower": { - "message": "horas" - }, - "youHaveSavedTime": { - "message": "Poupou pessoas de", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "youHaveSavedTimeEnd": { - "message": " das suas vidas", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "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" - } -} diff --git a/public/_locales/ro/messages.json b/public/_locales/ro/messages.json deleted file mode 100644 index f938d7c1..00000000 --- a/public/_locales/ro/messages.json +++ /dev/null @@ -1,750 +0,0 @@ -{ - "fullName": { - "message": "SponsorBlock pentru YouTube - Sari peste sponsorizări", - "description": "Name of the extension." - }, - "Description": { - "message": "Treci peste sponsorizări, cereri de abonare și multe altele pe videoclipuri de pe YouTube. Raportează sponsorii pe videoclipurile pe care le urmărești pentru a economisi timp altora.", - "description": "Description of the extension." - }, - "400": { - "message": "Serverul a spus că această cerere este invalidă" - }, - "429": { - "message": "Ai trimis prea multe timpuri ale sponsorizărilor pentru acest videoclip, sunteți sigur că sunt atât de multe?" - }, - "409": { - "message": "Acest lucru a fost deja trimis înainte" - }, - "channelWhitelisted": { - "message": "Canalul a fost adăugat la excepții!" - }, - "Segment": { - "message": "segment" - }, - "Segments": { - "message": "segmente" - }, - "upvoteButtonInfo": { - "message": "Votează această înregistrare" - }, - "reportButtonTitle": { - "message": "Raportează" - }, - "reportButtonInfo": { - "message": "Raportează această înregistrare ca fiind incorectă." - }, - "Dismiss": { - "message": "Renunță" - }, - "Loading": { - "message": "Se încarcă..." - }, - "Hide": { - "message": "Nu mai afișa niciodată" - }, - "hitGoBack": { - "message": "Apasă unskip pentru a reveni." - }, - "unskip": { - "message": "Unskip" - }, - "reskip": { - "message": "Sari peste" - }, - "unmute": { - "message": "Activare sunet" - }, - "paused": { - "message": "Pauză" - }, - "manualPaused": { - "message": "Cronometru oprit" - }, - "confirmMSG": { - "message": "Pentru a edita sau a șterge valori individuale, apasă butonul de informații sau deschide popup-ul extensiei apăsând iconița extensiei din colțul dreapta sus." - }, - "clearThis": { - "message": "Ești sigur că vrei să ștergi asta?\n\n" - }, - "Unknown": { - "message": "A apărut o eroare în trimiterea timpilor sponsorizărilor, încearcă din nou mai târziu." - }, - "sponsorFound": { - "message": "Acest videoclip are segmente în baza de date!" - }, - "sponsor404": { - "message": "Nici un segment găsit" - }, - "sponsorStart": { - "message": "Segmentul începe acum" - }, - "sponsorEnd": { - "message": "Segmentul se termină acum" - }, - "sponsorCancel": { - "message": "Anulare creare segment" - }, - "noVideoID": { - "message": "Nu s-a găsit niciun videoclip YouTube.\nDacă acest lucru este incorect, actualizați fila." - }, - "refreshSegments": { - "message": "Reîmprospătare segmente" - }, - "success": { - "message": "Succes!" - }, - "voted": { - "message": "Votat!" - }, - "serverDown": { - "message": "Se pare că serverul este oprit. Contactează imediat dezvoltatorul." - }, - "connectionError": { - "message": "A apărut o eroare de conexiune. Cod de eroare: " - }, - "clearTimes": { - "message": "Curăță segmentele" - }, - "openPopup": { - "message": "Deschide Popup-ul SponsorBlock" - }, - "closePopup": { - "message": "Închide pop-up" - }, - "SubmitTimes": { - "message": "Trimite segmente" - }, - "submitCheck": { - "message": "Sunteți sigur că doriți să trimiteți asta?" - }, - "whitelistChannel": { - "message": "Adaugă canalul la excepții" - }, - "removeFromWhitelist": { - "message": "Șterge canalul de la excepții" - }, - "voteOnTime": { - "message": "Votează pe un Segment" - }, - "Submissions": { - "message": "Submisii" - }, - "savedPeopleFrom": { - "message": "Tu ai salvat alte persoane de la " - }, - "viewLeaderboard": { - "message": "Clasament" - }, - "recordTimesDescription": { - "message": "Trimite" - }, - "submissionEditHint": { - "message": "Editând secțiunea va apărea după ce faceți clic trimiteți", - "description": "Appears in the popup to inform them that editing has been moved to the video player." - }, - "popupHint": { - "message": "Sugestie: Puteți configura combinații de taste pentru trimitere în opțiuni" - }, - "clearTimesButton": { - "message": "Șterge Timpii" - }, - "submitTimesButton": { - "message": "Trimite Timpii" - }, - "publicStats": { - "message": "Acest lucru este folosit pe pagina publică de statistici pentru a arăta cât de mult ai contribuit. Vezi pagina" - }, - "Username": { - "message": "Nume de utilizator" - }, - "setUsername": { - "message": "Setează Numele De Utilizator" - }, - "copyPublicID": { - "message": "Copiază ID-Utilizator Public" - }, - "copySegmentID": { - "message": "Copiază ID-ul Segmentului" - }, - "discordAdvert": { - "message": "Vino și alătură-te serverului oficial de discord pentru a oferi sugestii și feedback!" - }, - "hideThis": { - "message": "Ascunde asta" - }, - "Options": { - "message": "Opţiuni" - }, - "showButtons": { - "message": "Arată Butoanele Pe Playerul De YouTube" - }, - "hideButtons": { - "message": "Ascunde Butoanele Pe Playerul De YouTube" - }, - "hideButtonsDescription": { - "message": "Asta ascunde butoanele ce apar pe playerul de YouTube pentru a trimite segmente." - }, - "showSkipButton": { - "message": "Păstrează Butonul de Sari Peste Secțiunea Evidențiată În Player" - }, - "showInfoButton": { - "message": "Arată Butoanele De Informații Pe Playerul De YouTube" - }, - "hideInfoButton": { - "message": "Ascunde Butoanele De Informații Pe Playerul De YouTube" - }, - "autoHideInfoButton": { - "message": "Ascunde Automat Butonul De Info" - }, - "hideDeleteButton": { - "message": "Ascunde Butonul De Ștergere Pe Playerul De YouTube" - }, - "showDeleteButton": { - "message": "Arată Butonul De Ștergere Pe Playerul De YouTube" - }, - "enableViewTracking": { - "message": "Activează Urmărirea Săriturilor" - }, - "whatViewTracking": { - "message": "Acest lucru urmărește peste ce segmente ai sărit pentru a informa utilizatorii cât de mult înregistrările lor i-au ajutat pe alții și este folosit ca un contor împreună cu upvoturile pentru a ne asigura că spamul nu pătrunde în baza de date. Extensia trimite un mesaj serverului de fiecare dată când sari peste un segment. Sperăm că majoritatea oamenilor nu vor schimba această setare astfel că numerele să fie exacte. :)" - }, - "enableViewTrackingInPrivate": { - "message": "Activează Monitorizarea Numărului de Segmente Omise în Ferestre Private/Incognito" - }, - "enableTrackDownvotes": { - "message": "Stochează Segmente Downvotuite" - }, - "whatTrackDownvotes": { - "message": "Segmentele la care ați dat downvote vor rămâne ascunse chiar si după reîncărcarea paginii" - }, - "trackDownvotesWarning": { - "message": "Atenție: Dezactivarea acestei opțiuni va șterge toate downvote-urile stocate anterior" - }, - "enableQueryByHashPrefix": { - "message": "Interogare după Prefix Hash" - }, - "whatQueryByHashPrefix": { - "message": "În loc să solicite segmente de pe server folosind ID-ul video, primele 4 caractere ale hash-ului ID-ul videoului sunt trimise. Acest server va trimite înapoi date pentru toate videoclipurile cu hash-uri similare." - }, - "enableRefetchWhenNotFound": { - "message": "Refacere segmente pe videoclipuri noi" - }, - "whatRefetchWhenNotFound": { - "message": "Dacă videoclipul este nou și nu sunt segmente găsite, va continua să se refeteze la fiecare câteva minute în timp ce vizionați." - }, - "showNotice": { - "message": "Arată Notificarea Din Nou" - }, - "showSkipNotice": { - "message": "Arată o notificare după ce un segment este sărit" - }, - "showCategoryGuidelines": { - "message": "Afișează Categoria de Ajutor" - }, - "noticeVisibilityMode0": { - "message": "Notificări de Omiteri de Dimensiune Originală" - }, - "noticeVisibilityMode1": { - "message": "Notificări de Omiteri de Dimensiune Mică Pentru Omiteri Automate" - }, - "noticeVisibilityMode2": { - "message": "Toate Notificările de Omiteri de Dimensiune Mică" - }, - "noticeVisibilityMode3": { - "message": "Notificări Estompate pentru Omiteri Automate" - }, - "noticeVisibilityMode4": { - "message": "Toate Notificările de Omiteri Estompate" - }, - "longDescription": { - "message": "SponsorBlock vă permite să săriți peste sponsori, intro, outros, memento-uri pentru abonament și alte părți enervante ale videoclipurilor YouTube SponsorBlock este o extensie crowdsourced de browser, care hai să trimită oricui timpul de început și de sfârșit pentru segmente sponsorizate și alte segmente de videoclipuri YouTube. Odată ce o persoană transmite aceste informații, toți ceilalți cu această extensie vor sări peste segmentul sponsorizat. De asemenea, poți sări peste secțiunile non-muzicale ale videoclipurilor.", - "description": "Full description of the extension on the store pages." - }, - "website": { - "message": "Website", - "description": "Used on Firefox Store Page" - }, - "sourceCode": { - "message": "Cod Sursă", - "description": "Used on Firefox Store Page" - }, - "noticeUpdate": { - "message": "Notificarea a fost actualizată!", - "description": "The first line of the message displayed after the notice was upgraded." - }, - "noticeUpdate2": { - "message": "Dacă nu îți place, apasă butonul nu mai arăta niciodată.", - "description": "The second line of the message displayed after the notice was upgraded." - }, - "setSkipShortcut": { - "message": "Sari peste segment", - "description": "Keybind label" - }, - "setStartSponsorShortcut": { - "message": "Pornește/oprește segmentul", - "description": "Keybind label" - }, - "setSubmitKeybind": { - "message": "Predă segmentele", - "description": "Keybind label" - }, - "keybindDescription": { - "message": "Selectează o tastă prin a o tasta, și alege orice taste modificatoare pe care dorești să o folosești." - }, - "0": { - "message": "Eroare de Conexiune. Verifică-ți conexiunea la internet. Daca internetul functionează, serverul este probabil supraîncărcat sau a căzut." - }, - "disableSkipping": { - "message": "Omiterea este activată" - }, - "enableSkipping": { - "message": "Omiterea este dezactivată" - }, - "yourWork": { - "message": "Munca Ta", - "description": "Used to describe the section that will show you the statistics from your submissions." - }, - "502": { - "message": "Serverul pare să fie supraîncărcat. Încercați din nou în câteva secunde." - }, - "errorCode": { - "message": "Codul Erorii: " - }, - "skip": { - "message": "Sari" - }, - "mute": { - "message": "Mut" - }, - "full": { - "message": "Întregul Videoclip", - "description": "Used for the name of the option to label an entire video as sponsor or self promotion." - }, - "skip_category": { - "message": "Omiteți {0}?" - }, - "mute_category": { - "message": "Mut {0}?" - }, - "skip_to_category": { - "message": "Sari la {0}?", - "description": "Used for skipping to things (Skip to Highlight)" - }, - "skipped": { - "message": "Sărit peste {0}", - "description": "Example: Sponsor Skipped" - }, - "muted": { - "message": "{0} pus pe mut", - "description": "Example: Sponsor Muted" - }, - "skipped_to_category": { - "message": "Sărit la {0}", - "description": "Used for skipping to things (Skipped to Highlight)" - }, - "disableAutoSkip": { - "message": "Dezactivează Autoskip" - }, - "enableAutoSkip": { - "message": "Activează Autoskip" - }, - "audioNotification": { - "message": "Notificare Audio Când Sari" - }, - "audioNotificationDescription": { - "message": "Notificarea audio va reda un sunet atunci când sari peste o sponsorizare. Dacă este dezactivat (sau autoskip este dezactivat), niciun sunet va fi redat." - }, - "showTimeWithSkips": { - "message": "Arată timpul cu săriturile eliminate" - }, - "showTimeWithSkipsDescription": { - "message": "Acest timp apare în paranteze lângă ora curentă sub bara de progres. Aceasta arată durata totală a videoclipului minus orice segment. Aceasta include segmente marcate doar ca \"Afișare în Seekbar\"." - }, - "youHaveSkipped": { - "message": "Ai omis " - }, - "minLower": { - "message": "minut" - }, - "minsLower": { - "message": "minute" - }, - "hourLower": { - "message": "oră" - }, - "hoursLower": { - "message": "ore" - }, - "youHaveSavedTime": { - "message": "Tu ai salvat alte persoane", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "youHaveSavedTimeEnd": { - "message": " din viața lor", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "statusReminder": { - "message": "Verificați status.sponsor.ajay.app pentru starea serverului." - }, - "whatChangeUserID": { - "message": "Aceste informații sunt private și nu ar trebui să fie dezvăluite nimănui. Dacă cineva are aceste informații, pot fi folosite pentru a vă imita. În cazul în care vă căutați ID-ul public de utilizator, dați click pe icoana de clipboard din popup." - }, - "createdBy": { - "message": "Creat De" - }, - "supportOtherSites": { - "message": "Sprijină Site-uri YouTube 3rd Party" - }, - "supportOtherSitesDescription": { - "message": "Sprijină Clienți YouTube 3rd party. Pentru a activa setarea, trebuie să acceptați permisiunile suprimentare. Această funcție NU funcționează în incognito pe Chrome sau în alte variante Chromium.", - "description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube" - }, - "supportedSites": { - "message": "Site-uri cu Sprijin: " - }, - "optionsInfo": { - "message": "Activează suportul Invidious, dezactivează autoskip-ul, ascunde butoanele și altele." - }, - "addInvidiousInstance": { - "message": "Adaugă Instanță pentru clienți 3rd-party" - }, - "add": { - "message": "Adaugă" - }, - "addInvidiousInstanceError": { - "message": "Acesta este un domeniu invalid. Acesta trebuie să includă DOAR partea de domeniu. Exemplu: invidious.ajay.app" - }, - "resetInvidiousInstance": { - "message": "Resetează Lista De Instanțe Invidious" - }, - "resetInvidiousInstanceAlert": { - "message": "Sunteți pe cale să resetați lista de instanțe Invidious" - }, - "currentInstances": { - "message": "Instanțele curente:" - }, - "minDuration": { - "message": "Durată minimă (secunde):" - }, - "minDurationDescription": { - "message": "Segmentele mai scurte decât valoarea setată nu vor fi omise sau afișate în player." - }, - "skipNoticeDuration": { - "message": "Durata notificărilor de omitere (secunde):" - }, - "shortCheck": { - "message": "Următoarea înregistrare este mai mică decât opțiunea voastră de durată minimă. Acest lucru ar putea însemna că a fost deja trimisă și a fost ignorat datorită acestei opțiuni. Sunteți sigur că doriți să trimiteți?" - }, - "showUploadButton": { - "message": "Arată Butonul De Încărcare" - }, - "customServerAddress": { - "message": "Adresa Serverului SponsorBlock" - }, - "customServerAddressDescription": { - "message": "Adresa SponsorBlock este folosită pentru a se efectua apeluri către server.\nDacă nu ai propriul tău server, acesta nu ar trebui modificat." - }, - "save": { - "message": "Salvează" - }, - "reset": { - "message": "Resetează" - }, - "customAddressError": { - "message": "Adresa nu este în forma corectă. Asigurați-vă că http:// sau https:// se află la început." - }, - "areYouSureReset": { - "message": "Sunteți sigur că doriți să resetați asta?" - }, - "mobileUpdateInfo": { - "message": "m.youtube.com este acum suportat" - }, - "exportOptions": { - "message": "Importă/Exportă Toate Opțiunile" - }, - "exportOptionsCopy": { - "message": "Editare/Copiere" - }, - "exportOptionsDownload": { - "message": "Salvează în Fișier" - }, - "exportOptionsUpload": { - "message": "Încarcă din fișier" - }, - "setOptions": { - "message": "Setează Opțiuni" - }, - "exportOptionsWarning": { - "message": "Atenție: Schimbarea acestei opțiuni este permanentă și poate strica instalarea. Sunteți sigur că doriți să faceți asta? Asigurati-vă că ați făcut o copie de rezervă." - }, - "incorrectlyFormattedOptions": { - "message": "Acest JSON nu este formatat corect. Opțiunile dumneavoastră nu au fost modificate." - }, - "confirmNoticeTitle": { - "message": "Trimite Segment" - }, - "submit": { - "message": "Trimite" - }, - "cancel": { - "message": "Anulează" - }, - "delete": { - "message": "Șterge" - }, - "preview": { - "message": "Previzualizare" - }, - "unsubmitted": { - "message": "Nepredat" - }, - "inspect": { - "message": "Inspectează" - }, - "edit": { - "message": "Editare" - }, - "copyDebugInformation": { - "message": "Copiază Informațiile de Depanare În Clipboard" - }, - "copyDebugInformationFailed": { - "message": "Eroare la scrierea în clipboard" - }, - "copyDebugInformationOptions": { - "message": "Copiază informația în clipboard pentru a fi furnizată dezvoltatorului când se găsește o eroare / când un dezvoltator o cere. Informațiile sensibile precum ID-ul de utilizator, canale exceptate, și adresa serverului personalizat au fost șterse. Însă conține informații precum useragent-ul, browser-ul, sistemul de operare, și numărul versiunii extensiei. " - }, - "copyDebugInformationComplete": { - "message": "Informația de depanare a fost copiată în clipboard. Puteți elimina orice informație pe care nu doriți să o partajați. Salvați într-un fișier sau lipiți-o în raportul de erori." - }, - "to": { - "message": "până la", - "description": "Used between segments. Example: 1:20 to 1:30" - }, - "category_sponsor": { - "message": "Sponsor" - }, - "category_sponsor_description": { - "message": "Promovare plătită, refferali plătiți și reclame directe. Nu pentru autopromovări sau promovări gratis ale cauzelor/creatorilor/website-urilor/produselor." - }, - "category_sponsor_guideline1": { - "message": "Promoții plătite" - }, - "category_sponsor_guideline2": { - "message": "Nu este pentru donații sau mărfuri personalizate" - }, - "category_selfpromo": { - "message": "Promovare neplătită/autopromovare" - }, - "category_selfpromo_description": { - "message": "Similar cu \"sponsorizare\" doar că este neplătit sau autopromovare. Aceasta include secțiuni despre merchandise, donații, sau informații despre cei cu care au colaborat." - }, - "category_selfpromo_guideline1": { - "message": "Donații, abonamente și mărfuri personalizate" - }, - "category_selfpromo_guideline2": { - "message": "Mențiuni neplătite care nu ajută videoclipul" - }, - "category_exclusive_access": { - "message": "Acces Exclusiv" - }, - "category_interaction": { - "message": "Reamintire de Interactiune (Abonare)" - }, - "category_interaction_description": { - "message": "Când există o scurtă remintire pentru like, abonare sau urmărire în mijlocul conținutului. Daca este mai lung sau despre ceva specific, folosiți autopromovarea." - }, - "category_interaction_short": { - "message": "Reamintire de Interacțiune" - }, - "category_intro": { - "message": "Pauză/Animație Intro" - }, - "category_intro_description": { - "message": "Un interval fără conținut. Poate fi o pauză, un cadru static, o animație care se repeta. Nu ar trebui sa fie folosit pentru tranziții care conțin informații." - }, - "category_intro_short": { - "message": "Pauză" - }, - "category_outro": { - "message": "Ecran De Final/Credite" - }, - "category_outro_description": { - "message": "Credite sau atunci când apare ecranul de final YouTube. Nu pentru concluzii cu informații." - }, - "category_filler_short": { - "message": "Materiale de umplutură" - }, - "category_music_offtopic": { - "message": "Muzică: Secţiune Non-Muzicală" - }, - "category_music_offtopic_short": { - "message": "Non-Muzical" - }, - "category_livestream_messages": { - "message": "Transmisiune În Direct: Donație/Citirea Mesajelor" - }, - "category_livestream_messages_short": { - "message": "Citire Mesaj" - }, - "autoSkip": { - "message": "Sari Peste Automat" - }, - "manualSkip": { - "message": "Sari Peste Manual" - }, - "showOverlay": { - "message": "Arată În Bara de Derulare" - }, - "disable": { - "message": "Dezactivare" - }, - "fullVideoSegments": { - "message": "Arată o icoană atunci când un videoclip este în întregime o reclamă", - "description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo" - }, - "previewColor": { - "message": "Culoare Nepredată", - "description": "Referring to submissions that have not been sent to the server yet." - }, - "seekBarColor": { - "message": "Culoarea Barei de Derulare" - }, - "category": { - "message": "Categorie" - }, - "skipOption": { - "message": "Opțiunea Săriturii", - "description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)" - }, - "enableTestingServer": { - "message": "Activează Serverul de Teste" - }, - "whatEnableTestingServer": { - "message": "Înregistrările și voturile dumneavoastră NU VOR FI CONTORIZATE pe serverul principal. Utilizați asta doar pentru teste." - }, - "testingServerWarning": { - "message": "Toate înregistrările și voturile dumneavoastră NU VOR FI CONTORIZATE pe serverul principal în timp ce vă conectați la serverul de teste. Asigurați-vă că dezactivați asta când vreți să trimiteți înregistrări reale." - }, - "bracketNow": { - "message": "(Acum)" - }, - "moreCategories": { - "message": "Mai multe categorii" - }, - "chooseACategory": { - "message": "Alege o categorie" - }, - "enableThisCategoryFirst": { - "message": "Pentru a trimite segmente cu categoria \"{0}\", trebuie să o activați în opțiuni. Veți fi redirecționat către opțiuni acum.", - "description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options." - }, - "poiOnlyOneSegment": { - "message": "Atenție: Acest tip de segment poate avea un singur segment activ. Predarea mai multor segmente va cauza un segment aleatoriu să fie afișat." - }, - "youMustSelectACategory": { - "message": "Trebuie să selectaţi o categorie pentru toate segmentele pe care le trimiteţi!" - }, - "bracketEnd": { - "message": "(Sfârșit)" - }, - "hiddenDueToDownvote": { - "message": "ascuns: downvote" - }, - "hiddenDueToDuration": { - "message": "ascuns: prea scurt" - }, - "manuallyHidden": { - "message": "ascuns manual" - }, - "acceptPermission": { - "message": "Acceptă permisiunea" - }, - "forceChannelCheck": { - "message": "Forțează verificarea canalului înainte de a sări" - }, - "whatForceChannelCheck": { - "message": "În mod implicit, va sări peste sponsorizări chiar și înainte de a ști ce canal este. În mod implicit, unele segmente la începutul videoclipului poate fi omis din canalele excluse. Activând această opțiune va preveni asta, dar va face ca toate săriturile să aibă o ușoară întârziere, deoarece obținerea ID-ul canalului poate dura ceva timp. Această întărziere poate fi neobservată daca aveți internet rapid." - }, - "forceChannelCheckPopup": { - "message": "Consideră activarea \"Forțează verificarii canalului înainte de a sări\"" - }, - "downvoteDescription": { - "message": "Timpi Incorecți/Greșiți" - }, - "nonMusicCategoryOnMusic": { - "message": "Acest videoclip este categorisit ca muzică. Ești sigur ca există un sponsor? Dacă acesta este defapt un segment non-muzical, deschideți opțiunile extensiei și activați această categorie. Apoi, puteți trimite acest segment ca non-muzical în loc de sponsol. Vă rugăm să citiți ghidul dacă sunteți confuz." - }, - "multipleSegments": { - "message": "Segmente Multiple" - }, - "guidelines": { - "message": "Instrucțiuni" - }, - "readTheGuidelines": { - "message": "Citește Instrucțiunile!!", - "description": "Show the first time they submit or if they are \"high risk\"" - }, - "categoryUpdate1": { - "message": "Categoriile sunt aici!" - }, - "categoryUpdate2": { - "message": "Deschide opțiunile pentru a sări peste intro-uri, outro-uri, merch, etc." - }, - "Credits": { - "message": "Contribuții" - }, - "LearnMore": { - "message": "Află mai multe" - }, - "FullDetails": { - "message": "Detalii Complete" - }, - "CopyAndDownvote": { - "message": "Copiază și dă downvote" - }, - "downvote": { - "message": "Downvote" - }, - "upvote": { - "message": "Upvote" - }, - "dayAbbreviation": { - "message": "zile", - "description": "100d" - }, - "hourAbbreviation": { - "message": "ore", - "description": "100h" - }, - "optionsTabBehavior": { - "message": "Comportament", - "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": "Interfață", - "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": "Shortcut-uri pentru taste", - "description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabBackup": { - "message": "Backup/Restaurare", - "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": "Aspectul notificării de omiteri", - "description": "Option label" - }, - "resetToDefault": { - "message": "Resetați setările la valori implicite" - }, - "confirmResetToDefault": { - "message": "Ești sigur că vrei sa resetezi toate setările la valorile lor implicite? Această acțiune nu poate fi anulată." - } -} diff --git a/public/_locales/ru/messages.json b/public/_locales/ru/messages.json deleted file mode 100644 index d1b11918..00000000 --- a/public/_locales/ru/messages.json +++ /dev/null @@ -1,1247 +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": "Сегменты" - }, - "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": "Кнопка закрытия" - }, - "SubmitTimes": { - "message": "Отправить сегменты" - }, - "sortSegments": { - "message": "Сортировать сегменты" - }, - "submitCheck": { - "message": "Вы уверены, что хотите это отправить?" - }, - "whitelistChannel": { - "message": "Добавить канал в белый список" - }, - "removeFromWhitelist": { - "message": "Удалить канал из белого списка" - }, - "voteOnTime": { - "message": "Проголосовать за сегмент" - }, - "Submissions": { - "message": "Отправлено сегментов" - }, - "savedPeopleFrom": { - "message": "Вы помогли людям пропустить " - }, - "viewLeaderboard": { - "message": "Доска почёта" - }, - "recordTimesDescription": { - "message": "Отправить" - }, - "submissionEditHint": { - "message": "Редактирование сегментов появится после нажатия на кнопку \"Отправить\"", - "description": "Appears in the popup to inform them that editing has been moved to the video player." - }, - "popupHint": { - "message": "Подсказка: Вы можете настроить сочетания клавиш для отправки в настройках" - }, - "clearTimesButton": { - "message": "Очистить время" - }, - "submitTimesButton": { - "message": "Отправить сегменты" - }, - "publicStats": { - "message": "Оно используется на публичной странице статистики, чтобы показать Ваш вклад. Её можно посмотреть " - }, - "Username": { - "message": "Имя пользователя" - }, - "setUsername": { - "message": "Установить имя пользователя" - }, - "copyPublicID": { - "message": "Копировать публичный UserID" - }, - "copySegmentID": { - "message": "Копировать ID сегмента" - }, - "discordAdvert": { - "message": "Присоединяйтесь к официальному серверу Discord, чтобы оставить предложения и обратную связь!" - }, - "hideThis": { - "message": "Скрыть это" - }, - "Options": { - "message": "Настройки" - }, - "showButtons": { - "message": "Показывать кнопки в плеере YouTube" - }, - "hideButtons": { - "message": "Скрыть кнопки в плеере YouTube" - }, - "hideButtonsDescription": { - "message": "Эта настройка скрывает кнопки для отправки сегментов, расположенные в плеере YouTube." - }, - "showSkipButton": { - "message": "Не скрывать кнопку \"Пропустить до важного\" в плеере YouTube" - }, - "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": "Вместо отправки на сервер ID видео, для получения сегментов будут использоваться первые 4 символа хэша ID. Сервер вернёт данные для всех видео с похожими хэшами." - }, - "enableRefetchWhenNotFound": { - "message": "Перепроверять сегменты в новых видео" - }, - "whatRefetchWhenNotFound": { - "message": "Если видео новое и для него не найдено сегментов, то информация о них будет обновляться каждые пару минут, пока вы смотрите видео." - }, - "enableShowCategoryWithoutPermission": { - "message": "Показывать категории в меню отправки даже без разрешения на публикацию" - }, - "whatShowCategoryWithoutPermission": { - "message": "Некоторые категории требуют разрешения для отправки из-за минимальных требований к репутации" - }, - "showNotice": { - "message": "Показать уведомление снова" - }, - "showSkipNotice": { - "message": "Показывать уведомление после пропуска сегмента" - }, - "showCategoryGuidelines": { - "message": "Показать справку для категории" - }, - "noticeVisibilityMode0": { - "message": "Полноразмерные уведомления о пропусках" - }, - "noticeVisibilityMode1": { - "message": "Уменьшенные уведомления для автоматических пропусков" - }, - "noticeVisibilityMode2": { - "message": "Все уведомления уменьшенного размера" - }, - "noticeVisibilityMode3": { - "message": "Полупрозрачные уведомления для автоматических пропусков" - }, - "noticeVisibilityMode4": { - "message": "Полупрозрачные уведомления для всех пропусков" - }, - "longDescription": { - "message": "SponsorBlock позволяет пропускать спонсорские вставки, начальные и конечные заставки, просьбы подписаться и другое в видео на YouTube. SponsorBlock — коллективное расширение, которое позволяет каждому отправить время начала и конца подобных сегментов в видео. После того, как кто-нибудь отправляет эту информацию, все остальные пользователи расширения будут автоматически пропускать эти сегменты. Так же можно пропускать части клипов без музыки.", - "description": "Full description of the extension on the store pages." - }, - "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" - }, - "nextChapterKeybind": { - "message": "Следующий эпизод", - "description": "Keybind label" - }, - "previousChapterKeybind": { - "message": "Предыдущий эпизод", - "description": "Keybind label" - }, - "keybindDescription": { - "message": "Нажмите на любую кнопку, чтобы выбрать её, а так же выберите модификаторы, если нужно." - }, - "0": { - "message": "Таймаут подключения. Проверьте ваше соединение с интернетом. Если ваш интернет работает, сервер, скорее всего, перегружен или лежит." - }, - "disableSkipping": { - "message": "Пропуск включен" - }, - "enableSkipping": { - "message": "Пропуск выключен" - }, - "yourWork": { - "message": "Ваша работа", - "description": "Used to describe the section that will show you the statistics from your submissions." - }, - "502": { - "message": "Похоже, сервер перегружен. Попробуйте ещё раз через несколько секунд." - }, - "errorCode": { - "message": "Код ошибки: " - }, - "skip": { - "message": "Пропустить" - }, - "mute": { - "message": "Заглушить" - }, - "full": { - "message": "Всё видео", - "description": "Used for the name of the option to label an entire video as sponsor or self promotion." - }, - "skip_category": { - "message": "Пропустить {0}?" - }, - "mute_category": { - "message": "Заглушить {0}?" - }, - "skip_to_category": { - "message": "Пропустить до {0}?", - "description": "Used for skipping to things (Skip to Highlight)" - }, - "skipped": { - "message": "Пропущено: {0}", - "description": "Example: Sponsor Skipped" - }, - "muted": { - "message": "{0} заглушен", - "description": "Example: Sponsor Muted" - }, - "skipped_to_category": { - "message": "Пропущено до {0}", - "description": "Used for skipping to things (Skipped to Highlight)" - }, - "disableAutoSkip": { - "message": "Отключить автоматический пропуск" - }, - "enableAutoSkip": { - "message": "Включить автоматический пропуск" - }, - "audioNotification": { - "message": "Аудио уведомление при пропуске" - }, - "audioNotificationDescription": { - "message": "Аудио уведомление о пропуске будет воспроизводиться каждый раз, когда сегмент пропущен. Если отключено (или автоматический пропуск отключён), звук не будет воспроизводиться." - }, - "showTimeWithSkips": { - "message": "Показывать длительность без сегментов" - }, - "showTimeWithSkipsDescription": { - "message": "Длительность отображается в скобках после фактической под полосой прокрутки. Показывает длительность видео без сегментов. Включает сегменты, для которых выбрано \"Отображать в полосе прокрутки\"." - }, - "youHaveSkipped": { - "message": "Вы пропустили " - }, - "minLower": { - "message": "минуту" - }, - "minsLower": { - "message": "минут" - }, - "hourLower": { - "message": "час" - }, - "hoursLower": { - "message": "часов" - }, - "youHaveSavedTime": { - "message": "Вы сэкономили людям", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "youHaveSavedTimeEnd": { - "message": " их жизней", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "statusReminder": { - "message": "Смотрите состояние сервера на status.sponsor.ajay.app." - }, - "changeUserID": { - "message": "Импорт/Экспорт приватного UserID" - }, - "whatChangeUserID": { - "message": "Держите его в тайне. Относитесь к нему как к паролю и не передавайте никому. Если кто-то им завладеет, то сможет выдать себя за вас. Если вы ищете публичный ID пользователя, нажмите значок буфера обмена во всплывающем окне." - }, - "setUserID": { - "message": "Установить приватный UserID" - }, - "userIDChangeWarning": { - "message": "Внимание: изменение приватного UserID необратимо. Вы действительно хотите это сделать? Сделайте резервную копию на всякий случай." - }, - "createdBy": { - "message": "Создано" - }, - "supportOtherSites": { - "message": "Поддерживать сторонние YouTube-сайты" - }, - "supportOtherSitesDescription": { - "message": "Поддерживать сторонние клиенты для YouTube. Чтобы включить поддержку, Вам понадобится принять дополнительные разрешения. Эта функция НЕ работает в режиме \"инкогнито\" в Chrome и браузерах, основанных на Chromium.", - "description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube" - }, - "supportedSites": { - "message": "Поддерживаемые сайты: " - }, - "optionsInfo": { - "message": "Включить поддержку Invidious, выключить автоматический пропуск, скрыть кнопки и не только." - }, - "addInvidiousInstance": { - "message": "Добавить инстанс стороннего клиента" - }, - "addInvidiousInstanceDescription": { - "message": "Добавить свой инстанс. Формат: ТОЛЬКО домен. Например, invidious.ajay.app" - }, - "add": { - "message": "Добавить" - }, - "addInvidiousInstanceError": { - "message": "Это неправильный домен. Введите ТОЛЬКО домен. Например, invidious.ajay.app" - }, - "resetInvidiousInstance": { - "message": "Сбросить список инстансов Invidious" - }, - "resetInvidiousInstanceAlert": { - "message": "Вы собираетесь сбросить список инстансов Invidious" - }, - "currentInstances": { - "message": "Текущие инстансы:" - }, - "minDuration": { - "message": "Минимальная длительность (в секундах):" - }, - "minDurationDescription": { - "message": "Сегменты короче этого значения не будут пропускаться и не будут показаны в плеере." - }, - "enableManualSkipOnFullVideo": { - "message": "Использовать пропуск вручную, когда видео помечено целиком" - }, - "whatManualSkipOnFullVideo": { - "message": "Для тех, кто хочет просматривать полностью проспонсированные или саморекламные видео без автоматических пропусков." - }, - "skipNoticeDuration": { - "message": "Длительность отображения окошка о пропуске (в секундах):" - }, - "skipNoticeDurationDescription": { - "message": "Окошко о пропуске будет оставаться на экране как минимум в течение этого времени. Может быть активно дольше при пропуске вручную." - }, - "shortCheck": { - "message": "Следующий диапазон времени короче, чем Ваша настройка минимальной длительности. Это может означать, что он уже был отправлен, и просто игнорируется из-за этой настройки. Вы действительно хотите отправить?" - }, - "liveOrPremiere": { - "message": "Отправка сегментов на стримах или премьерах не допускается. Пожалуйста, дождитесь окончания видео, затем обновите страницу и убедитесь, что сегменты всё ещё верные." - }, - "showUploadButton": { - "message": "Показывать кнопку отправки" - }, - "customServerAddress": { - "message": "Адрес сервера SponsorBlock" - }, - "customServerAddressDescription": { - "message": "Адрес, по которому SponsorBlock обращается к серверу.\nМеняйте только если Вы подняли свой сервер." - }, - "save": { - "message": "Сохранить" - }, - "reset": { - "message": "Сбросить" - }, - "customAddressError": { - "message": "Этот адрес неправильного формата. Убедитесь, что он начинается с http:// или https://, и что на конце нет слэшей." - }, - "areYouSureReset": { - "message": "Вы действительно хотите это сбросить?" - }, - "mobileUpdateInfo": { - "message": "m.youtube.com теперь поддерживается" - }, - "exportOptions": { - "message": "Импорт/Экспорт всех настроек" - }, - "exportOptionsCopy": { - "message": "Редактировать/скопировать" - }, - "exportOptionsDownload": { - "message": "Сохранить в файл" - }, - "exportOptionsUpload": { - "message": "Загрузить из файла" - }, - "whatExportOptions": { - "message": "Все настройки в формате JSON. Этот файл содержит Ваш приватный UserID, будьте осторожны когда делитесь этими данными." - }, - "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": "Копирует в буфер обмена информацию, которая будет предоставлена разработчику при возникновении ошибки / по запросу разработчика. Такие сведения, как ID пользователя, список разрешенных каналов и адрес пользовательского сервера не передаются. Однако, отправляются ваш user agent, браузер, операционная система и номер версии расширения. " - }, - "copyDebugInformationComplete": { - "message": "Отладочная информация скопирована в буфер обмена. Вы можете удалить любую информацию, которой не хотите делиться. Сохраните ее в текстовом файле или вставьте в отчет об ошибке." - }, - "keyAlreadyUsed": { - "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!'" - }, - "generic_guideline1": { - "message": "Содержит плавный переход от одной темы к другой" - }, - "generic_guideline2": { - "message": "Пропуск должен произойти незаметно" - }, - "category_sponsor": { - "message": "Спонсор" - }, - "category_sponsor_description": { - "message": "Рекламные интеграции, реферальные ссылки и реклама напрямую. Не для саморекламы или рекомендаций разных событий/создателей/сайтов/продуктов, которые нравятся автору видео." - }, - "category_sponsor_guideline1": { - "message": "Реклама" - }, - "category_sponsor_guideline2": { - "message": "Не для доната или мерчендайза" - }, - "category_selfpromo": { - "message": "Самореклама/рекомендация" - }, - "category_selfpromo_description": { - "message": "Похоже на \"Спонсора\", но для бесплатной рекламы и саморекламы. Включает себя вставки про мерчендайз, пожертвования или информацию о тех, вместе с кем было сделано видео." - }, - "category_selfpromo_guideline1": { - "message": "Донаты, платное членство и мерчендайз" - }, - "category_selfpromo_guideline2": { - "message": "Рекомендации, не добавляющие контекста видео" - }, - "category_selfpromo_guideline3": { - "message": "Не для корпоративной продукции" - }, - "category_exclusive_access": { - "message": "Эксклюзивный доступ" - }, - "category_exclusive_access_description": { - "message": "Категория для всего видео. Используется, когда видео демонстрирует продукт, сервис или местоположение, к которому автор получил бесплатный или проспонсированный доступ." - }, - "category_exclusive_access_pill": { - "message": "Это видео демонстрирует продукт, сервис или местоположение, к которому автор получил бесплатный или проспонсированный доступ", - "description": "Short description for this category" - }, - "category_exclusive_access_guideline1": { - "message": "Всё видео - демонстрация чего-либо, к чему авторам был дан эксклюзивный доступ" - }, - "category_interaction": { - "message": "Напоминание о взаимодействии (подписка)" - }, - "category_interaction_description": { - "message": "Когда есть краткое напоминание поставить лайк, подписаться на канал или в соцсетях в середине содержимого. Если эта вставка длительная или о чём-то конкретном, она должна классифицироваться как самореклама." - }, - "category_interaction_guideline1": { - "message": "Краткие напоминания поставить лайк, подписаться или нажать на колокольчик" - }, - "category_interaction_guideline2": { - "message": "Включает косвенные предложения оставить комментарий" - }, - "category_interaction_guideline3": { - "message": "Не для рекламы, только призывы к действию" - }, - "category_interaction_short": { - "message": "Напоминание о взаимодействии" - }, - "category_intro": { - "message": "Пауза/интро" - }, - "category_intro_description": { - "message": "Часть видео без значимого контента. Может быть паузой, статическим кадром, повторяющейся анимацией. Это не должно использоваться для переходов, содержащих информацию." - }, - "category_intro_short": { - "message": "Заставка" - }, - "category_intro_guideline1": { - "message": "Сегмент без контента" - }, - "category_intro_guideline2": { - "message": "Не для переходных сегментов с информацией" - }, - "category_outro": { - "message": "Конечная заставка/титры" - }, - "category_outro_description": { - "message": "Титры или время появления конечных заставок YouTube. Не для подведения итогов сказанного в видео." - }, - "category_outro_guideline1": { - "message": "Не для сегментов с контентом, даже если на видео показываются конечные заставки" - }, - "category_preview": { - "message": "Предпросмотр/краткое содержание" - }, - "category_preview_description": { - "message": "Коллекция клипов, которые показывают, что происходит в этом видео или других эпизодах, все клипы позже повторяются в видео." - }, - "category_preview_guideline1": { - "message": "Фрагменты, которые появляются позже или в будущем видео" - }, - "category_preview_guideline2": { - "message": "Пересказ предыдущего видео" - }, - "category_preview_guideline3": { - "message": "Не для сегментов с дополнительным контентом" - }, - "category_filler": { - "message": "Заполнение отвлечёнными темами/шутками" - }, - "category_filler_description": { - "message": "Сегменты, которые увеличивают длительность видео за счёт отвлечённых тем или шуток, но не требуются для понимания основного содержания. Не должно иметь сегментов, объясняющих контекст или предысторию. Это очень агрессивная категория, используется тогда, когда вам не до \"веселья\"." - }, - "category_filler_short": { - "message": "Заполнитель" - }, - "category_filler_guideline1": { - "message": "Сцены с отвлечёнными темами или шутками" - }, - "category_filler_guideline2": { - "message": "Разговоры не по теме, неудачные дубли, повторы" - }, - "category_filler_guideline3": { - "message": "Не для сегментов, необходимых для понимания темы" - }, - "category_music_offtopic": { - "message": "Музыка: Сегмент без музыки" - }, - "category_music_offtopic_description": { - "message": "Только для использования в музыкальных клипах. Используется для сегментов музыкальных клипов, которые не относятся к другой категории." - }, - "category_music_offtopic_short": { - "message": "Без музыки" - }, - "category_music_offtopic_guideline1": { - "message": "Сегменты, не включённые в официальные релизы" - }, - "category_music_offtopic_guideline2": { - "message": "Сегменты без музыки во время живого выступления" - }, - "category_poi_highlight": { - "message": "Важное" - }, - "category_poi_highlight_description": { - "message": "Часть видео, которую ищет большинство людей. По сути заменяет комментарии типа \"Видео начинается с x:xx\"." - }, - "category_poi_highlight_guideline1": { - "message": "Момент, который будет интересен большинству людей" - }, - "category_poi_highlight_guideline2": { - "message": "Может помочь пропустить контекст" - }, - "category_poi_highlight_guideline3": { - "message": "Может пропустить до объекта заголовка или превью" - }, - "category_chapter": { - "message": "Эпизод" - }, - "category_chapter_description": { - "message": "Пользовательские названия эпизодов, описывающие основные разделы видео." - }, - "category_chapter_guideline1": { - "message": "Не упоминайте названия спонсорских брендов" - }, - "category_chapter_guideline2": { - "message": "Используйте длинные эпизоды для разделов на общие темы" - }, - "category_chapter_guideline3": { - "message": "Короткие эпизоды могут быть помещены внутри длинных" - }, - "category_livestream_messages": { - "message": "Прямые трансляции: пожертвование/чтение сообщения" - }, - "category_livestream_messages_short": { - "message": "Чтение сообщений" - }, - "autoSkip": { - "message": "Автоматический пропуск" - }, - "manualSkip": { - "message": "Пропускать вручную" - }, - "showOverlay": { - "message": "Показывать в полосе прокрутки" - }, - "disable": { - "message": "Отключить" - }, - "autoSkip_POI": { - "message": "Автоматически пропускать к началу видео" - }, - "manualSkip_POI": { - "message": "Спрашивать после загрузки видео" - }, - "showOverlay_POI": { - "message": "Показывать в полосе прокрутки" - }, - "showOverlay_full": { - "message": "Показывать категорию" - }, - "showOverlay_chapter": { - "message": "Показывать эпизоды" - }, - "autoSkipOnMusicVideos": { - "message": "Пропускать все сегменты автоматически при наличии сегмента без музыки" - }, - "muteSegments": { - "message": "Разрешить сегменты, которые отключают звук вместо пропуска" - }, - "fullVideoSegments": { - "message": "Показывать иконку, когда всё видео является рекламой", - "description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo" - }, - "previewColor": { - "message": "Цвет неотправленного сегмента", - "description": "Referring to submissions that have not been sent to the server yet." - }, - "seekBarColor": { - "message": "Цвет в полосе прокрутки" - }, - "category": { - "message": "Категория" - }, - "skipOption": { - "message": "Способ пропуска", - "description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)" - }, - "enableTestingServer": { - "message": "Включить сервера для бета-тестов" - }, - "whatEnableTestingServer": { - "message": "Отправленные вами вставки и голоса НЕ БУДУТ ОТПРАВЛЕНЫ на главный сервер. Используйте только для тестирования." - }, - "testingServerWarning": { - "message": "Все отправленные вами вставки и голоса НЕ БУДУТ ОТПРАВЛЕНЫ на главный сервер, пока вы подключены к серверу для тестов. Не забудьте отключить эту настройку, чтобы вновь отправлять на главный сервер." - }, - "bracketNow": { - "message": "(Сейчас)" - }, - "moreCategories": { - "message": "Прочие категории" - }, - "chooseACategory": { - "message": "Выберите категорию" - }, - "enableThisCategoryFirst": { - "message": "Чтобы отправить сегменты категории \"{0}\", вы должны включить её в настройках. Сейчас вы будете туда перенаправлены.", - "description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options." - }, - "poiOnlyOneSegment": { - "message": "Предупреждение: Только один сегмент данного типа может быть активным. Отправка нескольких приведёт к отображению только одного случайно выбранного." - }, - "youMustSelectACategory": { - "message": "Вы должны выбрать категорию для всех сегментов, которые вы отправляете!" - }, - "bracketEnd": { - "message": "(Конец)" - }, - "End": { - "message": "Конец", - "description": "Button that skips to the end of a segment" - }, - "hiddenDueToDownvote": { - "message": "скрыто: проголосовали против" - }, - "hiddenDueToDuration": { - "message": "скрыто: слишком коротко" - }, - "manuallyHidden": { - "message": "скрыто вручную" - }, - "channelDataNotFound": { - "description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.", - "message": "ID канала еще не загружен. Если вы используете встроенное видео, попробуйте вместо этого воспользоваться домашней страницей YouTube. Это также может быть вызвано изменениями в дизайне YouTube, если вы считаете, что это так, оставьте комментарий здесь:" - }, - "invidiousPermissionRefresh": { - "message": "Браузер отозвал разрешение, необходимое для работы на Invidious и других сторонних сайтах. Пожалуйста, нажмите на кнопку ниже, чтобы восстановить это разрешение." - }, - "acceptPermission": { - "message": "Дать разрешение" - }, - "permissionRequestSuccess": { - "message": "Разрешение получено!" - }, - "permissionRequestFailed": { - "message": "Не удалось получить разрешение, вы нажали на \"Блокировать\"?" - }, - "adblockerIssueWhitelist": { - "message": "Если вы не можете решить эту проблему, попробуйте отключить \"Принудительная проверка каналов перед пропуском\" в настройках, т. к. SponsorBlock не может определить название канала для этого видео" - }, - "forceChannelCheck": { - "message": "Принудительная проверка каналов перед пропуском" - }, - "whatForceChannelCheck": { - "message": "По умолчанию расширение пропускает сегменты сразу же, не проверяя то, какой это канал. По умолчанию некоторые сегменты в начале видео могут быть пропущены на каналах из белого списка. Включение этой настройки предотвратит это, но все пропуски будут иметь небольшую задержку, так как получение ID канала может занять некоторое время. Эта задержка может быть незаметной, если у вас быстрый интернет." - }, - "forceChannelCheckPopup": { - "message": "Рекомендуем включить \"Принудительная проверка каналов перед пропуском\"" - }, - "downvoteDescription": { - "message": "Не нужен/неверно указано время" - }, - "incorrectVote": { - "message": "Неверно" - }, - "harmfulVote": { - "message": "Оскорбительно", - "description": "Used for chapter segments when the text is harmful/offensive to remove it faster" - }, - "incorrectCategory": { - "message": "Изменить категорию" - }, - "nonMusicCategoryOnMusic": { - "message": "Это видео классифицировано как музыкальное. Вы уверены, что в нём есть спонсоры? Если на самом деле это \"Сегмент без музыки\", откройте параметры расширения и включите эту категорию. Затем вы можете отправить этот сегмент как \"Без музыки\", а не как спонсора. Пожалуйста, прочтите руководство, если вы запутались." - }, - "multipleSegments": { - "message": "Несколько сегментов" - }, - "guidelines": { - "message": "Руководство" - }, - "readTheGuidelines": { - "message": "Прочитайте руководство!!", - "description": "Show the first time they submit or if they are \"high risk\"" - }, - "categoryUpdate1": { - "message": "Приветствуйте категории!" - }, - "categoryUpdate2": { - "message": "Откройте настройки, чтобы пропускать начальные и конечные заставки, саморекламу и другое." - }, - "help": { - "message": "Помощь" - }, - "GotIt": { - "message": "Ясно", - "description": "Used as the button to dismiss a tooltip" - }, - "fullVideoTooltipWarning": { - "message": "Этот сегмент большой. Если в видео только одна тема, то измените значение с «Пропустить» на «Всё видео». Дополнительную информацию смотрите в руководстве." - }, - "categoryPillTitleText": { - "message": "Данная категория применена для всего видео, так как она тесно интегрирована в видео" - }, - "chapterNameTooltipWarning": { - "message": "Название одного из ваших эпизодов похоже на категорию. Постарайтесь использовать категории когда возможно." - }, - "experiementOptOut": { - "message": "Отказаться от всех будущих экспериментов", - "description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private." - }, - "hideForever": { - "message": "Скрыть навсегда" - }, - "warningChatInfo": { - "message": "Мы заметили, что вы совершаете распространённые и не злонамеренные ошибки" - }, - "warningTitle": { - "message": "Вы получили предупреждение" - }, - "questionButton": { - "message": "У меня есть вопрос" - }, - "warningConfirmButton": { - "message": "Я понимаю причину" - }, - "warningError": { - "message": "Не удалось подтвердить предупреждение:" - }, - "Donate": { - "message": "Пожертвовать" - }, - "considerDonating": { - "message": "Помогите финансировать разработку" - }, - "hideDonationLink": { - "message": "Скрыть ссылку на пожертвование" - }, - "darkModeOptionsPage": { - "message": "Тёмный режим на странице настроек" - }, - "helpPageThanksForInstalling": { - "message": "Спасибо за установку SponsorBlock." - }, - "helpPageReviewOptions": { - "message": "Пожалуйста, ознакомьтесь с настройками ниже" - }, - "helpPageFeatureDisclaimer": { - "message": "Многие функции по умолчанию отключены. Если вы хотите пропускать начальные и конечные заставки, использовать Invidious и т.д., включите их ниже. Вы также можете скрыть/показать элементы интерфейса." - }, - "helpPageHowSkippingWorks": { - "message": "Как работает пропуск" - }, - "helpPageHowSkippingWorks1": { - "message": "Сегменты видео будут автоматически пропущены, если они находятся в базе данных. Вы можете открыть всплывающее окно, нажав на значок расширения, чтобы посмотреть, какие сегменты добавлены." - }, - "helpPageHowSkippingWorks2": { - "message": "Когда вы будете пропускать сегмент, вы получите уведомление. Если время покажется вам неправильным, проголосуйте против, нажав на палец вниз! Вы также можете проголосовать во всплывающем окне." - }, - "Submitting": { - "message": "Отправка" - }, - "helpPageSubmitting1": { - "message": "Отправка может быть выполнена во всплывающем окне нажатием на кнопку \"Сегмент начинается отсюда\" или кнопками в видеоплеере." - }, - "helpPageSubmitting2": { - "message": "Нажатие на кнопку воспроизведения означает начало сегмента и нажатие на кнопку стоп обозначает его конец. Вы можете обозначить несколько сегментов перед тем, как нажать на кнопку отправки. Нажатие на корзину удалит всё." - }, - "Editing": { - "message": "Редактирование" - }, - "helpPageEditing1": { - "message": "Если вы сделали что-то не так, вы можете отредактировать или удалить сегменты, нажав на кнопку со стрелкой вверх." - }, - "helpPageTooSlow": { - "message": "Это слишком медленно" - }, - "helpPageTooSlow1": { - "message": "Всё это также можно делать при помощи горячих клавиш. Нажмите клавишу \"ж\" для указания начала/конца сегмента, \"э\" для отправки. Клавиши могут быть изменены в настройках. Если вы не используете QWERTY, то стоит сразу поменять горячее клавиши." - }, - "helpPageCopyOfDatabase": { - "message": "Могу ли я получить копию базы данных? Что если вы пропадёте?" - }, - "helpPageCopyOfDatabase1": { - "message": "База данных доступна для всех здесь:" - }, - "helpPageCopyOfDatabase2": { - "message": "Исходный код в открытом доступе, так что даже если что-то случится со мной, ваш вклад не пропадёт." - }, - "helpPageNews": { - "message": "Новости и как это сделано" - }, - "helpPageSourceCode": { - "message": "Где можно получить исходный код?" - }, - "Credits": { - "message": "Авторы" - }, - "LearnMore": { - "message": "Узнать больше" - }, - "FullDetails": { - "message": "Полная информация" - }, - "CopyDownvoteButtonInfo": { - "message": "Голосует против и создаёт локальную копию сегмента для повторной отправки" - }, - "OpenCategoryWikiPage": { - "message": "Открыть вики-страницу этой категории." - }, - "CopyAndDownvote": { - "message": "Скопировать и проголосовать против" - }, - "ContinueVoting": { - "message": "Продолжить голосование" - }, - "ChangeCategoryTooltip": { - "message": "Это мгновенно применится к вашим сегментам" - }, - "downvote": { - "message": "Голос «против»" - }, - "upvote": { - "message": "Голос «за»" - }, - "hideSegment": { - "message": "Скрыть сегмент" - }, - "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": "Это сочетание используется на сайте YouTube. Вы уверены, что хотите его использовать?" - }, - "betaServerWarning": { - "message": "Используется BETA сервер!" - }, - "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": "Если вы не можете позволить себе приобрести лицензию, нажмите {сюда}, чтобы узнать, имеете ли вы право на скидку", - "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": "Функция SponsorBlock \"эпизоды от сообщества\" доступна только для тех, кто приобрёл лицензию, и тех, кому был предоставлен бесплатный доступ благодаря их прошлым вкладам" - }, - "chaptersPage2": { - "message": "Примечание: разрешение на отправку эпизодов все еще основывается на рассчитываемой репутации. Приобретая лицензию, вы можете просматривать только эпизоды, отправленные другими", - "description": "On the chapters page for getting access to the paid chapters feature" - }, - "chapterNewFeature": { - "message": "Новая функция: эпизоды от сообщества. Это разделы видео с пользовательскими названиями, которые могут быть помещены внутри других эпизодов для более точной разметки. Приобретите лицензию, чтобы видеть названия эпизодов, как, например, эпизоды в этом видео: ", - "description": "After the comma, a list of chapters for this video will appear" - }, - "chapterNewFeature2": { - "message": "Новая функция: эпизоды от сообщества. Это разделы видео с пользовательскими названиями, которые могут быть помещены внутри других эпизодов для более точной разметки. У вас есть бесплатный доступ к этой функции, включите её в настройках." - }, - "unsubmittedSegmentCounts": { - "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": "ID видео", - "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": "Поделиться ссылкой" - } -} diff --git a/public/_locales/sk/messages.json b/public/_locales/sk/messages.json deleted file mode 100644 index 5d05d12f..00000000 --- a/public/_locales/sk/messages.json +++ /dev/null @@ -1,1064 +0,0 @@ -{ - "fullName": { - "message": "SponsorBlock pre YouTube - Preskočte sponzorstvá", - "description": "Name of the extension." - }, - "Description": { - "message": "Preskoč sponzorstvá, žiadosti o odber atď. v YouTube videách. Nahlás sponzorované segmenty vo videách čo sleduješ a ušetri ostatným čas.", - "description": "Description of the extension." - }, - "400": { - "message": "Server hlási, že táto požiadavka je neplatná" - }, - "429": { - "message": "Pre toto video ste pridali príliš veľa segmentov. Ste si istí, že ich je toľko?" - }, - "409": { - "message": "Tento segment už bol pridaný" - }, - "channelWhitelisted": { - "message": "Kanál pridaný do výnimiek!" - }, - "Segment": { - "message": "segment" - }, - "Segments": { - "message": "segmentov" - }, - "SegmentsCap": { - "message": "Segmenty" - }, - "Chapters": { - "message": "Kapitoly" - }, - "renderAsChapters": { - "message": "Zobraziť segmenty ako kapitoly", - "description": "Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system" - }, - "showSegmentNameInChapterBar": { - "message": "Zobraziť aktuálny segment vedľa času videa" - }, - "upvoteButtonInfo": { - "message": "Hlasovať pre tento príspevok" - }, - "reportButtonTitle": { - "message": "Nahlásiť" - }, - "reportButtonInfo": { - "message": "Nahlásiť tento segment ako nesprávny." - }, - "Dismiss": { - "message": "Zrušiť" - }, - "Loading": { - "message": "Načítavanie..." - }, - "Hide": { - "message": "Nikdy nezobrazovať" - }, - "hitGoBack": { - "message": "Stlačte Nepreskočiť, aby ste sa vrátili na miesto pred preskočením." - }, - "unskip": { - "message": "Nepreskočiť" - }, - "reskip": { - "message": "Znovu preskočiť" - }, - "unmute": { - "message": "Zrušiť stíšenie" - }, - "paused": { - "message": "Pozastavené" - }, - "manualPaused": { - "message": "Časovač zastavený" - }, - "confirmMSG": { - "message": "Pre úpravu alebo zmazanie viacerých hodnôt kliknite na info tlačidlo alebo otvorte okno rozšírenia kliknutím na ikonu v pravom hornom rohu." - }, - "clearThis": { - "message": "Naozaj to chcete vymazať?\n\n" - }, - "Unknown": { - "message": "Pri odosielaní segmentu nastala chyba, skúste to prosím neskôr." - }, - "sponsorFound": { - "message": "Toto video má segmenty v databáze!" - }, - "sponsor404": { - "message": "Nenašli sa žiadne segmenty" - }, - "sponsorStart": { - "message": "Začiatok segmentu" - }, - "sponsorEnd": { - "message": "Koniec segmentu" - }, - "sponsorCancel": { - "message": "Zrušiť vytváranie segmentu" - }, - "noVideoID": { - "message": "Nenašlo sa žiadne YouTube video.\nAk je to chyba, obnovte záložku." - }, - "refreshSegments": { - "message": "Znova načítať segmenty" - }, - "success": { - "message": "Hotovo!" - }, - "voted": { - "message": "Zahlasované!" - }, - "serverDown": { - "message": "Zdá sa, že server je nedostupný. Okamžite kontaktujte vývojára." - }, - "connectionError": { - "message": "Nastala chyba pripojenia. Kód chyby: " - }, - "clearTimes": { - "message": "Zmazať segmenty" - }, - "openPopup": { - "message": "Otvoriť podokno SponsorBlock" - }, - "closePopup": { - "message": "Zavrieť okno" - }, - "closeIcon": { - "message": "Ikona pre zatvorenie" - }, - "SubmitTimes": { - "message": "Odoslať segmenty" - }, - "submitCheck": { - "message": "Naozaj to chcete odoslať?" - }, - "whitelistChannel": { - "message": "Pridať kanál do výnimiek" - }, - "removeFromWhitelist": { - "message": "Odobrať kanál z výnimiek" - }, - "voteOnTime": { - "message": "Hlasovať za segment" - }, - "Submissions": { - "message": "Segmenty" - }, - "savedPeopleFrom": { - "message": "Ušetrili ste ľuďom " - }, - "viewLeaderboard": { - "message": "Rebríček" - }, - "recordTimesDescription": { - "message": "Odoslať" - }, - "submissionEditHint": { - "message": "Úprava sekcií sa objaví po odoslaní", - "description": "Appears in the popup to inform them that editing has been moved to the video player." - }, - "popupHint": { - "message": "Tip: V nastaveniach si môžete zmeniť klávesovú skratku pre odoslanie" - }, - "clearTimesButton": { - "message": "Vymazať časy" - }, - "submitTimesButton": { - "message": "Odoslať časy" - }, - "publicStats": { - "message": "Toto sa používa vo verejnom rebríčku pre zobrazenie vášho príspevku. Pozrite si ho" - }, - "Username": { - "message": "Používateľské meno" - }, - "setUsername": { - "message": "Nastaviť Používateľské meno" - }, - "copyPublicID": { - "message": "Skopírovať verejné ID používateľa" - }, - "copySegmentID": { - "message": "Skopírovať ID segmentu" - }, - "discordAdvert": { - "message": "Pripojte sa k oficiálnemu Discord serveru a zanechajte nám pripomienky!" - }, - "hideThis": { - "message": "Skryť" - }, - "Options": { - "message": "Nastavenia" - }, - "showButtons": { - "message": "Zobraziť tlačidlá v YouTube prehrávači" - }, - "hideButtons": { - "message": "Skryť tlačidlá v YouTube prehrávači" - }, - "hideButtonsDescription": { - "message": "Skryje tlačidlá pre preskočenie segmentov, ktoré sa zobrazujú v YouTube prehrávači." - }, - "showSkipButton": { - "message": "Zobrazovať tlačidlo preskočiť na hlavný obsah videa" - }, - "showInfoButton": { - "message": "Zobraziť info tlačidlo v YouTube prehrávači" - }, - "hideInfoButton": { - "message": "Skryť info tlačidlo v YouTube prehrávači" - }, - "autoHideInfoButton": { - "message": "Automaticky skryť tlačidlo Info" - }, - "hideDeleteButton": { - "message": "Skryť tlačidlo Zmazať v YouTube prehrávači" - }, - "showDeleteButton": { - "message": "Zobraziť tlačidlo Zmazať v YouTube prehrávači" - }, - "enableViewTracking": { - "message": "Zapnúť počítanie preskočení" - }, - "whatViewTracking": { - "message": "Sleduje aké segmenty ste preskočili, aby sa ostatní používatelia dozvedeli ako prispeli a pomohli ostatným. Spolu s hlasmi to potom zaistí databázu bez spamu. Rozšírenie odošle správu na server vždy keď preskočíte segment. Dúfame, že si väčšina ľudí toto nastavenie nezmení, aby boli čísla presné. :)" - }, - "enableViewTrackingInPrivate": { - "message": "Zapnúť počítanie preskočení v inkognito oknách" - }, - "enableQueryByHashPrefix": { - "message": "Dopyt podľa hash prefixu" - }, - "whatQueryByHashPrefix": { - "message": "Namiesto dopytovania segmentov zo servera podľa videoID sa použijú prvé 4 znaky hashu videoID. Server odošle späť dáta za všetky videá s podobným hashom." - }, - "enableRefetchWhenNotFound": { - "message": "Opakovane načítavať segmenty nových videí" - }, - "whatRefetchWhenNotFound": { - "message": "Ak je video nové a nenašli sa žiadne segmenty, opakovane sa budú každých pár minút načítavať kým sa video prehráva." - }, - "enableShowCategoryWithoutPermission": { - "message": "Zobraziť kategórie v odosielacom menu aj bez oprávnenia na odosielanie" - }, - "whatShowCategoryWithoutPermission": { - "message": "Niektoré kategórie vyžadujú oprávnenie na odoslanie kvôli požiadavke na minimálnu reputáciu" - }, - "showNotice": { - "message": "Znovu zobraziť upozornenie" - }, - "showSkipNotice": { - "message": "Zobraziť upozornenie pri preskočení segmentu" - }, - "showCategoryGuidelines": { - "message": "Zobraziť pomocníka ku kategórii" - }, - "noticeVisibilityMode0": { - "message": "Veľké upozornenia o preskočení" - }, - "noticeVisibilityMode1": { - "message": "Malé upozornenia o automatickom preskočení" - }, - "noticeVisibilityMode2": { - "message": "Malé upozornenia o všetkých preskočeniach" - }, - "noticeVisibilityMode3": { - "message": "Priehľadné upozornenia o automatickom preskočení" - }, - "noticeVisibilityMode4": { - "message": "Priehľadné upozornenia o všetkých preskočeniach" - }, - "longDescription": { - "message": "SponsorBlock umožňuje preskočiť sponzorov, úvodné časti, záverečné časti, pripomienky na odber, nehudobné časti videoklipov alebo iné otravné časti YouTube videí. SponsorBlock je crowdsourceové rozšírenie prehliadača, pomocou ktorého môže ktokoľvek označiť začiatok a koniec takéhoto segmentu. Po odoslaní potom všetci ostatní s týmto rozšírením tieto segmenty automaticky preskočia.", - "description": "Full description of the extension on the store pages." - }, - "website": { - "message": "Webstránka", - "description": "Used on Firefox Store Page" - }, - "sourceCode": { - "message": "Zdrojový kód", - "description": "Used on Firefox Store Page" - }, - "noticeUpdate": { - "message": "Upozornienie bolo aktualizované!", - "description": "The first line of the message displayed after the notice was upgraded." - }, - "noticeUpdate2": { - "message": "Ak sa vám to stále nepáčí, stlačte tlačidlo Nikdy nezobrazovať.", - "description": "The second line of the message displayed after the notice was upgraded." - }, - "nextChapterKeybind": { - "message": "Ďalšia kapitola", - "description": "Keybind label" - }, - "previousChapterKeybind": { - "message": "Predošlá kapitola", - "description": "Keybind label" - }, - "0": { - "message": "Spojenie vypršalo. Skontrolujte svoje internetové pripojenie. Ak vám internet funguje, server je pravdepodobne preťažený alebo nefunkčný." - }, - "disableSkipping": { - "message": "Preskakovanie je zapnuté" - }, - "enableSkipping": { - "message": "Preskakovanie je vypnuté" - }, - "yourWork": { - "message": "Vaša Práca", - "description": "Used to describe the section that will show you the statistics from your submissions." - }, - "502": { - "message": "Zdá sa, že server je preťažený. Skúste to o pár sekúnd." - }, - "errorCode": { - "message": "Kód chyby: " - }, - "skip": { - "message": "Preskočiť" - }, - "mute": { - "message": "Stíšiť" - }, - "full": { - "message": "Celé video", - "description": "Used for the name of the option to label an entire video as sponsor or self promotion." - }, - "skip_category": { - "message": "Preskočiť {0}?" - }, - "mute_category": { - "message": "Stíšiť {0}?" - }, - "skip_to_category": { - "message": "Preskočiť na {0}?", - "description": "Used for skipping to things (Skip to Highlight)" - }, - "skipped": { - "message": "{0} preskočené", - "description": "Example: Sponsor Skipped" - }, - "muted": { - "message": "{0} stíšený", - "description": "Example: Sponsor Muted" - }, - "skipped_to_category": { - "message": "Preskočené na {0}", - "description": "Used for skipping to things (Skipped to Highlight)" - }, - "disableAutoSkip": { - "message": "Zakázať Automatické Preskočenie" - }, - "enableAutoSkip": { - "message": "Povoliť Automatické Preskočenie" - }, - "audioNotification": { - "message": "Zvuková notifikácia pri preskočení" - }, - "audioNotificationDescription": { - "message": "Zvuková notifikácia pri preskočení prehrá zvuk vždy, keď dôjde k preskočeniu segmentu. Ak je vypnutá (alebo je vypnuté automatické preskakovanie), neprehraje sa žiadny zvuk." - }, - "showTimeWithSkips": { - "message": "Zobraziť čas bez preskočených segmentov" - }, - "showTimeWithSkipsDescription": { - "message": "Tento čas sa zobrazuje vedľa času v zátvorkách pod časovou lištou. Je to celkový čas videa mínus všetky segmenty, a to aj vrátane segmentov, ktoré sa len zobrazujú v lište." - }, - "youHaveSkipped": { - "message": "Preskočili ste " - }, - "minLower": { - "message": "minúta" - }, - "minsLower": { - "message": "minút" - }, - "hourLower": { - "message": "hodina" - }, - "hoursLower": { - "message": "hodiny" - }, - "youHaveSavedTime": { - "message": "Ostatným ste ušetrili", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "youHaveSavedTimeEnd": { - "message": " z ich života", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "statusReminder": { - "message": "Stav servera skontrolujete na status.sponsor.ajay.app." - }, - "whatChangeUserID": { - "message": "Toto si starostlivo uchovajte. Podobne ako heslo by ste to nemali s nikým zdieľať. Ak by to získal niekto ďalší, mohol by vám uškodiť. Ak hľadáte vaše verejné ID používateľa, stlačte ikonu schránky v podokne." - }, - "createdBy": { - "message": "Vytvoril" - }, - "supportOtherSites": { - "message": "Podpora alternatívnych Youtube webov" - }, - "supportOtherSitesDescription": { - "message": "Podpora alternatívnych Youtube klientov. Pre zapnutie podpory musíte povoliť zvláštne oprávnenia. Nefunguje v anonymnom režime v prehliadači Chrome ani v Chromium variantoch.", - "description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube" - }, - "supportedSites": { - "message": "Podporované weby: " - }, - "optionsInfo": { - "message": "Zapnúť podporu Invidious, vypnúť automatické preskočenie, skryť tlačidlá a iné." - }, - "addInvidiousInstance": { - "message": "Pridať inštanciu alternatívneho klienta" - }, - "addInvidiousInstanceDescription": { - "message": "Pridať vlastnú inštanciu. Musí byť vo formáte len doména. Napr. invidious.ajay.app" - }, - "add": { - "message": "Pridať" - }, - "addInvidiousInstanceError": { - "message": "Neplatná doména. Tu musí byť len doménová časť. Napr. invidious.ajay.app" - }, - "resetInvidiousInstance": { - "message": "Obnoviť zoznam inštancií Invidious" - }, - "resetInvidiousInstanceAlert": { - "message": "Chystáte sa obnoviť zoznam inštancií Invidious" - }, - "currentInstances": { - "message": "Aktuálne inštancie:" - }, - "minDuration": { - "message": "Minimálna dĺžka (v sekundách):" - }, - "minDurationDescription": { - "message": "Segmenty kratšie ako nastavená hodnota nebudú preskočené ani zobrazené v prehrávači." - }, - "skipNoticeDuration": { - "message": "Trvanie oznámenia o preskočení (v sekundách):" - }, - "skipNoticeDurationDescription": { - "message": "Oznámenie o preskočení zostane minimálne takto dlho zobrazené. Pri manuálnom preskočení to môže byť aj dlhšie." - }, - "shortCheck": { - "message": "Segment je kratší ako vami nastavená minimálna dĺžka. Možno už bol niekým odoslaný a kvôli tomuto nastaveniu je teraz ignorovaný. Naozaj ho chcete odoslať?" - }, - "liveOrPremiere": { - "message": "Vytváranie segmentov v aktívnom živom prenose alebo premiére nie je dovolené. Počkajte prosím na jeho ukončenie, potom obnovte stránku a skontrolujte, či sú segmenty správne vytvorené." - }, - "showUploadButton": { - "message": "Ukázať Nahrávacie Tlačidlo" - }, - "customServerAddress": { - "message": "Adresa serveru SponsorBlock" - }, - "customServerAddressDescription": { - "message": "Adresa, ktorú používa SponsorBlock pre komunikáciu so serverom.\nAk nemáte vlastný server, tak to nemeňte." - }, - "save": { - "message": "Uložiť" - }, - "reset": { - "message": "Vynulovať" - }, - "customAddressError": { - "message": "Táto adresa nie je platná. Musí začínať http:// alebo https:// a končiť bez lomky." - }, - "areYouSureReset": { - "message": "Naozaj to chcete obnoviť?" - }, - "mobileUpdateInfo": { - "message": "už je podporované aj m.youtube.com" - }, - "exportOptions": { - "message": "Import/export všetkých nastavení" - }, - "setOptions": { - "message": "Nastaviť Nastavenia" - }, - "exportOptionsWarning": { - "message": "Varovanie: zmena nastavení je nezvratná a môže poškodiť inštaláciu. Naozaj to chcete spraviť? Pre istotu si staré nastavenia zazálohujte." - }, - "incorrectlyFormattedOptions": { - "message": "Tento JSON súbor nemá správny formát. Nastavenia neboli zmenené." - }, - "confirmNoticeTitle": { - "message": "Odoslať segment" - }, - "submit": { - "message": "Poslať" - }, - "cancel": { - "message": "Zrušiť" - }, - "delete": { - "message": "Odstrániť" - }, - "preview": { - "message": "Ukážka" - }, - "unsubmitted": { - "message": "Neodoslané" - }, - "inspect": { - "message": "Kontrola" - }, - "edit": { - "message": "Upraviť" - }, - "copyDebugInformation": { - "message": "Skopírovať debug informácie do schránky" - }, - "copyDebugInformationFailed": { - "message": "Nepodarilo sa skopírovať debug informácie" - }, - "copyDebugInformationOptions": { - "message": "Skopíruje informácie do schránky, ktoré môžu byť poskytnuté vývojárovi ako pomoc pri hľadaní chyby / keď si to vývojár požiada. Citlivé informácie ako vaše používateľské ID, kanály vo whiteliste, a vlastné adresy serverov poskytnuté nebudú. Avšak, budu poskytnuté informácie ako Váš useragent, prehliadač, operačný systém, a verzia rozšírenia." - }, - "copyDebugInformationComplete": { - "message": "Debug informácie boli skopírované do schránky. Ak chcete, môžete odstrániť akékoľvek informácie, ktoré nechcete zdieľať. Uložte si ich do textového súboru alebo ich vložte do nahlásenia chyby." - }, - "to": { - "message": "do", - "description": "Used between segments. Example: 1:20 to 1:30" - }, - "CopiedExclamation": { - "message": "Skopírované!", - "description": "Used after something has been copied to the clipboard. Example: 'Copied!'" - }, - "generic_guideline1": { - "message": "Zahŕňa plynulé prechody" - }, - "generic_guideline2": { - "message": "Prehrať tak, ako keby nebolo nič preskočené" - }, - "category_sponsor": { - "message": "Sponzor" - }, - "category_sponsor_description": { - "message": "Platená propagácia, platené odporúčania a priame reklamy. Neplatí pre vlastnú propagáciu alebo neplatenú propagáciu dobročinností/tvorcov/webových stránok/produktov, ktoré sa im páčia." - }, - "category_sponsor_guideline1": { - "message": "Platené promo" - }, - "category_sponsor_guideline2": { - "message": "Nie pre dary a vlastný merch" - }, - "category_selfpromo": { - "message": "Neplatená/Vlastná propagácia" - }, - "category_selfpromo_description": { - "message": "Podobné ako sponzor, okrem neplatenej alebo vlastnej propagácie. Patria sem sekcie týkajúce sa merchu, donatov alebo informácií o tom, s kým spolupracovali." - }, - "category_selfpromo_guideline1": { - "message": "Dary, členstvo a vlastný merch" - }, - "category_selfpromo_guideline2": { - "message": "Obsah mimo témy, ktorý nepridáva žiadne informácie" - }, - "category_selfpromo_guideline3": { - "message": "Nie pre firemne navrhnuté produkty a merch" - }, - "category_exclusive_access": { - "message": "Exkluzívny Prístup" - }, - "category_exclusive_access_description": { - "message": "Iba pre označovanie celých videí. Používa sa, keď video predstavuje produkt, službu alebo miesto, ku ktorým získali bezplatný alebo dotovaný prístup." - }, - "category_exclusive_access_pill": { - "message": "Toto video predstavuje produkt, službu alebo miesto, ku ktorým získali bezplatný alebo dotovaný prístup", - "description": "Short description for this category" - }, - "category_exclusive_access_guideline1": { - "message": "Celé video predstavuje niečo, kde sa dá získať voľný alebo zľavnený prístup" - }, - "category_interaction": { - "message": "Pripomienka interakcie (Prihlásiť sa na odber)" - }, - "category_interaction_description": { - "message": "Krátka výzva dať like, prihlásiť sa na odber alebo sledovať ich v strede obsahu. Ak je to dlhé alebo sa týka niečoho konkrétneho, malo by to radšej byť v ramci vlastnej propagácie." - }, - "category_interaction_guideline1": { - "message": "Krátke pripomienky na \"Páči sa mi to\", Odber a Sledovanie" - }, - "category_interaction_guideline2": { - "message": "Zahŕňa nepriame pripomienky na komentovanie" - }, - "category_interaction_guideline3": { - "message": "Nie pre všeobecné promo, iba výzvy k akcii" - }, - "category_interaction_short": { - "message": "Pripomienka interakcie" - }, - "category_intro": { - "message": "Prerušenie/Úvodná animácia" - }, - "category_intro_description": { - "message": "Interval bez obsahu. Môže to byť pauza, statický obraz, opakujúca sa animácia. Toto by nemalo byť použité pre prechody obsahujúce informácie." - }, - "category_intro_short": { - "message": "Prerušenie" - }, - "category_intro_guideline1": { - "message": "Interval bez samotného obsahu" - }, - "category_intro_guideline2": { - "message": "Nie pre prechody bez informácie" - }, - "category_outro": { - "message": "Koncové karty / titulky" - }, - "category_outro_description": { - "message": "Kredity alebo keď sa zobrazia YouTube koncové karty. Neplatí pre zhrnutia s informáciami." - }, - "category_outro_guideline1": { - "message": "Nezahrňte obsah, aj keby už boli vidieť koncové karty" - }, - "category_preview": { - "message": "Ukážka/Rekapitulácia" - }, - "category_preview_description": { - "message": "Zbierka klipov, ktoré ukazujú, čo nasleduje v tomto alebo ďalších videách zo série, kde sa potom všetky informácie opakujú." - }, - "category_preview_guideline1": { - "message": "Ukážky, ktoré sa zobrazia neskôr alebo v budúcom videu" - }, - "category_preview_guideline2": { - "message": "Zhrnutie predošlého videa" - }, - "category_preview_guideline3": { - "message": "Nie pre sekcie, ktoré majú dodatočný obsah" - }, - "category_filler_short": { - "message": "Odbočka" - }, - "category_filler_guideline1": { - "message": "Nepodstatné scény slúžiace len ako výplň alebo humor" - }, - "category_filler_guideline2": { - "message": "Nepodarené a opakované zábery" - }, - "category_filler_guideline3": { - "message": "Nie pre scény vyžadované pre pochopenie témy" - }, - "category_music_offtopic": { - "message": "Hudba: časť bez hudby" - }, - "category_music_offtopic_description": { - "message": "Len pre hudobné videá. Použite len ak segment nie je možné zaradiť do inej kategórie." - }, - "category_music_offtopic_short": { - "message": "Bez hudby" - }, - "category_music_offtopic_guideline1": { - "message": "Sekcie, ktoré nie sú v oficiálnom vydaní" - }, - "category_music_offtopic_guideline2": { - "message": "Sekcia bez hudby v živom vystúpení" - }, - "category_poi_highlight": { - "message": "Hlavný obsah videa" - }, - "category_poi_highlight_description": { - "message": "Tá časť videa, ktorú ľudia vyhľadávajú. Podobné komentárom \"Video začína v čase x\"." - }, - "category_poi_highlight_guideline1": { - "message": "Sekcia, ktorú vyhľadáva väčšina ľudí" - }, - "category_poi_highlight_guideline2": { - "message": "Môže pomôcť preskočiť predošlý obsah" - }, - "category_poi_highlight_guideline3": { - "message": "Môže preskočiť na hlavný obsah alebo náhľad" - }, - "category_chapter": { - "message": "Kapitola" - }, - "category_chapter_description": { - "message": "Vlastné pomenovania kapitol opisujúce hlavné sekcie videa." - }, - "category_chapter_guideline1": { - "message": "Nezmieňovať sponzorove značky" - }, - "category_chapter_guideline2": { - "message": "Použiť veľké kapitoly pre všeobecné sekcie" - }, - "category_chapter_guideline3": { - "message": "Menšie kapitoly môžu byť umiestnené vo väčších" - }, - "category_livestream_messages": { - "message": "Živé vysielanie: oznamy a dary" - }, - "category_livestream_messages_short": { - "message": "Oznamy" - }, - "autoSkip": { - "message": "Automatické Preskočenie" - }, - "manualSkip": { - "message": "Manuálne Preskočenie" - }, - "showOverlay": { - "message": "Zobraziť v časovej lište" - }, - "disable": { - "message": "Zakázať" - }, - "autoSkip_POI": { - "message": "Automaticky preskočiť na začiatok" - }, - "manualSkip_POI": { - "message": "Opýtať sa, keď sa video nahraje" - }, - "showOverlay_POI": { - "message": "Zobraziť v časovej lište" - }, - "showOverlay_full": { - "message": "Ukázať Označenie" - }, - "showOverlay_chapter": { - "message": "Zobraziť kapitoly" - }, - "autoSkipOnMusicVideos": { - "message": "Automaticky preskočiť všetky segmenty ak neexistuje segment bez hudby" - }, - "muteSegments": { - "message": "Povoliť segmenty, ktoré namiesto preskočenia stíšía zvuk" - }, - "fullVideoSegments": { - "message": "Zobraziť ikonu, ak je celé video reklama", - "description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo" - }, - "previewColor": { - "message": "Neodoslaná farba", - "description": "Referring to submissions that have not been sent to the server yet." - }, - "seekBarColor": { - "message": "Farba časovej lišty" - }, - "category": { - "message": "Kategória" - }, - "skipOption": { - "message": "Možnosti preskočenia", - "description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)" - }, - "enableTestingServer": { - "message": "Povoliť beta-test server" - }, - "whatEnableTestingServer": { - "message": "Vaše segmenty a hlasy NEBUDÚ ZAPOČÍTANÉ na hlavnom serveri. Slúži iba na testovanie." - }, - "testingServerWarning": { - "message": "Všetky segmenty a hlasy NEBUDÚ ZAPOČÍTANÉ na hlavnom serveri počas pripojenia na beta server. Nezabudnite si toto vypnúť ak chcete spraviť reálne segmenty." - }, - "bracketNow": { - "message": "(Teraz)" - }, - "moreCategories": { - "message": "Viac Kategórií" - }, - "chooseACategory": { - "message": "Vyberte kategóriu" - }, - "enableThisCategoryFirst": { - "message": "Pre odoslanie segmentov z kategórie \"{0}\" ju musíte zapnúť v nastaveniach. Teraz tam budete presmerovaní.", - "description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options." - }, - "poiOnlyOneSegment": { - "message": "Varovanie: Tento typ segmentu môže byť aktívny len jeden. Odoslanie viacerých spôsobí zobrazenie náhodného z nich." - }, - "youMustSelectACategory": { - "message": "Musíte zvoliť kategóriu pre každý segment!" - }, - "bracketEnd": { - "message": "(Koniec)" - }, - "End": { - "message": "Koniec", - "description": "Button that skips to the end of a segment" - }, - "hiddenDueToDownvote": { - "message": "skryté: negatívne hlasy" - }, - "hiddenDueToDuration": { - "message": "skryté: príliš krátke" - }, - "channelDataNotFound": { - "description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.", - "message": "ID kanála sa ešte nenačítalo. Ak pozeráte video vložené na stránke, skúste ísť radšej priamo na YouTube. Problém mohli spôsobiť zmeny na YouTube. Ak je tomu tak, zanechajte komentár:" - }, - "invidiousPermissionRefresh": { - "message": "Prehliadač odmietol oprávnenia potrebné pre Invidious a iné stránky 3. strany. Pre opätovnú aktiváciu oprávnení kliknite na tlačidlo nižšie." - }, - "acceptPermission": { - "message": "Povoľte oprávnenie" - }, - "permissionRequestSuccess": { - "message": "Oprávnenie bolo úspešne povolené!" - }, - "permissionRequestFailed": { - "message": "Povolenie oprávnenia zlyhalo, stlačili ste odmietnuť?" - }, - "adblockerIssueWhitelist": { - "message": "Ak to neviete vyriešiť, vypnite nastavenie \"Vynútiť kontrolu kanála pred preskočením\", lebo SponsorBlock nevie zistiť informácie o kanále tohto videa" - }, - "forceChannelCheck": { - "message": "Vynútiť kontrolu kanála pred preskočením" - }, - "whatForceChannelCheck": { - "message": "V predvolenom nastavení sa preskočia segmenty hneď bez kontroly kanálu. V predvolenom nastavení môžu byť niektoré segmenty na začiatku videa na kanáloch pridaných na whitelist preskočené. Povolením tejto možnosti tomu zabránite, ale všetky preskakovania budú mať mierne oneskorenie, pretože získanie ID kanála môže chvíľu trvať. Toto oneskorenie nemusí byť viditeľné, ak máte rýchly internet." - }, - "forceChannelCheckPopup": { - "message": "Zvážte povolenie \"Vynútiť kontrolu kanála pred preskočením\"" - }, - "downvoteDescription": { - "message": "Nesprávne/Zlé načasovanie" - }, - "incorrectVote": { - "message": "Nesprávne" - }, - "harmfulVote": { - "message": "Škodlivé", - "description": "Used for chapter segments when the text is harmful/offensive to remove it faster" - }, - "incorrectCategory": { - "message": "Zmeniť kategóriu" - }, - "nonMusicCategoryOnMusic": { - "message": "Toto video je kategorizované ako hudobné. Ste si istý, že obsahuje sponzora? Ak sa skutočne jedná o časť bez hudby, otvorte možnosti rozšírenia a povoľte túto kategóriu. Potom môžete tento segment uložiť ako kategóriu \"Bez hudby\" namiesto sponzora. Ak si neviete rady, tak si prosím prečítajte pravidlá." - }, - "multipleSegments": { - "message": "Viac segmentov" - }, - "guidelines": { - "message": "Pravidlá" - }, - "readTheGuidelines": { - "message": "Prečítajte si pravidlá!!", - "description": "Show the first time they submit or if they are \"high risk\"" - }, - "categoryUpdate1": { - "message": "Kategórie sú tu!" - }, - "categoryUpdate2": { - "message": "Otvorte nastavenia pre preskočenie úvodov, záverov, podpory reklamných predmetov, atď." - }, - "help": { - "message": "Pomocník" - }, - "GotIt": { - "message": "Rozumiem", - "description": "Used as the button to dismiss a tooltip" - }, - "fullVideoTooltipWarning": { - "message": "Tento segment je dlhý. Ak je celé video o jednej téme, zmeňte \"Preskočiť\" na \"Celé video\". Pre ďalšie informácie si pozrite pravidlá." - }, - "categoryPillTitleText": { - "message": "Celé video je označené touto kategóriou a je príliš previazané, aby sa to dalo rozlíšiť" - }, - "chapterNameTooltipWarning": { - "message": "Jedna z vašich kapitol sa volá podobne ako kategória. Ak je to možné, použite radšej kategóriu." - }, - "experiementOptOut": { - "message": "Odmietnuť všetky budúce experimenty", - "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": "Navždy skryť" - }, - "warningChatInfo": { - "message": "Zaznamenali sme, že robíte omylom chyby" - }, - "warningTitle": { - "message": "Dostali ste varovanie" - }, - "questionButton": { - "message": "Mám otázku" - }, - "warningConfirmButton": { - "message": "Rozumiem dôvodu" - }, - "warningError": { - "message": "Chyb a pri pokuse o súhlas s upozornením:" - }, - "Donate": { - "message": "Prispieť" - }, - "hideDonationLink": { - "message": "Skryť možnosti prispenia" - }, - "helpPageThanksForInstalling": { - "message": "Ďakujeme za inštaláciu SponsorBlock-u." - }, - "helpPageReviewOptions": { - "message": "Skontrolujte prosím možnosti nižšie" - }, - "helpPageFeatureDisclaimer": { - "message": "Veľa funkcií je vo východiskovom stave vypnutých. Ak chcete preskakovať úvody, závery, používať Invidious apod., zapnite ich nižšie. Taktiež môžete zobraziť alebo skryť niektoré ovládacie prvky." - }, - "helpPageHowSkippingWorks": { - "message": "Ako funguje preskakovanie" - }, - "helpPageHowSkippingWorks1": { - "message": "Video segmenty budú automaticky preskočené, ak sa nájdu v databáze. Zobraziť si ich môžete po kliknutí na ikonu rozšírenia vo vyskakovacom okne." - }, - "helpPageHowSkippingWorks2": { - "message": "Vždy keď preskočíte segment, tak dostanete oznam. Ak sa vám nepozdáva načasovanie, môžete o tom zahlasovať palcom dole! Zahlasovať tiež môžete vo vyskakovacom okne." - }, - "Submitting": { - "message": "Odosielam" - }, - "helpPageSubmitting1": { - "message": "Odosielanie môžete vykonať z vyskakovacieho okna stlačením \"Začiatok segmentu\" alebo priamo tlačidlami v prehrávači." - }, - "helpPageSubmitting2": { - "message": "Stlačenie tlačidla Prehrať označí začiatok segmentu a stlačenie tlačidla Stop označí koniec. Takto viete označiť aj viac segmentov pred odoslaním. Stlačením tlačidla \"Nahrať\" segmenty odošlete. Stlačením tlačidla \"Kôš\" segmenty zmažete." - }, - "Editing": { - "message": "Úpravy" - }, - "helpPageEditing1": { - "message": "Ak ste sa pomýlili, môžete segment upraviť alebo zmazať po stlačení šípky hore." - }, - "helpPageTooSlow": { - "message": "Príliš pomalé" - }, - "helpPageTooSlow1": { - "message": "Môžete využiť aj klávesové skratky. Bodkočiarka označí začiatok alebo koniec segmentu a apostrof ho odošle." - }, - "helpPageCopyOfDatabase": { - "message": "Viem získať kópiu databázy? Čo bude ak zmizneš?" - }, - "helpPageCopyOfDatabase1": { - "message": "Databáza je verejná a dostupná na" - }, - "helpPageCopyOfDatabase2": { - "message": "Zdrojový kód je voľne dostupný. Takže aj keby sa mi niečo stalo, vaše príspevky sa nestratia." - }, - "helpPageNews": { - "message": "Novinky a ako to funguje" - }, - "helpPageSourceCode": { - "message": "Kde môžem získať zdrojový kód?" - }, - "Credits": { - "message": "Autori" - }, - "LearnMore": { - "message": "Zistiť viac" - }, - "FullDetails": { - "message": "Úplné podrobnosti" - }, - "CopyDownvoteButtonInfo": { - "message": "Dá palec dole a vytvorí kópiu, aby ste mohli segment znova odoslať" - }, - "OpenCategoryWikiPage": { - "message": "Otvoriť wiki stránku tejto kategórie." - }, - "CopyAndDownvote": { - "message": "Skopírovať a dať palec dole" - }, - "ContinueVoting": { - "message": "Pokračovať v hlasovaní" - }, - "ChangeCategoryTooltip": { - "message": "Týmto ihneď vykonáte zmeny v segmentoch" - }, - "downvote": { - "message": "Hlasovať proti" - }, - "upvote": { - "message": "Hlasovať za" - }, - "hideSegment": { - "message": "Skryť segment" - }, - "skipSegment": { - "message": "Preskočiť segment" - }, - "playChapter": { - "message": "Prehrať kapitolu" - }, - "SponsorTimeEditScrollNewFeature": { - "message": "Čas môžete rýchlo zmeniť kolieskom myši, ak je kurzor nad zadávacím políčkom. Pre jemné zmeny pritom držte kláves ctrl alebo shift." - }, - "categoryPillNewFeature": { - "message": "Nové! Zistite, kedy je video kompletne sponzorované alebo vlastná propagácia" - }, - "dayAbbreviation": { - "message": "d", - "description": "100d" - }, - "hourAbbreviation": { - "message": "h", - "description": "100h" - }, - "betaServerWarning": { - "message": "Je zapnutý BETA server!" - }, - "openOptionsPage": { - "message": "Otvoriť stránku s nastaveniami" - }, - "exportSegments": { - "message": "Exportovať segmenty" - }, - "Import": { - "message": "Import", - "description": "Button to initiate importing segments. Appears under the textbox where they paste in the data" - }, - "redeemFailed": { - "message": "Licenčný kľúč nie je platný" - }, - "hideUpsells": { - "message": "Skryť platené nastavenia" - }, - "chooseACountry": { - "message": "Vybrať krajinu" - }, - "noDiscount": { - "message": "Nemáte nárok na zľavu" - }, - "discountLink": { - "message": "Odkaz na zľavu (ružová cena)" - }, - "selectYourCountry": { - "message": "Vyberte krajinu" - }, - "alreadyDonated": { - "message": "Ak ste už v minulosti prispeli, získajte voľný prístup napísaním emailu:", - "description": "After the colon is an email address" - }, - "cantAfford": { - "message": "Ak si nemôžete dovoliť kúpiť licenciu, kliknite {sem} a zistite, či máte nárok na zľavu", - "description": "Keep the curly braces. The word 'here' should be translated as well." - }, - "patreonSignIn": { - "message": "Prihlásiť sa cez Patreon" - }, - "redeem": { - "message": "Uplatniť" - }, - "joinOnPatreon": { - "message": "Kúpte si Patreon predplatné" - }, - "oneTimePurchase": { - "message": "Jednorazový nákup" - }, - "enterLicenseKey": { - "message": "Zadajte licenčný kľúč" - }, - "chaptersPage1": { - "message": "Crowd-sourcované kapitovly v SponsorBlock-u sú dostupné len po zakúpení licencie alebo zadarmo pre ľudí, ktorí už v minulosti prispeli" - }, - "chapterNewFeature": { - "message": "Nová funkcia: Crowd-sourcované vlastné kapitoly. Toto sú sekcie videa s vlastnými názvami, ktoré môžu byť pre väčšiu presnosť vyskladané. Ak si kúpite licenciu, uvidíte kapitoly v tomto videu, ako napr.: ", - "description": "After the comma, a list of chapters for this video will appear" - } -} diff --git a/public/_locales/sl/messages.json b/public/_locales/sl/messages.json deleted file mode 100644 index 0967ef42..00000000 --- a/public/_locales/sl/messages.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/public/_locales/sr/messages.json b/public/_locales/sr/messages.json deleted file mode 100644 index 88c132d1..00000000 --- a/public/_locales/sr/messages.json +++ /dev/null @@ -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": "Помоћ" - } -} diff --git a/public/_locales/sv/messages.json b/public/_locales/sv/messages.json deleted file mode 100644 index ded1a4b5..00000000 --- a/public/_locales/sv/messages.json +++ /dev/null @@ -1,1247 +0,0 @@ -{ - "fullName": { - "message": "SponsorBlock för YouTube - Hoppa över sponsringar", - "description": "Name of the extension." - }, - "Description": { - "message": "Hoppa över sponsringar, prenumerationstiggande och mer på YouTube-videor. Rapportera sponsorer på videor du tittar på för att spara andras tid.", - "description": "Description of the extension." - }, - "400": { - "message": "Servern sa att denna begäran var ogiltig" - }, - "429": { - "message": "Du har skickat in för många sponsormeddelanden för den här videon. Är du säker på att det finns så många?" - }, - "409": { - "message": "Den här har redan skickats in" - }, - "channelWhitelisted": { - "message": "Kanalen är vitlistad!" - }, - "Segment": { - "message": "segment" - }, - "Segments": { - "message": "segment" - }, - "SegmentsCap": { - "message": "Segment" - }, - "Chapters": { - "message": "Kapitel" - }, - "renderAsChapters": { - "message": "Gör segment som kapitel", - "description": "Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system" - }, - "showSegmentNameInChapterBar": { - "message": "Visa nuvarande segment bredvid videotid" - }, - "upvoteButtonInfo": { - "message": "Rösta på detta inskick" - }, - "reportButtonTitle": { - "message": "Rapportera" - }, - "reportButtonInfo": { - "message": "Rapportera det här segmentet som inkorrekt." - }, - "Dismiss": { - "message": "Avfärda" - }, - "Loading": { - "message": "Laddar..." - }, - "Hide": { - "message": "Visa aldrig" - }, - "hitGoBack": { - "message": "Tryck på hoppa inte över för att återgå till där du kom i från." - }, - "unskip": { - "message": "Hoppa inte över" - }, - "reskip": { - "message": "Hoppa över" - }, - "unmute": { - "message": "Ljud" - }, - "paused": { - "message": "Pausad" - }, - "manualPaused": { - "message": "Timern stoppad" - }, - "confirmMSG": { - "message": "Klicka på infoknappen eller öppna popup-rutan genom att klicka på tilläggets ikon i det översta högra hörnet för att redigera eller ta bort individuella värden." - }, - "clearThis": { - "message": "Är du säker på att du vill rensa detta?\n\n" - }, - "Unknown": { - "message": "Ett fel uppstod vid inskickningen av sponsortiderna, försök igen senare." - }, - "sponsorFound": { - "message": "Denna video har segment i databasen!" - }, - "sponsor404": { - "message": "Hittade inga segment" - }, - "sponsorStart": { - "message": "Segmentet startar nu" - }, - "sponsorEnd": { - "message": "Segmentet slutar nu" - }, - "sponsorCancel": { - "message": "Avbryt skapande av segment" - }, - "noVideoID": { - "message": "Hittade ingen YouTube-video.\nUppdatera fliken om detta är felaktigt." - }, - "refreshSegments": { - "message": "Uppdatera segment" - }, - "success": { - "message": "Klart!" - }, - "voted": { - "message": "Röstat!" - }, - "serverDown": { - "message": "Det verkar som att servern ligger nere. Kontakta utvecklaren omedelbart." - }, - "connectionError": { - "message": "Anslutningsfel. Felkod: " - }, - "clearTimes": { - "message": "Rensa segmenten" - }, - "openPopup": { - "message": "Öppna SponsorBlock-popup" - }, - "closePopup": { - "message": "Stäng popup" - }, - "closeIcon": { - "message": "Stäng ikon" - }, - "SubmitTimes": { - "message": "Skicka in segment" - }, - "sortSegments": { - "message": "Sortera segment" - }, - "submitCheck": { - "message": "Är du säker på att du vill skicka in detta?" - }, - "whitelistChannel": { - "message": "Vitlistkanal" - }, - "removeFromWhitelist": { - "message": "Ta bort kanal från vitlistan" - }, - "voteOnTime": { - "message": "Rösta på ett segment" - }, - "Submissions": { - "message": "Inskickade" - }, - "savedPeopleFrom": { - "message": "Du har sparat andra från " - }, - "viewLeaderboard": { - "message": "Topplista" - }, - "recordTimesDescription": { - "message": "Skicka" - }, - "submissionEditHint": { - "message": "Sektionsredigering kommer att visas efter du har klickat på skicka", - "description": "Appears in the popup to inform them that editing has been moved to the video player." - }, - "popupHint": { - "message": "Tips: Du kan i alternativen ställa in snabbtangenter för att skicka in" - }, - "clearTimesButton": { - "message": "Rensa tider" - }, - "submitTimesButton": { - "message": "Skicka in tider" - }, - "publicStats": { - "message": "Detta används på den offentliga statistiksidan för att visa hur mycket du har bidragit. Ta en titt" - }, - "Username": { - "message": "Användarnamn" - }, - "setUsername": { - "message": "Ange användarnamn" - }, - "copyPublicID": { - "message": "Kopiera publikt Användar-ID" - }, - "copySegmentID": { - "message": "Kopiera Segment-ID" - }, - "discordAdvert": { - "message": "Gå med i den officiella Discord-servern för att ge förslag och feedback!" - }, - "hideThis": { - "message": "Dölj detta" - }, - "Options": { - "message": "Alternativ" - }, - "showButtons": { - "message": "Visa knappar på YouTube-spelaren" - }, - "hideButtons": { - "message": "Dölj knappar på YouTube-spelaren" - }, - "hideButtonsDescription": { - "message": "Detta döljer knapparna på YouTube-spelaren som du skickar in överhoppade segment med." - }, - "showSkipButton": { - "message": "Behåll knappen hoppa till höjdpunkt på spelaren" - }, - "showInfoButton": { - "message": "Visa infoknappen på YouTube-spelaren" - }, - "hideInfoButton": { - "message": "Dölj infoknappen på YouTube-spelaren" - }, - "autoHideInfoButton": { - "message": "Dölj informationsknappen automatiskt" - }, - "hideDeleteButton": { - "message": "Dölj borttagningsknappen på YouTube-spelaren" - }, - "showDeleteButton": { - "message": "Visa borttagningsknappen på YouTube-spelaren" - }, - "enableViewTracking": { - "message": "Aktivera spåra antalet hoppa över" - }, - "whatViewTracking": { - "message": "Den här funktionen spårar vilka segment du har hoppat över för att låta användarna veta hur mycket tid en användare har sparat andra och tillsammans med användarnas röster säkerställa att spam inte kommer in i databasen. Detta tillägg skickar ett meddelande till servern varje gång du hoppar över ett segment. Förhoppningsvis ändrar de flesta inte den här inställningen så statistiken hålls tillförlitlig. :)" - }, - "enableViewTrackingInPrivate": { - "message": "Aktivera spåra antalet hoppa över i privata/inkognitoflikar" - }, - "enableTrackDownvotes": { - "message": "Lagra segmentnerröstningar" - }, - "whatTrackDownvotes": { - "message": "Alla segment du röstat ner kommer att förbli dolda även efter uppdatering" - }, - "trackDownvotesWarning": { - "message": "Varning: Om detta inaktiveras kommer alla tidigare lagrade nerröstningar att tas bort" - }, - "enableQueryByHashPrefix": { - "message": "Fråga efter hash-prefix" - }, - "whatQueryByHashPrefix": { - "message": "I stället för att begära segment från servern med hjälp av video-ID skickas de första 4 tecknen i hashen av video-ID:et. Servern kommer då att skicka tillbaka data för alla videor med liknande hashar." - }, - "enableRefetchWhenNotFound": { - "message": "Uppdatera segment på nya videor" - }, - "whatRefetchWhenNotFound": { - "message": "Om videon är ny och inga segment hittades då kommer den att uppdateras med några minuters mellanrum medan du tittar på videon." - }, - "enableShowCategoryWithoutPermission": { - "message": "Visa kategorier i inlämningsmenyn även utan inlämningstillstånd" - }, - "whatShowCategoryWithoutPermission": { - "message": "Vissa kategorier kräver tillstånd att lämna in på grund av minimikrav på rykte" - }, - "showNotice": { - "message": "Visa meddelandet igen" - }, - "showSkipNotice": { - "message": "Visa ett meddelande efter att ett segment har hoppats över" - }, - "showCategoryGuidelines": { - "message": "Visa kategorihjälp" - }, - "noticeVisibilityMode0": { - "message": "Fullstorlek" - }, - "noticeVisibilityMode1": { - "message": "Litet meddelande för hoppa över automatiskt" - }, - "noticeVisibilityMode2": { - "message": "Alla meddelanden är små" - }, - "noticeVisibilityMode3": { - "message": "Tonat meddelande för hoppa över automatiskt" - }, - "noticeVisibilityMode4": { - "message": "Tonat meddelande" - }, - "longDescription": { - "message": "SponsorBlock låter dig hoppa över sponsormeddelanden, introduktioner, eftertexter, prenumerationspåminnelser och andra irriterande delar av YouTube-videor. SponsorBlock är ett crowdsourced webbläsartillägg som låter vem som helst att skicka in start- och sluttid på sponsorsegment och andra segment av YouTube-videor. När en person skickar in denna information kommer alla andra som har detta tillägg installerat att hoppa över det sponsrade segmentet. Du kan även hoppa över icke-musikavsnitt i musikvideor.", - "description": "Full description of the extension on the store pages." - }, - "website": { - "message": "Hemsida", - "description": "Used on Firefox Store Page" - }, - "sourceCode": { - "message": "Källkod", - "description": "Used on Firefox Store Page" - }, - "noticeUpdate": { - "message": "Det här meddelandet har förbättrats!", - "description": "The first line of the message displayed after the notice was upgraded." - }, - "noticeUpdate2": { - "message": "Om du ändå inte gillar det, tryck på knappen visa aldrig.", - "description": "The second line of the message displayed after the notice was upgraded." - }, - "setSkipShortcut": { - "message": "Hoppa över segment", - "description": "Keybind label" - }, - "setStartSponsorShortcut": { - "message": "Starta/stoppa segment", - "description": "Keybind label" - }, - "setSubmitKeybind": { - "message": "Skicka segment", - "description": "Keybind label" - }, - "nextChapterKeybind": { - "message": "Nästa kapitel", - "description": "Keybind label" - }, - "previousChapterKeybind": { - "message": "Föregående kapitel", - "description": "Keybind label" - }, - "keybindDescription": { - "message": "Välj en tangent genom att trycka på den och välj sedan en av modifieringstangenterna som du vill använda." - }, - "0": { - "message": "Anslutningsfel. Kontrollera din internetanslutning. Om du kan komma åt internet är servern förmodligen överbelastad eller så ligger den nere." - }, - "disableSkipping": { - "message": "Hoppa över är aktiverat" - }, - "enableSkipping": { - "message": "Hoppa över är inaktiverat" - }, - "yourWork": { - "message": "Ditt bidrag", - "description": "Used to describe the section that will show you the statistics from your submissions." - }, - "502": { - "message": "Servern verkar vara överbelastad. Försök igen om några sekunder." - }, - "errorCode": { - "message": "Felkod: " - }, - "skip": { - "message": "Hoppa över" - }, - "mute": { - "message": "Ljudlös" - }, - "full": { - "message": "Hela videon", - "description": "Used for the name of the option to label an entire video as sponsor or self promotion." - }, - "skip_category": { - "message": "Hoppa över {0}?" - }, - "mute_category": { - "message": "Gör {0} ljudlös?" - }, - "skip_to_category": { - "message": "Hoppa till {0}?", - "description": "Used for skipping to things (Skip to Highlight)" - }, - "skipped": { - "message": "{0} överhoppade", - "description": "Example: Sponsor Skipped" - }, - "muted": { - "message": "{0} ljudlösa", - "description": "Example: Sponsor Muted" - }, - "skipped_to_category": { - "message": "Hoppat till {0}", - "description": "Used for skipping to things (Skipped to Highlight)" - }, - "disableAutoSkip": { - "message": "Inaktivera hoppa över automatiskt" - }, - "enableAutoSkip": { - "message": "Aktivera hoppa över automatiskt" - }, - "audioNotification": { - "message": "Ljudavisering vid hoppa över" - }, - "audioNotificationDescription": { - "message": "Ljudavisering vid hoppa över kommer att spela upp ett ljud när ett segment hoppas över. Om inaktiverad (eller om hoppa över automatiskt är inaktiverat), kommer inget ljud att spelas upp." - }, - "showTimeWithSkips": { - "message": "Visa tiden med det överhoppade borttaget" - }, - "showTimeWithSkipsDescription": { - "message": "Denna tid visas inom parentes bredvid den aktuella tiden nedanför sökfältet. Detta visar den totala videons varaktighet minus alla segment. Detta inkluderar segment markerade som endast \"Visa i sökfältet\"." - }, - "youHaveSkipped": { - "message": "Du har hoppat över " - }, - "minLower": { - "message": "minut" - }, - "minsLower": { - "message": "minuter" - }, - "hourLower": { - "message": "timme" - }, - "hoursLower": { - "message": "timmar" - }, - "youHaveSavedTime": { - "message": "Du har sparat andra", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "youHaveSavedTimeEnd": { - "message": " av deras liv", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "statusReminder": { - "message": "Gå till status.sponsor.ajay.app för serverstatus." - }, - "changeUserID": { - "message": "Importera/Exportera ditt privata Användar-ID" - }, - "whatChangeUserID": { - "message": "Detta ska hållas privat. Detta är som ett lösenord och ska inte delas med någon. Om andra får tag i det kan de utge sig för att vara dig. Om du letar efter ditt offentliga Användar-ID kan du klicka på urklippsikonen i popupen." - }, - "setUserID": { - "message": "Ange privat Användar-ID" - }, - "userIDChangeWarning": { - "message": "Varning: Ändring av ditt Användar-ID är permanent. Är du säker att du vill göra detta? Se till att ta en säkerhetskopia av ditt gamla för säkerhets skull." - }, - "createdBy": { - "message": "Skapad av" - }, - "supportOtherSites": { - "message": "Stöd för tredjeparts YouTube-webbplatser" - }, - "supportOtherSitesDescription": { - "message": "Stöd tredjeparts YouTube-klienter. För att aktivera support måste du acceptera de extra behörigheterna. Detta fungerar INTE i inkognito på Chrome och andra Chromium-varianter.", - "description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube" - }, - "supportedSites": { - "message": "Webbplatser som stöds: " - }, - "optionsInfo": { - "message": "Aktivera stöd för Invidious, inaktivera hoppa över automatiskt, dölj knappar och mer." - }, - "addInvidiousInstance": { - "message": "Lägg till tredjepartsklientinstans" - }, - "addInvidiousInstanceDescription": { - "message": "Lägg till en anpassad instans. Denna måste vara formaterad med ENDAST domänen. Exempelvis: invidious.ajay.app" - }, - "add": { - "message": "Lägg till" - }, - "addInvidiousInstanceError": { - "message": "Detta är en ogiltig domän. Den ska ENDAST inkludera domändelen. Exempelvis: invidious.ajay.app" - }, - "resetInvidiousInstance": { - "message": "Återställa Invidious instanslista" - }, - "resetInvidiousInstanceAlert": { - "message": "Du kommer nu att återställa Invidious instanslista" - }, - "currentInstances": { - "message": "Nuvarande Instanser:" - }, - "minDuration": { - "message": "Minsta varaktighet (sekunder):" - }, - "minDurationDescription": { - "message": "Segment som är kortare än det angivna värdet kommer inte att hoppas över eller visas i spelaren." - }, - "enableManualSkipOnFullVideo": { - "message": "Använd manuellt hoppa över när en fullständig videoetikett visas" - }, - "whatManualSkipOnFullVideo": { - "message": "För personer som vill titta på videon utan avbrott om den är fullt sponsrad eller självbefordran." - }, - "skipNoticeDuration": { - "message": "Antalet sekunder meddelandet för hoppa över ska visas:" - }, - "skipNoticeDurationDescription": { - "message": "Meddelandet om att hoppa över kommer att visas på skärmen åtminstone så här många sekunder. För manuell överhoppning kan det visas längre." - }, - "shortCheck": { - "message": "Följande inskickning är kortare än ditt minstavärde i alternativen. Det skulle kunna betyda att det redan är inskickat och bara ignorerat på grund av detta alternativ. Är du säker på att du vill skicka in?" - }, - "liveOrPremiere": { - "message": "Att skicka in på en aktiv liveström eller premiär är inte tillåtet. Vänta tills den är färdig, uppdatera sedan sidan och kontrollera att segmenten fortfarande är giltiga." - }, - "showUploadButton": { - "message": "Visa uppladdningsknapp" - }, - "customServerAddress": { - "message": "Serveradress för SponsorBlock" - }, - "customServerAddressDescription": { - "message": "Adressen SponsorBlock använder för att kommunicera med servern.\nOm du inte har en egen serverinstans ska den här inställningen inte ändras." - }, - "save": { - "message": "Spara" - }, - "reset": { - "message": "Återställ" - }, - "customAddressError": { - "message": "Denna adressen är inte korrekt formaterad. Se till att du har http:// eller https:// i början och inga snedstreck i slutet." - }, - "areYouSureReset": { - "message": "Är du säker på att du vill återställa detta?" - }, - "mobileUpdateInfo": { - "message": "Nu stöds även m.youtube.com" - }, - "exportOptions": { - "message": "Importera/Exportera alla alternativen" - }, - "exportOptionsCopy": { - "message": "Redigera/kopiera" - }, - "exportOptionsDownload": { - "message": "Spara till fil" - }, - "exportOptionsUpload": { - "message": "Ladda från fil" - }, - "whatExportOptions": { - "message": "Detta är hela din konfiguration i JSON-format. Det inkluderar ditt Användar-ID, så var noga med hur du hanterar informationen." - }, - "setOptions": { - "message": "Ange alternativ" - }, - "exportOptionsWarning": { - "message": "Varning: Att ändra alternativen är permanent och kan förstöra din installation. Är du säker på att du vill göra detta? Se till och gör en säkerhetskopia för säkerhets skull." - }, - "incorrectlyFormattedOptions": { - "message": "Denna JSON är inte korrekt formaterad. Dina alternativ har inte ändrats." - }, - "confirmNoticeTitle": { - "message": "Skicka segment" - }, - "submit": { - "message": "Skicka" - }, - "cancel": { - "message": "Avbryt" - }, - "delete": { - "message": "Ta bort" - }, - "preview": { - "message": "Förhandsgranska" - }, - "unsubmitted": { - "message": "Oinskickade" - }, - "inspect": { - "message": "Granska" - }, - "edit": { - "message": "Redigera" - }, - "copyDebugInformation": { - "message": "Kopiera felsökningsinformation till urklippet" - }, - "copyDebugInformationFailed": { - "message": "Misslyckades med att skriva till urklippet" - }, - "copyDebugInformationOptions": { - "message": "Kopierar information till urklippet för att dela med en utvecklare vid rapportering av ett fel / när en utvecklare ber om det. Känslig data som Användar-ID, vitlistade kanaler, och anpassad serveradress följer inte med. Däremot innehåller det information om useragent, webbläsare, operativsystem, och tilläggsversion. " - }, - "copyDebugInformationComplete": { - "message": "Felsökningsinformation har kopierats till urklippet. Ta bort eventuell information du inte vill dela med dig av. Spara informationen i en textfil eller klistra in den i en felrapport." - }, - "keyAlreadyUsed": { - "message": "Denna genväg är bunden till en annan åtgärd. Du måste välja en annan." - }, - "to": { - "message": "till", - "description": "Used between segments. Example: 1:20 to 1:30" - }, - "CopiedExclamation": { - "message": "Kopierad!", - "description": "Used after something has been copied to the clipboard. Example: 'Copied!'" - }, - "generic_guideline1": { - "message": "Inkludera mjuka övergångar" - }, - "generic_guideline2": { - "message": "Spelar som om ingenting hoppades över" - }, - "category_sponsor": { - "message": "Sponsor" - }, - "category_sponsor_description": { - "message": "Betald marknadsföring, betalda hänvisningar och direktannonser, men inte till självbefodran eller gratis shoutouts till skapare/webbplatser/produkter de gillar." - }, - "category_sponsor_guideline1": { - "message": "Betalda kampanjer" - }, - "category_sponsor_guideline2": { - "message": "Inte för donationer eller anpassade varor" - }, - "category_selfpromo": { - "message": "Obetald/självbefodran" - }, - "category_selfpromo_description": { - "message": "Som \"sponsormeddelande\" men med undantag för obetald eller självkampanj. Detta inkluderar avsnitt om varor, donationer eller information om vem de samarbetade med." - }, - "category_selfpromo_guideline1": { - "message": "Donationer, medlemskap och anpassade varor" - }, - "category_selfpromo_guideline2": { - "message": "Gratis shoutouts som inte läggs till i videon" - }, - "category_selfpromo_guideline3": { - "message": "Inte för företagsdesignade produkter och varor" - }, - "category_exclusive_access": { - "message": "Exklusiv tillgång" - }, - "category_exclusive_access_description": { - "message": "Endast för att märka hela videor. Används när en video visar upp en produkt, tjänst eller plats som de har fått fri eller subventionerad tillgång till." - }, - "category_exclusive_access_pill": { - "message": "Denna video visar en produkt, tjänst eller plats som de har fått gratis eller subventionerad tillgång till", - "description": "Short description for this category" - }, - "category_exclusive_access_guideline1": { - "message": "Hela videon visar något med gratis eller subventionerad tillgång" - }, - "category_interaction": { - "message": "Interaktionspåminnelse (Prenumerera)" - }, - "category_interaction_description": { - "message": "När där är en kort påminnelse att gilla, prenumerera eller följa dem. Om det är långt eller om det gäller något specifikt bör det istället vara under självbefodran." - }, - "category_interaction_guideline1": { - "message": "Korta påminnelser om att gilla, prenumerera eller följa" - }, - "category_interaction_guideline2": { - "message": "Inkluderar indirekta påminnelser att kommentera" - }, - "category_interaction_guideline3": { - "message": "Inte för allmän marknadsföring, endast för uppmaningar" - }, - "category_interaction_short": { - "message": "Interaktionspåminnelse" - }, - "category_intro": { - "message": "Uppehåll/Introduktion" - }, - "category_intro_description": { - "message": "Ett intervall utan faktiskt innehåll. Kan vara en paus, statisk ram, upprepande animation. Denna bör inte användas för övergångar som innehåller information." - }, - "category_intro_short": { - "message": "Uppehåll" - }, - "category_intro_guideline1": { - "message": "Intervall utan egentligt innehåll" - }, - "category_intro_guideline2": { - "message": "Inte för övergångar med information" - }, - "category_outro": { - "message": "Slutkort/Credits" - }, - "category_outro_description": { - "message": "Credits eller när YouTube-slutkort visas. Inte för slut med information." - }, - "category_outro_guideline1": { - "message": "Inkludera inte innehåll, även om slutkort visas på skärmen" - }, - "category_preview": { - "message": "Förhandsgranska/sammanfatta" - }, - "category_preview_description": { - "message": "Samling av klipp som visar vad som kommer upp i den här videon eller andra videos i en serie där all information upprepas senare i videon." - }, - "category_preview_guideline1": { - "message": "Klipp som visas senare, eller i en framtida video" - }, - "category_preview_guideline2": { - "message": "Sammanfattning av en tidigare video" - }, - "category_preview_guideline3": { - "message": "Inte för sektioner som lägger till ytterligare innehåll" - }, - "category_filler": { - "message": "Ämnesavvikelse/Skämt" - }, - "category_filler_description": { - "message": "Tangentiella scener endast för utfyllnad eller humor som inte krävs för att förstå det huvudsakliga innehållet i videon. Detta bör inte omfatta segment som tillhandahåller kontext eller bakgrundsdetaljer. Detta är en mycket aggressiv kategori avsedd för när du inte är på humör för \"kul\"." - }, - "category_filler_short": { - "message": "Utfyllnad" - }, - "category_filler_guideline1": { - "message": "Tangentiella scener endast för utfyllnad eller humor" - }, - "category_filler_guideline2": { - "message": "Distraktioner, bloopers, repriser" - }, - "category_filler_guideline3": { - "message": "Inte för scener som krävs för att förstå ämnet" - }, - "category_music_offtopic": { - "message": "Musik: Icke-musikavsnitt" - }, - "category_music_offtopic_description": { - "message": "Ska endast användas i musikvideor. Denna ska endast användas för delar av musikvideor som inte redan omfattas av en annan kategori." - }, - "category_music_offtopic_short": { - "message": "Icke-musik" - }, - "category_music_offtopic_guideline1": { - "message": "Avsnitt som inte finns i officiella utgåvor" - }, - "category_music_offtopic_guideline2": { - "message": "Icke-musik i ett liveframträdande" - }, - "category_poi_highlight": { - "message": "Höjdpunkt" - }, - "category_poi_highlight_description": { - "message": "Den del av videon som de flesta letar efter. Liknande kommentarer \"Video börjar på x\"." - }, - "category_poi_highlight_guideline1": { - "message": "Avsnitt som de flesta personer letar efter" - }, - "category_poi_highlight_guideline2": { - "message": "Kan hoppa över sammanhang" - }, - "category_poi_highlight_guideline3": { - "message": "Kan hoppa över till titeln eller miniatyrbilden" - }, - "category_chapter": { - "message": "Kapitel" - }, - "category_chapter_description": { - "message": "Anpassade namngivna kapitel som beskriver större delar av en video." - }, - "category_chapter_guideline1": { - "message": "Nämn inte sponsormärkets namn" - }, - "category_chapter_guideline2": { - "message": "Använd större kapitel för allmänna sektioner" - }, - "category_chapter_guideline3": { - "message": "Mindre kapitel kan placeras inuti större kapitel" - }, - "category_livestream_messages": { - "message": "Liveström: Donations-/meddelandeavläsningar" - }, - "category_livestream_messages_short": { - "message": "Meddelandeläsning" - }, - "autoSkip": { - "message": "Hoppa över automatiskt" - }, - "manualSkip": { - "message": "Hoppa över manuellt" - }, - "showOverlay": { - "message": "Visa i sökfältet" - }, - "disable": { - "message": "Inaktivera" - }, - "autoSkip_POI": { - "message": "Hoppa automatiskt till start" - }, - "manualSkip_POI": { - "message": "Fråga när video laddas" - }, - "showOverlay_POI": { - "message": "Visa i sökfältet" - }, - "showOverlay_full": { - "message": "Visa etikett" - }, - "showOverlay_chapter": { - "message": "Visa kapitel" - }, - "autoSkipOnMusicVideos": { - "message": "Hoppa över alla segment automatiskt när det finns ett icke-musiksegment" - }, - "muteSegments": { - "message": "Tillåt segment som tystar ljudet i stället för att hoppa över" - }, - "fullVideoSegments": { - "message": "Visa en ikon när hela videon är en annons", - "description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo" - }, - "previewColor": { - "message": "Färg på oinskickade", - "description": "Referring to submissions that have not been sent to the server yet." - }, - "seekBarColor": { - "message": "Sökfältsfärg" - }, - "category": { - "message": "Kategori" - }, - "skipOption": { - "message": "Alternativ för hoppa över", - "description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)" - }, - "enableTestingServer": { - "message": "Aktivera server för betatestning" - }, - "whatEnableTestingServer": { - "message": "Dina inskickningar och röster KOMMER INTE ATT RÄKNAS mot huvudservern. Använd endast detta för testning." - }, - "testingServerWarning": { - "message": "Alla inskickningar och röster KOMMER INTE ATT RÄKNAS mot huvudservern så länge du är ansluten mot testservern. Se till att inaktivera detta när du vill skicka in riktiga inskickningar." - }, - "bracketNow": { - "message": "(Nu)" - }, - "moreCategories": { - "message": "Fler kategorier" - }, - "chooseACategory": { - "message": "Välj en kategori" - }, - "enableThisCategoryFirst": { - "message": "För att skicka in segment med kategorin \"{0}\" måste du först aktivera det i alternativen. Du kommer nu att bli omdirigerad till alternativen.", - "description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options." - }, - "poiOnlyOneSegment": { - "message": "Varning: Denna typ av segment kan endast ha ett segment aktivt åt gången. Skickas flera segment kommer en av dem att visas slumpmässigt." - }, - "youMustSelectACategory": { - "message": "Du måste välja en kategori för alla segment du skickar in!" - }, - "bracketEnd": { - "message": "(Slut)" - }, - "End": { - "message": "Slut", - "description": "Button that skips to the end of a segment" - }, - "hiddenDueToDownvote": { - "message": "dold: rösta ner" - }, - "hiddenDueToDuration": { - "message": "dold: för kort" - }, - "manuallyHidden": { - "message": "manuellt dold" - }, - "channelDataNotFound": { - "description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.", - "message": "Kanal-ID:t är inte laddat ännu. Om du använder en inbäddad video, prova att använda YouTube-hemsidan istället. Detta kan också bero på förändringar i layouten hos YouTube och om du tror så är fallet kommentera det här:" - }, - "invidiousPermissionRefresh": { - "message": "Webbläsaren har återkallat behörigheten som behövs för att fungera på Invidious och andra tredjepartssajter. Klicka på knappen nedan för att återaktivera denna behörighet." - }, - "acceptPermission": { - "message": "Godkänn behörighet" - }, - "permissionRequestSuccess": { - "message": "Behörighet godkänd!" - }, - "permissionRequestFailed": { - "message": "Behörighetsbegäran misslyckades, tryckte du på förneka?" - }, - "adblockerIssueWhitelist": { - "message": "Om du inte kan lösa detta kan du inaktivera 'Tvinga kontroll av kanalen innan hoppa över' i inställningarna, eftersom SponsorBlock inte kan hämta kanalinformationen för den här videon" - }, - "forceChannelCheck": { - "message": "Tvinga kontroll av kanalen innan hoppa över" - }, - "whatForceChannelCheck": { - "message": "Som standard kommer segment att hoppas över direkt innan ens den vet vad det är för kanal. Som standard kan vissa segment i början av videon hoppas över på vitlistade kanaler. Aktiverar du detta alternativet kommer du att förhindra detta, men det gör att alla överhoppningar har en liten fördröjning eftersom det tar lite tid att få kanal-ID. Denna fördröjning kan vara obetydlig om du har en snabb internetuppkoppling." - }, - "forceChannelCheckPopup": { - "message": "Överväg att aktivera \"Tvinga kontroll av kanalen innan hoppa över\"" - }, - "downvoteDescription": { - "message": "Fel/Fel tidsintervall" - }, - "incorrectVote": { - "message": "Felaktig" - }, - "harmfulVote": { - "message": "Skadlig", - "description": "Used for chapter segments when the text is harmful/offensive to remove it faster" - }, - "incorrectCategory": { - "message": "Ändra kategori" - }, - "nonMusicCategoryOnMusic": { - "message": "Den här videon kategoriseras som musik. Är du säker på att denna har en sponsor? Om detta faktiskt är ett \"icke-musiksegment\", öppna tilläggsalternativen och aktivera denna kategori. Då kan du skicka in detta segment som \"icke-musik\" i stället för sponsor. Läs riktlinjerna om något är oklart." - }, - "multipleSegments": { - "message": "Flera segment" - }, - "guidelines": { - "message": "Riktlinjer" - }, - "readTheGuidelines": { - "message": "Läs riktlinjerna!!", - "description": "Show the first time they submit or if they are \"high risk\"" - }, - "categoryUpdate1": { - "message": "Kategorier finns här!" - }, - "categoryUpdate2": { - "message": "Öppna alternativen för att hoppa över intros, outros, varor, osv." - }, - "help": { - "message": "Hjälp" - }, - "GotIt": { - "message": "Jag förstår", - "description": "Used as the button to dismiss a tooltip" - }, - "fullVideoTooltipWarning": { - "message": "Detta segment är stort. Om hela videon handlar om ett ämne, ändra sedan från \"Hoppa över\" till \"Hela videon\". Se riktlinjerna för mer information." - }, - "categoryPillTitleText": { - "message": "Hela den här videon är märkt som denna kategori och är alltför tätt integrerad för att kunna separeras" - }, - "chapterNameTooltipWarning": { - "message": "Ett av dina kapitelnamn liknar en kategori. Du bör i stället använda kategorier när det är möjligt." - }, - "experiementOptOut": { - "message": "Hoppa av alla framtida experiment", - "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": "Dölj för alltid" - }, - "warningChatInfo": { - "message": "Vi märkte att du gjorde några vanliga misstag som inte var uppsåtligt" - }, - "warningTitle": { - "message": "Du har fått en varning" - }, - "questionButton": { - "message": "Jag har en fråga" - }, - "warningConfirmButton": { - "message": "Jag förstår varför" - }, - "warningError": { - "message": "Fel vid försök att bekräfta varning:" - }, - "Donate": { - "message": "Donera" - }, - "considerDonating": { - "message": "Hjälp till att finansiera utvecklingen" - }, - "hideDonationLink": { - "message": "Dölj donationslänk" - }, - "darkModeOptionsPage": { - "message": "Mörkt läge på Alternativsidan" - }, - "helpPageThanksForInstalling": { - "message": "Tack för att du installerade SponsorBlock." - }, - "helpPageReviewOptions": { - "message": "Granska alternativen nedan" - }, - "helpPageFeatureDisclaimer": { - "message": "Många funktioner är inaktiverade som standard. Om du vill hoppa över intros, outros, använda Invidious, etc, aktivera dem nedan. Du kan också dölja/visa UI-element." - }, - "helpPageHowSkippingWorks": { - "message": "Hur hoppa över fungerar" - }, - "helpPageHowSkippingWorks1": { - "message": "Videosegment hoppas över automatiskt om de finns i databasen. Du kan öppna popup-fönstret genom att klicka på tilläggsikonen för att få en förhandsvisning av vad de är." - }, - "helpPageHowSkippingWorks2": { - "message": "När du hoppar över ett segment får du ett meddelande. Om tidpunkten verkar felaktig rösta då ner genom att klicka på nerröstning! Du kan också rösta i popup-fönstret." - }, - "Submitting": { - "message": "Skickar in" - }, - "helpPageSubmitting1": { - "message": "Skicka in kan antingen göras i popup-fönstret genom att trycka på knappen \"Segmentet startar nu\" eller i videospelaren med knapparna på spelaren." - }, - "helpPageSubmitting2": { - "message": "Genom att klicka på uppspelningsknappen anges början på ett segment och genom att klicka på stoppikonen anges slutet. Du kan förbereda flera sponsorer innan du trycker på skicka. Klicka på uppladdningsknappen för att skicka in. Klicka på papperskorgen för att ta bort." - }, - "Editing": { - "message": "Redigerar" - }, - "helpPageEditing1": { - "message": "Om du gör fel kan du redigera eller ta bort dina segment efter att du klickat på uppåtpilen." - }, - "helpPageTooSlow": { - "message": "Detta är för långsamt" - }, - "helpPageTooSlow1": { - "message": "Det finns snabbtangenter om du vill använda dem. Tryck på semikolontangenten för att ange start/slut på ett sponsorsegment och klicka på apostrofen för att skicka in. Dessa kan ändras i inställningarna. Om du inte använder QWERTY, bör du förmodligen ändra tangentbindningen." - }, - "helpPageCopyOfDatabase": { - "message": "Kan jag få en kopia av databasen? Vad händer om du försvinner?" - }, - "helpPageCopyOfDatabase1": { - "message": "Databasen är offentlig och finns på" - }, - "helpPageCopyOfDatabase2": { - "message": "Källkoden är fritt tillgänglig. Så, även om något händer mig, är dina inskickningar inte förlorade." - }, - "helpPageNews": { - "message": "Nyheter och hur är det gjort" - }, - "helpPageSourceCode": { - "message": "Var kan jag få tag på källkoden?" - }, - "Credits": { - "message": "Medverkande" - }, - "LearnMore": { - "message": "Läs mer" - }, - "FullDetails": { - "message": "Fullständiga detaljer" - }, - "CopyDownvoteButtonInfo": { - "message": "Rösta ner och skapar en lokal kopia för dig att skicka in igen" - }, - "OpenCategoryWikiPage": { - "message": "Öppna denna kategoris wiki-sida." - }, - "CopyAndDownvote": { - "message": "Kopiera och rösta ner" - }, - "ContinueVoting": { - "message": "Fortsätt rösta" - }, - "ChangeCategoryTooltip": { - "message": "Detta kommer omedelbart att verkställas till dina segment" - }, - "downvote": { - "message": "Rösta ner" - }, - "upvote": { - "message": "Rösta upp" - }, - "hideSegment": { - "message": "Dölj segment" - }, - "skipSegment": { - "message": "Hoppa över segment" - }, - "playChapter": { - "message": "Spela kapitel" - }, - "SponsorTimeEditScrollNewFeature": { - "message": "Använd mushjulet medan du håller muspekaren över redigeringsrutan för att snabbt justera tiden. Kombinationer av CTRL- eller SKIFT-tangenten kan användas för att finjustera tiden." - }, - "categoryPillNewFeature": { - "message": "Nytt! Se när en video är helt sponsrad eller självbefodran" - }, - "dayAbbreviation": { - "message": "d", - "description": "100d" - }, - "hourAbbreviation": { - "message": "h", - "description": "100h" - }, - "optionsTabBehavior": { - "message": "Beteende", - "description": "Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabInterface": { - "message": "Gränssnitt", - "description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabKeyBinds": { - "message": "Tangentbordsgenvägar", - "description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabBackup": { - "message": "Säkerhetskopiera/Återställ", - "description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabAdvanced": { - "message": "Diverse", - "description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "noticeVisibilityLabel": { - "message": "Utseende på meddelandet för hoppa över", - "description": "Option label" - }, - "unbind": { - "message": "Ta bort genväg", - "description": "Unbind keyboard shortcut" - }, - "notSet": { - "message": "Inte inställd" - }, - "change": { - "message": "Ändra" - }, - "youtubeKeybindWarning": { - "message": "Detta är en inbyggd YouTube-genväg. Är du säker på att du vill använda den?" - }, - "betaServerWarning": { - "message": "BETA-servern är aktiverad!" - }, - "openOptionsPage": { - "message": "Öppna alternativsidan" - }, - "resetToDefault": { - "message": "Återställ inställningar till standard" - }, - "confirmResetToDefault": { - "message": "Är du säker på att du vill återställa alla inställningar till deras standardvärden? Detta kan inte ångras." - }, - "exportSegments": { - "message": "Exportera segment" - }, - "importSegments": { - "message": "Importera segment" - }, - "Import": { - "message": "Importera", - "description": "Button to initiate importing segments. Appears under the textbox where they paste in the data" - }, - "redeemSuccess": { - "message": "Inlöst!" - }, - "redeemFailed": { - "message": "Licensnyckeln är ogiltig" - }, - "hideUpsells": { - "message": "Dölj alternativ som inte är tillgängliga utan extra betalning" - }, - "chooseACountry": { - "message": "Välj ett land" - }, - "noDiscount": { - "message": "Du kvalificerar dig inte för att få rabatt" - }, - "discountLink": { - "message": "Rabattlänk (se priset i rosa)" - }, - "selectYourCountry": { - "message": "Välj ditt land" - }, - "alreadyDonated": { - "message": "Om du har donerat tidigare kan du lösa in fri åtkomst genom att skicka e-post till:", - "description": "After the colon is an email address" - }, - "cantAfford": { - "message": "Om du inte har råd att köpa en licens kan du klicka {här} för att se om du är berättigad till rabatt", - "description": "Keep the curly braces. The word 'here' should be translated as well." - }, - "patreonSignIn": { - "message": "Logga in med Patreon" - }, - "redeem": { - "message": "Lös in" - }, - "joinOnPatreon": { - "message": "Prenumerera på Patreon" - }, - "oneTimePurchase": { - "message": "Engångsköp" - }, - "enterLicenseKey": { - "message": "Ange licensnyckel" - }, - "chaptersPage1": { - "message": "SponsorBlock crowd-sourced kapitelfunktionen är endast tillgänglig för personer som köper en licens eller för de personer som beviljats gratis tillgång på grund av att de bidragit tidigare" - }, - "chaptersPage2": { - "message": "Obs: Tillstånd att skicka in kapitel är fortfarande baserat på beräknat rykte. Köpa en licens låter dig bara visa kapitel som lämnats in av andra", - "description": "On the chapters page for getting access to the paid chapters feature" - }, - "chapterNewFeature": { - "message": "Ny funktion: Crowd-sourced anpassade kapitel. Dessa är anpassade namngivna avsnitt i videor som kan staplas för att få mer och mer exakt. Köp en licens för att se de kapitel som lämnats på denna video såsom: ", - "description": "After the comma, a list of chapters for this video will appear" - }, - "chapterNewFeature2": { - "message": "Ny funktion: Crowd-sourced anpassade kapitel. Dessa är anpassade namngivna avsnitt i videor som kan staplas för att få mer och mer exakt. För dig är det gratis, aktivera det i alternativen." - }, - "unsubmittedSegmentCounts": { - "message": "Du har för närvarande {0} på {1}", - "description": "Example: You currently have 12 unsubmitted segments on 5 videos" - }, - "unsubmittedSegmentCountsZero": { - "message": "Du har för närvarande inga oinskickade segment", - "description": "Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments" - }, - "unsubmittedSegmentsSingular": { - "message": "oinskickade segment", - "description": "Example: You currently have 1 *unsubmitted segment* on 1 video" - }, - "unsubmittedSegmentsPlural": { - "message": "oinskickade segment", - "description": "Example: You currently have 12 *unsubmitted segments* on 5 videos" - }, - "videosSingular": { - "message": "video", - "description": "Example: You currently have 3 unsubmitted segments on 1 *video*" - }, - "videosPlural": { - "message": "videor", - "description": "Example: You currently have 12 unsubmitted segments on 5 *videos*" - }, - "clearUnsubmittedSegments": { - "message": "Rensa alla segment", - "description": "Label for a button in settings" - }, - "clearUnsubmittedSegmentsConfirm": { - "message": "Är du säker på att du vill rensa alla dina oinskickade segment?", - "description": "Confirmation message for the Clear unsubmitted segments button" - }, - "showUnsubmittedSegments": { - "message": "Visa segment", - "description": "Show/hide button for the unsubmitted segments list" - }, - "hideUnsubmittedSegments": { - "message": "Dölj segment", - "description": "Show/hide button for the unsubmitted segments list" - }, - "videoID": { - "message": "Video-ID", - "description": "Header of the unsubmitted segments list" - }, - "segmentCount": { - "message": "Antal segment", - "description": "Header of the unsubmitted segments list" - }, - "actions": { - "message": "Åtgärder", - "description": "Header of the unsubmitted segments list" - }, - "exportSegmentsAsURL": { - "message": "Dela som webbadress" - } -} diff --git a/public/_locales/sw/messages.json b/public/_locales/sw/messages.json deleted file mode 100644 index 0967ef42..00000000 --- a/public/_locales/sw/messages.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/public/_locales/ta/messages.json b/public/_locales/ta/messages.json deleted file mode 100644 index 05fd1ca4..00000000 --- a/public/_locales/ta/messages.json +++ /dev/null @@ -1,776 +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": "பாப்அப்பை மூடு" - }, - "SubmitTimes": { - "message": "பிரிவுகளைச் சமர்ப்பிக்கவும்" - }, - "submitCheck": { - "message": "இதை நிச்சயமாக சமர்ப்பிக்க விரும்புகிறீர்களா?" - }, - "whitelistChannel": { - "message": "அனுமதிப்பட்டியல் சேனல்" - }, - "removeFromWhitelist": { - "message": "அனுமதிப்பட்டியலில் இருந்து சேனலை அகற்று" - }, - "voteOnTime": { - "message": "ஒரு பிரிவில் வாக்களியுங்கள்" - }, - "Submissions": { - "message": "சமர்ப்பிப்புகள்" - }, - "savedPeopleFrom": { - "message": "நீங்கள் மக்களை காப்பாற்றியுள்ளீர்கள் " - }, - "viewLeaderboard": { - "message": "லீடர்போர்டு" - }, - "recordTimesDescription": { - "message": "சமர்ப்பிக்கவும்" - }, - "submissionEditHint": { - "message": "நீங்கள் சமர்ப்பி என்பதைக் கிளிக் செய்த பிறகு பிரிவு எடிட்டிங் தோன்றும்", - "description": "Appears in the popup to inform them that editing has been moved to the video player." - }, - "popupHint": { - "message": "குறிப்பு: விருப்பங்களில் சமர்ப்பிக்க விசைப்பலகைகளை அமைக்கலாம்" - }, - "clearTimesButton": { - "message": "நேரங்களை அழி" - }, - "submitTimesButton": { - "message": "நேரங்களைச் சமர்ப்பிக்கவும்" - }, - "publicStats": { - "message": "நீங்கள் எவ்வளவு பங்களித்தீர்கள் என்பதைக் காட்ட இது பொது புள்ளிவிவரங்கள் பக்கத்தில் பயன்படுத்தப்படுகிறது. அதை பார்" - }, - "Username": { - "message": "பயனர்பெயர்" - }, - "setUsername": { - "message": "பயனர்பெயரை அமைக்கவும்" - }, - "copyPublicID": { - "message": "பொது பயனர் 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-தளங்களை ஆதரிக்கவும்" - }, - "supportOtherSitesDescription": { - "message": "மூன்றாம் தரப்பு YouTube தளங்களை ஆதரிக்கவும். ஆதரவை இயக்க, நீங்கள் கூடுதல் அனுமதிகளை ஏற்க வேண்டும். இது Chrome மற்றும் பிற Chromium வகைகளில் தனிப்பட்ட தாவல்களில் வேலை செய்யாது.", - "description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube" - }, - "supportedSites": { - "message": "ஆதரிக்கப்படும் தளங்கள்: " - }, - "optionsInfo": { - "message": "ஆக்கிரமிப்பு ஆதரவை இயக்கு, ஆட்டோஸ்கிப்பை முடக்கு, பொத்தான்களை மறை மற்றும் பலவற்றை." - }, - "addInvidiousInstance": { - "message": "3 வது தரப்பு தளங்களை சேர்க்கவும்" - }, - "addInvidiousInstanceDescription": { - "message": "தனிப்பட்ட தளங்களை சேர்க்கவும். இது Domain வடிவமைப்பில் இருக்க வேண்டும். உதாரணம்: invidious.ajay.app" - }, - "add": { - "message": "சேர்" - }, - "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": "தெரிவுகள் பக்கத்தைத் திற" - } -} diff --git a/public/_locales/te/messages.json b/public/_locales/te/messages.json deleted file mode 100644 index 4a0ad63b..00000000 --- a/public/_locales/te/messages.json +++ /dev/null @@ -1,539 +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": "పాపప్ మూసివేయండి" - }, - "SubmitTimes": { - "message": "విభాగాలను సమర్పించండి" - }, - "submitCheck": { - "message": "మీరు దీన్ని ఖచ్చితంగా సమర్పించాలనుకుంటున్నారా?" - }, - "whitelistChannel": { - "message": "వైట్లిస్ట్ ఛానెల్" - }, - "removeFromWhitelist": { - "message": "వైట్లిస్ట్ నుండి ఛానెల్ని తొలగించండి" - }, - "voteOnTime": { - "message": "ఒక విభాగంలో ఓటు వేయండి" - }, - "Submissions": { - "message": "సమర్పణలు" - }, - "savedPeopleFrom": { - "message": "మీరు ప్రజలను రక్షించారు " - }, - "viewLeaderboard": { - "message": "లీడర్బోర్డ్" - }, - "recordTimesDescription": { - "message": "సమర్పించండి" - }, - "submissionEditHint": { - "message": "మీరు సమర్పించు క్లిక్ చేసిన తర్వాత విభాగం సవరణ కనిపిస్తుంది", - "description": "Appears in the popup to inform them that editing has been moved to the video player." - }, - "popupHint": { - "message": "సూచన: మీరు ఎంపికలలో సమర్పించడానికి కీబైండ్లను సెటప్ చేయవచ్చు" - }, - "clearTimesButton": { - "message": "టైమ్స్ క్లియర్" - }, - "submitTimesButton": { - "message": "టైమ్స్ సమర్పించండి" - }, - "publicStats": { - "message": "మీరు ఎంత సహకరించారో చూపించడానికి ఇది పబ్లిక్ గణాంకాల పేజీలో ఉపయోగించబడుతుంది. ఇది చూడు" - }, - "Username": { - "message": "వినియోగదారు పేరు" - }, - "setUsername": { - "message": "వినియోగదారు పేరును సెట్ చేయండి" - }, - "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 ట్రోస్, మెర్చ్ మొదలైనవాటిని దాటవేయడానికి ఎంపికలను తెరవండి." - } -} diff --git a/public/_locales/th/messages.json b/public/_locales/th/messages.json deleted file mode 100644 index 614ea66d..00000000 --- a/public/_locales/th/messages.json +++ /dev/null @@ -1,73 +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": "ส่วน" - }, - "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": "ล้างเวลา" - } -} diff --git a/public/_locales/tr/messages.json b/public/_locales/tr/messages.json deleted file mode 100644 index 4fe4240a..00000000 --- a/public/_locales/tr/messages.json +++ /dev/null @@ -1,1247 +0,0 @@ -{ - "fullName": { - "message": "Youtube için SponsorBlock - Sponsorlukları Atla", - "description": "Name of the extension." - }, - "Description": { - "message": "Videolardaki sponsorlukları, abonelik isteklerini ve daha fazlasını atlayın. Başkalarının vaktini kurtarmak için izlediğiniz videolardaki sponsorları bildirin.", - "description": "Description of the extension." - }, - "400": { - "message": "Sunucu isteğin geçersiz olduğunu iletti" - }, - "429": { - "message": "Sadece bu video için çok fazla sponsor süresi belirtti, bu kadar fazla olduğuna emin misin?" - }, - "409": { - "message": "Bu daha önce zaten gönderilmiş" - }, - "channelWhitelisted": { - "message": "Kanala izin verildi!" - }, - "Segment": { - "message": "kısım" - }, - "Segments": { - "message": "kısım" - }, - "SegmentsCap": { - "message": "Kısımlar" - }, - "Chapters": { - "message": "Bölümler" - }, - "renderAsChapters": { - "message": "Kısımları bölüm olarak göster", - "description": "Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system" - }, - "showSegmentNameInChapterBar": { - "message": "Geçerli kısmı video zamanının yanında göster" - }, - "upvoteButtonInfo": { - "message": "Bu öneriye oy ver" - }, - "reportButtonTitle": { - "message": "Raporla" - }, - "reportButtonInfo": { - "message": "Bu öneriyi hatalı olarak bildir." - }, - "Dismiss": { - "message": "Yoksay" - }, - "Loading": { - "message": "Yükleniyor..." - }, - "Hide": { - "message": "Asla Gösterme" - }, - "hitGoBack": { - "message": "Geldiğiniz yere dönmek istiyorsanız atlama'ya basın." - }, - "unskip": { - "message": "Atlama" - }, - "reskip": { - "message": "Tekrar atla" - }, - "unmute": { - "message": "Sesi Aç" - }, - "paused": { - "message": "Duraklatıldı" - }, - "manualPaused": { - "message": "Zamanlayıcı Durduruldu" - }, - "confirmMSG": { - "message": "Değerleri tek başına düzenlemek ve silmek için, bilgi butonuna basın veya sağ yukarıdaki eklenti simgesine tıklayarak eklenti menüsünü açın." - }, - "clearThis": { - "message": "Bunu silmek istediğinize emin misiniz?\n\n" - }, - "Unknown": { - "message": "Sponsor sürelerini yollarken bir sorun oluştur, lütfen tekrar deneyin." - }, - "sponsorFound": { - "message": "Bu videonun kısımları veri tabanımızda mevcut" - }, - "sponsor404": { - "message": "Kısım bulunamadı" - }, - "sponsorStart": { - "message": "Kısım Şimdi Başlıyor" - }, - "sponsorEnd": { - "message": "Kısım Şimdi Bitiyor" - }, - "sponsorCancel": { - "message": "Kısım Oluşturmayı İptal Et" - }, - "noVideoID": { - "message": "YouTube videosu bulunamadı.\nHatalı olduğunu düşünüyorsanız sayfayı yenileyin." - }, - "refreshSegments": { - "message": "Kısımları tazele" - }, - "success": { - "message": "Başarılı!" - }, - "voted": { - "message": "Oylandı!" - }, - "serverDown": { - "message": "Sunucu çökmüş gibi duruyor. Derhal geliştiriciyle iletişime geçin." - }, - "connectionError": { - "message": "Bağlantı hatası oluştu. Hata kodu: " - }, - "clearTimes": { - "message": "Kısımları temizle" - }, - "openPopup": { - "message": "SponsorBlock Penceresini Aç" - }, - "closePopup": { - "message": "Açılır Pencereyi kapat" - }, - "closeIcon": { - "message": "Kapat Simgesi" - }, - "SubmitTimes": { - "message": "Kısımları gönder" - }, - "sortSegments": { - "message": "Kısımları Sırala" - }, - "submitCheck": { - "message": "Bunu göndermek istediğinize emin misiniz?" - }, - "whitelistChannel": { - "message": "Kanala izin ver" - }, - "removeFromWhitelist": { - "message": "Kanalı izin listesinden çıkar" - }, - "voteOnTime": { - "message": "Bir Kısmı Oyla" - }, - "Submissions": { - "message": "Gönderimleriniz" - }, - "savedPeopleFrom": { - "message": "İnsanları şu kadar kısımdan kurtardınız: " - }, - "viewLeaderboard": { - "message": "Lider Tablosu" - }, - "recordTimesDescription": { - "message": "Gönder" - }, - "submissionEditHint": { - "message": "Kısım düzenlemesi Gönder'e tıkladığınızda görünecek", - "description": "Appears in the popup to inform them that editing has been moved to the video player." - }, - "popupHint": { - "message": "İpucu: Gönderim için ayarlardan kısayol tuşu atayabilirsiniz" - }, - "clearTimesButton": { - "message": "Süreleri Temizle" - }, - "submitTimesButton": { - "message": "Süreleri Gönder" - }, - "publicStats": { - "message": "Bu, ne kadar katkı sağladığınızı göstermek için herkese açık istatistik sayfasında kullanılacaktır. Görün" - }, - "Username": { - "message": "Kullanıcı adı" - }, - "setUsername": { - "message": "Kullanıcı Adı Belirle" - }, - "copyPublicID": { - "message": "Herkese Açık Kullanıcı Kimliğini Kopyala" - }, - "copySegmentID": { - "message": "Segment Kimliğini Kopyala" - }, - "discordAdvert": { - "message": "Öneri ve geri bildirimleriniz için resmi Discord serverımıza katılın!" - }, - "hideThis": { - "message": "Bunu sakla" - }, - "Options": { - "message": "Ayarlar" - }, - "showButtons": { - "message": "YouTube oynatıcısında Butonları Göster" - }, - "hideButtons": { - "message": "YouTube Oynatıcısındaki Butonları Gizle" - }, - "hideButtonsDescription": { - "message": "Bu YouTube oynatıcısındaki bölüm geçişlerini yolladığınız butonları saklayacaktır." - }, - "showSkipButton": { - "message": "“Asıl Kısma Atla” Düğmesi Oynatıcıda Kalsın" - }, - "showInfoButton": { - "message": "YouTube Oynatıcısındaki Bilgi Butonunu Göster" - }, - "hideInfoButton": { - "message": "YouTube Oynatıcısındaki Bilgi Butonunu Gizle" - }, - "autoHideInfoButton": { - "message": "Bilgi düğmesini otomatik gizle" - }, - "hideDeleteButton": { - "message": "YouTube Oynatıcısında Silme Tuşunu Gizle" - }, - "showDeleteButton": { - "message": "YouTube Oynatıcısında Silme Tuşunu Göster" - }, - "enableViewTracking": { - "message": "Kısım Atlama Sayaç Takibine İzin Ver" - }, - "whatViewTracking": { - "message": "Bu özellik, hangi kısımları atladığınızı takip ederek kullanıcıların gönderilerinin diğerlerine ne kadar yardımcı olduğunu bilmelerini sağlar ve olumlu oyları bir ölçüm aracı olarak kullanarak gereksiz yollanan kısımların veri tabanına girmemesini sağlar. Eklenti, bir kısmı her atladığınızda sunucuya bir mesaj gönderir. Umarım çoğu insan bu ayarı değiştirmez böylece görüntüleme sayıları doğru olur. :)" - }, - "enableViewTrackingInPrivate": { - "message": "Özel/Gizli sekmelerde atlama sayısı takibini etkinleştir" - }, - "enableTrackDownvotes": { - "message": "Kısımların olumsuz oylarını depola" - }, - "whatTrackDownvotes": { - "message": "Olumsuz oy verdiğiniz kısımlar, sayfayı tazeledikten sonra da gizli kalacaktır" - }, - "trackDownvotesWarning": { - "message": "Uyarı: Bu ayarı devre dışı bırakırsanız, halihazırda saklanan olumsuz oylar silinecek" - }, - "enableQueryByHashPrefix": { - "message": "Karma Ön eki ile Sorgula" - }, - "whatQueryByHashPrefix": { - "message": "Video Kimliğini kullanarak sunucudan kısımları talep etmek yerine, Video Kimliğinin karmasının ilk 4 karakterini gönderir. Bu sunucu, benzer karmalara sahip tüm videolar için verileri geri gönderir." - }, - "enableRefetchWhenNotFound": { - "message": "Yeni Videolardaki Kısımları Sürekli Sorgula" - }, - "whatRefetchWhenNotFound": { - "message": "Eğer video yeni ve kısımları bulunmuyorsa, sen videoyu izlerken her birkaç dakikada bir kısımları edinmeye çalışır." - }, - "enableShowCategoryWithoutPermission": { - "message": "Gönderim izni olmasa bile gönderim menüsünde kategorileri gösterme" - }, - "whatShowCategoryWithoutPermission": { - "message": "Bazı kategoriler, minimum itibar gereksinimleri nedeniyle göndermek için izin gerektirir" - }, - "showNotice": { - "message": "Uyarıyı Tekrar Göster" - }, - "showSkipNotice": { - "message": "Bir Kısmı Atladıktan Sonra Uyarı Göster" - }, - "showCategoryGuidelines": { - "message": "Kategori Yardımını Göster" - }, - "noticeVisibilityMode0": { - "message": "Tam Boyutlu Atlama Bildirimleri" - }, - "noticeVisibilityMode1": { - "message": "Otomatik Atlama için Küçük Atlama Bildirimleri" - }, - "noticeVisibilityMode2": { - "message": "Tüm Küçük Atlama Bildirimleri" - }, - "noticeVisibilityMode3": { - "message": "Otomatik Atlama için Soluk Atlama Bildirimleri" - }, - "noticeVisibilityMode4": { - "message": "Tüm Soluk Atlama Bildirimleri" - }, - "longDescription": { - "message": "SponsorBlock, sponsorları, giriş ve bitiş kısımlarını, abonelik hatırlatıcılarını ve YouTube videolarının diğer can sıkıcı kısımlarını atlamanıza olanak tanır. SponsorBlock, herkesin sponsorlu kısımları ve YouTube videolarının diğer kısımlarının başlangıç ve bitiş zamanlarını göndermesine izin veren kitle kaynaklı bir tarayıcı uzantısıdır. Bir kişi bu bilgiyi gönderdikten sonra, bu uzantıya sahip diğer herkes sponsorlu kısımları hemen atlayacaktır. Müzik videolarının müzik dışı bölümlerini de atlayabilirsiniz.", - "description": "Full description of the extension on the store pages." - }, - "website": { - "message": "Website", - "description": "Used on Firefox Store Page" - }, - "sourceCode": { - "message": "Kaynak Kodu", - "description": "Used on Firefox Store Page" - }, - "noticeUpdate": { - "message": "Uyarı güncellendi!", - "description": "The first line of the message displayed after the notice was upgraded." - }, - "noticeUpdate2": { - "message": "Eğer hala beğenmediyseniz, asla gösterme butonuna basın.", - "description": "The second line of the message displayed after the notice was upgraded." - }, - "setSkipShortcut": { - "message": "Kısmı atla", - "description": "Keybind label" - }, - "setStartSponsorShortcut": { - "message": "Kısmı başlat/durdur", - "description": "Keybind label" - }, - "setSubmitKeybind": { - "message": "Kısımları gönder", - "description": "Keybind label" - }, - "nextChapterKeybind": { - "message": "Sonraki bölüm", - "description": "Keybind label" - }, - "previousChapterKeybind": { - "message": "Önceki bölüm", - "description": "Keybind label" - }, - "keybindDescription": { - "message": "Kullanmak istediğiniz tuşu yazın ve kombine etmek istediğiniz tuşları seçin." - }, - "0": { - "message": "Bağlantı zaman aşımına uğradı. İnternet bağlantınızı kontrol ediniz. Eğer internetiniz çalışıyor ise, büyük ihtimalle sunucuya erişilemiyor veya sunucuya aşırı yüklenilmiş olabilir." - }, - "disableSkipping": { - "message": "Atlama etkin" - }, - "enableSkipping": { - "message": "Atlama devre dışı" - }, - "yourWork": { - "message": "Çalışmalarınız", - "description": "Used to describe the section that will show you the statistics from your submissions." - }, - "502": { - "message": "Sunucuya aşırı yüklenilmiş gibi gözüküyor. Birazdan tekrar deneyin." - }, - "errorCode": { - "message": "Hata Kodu: " - }, - "skip": { - "message": "Atla" - }, - "mute": { - "message": "Sustur" - }, - "full": { - "message": "Bütün Video", - "description": "Used for the name of the option to label an entire video as sponsor or self promotion." - }, - "skip_category": { - "message": "{0} atla?" - }, - "mute_category": { - "message": "{0} susturulsun mu?" - }, - "skip_to_category": { - "message": "{0} kısmına atlansın mı?", - "description": "Used for skipping to things (Skip to Highlight)" - }, - "skipped": { - "message": "{0} Atlandı", - "description": "Example: Sponsor Skipped" - }, - "muted": { - "message": "{0} susturuldu", - "description": "Example: Sponsor Muted" - }, - "skipped_to_category": { - "message": "{0} kısmına atlandı", - "description": "Used for skipping to things (Skipped to Highlight)" - }, - "disableAutoSkip": { - "message": "Otomatik Atlamayı Devredışı Bırak" - }, - "enableAutoSkip": { - "message": "Otomatik Atlamayı Devreye Sok" - }, - "audioNotification": { - "message": "Atlamada Sesli Bildirim" - }, - "audioNotificationDescription": { - "message": "Atlama sırasında sesli bildirim, bir kısım atlandığında bir ses çıkarır. Devre dışı bırakılırsa (veya otomatik atlama devre dışı bırakılırsa), ses çalınmaz." - }, - "showTimeWithSkips": { - "message": "Atlanan Kısımları Silinmiş Süreyi Göster" - }, - "showTimeWithSkipsDescription": { - "message": "Bu süre, video ilerleme çubuğunun altındaki geçerli zamanın yanında parantez içinde görüntülenir. Bu, videodaki kısımların silinmiş toplam video süresini gösterir. Bu, yalnızca \"Video İlerleme Çubuğunda Göster\" olarak işaretlenen kısımları içerir." - }, - "youHaveSkipped": { - "message": "Şu kadar kısım atladınız: " - }, - "minLower": { - "message": "dakika" - }, - "minsLower": { - "message": "dakika" - }, - "hourLower": { - "message": "saat" - }, - "hoursLower": { - "message": "saat" - }, - "youHaveSavedTime": { - "message": "İnsanların şu kadar vaktini kurtardınız:", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "youHaveSavedTimeEnd": { - "message": " yaşam süresi", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "statusReminder": { - "message": "Sunucu durumu için status.sponsor.ajay.app kontrol edin." - }, - "changeUserID": { - "message": "Özel Kullanıcı Kimliğini İçe/Dışa Aktar" - }, - "whatChangeUserID": { - "message": "Bu gizli tutulmalıdır. Bu bir şifre gibidir ve kimseyle paylaşılmamalıdır. Eğer birisi buna sahipse, seni taklit edebilir. Herkese açık kullanıcı kimliğinizi arıyorsanız, açılır pencerede pano simgesine tıklayın." - }, - "setUserID": { - "message": "Özel Kullanıcı Kimliğini Ayarla" - }, - "userIDChangeWarning": { - "message": "Uyarı: Özel Kullanıcı Kimliğini değiştirmek kalıcıdır. Bunu yapmak istediğinizden emin misiniz? Her ihtimale karşı eskisini yedeklediğinizden emin olun." - }, - "createdBy": { - "message": "Oluşturan" - }, - "supportOtherSites": { - "message": "3. Taraf Youtube Sitelerini Destekle" - }, - "supportOtherSitesDescription": { - "message": "Üçüncü taraf YouTube istemci desteği. Desteği etkinleştirmek için özel izinleri kabul etmelisiniz. Bu özellik Chrome ve diğer Chromium tarayıcılarda gizli modda çalışmaz.", - "description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube" - }, - "supportedSites": { - "message": "Desteklenen Siteler: " - }, - "optionsInfo": { - "message": "Invidious desteğini, otomatik atlamayı, butonları saklamayı ve daha fazlasını etkinleştir." - }, - "addInvidiousInstance": { - "message": "3. Taraf İstemci Örneği Ekle" - }, - "addInvidiousInstanceDescription": { - "message": "Özel bir örnek ekle. Buraya sadece alan adı yazılmalıdır. Örnek: invidious.ajay.app" - }, - "add": { - "message": "Ekle" - }, - "addInvidiousInstanceError": { - "message": "Bu geçersiz bir alan adı. Bu SADECE alan adı kısmını içermelidir. Örnek: invidious.ajay.app" - }, - "resetInvidiousInstance": { - "message": "Invidious Oluşum Listesini Sıfırla" - }, - "resetInvidiousInstanceAlert": { - "message": "Invidious Oluşum listesini sıfırlamak üzeresiniz" - }, - "currentInstances": { - "message": "Mevcut Oluşumlar:" - }, - "minDuration": { - "message": "Minimum süre (saniye):" - }, - "minDurationDescription": { - "message": "Ayarlanan değerden daha kısa kısımlar atlanmayacak veya oynatıcıda gösterilmeyecektir." - }, - "enableManualSkipOnFullVideo": { - "message": "Tam bir video etiketi mevcut olduğunda manuel atlama özelliğini kullanın" - }, - "whatManualSkipOnFullVideo": { - "message": "Video boyunca sponsorlu veya kendi reklamını yapıyorsa videoyu kesintisiz izlemek isteyenler için." - }, - "skipNoticeDuration": { - "message": "Atlandı uyarısı süresi (saniye cinsinden):" - }, - "skipNoticeDurationDescription": { - "message": "Bir kısım atlandığında ekranda atlandı uyarısı bu süre kadar gösterilir. Atlama elle gerçekleştiğinde bu uyarı daha uzun sürebilir." - }, - "shortCheck": { - "message": "Sıradaki öneri belirlediğiniz minimum süre ayarından daha kısa. Bu zaten yollandığı ve bu ayardan dolayı yok sayıldığı anlamına gelebilir. Göndermek istediğinizden emin misiniz?" - }, - "liveOrPremiere": { - "message": "Bir canlı yayın veya ön gösterim sırasında kısım gönderilemez. Yayının bitmesini bekleyin, sonra sayfayı tazeleyip kısımların geçerli olduğunu kontrol edin." - }, - "showUploadButton": { - "message": "Karşıya Yükleme Butonunu Göster" - }, - "customServerAddress": { - "message": "SponsorBlock Sunucu Adresi" - }, - "customServerAddressDescription": { - "message": "SponsorBlock'un sunucu ile iletişimi sağlamak için kullandığı adres.\nKendi sunucu kopyanız olmadığı sürece bu değiştirilmemelidir." - }, - "save": { - "message": "Kaydet" - }, - "reset": { - "message": "Sıfırla" - }, - "customAddressError": { - "message": "Bu adres doğru formatta değil. Başında http:// veya https:// olduğundan ve sonda / işareti olmadığından emin olun." - }, - "areYouSureReset": { - "message": "Bunu sıfırlamak istediğinize emin misiniz?" - }, - "mobileUpdateInfo": { - "message": "m.youtube.com şu an desteklenmektedir" - }, - "exportOptions": { - "message": "Bütün Ayarlarını İçe/Dışa Aktar" - }, - "exportOptionsCopy": { - "message": "Düzenle/kopyala" - }, - "exportOptionsDownload": { - "message": "Dosyaya kaydet" - }, - "exportOptionsUpload": { - "message": "Dosyadan yükle" - }, - "whatExportOptions": { - "message": "Bu, JSON'daki tüm yapılandırmanızdır. Buna Özel Kullanıcı Kimliğiniz de dahildir, bu yüzden bunu paylaşırken dikkatli olun." - }, - "setOptions": { - "message": "Seçenekleri Ayarla" - }, - "exportOptionsWarning": { - "message": "Uyarı: Ayarları değiştirmek kalıcıdır ve yüklemenizi bozabilir. Bunu yapmak istediğinizden emin misiniz? Eskisini yenilediğinizden emin olun." - }, - "incorrectlyFormattedOptions": { - "message": "Bu JSON doğru formatlanmamış. Ayarlarınız değiştirilmedi." - }, - "confirmNoticeTitle": { - "message": "Bölüm Gönder" - }, - "submit": { - "message": "Gönder" - }, - "cancel": { - "message": "İptal" - }, - "delete": { - "message": "Sil" - }, - "preview": { - "message": "Önizle" - }, - "unsubmitted": { - "message": "Gönderilmemiş" - }, - "inspect": { - "message": "Kontrol et" - }, - "edit": { - "message": "Düzenle" - }, - "copyDebugInformation": { - "message": "Onarım Bilgisini Panoya Kopyala" - }, - "copyDebugInformationFailed": { - "message": "Panoya kopyalanamadı" - }, - "copyDebugInformationOptions": { - "message": "Panoya, geliştiricinin hata gideriminde veya ulaşmak istediğinde geliştiriciye sağlamak üzerine bilgileri kaydeder. Kullanıcı kimliği, beyaz listenizdeki kanallar ve düzenlenmiş sunucu adresleri gibi hassas bilgiler silinmiştir. Ancak tarayıcı bilgileri, işletim sisteminiz ve eklenti numaranız gibi bilgileri içerebilir. " - }, - "copyDebugInformationComplete": { - "message": "Bu çözüm bilgisi panoya kopyalandı. Paylaşmak istemediğiniz herhangi bir bilgiyi silmekte özgürsünüz. Bir yazı dosyası olarak kaydedin veya hata raporuna kopyalayın." - }, - "keyAlreadyUsed": { - "message": "Bu kısayol başka bir eyleme atanmış. Lütfen başka kısayol seçin." - }, - "to": { - "message": "'e", - "description": "Used between segments. Example: 1:20 to 1:30" - }, - "CopiedExclamation": { - "message": "Kopyalandı!", - "description": "Used after something has been copied to the clipboard. Example: 'Copied!'" - }, - "generic_guideline1": { - "message": "Segue geçişlerini dahil et" - }, - "generic_guideline2": { - "message": "Hiçbir şey atlanmamış gibi oynuyor" - }, - "category_sponsor": { - "message": "Sponsor" - }, - "category_sponsor_description": { - "message": "Ücretli tanıtım, ücretli yönlendirmeler ve doğrudan reklamlar. Kendini pazarlayan veya beğendiği içerik üreticilerine/sitelere/ürünlere atıfta bulunanlar için değil." - }, - "category_sponsor_guideline1": { - "message": "Ücretli promosyonlar" - }, - "category_sponsor_guideline2": { - "message": "Bağışlar veya özel ürünler için değil" - }, - "category_selfpromo": { - "message": "Karşılıksız/Kendi Reklamı" - }, - "category_selfpromo_description": { - "message": "\"Sponsor\" seçeneğinden farkı para karşılığı olmaması veya kendi reklamını yapmasıdır. Buna kendi markalı ürünlerini satmak, bağış toplamak ve videoda işbirliği yaptığı kimselerden bahsetmek dahildir." - }, - "category_selfpromo_guideline1": { - "message": "Bağışlar, üyelikler ve özel ürünler" - }, - "category_selfpromo_guideline2": { - "message": "Videoya eklenmeyen ücretsiz konuşmalar" - }, - "category_selfpromo_guideline3": { - "message": "Kurumsal tasarım ürünleri ve malları için değil" - }, - "category_exclusive_access": { - "message": "Özel Erişim" - }, - "category_exclusive_access_description": { - "message": "Yalnızca bütün videoyu etiketlemek için kullanın. Video; ücretli veya ücretsiz elde edilen bir ürünün, hizmetin veya bir yerin reklamını yapıyorsa kullanılır." - }, - "category_exclusive_access_pill": { - "message": "Bu video; yayıncıya özel ücretle veya ücretsiz sunulan bir ürünün, hizmetin veya bir yerin reklamını yapıyor", - "description": "Short description for this category" - }, - "category_exclusive_access_guideline1": { - "message": "Tüm video, ücretsiz veya sübvansiyonlu erişime sahip bir şeyi sergiliyor" - }, - "category_interaction": { - "message": "Etkileşim Hatırlatıcısı (Abonelik)" - }, - "category_interaction_description": { - "message": "Videonun ortasında beğenmek, abone olmak veya takip etmek için kısa bir hatırlatma olan kısımdır. Eğer süresi uzunsa veya belirli bir şey hakkındaysa, kendi reklamını yapan kategorisi seçilmelidir." - }, - "category_interaction_guideline1": { - "message": "Beğenmek, abone olmak veya takip etmek için kısa hatırlatıcılar" - }, - "category_interaction_guideline2": { - "message": "Yorum yapmak için dolaylı hatırlatıcılar içerir" - }, - "category_interaction_guideline3": { - "message": "Genel tanıtım için değil, yalnızca harekete geçirici mesajlar" - }, - "category_interaction_short": { - "message": "Etkileşim Hatırlatıcısı" - }, - "category_intro": { - "message": "Aralık/Giriş Animasyonu" - }, - "category_intro_description": { - "message": "Gerçek içeriği olmayan bir aralık. Duraklama, sabit ekran, tekrar eden animasyon olabilir. Bu bilgi içeren geçişler için kullanılmamalıdır." - }, - "category_intro_short": { - "message": "Aralık" - }, - "category_intro_guideline1": { - "message": "Gerçek içerik olmayan aralık" - }, - "category_intro_guideline2": { - "message": "Bilgi içeren geçişler için değil" - }, - "category_outro": { - "message": "Bitiş Ekranı/Jenerik" - }, - "category_outro_description": { - "message": "Videoda emeği geçenlerin veya video sonunda çıkan kartların gösterildiği kısımlar. Bilgilendirici sona sahip videolar için değil." - }, - "category_outro_guideline1": { - "message": "Bitiş kartları ekranda olsa bile içerik eklemeyin" - }, - "category_preview": { - "message": "Ön İzleme/Özet" - }, - "category_preview_description": { - "message": "Bu videoda veya diğer videolarda neler olduğunu gösteren, videonun ilerleyen zamanında tüm bilgilerin tekrarlandığı bir dizi klip koleksiyonudur." - }, - "category_preview_guideline1": { - "message": "Daha sonra veya gelecekteki bir videoda görünen klipler" - }, - "category_preview_guideline2": { - "message": "Bir önceki videonun özeti" - }, - "category_preview_guideline3": { - "message": "Ek içerik ekleyen bölümler için değil" - }, - "category_filler": { - "message": "Konuyla Alakasız / Şaka" - }, - "category_filler_description": { - "message": "Videonun ana içeriğini anlamak için gerekli olmayan, yalnızca zaman geçirme veya mizah için eklenen teğet sahnelerdir. Bu, bağlam veya arka plan ayrıntılarını sağlayan kısımları içermemelidir. Bu, \"eğlence\" havasında olmadığınız zamanlar için tasarlanmış çok agresif bir kategoridir." - }, - "category_filler_short": { - "message": "Alakasız Konu" - }, - "category_filler_guideline1": { - "message": "Yalnızca dolgu veya mizah için teğet sahneler" - }, - "category_filler_guideline2": { - "message": "Dikkat dağıtıcı şeyler, hatalar, tekrarlar" - }, - "category_filler_guideline3": { - "message": "Konuyu anlamak için gerekli sahneler için değil" - }, - "category_music_offtopic": { - "message": "Müzik: Müzik Olmayan Bölüm" - }, - "category_music_offtopic_description": { - "message": "Yalnızca müzik videolarında kullanım içindir. Bu yalnızca başka bir kategoriye katılmamış müzik videolarının parçaları için kullanılmalıdır." - }, - "category_music_offtopic_short": { - "message": "Müzik Olmayan Bölüm" - }, - "category_music_offtopic_guideline1": { - "message": "Resmi sürümlerde olmayan bölümler" - }, - "category_music_offtopic_guideline2": { - "message": "Canlı performansta müzik dışı" - }, - "category_poi_highlight": { - "message": "Vurgu" - }, - "category_poi_highlight_description": { - "message": "Videoda, çoğu insanın aradığı kısım. \"Video x sürede başlıyor\" yorumlarına benzer." - }, - "category_poi_highlight_guideline1": { - "message": "Çoğu kişinin aradığı bölüm" - }, - "category_poi_highlight_guideline2": { - "message": "Bağlamı atlayabilir" - }, - "category_poi_highlight_guideline3": { - "message": "Başlığa veya küçük resme atlayabilir" - }, - "category_chapter": { - "message": "Bölüm" - }, - "category_chapter_description": { - "message": "Bir videonun ana kısımlarını açıklayan özel adlandırılmış bölümler." - }, - "category_chapter_guideline1": { - "message": "Sponsor marka isimlerinden bahsetme" - }, - "category_chapter_guideline2": { - "message": "Genel kısımlar için daha büyük bölümler kullanın" - }, - "category_chapter_guideline3": { - "message": "Daha küçük bölümler daha büyük bölümlerin içine yerleştirilebilir" - }, - "category_livestream_messages": { - "message": "Canlı Yayın: Bağış/Mesaj Okuma" - }, - "category_livestream_messages_short": { - "message": "Canlı Yayın Mesajlarını Okumak" - }, - "autoSkip": { - "message": "Otomatik Atla" - }, - "manualSkip": { - "message": "Elle Atla" - }, - "showOverlay": { - "message": "Arama Çubuğunda Göster" - }, - "disable": { - "message": "Devredışı" - }, - "autoSkip_POI": { - "message": "Başlangıca otomatik atla" - }, - "manualSkip_POI": { - "message": "Videonun başında sor" - }, - "showOverlay_POI": { - "message": "Arama Çubuğunda Göster" - }, - "showOverlay_full": { - "message": "Etiketi Göster" - }, - "showOverlay_chapter": { - "message": "Bölümleri Göster" - }, - "autoSkipOnMusicVideos": { - "message": "Müzik olmayan kısım varsa tüm kısımları otomatik atla" - }, - "muteSegments": { - "message": "Atlamak yerine sesi kapatan bölümlere izin ver" - }, - "fullVideoSegments": { - "message": "Video bütünüyle bir reklamsa simge göster", - "description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo" - }, - "previewColor": { - "message": "Gönderilmemiş Renk", - "description": "Referring to submissions that have not been sent to the server yet." - }, - "seekBarColor": { - "message": "Oynatma Çubuğu Rengi" - }, - "category": { - "message": "Kategori" - }, - "skipOption": { - "message": "Atlama Seçeneği", - "description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)" - }, - "enableTestingServer": { - "message": "Beta Deneme Sunucusunu Devreye Sok" - }, - "whatEnableTestingServer": { - "message": "Önerileriniz ve oylarınız ana sunucuya GÖNDERİLMEYECEKTİR. Bunu sadece deneme amacıyla kullanın." - }, - "testingServerWarning": { - "message": "Tüm öneriler ve oylar, test sunucusuna bağlandığınız sürece ana sunucuya iletilmeyecektir. Gerçek öneriler yapmak istediğinizde bu ayarı kapatmayı unutmayın." - }, - "bracketNow": { - "message": "(Şimdi)" - }, - "moreCategories": { - "message": "Daha Fazla Kategori" - }, - "chooseACategory": { - "message": "Bir Kategori Seç" - }, - "enableThisCategoryFirst": { - "message": "\"{0}\" kategorisinde bir kısım göndermek için onu ayarlardan açmalısınız. Ayarlara yönlendiriliyorsunuz.", - "description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options." - }, - "poiOnlyOneSegment": { - "message": "Uyarı: Bu tür kısımlardan sadece bir adet etkin olabilir. Birden fazla gönderdiğinizde onlardan rastgele biri gösterilir." - }, - "youMustSelectACategory": { - "message": "Göndereceğin tüm kısımlar için bir kategori seçmelisin!" - }, - "bracketEnd": { - "message": "(Son)" - }, - "End": { - "message": "Son", - "description": "Button that skips to the end of a segment" - }, - "hiddenDueToDownvote": { - "message": "gizlendi: eksile" - }, - "hiddenDueToDuration": { - "message": "gizlendi: çok kısa" - }, - "manuallyHidden": { - "message": "elle gizlendi" - }, - "channelDataNotFound": { - "description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.", - "message": "Kanal kimliği henüz yüklenmedi. Gömülü bir video kullanıyorsanız, bunun yerine YouTube ana sayfasından izlemeyi deneyin. Bu, YouTube düzenindeki değişikliklerden de kaynaklanabilir, eğer öyleyse, buraya bir yorum yazın:" - }, - "invidiousPermissionRefresh": { - "message": "Tarayıcınız, eklentinin Invidious ve diğer 3. taraf sitelerde çalışması için gerekli izni kaldırdı. Bu izni yeniden etkinleştirmek için lütfen aşağıdaki butona tıklayın." - }, - "acceptPermission": { - "message": "İzni kabul et" - }, - "permissionRequestSuccess": { - "message": "İzin isteği başarılı!" - }, - "permissionRequestFailed": { - "message": "İzin isteği başarısız. Reddet butonuna mı tıkladınız?" - }, - "adblockerIssueWhitelist": { - "message": "Bunu çözemiyorsanız, SponsorBlock, bu video için kanal bilgilerini alamadığı için 'Atlamadan Önce Kanal Kontrolünü Zorla' ayarını devre dışı bırakın" - }, - "forceChannelCheck": { - "message": "Atlamadan Önce Kanal Kontrolüne Zorla" - }, - "whatForceChannelCheck": { - "message": "Varsayılan olarak, kanalın ne olduğunu bile bilmeden hemen kısımları atlayacaktır. Videonun başlangıcındaki bazı kısımları beyaz listeye eklenmiş kanallarda atlayabilir. Bu seçeneğin etkinleştirilmesi bunu önleyecektir ancak tüm atlamaların yapılması, kanal kimliğinin alınması biraz zaman alabileceğinden küçük bir gecikmeye neden olur. Hızlı bir bağlantın varsa bu gecikme fark edilmeyebilir." - }, - "forceChannelCheckPopup": { - "message": "\"Atlamadan Önce Kanal Kontrolünü Zorla\" Seçeneğini Etkinleştirmeyi Düşünebilirsiniz" - }, - "downvoteDescription": { - "message": "Hatalı/Yanlış Zaman" - }, - "incorrectVote": { - "message": "Hatalı" - }, - "harmfulVote": { - "message": "Zararlı", - "description": "Used for chapter segments when the text is harmful/offensive to remove it faster" - }, - "incorrectCategory": { - "message": "Kategoriyi değiştir" - }, - "nonMusicCategoryOnMusic": { - "message": "Bu video müzik olarak sınıflandırılmıştır. Bunun bir sponsor olduğundan emin misin? Bu aslında bir \"Müzik Dışı bölüm\" ise, uzantı seçeneklerini açın ve bu kategoriyi etkinleştirin. Ardından, bu kısmı sponsor yerine \"Müzik Olmayan\" olarak gönderebilirsiniz. Kafanız karıştıysa lütfen yönergeleri okuyun." - }, - "multipleSegments": { - "message": "Birden Çok Bölüm" - }, - "guidelines": { - "message": "Kılavuz" - }, - "readTheGuidelines": { - "message": "Kılavuzu Oku!!", - "description": "Show the first time they submit or if they are \"high risk\"" - }, - "categoryUpdate1": { - "message": "Kategoriler burada!" - }, - "categoryUpdate2": { - "message": "Girişleri, bitişleri, ürünleri ve benzeri şeyleri atlamak için ayarları açın." - }, - "help": { - "message": "Yardım" - }, - "GotIt": { - "message": "Anladım", - "description": "Used as the button to dismiss a tooltip" - }, - "fullVideoTooltipWarning": { - "message": "Bu kısım büyük. Bütün video tek bir konu hakkındaysa \"Atla\" yerine \"Bütün Video\"yu seçin. Daha çok bilgi için kılavuzlara bakın." - }, - "categoryPillTitleText": { - "message": "Bu videonun bütünü bu şekilde sınıflandırılmış ve kısımları birbirinden ayrılamayacak kadar sıkı bütünleştirilmiş" - }, - "chapterNameTooltipWarning": { - "message": "Bölüm adlarınızdan biri bir kategoriye benziyor. Bunun yerine mümkün olduğunda kategorileri kullanmalısınız." - }, - "experiementOptOut": { - "message": "Gelecekteki deneylerin hiçbirine katılma", - "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": "Asla gösterme" - }, - "warningChatInfo": { - "message": "Kötü amaçlı olmayan bazı yaygın hatalar yaptığınızı fark ettik" - }, - "warningTitle": { - "message": "Bir uyarı aldın" - }, - "questionButton": { - "message": "Bir sorum var" - }, - "warningConfirmButton": { - "message": "Nedenini anlıyorum" - }, - "warningError": { - "message": "Uyarıyı tanımlamaya çalışırken hata oluştu:" - }, - "Donate": { - "message": "Bağış Yap" - }, - "considerDonating": { - "message": "Geliştirme sürecinin fonlanmasına yardım et" - }, - "hideDonationLink": { - "message": "Bağış Bağlantısını Gizle" - }, - "darkModeOptionsPage": { - "message": "Ayarlar Sayfasında Karanlık Modu" - }, - "helpPageThanksForInstalling": { - "message": "SponsorBlock'u yüklediğiniz için teşekkürler." - }, - "helpPageReviewOptions": { - "message": "Lütfen aşağıdaki seçenekleri inceleyin" - }, - "helpPageFeatureDisclaimer": { - "message": "Birçok özellik varsayılan olarak devre dışıdır. İntroları, outroları atlamak vb. kullanmak istiyorsanız, bunları aşağıdan etkinleştirin. Ayrıca arayüz öğelerini gizleyebilir/gösterebilirsiniz." - }, - "helpPageHowSkippingWorks": { - "message": "Atlama nasıl çalışıyor" - }, - "helpPageHowSkippingWorks1": { - "message": "Segmen video akan otomatis dilewati jika ditemukan di databasis. Kamu bisa buka munculan dengan klik ikon ekstensi untuk mendapatkan pratinjau apa adanya." - }, - "helpPageHowSkippingWorks2": { - "message": "Når du springer et segment over, får du besked, når du springer et segment over. Hvis timingen virker forkert, kan du stemme ned ved at klikke på downvote! Du kan også stemme i popup-vinduet." - }, - "Submitting": { - "message": "Submitting" - }, - "helpPageSubmitting1": { - "message": "Indsendelse kan enten ske i popup-vinduet ved at trykke på \"Segment Begynder Nu\"-knappen eller i videoafspilleren med knapperne på afspilleren." - }, - "helpPageSubmitting2": { - "message": "Clicking the play button indicated the start of a segment and clicking the stop icon indicates the end. You can prepare multiple sponsors before hitting submit. Clicking the upload button will submit. Clicking the garbage can will delete." - }, - "Editing": { - "message": "Düzenleme" - }, - "helpPageEditing1": { - "message": "Eğer kısımlarda hata yaptıysanız, yukarı ok işareti olan düğmeye tıkladıktan sonra kısımları silebilir veya düzeltebilirsiniz." - }, - "helpPageTooSlow": { - "message": "Bu fazla yavaş" - }, - "helpPageTooSlow1": { - "message": "Kullanmak isterseniz kısayol tuşları var. Sponsorlu kısmın başlangıcını/sonunu belirtmek için noktalı virgül tuşuna basın ve göndermek için kesme işaretine tıklayın. Bu tuşlar ayarlarda değiştirilebilir. QWERTY klavye kullanmıyorsanız, tuş ayarlarını değiştirmelisiniz." - }, - "helpPageCopyOfDatabase": { - "message": "Veri tabanının bir kopyasını alabilir miyim? Bir gün ortadan kaybolursanız ne olacak?" - }, - "helpPageCopyOfDatabase1": { - "message": "Veri tabanı herkese açıktır ve şuradan erişilebilir: " - }, - "helpPageCopyOfDatabase2": { - "message": "Kaynak koduna serbestçe erişilebilir. Ben bir gün bu dünyada yalan olsam dahi, sizin gönderdiğiniz kısımlar kaybolmayacak." - }, - "helpPageNews": { - "message": "Haberler ve nasıl yapılır" - }, - "helpPageSourceCode": { - "message": "Kaynak koduna nereden ulaşabilirim?" - }, - "Credits": { - "message": "Emeği Geçenler" - }, - "LearnMore": { - "message": "Dahasını Öğren" - }, - "FullDetails": { - "message": "Tüm Detaylar" - }, - "CopyDownvoteButtonInfo": { - "message": "Olumsuz oy verir ve yeni bir kısım seçmeniz için bir kopya oluşturur" - }, - "OpenCategoryWikiPage": { - "message": "Bu kategorinin wiki sayfasını açın." - }, - "CopyAndDownvote": { - "message": "Kopyala ve olumsuz" - }, - "ContinueVoting": { - "message": "Oylamaya devam et" - }, - "ChangeCategoryTooltip": { - "message": "Bu, kısımlarınız için anında geçerli olur" - }, - "downvote": { - "message": "Eksi oy" - }, - "upvote": { - "message": "Olumlu oy" - }, - "hideSegment": { - "message": "Segmenti gizleyin" - }, - "skipSegment": { - "message": "Kısmı atla" - }, - "playChapter": { - "message": "Bölümü oynat" - }, - "SponsorTimeEditScrollNewFeature": { - "message": "Zaman aralığını hızlı bir şekilde ayarlamak için düzenleme kutusunun üzerinde fare tekerini kullanın. Değişikliklere ince ayar yapmak için ctrl veya shift tuşunun kombinasyonları kullanılabilir." - }, - "categoryPillNewFeature": { - "message": "Yeni! Videonun bütünü sponsor veya kendi reklamıysa bu uyarıyı görün" - }, - "dayAbbreviation": { - "message": "g", - "description": "100d" - }, - "hourAbbreviation": { - "message": "s", - "description": "100h" - }, - "optionsTabBehavior": { - "message": "Davranış", - "description": "Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabInterface": { - "message": "Arayüz", - "description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabKeyBinds": { - "message": "Klavye kısayolları", - "description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabBackup": { - "message": "Yedekle/Geri Yükle", - "description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabAdvanced": { - "message": "Çeşitli", - "description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "noticeVisibilityLabel": { - "message": "Atlama uyarısı görünümü", - "description": "Option label" - }, - "unbind": { - "message": "Klavye kısayolunu kaldır", - "description": "Unbind keyboard shortcut" - }, - "notSet": { - "message": "Ayarlanmadı" - }, - "change": { - "message": "Değiştir" - }, - "youtubeKeybindWarning": { - "message": "Bu kısayol YouTube tarafından kullanılıyor. Bunu kullanmak istediğinize emin misiniz?" - }, - "betaServerWarning": { - "message": "BETA Sunucusu etkinleştirildi!" - }, - "openOptionsPage": { - "message": "Seçenekler sayfasını aç" - }, - "resetToDefault": { - "message": "Ayarları varsayılana sıfırla" - }, - "confirmResetToDefault": { - "message": "Tüm ayarları varsayılan değerlerine sıfırlamak istediğinizden emin misiniz? Bu geri alınamaz." - }, - "exportSegments": { - "message": "Segmentleri dışa aktar" - }, - "importSegments": { - "message": "Kısımları içe aktar" - }, - "Import": { - "message": "İçeri aktar", - "description": "Button to initiate importing segments. Appears under the textbox where they paste in the data" - }, - "redeemSuccess": { - "message": "Kullanım Başarılı!" - }, - "redeemFailed": { - "message": "Lisans anahtarı geçersiz" - }, - "hideUpsells": { - "message": "Ekstra ödeme olmadan kullanılamayan özellikleri gizle" - }, - "chooseACountry": { - "message": "Bir ülke seçiniz" - }, - "noDiscount": { - "message": "İndirim için uygun değilsiniz" - }, - "discountLink": { - "message": "İndirim Bağlantısı (Pembe fiyatı gör)" - }, - "selectYourCountry": { - "message": "Ülkenizi seçin" - }, - "alreadyDonated": { - "message": "Şimdiye kadar herhangi bir miktarda bağış yaptıysanız, bu adrese e-posta göndererek ücretsiz erişim hakkına sahip olabilirsin:", - "description": "After the colon is an email address" - }, - "cantAfford": { - "message": "Lisans satın almaya gücünüz yetmiyorsa, indirim almaya uygun olup olmadığınızı görmek için {here} tıklayın", - "description": "Keep the curly braces. The word 'here' should be translated as well." - }, - "patreonSignIn": { - "message": "Patreon ile giriş yap" - }, - "redeem": { - "message": "Kullan" - }, - "joinOnPatreon": { - "message": "Patreon'da Destekle" - }, - "oneTimePurchase": { - "message": "Tek seferlik satın alım" - }, - "enterLicenseKey": { - "message": "Lisans Anahtarını Girin" - }, - "chaptersPage1": { - "message": "SponsorBlock'un topluluk kaynaklı bölümler özelliği yalnızca lisans satın alan veya geçmiş katkılarından dolayı ücretsiz erişim hakkı verilen kişiler tarafından kullanılabilir" - }, - "chaptersPage2": { - "message": "Not: Bölüm gönderme izni hala hesaplanan itibara dayanmaktadır. Bir lisans satın almak, yalnızca başkaları tarafından gönderilen bölümleri görüntülemenize izin verir", - "description": "On the chapters page for getting access to the paid chapters feature" - }, - "chapterNewFeature": { - "message": "Yeni Özellik: Topluluk kaynaklı özel bölümler. Bunlar, giderek daha doğru hale gelmek için istiflenebilen videolardaki özel adlandırılmış bölümlerdir. Bu videodaki gibi gönderilen bölümleri görüntülemek için bir lisans satın alın: ", - "description": "After the comma, a list of chapters for this video will appear" - }, - "chapterNewFeature2": { - "message": "Yeni Özellik: Topluluk kaynaklı özel bölümler. Bunlar, giderek daha doğru hale gelmek için istiflenebilen videolardaki özel adlandırılmış bölümlerdir. Ücretsiz erişiminiz var, seçeneklerden etkinleştirin." - }, - "unsubmittedSegmentCounts": { - "message": "Şu anda {1} da {0} var", - "description": "Example: You currently have 12 unsubmitted segments on 5 videos" - }, - "unsubmittedSegmentCountsZero": { - "message": "Gönderilmemiş kısmınız bulunmamaktadır", - "description": "Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments" - }, - "unsubmittedSegmentsSingular": { - "message": "gönderilmemiş kısım", - "description": "Example: You currently have 1 *unsubmitted segment* on 1 video" - }, - "unsubmittedSegmentsPlural": { - "message": "gönderilmemiş kısımlar", - "description": "Example: You currently have 12 *unsubmitted segments* on 5 videos" - }, - "videosSingular": { - "message": "video", - "description": "Example: You currently have 3 unsubmitted segments on 1 *video*" - }, - "videosPlural": { - "message": "videolar", - "description": "Example: You currently have 12 unsubmitted segments on 5 *videos*" - }, - "clearUnsubmittedSegments": { - "message": "Tüm kısımları temizle", - "description": "Label for a button in settings" - }, - "clearUnsubmittedSegmentsConfirm": { - "message": "Gönderilmemiş tüm kısımları temizlemek istediğinizden emin misiniz?", - "description": "Confirmation message for the Clear unsubmitted segments button" - }, - "showUnsubmittedSegments": { - "message": "Kısımları göster", - "description": "Show/hide button for the unsubmitted segments list" - }, - "hideUnsubmittedSegments": { - "message": "Kısımları gizle", - "description": "Show/hide button for the unsubmitted segments list" - }, - "videoID": { - "message": "Video ID", - "description": "Header of the unsubmitted segments list" - }, - "segmentCount": { - "message": "Kısım Sayısı", - "description": "Header of the unsubmitted segments list" - }, - "actions": { - "message": "İşlemler", - "description": "Header of the unsubmitted segments list" - }, - "exportSegmentsAsURL": { - "message": "URL olarak paylaş" - } -} diff --git a/public/_locales/uk/messages.json b/public/_locales/uk/messages.json deleted file mode 100644 index 78f01afc..00000000 --- a/public/_locales/uk/messages.json +++ /dev/null @@ -1,1096 +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": "Сегменти" - }, - "Chapters": { - "message": "Розділи" - }, - "renderAsChapters": { - "message": "Показувати сегменти як розділи", - "description": "Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system" - }, - "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": "Закрити вікно" - }, - "SubmitTimes": { - "message": "Надіслати сегменти" - }, - "sortSegments": { - "message": "Сортувати сегменти" - }, - "submitCheck": { - "message": "Ви впевнені, що хочете надіслати цю інформацію?" - }, - "whitelistChannel": { - "message": "Додати канал в білий список" - }, - "removeFromWhitelist": { - "message": "Видалити канал з білого списку" - }, - "voteOnTime": { - "message": "Проголосувати за сегмент" - }, - "Submissions": { - "message": "Надіслано сегментів" - }, - "savedPeopleFrom": { - "message": "Ви допомогли людям пропустити " - }, - "viewLeaderboard": { - "message": "Дошка пошани" - }, - "recordTimesDescription": { - "message": "Надіслати" - }, - "submissionEditHint": { - "message": "Редагування сегментів з'явиться після натискання на кнопку \"Надіслати\"", - "description": "Appears in the popup to inform them that editing has been moved to the video player." - }, - "popupHint": { - "message": "Підказка: Ви можете налаштувати комбінації клавіш для надсилання в опціях" - }, - "clearTimesButton": { - "message": "Очистити час" - }, - "submitTimesButton": { - "message": "Надіслати час" - }, - "publicStats": { - "message": "Воно використовується на публічній сторінці статистики, щоб показати Ваш внесок. Її можна подивитися" - }, - "Username": { - "message": "Ім'я користувача" - }, - "setUsername": { - "message": "Встановити ім'я користувача" - }, - "copyPublicID": { - "message": "Копіювати публічний UserID" - }, - "copySegmentID": { - "message": "Копіювати ID сегменту" - }, - "discordAdvert": { - "message": "Приєднуйтесь до офіційного сервера Discord, щоб залишити пропозиції і зворотний зв'язок!" - }, - "hideThis": { - "message": "Приховати це" - }, - "Options": { - "message": "Налаштування" - }, - "showButtons": { - "message": "Показувати кнопки в плеєрі YouTube" - }, - "hideButtons": { - "message": "Приховати кнопки в плеєрі YouTube" - }, - "hideButtonsDescription": { - "message": "Це налаштування приховує кнопки для надсилання спонсорських вставок, які з'являються в плеєрі YouTube." - }, - "showSkipButton": { - "message": "Залишати кнопку \"Перейти до Основне\" на плеєрі" - }, - "showInfoButton": { - "message": "Показувати кнопку інформації в плеєрі YouTube" - }, - "hideInfoButton": { - "message": "Приховати кнопку інформації в плеєрі YouTube" - }, - "autoHideInfoButton": { - "message": "Кнопка \"Автоматично сховати інформацію\"" - }, - "hideDeleteButton": { - "message": "Приховати кнопку видалення в плеєрі YouTube" - }, - "showDeleteButton": { - "message": "Показувати кнопку видалення в плеєрі YouTube" - }, - "enableViewTracking": { - "message": "Увімкнути відстеження кількості пропусків сегментів" - }, - "whatViewTracking": { - "message": "Ця можливість відстежує, які сегменти Ви пропустили, щоб допомогти користувачам дізнатися, наскільки їх внесок допоміг іншим, і, поряд з голосами, використовується як метрика, щоб переконатися, що спам не влучає у базу даних. Розширення надсилає повідомлення на сервер кожен раз, коли Ви пропускаєте сегмент. Сподіваємося, велика частина користувачів не поміняє це налаштування, так що у нас буде точна статистика переглядів. :)" - }, - "enableViewTrackingInPrivate": { - "message": "Увімкнути відстеження пропусків у вкладках інкогніто" - }, - "enableTrackDownvotes": { - "message": "Зберігати голоси \"проти\" сегментів" - }, - "whatTrackDownvotes": { - "message": "Усі сегменти, за які ви проголосуєте \"проти\", залишаться прихованими навіть після оновлення" - }, - "trackDownvotesWarning": { - "message": "Попередження: вимкнення цієї опції призведе до видалення всіх раніше збережених голосів \"проти\"" - }, - "enableQueryByHashPrefix": { - "message": "Пошук по частині хеша" - }, - "whatQueryByHashPrefix": { - "message": "Замість надсилання на сервер ID відео, для отримання сегментів будуть використовуватися перші 4 символи хеша ID. Сервер поверне дані для всіх відео зі схожими хешамі." - }, - "enableRefetchWhenNotFound": { - "message": "Перевіряти сегменти в нових відео" - }, - "whatRefetchWhenNotFound": { - "message": "Якщо відео нове і для нього не знайдено сегментів, то інформація про них буде оновлюватися кожні пару хвилин, поки ви дивитеся відео." - }, - "showNotice": { - "message": "Показувати сповіщення знову" - }, - "showSkipNotice": { - "message": "Показувати сповіщення після пропуску сегмента" - }, - "showCategoryGuidelines": { - "message": "Показати Довідку по Категоріях" - }, - "noticeVisibilityMode0": { - "message": "Повнорозмірні сповіщення про пропуски" - }, - "noticeVisibilityMode1": { - "message": "Зменшені сповіщення для автоматичних пропусків" - }, - "noticeVisibilityMode2": { - "message": "Всі сповіщення зменшеного розміру" - }, - "noticeVisibilityMode3": { - "message": "Напівпрозорі сповіщення для автоматичних пропусків" - }, - "noticeVisibilityMode4": { - "message": "Напівпрозорі сповіщення для всіх пропусків" - }, - "longDescription": { - "message": "SponsorBlock дозволяє пропускати спонсорські вставки, початкові і кінцеві заставки, прохання підписатися і інше в відео на YouTube. SponsorBlock - колективне розширення, яке дозволяє кожному надіслати час початку і кінця подібних сегментів в відео. Після того, як хто-небудь надсилає цю інформацію, всі інші користувачі розширення будуть автоматично пропускати ці сегменти. Так само можна пропускати частини кліпів без музики.", - "description": "Full description of the extension on the store pages." - }, - "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" - }, - "nextChapterKeybind": { - "message": "Наступний розділ", - "description": "Keybind label" - }, - "previousChapterKeybind": { - "message": "Попередній розділ", - "description": "Keybind label" - }, - "keybindDescription": { - "message": "Виберіть клавішу, набравши її та виберіть бажану клавішу-модифікатор." - }, - "0": { - "message": "Таймаут підключення. Перевірте ваше з'єднання з інтернетом. Якщо ваш інтернет працює, сервер, швидше за все, перевантажений або лежить." - }, - "disableSkipping": { - "message": "Пропуск увімкнено" - }, - "enableSkipping": { - "message": "Пропуск вимкнено" - }, - "yourWork": { - "message": "Ваша робота", - "description": "Used to describe the section that will show you the statistics from your submissions." - }, - "502": { - "message": "Схоже, він перевантажений. Спробуйте ще раз через кілька секунд." - }, - "errorCode": { - "message": "Код помилки: " - }, - "skip": { - "message": "Пропустити" - }, - "mute": { - "message": "Вимкнути звук" - }, - "full": { - "message": "Повне відео", - "description": "Used for the name of the option to label an entire video as sponsor or self promotion." - }, - "skip_category": { - "message": "Пропустити {0}?" - }, - "mute_category": { - "message": "Вимкнути звук {0}?" - }, - "skip_to_category": { - "message": "Пропустити до {0}?", - "description": "Used for skipping to things (Skip to Highlight)" - }, - "skipped": { - "message": "{0} Пропущено", - "description": "Example: Sponsor Skipped" - }, - "muted": { - "message": "{0} Вимкнений звук", - "description": "Example: Sponsor Muted" - }, - "skipped_to_category": { - "message": "Пропущено до {0}", - "description": "Used for skipping to things (Skipped to Highlight)" - }, - "disableAutoSkip": { - "message": "Вимкнути автоматичний пропуск" - }, - "enableAutoSkip": { - "message": "Увімкнути автоматичний пропуск" - }, - "audioNotification": { - "message": "Аудіо сповіщення при пропуску" - }, - "audioNotificationDescription": { - "message": "Аудіо сповіщення про пропуск буде відтворюватися кожен раз, коли сегмент пропущений. Якщо відключено (або автоматичний пропуск відключений), звук не буде відтворюватися." - }, - "showTimeWithSkips": { - "message": "Показувати тривалість без сегментів" - }, - "showTimeWithSkipsDescription": { - "message": "Ця тривалість відображається в дужках поруч з фактичної під смугою прокрутки. Показує тривалість відео без сегментів. Включає сегменти, для яких вибрано \"Відображати в смузі прокрутки\"." - }, - "youHaveSkipped": { - "message": "Ви пропустили " - }, - "minLower": { - "message": "хвилину" - }, - "minsLower": { - "message": "хвилин" - }, - "hourLower": { - "message": "година" - }, - "hoursLower": { - "message": "годин" - }, - "youHaveSavedTime": { - "message": "Ви заощадили людям", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "youHaveSavedTimeEnd": { - "message": " їх життів", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "statusReminder": { - "message": "Дивіться стан сервера на status.sponsor.ajay.app." - }, - "whatChangeUserID": { - "message": "Тримайте його в таємниці. Ставтеся до нього як до паролю і не передавайте нікому. Якщо хтось їм заволодіє, то зможе видати себе за вас. Якщо ви шукаєте публічний ID користувача, натисніть значок буфера обміну у спливаючому вікні." - }, - "createdBy": { - "message": "Створено" - }, - "supportOtherSites": { - "message": "Підтримувати сторонні YouTube-сайти" - }, - "supportOtherSitesDescription": { - "message": "Підтримувати сторонні клієнти для YouTube. Щоб включити підтримку, Вам знадобиться прийняти додаткові дозволи. Ця функція НЕ працює в режимі \"інкогніто\" в Chrome і браузерах, заснованих на Chromium.", - "description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube" - }, - "supportedSites": { - "message": "Підтримувані сайти: " - }, - "optionsInfo": { - "message": "Увімкнути підтримку Invidious, вимкнути автоматичний пропуск, приховати кнопки і не тільки." - }, - "addInvidiousInstance": { - "message": "Додати інстанси стороннього клієнта" - }, - "addInvidiousInstanceDescription": { - "message": "Додати свій інстанс. Формат: ТІЛЬКИ домен. Наприклад, invidious.ajay.app" - }, - "add": { - "message": "Додати" - }, - "addInvidiousInstanceError": { - "message": "Це неправильний домен. Введіть ТІЛЬКИ домен. Наприклад: invidious.ajay.app" - }, - "resetInvidiousInstance": { - "message": "Скинути список інстанси Invidious" - }, - "resetInvidiousInstanceAlert": { - "message": "Ви збираєтеся скинути список інстанси Invidious" - }, - "currentInstances": { - "message": "Поточні інстанси:" - }, - "minDuration": { - "message": "Мінімальна тривалість (секунд):" - }, - "minDurationDescription": { - "message": "Сегменти коротше цього значення не будуть пропускатися і не будуть показані в плеєрі." - }, - "skipNoticeDuration": { - "message": "Тривалість повідомлення пропуску (в секундах):" - }, - "skipNoticeDurationDescription": { - "message": "Повідомлення про пропуск залишиться на екрані принаймні так довго. Для пропуску вручну він може бути видимим довше." - }, - "shortCheck": { - "message": "Наступний діапазон часу коротше, ніж Ваше налаштування мінімальної тривалості. Це може означати, що він вже був надісланий, і просто ігнорується через це налаштування. Ви дійсно хочете надіслати?" - }, - "liveOrPremiere": { - "message": "Надсилання під час прямого ефіру чи прем'єри не дозволено. Будь ласка, зачекайте до завершення, потім оновіть сторінку і переконайтеся, що сегменти все ще дійсні." - }, - "showUploadButton": { - "message": "Показувати кнопку надсилання" - }, - "customServerAddress": { - "message": "Адреса сервера SponsorBlock" - }, - "customServerAddressDescription": { - "message": "Адреса, за якою SponsorBlock звертається до сервера.\nМіняйте тільки якщо Ви підняли свій сервер." - }, - "save": { - "message": "Зберегти" - }, - "reset": { - "message": "Скинути" - }, - "customAddressError": { - "message": "Ця адреса неправильного формату. Переконайтеся, що він починається з http: // або https: //, і що на кінці немає слеша." - }, - "areYouSureReset": { - "message": "Ви дійсно хочете це скинути?" - }, - "mobileUpdateInfo": { - "message": "m.youtube.com тепер підтримується" - }, - "exportOptions": { - "message": "Імпорт/Експорт всіх налаштувань" - }, - "exportOptionsCopy": { - "message": "Змінити/копіювати" - }, - "exportOptionsDownload": { - "message": "Зберегти до файлу" - }, - "exportOptionsUpload": { - "message": "Завантажити з файлу" - }, - "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": "Копіює інформацію в буфер обміну, яка буде надана розробнику при виникненні помилки/за запитом розробника. Такі відомості, як ID користувача, список дозволених каналів і адреса користувача сервера не передаються. Однак, відправляються ваш user agent, браузер, операційна система і номер версії розширення. " - }, - "copyDebugInformationComplete": { - "message": "Інформація про налагодження скопійована в буфер обміну. Ви можете видалити будь-яку інформацію, якої не хочете ділитися. Збережіть її в текстовий файл, вставте в звіт про помилку." - }, - "keyAlreadyUsed": { - "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!'" - }, - "generic_guideline1": { - "message": "Включає плавний перехід до наступної теми" - }, - "generic_guideline2": { - "message": "Програється, наче нічого не пропущено" - }, - "category_sponsor": { - "message": "Спонсор" - }, - "category_sponsor_description": { - "message": "Рекламні інтеграції, реферальні посилання і реклама безпосередньо. Не для самореклами або рекомендацій різних подій/творців/сайтів/продуктів, які подобаються автору відео." - }, - "category_sponsor_guideline1": { - "message": "Платні акції" - }, - "category_selfpromo": { - "message": "Самореклама/рекомендація" - }, - "category_selfpromo_description": { - "message": "Схоже на \"Спонсора\", але для безкоштовної реклами і самореклами. Включає себе вставки про мерчендайз, пожертвування або інформацію про тих, разом з ким було зроблено відео." - }, - "category_exclusive_access": { - "message": "Ексклюзивний доступ" - }, - "category_exclusive_access_description": { - "message": "Лише для позначення цілих відео. Використовується, коли відео демонструє продукт, послугу або місцеположення, до яких автори отримали безоплатний або субсидований доступ." - }, - "category_exclusive_access_pill": { - "message": "Це відео демонструє продукт, послугу або місцеположення, до яких автори отримали безоплатний або субсидований доступ", - "description": "Short description for this category" - }, - "category_interaction": { - "message": "Нагадування про взаємодію (підписка)" - }, - "category_interaction_description": { - "message": "Коли є коротке нагадування поставити лайк, підписатися на канал або в соцмережах в середині вмісту. Якщо ця вставка тривала або про щось конкретне, вона повинна класифікуватися як самореклама." - }, - "category_interaction_short": { - "message": "Нагадування про взаємодію" - }, - "category_intro": { - "message": "Пауза/заставка" - }, - "category_intro_description": { - "message": "Частина відео без значимого контенту. Може бути паузою, статичним кадром, що повторюється анімацією. Це не повинно використовуватися для переходів, що містять інформацію." - }, - "category_intro_short": { - "message": "Заставка" - }, - "category_outro": { - "message": "Кінцева заставка/титри" - }, - "category_outro_description": { - "message": "Титри або час появи кінцевих заставок YouTube. Не для підведення підсумків сказаного у відео." - }, - "category_preview": { - "message": "Попередній перегляд/короткий зміст" - }, - "category_preview_description": { - "message": "Колекція кліпів, які показують, що відбувається в цьому відео або інших відео в серії, де вся інформація повторюється пізніше у відео." - }, - "category_filler": { - "message": "Дотичне наповнення/Жарти" - }, - "category_filler_short": { - "message": "Наповнення" - }, - "category_music_offtopic": { - "message": "Музика: Сегмент без музики" - }, - "category_music_offtopic_description": { - "message": "Тільки для використання в музичних кліпах. Використовується для сегментів музичних кліпів, які не належать до іншої категорії." - }, - "category_music_offtopic_short": { - "message": "Без музики" - }, - "category_music_offtopic_guideline2": { - "message": "Не музика під час виступу наживо" - }, - "category_poi_highlight": { - "message": "Основне" - }, - "category_poi_highlight_description": { - "message": "Частина відео яку шукає більшість людей (Аналогічно коментарю \"Відео починається з Х:ХХ\")." - }, - "category_poi_highlight_guideline2": { - "message": "Може пропустити контекст" - }, - "category_poi_highlight_guideline3": { - "message": "Можна перейти до назви або ескізу" - }, - "category_chapter": { - "message": "Розділ" - }, - "category_livestream_messages": { - "message": "Прямі трансляції: пожертвування/читання повідомлення" - }, - "category_livestream_messages_short": { - "message": "Читання повідомлень" - }, - "autoSkip": { - "message": "Автоматичний пропуск" - }, - "manualSkip": { - "message": "Пропуск вручну" - }, - "showOverlay": { - "message": "Показувати в смузі перемотування" - }, - "disable": { - "message": "Вимкнути" - }, - "autoSkip_POI": { - "message": "Автоматично перейти до початку" - }, - "manualSkip_POI": { - "message": "Спитати поки відео завантажується" - }, - "showOverlay_POI": { - "message": "Показати в смузі перемотування" - }, - "showOverlay_full": { - "message": "Показати мітку" - }, - "showOverlay_chapter": { - "message": "Показати розділи" - }, - "autoSkipOnMusicVideos": { - "message": "Автоматично пропустити усі сегменти, якщо присутній сегмент без музики" - }, - "muteSegments": { - "message": "Дозволити сегменти, які відключають звук замість пропуску" - }, - "fullVideoSegments": { - "message": "Показувати значок, коли все відео є рекламою", - "description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo" - }, - "previewColor": { - "message": "Колір не надісланого сегмента", - "description": "Referring to submissions that have not been sent to the server yet." - }, - "seekBarColor": { - "message": "Колір в смужці прокрутки" - }, - "category": { - "message": "Категорія" - }, - "skipOption": { - "message": "Спосіб пропуску", - "description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)" - }, - "enableTestingServer": { - "message": "Включити сервера для бета-тестів" - }, - "whatEnableTestingServer": { - "message": "Відправлені вами вставки і голоси НЕ БУДУТЬ НАДІСЛАНІ на головний сервер. Використовуйте тільки для тестування." - }, - "testingServerWarning": { - "message": "Усі надіслані вами вставки і голоси НЕ БУДУТЬ НАДІСЛАНІ на головний сервер, поки ви підключені до сервера для тестів. Не забудьте відключити цей параметр, щоб знову надсилати на головний сервер." - }, - "bracketNow": { - "message": "(Зараз)" - }, - "moreCategories": { - "message": "Більше категорій" - }, - "chooseACategory": { - "message": "Оберіть категорію" - }, - "enableThisCategoryFirst": { - "message": "Щоб надіслати сегменти категорії \"{0}\", ви повинні включити її в налаштуваннях. Зараз ви будете туди перенаправлені.", - "description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options." - }, - "poiOnlyOneSegment": { - "message": "Увага: Сегменти даного типу можуть бути активними лише по одному. Надсилання декількох призведе до відображення випадкового сегмента." - }, - "youMustSelectACategory": { - "message": "Ви повинні обрати категорію для всіх сегментів, які ви відправляєте!" - }, - "bracketEnd": { - "message": "(Кінець)" - }, - "End": { - "message": "Кінець", - "description": "Button that skips to the end of a segment" - }, - "hiddenDueToDownvote": { - "message": "приховано: проголосували проти" - }, - "hiddenDueToDuration": { - "message": "приховано: занадто коротко" - }, - "manuallyHidden": { - "message": "приховано вручну" - }, - "channelDataNotFound": { - "description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.", - "message": "ID каналу ще не завантажений. Якщо ви використовуєте вбудоване відео, спробуйте замість цього скористатися домашньою сторінкою YouTube. Це також може бути викликано змінами в дизайні YouTube, якщо ви вважаєте, що це так, залиште коментар тут:" - }, - "invidiousPermissionRefresh": { - "message": "Браузер відкликав дозвіл, необхідний для роботи на Invidious та інших сторонніх сайтах. Будь ласка, натисніть кнопку нижче, щоб повторно активувати цей дозвіл." - }, - "acceptPermission": { - "message": "Надати дозвіл" - }, - "permissionRequestSuccess": { - "message": "Дозвіл отримано!" - }, - "permissionRequestFailed": { - "message": "Не вдалося отримати дозвіл, ви натиснули на \"Блокувати\"?" - }, - "adblockerIssueWhitelist": { - "message": "Якщо ви не можете вирішити цю проблему, спробуйте відключити \"Примусова перевірка каналів перед пропуском\" в налаштуваннях, так як SponsorBlock не може визначити назву каналу для цього відео" - }, - "forceChannelCheck": { - "message": "Примусова перевірка каналів перед пропуском" - }, - "whatForceChannelCheck": { - "message": "За замовчуванням розширення пропускає сегменти відразу ж, не перевіряючи те, який це канал. За замовчуванням деякі сегменти на початку відео можуть бути пропущені на каналах з білого списку. Увімкнення цієї опції запобіжить це, але всі пропуски будуть мати невелику затримку, оскільки отримання ID каналу може зайняти деякий час. Ця затримка може бути непомітною, якщо у вас швидкий інтернет." - }, - "forceChannelCheckPopup": { - "message": "Рекомендуємо увімкнути \"Примусова перевірка каналів перед пропуском\"" - }, - "downvoteDescription": { - "message": "Невірно вказано час" - }, - "incorrectVote": { - "message": "Неправильно" - }, - "harmfulVote": { - "message": "Шкідливе", - "description": "Used for chapter segments when the text is harmful/offensive to remove it faster" - }, - "incorrectCategory": { - "message": "Змінити категорію" - }, - "nonMusicCategoryOnMusic": { - "message": "Це відео класифіковано як музичне. Ви впевнені, що в ньому є спонсори? Якщо насправді це \"Сегмент без музики\", відкрийте параметри розширення і увімкніть цю категорію. Потім ви можете надіслати цей сегмент як \"Без музики\", а не як спонсора. Будь ласка, прочитайте керівництво, якщо ви заплуталися." - }, - "multipleSegments": { - "message": "Декілька сегментів" - }, - "guidelines": { - "message": "Керівництво" - }, - "readTheGuidelines": { - "message": "Прочитайте керівництво!!", - "description": "Show the first time they submit or if they are \"high risk\"" - }, - "categoryUpdate1": { - "message": "Категорії тут!" - }, - "categoryUpdate2": { - "message": "Відкрийте налаштування, щоб пропускати початкові і кінцеві заставки, саморекламу та інше." - }, - "help": { - "message": "Довідка" - }, - "GotIt": { - "message": "Зрозуміло", - "description": "Used as the button to dismiss a tooltip" - }, - "fullVideoTooltipWarning": { - "message": "Цей сегмент великий. Якщо все відео на одну тему, тоді змініть значення з \"Пропустити\" на \"Повне відео\". Продивіться керівництво для додаткової інформації." - }, - "categoryPillTitleText": { - "message": "Все відео позначене цією категорією, воно є її уособленням, тож категорію неможливо виокремити." - }, - "experiementOptOut": { - "message": "Відмова від усіх майбутніх експериментів", - "description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private." - }, - "hideForever": { - "message": "Сховати назавжди" - }, - "warningChatInfo": { - "message": "Ми помітили, що ви не зловмисно робили деякі поширені помилки" - }, - "warningTitle": { - "message": "Ви отримали попередження" - }, - "questionButton": { - "message": "У мене є питання" - }, - "warningConfirmButton": { - "message": "Я розумію причину" - }, - "warningError": { - "message": "Помилка при спробі визнати попередження:" - }, - "Donate": { - "message": "Пожертвувати" - }, - "considerDonating": { - "message": "Допомогти з фінансуванням розробки" - }, - "hideDonationLink": { - "message": "Приховати посилання на пожертвування" - }, - "darkModeOptionsPage": { - "message": "Темний режим на сторінці налаштувань" - }, - "helpPageThanksForInstalling": { - "message": "Дякую за встановлення SponsorBlock." - }, - "helpPageReviewOptions": { - "message": "Будь ласка, ознайомтеся з налаштуваннями нижче" - }, - "helpPageFeatureDisclaimer": { - "message": "Багато функцій за замовчуванням відключені. Якщо ви хочете пропускати початкові і кінцеві заставки, використовувати Invidious, тощо, увімкніть їх нижче. Ви також можете приховати / показати елементи інтерфейсу." - }, - "helpPageHowSkippingWorks": { - "message": "Як працює пропуск" - }, - "helpPageHowSkippingWorks1": { - "message": "Сегменти відео будуть автоматично пропущені, якщо вони знаходяться в базі даних. Ви можете відкрити спливаюче вікно, натиснувши на значок розширення, щоб подивитися, які сегменти додані." - }, - "helpPageHowSkippingWorks2": { - "message": "Коли ви будете пропускати сегмент, ви отримаєте сповіщення. Якщо час здасться вам неправильним, проголосуйте проти, натиснувши на палець вниз! Ви також можете проголосувати у спливаючому вікні." - }, - "Submitting": { - "message": "Відправлення" - }, - "helpPageSubmitting1": { - "message": "Відправлення може бути виконана у спливаючому вікні натисканням на кнопку \"Сегмент починається звідси\" або кнопками в відеоплеєрі." - }, - "helpPageSubmitting2": { - "message": "Натискання на кнопку відтворення означає початок сегмента і натискання на кнопку стоп позначає його кінець. Ви можете позначити кілька сегментів перед тим, як натиснути на кнопку відправлення. Натискання на кошик видалить все." - }, - "Editing": { - "message": "Редагування" - }, - "helpPageEditing1": { - "message": "Якщо ви зробили щось не так, ви можете відредагувати або видалити сегменти, натиснувши на кнопку зі стрілкою вгору." - }, - "helpPageTooSlow": { - "message": "Це занадто повільно" - }, - "helpPageTooSlow1": { - "message": "Все це також можна робити за допомогою гарячих клавіш. Натисніть \"ж\" для вказівки початку/кінця сегмента, \"є\" для відправки. Клавіші можуть бути змінені в налаштуваннях. Якщо ви не використовуєте QWERTY, то варто відразу поміняти гарячі клавіші." - }, - "helpPageCopyOfDatabase": { - "message": "Чи можу я отримати копію бази даних? Що якщо ви пропадете?" - }, - "helpPageCopyOfDatabase1": { - "message": "База даних доступна для всіх тут:" - }, - "helpPageCopyOfDatabase2": { - "message": "Вихідний код у відкритому доступі, так що навіть якщо щось трапиться зі мною, ваш вклад не пропаде." - }, - "helpPageNews": { - "message": "Новини та як це зроблено" - }, - "helpPageSourceCode": { - "message": "Де можна отримати вихідний код?" - }, - "Credits": { - "message": "Автори" - }, - "LearnMore": { - "message": "Дізнатися більше" - }, - "FullDetails": { - "message": "Повна інформація" - }, - "CopyDownvoteButtonInfo": { - "message": "Голосує проти та створює локальну копію для повторного надсилання" - }, - "OpenCategoryWikiPage": { - "message": "Відкрити вікі-сторінку цієї категорії." - }, - "CopyAndDownvote": { - "message": "Скопіювати та проголосувати проти" - }, - "ContinueVoting": { - "message": "Продовжити голосування" - }, - "ChangeCategoryTooltip": { - "message": "Це миттєво буде застосовано до ваших сегментів" - }, - "downvote": { - "message": "Голос \"проти\"" - }, - "upvote": { - "message": "Голос \"за\"" - }, - "hideSegment": { - "message": "Приховати сегмент" - }, - "SponsorTimeEditScrollNewFeature": { - "message": "Навівши курсор на поле редагування, користуйтеся колесом прокрутки, щоб швидко відрегулювати час. Комбінації клавіш ctrl або shift можуть бути використані для точнішої настройки змін." - }, - "categoryPillNewFeature": { - "message": "Нове! Бачте, коли відео повністю спонсорське або є саморекламою" - }, - "dayAbbreviation": { - "message": "д", - "description": "100d" - }, - "hourAbbreviation": { - "message": "г", - "description": "100h" - }, - "optionsTabBehavior": { - "message": "Поведінка", - "description": "Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabInterface": { - "message": "Інтерфейс", - "description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabKeyBinds": { - "message": "Комбінації клавіш", - "description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabBackup": { - "message": "Резервування/Відновлення", - "description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabAdvanced": { - "message": "Різне", - "description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "noticeVisibilityLabel": { - "message": "Вигляд сповіщення про пропуск", - "description": "Option label" - }, - "unbind": { - "message": "Відв'язати", - "description": "Unbind keyboard shortcut" - }, - "notSet": { - "message": "Не задано" - }, - "change": { - "message": "Змінити" - }, - "youtubeKeybindWarning": { - "message": "Це вбудована комбінація YouTube. Ви впевнені що хочете її використовувати?" - }, - "betaServerWarning": { - "message": "BETA сервер увімкнено!" - }, - "openOptionsPage": { - "message": "Відкрити сторінку налаштувань" - }, - "resetToDefault": { - "message": "Повернутись до стандартних налаштувань" - }, - "confirmResetToDefault": { - "message": "Ви впевнені, що хочете скинути всі налаштування до значень за замовчуванням? Це не можна буде скасувати." - }, - "exportSegments": { - "message": "Експортувати сегменти" - }, - "Import": { - "message": "Імпорт", - "description": "Button to initiate importing segments. Appears under the textbox where they paste in the data" - }, - "redeemFailed": { - "message": "Ліцензійний ключ недійсний" - }, - "chooseACountry": { - "message": "Виберіть країну" - }, - "selectYourCountry": { - "message": "Виберіть вашу країну" - }, - "patreonSignIn": { - "message": "Вхід через Patreon" - }, - "joinOnPatreon": { - "message": "Підписатися на Patreon" - }, - "oneTimePurchase": { - "message": "Разова покупка" - }, - "enterLicenseKey": { - "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": "ID відео", - "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": "Поділитися посиланням" - } -} diff --git a/public/_locales/vi/messages.json b/public/_locales/vi/messages.json deleted file mode 100644 index c3ea3820..00000000 --- a/public/_locales/vi/messages.json +++ /dev/null @@ -1,1007 +0,0 @@ -{ - "fullName": { - "message": "SponsorBlock cho Youtube - Bỏ qua quảng cáo của nhà tài trợ", - "description": "Name of the extension." - }, - "Description": { - "message": "Bỏ qua quảng cáo của nhà tài trợ, đoạn nài nỉ đòi đăng ký và nhiều thứ tương tự trong các video trên Youtube. Báo cáo đoạn quảng cáo nhà tài trợ trong những video bạn xem để giúp người khác tiết kiệm thời gian.", - "description": "Description of the extension." - }, - "400": { - "message": "Máy chủ báo yêu cầu này không hợp lệ" - }, - "429": { - "message": "Bạn đã đăng quá nhiều đoạn quảng cáo tài trợ cho video này, bạn có chắc có nhiều đến thế không?" - }, - "409": { - "message": "Đoạn này đã được đăng rồi" - }, - "channelWhitelisted": { - "message": "Kênh đã được bỏ chặn!" - }, - "Segment": { - "message": "đoạn quảng cáo" - }, - "Segments": { - "message": "phân đoạn" - }, - "upvoteButtonInfo": { - "message": "Tán thành phân đoạn này" - }, - "reportButtonTitle": { - "message": "Báo cáo" - }, - "reportButtonInfo": { - "message": "Báo cáo đoạn này đăng sai." - }, - "Dismiss": { - "message": "Đóng" - }, - "Loading": { - "message": "Đang tải..." - }, - "Hide": { - "message": "Không hiển thị nữa" - }, - "hitGoBack": { - "message": "Ấn hủy bỏ qua để quay lại đoạn ban nãy." - }, - "unskip": { - "message": "Hủy bỏ qua" - }, - "reskip": { - "message": "Bỏ qua lại" - }, - "unmute": { - "message": "Bật tiếng" - }, - "paused": { - "message": "Tạm dừng" - }, - "manualPaused": { - "message": "Đã dừng bộ tính giờ" - }, - "confirmMSG": { - "message": "Để sửa hoặc xóa từng số riêng, hãy nhấn vào nút thông tin hoặc mở bảng popup tiện ích mở rộng bằng cách nhấn vào biểu tượng tiện ích mở rộng ở góc phía trên bên phải." - }, - "clearThis": { - "message": "Bạn có chắc chắn muốn xóa không?\n\n" - }, - "Unknown": { - "message": "Có lỗi xảy ra khi đăng đoạn quảng cáo tài trợ, xin vui lòng thử lại sau." - }, - "sponsorFound": { - "message": "Video này có đoạn quảng cáo trong kho dữ liệu rồi!" - }, - "sponsor404": { - "message": "Không tìm thấy phân đoạn nào" - }, - "sponsorStart": { - "message": "Đoạn quảng cáo bắt đầu vào lúc này" - }, - "sponsorEnd": { - "message": "Phân đoạn kết thúc vào lúc này" - }, - "sponsorCancel": { - "message": "Huỷ tạo phân đoạn" - }, - "noVideoID": { - "message": "Không tìm thấy video nào.\nNếu sai, hãy thử tải lại thẻ này." - }, - "refreshSegments": { - "message": "Làm mới segments" - }, - "success": { - "message": "Thành công!" - }, - "voted": { - "message": "Đã bầu chọn!" - }, - "serverDown": { - "message": "Có vẻ máy chủ đang không hoạt động. Hãy liên hệ nhà phát triển ngay lập tức." - }, - "connectionError": { - "message": "Đã xảy ra lỗi kết nối. Mã lỗi: " - }, - "clearTimes": { - "message": "Xóa các phân đoạn" - }, - "openPopup": { - "message": "Mở bảng popup của SponsorBlock" - }, - "closePopup": { - "message": "Đóng bảng popup" - }, - "SubmitTimes": { - "message": "Gửi phân đoạn" - }, - "submitCheck": { - "message": "Bạn có chắc chắn muốn gửi không?" - }, - "whitelistChannel": { - "message": "Đưa kênh vào danh sách không chặn" - }, - "removeFromWhitelist": { - "message": "Loại kênh khỏi danh sách không chặn" - }, - "voteOnTime": { - "message": "Bầu chọn một phân đoạn" - }, - "Submissions": { - "message": "Các phân đoạn" - }, - "savedPeopleFrom": { - "message": "Bạn đã giúp mọi người bỏ qua " - }, - "viewLeaderboard": { - "message": "Bảng xếp hạng" - }, - "recordTimesDescription": { - "message": "Gửi" - }, - "submissionEditHint": { - "message": "Phần chỉnh sửa sẽ xuất hiện sau khi bạn bấm gửi", - "description": "Appears in the popup to inform them that editing has been moved to the video player." - }, - "popupHint": { - "message": "Gợi ý: Bạn có thể thêm phím tắt để gửi trong phần tuỳ chọn" - }, - "clearTimesButton": { - "message": "Xóa thời gian" - }, - "submitTimesButton": { - "message": "Gửi thời gian" - }, - "publicStats": { - "message": "Tên này được dùng tại trang thông tin công khai để thể hiện lượng đóng góp của bạn. Xem" - }, - "Username": { - "message": "Tên người dùng" - }, - "setUsername": { - "message": "Đặt tên người dùng" - }, - "copyPublicID": { - "message": "Sao chép Public UserID" - }, - "copySegmentID": { - "message": "Sao chép ID phân đoạn" - }, - "discordAdvert": { - "message": "Hãy tham gia server Discord chính thức để đưa ra gợi ý và phản hồi!" - }, - "hideThis": { - "message": "Đóng lại" - }, - "Options": { - "message": "Tùy chọn" - }, - "showButtons": { - "message": "Hiển thị nút trên trình chạy video Youtube" - }, - "hideButtons": { - "message": "Không hiển thị nút trên trình chạy video Youtube" - }, - "hideButtonsDescription": { - "message": "Không hiển thị nút trên trình chạy video Youtube để đăng đoạn quảng cáo." - }, - "showSkipButton": { - "message": "Giữ nút bỏ qua Highlight trên trình phát player" - }, - "showInfoButton": { - "message": "Hiển thị nút thông tin trên trình chạy video Youtube" - }, - "hideInfoButton": { - "message": "Không hiển thị nút thông tin trên trình chạy video Youtube" - }, - "autoHideInfoButton": { - "message": "Tự động ẩn nút Info" - }, - "hideDeleteButton": { - "message": "Không hiển thị nút xóa trên trình chạy video Youtube" - }, - "showDeleteButton": { - "message": "Hiển thị nút xóa trên trình chạy video Youtube" - }, - "enableViewTracking": { - "message": "Bật tính năng theo dõi số quảng cáo được bỏ qua" - }, - "whatViewTracking": { - "message": "Tính năng này theo dõi những đoạn quảng cáo bạn đã bỏ qua để cho người dùng khác biết những đoạn họ đăng đã giúp người khác đến mức nào. Tính năng này, cùng với tính năng bầu chọn, còn được dùng làm thước đo để đảm bảo spam không lọt vào kho dữ liệu. Tiện ích mở rộng này gửi tín hiệu đến máy chủ mỗi lần bạn bỏ qua một đoạn quảng cáo. Mong là đa phần mọi người không thay đổi cài đặt này để thông số người xem được chính xác nhất. :)" - }, - "enableViewTrackingInPrivate": { - "message": "Bật việc theo dõi số lượng người bỏ qua phân đoạn trong tab Riêng tư/Ẩn danh" - }, - "enableTrackDownvotes": { - "message": "Lưu trữ phiếu phản đối phân đoạn" - }, - "whatTrackDownvotes": { - "message": "Bất kỳ phân đoạn nào bạn phản đối sẽ vẫn bị ẩn ngay cả sau khi làm mới" - }, - "trackDownvotesWarning": { - "message": "Cảnh báo: Tắt tính năng này sẽ xóa tất cả các phiếu phản đối đã lưu trữ trước đó" - }, - "enableQueryByHashPrefix": { - "message": "Truy vấn theo Hash Prefix" - }, - "whatQueryByHashPrefix": { - "message": "Thay vì yêu cầu phân đoạn từ máy chủ bằng cách sử dụng videoID, 4 ký tự đầu tiên của hash của videoID sẽ được gửi. Máy chủ sau đó sẽ gửi dữ liệu cho tất cả video với các hash tương tự." - }, - "enableRefetchWhenNotFound": { - "message": "Nạp lại các đoạn trên video mới" - }, - "whatRefetchWhenNotFound": { - "message": "Nếu đây là video mới và chưa có phân đoạn nào được xác định, SponsorBlock sẽ tiếp tục truy vấn dữ liệu mỗi vài phút trong khi bạn đang xem." - }, - "showNotice": { - "message": "Hiện thông báo lại" - }, - "showSkipNotice": { - "message": "Hiển thị thông báo sau khi bỏ qua phân đoạn" - }, - "showCategoryGuidelines": { - "message": "Hiển thị Danh mục Trợ giúp" - }, - "noticeVisibilityMode0": { - "message": "Thông báo bỏ qua với kích thước đầy đủ" - }, - "noticeVisibilityMode1": { - "message": "Thông báo bỏ qua kích thước nhỏ nếu phân đoạn được tự động bỏ qua" - }, - "noticeVisibilityMode2": { - "message": "Thông báo bỏ qua kích thước nhỏ cho toàn bộ phân đoạn" - }, - "noticeVisibilityMode3": { - "message": "Thông báo bỏ qua mờ nếu phân đoạn được tự động bỏ qua" - }, - "noticeVisibilityMode4": { - "message": "Thông báo bỏ qua mờ cho tất cả các phân đoạn" - }, - "longDescription": { - "message": "SponsorBlock giúp bạn bỏ qua quảng cáo từ nhà tài trợ, đoạn giới thiệu, đoạn kết, lời nhắc đăng ký kênh, và những phần khó chịu khác trong các video Youtube. SponsorBlock là một tiện ích mở rộng cho trình duyệt, cho phép tất cả người dùng đăng thời điểm bắt đầu và kết thúc của những đoạn quảng cáo từ nhà tài trợ và các đoạn khác trong video Youtube. Sau khi một người đăng thông tin này lên, tất cả mọi người dùng tiện ích mở rộng này sẽ bỏ qua đoạn quảng cáo đó. Bạn cũng có thể bỏ qua phần không có nhạc trong những video âm nhạc.", - "description": "Full description of the extension on the store pages." - }, - "website": { - "message": "Trang web", - "description": "Used on Firefox Store Page" - }, - "sourceCode": { - "message": "Mã nguồn", - "description": "Used on Firefox Store Page" - }, - "noticeUpdate": { - "message": "Thông báo đã được nâng cấp!", - "description": "The first line of the message displayed after the notice was upgraded." - }, - "noticeUpdate2": { - "message": "Nếu bạn vẫn không thích, hãy nhấn nút không hiển thị lại.", - "description": "The second line of the message displayed after the notice was upgraded." - }, - "setSkipShortcut": { - "message": "Bỏ qua phân đoạn", - "description": "Keybind label" - }, - "setStartSponsorShortcut": { - "message": "Bắt đầu/dừng phân đoạn", - "description": "Keybind label" - }, - "setSubmitKeybind": { - "message": "Gửi phân đoạn", - "description": "Keybind label" - }, - "keybindDescription": { - "message": "Chọn một phím bằng cách nhập nó và chọn bất kỳ phím bổ trợ nào bạn muốn sử dụng." - }, - "0": { - "message": "Kết nối quá hạn thời gian. Hãy kiểm tra đường truyền mạng của bạn. Nếu mạng của bạn vẫn hoạt động, có thể máy chủ đang bị quá tải hoặc không hoạt động." - }, - "disableSkipping": { - "message": "Bỏ qua được bật" - }, - "enableSkipping": { - "message": "Bỏ qua đã bị vô hiệu hoá" - }, - "yourWork": { - "message": "Thành quả của bạn", - "description": "Used to describe the section that will show you the statistics from your submissions." - }, - "502": { - "message": "Máy chủ có vẻ đang bị quá tải. Hãy thử lại sau vài giây nữa." - }, - "errorCode": { - "message": "Mã lỗi: " - }, - "skip": { - "message": "Bỏ qua" - }, - "mute": { - "message": "Ngắt tiếng" - }, - "full": { - "message": "Toàn bộ Video", - "description": "Used for the name of the option to label an entire video as sponsor or self promotion." - }, - "skip_category": { - "message": "Bỏ qua {0}?" - }, - "mute_category": { - "message": "Ngắt tiếng {0} chứ?" - }, - "skip_to_category": { - "message": "Bỏ qua đến {0}?", - "description": "Used for skipping to things (Skip to Highlight)" - }, - "skipped": { - "message": "{0} đã bỏ qua", - "description": "Example: Sponsor Skipped" - }, - "muted": { - "message": "{0} đã ngắt tiếng (Muted)", - "description": "Example: Sponsor Muted" - }, - "skipped_to_category": { - "message": "Đã bỏ qua đến {0}", - "description": "Used for skipping to things (Skipped to Highlight)" - }, - "disableAutoSkip": { - "message": "Tắt tự động bỏ qua" - }, - "enableAutoSkip": { - "message": "Bật tự động bỏ qua quảng cáo" - }, - "audioNotification": { - "message": "Thông báo bằng âm thanh khi bỏ qua" - }, - "audioNotificationDescription": { - "message": "Thông báo bằng âm thanh sẽ được bật khi bỏ qua quảng cáo. Nếu tắt tính năng này (hoặc tính năng tự động bỏ qua quảng cáo bị tắt), sẽ không có âm thanh kêu." - }, - "showTimeWithSkips": { - "message": "Hiển thị độ dài video khi lược bỏ quảng cáo" - }, - "showTimeWithSkipsDescription": { - "message": "Độ dài này được hiển thị trong ngoặc đơn, bên cạnh độ dài hiện tại, phía dưới thanh tiến trình video. Con số này là độ dài video trừ đi các đoạn quảng cáo, bao gồm cả những đoạn được đánh dấu là chỉ \"Hiển thị trong thanh tiến trình video\"." - }, - "youHaveSkipped": { - "message": "Bạn đã bỏ qua " - }, - "minLower": { - "message": "phút" - }, - "minsLower": { - "message": "phút" - }, - "hourLower": { - "message": "giờ" - }, - "hoursLower": { - "message": "giờ" - }, - "youHaveSavedTime": { - "message": "Bạn đã giúp người khác tiết kiệm được", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "youHaveSavedTimeEnd": { - "message": " của cuộc đời họ", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "statusReminder": { - "message": "Truy cập trang status.sponsor.ajay.app để biết tình trạng máy chủ." - }, - "whatChangeUserID": { - "message": "Đây là mã cần được giữ bí mật. Nó giống như mật khẩu và không nên được chia sẻ cho bất kì ai khác. Nếu có ai đó lấy được mã này, họ có thể mạo danh bạn. Còn nếu như bạn đang tìm khoá ID công khai, hãy nhấn vào nút \"Sao chép Public UserID\" trong popup của SponsorBlock." - }, - "createdBy": { - "message": "Được tạo bởi" - }, - "supportOtherSites": { - "message": "Hỗ trợ các trang web Youtube thuộc bên thứ 3" - }, - "supportOtherSitesDescription": { - "message": "Bật hỗ trợ các ứng dụng/trang web Youtube của bên thứ ba. Để bật hỗ trợ cho ứng dụng này, bạn phải chấp nhận các yêu cầu cho phép bổ sung. Nó KHÔNG CÓ tác dụng trong chế độ ẩn danh của Chrome và các trình duyệt có nền tảng Chromium.", - "description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube" - }, - "supportedSites": { - "message": "Các trang web được hỗ trợ: " - }, - "optionsInfo": { - "message": "Bật hỗ trợ cho Invidious, tắt tự động bỏ qua quảng cáo, không hiển thị nút, và nhiều tùy chọn khác." - }, - "addInvidiousInstance": { - "message": "Thêm Instance của ứng dụng bên thứ 3" - }, - "addInvidiousInstanceDescription": { - "message": "Thêm một instance. Chỉ có mỗi tên miền. Ví dụ: invidious.ajay.app" - }, - "add": { - "message": "Thêm vào" - }, - "addInvidiousInstanceError": { - "message": "Đây là tên miền không hợp lệ. Chỉ dùng RIÊNG phần tên miền thôi. Ví dụ: Invidious.ajay.app" - }, - "resetInvidiousInstance": { - "message": "Thiết lập lại danh sách phiên bản Invidious" - }, - "resetInvidiousInstanceAlert": { - "message": "Bạn đang sắp thiết lập lại danh sách phiên bản Invidious" - }, - "currentInstances": { - "message": "Các phiên bản hiện tại:" - }, - "minDuration": { - "message": "Độ dài tối thiểu (giây):" - }, - "minDurationDescription": { - "message": "Đoạn quảng cáo ngắn hơn giá trị được đặt sẽ không bị bỏ qua hoặc hiển thị trong trình chạy video." - }, - "skipNoticeDuration": { - "message": "Thời gian tự động đóng bảng thông báo phân đoạn (giây):" - }, - "skipNoticeDurationDescription": { - "message": "Đặt thời gian hiển thị bảng thông báo phân đoạn. Nếu như bạn tự nhấn nút bỏ qua, nó sẽ hiện lâu hơn 1 chút." - }, - "shortCheck": { - "message": "Đoạn quảng cáo sau ngắn hơn tùy chọn độ dài ngắn nhất của bạn. Điều này có thể có nghĩa là nó đã được đăng rồi, và không được bỏ qua vì tùy chọn này. Bạn có chắc muốn đăng nó không?" - }, - "liveOrPremiere": { - "message": "Không được phép gửi trên một buổi phát trực tiếp hoặc buổi ra mắt đang hoạt động. Vui lòng đợi cho đến khi kết thúc, sau đó làm mới trang và xác minh rằng các phân đoạn vẫn hợp lệ." - }, - "showUploadButton": { - "message": "Hiển thị nút tải lên" - }, - "customServerAddress": { - "message": "Địa chỉ máy chủ SponsorBlock" - }, - "customServerAddressDescription": { - "message": "Địa chỉ SponsorBlock dùng để liên hệ với máy chủ.\nTrừ khi bạn có máy chủ riêng, bạn không nên thay đổi mục này." - }, - "save": { - "message": "Lưu" - }, - "reset": { - "message": "Thiết lập lại" - }, - "customAddressError": { - "message": "Địa chỉ này sai hình thức. Hãy đảm bảo rằng địa chỉ có http:// hoặc https:// ở đầu và không có dấu gạch chéo ở cuối." - }, - "areYouSureReset": { - "message": "Bạn có chắc mình muốn thiết lập lại không?" - }, - "mobileUpdateInfo": { - "message": "m.youtube.com đã được hỗ trợ" - }, - "exportOptions": { - "message": "Nhập/xuất tất cả tùy chọn" - }, - "exportOptionsCopy": { - "message": "Chỉnh sửa/sao chép" - }, - "exportOptionsDownload": { - "message": "Lưu vào tệp" - }, - "exportOptionsUpload": { - "message": "Tải từ tệp" - }, - "setOptions": { - "message": "Đặt tùy chọn" - }, - "exportOptionsWarning": { - "message": "Cảnh báo: Việc thay đổi tùy chọn có tác dụng vĩnh viễn và có thể ảnh hưởng đến việc cài đặt. Bạn có chắc muốn thay đổi không? Hãy nhớ sao lưu lại tùy chọn cũ để đề phòng." - }, - "incorrectlyFormattedOptions": { - "message": "Tệp JSON này không được định dạng đúng cách. Tùy chọn của bạn chưa được thay đổi." - }, - "confirmNoticeTitle": { - "message": "Gửi phân đoạn" - }, - "submit": { - "message": "Gửi" - }, - "cancel": { - "message": "Huỷ" - }, - "delete": { - "message": "Xóa" - }, - "preview": { - "message": "Xem trước" - }, - "unsubmitted": { - "message": "Chưa gửi lên: " - }, - "inspect": { - "message": "Kiểm tra" - }, - "edit": { - "message": "Chỉnh sửa" - }, - "copyDebugInformation": { - "message": "Sao chép thông tin gỡ lỗi vào khay nhớ tạm" - }, - "copyDebugInformationFailed": { - "message": "Không sao chép được vào khay nhớ tạm" - }, - "copyDebugInformationOptions": { - "message": "Sao chép thông tin vào khay nhớ tạm để cung cấp cho nhà phát triển khi phát sinh lỗi / khi nhà phát triển yêu cầu. Thông tin nhạy cảm như ID người dùng của bạn, kênh trong danh sách không chặn, và địa chỉ máy chủ tuỳ chỉnh đã bị xoá. Tuy nhiên, nó có chứa thông tin như user agent, trình duyệt, hệ điều hành và phiên bản của tiện ích mở rộng. " - }, - "copyDebugInformationComplete": { - "message": "Thông tin gỡ lỗi đã được sao chép vào bộ nhớ tạm. Hãy thoải mái xóa thông tin mà bạn không muốn chia sẻ. Lưu thông tin này vào một tập tin văn bản hoặc dán nó vào bản báo cáo lỗi." - }, - "keyAlreadyUsed": { - "message": "Phím tắt này liên kết với một hành động khác. Vui lòng chọn một cái khác." - }, - "to": { - "message": "đến", - "description": "Used between segments. Example: 1:20 to 1:30" - }, - "generic_guideline2": { - "message": "Chơi như thể không có gì bị bỏ qua" - }, - "category_sponsor": { - "message": "Nhà tài trợ" - }, - "category_sponsor_description": { - "message": "Nội dung được trả tiền để quảng cáo, giới thiệu và quảng cáo trực tiếp. Không phải là quảng cáo không trả công hay được đề cập miễn phí." - }, - "category_sponsor_guideline1": { - "message": "Quảng cáo trả phí" - }, - "category_sponsor_guideline2": { - "message": "Không dành cho các khoản đóng góp" - }, - "category_selfpromo": { - "message": "Quảng cáo không trả công/Tự quảng cáo" - }, - "category_selfpromo_description": { - "message": "Tương tự như 'nhà tài trợ' ngoại trừ việc quảng cáo không được trả tiền hay tự quảng cáo. Điều này bao gồm các phần hàng hóa, đóng góp, hoặc thông tin về người mà họ hợp tác cùng." - }, - "category_selfpromo_guideline1": { - "message": "Quyên góp, tư cách thành viên và hàng hóa tùy chỉnh" - }, - "category_selfpromo_guideline2": { - "message": "Lời cảm ơn miễn phí không thêm vào video" - }, - "category_selfpromo_guideline3": { - "message": "Không dành cho các sản phẩm và hàng hóa do công ty thiết kế" - }, - "category_exclusive_access": { - "message": "Truy cập riêng" - }, - "category_exclusive_access_description": { - "message": "Chỉ để dán nhãn cho toàn bộ video. Được sử dụng khi video giới thiệu một sản phẩm, dịch vụ hoặc vị trí mà họ đã nhận được quyền truy cập miễn phí hoặc được trợ cấp." - }, - "category_exclusive_access_pill": { - "message": "Video này giới thiệu sản phẩm, dịch vụ hoặc vị trí mà họ đã nhận được quyền truy cập miễn phí hoặc được trợ cấp", - "description": "Short description for this category" - }, - "category_exclusive_access_guideline1": { - "message": "Toàn bộ video giới thiệu nội dung nào đó có quyền truy cập miễn phí hoặc được trợ cấp" - }, - "category_interaction": { - "message": "Nhắc tương tác (Đăng ký)" - }, - "category_interaction_description": { - "message": "Nhắc nhở người xem Thích, Đăng ký hoặc Theo dõi. Nếu nó dài hoặc là một cái gì cụ thể, nó nên là danh mục \"Tự quảng cáo\"." - }, - "category_interaction_guideline1": { - "message": "Lời nhắc ngắn gọn để thích, đăng ký hoặc theo dõi" - }, - "category_interaction_guideline2": { - "message": "Bao gồm lời nhắc gián tiếp để bình luận" - }, - "category_interaction_guideline3": { - "message": "Không dành cho quảng cáo chung, chỉ dành cho lời kêu gọi hành động" - }, - "category_interaction_short": { - "message": "Nhắc nhở tương tác" - }, - "category_intro": { - "message": "Tạm dừng/Giới thiệu" - }, - "category_intro_description": { - "message": "Khoảng thời gian mà không có nội dung thực sự. Nó có thể là đoạn nghỉ, khung hình tĩnh, hình động lặp lại. Không dùng lựa chọn này cho những cho những chuyển cảnh có chứa thông tin." - }, - "category_intro_short": { - "message": "Tạm ngừng" - }, - "category_intro_guideline1": { - "message": "Khoảng thời gian không thực sự chứa nội dung" - }, - "category_intro_guideline2": { - "message": "Không dành cho chuyển tiếp có chứa thông tin" - }, - "category_outro": { - "message": "Màn hình kết thúc/Danh đề" - }, - "category_outro_description": { - "message": "Credits hoặc khi thẻ màn hình kết thúc của YouTube xuất hiện. Không dùng với những đoạn có thông tin." - }, - "category_outro_guideline1": { - "message": "Không bao gồm nội dung, ngay cả khi thẻ kết thúc ở trên màn hình" - }, - "category_preview": { - "message": "Xem trước/Tóm tắt" - }, - "category_preview_guideline1": { - "message": "Các clip xuất hiện sau đó hoặc trong một video trong tương lai" - }, - "category_preview_guideline2": { - "message": "Tóm tắt video trước đó" - }, - "category_preview_guideline3": { - "message": "Không dành cho các phần thêm nội dung bổ sung" - }, - "category_filler": { - "message": "Cảnh phụ" - }, - "category_filler_short": { - "message": "Cảnh phụ" - }, - "category_filler_guideline3": { - "message": "Không dùng cho các cảnh cần thiết để hiểu chủ đề" - }, - "category_music_offtopic": { - "message": "Nhạc: Phần không nhạc" - }, - "category_music_offtopic_description": { - "message": "Chỉ sử dụng cho video âm nhạc. Điều này có nghĩa là các phân đoạn đó nằm trong 1 video âm nhạc chưa thuộc về một loại danh mục khác." - }, - "category_music_offtopic_short": { - "message": "Không có nhạc" - }, - "category_music_offtopic_guideline1": { - "message": "Phần không có trong bản phát hành chính thức" - }, - "category_music_offtopic_guideline2": { - "message": "Phần không nhạc trong một buổi biểu diễn trực tiếp" - }, - "category_poi_highlight": { - "message": "Điểm/Khoảnh khắc quan trọng" - }, - "category_poi_highlight_description": { - "message": "Phần của video mà hầu hết mọi người đang tìm kiếm. Tương tự với câu nói \"Video bắt đầu từ x\"." - }, - "category_poi_highlight_guideline1": { - "message": "Phần mà hầu hết mọi người đang tìm kiếm" - }, - "category_poi_highlight_guideline2": { - "message": "Có thể bỏ qua ngữ cảnh" - }, - "category_poi_highlight_guideline3": { - "message": "Có thể bỏ qua để đến tiêu đề hoặc hình thu nhỏ" - }, - "category_livestream_messages": { - "message": "Luồng phát trực tiếp: Đọc Quyên góp/Tin nhắn" - }, - "category_livestream_messages_short": { - "message": "Đọc tin nhắn" - }, - "autoSkip": { - "message": "Tự động bỏ qua quảng cáo" - }, - "manualSkip": { - "message": "Bỏ qua thủ công" - }, - "showOverlay": { - "message": "Hiện ở thanh xem trước" - }, - "disable": { - "message": "Tắt" - }, - "autoSkip_POI": { - "message": "Tự động bỏ qua" - }, - "manualSkip_POI": { - "message": "Hỏi khi video bắt đầu" - }, - "showOverlay_POI": { - "message": "Hiện ở thanh xem trước" - }, - "showOverlay_full": { - "message": "Hiển thị nhãn" - }, - "autoSkipOnMusicVideos": { - "message": "Tự động bỏ qua tất cả các phân đoạn nếu trong video có phân đoạn không phải nhạc" - }, - "muteSegments": { - "message": "Cho phép các phân đoạn bị tắt tiếng hay vì bỏ qua" - }, - "fullVideoSegments": { - "message": "Hiển thị biểu tượng khi video hoàn toàn là quảng cáo", - "description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo" - }, - "previewColor": { - "message": "Màu khi chưa được gửi đi", - "description": "Referring to submissions that have not been sent to the server yet." - }, - "seekBarColor": { - "message": "Màu của thanh tìm kiếm" - }, - "category": { - "message": "Thể loại" - }, - "skipOption": { - "message": "Tùy chọn Bỏ qua", - "description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)" - }, - "enableTestingServer": { - "message": "Kích hoạt Máy chủ Thử nghiệm" - }, - "whatEnableTestingServer": { - "message": "Những đóng góp của bạn sẽ KHÔNG ĐƯỢC TÍNH ở máy chủ chính. Chỉ dùng cho mục đích thử nghiệm." - }, - "testingServerWarning": { - "message": "Tất cả đóng góp hay bình chọn sẽ KHÔNG ĐƯỢC TÍNH ở máy chủ chính khi kết nối đến máy chủ thử nghiệm. Hãy vô hiệu hoá lựa chọn này nếu bạn muốn tiếp tục đóng góp." - }, - "bracketNow": { - "message": "(Bây giờ)" - }, - "moreCategories": { - "message": "Các danh mục khác" - }, - "chooseACategory": { - "message": "Chọn một danh mục" - }, - "enableThisCategoryFirst": { - "message": "Để gửi một phân đoạn với chủ đề \"{0}\", bạn cần phải kích hoạt nó trong phần tuỳ chọn. Bạn sẽ được đưa đến phần tuỳ chỉnh bây giờ.", - "description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options." - }, - "poiOnlyOneSegment": { - "message": "Cảnh báo: Loại phân đoạn này nếu hiển thị CHỈ CÓ 1 PHÂN ĐOẠN được xuất hiện trong video. Nếu bạn gửi lên, khi đó, phân đoạn xuất hiện duy nhất sẽ được lựa chọn ngẫu nhiên." - }, - "youMustSelectACategory": { - "message": "Bạn phải lựa chọn một danh mục cho tất cả phân đoạn bạn đang muốn đăng tải!" - }, - "bracketEnd": { - "message": "(Kết thúc)" - }, - "hiddenDueToDownvote": { - "message": "đã ẩn: hạ bình chọn" - }, - "hiddenDueToDuration": { - "message": "đã bị ẩn: quá ngắn" - }, - "manuallyHidden": { - "message": "ẩn thủ công" - }, - "channelDataNotFound": { - "description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.", - "message": "Không xác định được ID kênh. Nếu bạn đang xem video này trên 1 trang web thứ 3, hãy mở lại video này trên trang chủ Youtube rồi thử lại. Điều này cũng có thể do những thay đổi trong mã nguồn trang web YouTube, nếu bạn nghĩ vậy, hãy bình luận tại đây:" - }, - "acceptPermission": { - "message": "Cho phép truy cập" - }, - "permissionRequestSuccess": { - "message": "Đã có quyền truy cập!" - }, - "permissionRequestFailed": { - "message": "Truy cập bị từ chối, bạn đã nhấp vào từ chối à?" - }, - "adblockerIssueWhitelist": { - "message": "Nếu bạn không thể giải quyết được vấn đề này, hãy vô hiệu hoá cài đặt 'Bỏ qua video không công khai/riêng tư', vì SponsorBlock không thể lấy được thông tin của video này" - }, - "forceChannelCheck": { - "message": "Bắt buộc kiểm tra kênh trước khi bỏ qua" - }, - "whatForceChannelCheck": { - "message": "Theo mặc định, các phân đoạn đã xác định sẽ được bỏ qua ngay lập tức trước khi biết đây là kênh nào. Vì vậy, một số phân đoạn ở đầu video sẽ bị bỏ qua ngay lập tức cho dù bạn đã bỏ chặn kênh. Bật lựa chọn này sẽ ngăn chặn điều đó nhưng sẽ mất một chút thời gian hơn để bỏ qua do phải lấy ID của kênh. Độ trễ sẽ được cải thiện nếu bạn có kết nối mạng tốt." - }, - "forceChannelCheckPopup": { - "message": "Cân nhắc bật chế độ \"Bắt buộc kiểm tra kênh YouTube trước khi bỏ qua phân đoạn\"" - }, - "downvoteDescription": { - "message": "Chỉnh thời gian sai/không đúng" - }, - "incorrectCategory": { - "message": "Đổi danh mục" - }, - "nonMusicCategoryOnMusic": { - "message": "Video này đã được phân loại là âm nhạc. Bạn có chắc đây là quảng cáo nhà tài trợ không? Nếu đây là phân đoạn \"Không phải nhạc\", hãy mở Cài đặt tiện ích và bật lựa chọn đó. Rồi bạn có thể đăng tải phân đoạn lên dưới danh mục \"Không phải nhạc\" thay vì \"Quảng cáo nhà tài trợ\". Hãy đọc Hướng dẫn nếu bạn vẫn còn vướng mắc" - }, - "multipleSegments": { - "message": "Nhiều phân đoạn" - }, - "guidelines": { - "message": "Hướng dẫn" - }, - "readTheGuidelines": { - "message": "Hãy đọc hướng dẫn!!", - "description": "Show the first time they submit or if they are \"high risk\"" - }, - "categoryUpdate1": { - "message": "Danh mục ở đây!" - }, - "categoryUpdate2": { - "message": "Mở Tùy chọn để bỏ qua đoạn mở đầu, kết thúc, giới thiệu hàng hoá, v.v." - }, - "help": { - "message": "Trợ giúp" - }, - "GotIt": { - "message": "Đã hiểu", - "description": "Used as the button to dismiss a tooltip" - }, - "fullVideoTooltipWarning": { - "message": "Phân đoạn này là lớn. Nếu toàn bộ video nói về một chủ đề, hãy chuyển từ \"Bỏ qua\" thành \"Toàn bộ video\". Xem hướng dẫn để biết thêm thông tin." - }, - "categoryPillTitleText": { - "message": "Toàn bộ video này được gắn thẻ vào thể loại này và được tích hợp quá chặt chẽ để có thể tách ra" - }, - "experiementOptOut": { - "message": "Từ chối tham gia thử nghiệm trong tương lai", - "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": "Ẩn vĩnh viễn" - }, - "warningTitle": { - "message": "Bạn đã bị cảnh cáo" - }, - "questionButton": { - "message": "Tôi có một câu hỏi" - }, - "warningConfirmButton": { - "message": "Tôi hiểu lí do này" - }, - "Donate": { - "message": "Ủng hộ" - }, - "considerDonating": { - "message": "Hỗ trợ phát triển cấp quỹ" - }, - "hideDonationLink": { - "message": "Ẩn link donate" - }, - "darkModeOptionsPage": { - "message": "Chế độ tối trên trang tùy chọn" - }, - "helpPageThanksForInstalling": { - "message": "Cảm ơn bạn đã cài đặt SponsorBlock." - }, - "helpPageReviewOptions": { - "message": "Xin hãy xem xét các tuỳ chọn bên dưới" - }, - "helpPageFeatureDisclaimer": { - "message": "Nhiều tính năng sẽ bị tắt theo mặc định. Nếu bạn muốn bỏ qua phần intro, sử dụng trên các trang web bên thứ 3 như Invidious, v. v...., bạn có thể bật nó ở bên dưới. Bạn cũng có thể cho hiện/ẩn UI người dùng." - }, - "helpPageHowSkippingWorks": { - "message": "Việc bỏ qua 1 đoạn trong video được thực hiện thế nào?" - }, - "helpPageHowSkippingWorks1": { - "message": "Các phân đoạn trong video sẽ tự động bị bỏ qua nếu chúng được tìm thấy trong cơ sở dữ liệu của chúng tôi. Bạn có thể mở cửa sổ xem trước các phân đoạn ấy bằng cách nhấp vào biểu tượng tiện ích mở rộng." - }, - "helpPageHowSkippingWorks2": { - "message": "Bất cứ khi nào bỏ qua một phân đoạn, bạn sẽ nhận được 1 cửa sổ thông báo bât. Nếu phân đoạn có vẻ sai, hãy bỏ phiếu bằng cách nhấp vào nút downvote! Bạn cũng có thể bỏ phiếu trong cửa sổ bật lên khi nhấn vào biểu tượng tiện ích mở rộng. Và bạn có thể tắt việc hiển thị bảng thông báo này trong phần cài đặt tiện ích." - }, - "Submitting": { - "message": "Đang gửi lên" - }, - "helpPageSubmitting1": { - "message": "Việc gửi một phân đoạn mới có thể được thực hiện trong cửa sổ bật lên bằng cách nhấn vào nút \"Đoạn quảng cáo bắt đầu vào lúc này\" hoặc trong trình phát video bằng các nút trên thanh trình phát." - }, - "helpPageSubmitting2": { - "message": "Bạn nhấp 1 lần vào nút \"Đoạn quảng cáo bắt đầu vào lúc này\" để bắt đầu 1 phân đoạn, nhấn 2 lần để đánh dấu kết thúc phân đoạn đó. Bạn có thể chuẩn bị nhiều phân đoạn trước khi nhấn gửi. Nhấp vào nút \"Đăng đoạn quảng cáo\" sẽ gửi. Nhấp vào nút \"Xoá đoạn quảng cáo\" để xóa." - }, - "Editing": { - "message": "Chỉnh sửa" - }, - "helpPageEditing1": { - "message": "Nếu bạn muốn chỉnh sửa thời gian phân đoạn hoặc kiểu của phân đoạn, bạn có thể chỉnh sửa hoặc xóa các phân đoạn của mình sau khi nhấp vào nút \"Đăng đoạn quảng cáo\"." - }, - "helpPageTooSlow": { - "message": "Nếu như bạn cảm thấy thao tác ở trên quá chậm..." - }, - "helpPageTooSlow1": { - "message": "Bạn có thể sử dụng các hotkeys - phím nóng. Nhấn phím dấu chấm phẩy (;) để chỉ ra điểm bắt đầu / kết thúc của phân đoạn nhà tài trợ và nhấp vào dấu nháy đơn (') để gửi. Nếu bạn không sử dụng QWERTY, có lẽ bạn nên thay đổi keybinding bằng cách vào phần cài đặt của tiện ích." - }, - "helpPageCopyOfDatabase": { - "message": "Tôi có thể lấy bản sao của database không? Điều gì xảy ra nếu có chuyện tệ (server chết, chủ nhân trang web mất, ...)?" - }, - "helpPageCopyOfDatabase1": { - "message": "Database được công khai và luôn có sẵn tại " - }, - "helpPageCopyOfDatabase2": { - "message": "Mã nguồn mở cũng luôn có sẵn. Vì vậy, ngay cả khi có điều gì đó tệ, các phân đoạn cũng sẽ không biến mất." - }, - "helpPageNews": { - "message": "Tôi có thể cập nhật tin tức ở đâu?" - }, - "helpPageSourceCode": { - "message": "Bạn có thể tìm thấy source code ở đâu?" - }, - "Credits": { - "message": "Lời cảm ơn đến" - }, - "LearnMore": { - "message": "Tìm hiểu thêm" - }, - "FullDetails": { - "message": "Xem toàn bộ đầy đủ thông tin" - }, - "CopyDownvoteButtonInfo": { - "message": "Hạ bình chọn và tạo một bản sao cục bộ cho bạn gửi lại" - }, - "OpenCategoryWikiPage": { - "message": "Mở trang wiki của danh mục này để tìm hiểu thêm." - }, - "CopyAndDownvote": { - "message": "Sao chép và hạ bình chọn" - }, - "ContinueVoting": { - "message": "Tiếp tục bỏ phiếu" - }, - "ChangeCategoryTooltip": { - "message": "Điều này sẽ ngay lập tức áp dụng cho phân đoạn của bạn" - }, - "downvote": { - "message": "Phản đối" - }, - "upvote": { - "message": "Bình chọn" - }, - "hideSegment": { - "message": "Ẩn phân đoạn" - }, - "SponsorTimeEditScrollNewFeature": { - "message": "Sử dụng con lăn chuột của bạn khi di chuột qua hộp chỉnh sửa để nhanh chóng điều chỉnh thời gian. Kết hợp phím ctrl hoặc shift có thể được sử dụng để tinh chỉnh các thay đổi." - }, - "categoryPillNewFeature": { - "message": "Mới! Xem khi nào video được tài trợ hoàn toàn hoặc tự quảng bá" - }, - "dayAbbreviation": { - "message": "d", - "description": "100d" - }, - "hourAbbreviation": { - "message": "h", - "description": "100h" - }, - "optionsTabBehavior": { - "message": "Hành vi", - "description": "Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabInterface": { - "message": "Giao diện", - "description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabKeyBinds": { - "message": "Phím tắt bàn phím", - "description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabBackup": { - "message": "Sao lưu/Khôi phục", - "description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabAdvanced": { - "message": "Điều khoản khác", - "description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "noticeVisibilityLabel": { - "message": "Bỏ qua thông báo xuất hiện", - "description": "Option label" - }, - "unbind": { - "message": "Gỡ liên kết", - "description": "Unbind keyboard shortcut" - }, - "notSet": { - "message": "Chưa thiết lập" - }, - "change": { - "message": "Thay đổi" - }, - "youtubeKeybindWarning": { - "message": "Đây là lối tắt YouTube được tích hợp sẵn. Bạn có chắc chắn muốn sử dụng nó không?" - }, - "betaServerWarning": { - "message": "Máy chủ THỬ NGHIỆM đã được kích hoạt!" - }, - "openOptionsPage": { - "message": "Mở trang tùy chọn" - }, - "resetToDefault": { - "message": "Thiết lập lại cài đặt gốc" - }, - "confirmResetToDefault": { - "message": "Bạn chắc chắn muốn đặt lại cài đặt về mặc định? Điều này sẽ không thể hoàn tác được." - } -} diff --git a/public/_locales/zh_CN/messages.json b/public/_locales/zh_CN/messages.json deleted file mode 100644 index 040a4b41..00000000 --- a/public/_locales/zh_CN/messages.json +++ /dev/null @@ -1,620 +0,0 @@ -{ - "fullName": { - "message": "SponsorBlock for 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": "片段" - }, - "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": "关闭图标" - }, - "SubmitTimes": { - "message": "提交片段" - }, - "submitCheck": { - "message": "您确定要提交它吗?" - }, - "whitelistChannel": { - "message": "将频道列入白名单" - }, - "removeFromWhitelist": { - "message": "将频道移出白名单" - }, - "voteOnTime": { - "message": "对片段投票" - }, - "Submissions": { - "message": "提交数" - }, - "savedPeopleFrom": { - "message": "您为大家节省了 " - }, - "viewLeaderboard": { - "message": "排行榜" - }, - "recordTimesDescription": { - "message": "提交" - }, - "submissionEditHint": { - "message": "片段编辑将在您单击提交后显示", - "description": "Appears in the popup to inform them that editing has been moved to the video player." - }, - "popupHint": { - "message": "提示:您可以在选项中为提交动作绑定按键" - }, - "clearTimesButton": { - "message": "清除时间" - }, - "submitTimesButton": { - "message": "提交时间" - }, - "publicStats": { - "message": "这被用于在公开统计页面上展示您的贡献。查看它" - }, - "Username": { - "message": "用户名" - }, - "setUsername": { - "message": "设定用户名" - }, - "copySegmentID": { - "message": "复制片段 ID" - }, - "discordAdvert": { - "message": "快加入官方 Discord 服务器来提供建议与反馈!" - }, - "hideThis": { - "message": "隐藏它" - }, - "Options": { - "message": "选项" - }, - "showButtons": { - "message": "在 Youtube 播放器上显示按钮" - }, - "hideButtons": { - "message": "在 Youtube 播放器上隐藏按钮" - }, - "hideButtonsDescription": { - "message": "这将隐藏在 YouTube 播放器上提交赞助商广告的按钮。我了解这个东西打扰到了某些人。除了使用那个按钮,这个弹窗也可以用来提交赞助商广告。 要隐藏出现的通知,请使用通知中显示的写着 ”不再显示“ 的按钮。您可以在以后再次启用这些设置。" - }, - "showInfoButton": { - "message": "在 Youtube 播放器上显示信息按钮" - }, - "hideInfoButton": { - "message": "在 Youtube 播放器上隐藏信息按钮" - }, - "autoHideInfoButton": { - "message": "自动隐藏信息按钮" - }, - "hideDeleteButton": { - "message": "在 Youtube 播放器上隐藏删除按钮" - }, - "showDeleteButton": { - "message": "在 Youtube 播放器上显示删除按钮" - }, - "enableViewTracking": { - "message": "启用跳过次数统计跟踪" - }, - "whatViewTracking": { - "message": "此功能追踪您跳过了哪些片段,以让用户知道他们提交的信息帮助了多少人,并与点赞一同作为依据,来确保垃圾信息不会进入数据库。在您每次跳过片段时,此扩展都会向服务器发送一条消息。希望大部分人不要改变此设置,以使观看数字准确。:)" - }, - "enableQueryByHashPrefix": { - "message": "按哈希前缀查询" - }, - "whatQueryByHashPrefix": { - "message": "使用视频 ID 哈希值的前 4 个字符而非整个视频 ID 向服务器查询片段。服务器将返回所有具有类似哈希值的视频数据。" - }, - "enableRefetchWhenNotFound": { - "message": "在新视频中再次获取片段" - }, - "whatRefetchWhenNotFound": { - "message": "如果视频是新的且没有发现可跳片段,将在您观看时每隔几分钟再次获取信息。" - }, - "showNotice": { - "message": "重新显示通知" - }, - "showSkipNotice": { - "message": "在跳过片段后显示通知" - }, - "longDescription": { - "message": "SponsorBlock 可帮您跳过 YouTube 视频中的赞助商广告、开场、结尾、订阅提醒和其他烦人片段。SponsorBlock 是一个众包的浏览器扩展,可以让任何人提交 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": "跳过" - }, - "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}?" - }, - "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": "创建者" - }, - "supportOtherSites": { - "message": "支持第三方 YouTube 网站" - }, - "supportedSites": { - "message": "支持的站点: " - }, - "optionsInfo": { - "message": "启用 Invidious 支持,禁用自动跳过,隐藏按钮等等。" - }, - "add": { - "message": "添加" - }, - "addInvidiousInstanceError": { - "message": "这是一个无效的域名。它应该只包括域名部分。例如:invidious.ajay.app" - }, - "resetInvidiousInstance": { - "message": "重置 Invidious 实例列表" - }, - "resetInvidiousInstanceAlert": { - "message": "您将会重置 Invidious 实例列表" - }, - "currentInstances": { - "message": "当前实例:" - }, - "minDuration": { - "message": "最小持续时间(秒):" - }, - "minDurationDescription": { - "message": "短于设定值的片段将不会被跳过或显示在播放器中。" - }, - "shortCheck": { - "message": "以下的提交短于您的最小持续时间选项。这代表它们可能已经被提交,只是由于该选项被忽略了。您确定要提交吗?" - }, - "showUploadButton": { - "message": "显示上传按钮" - }, - "customServerAddress": { - "message": "SponsorBlock 服务器地址" - }, - "customServerAddressDescription": { - "message": "SponsorBlock 用于联系服务器的地址。\n除非您有自己的服务器实例,否则这不应该更改。" - }, - "save": { - "message": "保存" - }, - "reset": { - "message": "重置" - }, - "customAddressError": { - "message": "此地址格式不正确。请确保开头有 http:// 或 https:// ,结尾没有斜杠 / 。" - }, - "areYouSureReset": { - "message": "您确定要重置它吗?" - }, - "mobileUpdateInfo": { - "message": "现已支持 m.youtube.com" - }, - "exportOptions": { - "message": "导入/导出所有选项" - }, - "exportOptionsCopy": { - "message": "编辑/复制" - }, - "exportOptionsDownload": { - "message": "保存到文件" - }, - "exportOptionsUpload": { - "message": "从文件加载" - }, - "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": "复制信息到剪贴板,在提交错误或开发者需要时提供给他。 敏感信息如:您的用户ID,白名单频道和自定义服务器地址等已被删除。然而,它仍然包含诸如您的 useragent ,浏览器,操作系统和扩展版本号等信息。 " - }, - "copyDebugInformationComplete": { - "message": "调试信息已复制到剪切板中。 您可以随意移除任何您不想分享的信息。请将其另存为 .txt 文件或粘贴到错误报告中。" - }, - "keyAlreadyUsed": { - "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_sponsor_description": { - "message": "付费推广、付费推荐和直接广告。不应用于自我推广或免费提及、推荐他们喜欢的事物/创作者/网站/产品。" - }, - "category_sponsor_guideline1": { - "message": "付费推广" - }, - "category_sponsor_guideline2": { - "message": "捐赠或自制周边不属于此项" - }, - "category_selfpromo": { - "message": "未收钱的/自我推销" - }, - "category_selfpromo_description": { - "message": "类似于 “赞助商广告” ,但为无报酬或自我推广。包括有关商品、捐赠的部分或合作者的信息。" - }, - "category_selfpromo_guideline1": { - "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": "启用 Beta 测试服务器" - }, - "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": "隐藏:过短" - }, - "acceptPermission": { - "message": "接受权限" - }, - "permissionRequestSuccess": { - "message": "权限请求成功!" - }, - "forceChannelCheck": { - "message": "跳过前强制进行频道检查" - }, - "whatForceChannelCheck": { - "message": "默认情况下,即使还未检测出当前是什么频道,也会立即跳过片段。即使在白名单中的频道,一些在开头的片段也可能被跳过。启用此选项将防止这种情况,但所有的跳过将会产生轻微的延迟,因为获取频道 ID 需要一点时间。如果您的网速很快,那延迟可能非常短。" - }, - "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": "打开选项,跳过开头,结尾,商业等。" - }, - "help": { - "message": "帮助" - } -} diff --git a/public/_locales/zh_TW/messages.json b/public/_locales/zh_TW/messages.json deleted file mode 100644 index 67870d2a..00000000 --- a/public/_locales/zh_TW/messages.json +++ /dev/null @@ -1,1200 +0,0 @@ -{ - "fullName": { - "message": "SponsorBlock for 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": "片段" - }, - "Chapters": { - "message": "章節" - }, - "renderAsChapters": { - "message": "以章節渲染片段", - "description": "Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system" - }, - "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": "關閉彈出視窗" - }, - "SubmitTimes": { - "message": "提交分段" - }, - "sortSegments": { - "message": "排序片段" - }, - "submitCheck": { - "message": "您確定要提交這個嗎?" - }, - "whitelistChannel": { - "message": "將頻道列入白名單" - }, - "removeFromWhitelist": { - "message": "將頻道從白名單移除" - }, - "voteOnTime": { - "message": "為分段投票" - }, - "Submissions": { - "message": "提交數" - }, - "savedPeopleFrom": { - "message": "您已為大家節省 " - }, - "viewLeaderboard": { - "message": "排行榜" - }, - "recordTimesDescription": { - "message": "提交" - }, - "submissionEditHint": { - "message": "段落編輯會在您提交之後出現", - "description": "Appears in the popup to inform them that editing has been moved to the video player." - }, - "popupHint": { - "message": "小提醒:您可以為提交在設定裡綁定一個按鍵" - }, - "clearTimesButton": { - "message": "清除時間" - }, - "submitTimesButton": { - "message": "提交時間" - }, - "publicStats": { - "message": "這會被公開的統計頁面來展示您的貢獻。查看它" - }, - "Username": { - "message": "使用者名稱" - }, - "setUsername": { - "message": "設定使用者名稱" - }, - "copyPublicID": { - "message": "複製公開使用者ID" - }, - "copySegmentID": { - "message": "複製片段 ID" - }, - "discordAdvert": { - "message": "快加入官方 Discord 伺服器來給予建議和反應!" - }, - "hideThis": { - "message": "隱藏這" - }, - "Options": { - "message": "選項" - }, - "showButtons": { - "message": "在 YouTube 播放器上顯示按鈕" - }, - "hideButtons": { - "message": "在 YouTube 播放器上隱藏按鈕" - }, - "hideButtonsDescription": { - "message": "這會隱藏 YouTube 播放器上提交片段的按鈕" - }, - "showSkipButton": { - "message": "在播放器保留跳至精華按鈕" - }, - "showInfoButton": { - "message": "在 YouTube 播放器上顯示資訊按鈕" - }, - "hideInfoButton": { - "message": "在 YouTube 播放器上隱藏資訊按鈕" - }, - "autoHideInfoButton": { - "message": "自動隱藏資訊按鈕" - }, - "hideDeleteButton": { - "message": "在 YouTube 播放器上隱藏刪除按鈕" - }, - "showDeleteButton": { - "message": "在 YouTube 播放器上顯示刪除按鈕" - }, - "enableViewTracking": { - "message": "啟用跳過次數追蹤" - }, - "whatViewTracking": { - "message": "這個功能會追蹤您跳過的片段來讓其他使用者知道您的提交幫助了其他人多少,並同時用作計算錯誤提交的方式。這個擴充功能會在您每一次跳過片段時向伺服器回報。希望大家盡量不要改變這個設定來確保資料的正確性。 :)" - }, - "enableViewTrackingInPrivate": { - "message": "在私人/無痕分頁啟用跳過次數追蹤" - }, - "enableTrackDownvotes": { - "message": "儲存片段倒讚" - }, - "whatTrackDownvotes": { - "message": "所有你按倒讚的片段在重新整理後仍會保留" - }, - "trackDownvotesWarning": { - "message": "警告: 停用此項將全數刪除先前儲存的倒讚" - }, - "enableQueryByHashPrefix": { - "message": "使用雜湊前綴查詢" - }, - "whatQueryByHashPrefix": { - "message": "與其使用影片 ID 來查詢片段,這會使用影片 ID 的雜湊前4碼來查詢。伺服器會送回所有有類似雜湊的影片片段資料" - }, - "enableRefetchWhenNotFound": { - "message": "在新影片重新擷取片段" - }, - "whatRefetchWhenNotFound": { - "message": "如果這部影片是新的,而且目前沒有找到片段的話,系統會每分鐘重新擷取一次" - }, - "showNotice": { - "message": "再次顯示通知" - }, - "showSkipNotice": { - "message": "在跳過片段後顯示通知" - }, - "showCategoryGuidelines": { - "message": "顯示分類說明" - }, - "noticeVisibilityMode0": { - "message": "完整大小的略過提醒" - }, - "noticeVisibilityMode1": { - "message": "較小大小的自動略過提醒" - }, - "noticeVisibilityMode2": { - "message": "所有大小為小的略過提醒" - }, - "noticeVisibilityMode3": { - "message": "消逝的自動跳過提醒" - }, - "noticeVisibilityMode4": { - "message": "所有消逝的略過提醒" - }, - "longDescription": { - "message": "SponsorBlock 讓您可以跳過贊助工商,開場動畫,結束動畫,訂閱提醒等煩人的 YouTube 影片片段。SponsorBlock 是個大眾外包的網頁瀏覽器擴充功能,能讓任何人提交贊助片段的始與末。當一個人提交這個片段後,所有使用這個擴充功能的人都可以跳過該片段。您也可以跳過在音樂中的非音樂片段", - "description": "Full description of the extension on the store pages." - }, - "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" - }, - "nextChapterKeybind": { - "message": "下一章節", - "description": "Keybind label" - }, - "previousChapterKeybind": { - "message": "上一章節", - "description": "Keybind label" - }, - "keybindDescription": { - "message": "按下按鍵以選擇並選擇想要使用的修飾鍵" - }, - "0": { - "message": "連線超時。請檢查您的網路連線。若您的網路運作正常,則可能是伺服器超載或離線" - }, - "disableSkipping": { - "message": "跳過已啟用" - }, - "enableSkipping": { - "message": "跳過已停用" - }, - "yourWork": { - "message": "您的成果", - "description": "Used to describe the section that will show you the statistics from your submissions." - }, - "502": { - "message": "伺服器可能超載。請稍後嘗試" - }, - "errorCode": { - "message": "錯誤代碼: " - }, - "skip": { - "message": "略過" - }, - "mute": { - "message": "靜音" - }, - "full": { - "message": "整部影片", - "description": "Used for the name of the option to label an entire video as sponsor or self promotion." - }, - "skip_category": { - "message": "跳過 {0}?" - }, - "mute_category": { - "message": "要靜音 {0} 嗎?" - }, - "skip_to_category": { - "message": "跳到 {0}?", - "description": "Used for skipping to things (Skip to Highlight)" - }, - "skipped": { - "message": "{0} 已略過", - "description": "Example: Sponsor Skipped" - }, - "muted": { - "message": "{0} 已靜音", - "description": "Example: Sponsor Muted" - }, - "skipped_to_category": { - "message": "已跳到 {0}", - "description": "Used for skipping to things (Skipped to Highlight)" - }, - "disableAutoSkip": { - "message": "停用自動跳過" - }, - "enableAutoSkip": { - "message": "啟用自動跳過" - }, - "audioNotification": { - "message": "跳過時發出聲響" - }, - "audioNotificationDescription": { - "message": "跳過時發出聲響會在跳過片段時播放聲音。當停用後(或自動跳過被停用)將不會發出聲響" - }, - "showTimeWithSkips": { - "message": "顯示已移除跳過後的總時間" - }, - "showTimeWithSkipsDescription": { - "message": "這個時間會出現在現在時間旁邊的括號內。這會顯示總影片長度減掉任何片段後的結果。這只會包含標為\"在時間條中顯示\"的片段" - }, - "youHaveSkipped": { - "message": "您已跳過 " - }, - "minLower": { - "message": "分鐘" - }, - "minsLower": { - "message": "分鐘" - }, - "hourLower": { - "message": "小時" - }, - "hoursLower": { - "message": "小時" - }, - "youHaveSavedTime": { - "message": "您已為大家節省", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "youHaveSavedTimeEnd": { - "message": " 的生命。", - "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." - }, - "statusReminder": { - "message": "在 status.sponsor.ajay.app 檢查伺服器狀態" - }, - "whatChangeUserID": { - "message": "密鑰應被保密。它就像是密碼,不應與他人分享。若密鑰落入他人手中,他人將可以冒充你。若你在尋找你的公開使用者ID,點擊彈出視窗上的剪貼簿圖示" - }, - "createdBy": { - "message": "作者" - }, - "supportOtherSites": { - "message": "支援第三方的 YouTube 網站" - }, - "supportOtherSitesDescription": { - "message": "支援第三方的 YouTube 客戶端。若要啟用,您必須同意額外的權限。這在 Chrome 中的無痕模式和其他 Chromium 分支無效。", - "description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube" - }, - "supportedSites": { - "message": "支援的網站:" - }, - "optionsInfo": { - "message": "啟用 Invidious 支援,停用自動跳過、隱藏按鈕等。" - }, - "addInvidiousInstance": { - "message": "新增第三方的客戶端實例" - }, - "addInvidiousInstanceDescription": { - "message": "添加一個自定進程。它必須只有域名。例如:invidious.ajay.app" - }, - "add": { - "message": "新增" - }, - "addInvidiousInstanceError": { - "message": "這是個無效的域名。它只應該包含域名部分。例如:invidious.ajay.app" - }, - "resetInvidiousInstance": { - "message": "重製 Invidious 進程列表" - }, - "resetInvidiousInstanceAlert": { - "message": "您即將重製 Invidious 進程列表" - }, - "currentInstances": { - "message": "目前進程:" - }, - "minDuration": { - "message": "最小時間 (秒):" - }, - "minDurationDescription": { - "message": "小於設定值的片段不會被跳過或在播放器中顯示" - }, - "enableManualSkipOnFullVideo": { - "message": "當完整影片標籤存在時使用手動跳過" - }, - "whatManualSkipOnFullVideo": { - "message": "給在一部都是贊助或都是自我推廣的影片中,想要享受不間斷觀看體驗的人使用。" - }, - "skipNoticeDuration": { - "message": "跳過通知持續顯示時間(秒):" - }, - "skipNoticeDurationDescription": { - "message": "跳過片段提示的顯示時間將會以上列時間長度為準(單位:秒);手動跳過的時候會顯示較長於上面的時間" - }, - "shortCheck": { - "message": "以下的提交小於您的最小時間設定。這表是它們可能已經被提交,只是被該設定忽略了。您確定要提交嗎?" - }, - "liveOrPremiere": { - "message": "在進行中的直播或首播提交片段是不被允許的。請等到該直播完成後,重新整理頁面再重新確認片段並提交。" - }, - "showUploadButton": { - "message": "顯示上傳按鈕" - }, - "customServerAddress": { - "message": "SponsorBlock 伺服器地址" - }, - "customServerAddressDescription": { - "message": "SponsorBlock 用來與伺服器互動的地址。\n除非您有自己的伺服器進程,否則這項設定不應該被更動" - }, - "save": { - "message": "儲存" - }, - "reset": { - "message": "重置" - }, - "customAddressError": { - "message": "這個地址不正確。確定您在開始處有 http:// 或 https:// 且沒有尾部反斜杠" - }, - "areYouSureReset": { - "message": "您確定要重製這個嗎?" - }, - "mobileUpdateInfo": { - "message": "現已支援 m.youtube.com" - }, - "exportOptions": { - "message": "匯入/匯出所有設定" - }, - "exportOptionsCopy": { - "message": "編輯/複製" - }, - "exportOptionsDownload": { - "message": "儲存到檔案" - }, - "exportOptionsUpload": { - "message": "從檔案載入" - }, - "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": "複製資訊到剪貼板,在提交錯誤或開發者需要時提供給他。敏感資訊例如:您的使用者 ID,白名單頻道和自定伺服器地址等已被移除。但是,它仍然包含例如您的 useragent ,瀏覽器,作業系統和擴充版本等資訊。 " - }, - "copyDebugInformationComplete": { - "message": "除錯資訊已複製到剪貼板中。您可以任意移除任何您不想分享的資訊。請將其另存為文字文件或貼到錯誤報告中。" - }, - "keyAlreadyUsed": { - "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!'" - }, - "generic_guideline1": { - "message": "包含轉場" - }, - "generic_guideline2": { - "message": "如同沒有略過任何片段般播放" - }, - "category_sponsor": { - "message": "贊助廣告" - }, - "category_sponsor_description": { - "message": "有收錢的工商廣告和直接廣告。不是為了自我推銷或為了其他創作的免費推銷" - }, - "category_sponsor_guideline1": { - "message": "付費促銷" - }, - "category_sponsor_guideline2": { - "message": "並非捐款或客製週邊商品" - }, - "category_selfpromo": { - "message": "非付費/自我推廣" - }, - "category_selfpromo_description": { - "message": "類似 “贊助商廣告” ,但是非付費或自我推廣。這包括有關商品、捐贈或與他人合作的信息。" - }, - "category_selfpromo_guideline1": { - "message": "贊助、會員或客製週邊商品" - }, - "category_selfpromo_guideline2": { - "message": "與影片無關之免費的推廣" - }, - "category_selfpromo_guideline3": { - "message": "不是企業設計的商品和週邊商品" - }, - "category_exclusive_access": { - "message": "獨家限定" - }, - "category_exclusive_access_description": { - "message": "只限於標記整部影片,用於影片在獲得特殊或免費存取後,展示產品、服務或位置時使用。" - }, - "category_exclusive_access_pill": { - "message": "此影片展示了獲得特殊或免費存取的產品、服務或位置", - "description": "Short description for this category" - }, - "category_exclusive_access_guideline1": { - "message": "整部影片在展示收到的免費或付費存取權" - }, - "category_interaction": { - "message": "互動提醒 (訂閱)" - }, - "category_interaction_description": { - "message": "當有短提醒來請觀眾按讚、訂閱或跟隨他們時。如果該片段很長或很針對某事,它應該歸類為自我推銷。" - }, - "category_interaction_guideline1": { - "message": "要求點讚、訂閱或跟隨的短暫提醒" - }, - "category_interaction_guideline2": { - "message": "包含要求評論的非直接提醒" - }, - "category_interaction_guideline3": { - "message": "並非一般促銷、只限於要求進行某動作" - }, - "category_interaction_short": { - "message": "互動提醒" - }, - "category_intro": { - "message": "中場休息/開頭動畫" - }, - "category_intro_description": { - "message": "沒有實際內容的片段。可以是個靜止的幀,重複性動畫。這不應該是含有資訊的。" - }, - "category_intro_short": { - "message": "開場" - }, - "category_intro_guideline1": { - "message": "無實際內容的片段" - }, - "category_intro_guideline2": { - "message": "不是含有資訊的轉場" - }, - "category_outro": { - "message": "結束畫面/鳴謝" - }, - "category_outro_description": { - "message": "鳴謝或當 YouTube 結尾資訊卡出現時。不是含有資訊的總結" - }, - "category_outro_guideline1": { - "message": "即使結尾的資訊卡已開始顯示也不應包含內容" - }, - "category_preview": { - "message": "預覽/摘要" - }, - "category_preview_description": { - "message": "展示即將播放的影片或整系列內容的短片集錦,所有內容都會在後面影片中重複" - }, - "category_preview_guideline1": { - "message": "出現在後面或未來影片的片段" - }, - "category_preview_guideline2": { - "message": "上一部影片的回顧" - }, - "category_preview_guideline3": { - "message": "不是有額外內容的部分" - }, - "category_filler": { - "message": "離題閒聊/玩笑" - }, - "category_filler_short": { - "message": "填充詞" - }, - "category_filler_guideline1": { - "message": "為了幽默而離題的片段" - }, - "category_filler_guideline2": { - "message": "分心、失誤、重播" - }, - "category_filler_guideline3": { - "message": "不是需要觀看才能理解主題的片段" - }, - "category_music_offtopic": { - "message": "音樂:非音樂部分" - }, - "category_music_offtopic_description": { - "message": "此功能僅供音樂影片使用。本功能僅應該用於音樂錄影帶中並未包含其他類別的段落。" - }, - "category_music_offtopic_short": { - "message": "非音樂" - }, - "category_music_offtopic_guideline1": { - "message": "不在官方釋出內容的片段" - }, - "category_music_offtopic_guideline2": { - "message": "在現場演出的非音樂片段" - }, - "category_poi_highlight": { - "message": "重點" - }, - "category_poi_highlight_description": { - "message": "大部分的人在影片尋找的部分。類似「影片在幾分幾秒開始」的留言" - }, - "category_poi_highlight_guideline1": { - "message": "大部分觀眾想要看的部分" - }, - "category_poi_highlight_guideline2": { - "message": "可以幫助略過前後文" - }, - "category_poi_highlight_guideline3": { - "message": "可以跳過到標題或縮圖的內容" - }, - "category_chapter": { - "message": "章節" - }, - "category_chapter_description": { - "message": "用以描述影片主要區段自定義的章節。" - }, - "category_chapter_guideline1": { - "message": "不要提及贊助商名稱" - }, - "category_chapter_guideline2": { - "message": "再較通泛的區段使用較大的章節" - }, - "category_chapter_guideline3": { - "message": "較小的章節可以放在較大的裡面" - }, - "category_livestream_messages": { - "message": "直播:捐贈/訊息閱讀" - }, - "category_livestream_messages_short": { - "message": "閱讀訊息" - }, - "autoSkip": { - "message": "自動跳過" - }, - "manualSkip": { - "message": "手動跳過" - }, - "showOverlay": { - "message": "在時間條顯示" - }, - "disable": { - "message": "停用" - }, - "autoSkip_POI": { - "message": "自動略過至開頭" - }, - "manualSkip_POI": { - "message": "在影片載入時詢問" - }, - "showOverlay_POI": { - "message": "在時間條顯示" - }, - "showOverlay_full": { - "message": "顯示標籤" - }, - "showOverlay_chapter": { - "message": "顯示所有章節" - }, - "autoSkipOnMusicVideos": { - "message": "自動跳過非音樂片段(如果有的話)" - }, - "muteSegments": { - "message": "允許靜音式片段" - }, - "fullVideoSegments": { - "message": "在整個影片都是廣告時顯示圖示", - "description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo" - }, - "previewColor": { - "message": "未提交的顏色", - "description": "Referring to submissions that have not been sent to the server yet." - }, - "seekBarColor": { - "message": "時間條顏色" - }, - "category": { - "message": "類別" - }, - "skipOption": { - "message": "跳過選項", - "description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)" - }, - "enableTestingServer": { - "message": "啟用 Beta 測試伺服器" - }, - "whatEnableTestingServer": { - "message": "您的提交和投票將不會記入主伺服器。僅在測試時啟用此選項" - }, - "testingServerWarning": { - "message": "當連結到測試伺服器,所有的提交和投票都不會計入主伺服器。當您想要進行有效提交時,請停用此選項" - }, - "bracketNow": { - "message": "(現在)" - }, - "moreCategories": { - "message": "更多類別" - }, - "chooseACategory": { - "message": "選擇一個類別" - }, - "enableThisCategoryFirst": { - "message": "若想要提交{0} 類的分段,您必須要在選項內將其啟用。您現在將被重新導向至選項頁面。", - "description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options." - }, - "poiOnlyOneSegment": { - "message": "注意:這種片段同時只能有一個啟用,提交多個片段將顯示隨機一個" - }, - "youMustSelectACategory": { - "message": "您必須為所有您要提交的片段選擇類別!" - }, - "bracketEnd": { - "message": "(結束)" - }, - "End": { - "message": "結束", - "description": "Button that skips to the end of a segment" - }, - "hiddenDueToDownvote": { - "message": "隱藏:負評" - }, - "hiddenDueToDuration": { - "message": "隱藏:太短" - }, - "manuallyHidden": { - "message": "手動隱藏" - }, - "channelDataNotFound": { - "description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.", - "message": "未偵測到頻道ID,如果您正在使用嵌入式YouTube播放器,請移至YouTube網站上觀看本影片。此問題亦有可能是由於YouTube改變了系統架構,如果你認為這是造成此問題的原因,請留言告訴我們:" - }, - "invidiousPermissionRefresh": { - "message": "瀏覽器已收回存取第三方網頁 (例如 Invidious) 的權限,請點擊下方按鈕以重新給予此權限。" - }, - "acceptPermission": { - "message": "允許權限" - }, - "permissionRequestSuccess": { - "message": "成功允許權限!" - }, - "permissionRequestFailed": { - "message": "允許權限失敗,您是不是按到拒絕了?" - }, - "adblockerIssueWhitelist": { - "message": "如果您沒辦法解決這個問題,請停用\"強制在跳過前檢查頻道\",因為 SponsorBlock 無法獲取這部影片的頻道資料。" - }, - "forceChannelCheck": { - "message": "在跳過之前強制頻道檢查" - }, - "whatForceChannelCheck": { - "message": "預設會在它知道頻道名字之前就跳過片段。有時候會在影片一開始忽略白名單而直接跳過片段。啟用這個會預防它,但會造成延遲。如果您有高速網路的話,這個延遲將會不起眼。" - }, - "forceChannelCheckPopup": { - "message": "考慮啟用\"在跳過之前強制頻道檢查\"" - }, - "downvoteDescription": { - "message": "不正確/錯誤的時間" - }, - "incorrectVote": { - "message": "不正確的" - }, - "harmfulVote": { - "message": "有害的", - "description": "Used for chapter segments when the text is harmful/offensive to remove it faster" - }, - "incorrectCategory": { - "message": "變更類別" - }, - "nonMusicCategoryOnMusic": { - "message": "這個影片被分類為音樂。您確定這有贊助內容嗎?如果這其實是\"非音樂片段\"的話,開啟擴充功能設定並啟用這個類別。接下來您即可提交這個片段為\"非音樂片段\"。如果您感到困惑,請閱讀方針" - }, - "multipleSegments": { - "message": "多片段" - }, - "guidelines": { - "message": "方針" - }, - "readTheGuidelines": { - "message": "閱讀方針!!", - "description": "Show the first time they submit or if they are \"high risk\"" - }, - "categoryUpdate1": { - "message": "類別在這!" - }, - "categoryUpdate2": { - "message": "開啟選項以跳過開場、結尾、工商等。" - }, - "help": { - "message": "說明" - }, - "GotIt": { - "message": "知道了", - "description": "Used as the button to dismiss a tooltip" - }, - "fullVideoTooltipWarning": { - "message": "這個片段有點長,如果整部影片都跟一個主題有關,請將「跳過」改為「整部影片」。請參照方針以獲得更多資訊" - }, - "categoryPillTitleText": { - "message": "這整部影片都被標示為此類別且過於相關而不可分開" - }, - "chapterNameTooltipWarning": { - "message": "你有一個與類別名稱相似的章節,你應該盡可能地使用類別。" - }, - "experiementOptOut": { - "message": "關閉所有未來的實驗性功能", - "description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private." - }, - "hideForever": { - "message": "永久隱藏" - }, - "warningChatInfo": { - "message": "我們注意到你犯下了一些不帶有惡意的常見錯誤" - }, - "warningTitle": { - "message": "你收到了一支警告" - }, - "questionButton": { - "message": "我要發問" - }, - "warningConfirmButton": { - "message": "我了解原因" - }, - "warningError": { - "message": "在認知警告時發生錯誤:" - }, - "Donate": { - "message": "贊助" - }, - "considerDonating": { - "message": "資助開發" - }, - "hideDonationLink": { - "message": "隱藏贊助選項" - }, - "darkModeOptionsPage": { - "message": "選項頁面深色模式" - }, - "helpPageThanksForInstalling": { - "message": "感謝你安裝 SponsorBlock。" - }, - "helpPageReviewOptions": { - "message": "請確認以下選項" - }, - "helpPageFeatureDisclaimer": { - "message": "許多功能預設為停用,若欲跳過開頭、結尾或使用Invidious等,在下方啟用它們。你也可以隱藏/顯示介面內容" - }, - "helpPageHowSkippingWorks": { - "message": "略過如何運作" - }, - "helpPageHowSkippingWorks1": { - "message": "影片片段如果出現於資料庫將自動被略過,你可以點擊擴充功能圖示以打開浮窗以便預覽" - }, - "helpPageHowSkippingWorks2": { - "message": "當你略過片段時,你會被提醒。若你認為跳過時間有誤,請按下倒讚以反對之。你也可以用浮窗投票。" - }, - "Submitting": { - "message": "正在提交" - }, - "helpPageSubmitting1": { - "message": "提交可以透過在浮窗內點擊「片段由此開始」按鈕或在影片播放器中的按鈕執行" - }, - "helpPageSubmitting2": { - "message": "點擊播放按鈕表示片段的開始,停止按鈕表示結束。你可以在提交前設定多個片段。點擊上傳按鈕將會提交片段,點擊垃圾桶按鈕將會刪除片段" - }, - "Editing": { - "message": "編輯中" - }, - "helpPageEditing1": { - "message": "若你失誤了,你可以按下箭頭向上按鍵以編輯或刪除你的片段" - }, - "helpPageTooSlow": { - "message": "這太慢了" - }, - "helpPageTooSlow1": { - "message": "快捷鍵是被支援的,按下分號以標示片段的開始或結束,並按下逗號以提交。你可以在選項裡更改快捷鍵設定。若你不是用QWERTY鍵盤的話,你應該更改設定。" - }, - "helpPageCopyOfDatabase": { - "message": "我可以下載資料庫嗎?作者消失怎麼辦?" - }, - "helpPageCopyOfDatabase1": { - "message": "資料庫是公開的且可以在這取用:" - }, - "helpPageCopyOfDatabase2": { - "message": "原始碼是公開的,若作者發生狀況,你的提交將不會化為烏有" - }, - "helpPageNews": { - "message": "消息和製作過程" - }, - "helpPageSourceCode": { - "message": "我在哪裡可以找到原始碼?" - }, - "Credits": { - "message": "致謝" - }, - "LearnMore": { - "message": "了解更多" - }, - "FullDetails": { - "message": "完整詳細資料" - }, - "CopyDownvoteButtonInfo": { - "message": "按倒讚和建立本機副本以便你重新提交" - }, - "OpenCategoryWikiPage": { - "message": "打開此類別之維基頁面" - }, - "CopyAndDownvote": { - "message": "複製並按倒讚" - }, - "ContinueVoting": { - "message": "繼續投票" - }, - "ChangeCategoryTooltip": { - "message": "這將會立即套用至你的片段" - }, - "downvote": { - "message": "按倒讚" - }, - "upvote": { - "message": "按讚" - }, - "hideSegment": { - "message": "隱藏片段" - }, - "SponsorTimeEditScrollNewFeature": { - "message": "在滑鼠鼠標放在編輯框上時使用滾輪以快速調製時間。Ctrl和Shift可以用於精密調整" - }, - "categoryPillNewFeature": { - "message": "新功能》知道整部影片是不是贊助或自我推廣" - }, - "dayAbbreviation": { - "message": "天", - "description": "100d" - }, - "hourAbbreviation": { - "message": "小時", - "description": "100h" - }, - "optionsTabBehavior": { - "message": "行為", - "description": "Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabInterface": { - "message": "介面", - "description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabKeyBinds": { - "message": "鍵盤快捷鍵", - "description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabBackup": { - "message": "備份/還原", - "description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "optionsTabAdvanced": { - "message": "其他", - "description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." - }, - "noticeVisibilityLabel": { - "message": "略過通知外觀", - "description": "Option label" - }, - "unbind": { - "message": "取消綁定", - "description": "Unbind keyboard shortcut" - }, - "notSet": { - "message": "未設定" - }, - "change": { - "message": "更改" - }, - "youtubeKeybindWarning": { - "message": "這是YouTube內建捷徑,你真的要取代它嗎?" - }, - "betaServerWarning": { - "message": "測試版伺服器已啟用!" - }, - "openOptionsPage": { - "message": "打開選項頁面" - }, - "resetToDefault": { - "message": "重設設定為預設值" - }, - "confirmResetToDefault": { - "message": "你確定要將所有設定重設為預設值嗎?此動作無法還原。" - }, - "exportSegments": { - "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": "SponsorBlock 僅供有購買授權或在過去有貢獻者使用" - }, - "unsubmittedSegmentCounts": { - "message": "你現在在 {1} 上有 {0}", - "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": "影片ID", - "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": "分享連結" - } -} diff --git a/public/content.css b/public/content.css index 9f37ab7c..8e23aaa3 100644 --- a/public/content.css +++ b/public/content.css @@ -45,6 +45,7 @@ div:hover > #previewbar.sbNotInvidious { .previewbar { display: inline-block; height: 100%; + min-width: 1px; } .previewbar.requiredSegment { @@ -66,6 +67,11 @@ div:hover > #previewbar.sbNotInvidious { transform: translateY(-1em) !important; } +/* Pull up for precise seeking */ +.ytp-tooltip.sponsorCategoryTooltipVisible .ytp-tooltip-edu { + transform: translateY(-1em) !important; +} + .ytp-tooltip.sponsorCategoryTooltipVisible.sponsorTwoTooltips { transform: translateY(-2em) !important; } @@ -86,6 +92,11 @@ div:hover > #previewbar.sbNotInvidious { transform: translateY(2em) !important; } +/* Pull up for precise seeking */ +.ytp-tooltip.sponsorCategoryTooltipVisible.sponsorTwoTooltips .ytp-tooltip-edu { + transform: translateY(-2em) !important; +} + .ytp-big-mode .ytp-tooltip.sponsorCategoryTooltipVisible > .ytp-tooltip-text-wrapper { transform: translateY(0.5em) !important; } @@ -177,12 +188,21 @@ div:hover > .sponsorBlockChapterBar { margin-right: var(--skip-notice-margin); } +.sponsorSkipObjectFirst { + margin-left: 0; +} + .sponsorSkipLogo { height: 18px; float: left; } +#categoryPill .sbPillNoText .sponsorSkipLogo { + margin-top: calc(2.6rem - 18px); + margin-bottom: calc(2.6rem - 18px); +} + @keyframes fadeIn { from { opacity: 0; } } @@ -240,7 +260,7 @@ div:hover > .sponsorBlockChapterBar { } .exportCopiedNotice .sponsorSkipNoticeTableContainer { - background-color: transparent; + background-color: transparent; } .sponsorSkipNotice { @@ -575,6 +595,7 @@ input::-webkit-inner-spin-button { font-size: 14px; -moz-appearance: textfield; + appearance: textfield; } .sponsorTimeEditInput { @@ -714,11 +735,12 @@ input::-webkit-inner-spin-button { border-radius: 5px; padding: 10px; max-width: 300px; + width: max-content; white-space: normal; line-height: 1.5em; color: white; font-size: 12px; - z-index: 1000; + z-index: 10000; } .sponsorBlockTooltip a { @@ -755,6 +777,14 @@ input::-webkit-inner-spin-button { line-height: 1.5em; } +#categoryPillParent { + height: fit-content; + margin-top: auto; + margin-bottom: auto; + + position: relative; +} + .sponsorBlockCategoryPill { border-radius: 25px; padding-left: 8px; @@ -772,6 +802,10 @@ input::-webkit-inner-spin-button { align-items: center; } +.sponsorBlockCategoryPillTitle { + white-space: nowrap; +} + .categoryPillClose { display: none; height: 10px; @@ -792,3 +826,48 @@ 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; +} + +.sponsorblock-chapter-visible { + display: inherit !important; +}
\ No newline at end of file diff --git a/public/help/index.html b/public/help/index.html index ee886089..f3ac8212 100644 --- a/public/help/index.html +++ b/public/help/index.html @@ -8,7 +8,6 @@ <link href="styles.css" rel="stylesheet"/> - <script src="../js/vendor.js"></script> <script src="../js/help.js"></script> </head> diff --git a/public/icons/IconSponsorBlocker1024px.png b/public/icons/IconSponsorBlocker1024px.png Binary files differnew file mode 100644 index 00000000..536a354a --- /dev/null +++ b/public/icons/IconSponsorBlocker1024px.png diff --git a/public/icons/IconSponsorBlocker128px.png b/public/icons/IconSponsorBlocker128px.png Binary files differnew file mode 100644 index 00000000..22a03210 --- /dev/null +++ b/public/icons/IconSponsorBlocker128px.png diff --git a/public/icons/IconSponsorBlocker256px.png b/public/icons/IconSponsorBlocker256px.png Binary files differindex 9870f586..37ebcd39 100644 --- a/public/icons/IconSponsorBlocker256px.png +++ b/public/icons/IconSponsorBlocker256px.png diff --git a/public/icons/IconSponsorBlocker512px.png b/public/icons/IconSponsorBlocker512px.png Binary files differnew file mode 100644 index 00000000..3cbbd35c --- /dev/null +++ b/public/icons/IconSponsorBlocker512px.png diff --git a/public/icons/IconSponsorBlocker64px.png b/public/icons/IconSponsorBlocker64px.png Binary files differnew file mode 100644 index 00000000..fd23c803 --- /dev/null +++ b/public/icons/IconSponsorBlocker64px.png diff --git a/public/icons/dearrow.svg b/public/icons/dearrow.svg new file mode 100644 index 00000000..d2d351d2 --- /dev/null +++ b/public/icons/dearrow.svg @@ -0,0 +1,54 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> + +<svg + width="800px" + height="800px" + viewBox="0 0 36 36" + aria-hidden="true" + role="img" + class="iconify iconify--twemoji" + preserveAspectRatio="xMidYMid meet" + version="1.1" + id="svg10" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <defs + id="defs14" /> + <sodipodi:namedview + id="namedview12" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:showpageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#d1d1d1" + showgrid="false" + inkscape:zoom="0.65479573" + inkscape:cx="493.2836" + inkscape:cy="514.66432" + inkscape:window-width="1920" + inkscape:window-height="983" + inkscape:window-x="435" + inkscape:window-y="768" + inkscape:window-maximized="1" + inkscape:current-layer="svg10" /> + <path + fill="#1213BD" + d="M36 18.302c0 4.981-2.46 9.198-5.655 12.462s-7.323 5.152-12.199 5.152s-9.764-1.112-12.959-4.376S0 23.283 0 18.302s2.574-9.38 5.769-12.644S13.271 0 18.146 0s9.394 2.178 12.589 5.442C33.931 8.706 36 13.322 36 18.302z" + id="path2" /> + <path + fill="#ffffff" + d="m 30.394282,18.410186 c 0,3.468849 -1.143025,6.865475 -3.416513,9.137917 -2.273489,2.272442 -5.670115,2.92874 -9.137918,2.92874 -3.467803,0 -6.373515,-1.147212 -8.6470033,-3.419654 -2.2734888,-2.272442 -3.5871299,-5.178154 -3.5871299,-8.647003 0,-3.46885 0.9420533,-6.746149 3.2144954,-9.0196379 2.2724418,-2.2734888 5.5507878,-3.9513905 9.0196378,-3.9513905 3.46885,0 6.492841,1.9322561 8.76633,4.204698 2.273489,2.2724424 3.788101,5.2974804 3.788101,8.7663304 z" + id="path4" + style="fill:#88c9f9;fill-opacity:1;stroke-width:1.04673" /> + <path + fill="#292f33" + d="m 23.95823,17.818306 c 0,3.153748 -2.644888,5.808102 -5.798635,5.808102 -3.153748,0 -5.599825,-2.654354 -5.599825,-5.808102 0,-3.153747 2.446077,-5.721714 5.599825,-5.721714 3.153747,0 5.798635,2.567967 5.798635,5.721714 z" + id="path8" + style="stroke-width:1.18339;fill:#0a62a5;fill-opacity:1" /> +</svg> diff --git a/public/libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlBduz8A.woff2 b/public/libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlBduz8A.woff2 Binary files differnew file mode 100644 index 00000000..91d0ba4b --- /dev/null +++ b/public/libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlBduz8A.woff2 diff --git a/public/libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdu.woff2 b/public/libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdu.woff2 Binary files differnew file mode 100644 index 00000000..ce34a9fe --- /dev/null +++ b/public/libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdu.woff2 diff --git a/public/libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmBduz8A.woff2 b/public/libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmBduz8A.woff2 Binary files differnew file mode 100644 index 00000000..e83ac811 --- /dev/null +++ b/public/libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmBduz8A.woff2 diff --git a/public/libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmRduz8A.woff2 b/public/libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmRduz8A.woff2 Binary files differnew file mode 100644 index 00000000..9f9d48a4 --- /dev/null +++ b/public/libs/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmRduz8A.woff2 diff --git a/public/libs/Source+Sans+Pro.css b/public/libs/Source+Sans+Pro.css index 55a505fc..0bc3c0f4 100644 --- a/public/libs/Source+Sans+Pro.css +++ b/public/libs/Source+Sans+Pro.css @@ -3,7 +3,7 @@ font-family: 'Source Sans Pro'; font-style: normal; font-weight: 400; - src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(https://fonts.gstatic.com/s/sourcesanspro/v13/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNa7lqDY.woff2) format('woff2'); + src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(6xK3dSBYKcSV-LCoeQqfX1RYOo3qNa7lqDY.woff2) format('woff2'); unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; } /* cyrillic */ @@ -11,7 +11,7 @@ font-family: 'Source Sans Pro'; font-style: normal; font-weight: 400; - src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(https://fonts.gstatic.com/s/sourcesanspro/v13/6xK3dSBYKcSV-LCoeQqfX1RYOo3qPK7lqDY.woff2) format('woff2'); + src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(6xK3dSBYKcSV-LCoeQqfX1RYOo3qPK7lqDY.woff2) format('woff2'); unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; } /* greek-ext */ @@ -19,7 +19,7 @@ font-family: 'Source Sans Pro'; font-style: normal; font-weight: 400; - src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(https://fonts.gstatic.com/s/sourcesanspro/v13/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNK7lqDY.woff2) format('woff2'); + src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(6xK3dSBYKcSV-LCoeQqfX1RYOo3qNK7lqDY.woff2) format('woff2'); unicode-range: U+1F00-1FFF; } /* greek */ @@ -27,7 +27,7 @@ font-family: 'Source Sans Pro'; font-style: normal; font-weight: 400; - src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(https://fonts.gstatic.com/s/sourcesanspro/v13/6xK3dSBYKcSV-LCoeQqfX1RYOo3qO67lqDY.woff2) format('woff2'); + src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(6xK3dSBYKcSV-LCoeQqfX1RYOo3qO67lqDY.woff2) format('woff2'); unicode-range: U+0370-03FF; } /* vietnamese */ @@ -35,7 +35,7 @@ font-family: 'Source Sans Pro'; font-style: normal; font-weight: 400; - src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(https://fonts.gstatic.com/s/sourcesanspro/v13/6xK3dSBYKcSV-LCoeQqfX1RYOo3qN67lqDY.woff2) format('woff2'); + src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(6xK3dSBYKcSV-LCoeQqfX1RYOo3qN67lqDY.woff2) format('woff2'); unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; } /* latin-ext */ @@ -43,7 +43,7 @@ font-family: 'Source Sans Pro'; font-style: normal; font-weight: 400; - src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(https://fonts.gstatic.com/s/sourcesanspro/v13/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNq7lqDY.woff2) format('woff2'); + src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(6xK3dSBYKcSV-LCoeQqfX1RYOo3qNq7lqDY.woff2) format('woff2'); unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; } /* latin */ @@ -51,7 +51,7 @@ font-family: 'Source Sans Pro'; font-style: normal; font-weight: 400; - src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(https://fonts.gstatic.com/s/sourcesanspro/v13/6xK3dSBYKcSV-LCoeQqfX1RYOo3qOK7l.woff2) format('woff2'); + src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(6xK3dSBYKcSV-LCoeQqfX1RYOo3qOK7l.woff2) format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } /* cyrillic-ext */ @@ -59,7 +59,7 @@ font-family: 'Source Sans Pro'; font-style: normal; font-weight: 700; - src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(https://fonts.gstatic.com/s/sourcesanspro/v13/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmhduz8A.woff2) format('woff2'); + src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmhduz8A.woff2) format('woff2'); unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; } /* cyrillic */ @@ -67,7 +67,7 @@ font-family: 'Source Sans Pro'; font-style: normal; font-weight: 700; - src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(https://fonts.gstatic.com/s/sourcesanspro/v13/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwkxduz8A.woff2) format('woff2'); + src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwkxduz8A.woff2) format('woff2'); unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; } /* greek-ext */ @@ -75,7 +75,7 @@ font-family: 'Source Sans Pro'; font-style: normal; font-weight: 700; - src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(https://fonts.gstatic.com/s/sourcesanspro/v13/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmxduz8A.woff2) format('woff2'); + src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmxduz8A.woff2) format('woff2'); unicode-range: U+1F00-1FFF; } /* greek */ @@ -83,7 +83,7 @@ font-family: 'Source Sans Pro'; font-style: normal; font-weight: 700; - src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(https://fonts.gstatic.com/s/sourcesanspro/v13/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlBduz8A.woff2) format('woff2'); + src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlBduz8A.woff2) format('woff2'); unicode-range: U+0370-03FF; } /* vietnamese */ @@ -91,7 +91,7 @@ font-family: 'Source Sans Pro'; font-style: normal; font-weight: 700; - src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(https://fonts.gstatic.com/s/sourcesanspro/v13/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmBduz8A.woff2) format('woff2'); + src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmBduz8A.woff2) format('woff2'); unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; } /* latin-ext */ @@ -99,7 +99,7 @@ font-family: 'Source Sans Pro'; font-style: normal; font-weight: 700; - src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(https://fonts.gstatic.com/s/sourcesanspro/v13/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmRduz8A.woff2) format('woff2'); + src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmRduz8A.woff2) format('woff2'); unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; } /* latin */ @@ -107,6 +107,6 @@ font-family: 'Source Sans Pro'; font-style: normal; font-weight: 700; - src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(https://fonts.gstatic.com/s/sourcesanspro/v13/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdu.woff2) format('woff2'); + src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdu.woff2) format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -}
\ No newline at end of file +} diff --git a/public/options/options.css b/public/options/options.css index 00035cd0..d9acda83 100644 --- a/public/options/options.css +++ b/public/options/options.css @@ -38,7 +38,7 @@ --white: black; } -.medium-description, .switch-container, .optionLabel, .categoryTableElement { +.medium-description, .switch-container, .optionLabel, .categoryTableElement, .promotion-description { color: var(--white); } @@ -696,4 +696,25 @@ svg { .upsellButton { cursor: pointer; vertical-align: middle; +} + +.no-bottom-border { + border: none !important; + padding: 20px 0px 0px 0px !important; +} + +.promotion-container { + width: fit-content; +} + +.dearrow-link { + display: flex; + align-items: center; + justify-content: center; + text-decoration: none; +} + +.dearrow-link > img { + width: 40px; + margin-right: 4px; }
\ No newline at end of file diff --git a/public/options/options.html b/public/options/options.html index 91112941..cc112195 100644 --- a/public/options/options.html +++ b/public/options/options.html @@ -9,7 +9,6 @@ <link href="options.css" rel="stylesheet"/> - <script src="../js/vendor.js"></script> <script src="../js/options.js"></script> </head> @@ -66,6 +65,19 @@ </div> + <div id="deArrowPromotion" class="promotion-container" class="hidden"> + <a class="dearrow-link" + href="https://dearrow.ajay.app" + target="_blank" + rel="noreferrer"> + <img src="/icons/dearrow.svg"/> + + <span class="promotion-description"> + __MSG_DeArrowPromotionMessage__ + </span> + </a> + </div> + <div data-type="toggle" data-sync="muteSegments"> <div class="switch-container"> <label class="switch"> @@ -78,7 +90,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 +102,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> @@ -155,6 +180,20 @@ <div class="small-description">__MSG_whatShowCategoryWithoutPermission__</div> </div> + <div id="ytNeuterPromotion" class="promotion-container"> + <a class="dearrow-link" + href="https://github.com/mchangrh/yt-neuter/blob/main/docs/filters/sponsorblock.md#install" + target="_blank" + rel="noreferrer"> + + <span class="promotion-description"> + __MSG_YtNeuterMessage__ + </span> + </a> + + <div class="small-description">__MSG_requiresUblock__</div> + </div> + </div> <div id="interface" class="option-group hidden"> @@ -277,6 +316,18 @@ </label> </div> </div> + + <div data-type="toggle" data-sync="allowScrollingToEdit"> + <div class="switch-container"> + <label class="switch"> + <input id="allowScrollingToEdit" type="checkbox" checked> + <span class="slider round"></span> + </label> + <label class="switch-label" for="allowScrollingToEdit"> + __MSG_allowScrollingToEdit__ + </label> + </div> + </div> <div data-type="toggle" data-sync="audioNotificationOnSkip"> <div class="switch-container"> @@ -318,6 +369,18 @@ </div> </div> + <div data-type="toggle" data-toggle-type="reverse" data-sync="showNewFeaturePopups"> + <div class="switch-container"> + <label class="switch"> + <input id="showNewFeaturePopups" type="checkbox" checked> + <span class="slider round"></span> + </label> + <label class="switch-label" for="showNewFeaturePopups"> + __MSG_hideNewFeatureUpdates__ + </label> + </div> + </div> + <div data-type="toggle" data-toggle-type="reverse" data-sync="showDonationLink" data-no-safari="true"> <div class="switch-container"> <label class="switch"> @@ -430,7 +493,7 @@ <div id="advanced" class="option-group hidden"> - <div id="support-invidious" data-type="toggle" data-sync="supportInvidious" data-no-safari="true"> + <div id="support-invidious" data-type="toggle" data-sync="supportInvidious"> <div class="switch-container"> <label class="switch"> <input id="supportInvidious" type="checkbox"> @@ -441,11 +504,11 @@ </label> </div> - <div class="small-description">(__MSG_supportedSites__ Invidious, CloudTube)</div> + <div class="small-description">(__MSG_supportedSites__ Invidious, CloudTube, Piped, YouTube Kids)</div> <div class="small-description">__MSG_supportOtherSitesDescription__ </div> </div> - <div data-type="private-text-change" data-sync="invidiousInstances" data-no-safari="true" data-dependent-on="supportInvidious"> + <div data-type="private-text-change" data-sync="invidiousInstances" data-dependent-on="supportInvidious"> <div class="option-button trigger-button"> __MSG_addInvidiousInstance__ </div> diff --git a/public/oss-attribution/attribution.txt b/public/oss-attribution/attribution.txt index 4f0f164b..9643b401 100644 --- a/public/oss-attribution/attribution.txt +++ b/public/oss-attribution/attribution.txt @@ -1,3 +1,33 @@ +content-scripts-register-polyfill +4.0.2 <https://github.com/fregante/content-scripts-register-polyfill> +MIT License + +Copyright (c) Federico Brigante <[email protected]> (https://fregante.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +****************************** + +escape-string-regexp +5.0.0 <https://github.com/sindresorhus/escape-string-regexp> +MIT License + +Copyright (c) Sindre Sorhus <[email protected]> (https://sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +****************************** + js-tokens 4.0.0 <https://github.com/lydell/js-tokens> The MIT License (MIT) @@ -129,3 +159,48 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +****************************** + +webext-content-scripts +2.5.5 <https://github.com/fregante/webext-content-scripts> +MIT License + +Copyright (c) Federico Brigante <[email protected]> (https://fregante.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +****************************** + +webext-patterns +1.3.0 <https://github.com/fregante/webext-patterns> +MIT License + +Copyright (c) Federico Brigante <[email protected]> (https://fregante.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +****************************** + +webext-polyfill-kinda +1.0.2 <https://github.com/fregante/webext-polyfill-kinda> +MIT License + +Copyright (c) Federico Brigante <[email protected]> (https://fregante.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/public/permissions/index.html b/public/permissions/index.html index bf854248..5c366986 100644 --- a/public/permissions/index.html +++ b/public/permissions/index.html @@ -6,7 +6,6 @@ <link href="styles.css" rel="stylesheet"/> - <script src="../js/vendor.js"></script> <script src="../js/permissions.js"></script> </head> diff --git a/public/popup.css b/public/popup.css index 9e1e9fae..76733fab 100644 --- a/public/popup.css +++ b/public/popup.css @@ -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 diff --git a/public/popup.html b/public/popup.html index 743959dc..c7d5620c 100644 --- a/public/popup.html +++ b/public/popup.html @@ -105,7 +105,7 @@ <sub class="sponsorStartHint grey-text">__MSG_popupHint__</sub> <div style="text-align: center; margin: 8px 0;"> <button id="sponsorStart" class="sbMediumButton" style="margin-right: 8px">__MSG_sponsorStart__</button> - <button id="submitTimes" class="sbMediumButton" style="display: none">__MSG_submitTimesButton__</button> + <button id="submitTimes" class="sbMediumButton" style="display: none">__MSG_OpenSubmissionMenu__</button> </div> <span id="submissionHint" style="display: none">__MSG_submissionEditHint__</span> </div> @@ -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> diff --git a/public/upsell/index.html b/public/upsell/index.html deleted file mode 100644 index 34352550..00000000 --- a/public/upsell/index.html +++ /dev/null @@ -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__ [email protected] - </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>
\ No newline at end of file diff --git a/public/upsell/styles.css b/public/upsell/styles.css deleted file mode 100644 index ea1407cd..00000000 --- a/public/upsell/styles.css +++ /dev/null @@ -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; -}
\ No newline at end of file diff --git a/src/background.ts b/src/background.ts index 9391d610..d7d95819 100644 --- a/src/background.ts +++ b/src/background.ts @@ -2,13 +2,21 @@ import * as CompileConfig from "../config.json"; import Config from "./config"; import { Registration } from "./types"; +import "content-scripts-register-polyfill"; +import { sendRealRequestToCustomServer, setupBackgroundRequestProxy } from "../maze-utils/src/background-request-proxy"; +import { setupTabUpdates } from "../maze-utils/src/tab-updates"; +import { generateUserID } from "../maze-utils/src/setup"; // Make the config public for debugging purposes window.SB = Config; import Utils from "./utils"; -import { GenericUtils } from "./utils/genericUtils"; +import { getExtensionIdsToImportFrom } from "./utils/crossExtension"; +import { isFirefoxOrSafari } from "../maze-utils/src"; +import { injectUpdatedScripts } from "../maze-utils/src/cleanup"; +import { logWarn } from "./utils/logger"; +import { chromeP } from "../maze-utils/src/browserApi"; const utils = new Utils({ registerFirefoxContentScript, unregisterFirefoxContentScript @@ -20,65 +28,24 @@ const popupPort: Record<string, chrome.runtime.Port> = {}; const contentScriptRegistrations = {}; // Register content script if needed -if (utils.isFirefox()) { - utils.wait(() => Config.config !== null).then(function() { - if (Config.config.supportInvidious) utils.setupExtraSiteContentScripts(); - }); -} - -function onTabUpdatedListener(tabId: number) { - chrome.tabs.sendMessage(tabId, { - message: 'update', - }, () => void chrome.runtime.lastError ); // Suppress error on Firefox -} - -function onNavigationApiAvailableChange(changes: {[key: string]: chrome.storage.StorageChange}) { - if (changes.navigationApiAvailable) { - if (changes.navigationApiAvailable.newValue) { - chrome.tabs.onUpdated.removeListener(onTabUpdatedListener); - } else { - chrome.tabs.onUpdated.addListener(onTabUpdatedListener); - } - } -} - -// If Navigation API is not supported, then background has to inform content script about video change. -// This happens on Safari, Firefox, and Chromium 101 (inclusive) and below. -chrome.tabs.onUpdated.addListener(onTabUpdatedListener); -utils.wait(() => Config.local !== null).then(() => { - if (Config.local.navigationApiAvailable) { - chrome.tabs.onUpdated.removeListener(onTabUpdatedListener); - } +utils.wait(() => Config.isReady()).then(function() { + if (Config.config.supportInvidious) utils.setupExtraSiteContentScripts(); }); -if (!Config.configSyncListeners.includes(onNavigationApiAvailableChange)) { - Config.configSyncListeners.push(onNavigationApiAvailableChange); -} +setupBackgroundRequestProxy(); +setupTabUpdates(Config); chrome.runtime.onMessage.addListener(function (request, sender, callback) { switch(request.message) { case "openConfig": chrome.tabs.create({url: chrome.runtime.getURL('options/options.html' + (request.hash ? '#' + request.hash : ''))}); - return; + return false; case "openHelp": chrome.tabs.create({url: chrome.runtime.getURL('help/index.html')}); - return; - case "openUpsell": - chrome.tabs.create({url: chrome.runtime.getURL('upsell/index.html')}); - return; + return false; case "openPage": chrome.tabs.create({url: chrome.runtime.getURL(request.url)}); - return; - case "sendRequest": - sendRequestToCustomServer(request.type, request.url, request.data).then(async (response) => { - callback({ - responseText: await response.text(), - status: response.status, - ok: response.ok - }); - }); - - return true; + return false; case "submitVote": submitVote(request.type, request.UUID, request.category).then(callback); @@ -109,12 +76,32 @@ chrome.runtime.onMessage.addListener(function (request, sender, callback) { case "infoUpdated": case "videoChanged": if (sender.tab) { - popupPort[sender.tab.id]?.postMessage(request); + try { + popupPort[sender.tab.id]?.postMessage(request); + } catch (e) { + // This can happen if the popup is closed + } } return false; + default: + return false; } }); +chrome.runtime.onMessageExternal.addListener((request, sender, callback) => { + if (getExtensionIdsToImportFrom().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({ @@ -139,7 +126,7 @@ chrome.runtime.onInstalled.addListener(function () { chrome.tabs.create({url: chrome.extension.getURL("/help/index.html")}); //generate a userID - const newUserID = GenericUtils.generateUserID(); + const newUserID = generateUserID(); //save this UUID Config.config.userID = newUserID; @@ -153,6 +140,11 @@ chrome.runtime.onInstalled.addListener(function () { } } }, 1500); + + // Only do this once the old version understands how to clean itself up + if (!isFirefoxOrSafari() && chrome.runtime.getManifest().version !== "5.4.13") { + injectUpdatedScripts().catch(logWarn); + } }); /** @@ -161,26 +153,61 @@ chrome.runtime.onInstalled.addListener(function () { * * @param {JSON} options */ -function registerFirefoxContentScript(options: Registration) { - const oldRegistration = contentScriptRegistrations[options.id]; - if (oldRegistration) oldRegistration.unregister(); - - browser.contentScripts.register({ - allFrames: options.allFrames, - js: options.js, - css: options.css, - matches: options.matches - }).then((registration) => void (contentScriptRegistrations[options.id] = registration)); +async function registerFirefoxContentScript(options: Registration) { + if ("scripting" in chrome && "getRegisteredContentScripts" in chrome.scripting) { + const existingRegistrations = await chromeP.scripting.getRegisteredContentScripts({ + ids: [options.id] + }).catch(() => []); + + if (existingRegistrations.length > 0 + && existingRegistrations[0].matches.every((match) => options.matches.includes(match))) { + // No need to register another script, already registered + return; + } + } + + await unregisterFirefoxContentScript(options.id); + + if ("scripting" in chrome && "getRegisteredContentScripts" in chrome.scripting) { + await chromeP.scripting.registerContentScripts([{ + id: options.id, + runAt: "document_start", + matches: options.matches, + allFrames: options.allFrames, + js: options.js, + css: options.css, + persistAcrossSessions: true, + }]); + } else { + chrome.contentScripts.register({ + allFrames: options.allFrames, + js: options.js?.map?.(file => ({file})), + css: options.css?.map?.(file => ({file})), + matches: options.matches + }).then((registration) => void (contentScriptRegistrations[options.id] = registration)); + } + } /** * Only works on Firefox. * Firefox requires that this is handled by the background script - * */ -function unregisterFirefoxContentScript(id: string) { - contentScriptRegistrations[id].unregister(); - delete contentScriptRegistrations[id]; +async function unregisterFirefoxContentScript(id: string) { + if ("scripting" in chrome && "getRegisteredContentScripts" in chrome.scripting) { + try { + await chromeP.scripting.unregisterContentScripts({ + ids: [id] + }); + } catch (e) { + // Not registered yet + } + } else { + if (contentScriptRegistrations[id]) { + contentScriptRegistrations[id].unregister(); + delete contentScriptRegistrations[id]; + } + } } async function submitVote(type: number, UUID: string, category: string) { @@ -188,7 +215,7 @@ async function submitVote(type: number, UUID: string, category: string) { if (userID == undefined || userID === "undefined") { //generate one - userID = GenericUtils.generateUserID(); + userID = generateUserID(); Config.config.userID = userID; } @@ -219,35 +246,9 @@ async function submitVote(type: number, UUID: string, category: string) { } } + async function asyncRequestToServer(type: string, address: string, data = {}) { const serverAddress = Config.config.testingServer ? CompileConfig.testingServerAddress : Config.config.serverAddress; - return await (sendRequestToCustomServer(type, serverAddress + address, data)); -} - -/** - * Sends a request to the specified url - * - * @param type The request type "GET", "POST", etc. - * @param address The address to add to the SponsorBlock server address - * @param callback - */ -async function sendRequestToCustomServer(type: string, url: string, data = {}) { - // If GET, convert JSON to parameters - if (type.toLowerCase() === "get") { - url = GenericUtils.objectToURI(url, data, true); - - data = null; - } - - const response = await fetch(url, { - method: type, - headers: { - 'Content-Type': 'application/json' - }, - redirect: 'follow', - body: data ? JSON.stringify(data) : null - }); - - return response; -} + return await (sendRealRequestToCustomServer(type, serverAddress + address, data)); +}
\ No newline at end of file diff --git a/src/components/CategoryPillComponent.tsx b/src/components/CategoryPillComponent.tsx index 7d46d0aa..1d39a400 100644 --- a/src/components/CategoryPillComponent.tsx +++ b/src/components/CategoryPillComponent.tsx @@ -7,11 +7,13 @@ 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 "../../maze-utils/src/formating"; export interface CategoryPillProps { vote: (type: number, UUID: SegmentUUID, category?: Category) => Promise<VoteResponse>; + showTextByDefault: boolean; + showTooltipOnClick: boolean; } export interface CategoryPillState { @@ -43,18 +45,23 @@ class CategoryPillComponent extends React.Component<CategoryPillProps, CategoryP return ( <span style={style} - className={"sponsorBlockCategoryPill"} + className={"sponsorBlockCategoryPill" + (!this.props.showTextByDefault ? " sbPillNoText" : "")} aria-label={this.getTitleText()} onClick={(e) => this.toggleOpen(e)} onMouseEnter={() => this.openTooltip()} onMouseLeave={() => this.closeTooltip()}> + <span className="sponsorBlockCategoryPillTitleSection"> <img className="sponsorSkipLogo sponsorSkipObject" src={chrome.extension.getURL("icons/IconSponsorBlocker256px.png")}> </img> - <span className="sponsorBlockCategoryPillTitle"> - {chrome.i18n.getMessage("category_" + this.state.segment?.category)} - </span> + + { + (this.props.showTextByDefault || this.state.open) && + <span className="sponsorBlockCategoryPillTitle"> + {chrome.i18n.getMessage("category_" + this.state.segment?.category)} + </span> + } </span> {this.state.open && ( @@ -81,7 +88,10 @@ class CategoryPillComponent extends React.Component<CategoryPillProps, CategoryP {/* Close Button */} <img src={chrome.extension.getURL("icons/close.png")} className="categoryPillClose" - onClick={() => this.setState({ show: false })}> + onClick={() => { + this.setState({ show: false }); + this.closeTooltip(); + }}> </img> </span> ); @@ -91,6 +101,14 @@ class CategoryPillComponent extends React.Component<CategoryPillProps, CategoryP event.stopPropagation(); if (this.state.show) { + if (this.props.showTooltipOnClick) { + if (this.state.open) { + this.closeTooltip(); + } else { + this.openTooltip(); + } + } + this.setState({ open: !this.state.open }); } } @@ -104,58 +122,52 @@ 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 }); + + this.closeTooltip(); } 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 { - const tooltipMount = document.querySelector("ytd-video-primary-info-renderer > #container") as HTMLElement; + if (this.tooltip) { + this.tooltip.close(); + } + + const tooltipMount = document.querySelector("#above-the-fold, ytm-slim-owner-renderer") as HTMLElement; if (tooltipMount) { this.tooltip = new Tooltip({ text: this.getTitleText(), referenceNode: tooltipMount, - bottomOffset: "70px", + bottomOffset: "0px", opacity: 0.95, displayTriangle: false, showLogo: false, - showGotIt: false + showGotIt: false, + prependElement: tooltipMount.firstElementChild as HTMLElement }); } } private closeTooltip(): void { - this.tooltip?.close(); + this.tooltip?.close?.(); this.tooltip = null; } diff --git a/src/components/ChapterVoteComponent.tsx b/src/components/ChapterVoteComponent.tsx index 37591f0c..9ee75727 100644 --- a/src/components/ChapterVoteComponent.tsx +++ b/src/components/ChapterVoteComponent.tsx @@ -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 "../../maze-utils/src/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)); } } } diff --git a/src/components/NoticeComponent.tsx b/src/components/NoticeComponent.tsx index 3202c6ac..2f404ba1 100644 --- a/src/components/NoticeComponent.tsx +++ b/src/components/NoticeComponent.tsx @@ -1,5 +1,6 @@ import * as React from "react"; import Config from "../config"; +import SbSvg from "../svg-icons/sb_svg"; enum CountdownMode { Timer, @@ -28,6 +29,7 @@ export interface NoticeProps { extraClass?: string; hideLogo?: boolean; hideRightInfo?: boolean; + logoFill?: string; // Callback for when this is closed closeListener: () => void; @@ -122,10 +124,10 @@ class NoticeComponent extends React.Component<NoticeProps, NoticeState> { <td className="noticeLeftIcon"> {/* Logo */} {!this.props.hideLogo && - <img id={"sponsorSkipLogo" + this.idSuffix} - className="sponsorSkipLogo sponsorSkipObject" - src={chrome.extension.getURL("icons/IconSponsorBlocker256px.png")}> - </img> + <SbSvg + id={"sponsorSkipLogo" + this.idSuffix} + fill={this.props.logoFill} + className="sponsorSkipLogo sponsorSkipObject"/> } <span id={"sponsorSkipMessage" + this.idSuffix} @@ -195,7 +197,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 diff --git a/src/components/SkipNoticeComponent.tsx b/src/components/SkipNoticeComponent.tsx index f42c0396..d03e135e 100644 --- a/src/components/SkipNoticeComponent.tsx +++ b/src/components/SkipNoticeComponent.tsx @@ -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 { GenericUtils } from "../utils/genericUtils"; +import { generateUserID } from "../../maze-utils/src/setup"; +import { keybindToString } from "../../maze-utils/src/config"; enum SkipButtonState { Undo, // Unskip @@ -177,7 +177,8 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta ) : null; return ( - <NoticeComponent noticeTitle={this.state.noticeTitle} + <NoticeComponent + noticeTitle={this.state.noticeTitle} amountOfPreviousNotices={this.amountOfPreviousNotices} showInSecondSlot={this.showInSecondSlot} idSuffix={this.idSuffix} @@ -191,6 +192,7 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta ref={this.noticeRef} closeListener={() => this.closeListener()} smaller={this.state.smaller} + logoFill={Config.config.barTypes[this.segments[0].category].color} limitWidth={true} firstColumn={firstColumn} bottomRow={[...this.getMessageBoxes(), ...this.getBottomRow() ]} @@ -373,6 +375,7 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta </span> ); } + return null; } getSubmissionChooser(): JSX.Element[] { @@ -541,7 +544,7 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta const sponsorVideoID = this.props.contentContainer().sponsorVideoID; const sponsorTimesSubmitting : SponsorTime = { segment: this.segments[index].segment, - UUID: GenericUtils.generateUserID() as SegmentUUID, + UUID: generateUserID() as SegmentUUID, category: this.segments[index].category, actionType: this.segments[index].actionType, source: SponsorSourceType.Local diff --git a/src/components/SponsorTimeEditComponent.tsx b/src/components/SponsorTimeEditComponent.tsx index d05c34fa..15f265ee 100644 --- a/src/components/SponsorTimeEditComponent.tsx +++ b/src/components/SponsorTimeEditComponent.tsx @@ -6,10 +6,8 @@ import Utils from "../utils"; import SubmissionNoticeComponent from "./SubmissionNoticeComponent"; import { RectangleTooltip } from "../render/RectangleTooltip"; import SelectorComponent, { SelectorOption } from "./SelectorComponent"; -import { GenericUtils } from "../utils/genericUtils"; -import { noRefreshFetchingChaptersAllowed } from "../utils/licenseKey"; import { DEFAULT_CATEGORY } from "../utils/categoryUtils"; - +import { getFormattedTime, getFormattedTimeToSeconds } from "../../maze-utils/src/formating"; const utils = new Utils(); @@ -140,6 +138,8 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo type="text" style={{color: "inherit", backgroundColor: "inherit"}} value={this.state.sponsorTimeEdits[0]} + onKeyDown={(e) => e.stopPropagation()} + onKeyUp={(e) => e.stopPropagation()} onChange={(e) => this.handleOnChange(0, e, sponsorTime, e.target.value)} onWheel={(e) => this.changeTimesWhenScrolling(0, e, sponsorTime)}> </input> @@ -181,9 +181,9 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo style={timeDisplayStyle} className="sponsorTimeDisplay" onClick={this.toggleEditTime.bind(this)}> - {GenericUtils.getFormattedTime(segment[0], true) + + {getFormattedTime(segment[0], true) + ((!isNaN(segment[1]) && sponsorTime.actionType !== ActionType.Poi) - ? " " + chrome.i18n.getMessage("to") + " " + GenericUtils.getFormattedTime(segment[1], true) : "")} + ? " " + chrome.i18n.getMessage("to") + " " + getFormattedTime(segment[1], true) : "")} </div> ); } @@ -308,8 +308,8 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo const sponsorTimeEdits = this.state.sponsorTimeEdits; // check if change is small engough to show tooltip - const before = GenericUtils.getFormattedTimeToSeconds(sponsorTimeEdits[index]); - const after = GenericUtils.getFormattedTimeToSeconds(targetValue); + const before = getFormattedTimeToSeconds(sponsorTimeEdits[index]); + const after = getFormattedTimeToSeconds(targetValue); const difference = Math.abs(before - after); if (0 < difference && difference < 0.5) this.showScrollToEditToolTip(); @@ -320,6 +320,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo } changeTimesWhenScrolling(index: number, e: React.WheelEvent, sponsorTime: SponsorTime): void { + if (!Config.config.allowScrollingToEdit) return; let step = 0; // shift + ctrl = 1 // ctrl = 0.1 @@ -332,7 +333,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo } const sponsorTimeEdits = this.state.sponsorTimeEdits; - let timeAsNumber = GenericUtils.getFormattedTimeToSeconds(this.state.sponsorTimeEdits[index]); + let timeAsNumber = getFormattedTimeToSeconds(this.state.sponsorTimeEdits[index]); if (timeAsNumber !== null && e.deltaY != 0) { if (e.deltaY < 0) { timeAsNumber += step; @@ -342,7 +343,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo timeAsNumber = 0; } - sponsorTimeEdits[index] = GenericUtils.getFormattedTime(timeAsNumber, true); + sponsorTimeEdits[index] = getFormattedTime(timeAsNumber, true); if (sponsorTime.actionType === ActionType.Poi) sponsorTimeEdits[1] = sponsorTimeEdits[0]; this.setState({sponsorTimeEdits}); @@ -420,7 +421,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; @@ -574,8 +575,8 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo /** Returns an array in the sponsorTimeEdits form (formatted time string) from a normal seconds sponsor time */ getFormattedSponsorTimesEdits(sponsorTime: SponsorTime): [string, string] { - return [GenericUtils.getFormattedTime(sponsorTime.segment[0], true), - GenericUtils.getFormattedTime(sponsorTime.segment[1], true)]; + return [getFormattedTime(sponsorTime.segment[0], true), + getFormattedTime(sponsorTime.segment[1], true)]; } saveEditTimes(): void { @@ -583,8 +584,8 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo const category = this.categoryOptionRef.current.value as Category if (this.state.editing) { - const startTime = GenericUtils.getFormattedTimeToSeconds(this.state.sponsorTimeEdits[0]); - const endTime = GenericUtils.getFormattedTimeToSeconds(this.state.sponsorTimeEdits[1]); + const startTime = getFormattedTimeToSeconds(this.state.sponsorTimeEdits[0]); + const endTime = getFormattedTimeToSeconds(this.state.sponsorTimeEdits[1]); // Change segment time only if the format was correct if (startTime !== null && endTime !== null) { @@ -595,7 +596,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo this.props.contentContainer().updateEditButtonsOnPlayer(); } } - } else if (this.state.sponsorTimeEdits[1] === null && category === "outro") { + } else if (this.state.sponsorTimeEdits[1] === null && category === "outro" && !sponsorTimesSubmitting[this.props.index].segment[1]) { sponsorTimesSubmitting[this.props.index].segment[1] = this.props.contentContainer().v.duration; this.props.contentContainer().updateEditButtonsOnPlayer(); } @@ -687,13 +688,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> { diff --git a/src/components/TooltipComponent.tsx b/src/components/TooltipComponent.tsx deleted file mode 100644 index 0e13c63c..00000000 --- a/src/components/TooltipComponent.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import * as React from "react"; - -export interface TooltipProps { - text: string; - show: boolean; -} - -export interface TooltipState { - -} - -class TooltipComponent extends React.Component<TooltipProps, TooltipState> { - - constructor(props: TooltipProps) { - super(props); - } - - render(): React.ReactElement { - const style: React.CSSProperties = { - display: this.props.show ? "flex" : "none", - position: "absolute", - } - - return ( - <span style={style} - className={"sponsorBlockTooltip"} > - <span className="sponsorBlockTooltipText"> - {this.props.text} - </span> - </span> - ); - } -} - -export default TooltipComponent; diff --git a/src/components/options/CategorySkipOptionsComponent.tsx b/src/components/options/CategorySkipOptionsComponent.tsx index 486a43ed..d9d89cf0 100644 --- a/src/components/options/CategorySkipOptionsComponent.tsx +++ b/src/components/options/CategorySkipOptionsComponent.tsx @@ -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)} </> ); @@ -176,6 +139,12 @@ class CategorySkipOptionsComponent extends React.Component<CategorySkipOptionsPr case "autoSkip": option = CategorySkipOption.AutoSkip; + if (this.props.category === "filler" && !Config.config.isVip) { + if (!confirm(chrome.i18n.getMessage("FillerWarning"))) { + event.target.value = "disable"; + } + } + break; } @@ -235,16 +204,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> diff --git a/src/components/options/KeybindComponent.tsx b/src/components/options/KeybindComponent.tsx index 4d49c7f4..6f5b8e60 100644 --- a/src/components/options/KeybindComponent.tsx +++ b/src/components/options/KeybindComponent.tsx @@ -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 "../../../maze-utils/src/config"; export interface KeybindProps { option: string; diff --git a/src/components/options/KeybindDialogComponent.tsx b/src/components/options/KeybindDialogComponent.tsx index 7c8684a7..057a3b05 100644 --- a/src/components/options/KeybindDialogComponent.tsx +++ b/src/components/options/KeybindDialogComponent.tsx @@ -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 "../../../maze-utils/src/config"; export interface KeybindDialogProps { option: string; @@ -124,7 +123,7 @@ class KeybindDialogComponent extends React.Component<KeybindDialogProps, Keybind let youtubeShortcuts: Keybind[]; if (/[a-zA-Z0-9,.+\-\][:]/.test(this.state.key.key)) { youtubeShortcuts = [{key: "k"}, {key: "j"}, {key: "l"}, {key: "p", shift: true}, {key: "n", shift: true}, {key: ","}, {key: "."}, {key: ",", shift: true}, {key: ".", shift: true}, - {key: "ArrowRight"}, {key: "ArrowLeft"}, {key: "ArrowUp"}, {key: "ArrowDown"}, {key: "ArrowRight", ctrl: true}, {key: "ArrowLeft", ctrl: true}, {key: "c"}, {key: "o"}, + {key: "ArrowRight"}, {key: "ArrowLeft"}, {key: "ArrowUp"}, {key: "ArrowDown"}, {key: "c"}, {key: "o"}, {key: "w"}, {key: "+"}, {key: "-"}, {key: "f"}, {key: "t"}, {key: "i"}, {key: "m"}, {key: "a"}, {key: "s"}, {key: "d"}, {key: "Home"}, {key: "End"}, {key: "0"}, {key: "1"}, {key: "2"}, {key: "3"}, {key: "4"}, {key: "5"}, {key: "6"}, {key: "7"}, {key: "8"}, {key: "9"}, {key: "]"}, {key: "["}]; } else { diff --git a/src/config.ts b/src/config.ts index 8d5ad5a0..61b32937 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1,7 +1,8 @@ import * as CompileConfig from "../config.json"; import * as invidiousList from "../ci/invidiouslist.json"; -import { Category, CategorySelection, CategorySkipOption, NoticeVisbilityMode, PreviewBarOption, SponsorTime, StorageChangesObject, Keybind, HashedValue, VideoID, SponsorHideType } from "./types"; -import { keybindEquals } from "./utils/configUtils"; +import { Category, CategorySelection, CategorySkipOption, NoticeVisbilityMode, PreviewBarOption, SponsorTime, VideoID, SponsorHideType } from "./types"; +import { Keybind, ProtoConfig, keybindEquals } from "../maze-utils/src/config"; +import { HashedValue } from "../maze-utils/src/hash"; export interface Permission { canSubmit: boolean; @@ -25,6 +26,7 @@ interface SBConfig { disableSkipping: boolean; muteSegments: boolean; fullVideoSegments: boolean; + fullVideoLabelsOnThumbnails: boolean; manualSkipOnFullVideo: boolean; trackViewCount: boolean; trackViewCountInPrivate: boolean; @@ -52,6 +54,7 @@ interface SBConfig { showDonationLink: boolean; showPopupDonationCount: number; showUpsells: boolean; + showNewFeaturePopups: boolean; donateClicked: number; autoHideInfoButton: boolean; autoSkipOnMusicVideos: boolean; @@ -68,6 +71,11 @@ interface SBConfig { showCategoryWithoutPermission: boolean; showSegmentNameInChapterBar: boolean; useVirtualTime: boolean; + showSegmentFailedToFetchWarning: boolean; + allowScrollingToEdit: boolean; + deArrowInstalled: boolean; + showDeArrowPromotion: boolean; + showZoomToFillError2: boolean; // Used to cache calculated text color info categoryPillColors: { @@ -119,7 +127,7 @@ interface SBConfig { }; } -export type VideoDownvotes = { segments: { uuid: HashedValue; hidden: SponsorHideType }[] ; lastAccess: number }; +export type VideoDownvotes = { segments: { uuid: HashedValue; hidden: SponsorHideType }[]; lastAccess: number }; interface SBStorage { /* VideoID prefixes to UUID prefixes */ @@ -127,337 +135,36 @@ interface SBStorage { navigationApiAvailable: boolean; } -export interface SBObject { - configLocalListeners: Array<(changes: StorageChangesObject) => unknown>; - configSyncListeners: Array<(changes: StorageChangesObject) => unknown>; - syncDefaults: SBConfig; - localDefaults: SBStorage; - cachedSyncConfig: SBConfig; - cachedLocalStorage: SBStorage; - config: SBConfig; - local: SBStorage; - forceSyncUpdate(prop: string): void; - forceLocalUpdate(prop: string): void; - resetToDefault(): void; +class ConfigClass extends ProtoConfig<SBConfig, SBStorage> { + resetToDefault() { + chrome.storage.sync.set({ + ...this.syncDefaults, + userID: this.config.userID, + minutesSaved: this.config.minutesSaved, + skipCount: this.config.skipCount, + sponsorTimesContributed: this.config.sponsorTimesContributed + }); + } } -const Config: SBObject = { - /** - * Callback function when an option is updated - */ - configLocalListeners: [], - configSyncListeners: [], - syncDefaults: { - userID: null, - isVip: false, - permissions: {}, - unsubmittedSegments: {}, - defaultCategory: "chooseACategory" as Category, - renderSegmentsAsChapters: false, - whitelistedChannels: [], - forceChannelCheck: false, - minutesSaved: 0, - skipCount: 0, - sponsorTimesContributed: 0, - submissionCountSinceCategories: 0, - showTimeWithSkips: true, - disableSkipping: false, - muteSegments: true, - fullVideoSegments: true, - manualSkipOnFullVideo: false, - trackViewCount: true, - trackViewCountInPrivate: true, - trackDownvotes: true, - dontShowNotice: false, - noticeVisibilityMode: NoticeVisbilityMode.FadedForAutoSkip, - hideVideoPlayerControls: false, - hideInfoButtonPlayerControls: false, - hideDeleteButtonPlayerControls: false, - hideUploadButtonPlayerControls: false, - hideSkipButtonPlayerControls: false, - hideDiscordLaunches: 0, - hideDiscordLink: false, - invidiousInstances: ["invidious.snopyta.org"], // leave as default - supportInvidious: false, - serverAddress: CompileConfig.serverAddress, - minDuration: 0, - skipNoticeDuration: 4, - audioNotificationOnSkip: false, - checkForUnlistedVideos: false, - testingServer: false, - refetchWhenNotFound: true, - ytInfoPermissionGranted: false, - allowExpirements: true, - showDonationLink: true, - showPopupDonationCount: 0, - showUpsells: true, - donateClicked: 0, - autoHideInfoButton: true, - autoSkipOnMusicVideos: false, - scrollToEditTimeUpdate: false, // false means the tooltip will be shown - categoryPillUpdate: false, - showChapterInfoMessage: true, - darkMode: true, - showCategoryGuidelines: true, - showCategoryWithoutPermission: false, - showSegmentNameInChapterBar: true, - useVirtualTime: true, - - categoryPillColors: {}, - - /** - * Default keybinds should not set "code" as that's gonna be different based on the user's locale. They should also only use EITHER ctrl OR alt modifiers (or none). - * Using ctrl+alt, or shift may produce a different character that we will not be able to recognize in different locales. - * The exception for shift is letters, where it only capitalizes. So shift+A is fine, but shift+1 isn't. - * Don't forget to add the new keybind to the checks in "KeybindDialogComponent.isKeybindAvailable()" and in "migrateOldFormats()"! - * TODO: Find a way to skip having to update these checks. Maybe storing keybinds in a Map? - */ - skipKeybind: {key: "Enter"}, - startSponsorKeybind: {key: ";"}, - submitKeybind: {key: "'"}, - nextChapterKeybind: {key: "]", ctrl: true}, - previousChapterKeybind: {key: "[", ctrl: true}, - - categorySelections: [{ - name: "sponsor" as Category, - option: CategorySkipOption.AutoSkip - }, { - name: "poi_highlight" as Category, - option: CategorySkipOption.ManualSkip - }, { - name: "exclusive_access" as Category, - option: CategorySkipOption.ShowOverlay - }], - - payments: { - licenseKey: null, - lastCheck: 0, - lastFreeCheck: 0, - freeAccess: false, - chaptersAllowed: false - }, - - colorPalette: { - red: "#780303", - white: "#ffffff", - locked: "#ffc83d" - }, - - // Preview bar - barTypes: { - "preview-chooseACategory": { - color: "#ffffff", - opacity: "0.7" - }, - "sponsor": { - color: "#00d400", - opacity: "0.7" - }, - "preview-sponsor": { - color: "#007800", - opacity: "0.7" - }, - "selfpromo": { - color: "#ffff00", - opacity: "0.7" - }, - "preview-selfpromo": { - color: "#bfbf35", - opacity: "0.7" - }, - "exclusive_access": { - color: "#008a5c", - opacity: "0.7" - }, - "interaction": { - color: "#cc00ff", - opacity: "0.7" - }, - "preview-interaction": { - color: "#6c0087", - opacity: "0.7" - }, - "intro": { - color: "#00ffff", - opacity: "0.7" - }, - "preview-intro": { - color: "#008080", - opacity: "0.7" - }, - "outro": { - color: "#0202ed", - opacity: "0.7" - }, - "preview-outro": { - color: "#000070", - opacity: "0.7" - }, - "preview": { - color: "#008fd6", - opacity: "0.7" - }, - "preview-preview": { - color: "#005799", - opacity: "0.7" - }, - "music_offtopic": { - color: "#ff9900", - opacity: "0.7" - }, - "preview-music_offtopic": { - color: "#a6634a", - opacity: "0.7" - }, - "poi_highlight": { - color: "#ff1684", - opacity: "0.7" - }, - "preview-poi_highlight": { - color: "#9b044c", - opacity: "0.7" - }, - "filler": { - color: "#7300FF", - opacity: "0.9" - }, - "preview-filler": { - color: "#2E0066", - opacity: "0.7" - } - } - }, - localDefaults: { - downvotedSegments: {}, - navigationApiAvailable: null - }, - cachedSyncConfig: null, - cachedLocalStorage: null, - config: null, - local: null, - forceSyncUpdate, - forceLocalUpdate, - resetToDefault -}; - -// Function setup - -function configProxy(): { sync: SBConfig; local: SBStorage } { - chrome.storage.onChanged.addListener((changes: {[key: string]: chrome.storage.StorageChange}, areaName) => { - if (areaName === "sync") { - for (const key in changes) { - Config.cachedSyncConfig[key] = changes[key].newValue; - } - - for (const callback of Config.configSyncListeners) { - callback(changes); - } - } else if (areaName === "local") { - for (const key in changes) { - Config.cachedLocalStorage[key] = changes[key].newValue; - } - - for (const callback of Config.configLocalListeners) { - callback(changes); - } - } - }); - - const syncHandler: ProxyHandler<SBConfig> = { - set<K extends keyof SBConfig>(obj: SBConfig, prop: K, value: SBConfig[K]) { - Config.cachedSyncConfig[prop] = value; - - chrome.storage.sync.set({ - [prop]: value - }); - - return true; - }, - - get<K extends keyof SBConfig>(obj: SBConfig, prop: K): SBConfig[K] { - const data = Config.cachedSyncConfig[prop]; - - return obj[prop] || data; - }, - - deleteProperty(obj: SBConfig, prop: keyof SBConfig) { - chrome.storage.sync.remove(<string> prop); - - return true; - } - - }; +function migrateOldSyncFormats(config: SBConfig) { + if (config["showZoomToFillError"]) { + chrome.storage.sync.remove("showZoomToFillError"); + } - const localHandler: ProxyHandler<SBStorage> = { - set<K extends keyof SBStorage>(obj: SBStorage, prop: K, value: SBStorage[K]) { - Config.cachedLocalStorage[prop] = value; + if (!config["chapterCategoryAdded"]) { + config["chapterCategoryAdded"] = true; - chrome.storage.local.set({ - [prop]: value + if (!config.categorySelections.some((s) => s.name === "chapter")) { + config.categorySelections.push({ + name: "chapter" as Category, + option: CategorySkipOption.ShowOverlay }); - - return true; - }, - - get<K extends keyof SBStorage>(obj: SBStorage, prop: K): SBStorage[K] { - const data = Config.cachedLocalStorage[prop]; - - return obj[prop] || data; - }, - - deleteProperty(obj: SBStorage, prop: keyof SBStorage) { - chrome.storage.local.remove(<string> prop); - - return true; - } - - }; - - return { - sync: new Proxy<SBConfig>({ handler: syncHandler } as unknown as SBConfig, syncHandler), - local: new Proxy<SBStorage>({ handler: localHandler } as unknown as SBStorage, localHandler) - }; -} - -function forceSyncUpdate(prop: string): void { - const value = Config.cachedSyncConfig[prop]; - if (prop === "unsubmittedSegments") { - // Early to be safe - if (JSON.stringify(value).length + prop.length > 8000) { - for (const key in value) { - if (!value[key] || value[key].length <= 0) { - delete value[key]; - } - } + + config.categorySelections = config.categorySelections; } } - chrome.storage.sync.set({ - [prop]: value - }); -} - -function forceLocalUpdate(prop: string): void { - chrome.storage.local.set({ - [prop]: Config.cachedLocalStorage[prop] - }); -} - -async function fetchConfig(): Promise<void> { - await Promise.all([new Promise<void>((resolve) => { - chrome.storage.sync.get(null, function(items) { - Config.cachedSyncConfig = <SBConfig> <unknown> items; - resolve(); - }); - }), new Promise<void>((resolve) => { - chrome.storage.local.get(null, function(items) { - Config.cachedLocalStorage = <SBStorage> <unknown> items; - resolve(); - }); - })]); -} - -function migrateOldSyncFormats(config: SBConfig) { if (config["segmentTimes"]) { const unsubmittedSegments = {}; for (const item of config["segmentTimes"]) { @@ -467,15 +174,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) { @@ -496,7 +196,7 @@ function migrateOldSyncFormats(config: SBConfig) { config["autoSkipOnMusicVideosUpdate"] = true; for (const selection of config.categorySelections) { if (selection.name === "music_offtopic" - && selection.option === CategorySkipOption.AutoSkip) { + && selection.option === CategorySkipOption.AutoSkip) { config.autoSkipOnMusicVideos = true; break; @@ -515,20 +215,20 @@ function migrateOldSyncFormats(config: SBConfig) { } if (typeof config["skipKeybind"] == "string") { - config["skipKeybind"] = {key: config["skipKeybind"]}; + config["skipKeybind"] = { key: config["skipKeybind"] }; } if (typeof config["startSponsorKeybind"] == "string") { - config["startSponsorKeybind"] = {key: config["startSponsorKeybind"]}; + config["startSponsorKeybind"] = { key: config["startSponsorKeybind"] }; } if (typeof config["submitKeybind"] == "string") { - config["submitKeybind"] = {key: config["submitKeybind"]}; + config["submitKeybind"] = { key: config["submitKeybind"] }; } // Unbind key if it matches a previous one set by the user (should be ordered oldest to newest) const keybinds = ["skipKeybind", "startSponsorKeybind", "submitKeybind"]; - for (let i = keybinds.length-1; i >= 0; i--) { + for (let i = keybinds.length - 1; i >= 0; i--) { for (let j = 0; j < keybinds.length; j++) { if (i == j) continue; @@ -546,59 +246,210 @@ function migrateOldSyncFormats(config: SBConfig) { } // populate invidiousInstances with new instances if 3p support is **DISABLED** - if (!config["supportInvidious"] && config["invidiousInstances"].length !== invidiousList.length) { - config["invidiousInstances"] = invidiousList; + if (!config["supportInvidious"] && config["invidiousInstances"].length < invidiousList.length) { + config["invidiousInstances"] = [...new Set([...invidiousList, ...config["invidiousInstances"]])]; } - + if (config["lastIsVipUpdate"]) { chrome.storage.sync.remove("lastIsVipUpdate"); } } -async function setupConfig() { - if (typeof(chrome) === "undefined") return; +const syncDefaults = { + userID: null, + isVip: false, + permissions: {}, + unsubmittedSegments: {}, + defaultCategory: "chooseACategory" as Category, + renderSegmentsAsChapters: false, + whitelistedChannels: [], + forceChannelCheck: false, + minutesSaved: 0, + skipCount: 0, + sponsorTimesContributed: 0, + submissionCountSinceCategories: 0, + showTimeWithSkips: true, + disableSkipping: false, + muteSegments: true, + fullVideoSegments: true, + fullVideoLabelsOnThumbnails: true, + manualSkipOnFullVideo: false, + trackViewCount: true, + trackViewCountInPrivate: true, + trackDownvotes: true, + dontShowNotice: false, + noticeVisibilityMode: NoticeVisbilityMode.FadedForAutoSkip, + hideVideoPlayerControls: false, + hideInfoButtonPlayerControls: false, + hideDeleteButtonPlayerControls: false, + hideUploadButtonPlayerControls: false, + hideSkipButtonPlayerControls: false, + hideDiscordLaunches: 0, + hideDiscordLink: false, + invidiousInstances: ["invidious.snopyta.org"], // leave as default + supportInvidious: false, + serverAddress: CompileConfig.serverAddress, + minDuration: 0, + skipNoticeDuration: 4, + audioNotificationOnSkip: false, + checkForUnlistedVideos: false, + testingServer: false, + refetchWhenNotFound: true, + ytInfoPermissionGranted: false, + allowExpirements: true, + showDonationLink: true, + showPopupDonationCount: 0, + showUpsells: true, + showNewFeaturePopups: true, + donateClicked: 0, + autoHideInfoButton: true, + autoSkipOnMusicVideos: false, + scrollToEditTimeUpdate: false, // false means the tooltip will be shown + categoryPillUpdate: false, + showChapterInfoMessage: true, + darkMode: true, + showCategoryGuidelines: true, + showCategoryWithoutPermission: false, + showSegmentNameInChapterBar: true, + useVirtualTime: true, + showSegmentFailedToFetchWarning: true, + allowScrollingToEdit: true, + deArrowInstalled: false, + showDeArrowPromotion: true, + showZoomToFillError2: true, + + categoryPillColors: {}, - await fetchConfig(); - addDefaults(); - const config = configProxy(); - migrateOldSyncFormats(config.sync); + /** + * Default keybinds should not set "code" as that's gonna be different based on the user's locale. They should also only use EITHER ctrl OR alt modifiers (or none). + * Using ctrl+alt, or shift may produce a different character that we will not be able to recognize in different locales. + * The exception for shift is letters, where it only capitalizes. So shift+A is fine, but shift+1 isn't. + * Don't forget to add the new keybind to the checks in "KeybindDialogComponent.isKeybindAvailable()" and in "migrateOldFormats()"! + * TODO: Find a way to skip having to update these checks. Maybe storing keybinds in a Map? + */ + skipKeybind: { key: "Enter" }, + startSponsorKeybind: { key: ";" }, + submitKeybind: { key: "'" }, + nextChapterKeybind: { key: "ArrowRight", ctrl: true }, + previousChapterKeybind: { key: "ArrowLeft", ctrl: true }, + + categorySelections: [{ + name: "sponsor" as Category, + option: CategorySkipOption.AutoSkip + }, { + name: "poi_highlight" as Category, + option: CategorySkipOption.ManualSkip + }, { + name: "exclusive_access" as Category, + option: CategorySkipOption.ShowOverlay + }, { + name: "chapter" as Category, + option: CategorySkipOption.ShowOverlay + }], - Config.config = config.sync; - Config.local = config.local; -} + payments: { + licenseKey: null, + lastCheck: 0, + lastFreeCheck: 0, + freeAccess: false, + chaptersAllowed: false + }, -// Add defaults -function addDefaults() { - for (const key in Config.syncDefaults) { - if(!Object.prototype.hasOwnProperty.call(Config.cachedSyncConfig, key)) { - Config.cachedSyncConfig[key] = Config.syncDefaults[key]; - } else if (key === "barTypes") { - for (const key2 in Config.syncDefaults[key]) { - if(!Object.prototype.hasOwnProperty.call(Config.cachedSyncConfig[key], key2)) { - Config.cachedSyncConfig[key][key2] = Config.syncDefaults[key][key2]; - } - } - } - } + colorPalette: { + red: "#780303", + white: "#ffffff", + locked: "#ffc83d" + }, - for (const key in Config.localDefaults) { - if(!Object.prototype.hasOwnProperty.call(Config.cachedLocalStorage, key)) { - Config.cachedLocalStorage[key] = Config.localDefaults[key]; + // Preview bar + barTypes: { + "preview-chooseACategory": { + color: "#ffffff", + opacity: "0.7" + }, + "sponsor": { + color: "#00d400", + opacity: "0.7" + }, + "preview-sponsor": { + color: "#007800", + opacity: "0.7" + }, + "selfpromo": { + color: "#ffff00", + opacity: "0.7" + }, + "preview-selfpromo": { + color: "#bfbf35", + opacity: "0.7" + }, + "exclusive_access": { + color: "#008a5c", + opacity: "0.7" + }, + "interaction": { + color: "#cc00ff", + opacity: "0.7" + }, + "preview-interaction": { + color: "#6c0087", + opacity: "0.7" + }, + "intro": { + color: "#00ffff", + opacity: "0.7" + }, + "preview-intro": { + color: "#008080", + opacity: "0.7" + }, + "outro": { + color: "#0202ed", + opacity: "0.7" + }, + "preview-outro": { + color: "#000070", + opacity: "0.7" + }, + "preview": { + color: "#008fd6", + opacity: "0.7" + }, + "preview-preview": { + color: "#005799", + opacity: "0.7" + }, + "music_offtopic": { + color: "#ff9900", + opacity: "0.7" + }, + "preview-music_offtopic": { + color: "#a6634a", + opacity: "0.7" + }, + "poi_highlight": { + color: "#ff1684", + opacity: "0.7" + }, + "preview-poi_highlight": { + color: "#9b044c", + opacity: "0.7" + }, + "filler": { + color: "#7300FF", + opacity: "0.9" + }, + "preview-filler": { + color: "#2E0066", + opacity: "0.7" } } -} - -function resetToDefault() { - chrome.storage.sync.set({ - ...Config.syncDefaults, - userID: Config.config.userID, - minutesSaved: Config.config.minutesSaved, - skipCount: Config.config.skipCount, - sponsorTimesContributed: Config.config.sponsorTimesContributed - }); -} +}; -// Sync config -setupConfig(); +const localDefaults = { + downvotedSegments: {}, + navigationApiAvailable: null +}; -export default Config; +const Config = new ConfigClass(syncDefaults, localDefaults, migrateOldSyncFormats); +export default Config;
\ No newline at end of file diff --git a/src/content.ts b/src/content.ts index 8f75954f..48fa4fcd 100644 --- a/src/content.ts +++ b/src/content.ts @@ -6,16 +6,12 @@ import { ChannelIDInfo, ChannelIDStatus, ContentContainer, - HashedValue, - Keybind, - PageType, ScheduledTime, SegmentUUID, SkipToTimeParams, SponsorHideType, SponsorSourceType, SponsorTime, - StorageChangesObject, ToggleSkippable, VideoID, VideoInfo, @@ -28,8 +24,7 @@ import SubmissionNotice from "./render/SubmissionNotice"; import { Message, MessageResponse, VoteResponse } from "./messageTypes"; import { SkipButtonControlBar } from "./js-components/skipButtonControlBar"; import { getStartTimeFromUrl } from "./utils/urlParser"; -import { findValidElement, getControls, getExistingChapters, getHashParams, isVisible } from "./utils/pageUtils"; -import { isSafari, keybindEquals } from "./utils/configUtils"; +import { getControls, getExistingChapters, getHashParams, isPlayingPlaylist, isVisible } from "./utils/pageUtils"; import { CategoryPill } from "./render/CategoryPill"; import { AnimationUtils } from "./utils/animationUtils"; import { GenericUtils } from "./utils/genericUtils"; @@ -37,43 +32,98 @@ import { logDebug } from "./utils/logger"; import { importTimes } from "./utils/exporter"; import { ChapterVote } from "./render/ChapterVote"; import { openWarningDialog } from "./utils/warnings"; +import { isFirefoxOrSafari, waitFor } from "../maze-utils/src"; +import { getErrorMessage, getFormattedTime } from "../maze-utils/src/formating"; +import { getChannelIDInfo, getVideo, getIsAdPlaying, getIsLivePremiere, setIsAdPlaying, checkVideoIDChange, getVideoID, getYouTubeVideoID, setupVideoModule, checkIfNewVideoID, isOnInvidious, isOnMobileYouTube } from "../maze-utils/src/video"; +import { Keybind, StorageChangesObject, isSafari, keybindEquals } from "../maze-utils/src/config"; +import { findValidElement, waitForElement } from "../maze-utils/src/dom" +import { getHash, HashedValue } from "../maze-utils/src/hash"; +import { generateUserID } from "../maze-utils/src/setup"; +import { updateAll } from "../maze-utils/src/thumbnailManagement"; +import { setupThumbnailListener } from "./utils/thumbnails"; +import * as documentScript from "../dist/js/document.js"; import { Tooltip } from "./render/Tooltip"; -import { noRefreshFetchingChaptersAllowed } from "./utils/licenseKey"; +import { isDeArrowInstalled } from "./utils/crossExtension"; +import { runCompatibilityChecks } from "./utils/compatibility"; +import { cleanPage } from "./utils/pageCleaner"; +import { addCleanupListener } from "../maze-utils/src/cleanup"; + +cleanPage(); const utils = new Utils(); -// Hack to get the CSS loaded on permission-based sites (Invidious) -utils.wait(() => Config.config !== null, 5000, 10).then(addCSS); +utils.wait(() => Config.isReady(), 5000, 10).then(() => { + // Hack to get the CSS loaded on permission-based sites (Invidious) + addCSS(); + setCategoryColorCSSVariables(); + + // DeArrow promotion + setTimeout(async () => { + if (document.URL === "https://www.youtube.com/" + && Config.config.showDeArrowPromotion + && Config.config.showUpsells + && Config.config.showNewFeaturePopups + && (Config.config.skipCount > 30 || !Config.config.trackViewCount) + && Math.random() < 0.05) { + + if (!await isDeArrowInstalled()) { + const element = await waitForElement("#contents") as HTMLElement; + if (element) { + Config.config.showDeArrowPromotion = false; + + new Tooltip({ + text: chrome.i18n.getMessage("DeArrowPromotionMessage2"), + linkOnClick: () => window.open("https://dearrow.ajay.app"), + referenceNode: element, + prependElement: element.firstElementChild as HTMLElement, + timeout: 15000, + positionRealtive: false, + containerAbsolute: true, + bottomOffset: "inherit", + topOffset: "-82px", + leftOffset: "0", + rightOffset: "0", + displayTriangle: false, + center: true, + opacity: 1 + }); + } + } else { + Config.config.showDeArrowPromotion = false; + } + } + }, 5000); + + runCompatibilityChecks(); +}); + +const skipBuffer = 0.003; //was sponsor data found when doing SponsorsLookup let sponsorDataFound = false; //the actual sponsorTimes if loaded and UUIDs associated with them let sponsorTimes: SponsorTime[] = []; let existingChaptersImported = false; -//what video id are these sponsors for -let sponsorVideoID: VideoID = null; +let importingChaptersWaitingForFocus = false; // List of open skip notices const skipNotices: SkipNotice[] = []; let activeSkipKeybindElement: ToggleSkippable = null; let retryFetchTimeout: NodeJS.Timeout = null; +let shownSegmentFailedToFetchWarning = false; // JSON video info let videoInfo: VideoInfo = null; -// Page Type - browse/watch etc... -let pageType: PageType; -// if video is live or premiere -let isLivePremiere: boolean -// The channel this video is about -let channelIDInfo: ChannelIDInfo; // Locked Categories in this tab, like: ["sponsor","intro","outro"] let lockedCategories: Category[] = []; // Used to calculate a more precise "virtual" video time -let lastKnownVideoTime: { videoTime: number; preciseTime: number } = { +const lastKnownVideoTime: { videoTime: number; preciseTime: number; fromPause: boolean; approximateDelay: number } = { videoTime: null, - preciseTime: null + preciseTime: null, + fromPause: false, + approximateDelay: null, }; // It resumes with a slightly later time on chromium -let lastTimeFromWaitingEvent = null; +let lastTimeFromWaitingEvent: number = null; const lastNextChapterKeybind = { time: 0, date: 0 @@ -84,22 +134,30 @@ const lastNextChapterKeybind = { // Skips are canceled every seeking event let currentSkipSchedule: NodeJS.Timeout = null; let currentSkipInterval: NodeJS.Timeout = null; +let currentVirtualTimeInterval: NodeJS.Timeout = null; /** Has the sponsor been skipped */ let sponsorSkipped: boolean[] = []; -//the video -let video: HTMLVideoElement; let videoMuted = false; // Has it been attempted to be muted -let videoMutationObserver: MutationObserver = null; -let waitingForNewVideo = false; -// List of videos that have had event listeners added to them -const videosWithEventListeners: HTMLVideoElement[] = []; -const controlsWithEventListeners: HTMLElement[] = [] - -// This misleading variable name will be fixed soon -let onInvidious: boolean; -let onMobileYouTube: boolean; +const controlsWithEventListeners: HTMLElement[] = []; + +setupVideoModule({ + videoIDChange, + channelIDChange, + videoElementChange, + playerInit: () => { + previewBar = null; // remove old previewbar + createPreviewBar(); + }, + updatePlayerBar: () => { + updatePreviewBar(); + updateVisibilityOfPlayerControlsButton(); + }, + resetValues, + documentScript +}, () => Config); +setupThumbnailListener(); //the video id of the last preview bar update let lastPreviewBarUpdate: VideoID; @@ -127,13 +185,6 @@ let controls: HTMLElement | null = null; /** Contains buttons created by `createButton()`. */ const playerButtons: Record<string, {button: HTMLButtonElement; image: HTMLImageElement; setupListener: boolean}> = {}; -// Direct Links after the config is loaded -utils.wait(() => Config.config !== null, 1000, 1).then(() => videoIDChange(getYouTubeVideoID(document))); -// wait for hover preview to appear, and refresh attachments if ever found -utils.waitForElement(".ytp-inline-preview-ui").then(() => refreshVideoAttachments()); -utils.waitForElement("a.ytp-title-link[data-sessionlink='feature=player-title']") - .then(() => videoIDChange(getYouTubeVideoID(document))); -addPageListeners(); addHotkeyListener(); /** Segments created by the user which have not yet been submitted. */ @@ -146,11 +197,9 @@ let popupInitialised = false; let submissionNotice: SubmissionNotice = null; -// If there is an advert playing (or about to be played), this is true -let isAdPlaying = false; - let lastResponseStatus: number; let retryCount = 0; +let lookupWaiting = false; // Contains all of the functions and variables needed by the skip notice const skipNoticeContentContainer: ContentContainer = () => ({ @@ -160,11 +209,11 @@ const skipNoticeContentContainer: ContentContainer = () => ({ sponsorTimes, sponsorTimesSubmitting, skipNotices, - v: video, - sponsorVideoID, + v: getVideo(), + sponsorVideoID: getVideoID(), reskipSponsorTime, updatePreviewBar, - onMobileYouTube, + onMobileYouTube: isOnMobileYouTube(), sponsorSubmissionNotice: submissionNotice, resetSponsorSubmissionNotice, updateEditButtonsOnPlayer, @@ -172,7 +221,7 @@ const skipNoticeContentContainer: ContentContainer = () => ({ videoInfo, getRealCurrentTime: getRealCurrentTime, lockedCategories, - channelIDInfo + channelIDInfo: getChannelIDInfo() }); // value determining when to count segment as skipped and send telemetry to server (percent based) @@ -185,7 +234,7 @@ function messageListener(request: Message, sender: unknown, sendResponse: (respo //messages from popup script switch(request.message){ case "update": - videoIDChange(getYouTubeVideoID(document)); + checkVideoIDChange(); break; case "sponsorStart": startOrEndTimingNewSegment() @@ -201,8 +250,8 @@ function messageListener(request: Message, sender: unknown, sendResponse: (respo found: sponsorDataFound, status: lastResponseStatus, sponsorTimes: sponsorTimes, - time: video.currentTime, - onMobileYouTube + time: getVideo().currentTime, + onMobileYouTube: isOnMobileYouTube() }); if (!request.updating && popupInitialised && document.getElementById("sponsorBlockPopupContainer") != null) { @@ -214,13 +263,13 @@ function messageListener(request: Message, sender: unknown, sendResponse: (respo break; case "getVideoID": sendResponse({ - videoID: sponsorVideoID, + videoID: getVideoID(), }); break; case "getChannelID": sendResponse({ - channelID: channelIDInfo.id + channelID: getChannelIDInfo().id }); break; @@ -240,7 +289,7 @@ function messageListener(request: Message, sender: unknown, sendResponse: (respo break; case "refreshSegments": // update video on refresh if videoID invalid - if (!sponsorVideoID) videoIDChange(getYouTubeVideoID(document)); + if (!getVideoID()) checkVideoIDChange(); // fetch segments sponsorsLookup(false); @@ -256,8 +305,13 @@ function messageListener(request: Message, sender: unknown, sendResponse: (respo return true; case "hideSegment": utils.getSponsorTimeFromUUID(sponsorTimes, request.UUID).hidden = request.type; - utils.addHiddenSegment(sponsorVideoID, request.UUID, request.type); + utils.addHiddenSegment(getVideoID(), request.UUID, request.type); updatePreviewBar(); + + if (skipButtonControlBar?.isEnabled() + && sponsorTimesSubmitting.every((s) => s.hidden !== SponsorHideType.Visible || s.actionType !== ActionType.Poi)) { + skipButtonControlBar.disable(); + } break; case "closePopup": closeInfoMenu(); @@ -266,24 +320,30 @@ function messageListener(request: Message, sender: unknown, sendResponse: (respo navigator.clipboard.writeText(request.text); break; case "importSegments": { - const importedSegments = importTimes(request.data, video.duration); + const importedSegments = importTimes(request.data, getVideo().duration); let addedSegments = false; for (const segment of importedSegments) { if (!sponsorTimesSubmitting.some( (s) => Math.abs(s.segment[0] - segment.segment[0]) < 1 - && Math.abs(s.segment[1] - segment.segment[1]) < 1) - && (segment.category !== "chapter" || utils.getCategorySelection("chapter"))) { + && Math.abs(s.segment[1] - segment.segment[1]) < 1)) { + if (segment.category === "chapter" && !utils.getCategorySelection("chapter")) { + segment.category = "chooseACategory" as Category; + segment.actionType = ActionType.Skip; + segment.description = ""; + } + sponsorTimesSubmitting.push(segment); addedSegments = true; } } if (addedSegments) { - Config.config.unsubmittedSegments[sponsorVideoID] = sponsorTimesSubmitting; + Config.config.unsubmittedSegments[getVideoID()] = sponsorTimesSubmitting; Config.forceSyncUpdate("unsubmittedSegments"); updateEditButtonsOnPlayer(); updateSponsorTimesSubmitting(false); + submitSponsorTimes(); } sendResponse({ @@ -292,7 +352,7 @@ function messageListener(request: Message, sender: unknown, sendResponse: (respo break; } case "keydown": - document.dispatchEvent(new KeyboardEvent('keydown', { + (document.body || document).dispatchEvent(new KeyboardEvent('keydown', { key: request.key, keyCode: request.keyCode, code: request.code, @@ -322,6 +382,13 @@ function contentConfigUpdateListener(changes: StorageChangesObject) { case "categorySelections": sponsorsLookup(); break; + case "barTypes": + setCategoryColorCSSVariables(); + break; + case "fullVideoSegments": + case "fullVideoLabelsOnThumbnails": + updateAll(); + break; } } } @@ -338,17 +405,12 @@ function resetValues() { sponsorTimes = []; existingChaptersImported = false; sponsorSkipped = []; + lastResponseStatus = 0; + shownSegmentFailedToFetchWarning = false; - sponsorVideoID = null; videoInfo = null; - pageType = null; channelWhitelisted = false; - channelIDInfo = { - status: ChannelIDStatus.Fetching, - id: null - }; lockedCategories = []; - isLivePremiere = false; //empty the preview bar if (previewBar !== null) { @@ -366,52 +428,18 @@ function resetValues() { logDebug("Setting switching videos to true (reset data)"); } - // Reset advert playing flag - isAdPlaying = false; + skipButtonControlBar?.disable(); + categoryPill?.setVisibility(false); for (let i = 0; i < skipNotices.length; i++) { skipNotices.pop()?.close(); } - - skipButtonControlBar?.disable(); - categoryPill?.setVisibility(false); } -async function videoIDChange(id: string): Promise<void> { - // don't switch to invalid value - if (!id && sponsorVideoID && !document?.URL?.includes("youtube.com/clip/")) return; - //if the id has not changed return unless the video element has changed - if (sponsorVideoID === id && (isVisible(video) || !video)) return; - - resetValues(); - sponsorVideoID = id; - - //id is not valid - if (!id) return; - - // Wait for options to be ready - await utils.wait(() => Config.config !== null, 5000, 1); - - // If enabled, it will check if this video is private or unlisted and double check with the user if the sponsors should be looked up - if (Config.config.checkForUnlistedVideos) { - const shouldContinue = confirm("SponsorBlock: You have the setting 'Ignore Unlisted/Private Videos' enabled." - + " Due to a change in how segment fetching works, this setting is not needed anymore as it cannot leak your video ID to the server." - + " It instead sends just the first 4 characters of a longer hash of the videoID to the server, and filters through a subset of the database." - + " More info about this implementation can be found here: https://github.com/ajayyy/SponsorBlockServer/issues/25" - + "\n\nPlease click okay to confirm that you acknowledge this and continue using SponsorBlock."); - if (shouldContinue) { - Config.config.checkForUnlistedVideos = false; - } else { - return; - } - } - - // Update whitelist data when the video data is loaded - whitelistCheck(); - +function videoIDChange(): void { //setup the preview bar if (previewBar === null) { - if (onMobileYouTube) { + if (isOnMobileYouTube()) { // Mobile YouTube workaround const observer = new MutationObserver(handleMobileControlsMutations); let controlsContainer = null; @@ -434,7 +462,7 @@ async function videoIDChange(id: string): Promise<void> { // Notify the popup about the video change chrome.runtime.sendMessage({ message: "videoChanged", - videoID: sponsorVideoID, + videoID: getVideoID(), whitelisted: channelWhitelisted }); @@ -449,6 +477,8 @@ async function videoIDChange(id: string): Promise<void> { } function handleMobileControlsMutations(): void { + if (!chrome.runtime?.id) return; + updateVisibilityOfPlayerControlsButton(); skipButtonControlBar?.updateMobileControls(); @@ -499,6 +529,14 @@ function createPreviewBar(): void { // For Invidious/VideoJS selector: ".vjs-progress-holder", isVisibleCheck: false + }, { + // For Youtube Music and YTKids + // there are two sliders, one for volume and one for progress - both called #progressContainer + selector: "#progress-bar>#sliderContainer>div>#sliderBar>#progressContainer", + }, { + // For piped + selector: ".shaka-ad-markers", + isVisibleCheck: false } ]; @@ -508,7 +546,7 @@ function createPreviewBar(): void { if (el) { const chapterVote = new ChapterVote(voteAsync); - previewBar = new PreviewBar(el, onMobileYouTube, onInvidious, chapterVote, () => importExistingChapters(false)); + previewBar = new PreviewBar(el, isOnMobileYouTube(), isOnInvidious(), chapterVote, () => importExistingChapters(true)); updatePreviewBar(); @@ -553,11 +591,11 @@ function cancelSponsorSchedule(): void { /** * @param currentTime Optional if you don't want to use the actual current time */ -function startSponsorSchedule(includeIntersectingSegments = false, currentTime?: number, includeNonIntersectingSegments = true): void { +async function startSponsorSchedule(includeIntersectingSegments = false, currentTime?: number, includeNonIntersectingSegments = true): Promise<void> { cancelSponsorSchedule(); // Don't skip if advert playing and reset last checked time - if (isAdPlaying) { + if (getIsAdPlaying()) { // Reset lastCheckVideoTime lastCheckVideoTime = -1; lastCheckTime = 0; @@ -566,34 +604,31 @@ function startSponsorSchedule(includeIntersectingSegments = false, currentTime?: return; } - // ensure we are on the correct video - const newVideoID = getYouTubeVideoID(document); - if (newVideoID !== sponsorVideoID) { - videoIDChange(newVideoID); + // Give up if video changed, and trigger a videoID change if so + if (await checkIfNewVideoID()) { return; } - logDebug(`Considering to start skipping: ${!video}, ${video?.paused}`); - if (!video) return; + logDebug(`Considering to start skipping: ${!getVideo()}, ${getVideo()?.paused}`); + if (!getVideo()) return; if (currentTime === undefined || currentTime === null) { currentTime = getVirtualTime(); } - lastTimeFromWaitingEvent = null; + clearWaitingTime(); updateActiveSegment(currentTime); - if (video.paused) return; + if (getVideo().paused) return; const skipInfo = getNextSkipIndex(currentTime, includeIntersectingSegments, includeNonIntersectingSegments); const currentSkip = skipInfo.array[skipInfo.index]; const skipTime: number[] = [currentSkip?.scheduledTime, skipInfo.array[skipInfo.endIndex]?.segment[1]]; const timeUntilSponsor = skipTime?.[0] - currentTime; - const videoID = sponsorVideoID; - const skipBuffer = 0.003; + const videoID = getVideoID(); if (videoMuted && !inMuteSegment(currentTime, skipInfo.index !== -1 && timeUntilSponsor < skipBuffer && shouldAutoSkip(currentSkip))) { - video.muted = false; + getVideo().muted = false; videoMuted = false; for (const notice of skipNotices) { @@ -605,7 +640,7 @@ function startSponsorSchedule(includeIntersectingSegments = false, currentTime?: logDebug(`Ready to start skipping: ${skipInfo.index} at ${currentTime}`); if (skipInfo.index === -1) return; - if (Config.config.disableSkipping || channelWhitelisted || (channelIDInfo.status === ChannelIDStatus.Fetching && Config.config.forceChannelCheck)){ + if (Config.config.disableSkipping || channelWhitelisted || (getChannelIDInfo().status === ChannelIDStatus.Fetching && Config.config.forceChannelCheck)){ return; } @@ -633,12 +668,12 @@ function startSponsorSchedule(includeIntersectingSegments = false, currentTime?: let forcedIncludeNonIntersectingSegments = true; if (incorrectVideoCheck(videoID, currentSkip)) return; - forceVideoTime ||= Math.max(video.currentTime, getVirtualTime()); + forceVideoTime ||= Math.max(getVideo().currentTime, getVirtualTime()); if ((shouldSkip(currentSkip) || sponsorTimesSubmitting?.some((segment) => segment.segment === currentSkip.segment))) { if (forceVideoTime >= skipTime[0] - skipBuffer && forceVideoTime < skipTime[1]) { skipToTime({ - v: video, + v: getVideo(), skipTime, skippingSegments, openNotice: skipInfo.openNotice @@ -649,7 +684,7 @@ function startSponsorSchedule(includeIntersectingSegments = false, currentTime?: const extraSkip = skipInfo.array[extra]; if (shouldSkip(extraSkip)) { skipToTime({ - v: video, + v: getVideo(), skipTime: [extraSkip.scheduledTime, extraSkip.segment[1]], skippingSegments: [extraSkip], openNotice: skipInfo.openNotice @@ -672,50 +707,85 @@ function startSponsorSchedule(includeIntersectingSegments = false, currentTime?: forcedSkipTime = forceVideoTime + 0.001; } + // Don't pretend to be earlier than we are, could result in loops + if (forcedSkipTime !== null && forceVideoTime > forcedSkipTime) { + forcedSkipTime = forceVideoTime; + } + startSponsorSchedule(forcedIncludeIntersectingSegments, forcedSkipTime, forcedIncludeNonIntersectingSegments); }; if (timeUntilSponsor < skipBuffer) { skippingFunction(currentTime); } else { - const delayTime = timeUntilSponsor * 1000 * (1 / video.playbackRate); - if (delayTime < 300) { + let delayTime = timeUntilSponsor * 1000 * (1 / getVideo().playbackRate); + if (delayTime < (isFirefoxOrSafari() && !isSafari() ? 750 : 300)) { + let forceStartIntervalTime: number | null = null; + if (isFirefoxOrSafari() && !isSafari() && delayTime > 300) { + forceStartIntervalTime = await waitForNextTimeChange(); + } + // Use interval instead of timeout near the end to combat imprecise video time - const startIntervalTime = performance.now(); - const startVideoTime = Math.max(currentTime, video.currentTime); - logDebug(`Starting setInterval skipping ${video.currentTime} to skip at ${skipTime[0]}`); + 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 (isFirefoxOrSafari() && !lastKnownVideoTime.fromPause && startWaitingForReportedTimeToChange + && reportedVideoTimeAtStart !== getVideo().currentTime) { + startWaitingForReportedTimeToChange = false; + const delay = getVirtualTime() - getVideo().currentTime; + if (delay > 0) lastKnownVideoTime.approximateDelay = delay; + } + const intervalDuration = performance.now() - startIntervalTime; - if (intervalDuration >= delayTime || video.currentTime >= skipTime[0]) { + if (intervalDuration + skipBuffer * 1000 >= delayTime || getVideo().currentTime >= skipTime[0]) { clearInterval(currentSkipInterval); - if (!utils.isFirefox() && !video.muted) { + if (!isFirefoxOrSafari() && !getVideo().muted && !inMuteSegment(getVideo().currentTime, true)) { // Workaround for more accurate skipping on Chromium - video.muted = true; - video.muted = false; + getVideo().muted = true; + getVideo().muted = false; } - skippingFunction(Math.max(video.currentTime, startVideoTime + video.playbackRate * intervalDuration / 1000)); + skippingFunction(Math.max(getVideo().currentTime, startVideoTime + getVideo().playbackRate * Math.max(delayTime, intervalDuration) / 1000)); } - }, 1); + }, 0); } else { - logDebug(`Starting timeout to skip ${video.currentTime} to skip at ${skipTime[0]}`); + logDebug(`Starting timeout to skip ${getVideo().currentTime} to skip at ${skipTime[0]}`); + const offset = (isFirefoxOrSafari() && !isSafari() ? 600 : 150); // Schedule for right before to be more precise than normal timeout - currentSkipSchedule = setTimeout(skippingFunction, Math.max(0, delayTime - 150)); + currentSkipSchedule = setTimeout(skippingFunction, Math.max(0, delayTime - offset)); } } } +/** + * Used on Firefox only, waits for the next animation frame until + * the video time has changed + */ +function waitForNextTimeChange(): Promise<DOMHighResTimeStamp | null> { + return new Promise((resolve) => { + getVideo().addEventListener("timeupdate", () => resolve(performance.now()), { once: true }); + }); +} + function getVirtualTime(): number { - const virtualTime = lastTimeFromWaitingEvent ?? (lastKnownVideoTime.videoTime ? - (performance.now() - lastKnownVideoTime.preciseTime) * video.playbackRate / 1000 + lastKnownVideoTime.videoTime : null); + const virtualTime = lastTimeFromWaitingEvent ?? (lastKnownVideoTime.videoTime !== null ? + (performance.now() - lastKnownVideoTime.preciseTime) * getVideo().playbackRate / 1000 + lastKnownVideoTime.videoTime : null); - if (Config.config.useVirtualTime && !isSafari() && virtualTime - && Math.abs(virtualTime - video.currentTime) < 0.6 && video.currentTime !== 0) { - return virtualTime; + if (Config.config.useVirtualTime && !isSafari() && virtualTime + && Math.abs(virtualTime - getVideo().currentTime) < 0.2 && getVideo().currentTime !== 0) { + return Math.max(virtualTime, getVideo().currentTime); } else { - return video.currentTime; + return getVideo().currentTime; } } @@ -730,16 +800,18 @@ function inMuteSegment(currentTime: number, includeOverlap: boolean): boolean { * This makes sure the videoID is still correct and if the sponsorTime is included */ function incorrectVideoCheck(videoID?: string, sponsorTime?: SponsorTime): boolean { - const currentVideoID = getYouTubeVideoID(document); - if (currentVideoID !== (videoID || sponsorVideoID) || (sponsorTime - && (!sponsorTimes || !sponsorTimes?.some((time) => time.segment === sponsorTime.segment)) - && !sponsorTimesSubmitting.some((time) => time.segment === sponsorTime.segment))) { + const currentVideoID = getYouTubeVideoID(); + const recordedVideoID = videoID || getVideoID(); + if (currentVideoID !== recordedVideoID || (sponsorTime + && (!sponsorTimes || !sponsorTimes?.some((time) => time.segment[0] === sponsorTime.segment[0] && time.segment[1] === sponsorTime.segment[1])) + && !sponsorTimesSubmitting.some((time) => time.segment[0] === sponsorTime.segment[0] && time.segment[1] === sponsorTime.segment[1]))) { // 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: " + sponsorVideoID + ". Actual VideoID: " + currentVideoID); + console.error("[SponsorBlock] VideoID recorded: " + recordedVideoID + ". Actual VideoID: " + currentVideoID); + console.error("[SponsorBlock] SponsorTime", sponsorTime, "sponsorTimes", sponsorTimes, "sponsorTimesSubmitting", sponsorTimesSubmitting); // Video ID change occured - videoIDChange(currentVideoID); + checkVideoIDChange(); return true; } else { @@ -747,49 +819,20 @@ function incorrectVideoCheck(videoID?: string, sponsorTime?: SponsorTime): boole } } -function setupVideoMutationListener() { - const videoContainer = document.querySelector(".html5-video-container"); - if (!videoContainer || videoMutationObserver !== null || onInvidious) return; - - videoMutationObserver = new MutationObserver(refreshVideoAttachments); - - videoMutationObserver.observe(videoContainer, { - attributes: true, - childList: true, - subtree: true - }); -} - -async function refreshVideoAttachments(): Promise<void> { - if (waitingForNewVideo) return; - - waitingForNewVideo = true; - const newVideo = await utils.waitForElement("video", true) as HTMLVideoElement; - waitingForNewVideo = false; - - video = newVideo; - if (!videosWithEventListeners.includes(video)) { - videosWithEventListeners.push(video); - - setupVideoListeners(); - setupSkipButtonControlBar(); - setupCategoryPill(); - } - - if (previewBar && !utils.findReferenceNode()?.contains(previewBar.container)) { - previewBar.remove(); - previewBar = null; - - createPreviewBar(); - } - - videoIDChange(getYouTubeVideoID(document)); -} - +let playbackRateCheckInterval: NodeJS.Timeout | null = null; +let lastPlaybackSpeed = 1; +let setupVideoListenersFirstTime = true; function setupVideoListeners() { //wait until it is loaded - video.addEventListener('loadstart', videoOnReadyListener) - video.addEventListener('durationchange', durationChangeListener); + getVideo().addEventListener('loadstart', videoOnReadyListener) + getVideo().addEventListener('durationchange', durationChangeListener); + + if (setupVideoListenersFirstTime) { + addCleanupListener(() => { + getVideo().removeEventListener('loadstart', videoOnReadyListener); + getVideo().removeEventListener('durationchange', durationChangeListener); + }); + } if (!Config.config.disableSkipping) { switchingVideos = false; @@ -797,12 +840,22 @@ function setupVideoListeners() { let startedWaiting = false; let lastPausedAtZero = true; - video.addEventListener('play', () => { + const rateChangeListener = () => { + updateVirtualTime(); + clearWaitingTime(); + + startSponsorSchedule(); + }; + getVideo().addEventListener('ratechange', rateChangeListener); + // Used by videospeed extension (https://github.com/igrigorik/videospeed/pull/740) + getVideo().addEventListener('videoSpeed_ratechange', rateChangeListener); + + const playListener = () => { // If it is not the first event, then the only way to get to 0 is if there is a seek event // This check makes sure that changing the video resolution doesn't cause the extension to think it // gone back to the begining - if (video.readyState <= HTMLMediaElement.HAVE_CURRENT_DATA - && video.currentTime === 0) return; + if (getVideo().readyState <= HTMLMediaElement.HAVE_CURRENT_DATA + && getVideo().currentTime === 0) return; updateVirtualTime(); @@ -820,23 +873,24 @@ function setupVideoListeners() { updateAdFlag(); // Make sure it doesn't get double called with the playing event - if (Math.abs(lastCheckVideoTime - video.currentTime) > 0.3 - || (lastCheckVideoTime !== video.currentTime && Date.now() - lastCheckTime > 2000)) { + if (Math.abs(lastCheckVideoTime - getVideo().currentTime) > 0.3 + || (lastCheckVideoTime !== getVideo().currentTime && Date.now() - lastCheckTime > 2000)) { lastCheckTime = Date.now(); - lastCheckVideoTime = video.currentTime; + lastCheckVideoTime = getVideo().currentTime; startSponsorSchedule(); } + }; + getVideo().addEventListener('play', playListener); - }); - video.addEventListener('playing', () => { + const playingListener = () => { updateVirtualTime(); lastPausedAtZero = false; if (startedWaiting) { startedWaiting = false; - logDebug(`[SB] Playing event after buffering: ${Math.abs(lastCheckVideoTime - video.currentTime) > 0.3 - || (lastCheckVideoTime !== video.currentTime && Date.now() - lastCheckTime > 2000)}`); + logDebug(`[SB] Playing event after buffering: ${Math.abs(lastCheckVideoTime - getVideo().currentTime) > 0.3 + || (lastCheckVideoTime !== getVideo().currentTime && Date.now() - lastCheckTime > 2000)}`); } if (switchingVideos) { @@ -848,88 +902,171 @@ function setupVideoListeners() { } // Make sure it doesn't get double called with the play event - if (Math.abs(lastCheckVideoTime - video.currentTime) > 0.3 - || (lastCheckVideoTime !== video.currentTime && Date.now() - lastCheckTime > 2000)) { + if (Math.abs(lastCheckVideoTime - getVideo().currentTime) > 0.3 + || (lastCheckVideoTime !== getVideo().currentTime && Date.now() - lastCheckTime > 2000)) { lastCheckTime = Date.now(); - lastCheckVideoTime = video.currentTime; + lastCheckVideoTime = getVideo().currentTime; startSponsorSchedule(); } - }); - video.addEventListener('seeking', () => { - if (!video.paused){ + + if (playbackRateCheckInterval) clearInterval(playbackRateCheckInterval); + lastPlaybackSpeed = getVideo().playbackRate; + + // Video speed controller compatibility + // That extension makes rate change events not propagate + if (document.body.classList.contains("vsc-initialized")) { + playbackRateCheckInterval = setInterval(() => { + if ((!getVideoID() || getVideo().paused) && playbackRateCheckInterval) { + // Video is gone, stop checking + clearInterval(playbackRateCheckInterval); + return; + } + + if (getVideo().playbackRate !== lastPlaybackSpeed) { + lastPlaybackSpeed = getVideo().playbackRate; + + rateChangeListener(); + } + }, 2000); + } + }; + getVideo().addEventListener('playing', playingListener); + + const seekingListener = () => { + lastKnownVideoTime.fromPause = false; + + if (!getVideo().paused){ // Reset lastCheckVideoTime lastCheckTime = Date.now(); - lastCheckVideoTime = video.currentTime; + lastCheckVideoTime = getVideo().currentTime; updateVirtualTime(); - lastTimeFromWaitingEvent = null; + 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(video.currentTime); + updateActiveSegment(getVideo().currentTime); - if (video.currentTime === 0) { + if (getVideo().currentTime === 0) { lastPausedAtZero = true; } } - }); - video.addEventListener('ratechange', () => { - updateVirtualTime(); - lastTimeFromWaitingEvent = null; - - startSponsorSchedule(); - }); - // Used by videospeed extension (https://github.com/igrigorik/videospeed/pull/740) - video.addEventListener('videoSpeed_ratechange', () => { - updateVirtualTime(); - lastTimeFromWaitingEvent = null; - - startSponsorSchedule(); - }); - const paused = () => { + }; + getVideo().addEventListener('seeking', seekingListener); + + const stoppedPlayback = () => { // Reset lastCheckVideoTime lastCheckVideoTime = -1; lastCheckTime = 0; - lastKnownVideoTime = { - videoTime: null, - preciseTime: null - } - lastTimeFromWaitingEvent = video.currentTime; + if (playbackRateCheckInterval) clearInterval(playbackRateCheckInterval); + + lastKnownVideoTime.videoTime = null; + lastKnownVideoTime.preciseTime = null; + updateWaitingTime(); cancelSponsorSchedule(); }; - video.addEventListener('pause', () => paused()); - video.addEventListener('waiting', () => { + const pauseListener = () => { + lastKnownVideoTime.fromPause = true; + + stoppedPlayback(); + }; + getVideo().addEventListener('pause', pauseListener); + const waitingListener = () => { logDebug("[SB] Not skipping due to buffering"); startedWaiting = true; - paused(); - }); + stoppedPlayback(); + }; + getVideo().addEventListener('waiting', waitingListener); startSponsorSchedule(); + + if (setupVideoListenersFirstTime) { + addCleanupListener(() => { + getVideo().removeEventListener('play', playListener); + getVideo().removeEventListener('playing', playingListener); + getVideo().removeEventListener('seeking', seekingListener); + getVideo().removeEventListener('ratechange', rateChangeListener); + getVideo().removeEventListener('videoSpeed_ratechange', rateChangeListener); + getVideo().removeEventListener('pause', pauseListener); + getVideo().removeEventListener('waiting', waitingListener); + + if (playbackRateCheckInterval) clearInterval(playbackRateCheckInterval); + }); + } } + + setupVideoListenersFirstTime = false; } function updateVirtualTime() { - lastKnownVideoTime = { - videoTime: video.currentTime, - preciseTime: performance.now() - }; + if (currentVirtualTimeInterval) clearInterval(currentVirtualTimeInterval); + + lastKnownVideoTime.videoTime = getVideo().currentTime; + lastKnownVideoTime.preciseTime = performance.now(); + + // If on Firefox, wait for the second time change (time remains fixed for many "frames" for privacy reasons) + if (isFirefoxOrSafari()) { + let count = 0; + let rawCount = 0; + let lastTime = lastKnownVideoTime.videoTime; + let lastPerformanceTime = performance.now(); + + currentVirtualTimeInterval = setInterval(() => { + 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++; + } + lastTime = getVideo().currentTime; + } + + if (count > 1) { + const delay = lastKnownVideoTime.fromPause && lastKnownVideoTime.approximateDelay ? + lastKnownVideoTime.approximateDelay : 0; + + lastKnownVideoTime.videoTime = getVideo().currentTime + delay; + lastKnownVideoTime.preciseTime = performance.now(); + + clearInterval(currentVirtualTimeInterval); + currentVirtualTimeInterval = null; + } + + lastPerformanceTime = performance.now(); + }, 1); + } +} + +function updateWaitingTime(): void { + lastTimeFromWaitingEvent = getVideo().currentTime; +} + +function clearWaitingTime(): void { + lastTimeFromWaitingEvent = null; } function setupSkipButtonControlBar() { if (!skipButtonControlBar) { skipButtonControlBar = new SkipButtonControlBar({ skip: (segment) => skipToTime({ - v: video, + v: getVideo(), skipTime: segment.segment, skippingSegments: [segment], openNotice: true, forceAutoSkip: true }), - onMobileYouTube + onMobileYouTube: isOnMobileYouTube() }); } @@ -941,58 +1078,31 @@ function setupCategoryPill() { categoryPill = new CategoryPill(); } - categoryPill.attachToPage(onMobileYouTube, onInvidious, voteAsync); + categoryPill.attachToPage(isOnMobileYouTube(), isOnInvidious(), voteAsync); } async function sponsorsLookup(keepOldSubmissions = true) { - if (!video || !isVisible(video)) refreshVideoAttachments(); + if (lookupWaiting) return; //there is still no video here - if (!video) { - setTimeout(() => sponsorsLookup(), 100); + if (!getVideo()) { + lookupWaiting = true; + setTimeout(() => { + lookupWaiting = false; + sponsorsLookup() + }, 100); 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(); if (hashParams.requiredSegment) extraRequestData.requiredSegment = hashParams.requiredSegment; - const hashPrefix = (await utils.getHash(sponsorVideoID, 1)).slice(0, 4) as VideoID & HashedValue; + 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 }); @@ -1001,106 +1111,75 @@ async function sponsorsLookup(keepOldSubmissions = true) { lastResponseStatus = response?.status; if (response?.ok) { - let recievedSegments: SponsorTime[] = JSON.parse(response.responseText) - ?.filter((video) => video.videoID === sponsorVideoID) + const receivedSegments: SponsorTime[] = JSON.parse(response.responseText) + ?.filter((video) => video.videoID === getVideoID()) ?.map((video) => video.segments)?.[0] ?.map((segment) => ({ ...segment, source: SponsorSourceType.Server })) ?.sort((a, b) => a.segment[0] - b.segment[0]); - if (!recievedSegments || !recievedSegments.length) { - // return if no video found - chrome.runtime.sendMessage({ - message: "infoUpdated", - found: false, - status: lastResponseStatus, - sponsorTimes: sponsorTimes, - time: video.currentTime, - onMobileYouTube - }); - retryFetch(404); - return; - } - - 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); - } - - 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]); + 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 + receivedSegments.push(sponsorTimes[i]); + } } } - } - const oldSegments = sponsorTimes || []; - sponsorTimes = recievedSegments; - existingChaptersImported = false; + const oldSegments = sponsorTimes || []; + sponsorTimes = receivedSegments; + existingChaptersImported = false; - // Hide all submissions smaller than the minimum duration - if (Config.config.minDuration !== 0) { - for (const segment of sponsorTimes) { - const duration = segment.segment[1] - segment.segment[0]; - if (duration > 0 && duration < Config.config.minDuration) { - segment.hidden = SponsorHideType.MinimumDuration; + // Hide all submissions smaller than the minimum duration + if (Config.config.minDuration !== 0) { + for (const segment of sponsorTimes) { + const duration = segment.segment[1] - segment.segment[0]; + if (duration > 0 && duration < Config.config.minDuration) { + segment.hidden = SponsorHideType.MinimumDuration; + } } } - } - if (keepOldSubmissions) { - for (const segment of oldSegments) { - const otherSegment = sponsorTimes.find((other) => segment.UUID === other.UUID); - if (otherSegment) { - // If they downvoted it, or changed the category, keep it - otherSegment.hidden = segment.hidden; - otherSegment.category = segment.category; + if (keepOldSubmissions) { + for (const segment of oldSegments) { + const otherSegment = sponsorTimes.find((other) => segment.UUID === other.UUID); + if (otherSegment) { + // If they downvoted it, or changed the category, keep it + otherSegment.hidden = segment.hidden; + otherSegment.category = segment.category; + } } } - } - // See if some segments should be hidden - const downvotedData = Config.local.downvotedSegments[hashPrefix]; - if (downvotedData) { - for (const segment of sponsorTimes) { - const hashedUUID = await utils.getHash(segment.UUID, 1); - const segmentDownvoteData = downvotedData.segments.find((downvote) => downvote.uuid === hashedUUID); - if (segmentDownvoteData) { - segment.hidden = segmentDownvoteData.hidden; + // See if some segments should be hidden + const downvotedData = Config.local.downvotedSegments[hashPrefix]; + if (downvotedData) { + for (const segment of sponsorTimes) { + const hashedUUID = await getHash(segment.UUID, 1); + const segmentDownvoteData = downvotedData.segments.find((downvote) => downvote.uuid === hashedUUID); + if (segmentDownvoteData) { + segment.hidden = segmentDownvoteData.hidden; + } } } - } - startSkipScheduleCheckingForStartSponsors(); + startSkipScheduleCheckingForStartSponsors(); - //update the preview bar - //leave the type blank for now until categories are added - if (lastPreviewBarUpdate == sponsorVideoID || (lastPreviewBarUpdate == null && !isNaN(video.duration))) { - //set it now - //otherwise the listener can handle it - updatePreviewBar(); + //update the preview bar + //leave the type blank for now until categories are added + if (lastPreviewBarUpdate == getVideoID() || (lastPreviewBarUpdate == null && !isNaN(getVideo().duration))) { + //set it now + //otherwise the listener can handle it + updatePreviewBar(); + } + } else { + retryFetch(404); } } else { retryFetch(lastResponseStatus); @@ -1114,8 +1193,8 @@ async function sponsorsLookup(keepOldSubmissions = true) { found: sponsorDataFound, status: lastResponseStatus, sponsorTimes: sponsorTimes, - time: video.currentTime, - onMobileYouTube + time: getVideo().currentTime, + onMobileYouTube: isOnMobileYouTube() }); if (Config.config.isVip) { @@ -1125,14 +1204,25 @@ async function sponsorsLookup(keepOldSubmissions = true) { function importExistingChapters(wait: boolean) { if (!existingChaptersImported) { - GenericUtils.wait(() => video?.duration && getExistingChapters(sponsorVideoID, video.duration), - wait ? 5000 : 0, 100, (c) => c?.length > 0).then((chapters) => { - if (!existingChaptersImported && chapters?.length > 0) { - sponsorTimes = (sponsorTimes ?? []).concat(...chapters).sort((a, b) => a.segment[0] - b.segment[0]); - existingChaptersImported = true; - updatePreviewBar(); - } - }).catch(() => {}); // eslint-disable-line @typescript-eslint/no-empty-function + const waitCondition = () => getVideo()?.duration && getExistingChapters(getVideoID(), getVideo().duration); + + if (!waitCondition() && wait && !document.hasFocus() && !importingChaptersWaitingForFocus) { + importingChaptersWaitingForFocus = true; + const listener = () => { + importExistingChapters(wait); + window.removeEventListener("focus", listener); + }; + window.addEventListener("focus", listener); + } else { + waitFor(waitCondition, + wait ? 15000 : 0, 400, (c) => c?.length > 0).then((chapters) => { + if (!existingChaptersImported && chapters?.length > 0) { + sponsorTimes = (sponsorTimes ?? []).concat(...chapters).sort((a, b) => a.segment[0] - b.segment[0]); + existingChaptersImported = true; + updatePreviewBar(); + } + }).catch(() => {}); // eslint-disable-line @typescript-eslint/no-empty-function + } } } @@ -1149,12 +1239,12 @@ function getEnabledActionTypes(forceFullVideo = false): ActionType[] { } async function lockedCategoriesLookup(): Promise<void> { - const hashPrefix = (await utils.getHash(sponsorVideoID, 1)).slice(0, 4); + const hashPrefix = (await getHash(getVideoID(), 1)).slice(0, 4); const response = await utils.asyncRequestToServer("GET", "/api/lockCategories/" + hashPrefix); if (response.ok) { try { - const categoriesResponse = JSON.parse(response.responseText).filter((lockInfo) => lockInfo.videoID === sponsorVideoID)[0]?.categories; + const categoriesResponse = JSON.parse(response.responseText).filter((lockInfo) => lockInfo.videoID === getVideoID())[0]?.categories; if (Array.isArray(categoriesResponse)) { lockedCategories = categoriesResponse; } @@ -1176,9 +1266,9 @@ function retryFetch(errorCode: number): void { const delay = errorCode === 404 ? (30000 + Math.random() * 30000) : (2000 + Math.random() * 10000); retryFetchTimeout = setTimeout(() => { - if (sponsorVideoID && sponsorTimes?.length === 0 + if (getVideoID() && sponsorTimes?.length === 0 || sponsorTimes.every((segment) => segment.source !== SponsorSourceType.Server)) { - sponsorsLookup(); + // sponsorsLookup(); } }, delay); } @@ -1190,12 +1280,12 @@ 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; for (const time of sponsorTimes) { - if (time.segment[0] <= video.currentTime && time.segment[0] > startingSegmentTime && time.segment[1] > video.currentTime + if (time.segment[0] <= getVideo().currentTime && time.segment[0] > startingSegmentTime && time.segment[1] > getVideo().currentTime && time.actionType !== ActionType.Poi) { startingSegmentTime = time.segment[0]; found = true; @@ -1204,7 +1294,7 @@ function startSkipScheduleCheckingForStartSponsors() { } if (!found) { for (const time of sponsorTimesSubmitting) { - if (time.segment[0] <= video.currentTime && time.segment[0] > startingSegmentTime && time.segment[1] > video.currentTime + if (time.segment[0] <= getVideo().currentTime && time.segment[0] > startingSegmentTime && time.segment[1] > getVideo().currentTime && time.actionType !== ActionType.Poi) { startingSegmentTime = time.segment[0]; found = true; @@ -1215,17 +1305,18 @@ function startSkipScheduleCheckingForStartSponsors() { // For highlight category const poiSegments = sponsorTimes - .filter((time) => time.segment[1] > video.currentTime && time.actionType === ActionType.Poi) + .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) { const skipOption = utils.getCategorySelection(time.category)?.option; if (skipOption !== CategorySkipOption.ShowOverlay) { skipToTime({ - v: video, + v: getVideo(), skipTime: time.segment, skippingSegments: [time], openNotice: true, - unskipTime: video.currentTime + unskipTime: getVideo().currentTime }); if (skipOption === CategorySkipOption.AutoSkip) break; } @@ -1244,82 +1335,6 @@ function startSkipScheduleCheckingForStartSponsors() { } } -function getYouTubeVideoID(document: Document, url?: string): string { - url ||= document.URL; - // pageType shortcut - if (pageType === PageType.Channel) return getYouTubeVideoIDFromDocument(); - // clips should never skip, going from clip to full video has no indications. - if (url.includes("youtube.com/clip/")) return null; - // skip to document and don't hide if on /embed/ - if (url.includes("/embed/") && url.includes("youtube.com")) return getYouTubeVideoIDFromDocument(false, PageType.Embed); - // skip to URL if matches youtube watch or invidious or matches youtube pattern - if ((!url.includes("youtube.com")) || url.includes("/watch") || url.includes("/shorts/") || url.includes("playlist")) return getYouTubeVideoIDFromURL(url); - // skip to document if matches pattern - if (url.includes("/channel/") || url.includes("/user/") || url.includes("/c/")) return getYouTubeVideoIDFromDocument(true, PageType.Channel); - // not sure, try URL then document - return getYouTubeVideoIDFromURL(url) || getYouTubeVideoIDFromDocument(false); -} - -function getYouTubeVideoIDFromDocument(hideIcon = true, pageHint = PageType.Watch): string { - const selector = "a.ytp-title-link[data-sessionlink='feature=player-title']"; - // get ID from document (channel trailer / embedded playlist) - const element = pageHint === PageType.Embed ? document.querySelector(selector) - : video?.parentElement?.parentElement?.querySelector(selector); - const videoURL = element?.getAttribute("href"); - if (videoURL) { - onInvidious = hideIcon; - // if href found, hint was correct - pageType = pageHint; - return getYouTubeVideoIDFromURL(videoURL); - } else { - return null; - } -} - -function getYouTubeVideoIDFromURL(url: string): string { - if(url.startsWith("https://www.youtube.com/tv#/")) url = url.replace("#", ""); - - //Attempt to parse url - let urlObject: URL = null; - try { - urlObject = new URL(url); - } catch (e) { - console.error("[SB] Unable to parse URL: " + url); - return null; - } - - // Check if valid hostname - if (Config.config && Config.config.invidiousInstances.includes(urlObject.host)) { - onInvidious = true; - } else if (urlObject.host === "m.youtube.com") { - onMobileYouTube = true; - } else if (!["m.youtube.com", "www.youtube.com", "www.youtube-nocookie.com", "music.youtube.com"].includes(urlObject.host)) { - if (!Config.config) { - // Call this later, in case this is an Invidious tab - utils.wait(() => Config.config !== null).then(() => videoIDChange(getYouTubeVideoIDFromURL(url))); - } - - return null; - } else { - onInvidious = false; - } - - //Get ID from searchParam - if (urlObject.searchParams.has("v") && ["/watch", "/watch/"].includes(urlObject.pathname) || urlObject.pathname.startsWith("/tv/watch")) { - const id = urlObject.searchParams.get("v"); - return id.length == 11 ? id : null; - } else if (urlObject.pathname.startsWith("/embed/") || urlObject.pathname.startsWith("/shorts/")) { - try { - const id = urlObject.pathname.split("/")[2] - if (id?.length >=11 ) return id.slice(0, 11); - } catch (e) { - console.error("[SB] Video ID not valid for " + url); - return null; - } - } - return null; -} - /** * This function is required on mobile YouTube and will keep getting called whenever the preview bar disapears */ @@ -1332,14 +1347,15 @@ function updatePreviewBarPositionMobile(parent: HTMLElement) { function updatePreviewBar(): void { if (previewBar === null) return; - if (isAdPlaying) { + if (getIsAdPlaying()) { previewBar.clear(); return; } - if (video === null) return; + if (getVideo() === null) return; const hashParams = getHashParams(); + const requiredSegment = hashParams?.requiredSegment as SegmentUUID || undefined; const previewBarSegments: PreviewBarSegment[] = []; if (sponsorTimes) { sponsorTimes.forEach((segment) => { @@ -1353,7 +1369,7 @@ function updatePreviewBar(): void { showLarger: segment.actionType === ActionType.Poi, description: segment.description, source: segment.source, - requiredSegment: hashParams.requiredSegment && segment.UUID === hashParams.requiredSegment + requiredSegment: requiredSegment && (segment.UUID === requiredSegment || segment.UUID.startsWith(requiredSegment)) }); }); } @@ -1370,50 +1386,25 @@ function updatePreviewBar(): void { }); }); - previewBar.set(previewBarSegments.filter((segment) => segment.actionType !== ActionType.Full), video?.duration) - if (video) updateActiveSegment(video.currentTime); + previewBar.set(previewBarSegments.filter((segment) => segment.actionType !== ActionType.Full), getVideo()?.duration) + if (getVideo()) updateActiveSegment(getVideo().currentTime); if (Config.config.showTimeWithSkips) { const skippedDuration = utils.getTimestampsDuration(previewBarSegments - .filter(({actionType}) => actionType !== ActionType.Chapter) + .filter(({actionType}) => ![ActionType.Mute, ActionType.Chapter].includes(actionType)) .map(({segment}) => segment)); showTimeWithoutSkips(skippedDuration); } // Update last video id - lastPreviewBarUpdate = sponsorVideoID; + lastPreviewBarUpdate = getVideoID(); } //checks if this channel is whitelisted, should be done only after the channelID has been loaded -async function whitelistCheck() { +async function channelIDChange(channelIDInfo: ChannelIDInfo) { const whitelistedChannels = Config.config.whitelistedChannels; - try { - await utils.wait(() => channelIDInfo.status === ChannelIDStatus.Found, 6000, 20); - - // If found, continue on, it was set by the listener - } catch (e) { - // Try fallback - const channelIDFallback = (document.querySelector("a.ytd-video-owner-renderer") // YouTube - ?? document.querySelector("a.ytp-title-channel-logo") // YouTube Embed - ?? document.querySelector(".channel-profile #channel-name")?.parentElement.parentElement // Invidious - ?? document.querySelector("a.slim-owner-icon-and-title")) // Mobile YouTube - ?.getAttribute("href")?.match(/\/(?:channel|c|user)\/(UC[a-zA-Z0-9_-]{22}|[a-zA-Z0-9_-]+)/)?.[1]; - - if (channelIDFallback) { - channelIDInfo = { - status: ChannelIDStatus.Found, - id: channelIDFallback - }; - } else { - channelIDInfo = { - status: ChannelIDStatus.Failed, - id: null - }; - } - } - //see if this is a whitelisted channel if (whitelistedChannels != undefined && channelIDInfo.status === ChannelIDStatus.Found && whitelistedChannels.includes(channelIDInfo.id)) { @@ -1424,6 +1415,32 @@ async function whitelistCheck() { if (Config.config.forceChannelCheck && sponsorTimes?.length > 0) startSkipScheduleCheckingForStartSponsors(); } +function videoElementChange(newVideo: boolean): void { + waitFor(() => Config.isReady()).then(() => { + if (newVideo) { + setupVideoListeners(); + setupSkipButtonControlBar(); + 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(); +} + /** * Returns info about the next upcoming sponsor skip */ @@ -1512,7 +1529,7 @@ function getLatestEndTimeIndex(sponsorTimes: SponsorTime[], index: number, hideH const currentSegment = sponsorTimes[i].segment; const latestEndTime = sponsorTimes[latestEndTimeIndex].segment[1]; - if (currentSegment[0] <= latestEndTime && currentSegment[1] > latestEndTime + if (currentSegment[0] - skipBuffer <= latestEndTime && currentSegment[1] > latestEndTime && (!hideHiddenSponsors || sponsorTimes[i].hidden === SponsorHideType.Visible) && shouldAutoSkip(sponsorTimes[i]) && sponsorTimes[i].actionType === ActionType.Skip) { @@ -1546,6 +1563,14 @@ function getStartTimes(sponsorTimes: SponsorTime[], includeIntersectingSegments: const includedTimes: ScheduledTime[] = []; const scheduledTimes: number[] = []; + const shouldIncludeTime = (segment: ScheduledTime ) => (minimum === undefined + || ((includeNonIntersectingSegments && segment.scheduledTime >= 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; + const possibleTimes = sponsorTimes.map((sponsorTime) => ({ ...sponsorTime, scheduledTime: sponsorTime.segment[0] @@ -1553,7 +1578,8 @@ function getStartTimes(sponsorTimes: SponsorTime[], includeIntersectingSegments: // Schedule at the end time to know when to unmute and remove title from seek bar sponsorTimes.forEach(sponsorTime => { - if (!possibleTimes.some((time) => sponsorTime.segment[1] === time.scheduledTime)) { + if (!possibleTimes.some((time) => sponsorTime.segment[1] === time.scheduledTime && shouldIncludeTime(time)) + && (minimum === undefined || sponsorTime.segment[1] > minimum)) { possibleTimes.push({ ...sponsorTime, scheduledTime: sponsorTime.segment[1] @@ -1562,13 +1588,7 @@ function getStartTimes(sponsorTimes: SponsorTime[], includeIntersectingSegments: }); for (let i = 0; i < possibleTimes.length; i++) { - if ((minimum === undefined - || ((includeNonIntersectingSegments && possibleTimes[i].scheduledTime >= minimum) - || (includeIntersectingSegments && possibleTimes[i].scheduledTime < minimum && possibleTimes[i].segment[1] > minimum))) - && (!hideHiddenSponsors || possibleTimes[i].hidden === SponsorHideType.Visible) - && possibleTimes[i].segment.length === 2 - && possibleTimes[i].actionType !== ActionType.Poi) { - + if (shouldIncludeTime(possibleTimes[i])) { scheduledTimes.push(possibleTimes[i].scheduledTime); includedTimes.push(possibleTimes[i]); } @@ -1583,11 +1603,11 @@ function getStartTimes(sponsorTimes: SponsorTime[], includeIntersectingSegments: * @param time */ function previewTime(time: number, unpause = true) { - video.currentTime = time; + getVideo().currentTime = time; // Unpause the video if needed - if (unpause && video.paused){ - video.play(); + if (unpause && getVideo().paused){ + getVideo().play(); } } @@ -1629,10 +1649,18 @@ function skipToTime({v, skipTime, skippingSegments, openNotice, forceAutoSkip, u // for some reason you also can't skip to 1 second before the end if (v.loop && v.duration > 1 && skipTime[1] >= v.duration - 1) { v.currentTime = 0; - } else if (navigator.vendor === "Apple Computer, Inc." && v.duration > 1 && skipTime[1] >= v.duration) { + } else if (v.duration > 1 && skipTime[1] >= v.duration + && (navigator.vendor === "Apple Computer, Inc." || isPlayingPlaylist())) { // MacOS will loop otherwise #1027 + // Sometimes playlists loop too #1804 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]; } @@ -1650,14 +1678,15 @@ function skipToTime({v, skipTime, skippingSegments, openNotice, forceAutoSkip, u if (autoSkip && Config.config.audioNotificationOnSkip) { const beep = new Audio(chrome.runtime.getURL("icons/beep.ogg")); - beep.volume = video.volume * 0.1; + beep.volume = getVideo().volume * 0.1; const oldMetadata = navigator.mediaSession.metadata beep.play(); beep.addEventListener("ended", () => { navigator.mediaSession.metadata = null; - setTimeout(() => - navigator.mediaSession.metadata = oldMetadata - ); + setTimeout(() => { + navigator.mediaSession.metadata = oldMetadata; + beep.remove(); + }); }) } @@ -1665,7 +1694,7 @@ function skipToTime({v, skipTime, skippingSegments, openNotice, forceAutoSkip, u && skippingSegments.length === 1 && skippingSegments[0].actionType === ActionType.Poi) { skipButtonControlBar.enable(skippingSegments[0]); - if (onMobileYouTube || Config.config.skipKeybind == null) skipButtonControlBar.setShowKeybindHint(false); + if (isOnMobileYouTube() || Config.config.skipKeybind == null) skipButtonControlBar.setShowKeybindHint(false); activeSkipKeybindElement?.setShowKeybindHint(false); activeSkipKeybindElement = skipButtonControlBar; @@ -1702,7 +1731,7 @@ function createSkipNotice(skippingSegments: SponsorTime[], autoSkip: boolean, un } const newSkipNotice = new SkipNotice(skippingSegments, autoSkip, skipNoticeContentContainer, unskipTime, startReskip); - if (onMobileYouTube || Config.config.skipKeybind == null) newSkipNotice.setShowKeybindHint(false); + if (isOnMobileYouTube() || Config.config.skipKeybind == null) newSkipNotice.setShowKeybindHint(false); skipNotices.push(newSkipNotice); activeSkipKeybindElement?.setShowKeybindHint(false); @@ -1711,27 +1740,27 @@ function createSkipNotice(skippingSegments: SponsorTime[], autoSkip: boolean, un function unskipSponsorTime(segment: SponsorTime, unskipTime: number = null, forceSeek = false) { if (segment.actionType === ActionType.Mute) { - video.muted = false; + getVideo().muted = false; videoMuted = false; } if (forceSeek || segment.actionType === ActionType.Skip) { //add a tiny bit of time to make sure it is not skipped again - video.currentTime = unskipTime ?? segment.segment[0] + 0.001; + getVideo().currentTime = unskipTime ?? segment.segment[0] + 0.001; } } function reskipSponsorTime(segment: SponsorTime, forceSeek = false) { if (segment.actionType === ActionType.Mute && !forceSeek) { - video.muted = true; + getVideo().muted = true; videoMuted = true; } else { - const skippedTime = Math.max(segment.segment[1] - video.currentTime, 0); + const skippedTime = Math.max(segment.segment[1] - getVideo().currentTime, 0); const segmentDuration = segment.segment[1] - segment.segment[0]; const fullSkip = skippedTime / segmentDuration > manualSkipPercentCount; - video.currentTime = segment.segment[1]; + getVideo().currentTime = segment.segment[1]; sendTelemetryAndCount([segment], segment.actionType !== ActionType.Chapter ? skippedTime : 0, fullSkip); startSponsorSchedule(true, segment.segment[1], false); } @@ -1779,14 +1808,15 @@ function shouldAutoSkip(segment: SponsorTime): boolean { return (!Config.config.manualSkipOnFullVideo || !sponsorTimes?.some((s) => s.category === segment.category && s.actionType === ActionType.Full)) && (utils.getCategorySelection(segment.category)?.option === CategorySkipOption.AutoSkip || (Config.config.autoSkipOnMusicVideos && sponsorTimes?.some((s) => s.category === "music_offtopic") - && segment.actionType !== ActionType.Poi)); + && segment.actionType === ActionType.Skip)); } 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); } /** Creates any missing buttons on the YouTube player if possible. */ @@ -1797,11 +1827,11 @@ async function createButtons(): Promise<void> { createButton("startSegment", "sponsorStart", () => startOrEndTimingNewSegment(), "PlayerStartIconSponsorBlocker.svg"); createButton("cancelSegment", "sponsorCancel", () => cancelCreatingSegment(), "PlayerCancelSegmentIconSponsorBlocker.svg"); createButton("delete", "clearTimes", () => clearSponsorTimes(), "PlayerDeleteIconSponsorBlocker.svg"); - createButton("submit", "SubmitTimes", () => submitSponsorTimes(), "PlayerUploadIconSponsorBlocker.svg"); + createButton("submit", "OpenSubmissionMenu", () => submitSponsorTimes(), "PlayerUploadIconSponsorBlocker.svg"); createButton("info", "openPopup", () => openInfoMenu(), "PlayerInfoIconSponsorBlocker.svg"); const controlsContainer = getControls(); - if (Config.config.autoHideInfoButton && !onInvidious && controlsContainer + if (Config.config.autoHideInfoButton && !isOnInvidious() && controlsContainer && playerButtons["info"]?.button && !controlsWithEventListeners.includes(controlsContainer)) { controlsWithEventListeners.push(controlsContainer); @@ -1812,14 +1842,14 @@ async function createButtons(): Promise<void> { /** Creates any missing buttons on the player and updates their visiblity. */ async function updateVisibilityOfPlayerControlsButton(): Promise<void> { // Not on a proper video yet - if (!sponsorVideoID || onMobileYouTube) return; + if (!getVideoID() || isOnMobileYouTube()) return; await createButtons(); updateEditButtonsOnPlayer(); // Don't show the info button on embeds - if (Config.config.hideInfoButtonPlayerControls || document.URL.includes("/embed/") || onInvidious + if (Config.config.hideInfoButtonPlayerControls || document.URL.includes("/embed/") || isOnInvidious() || document.getElementById("sponsorBlockPopupContainer") != null) { playerButtons.info.button.style.display = "none"; } else { @@ -1830,9 +1860,9 @@ async function updateVisibilityOfPlayerControlsButton(): Promise<void> { /** Updates the visibility of buttons on the player related to creating segments. */ function updateEditButtonsOnPlayer(): void { // Don't try to update the buttons if we aren't on a YouTube video page - if (!sponsorVideoID || onMobileYouTube) return; + if (!getVideoID() || isOnMobileYouTube()) return; - const buttonsEnabled = !(Config.config.hideVideoPlayerControls || onInvidious); + const buttonsEnabled = !(Config.config.hideVideoPlayerControls || isOnInvidious()); let creatingSegment = false; let submitButtonVisible = false; @@ -1869,7 +1899,7 @@ function updateEditButtonsOnPlayer(): void { /** * Used for submitting. This will use the HTML displayed number when required as the video's - * current time is out of date while scrubbing or at the end of the video. This is not needed + * current time is out of date while scrubbing or at the end of the getVideo(). This is not needed * for sponsor skipping as the video is not playing during these times. */ function getRealCurrentTime(): number { @@ -1879,9 +1909,9 @@ function getRealCurrentTime(): number { if (playButtonSVGData === replaceSVGData) { // At the end of the video - return video?.duration; + return getVideo()?.duration; } else { - return video.currentTime; + return getVideo().currentTime; } } @@ -1890,7 +1920,7 @@ function startOrEndTimingNewSegment() { if (!isSegmentCreationInProgress()) { sponsorTimesSubmitting.push({ segment: [roundedTime], - UUID: GenericUtils.generateUserID() as SegmentUUID, + UUID: generateUserID() as SegmentUUID, category: Config.config.defaultCategory, actionType: ActionType.Skip, source: SponsorSourceType.Local @@ -1906,7 +1936,7 @@ function startOrEndTimingNewSegment() { } // Save the newly created segment - Config.config.unsubmittedSegments[sponsorVideoID] = sponsorTimesSubmitting; + Config.config.unsubmittedSegments[getVideoID()] = sponsorTimesSubmitting; Config.forceSyncUpdate("unsubmittedSegments"); // Make sure they know if someone has already submitted something it while they were watching @@ -1916,6 +1946,13 @@ function startOrEndTimingNewSegment() { updateSponsorTimesSubmitting(false); importExistingChapters(false); + + if (lastResponseStatus !== 200 && lastResponseStatus !== 404 + && !shownSegmentFailedToFetchWarning && Config.config.showSegmentFailedToFetchWarning) { + alert(chrome.i18n.getMessage("segmentFetchFailureWarning")); + + shownSegmentFailedToFetchWarning = true; + } } function getIncompleteSegment(): SponsorTime { @@ -1932,11 +1969,11 @@ function cancelCreatingSegment() { if (isSegmentCreationInProgress()) { if (sponsorTimesSubmitting.length > 1) { // If there's more than one segment: remove last sponsorTimesSubmitting.pop(); - Config.config.unsubmittedSegments[sponsorVideoID] = sponsorTimesSubmitting; + Config.config.unsubmittedSegments[getVideoID()] = sponsorTimesSubmitting; } else { // Otherwise delete the video entry & close submission menu resetSponsorSubmissionNotice(); sponsorTimesSubmitting = []; - delete Config.config.unsubmittedSegments[sponsorVideoID]; + delete Config.config.unsubmittedSegments[getVideoID()]; } Config.forceSyncUpdate("unsubmittedSegments"); } @@ -1946,7 +1983,7 @@ function cancelCreatingSegment() { } function updateSponsorTimesSubmitting(getFromConfig = true) { - const segmentTimes = Config.config.unsubmittedSegments[sponsorVideoID]; + const segmentTimes = Config.config.unsubmittedSegments[getVideoID()]; //see if this data should be saved in the sponsorTimesSubmitting variable if (getFromConfig && segmentTimes != undefined) { @@ -1971,7 +2008,7 @@ function updateSponsorTimesSubmitting(getFromConfig = true) { updatePreviewBar(); // Restart skipping schedule - if (video !== null) startSponsorSchedule(); + if (getVideo() !== null) startSponsorSchedule(); if (submissionNotice !== null) { submissionNotice.update(); @@ -1998,23 +2035,38 @@ function openInfoMenu() { const frame = document.createElement("iframe"); frame.width = "374"; frame.height = "500"; + frame.style.borderRadius = "12px"; frame.addEventListener("load", () => frame.contentWindow.postMessage("", "*")); frame.src = chrome.extension.getURL("popup.html"); popup.appendChild(frame); - const parentNodes = document.querySelectorAll("#secondary-inner"); - let parentNode = null; - for (let i = 0; i < parentNodes.length; i++) { - if (parentNodes[i].firstElementChild !== null) { - parentNode = parentNodes[i]; + const elemHasChild = (elements: NodeListOf<HTMLElement>): Element => { + let parentNode: Element; + for (const node of elements) { + if (node.firstElementChild !== null) { + parentNode = node; + } } - } - if (parentNode == null) { - //old youtube theme - parentNode = document.getElementById("watch7-sidebar-contents"); - } + return parentNode + } + + const parentNodeOptions = [{ + // YouTube + selector: "#secondary-inner", + hasChildCheck: true + }, { + // old youtube theme + selector: "#watch7-sidebar-contents", + }]; + for (const option of parentNodeOptions) { + const allElements = document.querySelectorAll(option.selector) as NodeListOf<HTMLElement>; + const el = option.hasChildCheck ? elemHasChild(allElements) : allElements[0]; - parentNode.insertBefore(popup, parentNode.firstChild); + if (el) { + if (option.hasChildCheck) el.insertBefore(popup, el.firstChild); + break; + } + } } function closeInfoMenu() { @@ -2030,7 +2082,7 @@ function closeInfoMenu() { } function clearSponsorTimes() { - const currentVideoID = sponsorVideoID; + const currentVideoID = getVideoID(); const sponsorTimes = Config.config.unsubmittedSegments[currentVideoID]; @@ -2072,7 +2124,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)(); @@ -2083,11 +2135,11 @@ async function vote(type: number, UUID: SegmentUUID, category?: Category, skipNo return response; } -async function voteAsync(type: number, UUID: SegmentUUID, category?: Category): Promise<VoteResponse> { +async function voteAsync(type: number, UUID: SegmentUUID, category?: Category): Promise<VoteResponse | undefined> { const sponsorIndex = utils.getSponsorIndexFromUUID(sponsorTimes, UUID); // Don't vote for preview sponsors - if (sponsorIndex == -1 || sponsorTimes[sponsorIndex].source !== SponsorSourceType.Server) return; + if (sponsorIndex == -1 || sponsorTimes[sponsorIndex].source !== SponsorSourceType.Server) return Promise.resolve(undefined); // See if the local time saved count and skip count should be saved if (type === 0 && sponsorSkipped[sponsorIndex] || type === 1 && !sponsorSkipped[sponsorIndex]) { @@ -2124,7 +2176,7 @@ async function voteAsync(type: number, UUID: SegmentUUID, category?: Category): } if (!category && !Config.config.isVip) { - utils.addHiddenSegment(sponsorVideoID, segment.UUID, segment.hidden); + utils.addHiddenSegment(getVideoID(), segment.UUID, segment.hidden); } updatePreviewBar(); @@ -2173,8 +2225,10 @@ function submitSponsorTimes() { //send the message to the background js //called after all the checks have been made that it's okay to do so async function sendSubmitMessage() { + // check if all segments are full video + const onlyFullVideo = sponsorTimesSubmitting.every((segment) => segment.actionType === ActionType.Full); // Block if submitting on a running livestream or premiere - if (isLivePremiere || isVisible(document.querySelector(".ytp-live-badge"))) { + if (!onlyFullVideo && (getIsLivePremiere() || isVisible(document.querySelector(".ytp-live-badge")))) { alert(chrome.i18n.getMessage("liveOrPremiere")); return; } @@ -2185,13 +2239,13 @@ async function sendSubmitMessage() { //check if a sponsor exceeds the duration of the video for (let i = 0; i < sponsorTimesSubmitting.length; i++) { - if (sponsorTimesSubmitting[i].segment[1] > video.duration) { - sponsorTimesSubmitting[i].segment[1] = video.duration; + if (sponsorTimesSubmitting[i].segment[1] > getVideo().duration) { + sponsorTimesSubmitting[i].segment[1] = getVideo().duration; } } //update sponsorTimes - Config.config.unsubmittedSegments[sponsorVideoID] = sponsorTimesSubmitting; + Config.config.unsubmittedSegments[getVideoID()] = sponsorTimesSubmitting; Config.forceSyncUpdate("unsubmittedSegments"); // Check to see if any of the submissions are below the minimum duration set @@ -2208,10 +2262,10 @@ async function sendSubmitMessage() { } const response = await utils.asyncRequestToServer("POST", "/api/skipSegments", { - videoID: sponsorVideoID, + videoID: getVideoID(), userID: Config.config.userID, segments: sponsorTimesSubmitting, - videoDuration: video?.duration, + videoDuration: getVideo()?.duration, userAgent: `${chrome.runtime.id}/v${chrome.runtime.getManifest().version}` }); @@ -2219,15 +2273,15 @@ async function sendSubmitMessage() { stopAnimation(); // Remove segments from storage since they've already been submitted - delete Config.config.unsubmittedSegments[sponsorVideoID]; + delete Config.config.unsubmittedSegments[getVideoID()]; Config.forceSyncUpdate("unsubmittedSegments"); 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; } } @@ -2260,7 +2314,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)); } } } @@ -2271,7 +2325,7 @@ function getSegmentsMessage(sponsorTimes: SponsorTime[]): string { for (let i = 0; i < sponsorTimes.length; i++) { for (let s = 0; s < sponsorTimes[i].segment.length; s++) { - let timeMessage = GenericUtils.getFormattedTime(sponsorTimes[i].segment[s]); + let timeMessage = getFormattedTime(sponsorTimes[i].segment[s]); //if this is an end time if (s == 1) { timeMessage = " " + chrome.i18n.getMessage("to") + " " + timeMessage; @@ -2287,36 +2341,6 @@ function getSegmentsMessage(sponsorTimes: SponsorTime[]): string { return sponsorTimesMessage; } -function windowListenerHandler(event: MessageEvent): void { - const data = event.data; - const dataType = data.type; - - if (data.source !== "sponsorblock" || document?.URL?.includes("youtube.com/clip/")) return; - - if (dataType === "navigation" && data.videoID) { - pageType = data.pageType; - - if (data.channelID) { - channelIDInfo = { - id: data.channelID, - status: ChannelIDStatus.Found - }; - } - - videoIDChange(data.videoID); - } else if (dataType === "ad") { - if (isAdPlaying != data.playing) { - isAdPlaying = data.playing - updatePreviewBar(); - updateVisibilityOfPlayerControlsButton(); - } - } else if (dataType === "data" && data.videoID) { - videoIDChange(data.videoID); - - isLivePremiere = data.isLive || data.isPremiere - } -} - function updateActiveSegment(currentTime: number): void { const activeSegments = previewBar?.updateChapterText(sponsorTimes, sponsorTimesSubmitting, currentTime); chrome.runtime.sendMessage({ @@ -2334,61 +2358,59 @@ function nextChapter(): void { const chapters = previewBar.unfilteredChapterGroups?.filter((time) => [ActionType.Chapter, null].includes(time.actionType)); if (!chapters || chapters.length <= 0) return; - lastNextChapterKeybind.time = video.currentTime; + lastNextChapterKeybind.time = getVideo().currentTime; lastNextChapterKeybind.date = Date.now(); - const nextChapter = chapters.findIndex((time) => time.segment[0] > video.currentTime); + const nextChapter = chapters.findIndex((time) => time.segment[0] > getVideo().currentTime); if (nextChapter !== -1) { - video.currentTime = chapters[nextChapter].segment[0]; + getVideo().currentTime = chapters[nextChapter].segment[0]; } else { - video.currentTime = video.duration; + getVideo().currentTime = getVideo().duration; } } function previousChapter(): void { if (Date.now() - lastNextChapterKeybind.date < 3000) { - video.currentTime = lastNextChapterKeybind.time; + getVideo().currentTime = lastNextChapterKeybind.time; lastNextChapterKeybind.date = 0; return; } const chapters = previewBar.unfilteredChapterGroups?.filter((time) => [ActionType.Chapter, null].includes(time.actionType)); if (!chapters || chapters.length <= 0) { - video.currentTime = 0; + getVideo().currentTime = 0; return; } // subtract 5 seconds to allow skipping back to the previous chapter if close to start of // the current one - const nextChapter = chapters.findIndex((time) => time.segment[0] > video.currentTime - Math.min(5, time.segment[1] - time.segment[0])); + const nextChapter = chapters.findIndex((time) => time.segment[0] > getVideo().currentTime - Math.min(5, time.segment[1] - time.segment[0])); const previousChapter = nextChapter !== -1 ? (nextChapter - 1) : (chapters.length - 1); if (previousChapter !== -1) { - video.currentTime = chapters[previousChapter].segment[0]; + getVideo().currentTime = chapters[previousChapter].segment[0]; } else { - video.currentTime = 0; + getVideo().currentTime = 0; } } -function addPageListeners(): void { - const refreshListners = () => { - if (!isVisible(video)) { - refreshVideoAttachments(); - } - }; +function addHotkeyListener(): void { + document.addEventListener("keydown", hotkeyListener); - // inject into document - const docScript = document.createElement("script"); - docScript.src = chrome.runtime.getURL("js/document.js"); - // Not injected on invidious - (document.head || document.documentElement)?.appendChild(docScript); + const onLoad = () => { + // Allow us to stop propagation to YouTube by being deeper + document.removeEventListener("keydown", hotkeyListener); + document.body.addEventListener("keydown", hotkeyListener); - document.addEventListener("yt-navigate-start", resetValues); - document.addEventListener("yt-navigate-finish", refreshListners); - window.addEventListener("message", windowListenerHandler); -} + addCleanupListener(() => { + document.body.removeEventListener("keydown", hotkeyListener); + }); + }; -function addHotkeyListener(): void { - document.addEventListener("keydown", hotkeyListener); + if (document.readyState === "complete") { + onLoad(); + } else { + document.addEventListener("DOMContentLoaded", onLoad); + } } function hotkeyListener(e: KeyboardEvent): void { @@ -2420,9 +2442,11 @@ function hotkeyListener(e: KeyboardEvent): void { submitSponsorTimes(); return; } else if (keybindEquals(key, nextChapterKey)) { + if (sponsorTimes.length > 0) e.stopPropagation(); nextChapter(); return; } else if (keybindEquals(key, previousChapterKey)) { + if (sponsorTimes.length > 0) e.stopPropagation(); previousChapter(); return; } @@ -2442,8 +2466,8 @@ 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)) { - window.addEventListener("DOMContentLoaded", () => { + if (!isFirefoxOrSafari() && Config.config.invidiousInstances.includes(new URL(document.URL).hostname)) { + const onLoad = () => { const head = document.getElementsByTagName("head")[0]; for (const file of utils.css) { @@ -2455,7 +2479,13 @@ function addCSS() { head.appendChild(fileref); } - }); + }; + + if (document.readyState === "complete") { + onLoad(); + } else { + document.addEventListener("DOMContentLoaded", onLoad); + } } } @@ -2463,23 +2493,24 @@ function addCSS() { * Update the isAdPlaying flag and hide preview bar/controls if ad is playing */ function updateAdFlag(): void { - const wasAdPlaying = isAdPlaying; - isAdPlaying = document.getElementsByClassName('ad-showing').length > 0; - if(wasAdPlaying != isAdPlaying) { + const wasAdPlaying = getIsAdPlaying(); + setIsAdPlaying(document.getElementsByClassName('ad-showing').length > 0); + if(wasAdPlaying != getIsAdPlaying()) { updatePreviewBar(); updateVisibilityOfPlayerControlsButton(); } } function showTimeWithoutSkips(skippedDuration: number): void { - if (onInvidious) return; - if (isNaN(skippedDuration) || skippedDuration < 0) { skippedDuration = 0; } // YouTube player time display - const displayClass = onMobileYouTube ? "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; @@ -2490,12 +2521,12 @@ 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); } - const durationAfterSkips = GenericUtils.getFormattedTime(video?.duration - skippedDuration); + const durationAfterSkips = getFormattedTime(getVideo()?.duration - skippedDuration); duration.innerText = (durationAfterSkips == null || skippedDuration <= 0) ? "" : " (" + durationAfterSkips + ")"; } @@ -2514,7 +2545,7 @@ function checkForPreloadedSegment() { if (!sponsorTimesSubmitting.some((s) => s.segment[0] === segment.segment[0] && s.segment[1] === s.segment[1])) { sponsorTimesSubmitting.push({ segment: segment.segment, - UUID: GenericUtils.generateUserID() as SegmentUUID, + UUID: generateUserID() as SegmentUUID, category: segment.category ? segment.category : Config.config.defaultCategory, actionType: segment.actionType ? segment.actionType : ActionType.Skip, description: segment.description ?? "", @@ -2528,23 +2559,32 @@ function checkForPreloadedSegment() { } if (pushed) { - Config.config.unsubmittedSegments[sponsorVideoID] = sponsorTimesSubmitting; + Config.config.unsubmittedSegments[getVideoID()] = sponsorTimesSubmitting; Config.forceSyncUpdate("unsubmittedSegments"); } } -// Register listener for URL change via Navigation API -const navigationApiAvailable = "navigation" in window; -if (navigationApiAvailable) { - // TODO: Remove type cast once type declarations are updated - (window as unknown as { navigation: EventTarget }).navigation.addEventListener("navigate", (e) => - videoIDChange(getYouTubeVideoID(document, (e as unknown as Record<string, Record<string, string>>).destination.url))); -} +// 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"; -// Record availability of Navigation API -utils.wait(() => Config.local !== null).then(() => { - if (Config.local.navigationApiAvailable !== navigationApiAvailable) { - Config.local.navigationApiAvailable = navigationApiAvailable; - Config.forceLocalUpdate("navigationApiAvailable"); + const head = (document.head || document.documentElement); + 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; +} diff --git a/src/document.ts b/src/document.ts index 595595b7..fb18ccb0 100644 --- a/src/document.ts +++ b/src/document.ts @@ -1,93 +1,3 @@ -/* - Content script are run in an isolated DOM so it is not possible to access some key details that are sanitized when passed cross-dom - This script is used to get the details from the page and make them available for the content script by being injected directly into the page -*/ +import { init } from "../maze-utils/src/injected/document"; -import { PageType } from "./types"; - -interface StartMessage { - type: "navigation"; - pageType: PageType; - videoID: string | null; -} - -interface FinishMessage extends StartMessage { - channelID: string; - channelTitle: string; -} - -interface AdMessage { - type: "ad"; - playing: boolean; -} - -interface VideoData { - type: "data"; - videoID: string; - isLive: boolean; - isPremiere: boolean; -} - -type WindowMessage = StartMessage | FinishMessage | AdMessage | VideoData; - -// global playerClient - too difficult to type -// eslint-disable-next-line @typescript-eslint/no-explicit-any -let playerClient: any; - -const sendMessage = (message: WindowMessage): void => { - window.postMessage({ source: "sponsorblock", ...message }, "/"); -} - -function setupPlayerClient(e: CustomEvent): void { - if (playerClient) return; // early exit if already defined - - playerClient = e.detail; - sendVideoData(); // send playerData after setup - - e.detail.addEventListener('onAdStart', () => sendMessage({ type: "ad", playing: true } as AdMessage)); - e.detail.addEventListener('onAdFinish', () => sendMessage({ type: "ad", playing: false } as AdMessage)); -} - -document.addEventListener("yt-player-updated", setupPlayerClient); -document.addEventListener("yt-navigate-start", navigationStartSend); -document.addEventListener("yt-navigate-finish", navigateFinishSend); - -function navigationParser(event: CustomEvent): StartMessage { - const pageType: PageType = event.detail.pageType; - if (pageType) { - const result: StartMessage = { type: "navigation", pageType, videoID: null }; - if (pageType === "shorts" || pageType === "watch") { - const endpoint = event.detail.endpoint - if (!endpoint) return null; - - result.videoID = (pageType === "shorts" ? endpoint.reelWatchEndpoint : endpoint.watchEndpoint).videoId; - } - - return result; - } else { - return null; - } -} - -function navigationStartSend(event: CustomEvent): void { - const message = navigationParser(event) as StartMessage; - if (message) { - sendMessage(message); - } -} - -function navigateFinishSend(event: CustomEvent): void { - sendVideoData(); // arrived at new video, send video data - const videoDetails = event.detail?.response?.playerResponse?.videoDetails; - if (videoDetails) { - sendMessage({ channelID: videoDetails.channelId, channelTitle: videoDetails.author, ...navigationParser(event) } as FinishMessage); - } -} - -function sendVideoData(): void { - if (!playerClient) return; - const videoData = playerClient.getVideoData(); - if (videoData) { - sendMessage({ type: "data", videoID: videoData.video_id, isLive: videoData.isLive, isPremiere: videoData.isPremiere } as VideoData); - } -}
\ No newline at end of file +init();
\ No newline at end of file diff --git a/src/help.ts b/src/help.ts index 9cc6b4bd..3b8c636b 100644 --- a/src/help.ts +++ b/src/help.ts @@ -1,15 +1,19 @@ +import { localizeHtmlPage } from "../maze-utils/src/setup"; import Config from "./config"; import { showDonationLink } from "./utils/configUtils"; -import { localizeHtmlPage } from "./utils/pageUtils"; -import { GenericUtils } from "./utils/genericUtils"; +import { waitFor } from "../maze-utils/src"; -window.addEventListener('DOMContentLoaded', init); +if (document.readyState === "complete") { + init(); +} else { + document.addEventListener("DOMContentLoaded", init); +} async function init() { localizeHtmlPage(); - await GenericUtils.wait(() => Config.config !== null); + await waitFor(() => Config.config !== null); if (!Config.config.darkMode) { document.documentElement.setAttribute("data-theme", "light"); diff --git a/src/js-components/previewBar.ts b/src/js-components/previewBar.ts index 84ebb155..74fae236 100644 --- a/src/js-components/previewBar.ts +++ b/src/js-components/previewBar.ts @@ -10,8 +10,10 @@ import { ChapterVote } from "../render/ChapterVote"; import { ActionType, Category, SegmentContainer, SponsorHideType, SponsorSourceType, SponsorTime } from "../types"; import { partition } from "../utils/arrayUtils"; import { DEFAULT_CATEGORY, shortCategoryName } from "../utils/categoryUtils"; -import { GenericUtils } from "../utils/genericUtils"; -import { findValidElement } from "../utils/pageUtils"; +import { normalizeChapterName } from "../utils/exporter"; +import { getFormattedTimeToSeconds } from "../../maze-utils/src/formating"; +import { findValidElement } from "../../maze-utils/src/dom"; +import { addCleanupListener } from "../../maze-utils/src/cleanup"; const TOOLTIP_VISIBLE_CLASS = 'sponsorCategoryTooltipVisible'; const MIN_CHAPTER_SIZE = 0.003; @@ -37,6 +39,10 @@ class PreviewBar { categoryTooltip?: HTMLDivElement; categoryTooltipContainer?: HTMLElement; chapterTooltip?: HTMLDivElement; + lastSmallestSegment: Record<string, { + index: number; + segment: PreviewBarSegment; + }> = {}; parent: HTMLElement; onMobileYouTube: boolean; @@ -57,6 +63,7 @@ class PreviewBar { originalChapterBar: HTMLElement; originalChapterBarBlocks: NodeListOf<HTMLElement>; chapterMargin: number; + lastRenderedSegments: PreviewBarSegment[]; unfilteredChapterGroups: ChapterGroup[]; chapterGroups: ChapterGroup[]; @@ -91,7 +98,9 @@ class PreviewBar { this.chapterTooltip = document.createElement("div"); this.chapterTooltip.className = "ytp-tooltip-title sponsorCategoryTooltip"; - const tooltipTextWrapper = document.querySelector(".ytp-tooltip-text-wrapper"); + // global chaper tooltip or duration tooltip + const tooltipTextWrapper = document.querySelector(".ytp-tooltip-text-wrapper") ?? document.querySelector("#progress-bar-container.ytk-player > #hover-time-info"); + const originalTooltip = tooltipTextWrapper.querySelector(".ytp-tooltip-title:not(.sponsorCategoryTooltip)") as HTMLElement; if (!tooltipTextWrapper || !tooltipTextWrapper.parentElement) return; // Grab the tooltip from the text wrapper as the tooltip doesn't have its classes on init @@ -118,8 +127,8 @@ class PreviewBar { const observer = new MutationObserver((mutations) => { if (!mouseOnSeekBar || !this.categoryTooltip || !this.categoryTooltipContainer) return; - // If the mutation observed is only for our tooltip text, ignore - if (mutations.some((mutation) => (mutation.target as HTMLElement).classList.contains("sponsorCategoryTooltip"))) { + // Only care about mutations to time tooltip + if (!mutations.some((mutation) => (mutation.target as HTMLElement).classList.contains("ytp-tooltip-text"))) { return; } @@ -133,19 +142,23 @@ class PreviewBar { const tooltipText = tooltipTextElement.textContent; if (tooltipText === null || tooltipText.length === 0) continue; - timeInSeconds = GenericUtils.getFormattedTimeToSeconds(tooltipText); + timeInSeconds = getFormattedTimeToSeconds(tooltipText); if (timeInSeconds !== null) break; } - if (timeInSeconds === null) return; + if (timeInSeconds === null) { + originalTooltip.style.removeProperty("display"); + + return; + } // Find the segment at that location, using the shortest if multiple found - 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); - let secondarySegment = this.getSmallestSegment(timeInSeconds, chapterSegments); + let mainSegment = this.getSmallestSegment(timeInSeconds, normalSegments, "normal"); + let secondarySegment = this.getSmallestSegment(timeInSeconds, chapterSegments, "chapter"); if (mainSegment === null && secondarySegment !== null) { mainSegment = secondarySegment; secondarySegment = this.getSmallestSegment(timeInSeconds, chapterSegments.filter((s) => s !== secondarySegment)); @@ -153,6 +166,7 @@ class PreviewBar { if (mainSegment === null && secondarySegment === null) { this.categoryTooltipContainer.classList.remove(TOOLTIP_VISIBLE_CLASS); + originalTooltip.style.removeProperty("display"); } else { this.categoryTooltipContainer.classList.add(TOOLTIP_VISIBLE_CLASS); if (mainSegment !== null && secondarySegment !== null) { @@ -164,6 +178,14 @@ class PreviewBar { this.setTooltipTitle(mainSegment, this.categoryTooltip); this.setTooltipTitle(secondarySegment, this.chapterTooltip); + if (normalizeChapterName(originalTooltip.textContent) === normalizeChapterName(this.categoryTooltip.textContent) + || normalizeChapterName(originalTooltip.textContent) === normalizeChapterName(this.chapterTooltip.textContent)) { + if (originalTooltip.style.display !== "none") originalTooltip.style.display = "none"; + noYoutubeChapters = true; + } else if (originalTooltip.style.display === "none") { + originalTooltip.style.removeProperty("display"); + } + // Used to prevent overlapping this.categoryTooltip.classList.toggle("ytp-tooltip-text-no-title", noYoutubeChapters); this.chapterTooltip.classList.toggle("ytp-tooltip-text-no-title", noYoutubeChapters); @@ -171,6 +193,8 @@ class PreviewBar { // To prevent offset issue this.categoryTooltip.style.right = titleTooltip.style.right; this.chapterTooltip.style.right = titleTooltip.style.right; + this.categoryTooltip.style.textAlign = titleTooltip.style.textAlign; + this.chapterTooltip.style.textAlign = titleTooltip.style.textAlign; } }); @@ -178,6 +202,10 @@ class PreviewBar { childList: true, subtree: true, }); + + addCleanupListener(() => { + observer.disconnect(); + }); } private setTooltipTitle(segment: PreviewBarSegment, tooltip: HTMLElement): void { @@ -270,7 +298,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; @@ -292,7 +320,7 @@ class PreviewBar { if (chapterChevron) { if (this.segments.some((segment) => segment.source === SponsorSourceType.YouTube)) { chapterChevron.style.removeProperty("display"); - } else { + } else if (this.segments) { chapterChevron.style.display = "none"; } } @@ -309,18 +337,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; } @@ -335,12 +367,17 @@ class PreviewBar { return; } - // Merge overlapping chapters - this.unfilteredChapterGroups = this.createChapterRenderGroups(segments); + const remakingBar = segments !== this.lastRenderedSegments; + if (remakingBar) { + this.lastRenderedSegments = segments; - if (segments.every((segments) => segments.source === SponsorSourceType.YouTube) - || (!Config.config.renderSegmentsAsChapters - && segments.every((segment) => segment.actionType !== ActionType.Chapter + // Merge overlapping chapters + this.unfilteredChapterGroups = this.createChapterRenderGroups(segments); + } + + 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"); @@ -423,7 +460,9 @@ class PreviewBar { } } - this.updateChapterAllMutation(this.originalChapterBar, this.progressBar, true); + if (remakingBar) { + this.updateChapterAllMutation(this.originalChapterBar, this.progressBar, true); + } } createChapterRenderGroups(segments: PreviewBarSegment[]): ChapterGroup[] { @@ -433,7 +472,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; @@ -581,6 +620,7 @@ class PreviewBar { for (const mutation of mutations) { if (mutation.type === "childList") { this.update(); + break; } } @@ -591,6 +631,11 @@ class PreviewBar { childListObserver.observe(this.originalChapterBar, { childList: true }); + + addCleanupListener(() => { + attributeObserver.disconnect(); + childListObserver.disconnect(); + }); } private updateChapterAllMutation(originalChapterBar: HTMLElement, progressBar: HTMLElement, firstUpdate = false): void { @@ -634,7 +679,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"; @@ -651,7 +696,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(); @@ -659,7 +704,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; @@ -676,8 +721,8 @@ class PreviewBar { for (let i = 0; i < sections.length; i++) { 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 currentSectionWidthNoMargin = this.getPartialChapterSectionStyle(section, "width") ?? progressBar.clientWidth; + const currentSectionWidth = currentSectionWidthNoMargin + this.getPartialChapterSectionStyle(section, "marginRight"); // First check for left @@ -720,37 +765,40 @@ class PreviewBar { currentWidth += lastWidth; } - return { - left: left + leftPosition, + return { + left: left + leftPosition, scale: scale !== null ? scale * scaleWidth + scalePosition : null }; } private getPartialChapterSectionStyle(element: HTMLElement, param: string): number { const data = element.style[param]; - if (data?.includes("100%")) { - return 0; + if (data?.includes("%")) { + return this.customChaptersBar.clientWidth * (parseFloat(data.replace("%", "")) / 100); } else { return parseInt(element.style[param].match(/\d+/g)?.[0]) || 0; } } 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); - if (chapterButton.classList.contains("ytp-chapter-container-disabled")) { - chaptersContainer.style.display = "none"; + if (chaptersContainer) { + chaptersContainer.querySelector(".sponsorChapterText")?.remove(); + const chapterTitle = chaptersContainer.querySelector(".ytp-chapter-title-content") as HTMLDivElement; + + chapterTitle.style.removeProperty("display"); + chaptersContainer.classList.remove("sponsorblock-chapter-visible"); } - return; + return []; } 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; }); @@ -767,7 +815,7 @@ class PreviewBar { if (chaptersContainer) { if (segments.length > 0) { - chaptersContainer.style.removeProperty("display"); + chaptersContainer.classList.add("sponsorblock-chapter-visible"); const chosenSegment = segments.sort((a, b) => { if (a.actionType === ActionType.Chapter && b.actionType !== ActionType.Chapter) { @@ -784,7 +832,16 @@ class PreviewBar { chapterButton.disabled = false; const chapterTitle = chaptersContainer.querySelector(".ytp-chapter-title-content") as HTMLDivElement; - chapterTitle.innerText = chosenSegment.description || shortCategoryName(chosenSegment.category); + chapterTitle.style.display = "none"; + + const chapterCustomText = (chapterTitle.parentElement.querySelector(".sponsorChapterText") || (() => { + const elem = document.createElement("div"); + chapterTitle.parentElement.insertBefore(elem, chapterTitle); + elem.classList.add("sponsorChapterText"); + return elem; + })()) as HTMLDivElement; + chapterCustomText.innerText = chosenSegment.description || shortCategoryName(chosenSegment.category); + if (chosenSegment.actionType !== ActionType.Chapter) { chapterTitle.classList.add("sponsorBlock-segment-title"); } else { @@ -798,7 +855,7 @@ class PreviewBar { if (oldVoteContainers.length > 0) { oldVoteContainers.forEach((oldVoteContainer) => oldVoteContainer.remove()); } - + chapterButton.insertBefore(chapterVoteContainer, this.getChapterChevron()); } @@ -808,7 +865,12 @@ class PreviewBar { this.chapterVote.setVisibility(false); } } else { - chaptersContainer.style.display = "none"; + chaptersContainer.querySelector(".sponsorChapterText")?.remove(); + const chapterTitle = chaptersContainer.querySelector(".ytp-chapter-title-content") as HTMLDivElement; + + chapterTitle.style.removeProperty("display"); + chaptersContainer.classList.remove("sponsorblock-chapter-visible"); + this.chapterVote.setVisibility(false); } } @@ -820,7 +882,7 @@ class PreviewBar { private getChapterButton(chaptersContainer: HTMLElement): HTMLButtonElement { return (chaptersContainer ?? this.getChaptersContainer()) - .querySelector("button.ytp-chapter-title") as HTMLButtonElement; + ?.querySelector("button.ytp-chapter-title") as HTMLButtonElement; } remove(): void { @@ -868,7 +930,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; @@ -883,8 +945,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))); } @@ -900,11 +962,18 @@ class PreviewBar { return this.videoDuration * (showLarger ? 0.006 : 0.003); } - private getSmallestSegment(timeInSeconds: number, segments: PreviewBarSegment[]): PreviewBarSegment | null { + // Name parameter used for cache + private getSmallestSegment(timeInSeconds: number, segments: PreviewBarSegment[], name?: string): PreviewBarSegment | null { + const proposedIndex = name ? this.lastSmallestSegment[name]?.index : null; + const startSearchIndex = proposedIndex && segments[proposedIndex] === this.lastSmallestSegment[name].segment ? proposedIndex : 0; + const direction = startSearchIndex > 0 && timeInSeconds < this.lastSmallestSegment[name].segment.segment[0] ? -1 : 1; + let segment: PreviewBarSegment | null = null; + let index = -1; let currentSegmentLength = Infinity; - for (const seg of segments) { // + for (let i = startSearchIndex; i < segments.length && i >= 0; i += direction) { + const seg = segments[i]; const segmentLength = seg.segment[1] - seg.segment[0]; const minSize = this.getMinimumSize(seg.showLarger); @@ -914,8 +983,20 @@ class PreviewBar { if (segmentLength < currentSegmentLength) { currentSegmentLength = segmentLength; segment = seg; + index = i; } } + + if (direction === 1 && seg.segment[0] > timeInSeconds) { + break; + } + } + + if (segment) { + this.lastSmallestSegment[name] = { + index: index, + segment: segment + }; } return segment; diff --git a/src/js-components/skipButtonControlBar.ts b/src/js-components/skipButtonControlBar.ts index 11bbf1ac..f8b2439f 100644 --- a/src/js-components/skipButtonControlBar.ts +++ b/src/js-components/skipButtonControlBar.ts @@ -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 "../../maze-utils/src/config"; export interface SkipButtonControlBarProps { skip: (segment: SponsorTime) => void; @@ -102,6 +102,7 @@ export class SkipButtonControlBar { this.enabled = true; this.refreshText(); + this.container?.classList?.remove("textDisabled"); this.textContainer?.classList?.remove("hidden"); AnimationUtils.disableAutoHideAnimation(this.skipIcon); @@ -134,7 +135,6 @@ export class SkipButtonControlBar { disable(): void { this.container.classList.add("hidden"); - this.textContainer?.classList?.remove("hidden"); this.chapterText?.classList?.remove("hidden"); this.getChapterPrefix()?.classList?.remove("hidden"); @@ -142,6 +142,10 @@ export class SkipButtonControlBar { this.enabled = false; } + isEnabled(): boolean { + return this.enabled; + } + toggleSkip(): void { this.skip(this.segment); this.disableText(); diff --git a/src/options.ts b/src/options.ts index 888e7aaf..8f89ecde 100644 --- a/src/options.ts +++ b/src/options.ts @@ -13,15 +13,22 @@ 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 { StorageChangesObject } from "./types"; +import { localizeHtmlPage } from "../maze-utils/src/setup"; +import { StorageChangesObject } from "../maze-utils/src/config"; +import { getHash } from "../maze-utils/src/hash"; +import { isFirefoxOrSafari } from "../maze-utils/src"; +import { isDeArrowInstalled } from "./utils/crossExtension"; const utils = new Utils(); let embed = false; const categoryChoosers: CategoryChooser[] = []; const unsubmittedVideos: UnsubmittedVideos[] = []; -window.addEventListener('DOMContentLoaded', init); +if (document.readyState === "complete") { + init(); +} else { + document.addEventListener("DOMContentLoaded", init); +} async function init() { localizeHtmlPage(); @@ -66,6 +73,18 @@ async function init() { donate.classList.add("hidden"); } + // DeArrow promotion + if (Config.config.showNewFeaturePopups && Config.config.showUpsells) { + isDeArrowInstalled().then((installed) => { + if (!installed) { + const deArrowPromotion = document.getElementById("deArrowPromotion"); + deArrowPromotion.classList.remove("hidden"); + + deArrowPromotion.addEventListener("click", () => Config.config.showDeArrowPromotion = false); + } + }); + } + // Set all of the toggle options to the correct option const optionsContainer = document.getElementById("options"); const optionsElements = optionsContainer.querySelectorAll("*"); @@ -185,7 +204,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 + "/"], @@ -430,7 +449,12 @@ function invidiousInstanceAddInit(element: HTMLElement, option: string) { let instanceList = Config.config[option]; if (!instanceList) instanceList = []; - instanceList.push(textBox.value); + let domain = textBox.value.trim().toLowerCase(); + if (domain.includes(":")) { + domain = domain.split(":")[0]; + } + + instanceList.push(domain); Config.config[option] = instanceList; @@ -532,7 +556,7 @@ function activatePrivateTextChange(element: HTMLElement) { case "userID": if (Config.config[option]) { utils.asyncRequestToServer("GET", "/api/userInfo", { - userID: Config.config[option], + publicUserID: getHash(Config.config[option]), values: ["warnings", "banned"] }).then((result) => { const userInfo = JSON.parse(result.responseText); @@ -672,4 +696,4 @@ function copyDebugOutputToClipboard() { function isIncognitoAllowed(): Promise<boolean> { return new Promise((resolve) => chrome.extension.isAllowedIncognitoAccess(resolve)); -}
\ No newline at end of file +} diff --git a/src/permissions.ts b/src/permissions.ts index 1e2c1119..e42a08d8 100644 --- a/src/permissions.ts +++ b/src/permissions.ts @@ -1,13 +1,17 @@ import Config from "./config"; import Utils from "./utils"; -import { localizeHtmlPage } from "./utils/pageUtils"; +import { localizeHtmlPage } from "../maze-utils/src/setup"; const utils = new Utils(); // This is needed, if Config is not imported before Utils, things break. // Probably due to cyclic dependencies Config.config; -window.addEventListener('DOMContentLoaded', init); +if (document.readyState === "complete") { + init(); +} else { + document.addEventListener("DOMContentLoaded", init); +} async function init() { localizeHtmlPage(); diff --git a/src/popup.ts b/src/popup.ts index ede826e2..02404b6a 100644 --- a/src/popup.ts +++ b/src/popup.ts @@ -7,7 +7,6 @@ import { SponsorHideType, SponsorSourceType, SponsorTime, - StorageChangesObject, } from "./types"; import { GetChannelIDResponse, @@ -21,12 +20,13 @@ 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 "../maze-utils/src/setup"; import { exportTimes } from "./utils/exporter"; import GenericNotice from "./render/GenericNotice"; -import { noRefreshFetchingChaptersAllowed } from "./utils/licenseKey"; +import { getErrorMessage, getFormattedTime } from "../maze-utils/src/formating"; +import { StorageChangesObject } from "../maze-utils/src/config"; +import { getHash } from "../maze-utils/src/hash"; const utils = new Utils(); @@ -67,9 +67,11 @@ class MessageHandler { // To prevent clickjacking let allowPopup = window === window.top; -window.addEventListener("message", async (e) => { +window.addEventListener("message", async (e): Promise<void> => { if (e.source !== window.parent) return; - if (e.origin.endsWith('.youtube.com')) return allowPopup = true; + if (e.origin.endsWith('.youtube.com')) { + allowPopup = true; + } }); //make this a function to allow this to run on the content page @@ -228,7 +230,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> { PageElements.optionsButton.addEventListener("click", openOptions); PageElements.helpButton.addEventListener("click", openHelp); PageElements.refreshSegmentsButton.addEventListener("click", refreshSegments); - PageElements.sbPopupIconCopyUserID.addEventListener("click", async () => copyToClipboard(await utils.getHash(Config.config.userID))); + PageElements.sbPopupIconCopyUserID.addEventListener("click", async () => copyToClipboard(await getHash(Config.config.userID))); // Forward click events if (window !== window.top) { @@ -278,10 +280,9 @@ 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", { - userID: Config.config.userID, + publicUserID: await getHash(Config.config.userID), values }).then((res) => { if (res.status === 200) { @@ -313,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"); - } } }); @@ -456,8 +450,13 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> { PageElements.videoFound.innerHTML = chrome.i18n.getMessage("sponsor404"); PageElements.issueReporterImportExport.classList.remove("hidden"); } else { - PageElements.videoFound.innerHTML = chrome.i18n.getMessage("connectionError") + request.status; - PageElements.issueReporterImportExport.classList.add("hidden"); + if (request.status) { + PageElements.videoFound.innerHTML = chrome.i18n.getMessage("connectionError") + request.status; + } else { + PageElements.videoFound.innerHTML = chrome.i18n.getMessage("segmentsStillLoading"); + } + + PageElements.issueReporterImportExport.classList.remove("hidden"); } } @@ -586,9 +585,9 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> { if (downloadedTimes[i].actionType === ActionType.Full) { segmentTimeFromToNode.innerText = chrome.i18n.getMessage("full"); } else { - segmentTimeFromToNode.innerText = GenericUtils.getFormattedTime(downloadedTimes[i].segment[0], true) + + segmentTimeFromToNode.innerText = getFormattedTime(downloadedTimes[i].segment[0], true) + (actionType !== ActionType.Poi - ? " " + chrome.i18n.getMessage("to") + " " + GenericUtils.getFormattedTime(downloadedTimes[i].segment[1], true) + ? " " + chrome.i18n.getMessage("to") + " " + getFormattedTime(downloadedTimes[i].segment[1], true) : ""); } @@ -609,6 +608,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> { const votingButtons = document.createElement("details"); votingButtons.classList.add("votingButtons"); votingButtons.id = "votingButtons" + UUID; + votingButtons.setAttribute("data-uuid", UUID); votingButtons.addEventListener("toggle", () => { if (votingButtons.open) { openedUUIDs.push(UUID); @@ -693,6 +693,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> { voteButtonsContainer.appendChild(downvoteButton); voteButtonsContainer.appendChild(uuidButton); if (downloadedTimes[i].actionType === ActionType.Skip || downloadedTimes[i].actionType === ActionType.Mute + || downloadedTimes[i].actionType === ActionType.Poi && [SponsorHideType.Visible, SponsorHideType.Hidden].includes(downloadedTimes[i].hidden)) { voteButtonsContainer.appendChild(hideButton); } @@ -813,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); } }); @@ -866,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); } @@ -1062,10 +1063,37 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> { port.onMessage.addListener((msg) => onMessage(msg)); } + function updateCurrentTime(currentTime: number) { + // Create a map of segment UUID -> segment object for easy access + const segmentMap: Record<string, SponsorTime> = {}; + for (const segment of downloadedTimes) + segmentMap[segment.UUID] = segment + + // Iterate over segment elements and update their classes + const segmentList = document.getElementById("issueReporterTimeButtons"); + for (const segmentElement of segmentList.children) { + const UUID = segmentElement.getAttribute("data-uuid"); + if (UUID == null || segmentMap[UUID] == undefined) continue; + + const summaryElement = segmentElement.querySelector("summary") + if (summaryElement == null) continue; + + const segment = segmentMap[UUID] + summaryElement.classList.remove("segmentActive", "segmentPassed") + if (currentTime >= segment.segment[0]) { + if (currentTime < segment.segment[1]) { + summaryElement.classList.add("segmentActive"); + } else { + summaryElement.classList.add("segmentPassed"); + } + } + } + } + function onMessage(msg: PopupMessage) { switch (msg.message) { case "time": - displayDownloadedSponsorTimes(downloadedTimes, msg.time); + updateCurrentTime(msg.time); break; case "infoUpdated": infoFound(msg); diff --git a/src/render/CategoryPill.tsx b/src/render/CategoryPill.tsx index e5d8f96e..57730af9 100644 --- a/src/render/CategoryPill.tsx +++ b/src/render/CategoryPill.tsx @@ -4,61 +4,94 @@ import CategoryPillComponent, { CategoryPillState } from "../components/Category import Config from "../config"; import { VoteResponse } from "../messageTypes"; import { Category, SegmentUUID, SponsorTime } from "../types"; -import { GenericUtils } from "../utils/genericUtils"; import { Tooltip } from "./Tooltip"; +import { waitFor } from "../../maze-utils/src"; +import { getYouTubeTitleNode } from "../../maze-utils/src/elements"; +import { addCleanupListener } from "../../maze-utils/src/cleanup"; + +const id = "categoryPill"; export class CategoryPill { container: HTMLElement; ref: React.RefObject<CategoryPillComponent>; root: Root; - unsavedState: CategoryPillState; + lastState: CategoryPillState; mutationObserver?: MutationObserver; + onMobileYouTube: boolean; + onInvidious: boolean; + vote: (type: number, UUID: SegmentUUID, category?: Category) => Promise<VoteResponse>; constructor() { this.ref = React.createRef(); + + addCleanupListener(() => { + if (this.mutationObserver) { + this.mutationObserver.disconnect(); + } + }); } async attachToPage(onMobileYouTube: boolean, onInvidious: boolean, vote: (type: number, UUID: SegmentUUID, category?: Category) => Promise<VoteResponse>): Promise<void> { - const referenceNode = - await GenericUtils.wait(() => - // New YouTube Title, YouTube, Mobile YouTube, Invidious - document.querySelector("#title h1, .ytd-video-primary-info-renderer.title, .slim-video-information-title, #player-container + .h-box > h1") as HTMLElement); + this.onMobileYouTube = onMobileYouTube; + this.onInvidious = onInvidious; + this.vote = vote; - if (referenceNode && !referenceNode.contains(this.container)) { - this.container = document.createElement('span'); - this.container.id = "categoryPill"; - this.container.style.display = "relative"; + this.attachToPageInternal(); + } - referenceNode.prepend(this.container); - referenceNode.style.display = "flex"; + private async attachToPageInternal(): Promise<void> { + const referenceNode = + await waitFor(() => getYouTubeTitleNode()); - if (this.ref.current) { - this.unsavedState = this.ref.current.state; + if (referenceNode && !referenceNode.contains(this.container)) { + if (!this.container) { + this.container = document.createElement('span'); + this.container.id = id; + this.container.style.display = "relative"; + + this.root = createRoot(this.container); + this.ref = React.createRef(); + this.root.render(<CategoryPillComponent + ref={this.ref} + vote={this.vote} + showTextByDefault={!this.onMobileYouTube} + showTooltipOnClick={this.onMobileYouTube} />); + + if (this.onMobileYouTube) { + if (this.mutationObserver) { + this.mutationObserver.disconnect(); + } + + this.mutationObserver = new MutationObserver((changes) => { + if (changes.some((change) => change.removedNodes.length > 0)) { + this.attachToPageInternal(); + } + }); + + this.mutationObserver.observe(referenceNode, { + childList: true, + subtree: true + }); + } } - this.root = createRoot(this.container); - this.root.render(<CategoryPillComponent ref={this.ref} vote={vote} />); - - if (this.unsavedState) { - this.ref.current?.setState(this.unsavedState); - this.unsavedState = null; + if (this.lastState) { + waitFor(() => this.ref.current).then(() => { + this.ref.current?.setState(this.lastState); + }); } - if (onMobileYouTube) { - if (this.mutationObserver) { - this.mutationObserver.disconnect(); - } - - this.mutationObserver = new MutationObserver(() => this.attachToPage(onMobileYouTube, onInvidious, vote)); + // Use a parent because YouTube does weird things to the top level object + // react would have to rerender if container was the top level + const parent = document.createElement("span"); + parent.id = "categoryPillParent"; + parent.appendChild(this.container); - this.mutationObserver.observe(referenceNode, { - childList: true, - subtree: true - }); - } + referenceNode.prepend(parent); + referenceNode.style.display = "flex"; } } @@ -73,11 +106,8 @@ export class CategoryPill { open: show ? this.ref.current?.state.open : false }; - if (this.ref.current) { - this.ref.current?.setState(newState); - } else { - this.unsavedState = newState; - } + this.ref.current?.setState(newState); + this.lastState = newState; } async setSegment(segment: SponsorTime): Promise<void> { @@ -88,16 +118,13 @@ export class CategoryPill { open: false }; - if (this.ref.current) { - this.ref.current?.setState(newState); - } else { - this.unsavedState = newState; - } + this.ref.current?.setState(newState); + this.lastState = newState; if (!Config.config.categoryPillUpdate) { Config.config.categoryPillUpdate = true; - const watchDiv = await GenericUtils.wait(() => document.querySelector("#info.ytd-watch-flexy") as HTMLElement); + const watchDiv = await waitFor(() => document.querySelector("#info.ytd-watch-flexy") as HTMLElement); if (watchDiv) { new Tooltip({ text: chrome.i18n.getMessage("categoryPillNewFeature"), @@ -111,5 +138,9 @@ export class CategoryPill { } } } + + if (this.onMobileYouTube && !document.contains(this.container)) { + this.attachToPageInternal(); + } } }
\ No newline at end of file diff --git a/src/render/GenericNotice.tsx b/src/render/GenericNotice.tsx index f3cc7a2e..d1a4443c 100644 --- a/src/render/GenericNotice.tsx +++ b/src/render/GenericNotice.tsx @@ -5,8 +5,9 @@ import NoticeComponent from "../components/NoticeComponent"; import Utils from "../utils"; const utils = new Utils(); -import { ButtonListener, ContentContainer } from "../types"; +import { ContentContainer } from "../types"; import NoticeTextSelectionComponent from "../components/NoticeTextSectionComponent"; +import { ButtonListener } from "../../maze-utils/src/components/component-types"; export interface TextBox { icon: string; @@ -46,6 +47,7 @@ export default class GenericNotice { const referenceNode = options.referenceNode ?? utils.findReferenceNode(); this.noticeElement = document.createElement("div"); + this.noticeElement.className = "sponsorSkipNoticeContainer"; this.noticeElement.id = "sponsorSkipNoticeContainer" + idSuffix; referenceNode.prepend(this.noticeElement); diff --git a/src/render/SkipNotice.tsx b/src/render/SkipNotice.tsx index b1be46a2..a5c83fd9 100644 --- a/src/render/SkipNotice.tsx +++ b/src/render/SkipNotice.tsx @@ -38,6 +38,7 @@ class SkipNotice { idSuffix += amountOfPreviousNotices; this.noticeElement = document.createElement("div"); + this.noticeElement.className = "sponsorSkipNoticeContainer"; this.noticeElement.id = "sponsorSkipNoticeContainer" + idSuffix; referenceNode.prepend(this.noticeElement); diff --git a/src/render/Tooltip.tsx b/src/render/Tooltip.tsx index 7c89dd8e..d08c0f61 100644 --- a/src/render/Tooltip.tsx +++ b/src/render/Tooltip.tsx @@ -1,129 +1,7 @@ -import * as React from "react"; -import { createRoot, Root } from 'react-dom/client'; -import { ButtonListener } from "../types"; +import { GenericTooltip, TooltipProps } from "../../maze-utils/src/components/Tooltip"; -export interface TooltipProps { - text?: string; - link?: string; - linkOnClick?: () => void; - referenceNode: HTMLElement; - prependElement?: HTMLElement; // Element to append before - bottomOffset?: string; - leftOffset?: string; - rightOffset?: string; - timeout?: number; - opacity?: number; - displayTriangle?: boolean; - extraClass?: string; - showLogo?: boolean; - showGotIt?: boolean; - positionRealtive?: boolean; - buttons?: ButtonListener[]; -} - -export class Tooltip { - text?: string; - container: HTMLDivElement; - - timer: NodeJS.Timeout; - root: Root; - +export class Tooltip extends GenericTooltip { constructor(props: TooltipProps) { - props.bottomOffset ??= "70px"; - props.leftOffset ??= "inherit"; - props.rightOffset ??= "inherit"; - props.opacity ??= 0.7; - props.displayTriangle ??= true; - props.extraClass ??= ""; - props.showLogo ??= true; - props.showGotIt ??= true; - props.positionRealtive ??= true; - this.text = props.text; - - this.container = document.createElement('div'); - this.container.id = "sponsorTooltip" + props.text; - if (props.positionRealtive) this.container.style.position = "relative"; - - if (props.prependElement) { - props.referenceNode.insertBefore(this.container, props.prependElement); - } else { - props.referenceNode.appendChild(this.container); - } - - if (props.timeout) { - this.timer = setTimeout(() => this.close(), props.timeout * 1000); - } - - const backgroundColor = `rgba(28, 28, 28, ${props.opacity})`; - - this.root = createRoot(this.container); - this.root.render( - <div style={{bottom: props.bottomOffset, left: props.leftOffset, right: props.rightOffset, backgroundColor}} - className={"sponsorBlockTooltip" + (props.displayTriangle ? " sbTriangle" : "") + ` ${props.extraClass}`}> - <div> - {props.showLogo ? - <img className="sponsorSkipLogo sponsorSkipObject" - src={chrome.extension.getURL("icons/IconSponsorBlocker256px.png")}> - </img> - : null} - {this.text ? - <span className="sponsorSkipObject"> - {this.text + (props.link ? ". " : "")} - {props.link ? - <a style={{textDecoration: "underline"}} - target="_blank" - rel="noopener noreferrer" - href={props.link}> - {chrome.i18n.getMessage("LearnMore")} - </a> - : (props.linkOnClick ? - <a style={{textDecoration: "underline", marginLeft: "5px", cursor: "pointer"}} - onClick={props.linkOnClick}> - {chrome.i18n.getMessage("LearnMore")} - </a> - : null)} - </span> - : null} - - {this.getButtons(props.buttons)} - </div> - {props.showGotIt ? - <button className="sponsorSkipObject sponsorSkipNoticeButton" - style ={{float: "right" }} - onClick={() => this.close()}> - - {chrome.i18n.getMessage("GotIt")} - </button> - : null} - </div> - ) - } - - getButtons(buttons?: ButtonListener[]): JSX.Element[] { - if (buttons) { - const result: JSX.Element[] = []; - - for (const button of buttons) { - result.push( - <button className="sponsorSkipObject sponsorSkipNoticeButton sponsorSkipNoticeRightButton" - key={button.name} - onClick={(e) => button.listener(e)}> - - {button.name} - </button> - ) - } - - return result; - } else { - return null; - } - } - - close(): void { - this.root.unmount(); - this.container.remove(); - - if (this.timer) clearTimeout(this.timer); + super(props, "icons/IconSponsorBlocker256px.png") } }
\ No newline at end of file diff --git a/src/svg-icons/sb_svg.tsx b/src/svg-icons/sb_svg.tsx new file mode 100644 index 00000000..bb4a2472 --- /dev/null +++ b/src/svg-icons/sb_svg.tsx @@ -0,0 +1,55 @@ +import * as React from "react"; + +export interface SbIconProps { + id?: string; + fill?: string; + className?: string; + width?: string; + height?: string; + onClick?: () => void; +} + +export default function SbSvg({ + id = "", + fill = "#ff0000", + className = "", + onClick +}: SbIconProps): JSX.Element { + return ( + <svg + xmlns="http://www.w3.org/2000/svg" + viewBox="0 0 565.15 568" + id={id} + className={className} + onClick={() => onClick?.() } > + <g + id="Layer_2" + data-name="Layer 2"> + <g + id="Layer_1-2" + data-name="Layer 1" + style={{ + fill + }}> + <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" + id="path8" + style={{ + fill + }} /> + <path + style={{ + fill + }} + 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 " + id="path10" /> + </g> + </g> + <polygon style={{ + fill: "#fff" + }} + points="411.28 255.94 220.41 145.74 220.41 366.14 411.28 255.94" + /> + </svg> + ); +}
\ No newline at end of file diff --git a/src/types.ts b/src/types.ts index 9be4f9ce..460a308d 100644 --- a/src/types.ts +++ b/src/types.ts @@ -26,19 +26,12 @@ export interface ContentContainer { }; } -export interface FetchResponse { - responseText: string; - status: number; - ok: boolean; -} - -export type HashedValue = string & { __hashBrand: unknown }; - export interface VideoDurationResponse { duration: number; } export enum CategorySkipOption { + Disabled = -1, ShowOverlay, ManualSkip, AutoSkip @@ -106,8 +99,8 @@ export interface Registration { message: string; id: string; allFrames: boolean; - js: browser.extensionTypes.ExtensionFileOrCode[]; - css: browser.extensionTypes.ExtensionFileOrCode[]; + js: string[]; + css: string[]; matches: string[]; } @@ -194,8 +187,6 @@ export interface VideoInfo { export type VideoID = string; -export type StorageChangesObject = { [key: string]: chrome.storage.StorageChange }; - export type UnEncodedSegmentTimes = [string, SponsorTime[]][]; export enum ChannelIDStatus { @@ -229,26 +220,4 @@ export enum NoticeVisbilityMode { MiniForAll = 2, FadedForAutoSkip = 3, FadedForAll = 4 -} - -export type Keybind = { - key: string; - code?: string; - ctrl?: boolean; - alt?: boolean; - shift?: boolean; -} - -export enum PageType { - Shorts = "shorts", - Watch = "watch", - Search = "search", - Browse = "browse", - Channel = "channel", - Embed = "embed" -} - -export interface ButtonListener { - name: string; - listener: (e?: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void; }
\ No newline at end of file diff --git a/src/upsell.ts b/src/upsell.ts deleted file mode 100644 index 1396d705..00000000 --- a/src/upsell.ts +++ /dev/null @@ -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); - }); -}
\ No newline at end of file diff --git a/src/utils.ts b/src/utils.ts index 15cfd001..7b3a3841 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,9 +1,12 @@ import Config, { VideoDownvotes } from "./config"; -import { CategorySelection, SponsorTime, FetchResponse, BackgroundScriptContainer, Registration, HashedValue, VideoID, SponsorHideType } from "./types"; +import { CategorySelection, SponsorTime, BackgroundScriptContainer, Registration, VideoID, SponsorHideType, CategorySkipOption } from "./types"; +import { getHash, HashedValue } from "../maze-utils/src/hash"; import * as CompileConfig from "../config.json"; -import { findValidElement, findValidElementFromSelector } from "./utils/pageUtils"; -import { GenericUtils } from "./utils/genericUtils"; +import { isFirefoxOrSafari, waitFor } from "../maze-utils/src"; +import { findValidElementFromSelector } from "../maze-utils/src/dom"; +import { FetchResponse, sendRequestToCustomServer } from "../maze-utils/src/background-request-proxy" +import { isSafari } from "../maze-utils/src/config"; export default class Utils { @@ -12,94 +15,21 @@ export default class Utils { // Used to add content scripts and CSS required js = [ - "./js/vendor.js", "./js/content.js" ]; css = [ "content.css", "./libs/Source+Sans+Pro.css", - "popup.css" + "popup.css", + "shared.css" ]; - /* Used for waitForElement */ - creatingWaitingMutationObserver = false; - waitingMutationObserver: MutationObserver = null; - waitingElements: { selector: string; visibleCheck: boolean; callback: (element: Element) => void }[] = []; - constructor(backgroundScriptContainer: BackgroundScriptContainer = null) { this.backgroundScriptContainer = backgroundScriptContainer; } async wait<T>(condition: () => T, timeout = 5000, check = 100): Promise<T> { - return GenericUtils.wait(condition, timeout, check); - } - - /* Uses a mutation observer to wait asynchronously */ - async waitForElement(selector: string, visibleCheck = false): Promise<Element> { - return await new Promise((resolve) => { - const initialElement = this.getElement(selector, visibleCheck); - if (initialElement) { - resolve(initialElement); - return; - } - - this.waitingElements.push({ - selector, - visibleCheck, - callback: resolve - }); - - if (!this.creatingWaitingMutationObserver) { - this.creatingWaitingMutationObserver = true; - - if (document.body) { - this.setupWaitingMutationListener(); - } else { - window.addEventListener("DOMContentLoaded", () => { - this.setupWaitingMutationListener(); - }); - } - } - }); - } - - private setupWaitingMutationListener(): void { - if (!this.waitingMutationObserver) { - const checkForObjects = () => { - const foundSelectors = []; - for (const { selector, visibleCheck, callback } of this.waitingElements) { - const element = this.getElement(selector, visibleCheck); - if (element) { - callback(element); - foundSelectors.push(selector); - } - } - - this.waitingElements = this.waitingElements.filter((element) => !foundSelectors.includes(element.selector)); - - if (this.waitingElements.length === 0) { - this.waitingMutationObserver?.disconnect(); - this.waitingMutationObserver = null; - this.creatingWaitingMutationObserver = false; - } - }; - - // Do an initial check over all objects - checkForObjects(); - - if (this.waitingElements.length > 0) { - this.waitingMutationObserver = new MutationObserver(checkForObjects); - - this.waitingMutationObserver.observe(document.body, { - childList: true, - subtree: true - }); - } - } - } - - private getElement(selector: string, visibleCheck: boolean) { - return visibleCheck ? findValidElement(document.querySelectorAll(selector)) : document.querySelector(selector); + return waitFor(condition, timeout, check); } containsPermission(permissions: chrome.permissions.Permissions): Promise<boolean> { @@ -117,9 +47,13 @@ export default class Utils { * @param {CallableFunction} callback */ setupExtraSitePermissions(callback: (granted: boolean) => void): void { - // Request permission - let permissions = ["declarativeContent"]; - if (this.isFirefox()) permissions = []; + const permissions = []; + if (!isFirefoxOrSafari()) { + permissions.push("declarativeContent"); + } + if (!isFirefoxOrSafari() || isSafari()) { + permissions.push("webNavigation"); + } chrome.permissions.request({ origins: this.getPermissionRegex(), @@ -143,52 +77,19 @@ export default class Utils { * For now, it is just SB.config.invidiousInstances. */ setupExtraSiteContentScripts(): void { - if (this.isFirefox()) { - const firefoxJS = []; - for (const file of this.js) { - firefoxJS.push({file}); - } - const firefoxCSS = []; - for (const file of this.css) { - firefoxCSS.push({file}); - } - - const registration: Registration = { - message: "registerContentScript", - id: "invidious", - allFrames: true, - js: firefoxJS, - css: firefoxCSS, - matches: this.getPermissionRegex() - }; - - if (this.backgroundScriptContainer) { - this.backgroundScriptContainer.registerFirefoxContentScript(registration); - } else { - chrome.runtime.sendMessage(registration); - } + const registration: Registration = { + message: "registerContentScript", + id: "invidious", + allFrames: true, + js: this.js, + css: this.css, + matches: this.getPermissionRegex() + }; + + if (this.backgroundScriptContainer) { + this.backgroundScriptContainer.registerFirefoxContentScript(registration); } else { - chrome.declarativeContent.onPageChanged.removeRules(["invidious"], () => { - const conditions = []; - for (const regex of this.getPermissionRegex()) { - conditions.push(new chrome.declarativeContent.PageStateMatcher({ - pageUrl: { urlMatches: regex } - })); - } - - // Add page rule - const rule = { - id: "invidious", - conditions, - actions: [new chrome.declarativeContent.RequestContentScript({ - allFrames: true, - js: this.js, - css: this.css - })] - }; - - chrome.declarativeContent.onPageChanged.addRules([rule]); - }); + chrome.runtime.sendMessage(registration); } } @@ -196,18 +97,18 @@ export default class Utils { * Removes the permission and content script registration. */ removeExtraSiteRegistration(): void { - if (this.isFirefox()) { - const id = "invidious"; + const id = "invidious"; - if (this.backgroundScriptContainer) { - this.backgroundScriptContainer.unregisterFirefoxContentScript(id); - } else { - chrome.runtime.sendMessage({ - message: "unregisterContentScript", - id: id - }); - } - } else if (chrome.declarativeContent) { + if (this.backgroundScriptContainer) { + this.backgroundScriptContainer.unregisterFirefoxContentScript(id); + } else { + chrome.runtime.sendMessage({ + message: "unregisterContentScript", + id: id + }); + } + + if (!isFirefoxOrSafari() && chrome.declarativeContent) { // Only if we have permission chrome.declarativeContent.onPageChanged.removeRules(["invidious"]); } @@ -237,7 +138,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(), @@ -319,6 +220,7 @@ export default class Utils { return selection; } } + return { name: category, option: CategorySkipOption.Disabled} as CategorySelection; } /** @@ -345,18 +247,8 @@ export default class Utils { * @param address The address to add to the SponsorBlock server address * @param callback */ - async asyncRequestToCustomServer(type: string, url: string, data = {}): Promise<FetchResponse> { - return new Promise((resolve) => { - // Ask the background script to do the work - chrome.runtime.sendMessage({ - message: "sendRequest", - type, - url, - data - }, (response) => { - resolve(response); - }); - }); + asyncRequestToCustomServer(type: string, url: string, data = {}): Promise<FetchResponse> { + return sendRequestToCustomServer(type, url, data); } /** @@ -396,18 +288,21 @@ 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 "#player-container .video-js", // Invidious - ".main-video-section > .video-container" // Cloudtube + ".main-video-section > .video-container", // Cloudtube + ".shaka-video-container", // Piped + "#player-container.ytk-player", // YT Kids ]; let referenceNode = findValidElementFromSelector(selectors) if (referenceNode == null) { //for embeds const player = document.getElementById("player"); - referenceNode = player.firstChild as HTMLElement; + referenceNode = player?.firstChild as HTMLElement; if (referenceNode) { let index = 1; @@ -431,32 +326,11 @@ export default class Utils { return Boolean(num.match(/^[0-9a-f]+$/i)); } - /** - * Is this Firefox (web-extensions) - */ - isFirefox(): boolean { - return typeof(browser) !== "undefined"; - } - - async getHash<T extends string>(value: T, times = 5000): Promise<T & HashedValue> { - if (times <= 0) return "" as T & HashedValue; - - let hashHex: string = value; - for (let i = 0; i < times; i++) { - const hashBuffer = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(hashHex).buffer); - - const hashArray = Array.from(new Uint8Array(hashBuffer)); - hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join(''); - } - - return hashHex as T & HashedValue; - } - async addHiddenSegment(videoID: VideoID, segmentUUID: string, hidden: SponsorHideType) { if (chrome.extension.inIncognitoContext || !Config.config.trackDownvotes) return; - const hashedVideoID = (await this.getHash(videoID, 1)).slice(0, 4) as VideoID & HashedValue; - const UUIDHash = await this.getHash(segmentUUID, 1); + const hashedVideoID = (await getHash(videoID, 1)).slice(0, 4) as VideoID & HashedValue; + const UUIDHash = await getHash(segmentUUID, 1); const allDownvotes = Config.local.downvotedSegments; const currentVideoData = allDownvotes[hashedVideoID] || { segments: [], lastAccess: 0 }; @@ -464,7 +338,11 @@ export default class Utils { currentVideoData.lastAccess = Date.now(); const existingData = currentVideoData.segments.find((segment) => segment.uuid === UUIDHash); if (hidden === SponsorHideType.Visible) { - delete allDownvotes[hashedVideoID]; + currentVideoData.segments.splice(currentVideoData.segments.indexOf(existingData), 1); + + if (currentVideoData.segments.length === 0) { + delete allDownvotes[hashedVideoID]; + } } else { if (existingData) { existingData.hidden = hidden; diff --git a/src/utils/compatibility.ts b/src/utils/compatibility.ts new file mode 100644 index 00000000..b08877e6 --- /dev/null +++ b/src/utils/compatibility.ts @@ -0,0 +1,15 @@ +import Config from "../config"; + +export function runCompatibilityChecks() { + if (Config.config.showZoomToFillError2 && document.URL.includes("watch?v=")) { + setTimeout(() => { + const zoomToFill = document.querySelector(".zoomtofillBtn"); + + if (zoomToFill) { + alert(chrome.i18n.getMessage("zoomToFillUnsupported")); + } + + Config.config.showZoomToFillError2 = false; + }, 10000); + } +}
\ No newline at end of file diff --git a/src/utils/configUtils.ts b/src/utils/configUtils.ts index db957caa..8aec5208 100644 --- a/src/utils/configUtils.ts +++ b/src/utils/configUtils.ts @@ -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 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); }
\ No newline at end of file diff --git a/src/utils/constants.ts b/src/utils/constants.ts index 74f0da71..dd44676a 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -148,5 +148,13 @@ export function getGuidelineInfo(category: Category): TextBox[] { icon: "icons/check-smaller.svg", text: chrome.i18n.getMessage(`category_${category}_guideline3`) }]; + default: + return [{ + icon: "icons/segway.png", + text: chrome.i18n.getMessage(`generic_guideline1`) + }, { + icon: "icons/right-arrow.svg", + text: chrome.i18n.getMessage(`generic_guideline2`) + }]; } }
\ No newline at end of file diff --git a/src/utils/crossExtension.ts b/src/utils/crossExtension.ts new file mode 100644 index 00000000..183ae931 --- /dev/null +++ b/src/utils/crossExtension.ts @@ -0,0 +1,44 @@ +import * as CompileConfig from "../../config.json"; + +import Config from "../config"; +import { isSafari } from "../../maze-utils/src/config"; +import { isFirefoxOrSafari } from "../../maze-utils/src"; + +export function isDeArrowInstalled(): Promise<boolean> { + if (Config.config.deArrowInstalled) { + return Promise.resolve(true); + } else { + return new Promise((resolve) => { + const extensionIds = getExtensionIdsToImportFrom(); + + let count = 0; + for (const id of extensionIds) { + chrome.runtime.sendMessage(id, { message: "isInstalled" }, (response) => { + if (chrome.runtime.lastError) { + count++; + + if (count === extensionIds.length) { + resolve(false); + } + return; + } + + resolve(response); + if (response) { + Config.config.deArrowInstalled = true; + } + }); + } + }); + } +} + +export function getExtensionIdsToImportFrom(): string[] { + if (isSafari()) { + return CompileConfig.extensionImportList.safari; + } else if (isFirefoxOrSafari()) { + return CompileConfig.extensionImportList.firefox; + } else { + return CompileConfig.extensionImportList.chromium; + } +}
\ No newline at end of file diff --git a/src/utils/exporter.ts b/src/utils/exporter.ts index 16b970f3..a5871b65 100644 --- a/src/utils/exporter.ts +++ b/src/utils/exporter.ts @@ -1,14 +1,15 @@ import { ActionType, Category, SegmentUUID, SponsorSourceType, SponsorTime } from "../types"; import { shortCategoryName } from "./categoryUtils"; -import { GenericUtils } from "./genericUtils"; import * as CompileConfig from "../../config.json"; +import { getFormattedTime, getFormattedTimeToSeconds } from "../../maze-utils/src/formating"; +import { generateUserID } from "../../maze-utils/src/setup"; const inTest = typeof chrome === "undefined"; const chapterNames = CompileConfig.categoryList.filter((code) => code !== "chapter") .map((code) => ({ code, - name: !inTest ? chrome.i18n.getMessage("category_" + code) : code + names: !inTest ? [chrome.i18n.getMessage("category_" + code), shortCategoryName(code)] : [code] })); export function exportTimes(segments: SponsorTime[]): string { @@ -26,9 +27,9 @@ export function exportTimes(segments: SponsorTime[]): string { function exportTime(segment: SponsorTime): string { const name = segment.description || shortCategoryName(segment.category); - return `${GenericUtils.getFormattedTime(segment.segment[0], true)}${ + return `${getFormattedTime(segment.segment[0], true)}${ segment.segment[1] && segment.segment[0] !== segment.segment[1] - ? ` - ${GenericUtils.getFormattedTime(segment.segment[1], true)}` : ""} ${name}`; + ? ` - ${getFormattedTime(segment.segment[1], true)}` : ""} ${name}`; } export function importTimes(data: string, videoDuration: number): SponsorTime[] { @@ -37,25 +38,31 @@ export function importTimes(data: string, videoDuration: number): SponsorTime[] for (const line of lines) { const match = line.match(/(?:((?:\d+:)?\d+:\d+)+(?:\.\d+)?)|(?:\d+(?=s| second))/g); if (match) { - const startTime = GenericUtils.getFormattedTimeToSeconds(match[0]); + const startTime = getFormattedTimeToSeconds(match[0]); if (startTime !== null) { - const specialCharsMatcher = /^(?:\s+seconds?)?[-:()\s]*|(?:\s+at)?[-:()\s]+$/g - const titleLeft = line.split(match[0])[0].replace(specialCharsMatcher, ""); + // Remove "seconds", "at", special characters, and ")" if there was a "(" + const specialCharMatchers = [{ + matcher: /^(?:\s+seconds?)?[-:()\s]*|(?:\s+at)?[-:(\s]+$/g + }, { + matcher: /[-:()\s]*$/g, + condition: (value) => !!value.match(/^\s*\(/) + }]; + const titleLeft = removeIf(line.split(match[0])[0], specialCharMatchers); let titleRight = null; const split2 = line.split(match[1] || match[0]); - titleRight = split2[split2.length - 1].replace(specialCharsMatcher, ""); + titleRight = removeIf(split2[split2.length - 1], specialCharMatchers) const title = titleLeft?.length > titleRight?.length ? titleLeft : titleRight; if (title) { - const determinedCategory = chapterNames.find(c => c.name === title)?.code as Category; + const determinedCategory = chapterNames.find(c => c.names.includes(title))?.code as Category; const segment: SponsorTime = { - segment: [startTime, GenericUtils.getFormattedTimeToSeconds(match[1])], + segment: [startTime, getFormattedTimeToSeconds(match[1])], category: determinedCategory ?? ("chapter" as Category), actionType: determinedCategory ? ActionType.Skip : ActionType.Chapter, description: title, source: SponsorSourceType.Local, - UUID: GenericUtils.generateUserID() as SegmentUUID + UUID: generateUserID() as SegmentUUID }; if (result.length > 0 && result[result.length - 1].segment[1] === null) { @@ -75,6 +82,17 @@ export function importTimes(data: string, videoDuration: number): SponsorTime[] return result; } +function removeIf(value: string, matchers: Array<{ matcher: RegExp; condition?: (value: string) => boolean }>): string { + let result = value; + for (const matcher of matchers) { + if (!matcher.condition || matcher.condition(value)) { + result = result.replace(matcher.matcher, ""); + } + } + + return result; +} + export function exportTimesAsHashParam(segments: SponsorTime[]): string { const hashparamSegments = segments.map(segment => ({ actionType: segment.actionType, @@ -85,3 +103,8 @@ export function exportTimesAsHashParam(segments: SponsorTime[]): string { return `#segments=${JSON.stringify(hashparamSegments)}`; } + + +export function normalizeChapterName(description: string): string { + return description.toLowerCase().replace(/\.|:|-/g, "").replace(/\s+/g, " "); +}
\ No newline at end of file diff --git a/src/utils/genericUtils.ts b/src/utils/genericUtils.ts index c7b50bdc..7b7f1118 100644 --- a/src/utils/genericUtils.ts +++ b/src/utils/genericUtils.ts @@ -1,91 +1,3 @@ -/** Function that can be used to wait for a condition before returning. */ -async function wait<T>(condition: () => T, timeout = 5000, check = 100, predicate?: (obj: T) => boolean): Promise<T> { - return await new Promise((resolve, reject) => { - setTimeout(() => { - clearInterval(interval); - reject("TIMEOUT"); - }, timeout); - - const intervalCheck = () => { - const result = condition(); - if (predicate ? predicate(result) : result) { - resolve(result); - clearInterval(interval); - } - }; - - const interval = setInterval(intervalCheck, check); - - //run the check once first, this speeds it up a lot - intervalCheck(); - }); -} - -function getFormattedTimeToSeconds(formatted: string): number | null { - const fragments = /^(?:(?:(\d+):)?(\d+):)?(\d*(?:[.,]\d+)?)$/.exec(formatted); - - if (fragments === null) { - return null; - } - - const hours = fragments[1] ? parseInt(fragments[1]) : 0; - const minutes = fragments[2] ? parseInt(fragments[2] || '0') : 0; - const seconds = fragments[3] ? parseFloat(fragments[3].replace(',', '.')) : 0; - - return hours * 3600 + minutes * 60 + seconds; -} - -function getFormattedTime(seconds: number, precise?: boolean): string { - seconds = Math.max(seconds, 0); - - const hours = Math.floor(seconds / 60 / 60); - const minutes = Math.floor(seconds / 60) % 60; - let minutesDisplay = String(minutes); - let secondsNum = seconds % 60; - if (!precise) { - secondsNum = Math.floor(secondsNum); - } - - let secondsDisplay = String(precise ? secondsNum.toFixed(3) : secondsNum); - - if (secondsNum < 10) { - //add a zero - secondsDisplay = "0" + secondsDisplay; - } - if (hours && minutes < 10) { - //add a zero - minutesDisplay = "0" + minutesDisplay; - } - if (isNaN(hours) || isNaN(minutes)) { - return null; - } - - const formatted = (hours ? hours + ":" : "") + minutesDisplay + ":" + secondsDisplay; - - return formatted; -} - -/** - * 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); @@ -113,44 +25,7 @@ function indexesOf<T>(array: T[], value: T): number[] { return array.map((v, i) => v === value ? i : -1).filter(i => i !== -1); } -function objectToURI<T>(url: string, data: T, includeQuestionMark: boolean): string { - let counter = 0; - for (const key in data) { - const seperator = (url.includes("?") || counter > 0) ? "&" : (includeQuestionMark ? "?" : ""); - const value = (typeof(data[key]) === "string") ? data[key] as unknown as string : JSON.stringify(data[key]); - url += seperator + encodeURIComponent(key) + "=" + encodeURIComponent(value); - - counter++; - } - - return url; -} - -function generateUserID(length = 36): string { - const charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; - let result = ""; - if (window.crypto && window.crypto.getRandomValues) { - const values = new Uint32Array(length); - window.crypto.getRandomValues(values); - for (let i = 0; i < length; i++) { - result += charset[values[i] % charset.length]; - } - return result; - } else { - for (let i = 0; i < length; i++) { - result += charset[Math.floor(Math.random() * charset.length)]; - } - return result; - } -} - export const GenericUtils = { - wait, - getFormattedTime, - getFormattedTimeToSeconds, - getErrorMessage, getLuminance, - generateUserID, - indexesOf, - objectToURI + indexesOf } diff --git a/src/utils/licenseKey.ts b/src/utils/licenseKey.ts deleted file mode 100644 index 7ce41a8a..00000000 --- a/src/utils/licenseKey.ts +++ /dev/null @@ -1,77 +0,0 @@ -import Config from "../config"; -import Utils from "../utils"; -import * as CompileConfig from "../../config.json"; - -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", - userID: 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; -}
\ No newline at end of file diff --git a/src/utils/pageCleaner.ts b/src/utils/pageCleaner.ts new file mode 100644 index 00000000..0d2ad2b9 --- /dev/null +++ b/src/utils/pageCleaner.ts @@ -0,0 +1,8 @@ +export function cleanPage() { + // For live-updates + if (document.readyState === "complete") { + for (const element of document.querySelectorAll("#categoryPillParent, .playerButton, .sponsorThumbnailLabel, #submissionNoticeContainer, .sponsorSkipNoticeContainer, #sponsorBlockPopupContainer, .skipButtonControlBarContainer, #previewbar, .sponsorBlockChapterBar")) { + element.remove(); + } + } +}
\ No newline at end of file diff --git a/src/utils/pageUtils.ts b/src/utils/pageUtils.ts index db18aae7..f38ad503 100644 --- a/src/utils/pageUtils.ts +++ b/src/utils/pageUtils.ts @@ -1,5 +1,5 @@ import { ActionType, Category, SponsorSourceType, SponsorTime, VideoID } from "../types"; -import { GenericUtils } from "./genericUtils"; +import { getFormattedTimeToSeconds } from "../../maze-utils/src/formating"; export function getControls(): HTMLElement { const controlsSelectors = [ @@ -9,12 +9,14 @@ export function getControls(): HTMLElement { ".player-controls-top", // Invidious/videojs video element's controls element ".vjs-control-bar", + // Piped shaka player + ".shaka-bottom-controls" ]; 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]; } } @@ -22,27 +24,12 @@ export function getControls(): HTMLElement { return null; } -export function isVisible(element: HTMLElement): boolean { - return element && element.offsetWidth > 0 && element.offsetHeight > 0; -} - -export function findValidElementFromSelector(selectors: string[]): HTMLElement { - return findValidElementFromGenerator(selectors, (selector) => document.querySelector(selector)); -} - -export function findValidElement(elements: HTMLElement[] | NodeListOf<HTMLElement>): HTMLElement { - return findValidElementFromGenerator(elements); +export function isInPreviewPlayer(element: Element): boolean { + return !!element.closest("#inline-preview-player"); } -function findValidElementFromGenerator<T>(objects: T[] | NodeListOf<HTMLElement>, generator?: (obj: T) => HTMLElement): HTMLElement { - for (const obj of objects) { - const element = generator ? generator(obj as T) : obj as HTMLElement; - if (element && isVisible(element)) { - return element; - } - } - - return null; +export function isVisible(element: HTMLElement): boolean { + return element && element.offsetWidth > 0 && element.offsetHeight > 0; } export function getHashParams(): Record<string, unknown> { @@ -68,24 +55,26 @@ export function getHashParams(): Record<string, unknown> { export function getExistingChapters(currentVideoID: VideoID, duration: number): SponsorTime[] { const chaptersBox = document.querySelector("ytd-macro-markers-list-renderer"); + const title = document.querySelector("[target-id=engagement-panel-macro-markers-auto-chapters] #title-text"); + if (title?.textContent?.includes("Key moment")) return []; const chapters: SponsorTime[] = []; // .ytp-timed-markers-container indicates that key-moments are present, which should not be divided - if (chaptersBox && !(document.querySelector(".ytp-timed-markers-container")?.childElementCount > 0)) { + if (chaptersBox) { let lastSegment: SponsorTime = null; const links = chaptersBox.querySelectorAll("ytd-macro-markers-list-item-renderer > a"); for (const link of links) { 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 = GenericUtils.getFormattedTimeToSeconds(timeElement.innerText); + 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, @@ -106,25 +95,6 @@ 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, "<") - .replace(/"/g, """).replace(/\n/g, "<br/>") : ""; - }); - - if (valNewH != text) { - return valNewH; - } else { - return false; - } +export function isPlayingPlaylist() { + return !!document.URL.includes("&list="); }
\ No newline at end of file diff --git a/src/utils/thumbnails.ts b/src/utils/thumbnails.ts new file mode 100644 index 00000000..61d28f18 --- /dev/null +++ b/src/utils/thumbnails.ts @@ -0,0 +1,115 @@ +import { isOnInvidious, parseYouTubeVideoIDFromURL } from "../../maze-utils/src/video"; +import Config from "../config"; +import { getVideoLabel } from "./videoLabels"; +import { setThumbnailListener } from "../../maze-utils/src/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()); +}
\ No newline at end of file diff --git a/src/utils/urlParser.ts b/src/utils/urlParser.ts index 209c7c51..24f444ba 100644 --- a/src/utils/urlParser.ts +++ b/src/utils/urlParser.ts @@ -22,5 +22,7 @@ export function urlTimeToSeconds(time: string): number { return hours * 3600 + minutes * 60 + seconds; } else if (/\d+/.test(time)) { return parseInt(time, 10); + } else { + return 0; } }
\ No newline at end of file diff --git a/src/utils/videoLabels.ts b/src/utils/videoLabels.ts new file mode 100644 index 00000000..731bfd33 --- /dev/null +++ b/src/utils/videoLabels.ts @@ -0,0 +1,70 @@ +import { Category, CategorySkipOption, VideoID } from "../types"; +import { getHash } from "../../maze-utils/src/hash"; +import Utils from "../utils"; +import { logWarn } from "./logger"; + +const utils = new Utils(); + +export interface LabelCacheEntry { + timestamp: number; + videos: Record<VideoID, Category>; +} + +const labelCache: Record<string, LabelCacheEntry> = {}; +const cacheLimit = 1000; + +async function getLabelHashBlock(hashPrefix: string): Promise<LabelCacheEntry | null> { + // Check cache + const cachedEntry = labelCache[hashPrefix]; + if (cachedEntry) { + return cachedEntry; + } + + const response = await utils.asyncRequestToServer("GET", `/api/videoLabels/${hashPrefix}`); + if (response.status !== 200) { + // No video labels or server down + labelCache[hashPrefix] = { + timestamp: Date.now(), + videos: {}, + }; + return null; + } + + try { + const data = JSON.parse(response.responseText); + + const newEntry: LabelCacheEntry = { + timestamp: Date.now(), + videos: Object.fromEntries(data.map(video => [video.videoID, video.segments[0].category])), + }; + labelCache[hashPrefix] = newEntry; + + if (Object.keys(labelCache).length > cacheLimit) { + // Remove oldest entry + const oldestEntry = Object.entries(labelCache).reduce((a, b) => a[1].timestamp < b[1].timestamp ? a : b); + delete labelCache[oldestEntry[0]]; + } + + return newEntry; + } catch (e) { + logWarn(`Error parsing video labels: ${e}`); + + return null; + } +} + +export async function getVideoLabel(videoID: VideoID): Promise<Category | null> { + const prefix = (await getHash(videoID, 1)).slice(0, 3); + const result = await getLabelHashBlock(prefix); + + if (result) { + const category = result.videos[videoID]; + if (category && utils.getCategorySelection(category).option !== CategorySkipOption.Disabled) { + return category; + } else { + return null; + } + } + + return null; +}
\ No newline at end of file diff --git a/src/utils/warnings.ts b/src/utils/warnings.ts index f2f2657e..8e3110f2 100644 --- a/src/utils/warnings.ts +++ b/src/utils/warnings.ts @@ -1,8 +1,9 @@ +import { objectToURI } from "../../maze-utils/src"; +import { getHash } from "../../maze-utils/src/hash"; import Config from "../config"; import GenericNotice, { NoticeOptions } from "../render/GenericNotice"; import { ContentContainer } from "../types"; import Utils from "../utils"; -import { GenericUtils } from "./genericUtils"; const utils = new Utils(); export interface ChatConfig { @@ -13,7 +14,7 @@ export interface ChatConfig { export async function openWarningDialog(contentContainer: ContentContainer): Promise<void> { const userInfo = await utils.asyncRequestToServer("GET", "/api/userInfo", { - userID: Config.config.userID, + publicUserID: await getHash(Config.config.userID), values: ["warningReason"] }); @@ -21,7 +22,7 @@ export async function openWarningDialog(contentContainer: ContentContainer): Pro const warningReason = JSON.parse(userInfo.responseText)?.warningReason; const userNameData = await utils.asyncRequestToServer("GET", "/api/getUsername?userID=" + Config.config.userID); const userName = userNameData.ok ? JSON.parse(userNameData.responseText).userName : ""; - const publicUserID = await utils.getHash(Config.config.userID); + const publicUserID = await getHash(Config.config.userID); let notice: GenericNotice = null; const options: NoticeOptions = { @@ -62,5 +63,5 @@ export async function openWarningDialog(contentContainer: ContentContainer): Pro } export function openChat(config: ChatConfig): void { - window.open("https://chat.sponsor.ajay.app/#" + GenericUtils.objectToURI("", config, false)); -}
\ No newline at end of file + window.open("https://chat.sponsor.ajay.app/#" + objectToURI("", config, false)); +} diff --git a/test/exporter.test.ts b/test/exporter.test.ts index a3af0c04..596af640 100644 --- a/test/exporter.test.ts +++ b/test/exporter.test.ts @@ -275,4 +275,36 @@ describe("Import segments", () => { category: "chapter" as Category }]); }); + + it ("0:00 G¹ (Tangent Continuity)", () => { + const input = ` 0:00 G¹ (Tangent Continuity) + 0:01 G² (Tangent Continuity)`; + + const result = importTimes(input, 8000); + expect(result).toMatchObject([{ + segment: [0, 1], + description: "G¹ (Tangent Continuity)", + category: "chapter" as Category + }, { + segment: [1, 8000], + description: "G² (Tangent Continuity)", + category: "chapter" as Category + }]); + }); + + it ("((Some name) 1:20)", () => { + const input = ` ((Some name) 1:20) + ((Some other name) 1:25)`; + + const result = importTimes(input, 8000); + expect(result).toMatchObject([{ + segment: [80, 85], + description: "Some name", + category: "chapter" as Category + }, { + segment: [85, 8000], + description: "Some other name", + category: "chapter" as Category + }]); + }); });
\ No newline at end of file diff --git a/test/selenium.test.ts b/test/selenium.test.ts index 6a0db09a..eb31a2ff 100644 --- a/test/selenium.test.ts +++ b/test/selenium.test.ts @@ -41,7 +41,7 @@ test("Selenium Chrome test", async () => { // Save file incase there is a layout change const source = await driver.getPageSource(); - fs.mkdirSync("./test-results"); + if (!fs.existsSync("./test-results")) fs.mkdirSync("./test-results"); fs.writeFileSync("./test-results/source.html", source); throw e; @@ -55,7 +55,7 @@ async function setup(): Promise<WebDriver> { options.addArguments("--load-extension=" + Path.join(__dirname, "../dist/")); options.addArguments("--mute-audio"); options.addArguments("--disable-features=PreloadMediaEngagementData, MediaEngagementBypassAutoplayPolicies"); - options.addArguments("--headless=chrome"); + options.addArguments("--headless=new"); options.addArguments("--window-size=1920,1080"); const driver = await new Builder().forBrowser("chrome").setChromeOptions(options).build(); diff --git a/tsconfig-production.json b/tsconfig-production.json index a2cc4b4b..c79b6f61 100644 --- a/tsconfig-production.json +++ b/tsconfig-production.json @@ -3,6 +3,8 @@ "module": "commonjs", "target": "es6", "noImplicitAny": false, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, "sourceMap": false, "outDir": "dist/js", "noEmitOnError": false, @@ -14,5 +16,8 @@ "dom", "dom.iterable" ] - } + }, + "include": [ + "src/**/*" + ] }
\ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index a2c61955..27053111 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,6 +3,8 @@ "module": "commonjs", "target": "es6", "noImplicitAny": false, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, "sourceMap": true, "outDir": "dist/js", "noEmitOnError": false, @@ -14,5 +16,8 @@ "dom", "dom.iterable" ] - } + }, + "include": [ + "src/**/*" + ] }
\ No newline at end of file diff --git a/webpack/configDiffPlugin.js b/webpack/configDiffPlugin.js new file mode 100644 index 00000000..ce5e5c5a --- /dev/null +++ b/webpack/configDiffPlugin.js @@ -0,0 +1,66 @@ +/* eslint-disable @typescript-eslint/no-var-requires */ +const { readFile } = require("fs/promises") +let logger; + +const readFileContents = (name) => readFile(name) + .then(data => JSON.parse(data)) + +// partialDeepEquals from ajayyy/SponsorBlockServer +function partialDeepEquals (actual, expected, logger) { + // loop over key, value of expected + let failed = false; + for (const [ key, value ] of Object.entries(expected)) { + if (key === "serverAddress" || key === "testingServerAddress" || key === "serverAddressComment" || key === "freeChapterAccess") continue + // if value is object, recurse + const actualValue = actual?.[key] + if (typeof value !== "string" && Array.isArray(value)) { + if (!arrayPartialDeepEquals(actualValue, value)) { + printActualExpected(key, actualValue, value, logger) + failed = true + } + } else if (typeof value === "object") { + if (partialDeepEquals(actualValue, value, logger)) { + console.log("obj failed") + printActualExpected(key, actualValue, value, logger) + failed = true + } + } else if (actualValue !== value) { + printActualExpected(key, actualValue, value, logger) + failed = true + } + } + return failed +} + +const arrayPartialDeepEquals = (actual, expected) => + expected.every(a => actual?.includes(a)) + +function printActualExpected(key, actual, expected, logger) { + logger.error(`Differing value for: ${key}`) + logger.error(`Actual: ${JSON.stringify(actual)}`) + logger.error(`Expected: ${JSON.stringify(expected)}`) +} + +class configDiffPlugin { + apply(compiler) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + compiler.hooks.done.tapAsync("configDiffPlugin", async (stats, callback) => { + logger = compiler.getInfrastructureLogger('configDiffPlugin') + logger.log('Checking for config.json diff...') + + // check example + const exampleConfig = await readFileContents("./config.json.example") + const currentConfig = await readFileContents("./config.json") + + const difference = partialDeepEquals(currentConfig, exampleConfig, logger) + if (difference) { + logger.warn("config.json is missing values from config.json.example") + } else { + logger.info("config.json is not missing any values from config.json.example") + } + callback() + }) + } +} + +module.exports = configDiffPlugin; diff --git a/webpack/webpack.common.js b/webpack/webpack.common.js index d05dea03..e1a3e66c 100644 --- a/webpack/webpack.common.js +++ b/webpack/webpack.common.js @@ -7,6 +7,7 @@ const BuildManifest = require('./webpack.manifest'); const srcDir = '../src/'; const fs = require("fs"); const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin'); +const configDiffPlugin = require('./configDiffPlugin'); const edgeLanguages = [ "de", @@ -24,98 +25,166 @@ const edgeLanguages = [ "zh_CN" ] -module.exports = env => ({ - entry: { - popup: path.join(__dirname, srcDir + 'popup.ts'), - background: path.join(__dirname, srcDir + 'background.ts'), - content: path.join(__dirname, srcDir + 'content.ts'), - options: path.join(__dirname, srcDir + 'options.ts'), - help: path.join(__dirname, srcDir + 'help.ts'), - permissions: path.join(__dirname, srcDir + 'permissions.ts'), - document: path.join(__dirname, srcDir + 'document.ts'), - upsell: path.join(__dirname, srcDir + 'upsell.ts') - }, - output: { - path: path.join(__dirname, '../dist/js'), - }, - optimization: { - splitChunks: { - name: 'vendor', - chunks: "initial" - } - }, - module: { - rules: [ - { - test: /\.tsx?$/, - loader: 'ts-loader', - exclude: /node_modules/, - options: { - // disable type checker for user in fork plugin - transpileOnly: true, - configFile: env.mode === "production" ? "tsconfig-production.json" : "tsconfig.json" - } - } - ] - }, - resolve: { - extensions: ['.ts', '.tsx', '.js'] - }, - plugins: [ - // fork TS checker - new ForkTsCheckerWebpackPlugin(), - // exclude locale files in moment - new CopyPlugin({ - patterns: [ + + +module.exports = env => { + const documentScriptBuild = webpack({ + entry: { + document: path.join(__dirname, srcDir + 'document.ts') + }, + output: { + path: path.join(__dirname, '../dist/js'), + }, + module: { + rules: [ { - from: '.', - to: '../', - globOptions: { - ignore: ['manifest.json'], - }, - context: './public', - filter: async (path) => { - if (path.match(/\/_locales\/.+/)) { - if (env.browser.toLowerCase() === "edge" - && !edgeLanguages.includes(path.match(/(?<=\/_locales\/)[^/]+(?=\/[^/]+$)/)[0])) { - return false; - } + test: /\.tsx?$/, + loader: 'ts-loader', + exclude: /node_modules/, + resourceQuery: { not: [/raw/] }, + options: { + // disable type checker for user in fork plugin + transpileOnly: true, + configFile: env.mode === "production" ? "tsconfig-production.json" : "tsconfig.json" + } + }, + ] + }, + resolve: { + extensions: ['.ts', '.tsx', '.js'] + }, + plugins: [ + // Don't fork TS checker for document script to speed up + // new ForkTsCheckerWebpackPlugin() + ] + }); - const data = await fs.promises.readFile(path); - const parsed = JSON.parse(data.toString()); + class DocumentScriptCompiler { + currentWatching = null; - return parsed.fullName && parsed.Description; - } else { - return true; - } - }, - transform(content, path) { - if (path.match(/\/_locales\/.+/)) { - const parsed = JSON.parse(content.toString()); - if (env.browser.toLowerCase() === "safari") { - parsed.fullName.message = parsed.fullName.message.match(/^.+(?= -)/)?.[0] || parsed.fullName.message; - if (parsed.fullName.message.length > 50) { - parsed.fullName.message = parsed.fullName.message.slice(0, 47) + "..."; + /** + * + * @param {webpack.Compiler} compiler + */ + apply(compiler) { + compiler.hooks.beforeCompile.tapAsync({ name: 'DocumentScriptCompiler' }, (compiler, callback) => { + if (env.WEBPACK_WATCH) { + let first = true; + if (!this.currentWatching) { + this.currentWatching = documentScriptBuild.watch({}, () => { + if (first) { + first = false; + callback(); + } + }); + } else { + callback(); + } + } else { + documentScriptBuild.close(() => { + documentScriptBuild.run(() => { + callback(); + }); + }); + } + }); + } + } + + return { + entry: { + popup: path.join(__dirname, srcDir + 'popup.ts'), + background: path.join(__dirname, srcDir + 'background.ts'), + content: path.join(__dirname, srcDir + 'content.ts'), + options: path.join(__dirname, srcDir + 'options.ts'), + help: path.join(__dirname, srcDir + 'help.ts'), + permissions: path.join(__dirname, srcDir + 'permissions.ts'), + }, + output: { + path: path.join(__dirname, '../dist/js'), + }, + module: { + rules: [ + { + test: /\.tsx?$/, + loader: 'ts-loader', + exclude: /node_modules/, + resourceQuery: { not: [/raw/] }, + options: { + // disable type checker for user in fork plugin + transpileOnly: true, + configFile: env.mode === "production" ? "tsconfig-production.json" : "tsconfig.json" + } + }, + { + test: /js(\/|\\)document\.js$/, + type: 'asset/source' + } + ] + }, + resolve: { + extensions: ['.ts', '.tsx', '.js'], + symlinks: false + }, + plugins: [ + // Prehook to start building document script before normal build + new DocumentScriptCompiler(), + // fork TS checker + new ForkTsCheckerWebpackPlugin(), + // exclude locale files in moment + new CopyPlugin({ + patterns: [ + { + from: '.', + to: '../', + globOptions: { + ignore: ['manifest.json', '**/.git/**', '**/crowdin.yml'], + }, + context: './public', + filter: async (path) => { + if (path.match(/(\/|\\)_locales(\/|\\).+/)) { + if (env.browser.toLowerCase() === "edge" + && !edgeLanguages.includes(path.match(/(?<=\/_locales\/)[^/]+(?=\/[^/]+$)/)[0])) { + return false; } - parsed.Description.message = parsed.Description.message.match(/^.+(?=\. )/)?.[0] || parsed.Description.message; - if (parsed.Description.message.length > 80) { - parsed.Description.message = parsed.Description.message.slice(0, 77) + "..."; + const data = await fs.promises.readFile(path); + const parsed = JSON.parse(data.toString()); + + return parsed.fullName && parsed.Description; + } else { + return true; + } + }, + transform(content, path) { + if (path.match(/(\/|\\)_locales(\/|\\).+/)) { + const parsed = JSON.parse(content.toString()); + if (env.browser.toLowerCase() === "safari") { + parsed.fullName.message = parsed.fullName.message.match(/^.+(?= -)/)?.[0] || parsed.fullName.message; + if (parsed.fullName.message.length > 50) { + parsed.fullName.message = parsed.fullName.message.slice(0, 47) + "..."; + } + + parsed.Description.message = parsed.Description.message.match(/^.+(?=\. )/)?.[0] || parsed.Description.message; + if (parsed.Description.message.length > 80) { + parsed.Description.message = parsed.Description.message.slice(0, 77) + "..."; + } } + + return Buffer.from(JSON.stringify(parsed)); } - - return Buffer.from(JSON.stringify(parsed)); - } - return content; + return content; + } } - } - ] - }), - new BuildManifest({ - browser: env.browser, - pretty: env.mode === "production", - stream: env.stream - }) - ] -}); + ] + }), + new BuildManifest({ + browser: env.browser, + pretty: env.mode === "production", + stream: env.stream + }), + new configDiffPlugin() + ] + }; +};
\ No newline at end of file diff --git a/webpack/webpack.manifest.js b/webpack/webpack.manifest.js index 3e30ffc6..3041fe6d 100644 --- a/webpack/webpack.manifest.js +++ b/webpack/webpack.manifest.js @@ -3,7 +3,6 @@ const webpack = require("webpack"); const path = require('path'); const { validate } = require('schema-utils'); - const fs = require('fs'); const manifest = require("../manifest/manifest.json"); |