mirror of
https://github.com/th-ch/youtube-music.git
synced 2026-01-11 10:31:47 +00:00
Compare commits
212 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 721271d902 | |||
| a2151930ec | |||
| bdc9f42681 | |||
| 0b3c6f9e1f | |||
| ebe373bdc6 | |||
| ab91e6d735 | |||
| be3ae4d789 | |||
| 336b7fe5e9 | |||
| 5ecd39f324 | |||
| eb50596961 | |||
| aede0cd643 | |||
| 25f51784c3 | |||
| 7acac6d11c | |||
| 1972ef70b5 | |||
| c4455ed3d2 | |||
| c1a06ab955 | |||
| 26fa1f85b2 | |||
| 555817e2f5 | |||
| f8654dfdb9 | |||
| 96c0fc412c | |||
| a70a4106df | |||
| 895210cbb6 | |||
| 789a30312b | |||
| 623d97b1e2 | |||
| 4ed97f0145 | |||
| 77a2bbf02a | |||
| 7a9a1531d4 | |||
| 16b59698d6 | |||
| a85a2e0c58 | |||
| 97f1a20a4f | |||
| 8dbe151ddd | |||
| 87144e03c2 | |||
| 2046b253e3 | |||
| c068e11fc5 | |||
| 10384b6c4c | |||
| 4d83bd587d | |||
| aae523989b | |||
| afacec973b | |||
| 75fb51e290 | |||
| cb85048af4 | |||
| 8b10872e83 | |||
| 96ea114335 | |||
| 7c1c3ef28d | |||
| 7a7ad4261c | |||
| c0dbc204a0 | |||
| 68e63f809c | |||
| 4b188ec205 | |||
| 23013cddb9 | |||
| 588b84ecd0 | |||
| fd68c204f6 | |||
| 313bb6e43f | |||
| 0a6f244035 | |||
| 8e4e2c42f6 | |||
| f31053cf3c | |||
| d5758790c0 | |||
| bbd243a534 | |||
| 2fc0d6f3b0 | |||
| 6b15018a9b | |||
| acc977db7c | |||
| 270100a14c | |||
| 094e6fa2d6 | |||
| 9f81f7001c | |||
| e6c78dd5e0 | |||
| b64e1394ae | |||
| dcc611c7d0 | |||
| d329076b52 | |||
| 1435559a56 | |||
| 1feeeedf10 | |||
| 443d716e45 | |||
| 3d65a96e38 | |||
| e20f3fe24c | |||
| 5d3afb52d8 | |||
| 5e0341c8d5 | |||
| b84a8c512a | |||
| cd0f4bbc1d | |||
| e37367c5e5 | |||
| 8a765be912 | |||
| a213dae14d | |||
| 40c429f3c1 | |||
| 3125520e68 | |||
| 1c57fec016 | |||
| 2708b4fffc | |||
| f1d264a6c7 | |||
| c478e74771 | |||
| 6cf9f813a0 | |||
| dddfa581ed | |||
| 94b789aa78 | |||
| d6d731260b | |||
| 440864e605 | |||
| 4506ae4079 | |||
| c2538e280a | |||
| ef7da94201 | |||
| 68a754f438 | |||
| 2a81a4e887 | |||
| 40d64fb04f | |||
| c6bc65b3d3 | |||
| db02e009cd | |||
| b0b6ebe036 | |||
| be698cc0fb | |||
| 06b35acf65 | |||
| 557932f7bb | |||
| d48f328881 | |||
| 4e7f40c86a | |||
| 614c774e71 | |||
| 3fa4ab54b6 | |||
| de8136dbe4 | |||
| 4051aec6e3 | |||
| aa0496c548 | |||
| a953b5995c | |||
| ff2d889329 | |||
| f3b1adbd32 | |||
| 247443630a | |||
| 6eb54afda4 | |||
| 83ecc499e3 | |||
| 418a6ce8e4 | |||
| 4f19f73d4d | |||
| 31d109e00f | |||
| fd3f79e976 | |||
| c748e606b1 | |||
| 40299b38c5 | |||
| 62b40d4df5 | |||
| 5e4a1253d4 | |||
| 702792b659 | |||
| e83f83fa9b | |||
| 3de54340f3 | |||
| ffbc3bd1c2 | |||
| c513959461 | |||
| 66e414dd64 | |||
| 454d2a1d4e | |||
| ca3372d7f5 | |||
| 5bcbab1fac | |||
| 47656c08fd | |||
| 6374ff4a41 | |||
| 86e7c84e43 | |||
| d554fa34b2 | |||
| 1bec276c8b | |||
| 17153eacf0 | |||
| 20d25ca953 | |||
| b3b3d45b96 | |||
| 5ba65ea122 | |||
| 0108e3f603 | |||
| 8d23b13f70 | |||
| a8f9505255 | |||
| cd0509eb06 | |||
| 23504408ec | |||
| ba8282881d | |||
| ad1ac79fdb | |||
| 54736256a4 | |||
| 0d77ac096d | |||
| 6a2b27bfcb | |||
| 2a0aeac89b | |||
| 5dc11e2bdc | |||
| fba48dcd55 | |||
| 832c3103c7 | |||
| 49d9bf9859 | |||
| ef5d0c1222 | |||
| 1cb666d7dd | |||
| 45ca896bef | |||
| 624d5102a5 | |||
| 2e9e5cc51f | |||
| c5f755bfcf | |||
| 0d1cadd650 | |||
| 4cc7ffe74d | |||
| 7f59ca18b0 | |||
| f87030ff55 | |||
| 2406baa5a5 | |||
| d7bf973547 | |||
| 0d199b82ec | |||
| 7d7562d147 | |||
| 9d43fb2bb3 | |||
| 010da7536d | |||
| 3473f05823 | |||
| f72664957d | |||
| a127c2e5e2 | |||
| 952da4ddf6 | |||
| bf84477609 | |||
| e274a1b4c4 | |||
| e6150a5b53 | |||
| dfd881186a | |||
| 762b66dbcd | |||
| f1acfbf48f | |||
| 046faecf11 | |||
| c3612d2ca7 | |||
| 3da344fcad | |||
| 2b5380e67e | |||
| e3c7e4f524 | |||
| 3604e46661 | |||
| 8cea079f26 | |||
| 83b68001cb | |||
| 7a11a47f91 | |||
| 2a9a00bd86 | |||
| cfcbf37f98 | |||
| 7f5c854c00 | |||
| 7ec89580e7 | |||
| 56a5102377 | |||
| b6e9b5ac2b | |||
| eecdbbd2c4 | |||
| efeb871490 | |||
| f326a55247 | |||
| e788585bd4 | |||
| 1396761b18 | |||
| 5872e0f736 | |||
| 1872c8193d | |||
| 187a0c54cb | |||
| 9533497388 | |||
| f323b7bb1f | |||
| 68810b4762 | |||
| d3e01d0732 | |||
| 970cf7ee91 | |||
| 4bf038e24d | |||
| 5925b765b8 | |||
| 78cd3a786c |
12
.github/workflows/build.yml
vendored
12
.github/workflows/build.yml
vendored
@ -18,7 +18,7 @@ jobs:
|
|||||||
os: [ macos-latest, ubuntu-latest, windows-latest ]
|
os: [ macos-latest, ubuntu-latest, windows-latest ]
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v5
|
||||||
|
|
||||||
- name: Install pnpm
|
- name: Install pnpm
|
||||||
uses: pnpm/action-setup@v4
|
uses: pnpm/action-setup@v4
|
||||||
@ -28,14 +28,14 @@ jobs:
|
|||||||
|
|
||||||
- name: Setup NodeJS
|
- name: Setup NodeJS
|
||||||
if: startsWith(matrix.os, 'macOS') != true
|
if: startsWith(matrix.os, 'macOS') != true
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v5
|
||||||
with:
|
with:
|
||||||
node-version: ${{ env.NODE_VERSION }}
|
node-version: ${{ env.NODE_VERSION }}
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
|
||||||
- name: Setup NodeJS for macOS
|
- name: Setup NodeJS for macOS
|
||||||
if: startsWith(matrix.os, 'macOS')
|
if: startsWith(matrix.os, 'macOS')
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v5
|
||||||
with:
|
with:
|
||||||
node-version: ${{ env.NODE_VERSION }}
|
node-version: ${{ env.NODE_VERSION }}
|
||||||
|
|
||||||
@ -91,7 +91,7 @@ jobs:
|
|||||||
if: github.repository == 'th-ch/youtube-music' && github.ref == 'refs/heads/master'
|
if: github.repository == 'th-ch/youtube-music' && github.ref == 'refs/heads/master'
|
||||||
needs: build
|
needs: build
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v5
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
@ -103,14 +103,14 @@ jobs:
|
|||||||
|
|
||||||
- name: Setup NodeJS
|
- name: Setup NodeJS
|
||||||
if: startsWith(matrix.os, 'macOS') != true
|
if: startsWith(matrix.os, 'macOS') != true
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v5
|
||||||
with:
|
with:
|
||||||
node-version: ${{ env.NODE_VERSION }}
|
node-version: ${{ env.NODE_VERSION }}
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
|
||||||
- name: Setup NodeJS for macOS
|
- name: Setup NodeJS for macOS
|
||||||
if: startsWith(matrix.os, 'macOS')
|
if: startsWith(matrix.os, 'macOS')
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v5
|
||||||
with:
|
with:
|
||||||
node-version: ${{ env.NODE_VERSION }}
|
node-version: ${{ env.NODE_VERSION }}
|
||||||
|
|
||||||
|
|||||||
3
.github/workflows/dependency-review.yml
vendored
3
.github/workflows/dependency-review.yml
vendored
@ -15,6 +15,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: "Checkout Repository"
|
- name: "Checkout Repository"
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v5
|
||||||
|
|
||||||
- name: "Dependency Review"
|
- name: "Dependency Review"
|
||||||
uses: actions/dependency-review-action@v4
|
uses: actions/dependency-review-action@v4
|
||||||
|
|||||||
41
.github/workflows/reviewdog.yml
vendored
Normal file
41
.github/workflows/reviewdog.yml
vendored
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
name: reviewdog
|
||||||
|
|
||||||
|
on: [pull_request_target]
|
||||||
|
|
||||||
|
env:
|
||||||
|
NODE_VERSION: "22.x"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
eslint:
|
||||||
|
name: runner / eslint
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
pull-requests: write
|
||||||
|
checks: write
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v5
|
||||||
|
with:
|
||||||
|
ref: ${{ github.event.pull_request.head.sha }}
|
||||||
|
|
||||||
|
- name: Install pnpm
|
||||||
|
uses: pnpm/action-setup@v4
|
||||||
|
with:
|
||||||
|
version: 10
|
||||||
|
run_install: false
|
||||||
|
|
||||||
|
- name: Setup NodeJS
|
||||||
|
uses: actions/setup-node@v5
|
||||||
|
with:
|
||||||
|
node-version: ${{ env.NODE_VERSION }}
|
||||||
|
cache: 'pnpm'
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: pnpm install --frozen-lockfile
|
||||||
|
|
||||||
|
- uses: reviewdog/action-eslint@v1.34.0
|
||||||
|
with:
|
||||||
|
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
reporter: github-pr-review # Change reporter.
|
||||||
|
eslint_flags: './src'
|
||||||
|
fail_level: error
|
||||||
173
changelog.md
173
changelog.md
@ -2,8 +2,181 @@
|
|||||||
|
|
||||||
All notable changes to this project will be documented in this file. Dates are displayed in UTC.
|
All notable changes to this project will be documented in this file. Dates are displayed in UTC.
|
||||||
|
|
||||||
|
#### [v3.10.0](https://github.com/th-ch/youtube-music/compare/v3.9.0...v3.10.0)
|
||||||
|
|
||||||
|
- fix(deps): update dependency butterchurn to v3.0.0-beta.5 [`#3610`](https://github.com/th-ch/youtube-music/pull/3610)
|
||||||
|
- chore(deps): update eslint monorepo to v9.31.0 [`#3600`](https://github.com/th-ch/youtube-music/pull/3600)
|
||||||
|
- chore(deps): update dependency rollup to v4.45.0 [`#3568`](https://github.com/th-ch/youtube-music/pull/3568)
|
||||||
|
- feat: code splitting [`#3593`](https://github.com/th-ch/youtube-music/pull/3593)
|
||||||
|
- fix(deps): update dependency @ghostery/adblocker-electron-preload to v2.11.1 [`#3571`](https://github.com/th-ch/youtube-music/pull/3571)
|
||||||
|
- fix(deps): update dependency @ghostery/adblocker-electron to v2.11.1 [`#3570`](https://github.com/th-ch/youtube-music/pull/3570)
|
||||||
|
- chore(deps): update playwright monorepo to v1.54.1 [`#3599`](https://github.com/th-ch/youtube-music/pull/3599)
|
||||||
|
- chore(deps): update playwright monorepo to v1.54.0 [`#3591`](https://github.com/th-ch/youtube-music/pull/3591)
|
||||||
|
- chore(deps): update dependency electron to v37.2.1 [`#3559`](https://github.com/th-ch/youtube-music/pull/3559)
|
||||||
|
- fix(deps): update dependency socks to v2.8.6 [`#3598`](https://github.com/th-ch/youtube-music/pull/3598)
|
||||||
|
- fix(deps): update dependency zod to v4.0.5 [`#3594`](https://github.com/th-ch/youtube-music/pull/3594)
|
||||||
|
- chore(deps): update dependency vite to v7.0.8 [`#3597`](https://github.com/th-ch/youtube-music/pull/3597)
|
||||||
|
- chore(deps): update dependency vite to v7.0.7 [`#3590`](https://github.com/th-ch/youtube-music/pull/3590)
|
||||||
|
- chore(deps): update dependency @electron/universal to v3 [`#3565`](https://github.com/th-ch/youtube-music/pull/3565)
|
||||||
|
- fix(deps): update dependency electron-unhandled to v5 [`#2088`](https://github.com/th-ch/youtube-music/pull/2088)
|
||||||
|
- feat: enable the ESM for main [`#3588`](https://github.com/th-ch/youtube-music/pull/3588)
|
||||||
|
- fix(deps): update dependency zod to v4 [`#3587`](https://github.com/th-ch/youtube-music/pull/3587)
|
||||||
|
- feat: migrate from raw HTML to JSX (TSX / SolidJS) [`#3583`](https://github.com/th-ch/youtube-music/pull/3583)
|
||||||
|
- docs: add Unobtrusive Player in available plugins [`#3582`](https://github.com/th-ch/youtube-music/pull/3582)
|
||||||
|
- fix(deps): update dependency @hono/node-server to v1.15.0 [`#3557`](https://github.com/th-ch/youtube-music/pull/3557)
|
||||||
|
- chore(deps): update dependency vitefu to v1.1.1 [`#3564`](https://github.com/th-ch/youtube-music/pull/3564)
|
||||||
|
- chore(deps): update dependency discord-api-types to v0.38.15 [`#3562`](https://github.com/th-ch/youtube-music/pull/3562)
|
||||||
|
- fix(deps): update dependency es-hangul to v2.3.5 [`#3563`](https://github.com/th-ch/youtube-music/pull/3563)
|
||||||
|
- fix(deps): update dependency zod to v3.25.71 [`#3558`](https://github.com/th-ch/youtube-music/pull/3558)
|
||||||
|
- fix(deps): update dependency @ghostery/adblocker-electron to v2.9.2 [`#3560`](https://github.com/th-ch/youtube-music/pull/3560)
|
||||||
|
- fix(deps): update dependency @ghostery/adblocker-electron-preload to v2.9.2 [`#3561`](https://github.com/th-ch/youtube-music/pull/3561)
|
||||||
|
- fix(deps): update dependency @ghostery/adblocker-electron to v2.9.0 [`#3555`](https://github.com/th-ch/youtube-music/pull/3555)
|
||||||
|
- fix(deps): update dependency @ghostery/adblocker-electron-preload to v2.9.0 [`#3556`](https://github.com/th-ch/youtube-music/pull/3556)
|
||||||
|
- chore(deps): update eslint monorepo to v9.30.1 [`#3552`](https://github.com/th-ch/youtube-music/pull/3552)
|
||||||
|
- Fixed play/pause discord rich presence by fixing lastsonginfo tracking [`#3551`](https://github.com/th-ch/youtube-music/pull/3551)
|
||||||
|
- feat: enable rolldown native plugin [`#3502`](https://github.com/th-ch/youtube-music/pull/3502)
|
||||||
|
- fix(deps): update dependency virtua to v0.41.5 [`#3549`](https://github.com/th-ch/youtube-music/pull/3549)
|
||||||
|
- chore(deps): update dependency typescript-eslint to v8.35.1 [`#3545`](https://github.com/th-ch/youtube-music/pull/3545)
|
||||||
|
- chore(deps): update dependency discord-api-types to v0.38.14 [`#3546`](https://github.com/th-ch/youtube-music/pull/3546)
|
||||||
|
- chore(deps): update playwright monorepo to v1.53.2 [`#3547`](https://github.com/th-ch/youtube-music/pull/3547)
|
||||||
|
- fix(deps): update dependency i18next to v25.3.0 [`#3548`](https://github.com/th-ch/youtube-music/pull/3548)
|
||||||
|
- perf(synced-lyrics): virtual scrolling [`#3162`](https://github.com/th-ch/youtube-music/pull/3162)
|
||||||
|
- chore(deps): update dependency vite to v7 [`#3524`](https://github.com/th-ch/youtube-music/pull/3524)
|
||||||
|
- feat(synced-lyrics): Musixmatch [`#3261`](https://github.com/th-ch/youtube-music/pull/3261)
|
||||||
|
- feat(api-server): add optional params for search [`#3440`](https://github.com/th-ch/youtube-music/pull/3440)
|
||||||
|
- chore(deps): update dependency vite-plugin-inspect to v11.3.0 [`#3543`](https://github.com/th-ch/youtube-music/pull/3543)
|
||||||
|
- chore(deps): update eslint monorepo to v9.30.0 [`#3544`](https://github.com/th-ch/youtube-music/pull/3544)
|
||||||
|
- chore(deps): update dependency rollup to v4.44.1 [`#3537`](https://github.com/th-ch/youtube-music/pull/3537)
|
||||||
|
- chore(deps): update dependency ws to v8.18.3 [`#3538`](https://github.com/th-ch/youtube-music/pull/3538)
|
||||||
|
- fix(deps): update dependency @hono/zod-openapi to v0.19.9 [`#3540`](https://github.com/th-ch/youtube-music/pull/3540)
|
||||||
|
- fix(deps): update dependency @floating-ui/dom to v1.7.2 [`#3539`](https://github.com/th-ch/youtube-music/pull/3539)
|
||||||
|
- fix(deps): update dependency es-hangul to v2.3.4 [`#3541`](https://github.com/th-ch/youtube-music/pull/3541)
|
||||||
|
- fix(deps): update dependency hono to v4.8.3 [`#3542`](https://github.com/th-ch/youtube-music/pull/3542)
|
||||||
|
- fix(style): fix duplicated scrollbar [`#3483`](https://github.com/th-ch/youtube-music/pull/3483)
|
||||||
|
- chore(deps): update dependency typescript-eslint to v8.35.0 [`#3518`](https://github.com/th-ch/youtube-music/pull/3518)
|
||||||
|
- chore(deps): update dependency vite-plugin-solid to v2.11.7 [`#3520`](https://github.com/th-ch/youtube-music/pull/3520)
|
||||||
|
- chore(deps): update dependency discord-api-types to v0.38.13 [`#3517`](https://github.com/th-ch/youtube-music/pull/3517)
|
||||||
|
- chore(deps): update dependency eslint-import-resolver-typescript to v4.4.4 [`#3534`](https://github.com/th-ch/youtube-music/pull/3534)
|
||||||
|
- fix(deps): update dependency @ghostery/adblocker-electron to v2.8.0 [`#3521`](https://github.com/th-ch/youtube-music/pull/3521)
|
||||||
|
- chore(deps): update dependency eslint-plugin-prettier to v5.5.1 [`#3535`](https://github.com/th-ch/youtube-music/pull/3535)
|
||||||
|
- fix(deps): update dependency @ghostery/adblocker-electron-preload to v2.8.0 [`#3522`](https://github.com/th-ch/youtube-music/pull/3522)
|
||||||
|
- chore(deps): update dependency electron to v37 [`#3527`](https://github.com/th-ch/youtube-music/pull/3527)
|
||||||
|
- feat: Add instructional note to Swagger documentation [`#3532`](https://github.com/th-ch/youtube-music/pull/3532)
|
||||||
|
- chore(deps): update playwright monorepo to v1.53.1 [`#3504`](https://github.com/th-ch/youtube-music/pull/3504)
|
||||||
|
- chore(deps): update dependency rollup to v4.44.0 [`#3508`](https://github.com/th-ch/youtube-music/pull/3508)
|
||||||
|
- chore(deps): update dependency eslint-plugin-import to v2.32.0 [`#3513`](https://github.com/th-ch/youtube-music/pull/3513)
|
||||||
|
- fix(deps): update dependency hono to v4.8.2 [`#3509`](https://github.com/th-ch/youtube-music/pull/3509)
|
||||||
|
- chore(deps): update dependency electron to v36.5.0 [`#3503`](https://github.com/th-ch/youtube-music/pull/3503)
|
||||||
|
- chore(deps): update stefanzweifel/git-auto-commit-action action to v6 [`#3500`](https://github.com/th-ch/youtube-music/pull/3500)
|
||||||
|
- chore(deps): update dependency vite to v6.3.21 [`#3492`](https://github.com/th-ch/youtube-music/pull/3492)
|
||||||
|
- fix(deps): update dependency hono to v4.8.0 [`#3499`](https://github.com/th-ch/youtube-music/pull/3499)
|
||||||
|
- chore(deps): update playwright monorepo to v1.53.0 [`#3497`](https://github.com/th-ch/youtube-music/pull/3497)
|
||||||
|
- chore(deps): update eslint monorepo to v9.29.0 [`#3496`](https://github.com/th-ch/youtube-music/pull/3496)
|
||||||
|
- chore(deps): update dependency vite-plugin-inspect to v11.2.0 [`#3495`](https://github.com/th-ch/youtube-music/pull/3495)
|
||||||
|
- fix(deps): update dependency happy-dom to v18 [`#3501`](https://github.com/th-ch/youtube-music/pull/3501)
|
||||||
|
- fix(deps): update dependency electron-store to v10.1.0 [`#3498`](https://github.com/th-ch/youtube-music/pull/3498)
|
||||||
|
- chore(deps): update dependency eslint-plugin-prettier to v5.5.0 [`#3493`](https://github.com/th-ch/youtube-music/pull/3493)
|
||||||
|
- chore(deps): update dependency rollup to v4.43.0 [`#3494`](https://github.com/th-ch/youtube-music/pull/3494)
|
||||||
|
- fix(deps): update dependency @ghostery/adblocker-electron to v2.7.0 [`#3466`](https://github.com/th-ch/youtube-music/pull/3466)
|
||||||
|
- fix(deps): update dependency @hono/swagger-ui to v0.5.2 [`#3465`](https://github.com/th-ch/youtube-music/pull/3465)
|
||||||
|
- fix(deps): update dependency @ghostery/adblocker-electron-preload to v2.7.0 [`#3467`](https://github.com/th-ch/youtube-music/pull/3467)
|
||||||
|
- fix(deps): update dependency youtubei.js to v14 [`#3468`](https://github.com/th-ch/youtube-music/pull/3468)
|
||||||
|
- chore(deps): update dependency discord-api-types to v0.38.12 [`#3490`](https://github.com/th-ch/youtube-music/pull/3490)
|
||||||
|
- chore(deps): update dependency glob to v11.0.3 [`#3491`](https://github.com/th-ch/youtube-music/pull/3491)
|
||||||
|
- chore(deps): update dependency typescript-eslint to v8.34.1 [`#3469`](https://github.com/th-ch/youtube-music/pull/3469)
|
||||||
|
- fix(deps): update dependency socks to v2.8.5 [`#3470`](https://github.com/th-ch/youtube-music/pull/3470)
|
||||||
|
- fix(deps): update dependency zod to v3.25.67 [`#3471`](https://github.com/th-ch/youtube-music/pull/3471)
|
||||||
|
- chore(deps): update dependency @babel/runtime to v7.27.6 [`#3451`](https://github.com/th-ch/youtube-music/pull/3451)
|
||||||
|
- chore(deps): update dependency eslint-import-resolver-typescript to v4.4.3 [`#3453`](https://github.com/th-ch/youtube-music/pull/3453)
|
||||||
|
- fix(deps): update dependency zod to v3.25.56 [`#3454`](https://github.com/th-ch/youtube-music/pull/3454)
|
||||||
|
- fix(deps): update dependency @hono/node-server to v1.14.4 [`#3456`](https://github.com/th-ch/youtube-music/pull/3456)
|
||||||
|
- chore(deps): update dependency rollup to v4.42.0 [`#3457`](https://github.com/th-ch/youtube-music/pull/3457)
|
||||||
|
- fix(deps): update dependency conf to v14 [`#3458`](https://github.com/th-ch/youtube-music/pull/3458)
|
||||||
|
- fix(deps): update dependency peerjs to v1.5.5 [`#3460`](https://github.com/th-ch/youtube-music/pull/3460)
|
||||||
|
- chore(deps): update dependency @stylistic/eslint-plugin-js to v4.4.1 [`#3444`](https://github.com/th-ch/youtube-music/pull/3444)
|
||||||
|
- chore(deps): update dependency discord-api-types to v0.38.11 [`#3445`](https://github.com/th-ch/youtube-music/pull/3445)
|
||||||
|
- chore(deps): update dependency electron to v36.4.0 [`#3447`](https://github.com/th-ch/youtube-music/pull/3447)
|
||||||
|
- fix(deps): update dependency zod to v3.25.51 [`#3446`](https://github.com/th-ch/youtube-music/pull/3446)
|
||||||
|
- fix(deps): update dependency hono to v4.7.11 [`#3435`](https://github.com/th-ch/youtube-music/pull/3435)
|
||||||
|
- fix(deps): update dependency @floating-ui/dom to v1.7.1 [`#3434`](https://github.com/th-ch/youtube-music/pull/3434)
|
||||||
|
- chore(deps): update dependency eslint-import-resolver-typescript to v4.4.2 [`#3432`](https://github.com/th-ch/youtube-music/pull/3432)
|
||||||
|
- chore(deps): update dependency eslint-plugin-prettier to v5.4.1 [`#3433`](https://github.com/th-ch/youtube-music/pull/3433)
|
||||||
|
- fix(deps): update dependency zod to v3.25.50 [`#3443`](https://github.com/th-ch/youtube-music/pull/3443)
|
||||||
|
- fix(deps): update dependency happy-dom to v17.6.3 [`#3438`](https://github.com/th-ch/youtube-music/pull/3438)
|
||||||
|
- fix(deps): update dependency zod to v3.25.49 [`#3436`](https://github.com/th-ch/youtube-music/pull/3436)
|
||||||
|
- chore(deps): update eslint monorepo to v9.28.0 [`#3437`](https://github.com/th-ch/youtube-music/pull/3437)
|
||||||
|
- fix(deps): update dependency @hono/zod-openapi to v0.19.8 [`#3411`](https://github.com/th-ch/youtube-music/pull/3411)
|
||||||
|
- fix: use gtk 3 switch as workaround [`#3366`](https://github.com/th-ch/youtube-music/pull/3366)
|
||||||
|
- chore(deps): update dependency electron to v36.3.2 [`#3431`](https://github.com/th-ch/youtube-music/pull/3431)
|
||||||
|
- fix(deps): update dependency @xhayper/discord-rpc to v1.2.2 [`#3413`](https://github.com/th-ch/youtube-music/pull/3413)
|
||||||
|
- fix(deps): update dependency happy-dom to v17.5.6 [`#3417`](https://github.com/th-ch/youtube-music/pull/3417)
|
||||||
|
- fix(deps): update dependency @hono/zod-validator to v0.7.0 [`#3414`](https://github.com/th-ch/youtube-music/pull/3414)
|
||||||
|
- chore(deps): update dependency discord-api-types to v0.38.10 [`#3430`](https://github.com/th-ch/youtube-music/pull/3430)
|
||||||
|
- chore(deps): update dependency typescript-eslint to v8.33.1 [`#3416`](https://github.com/th-ch/youtube-music/pull/3416)
|
||||||
|
- chore(docs): Improve README-es.md by adjusting the bad Spanish translation [`#3424`](https://github.com/th-ch/youtube-music/pull/3424)
|
||||||
|
- chore(docs): Improve README.md by removing the extra flag for Spanish translation [`#3422`](https://github.com/th-ch/youtube-music/pull/3422)
|
||||||
|
- chore(deps): update dependency @babel/runtime to v7.27.4 [`#3410`](https://github.com/th-ch/youtube-music/pull/3410)
|
||||||
|
- fix(deps): update dependency ts-morph to v26 [`#3409`](https://github.com/th-ch/youtube-music/pull/3409)
|
||||||
|
- fix(deps): update dependency @ghostery/adblocker-electron-preload to v2.6.1 [`#3407`](https://github.com/th-ch/youtube-music/pull/3407)
|
||||||
|
- fix(deps): update dependency zod to v3.25.30 [`#3408`](https://github.com/th-ch/youtube-music/pull/3408)
|
||||||
|
- fix(precise-volume): replace constructor check for volume slider [`#3362`](https://github.com/th-ch/youtube-music/pull/3362)
|
||||||
|
- chore(deps): update dependency vite-plugin-inspect to v11.1.0 [`#3393`](https://github.com/th-ch/youtube-music/pull/3393)
|
||||||
|
- chore(deps): update dependency eslint-import-resolver-typescript to v4.4.1 [`#3406`](https://github.com/th-ch/youtube-music/pull/3406)
|
||||||
|
- chore(deps): update dependency @stylistic/eslint-plugin-js to v4.4.0 [`#3391`](https://github.com/th-ch/youtube-music/pull/3391)
|
||||||
|
- fix(deps): update dependency i18next to v25.2.1 [`#3405`](https://github.com/th-ch/youtube-music/pull/3405)
|
||||||
|
- chore(deps): update dependency esbuild to v0.25.5 [`#3403`](https://github.com/th-ch/youtube-music/pull/3403)
|
||||||
|
- fix(deps): update dependency @hono/node-server to v1.14.3 [`#3404`](https://github.com/th-ch/youtube-music/pull/3404)
|
||||||
|
- chore(deps): update dependency rollup to v4.41.1 [`#3392`](https://github.com/th-ch/youtube-music/pull/3392)
|
||||||
|
- chore(deps): update eslint monorepo to v9.27.0 [`#3394`](https://github.com/th-ch/youtube-music/pull/3394)
|
||||||
|
- fix(deps): update dependency @ghostery/adblocker-electron to v2.6.1 [`#3395`](https://github.com/th-ch/youtube-music/pull/3395)
|
||||||
|
- fix(deps): update dependency hono to v4.7.10 [`#3390`](https://github.com/th-ch/youtube-music/pull/3390)
|
||||||
|
- chore(deps): update dependency eslint-import-resolver-typescript to v4.3.5 [`#3388`](https://github.com/th-ch/youtube-music/pull/3388)
|
||||||
|
- fix(deps): update dependency @hono/node-server to v1.14.2 [`#3389`](https://github.com/th-ch/youtube-music/pull/3389)
|
||||||
|
- chore(deps): update dependency electron to v36.3.1 [`#3372`](https://github.com/th-ch/youtube-music/pull/3372)
|
||||||
|
- chore(deps): update dependency typescript-eslint to v8.32.1 [`#3364`](https://github.com/th-ch/youtube-music/pull/3364)
|
||||||
|
- fix(deps): update dependency semver to v7.7.2 [`#3365`](https://github.com/th-ch/youtube-music/pull/3365)
|
||||||
|
- fix(album-actions): update playlist and button selectors [`#3367`](https://github.com/th-ch/youtube-music/pull/3367)
|
||||||
|
- fix(deps): update dependency i18next to v25.2.0 [`#3370`](https://github.com/th-ch/youtube-music/pull/3370)
|
||||||
|
- chore(deps): update dependency discord-api-types to v0.38.8 [`#3361`](https://github.com/th-ch/youtube-music/pull/3361)
|
||||||
|
- fix(deps): update dependency solid-js to v1.9.7 [`#3375`](https://github.com/th-ch/youtube-music/pull/3375)
|
||||||
|
- chore(deps): update dependency electron to v36 [`#3307`](https://github.com/th-ch/youtube-music/pull/3307)
|
||||||
|
- fix(deps): update dependency @floating-ui/dom to v1.7.0 [`#3357`](https://github.com/th-ch/youtube-music/pull/3357)
|
||||||
|
- chore(deps): update eslint monorepo to v9.26.0 [`#3356`](https://github.com/th-ch/youtube-music/pull/3356)
|
||||||
|
- chore(deps): update dependency eslint-plugin-prettier to v5.4.0 [`#3355`](https://github.com/th-ch/youtube-music/pull/3355)
|
||||||
|
- fix(deps): update dependency zod to v3.24.4 [`#3354`](https://github.com/th-ch/youtube-music/pull/3354)
|
||||||
|
- fix(deps): update dependency solid-js to v1.9.6 [`#3353`](https://github.com/th-ch/youtube-music/pull/3353)
|
||||||
|
- fix(deps): update dependency @ghostery/adblocker-electron-preload to v2.5.2 [`#3350`](https://github.com/th-ch/youtube-music/pull/3350)
|
||||||
|
- fix(deps): update dependency happy-dom to v17.4.7 [`#3352`](https://github.com/th-ch/youtube-music/pull/3352)
|
||||||
|
- fix(deps): update dependency @ghostery/adblocker-electron to v2.5.2 [`#3349`](https://github.com/th-ch/youtube-music/pull/3349)
|
||||||
|
- chore(deps): update dependency vite to v6.3.5 [`#3346`](https://github.com/th-ch/youtube-music/pull/3346)
|
||||||
|
- chore(deps): update dependency ws to v8.18.2 [`#3347`](https://github.com/th-ch/youtube-music/pull/3347)
|
||||||
|
- feat(plugin): support authenticated proxy [`#3175`](https://github.com/th-ch/youtube-music/pull/3175)
|
||||||
|
- chore(deps): update dependency esbuild to v0.25.4 [`#3344`](https://github.com/th-ch/youtube-music/pull/3344)
|
||||||
|
- chore(deps): update dependency eslint-config-prettier to v10.1.5 [`#3345`](https://github.com/th-ch/youtube-music/pull/3345)
|
||||||
|
- fix(deps): update dependency hono to v4.7.9 [`#3302`](https://github.com/th-ch/youtube-music/pull/3302)
|
||||||
|
- chore(deps): update dependency electron to v34.5.5 [`#3343`](https://github.com/th-ch/youtube-music/pull/3343)
|
||||||
|
- docs: Add Ukrainian translation [`#3338`](https://github.com/th-ch/youtube-music/pull/3338)
|
||||||
|
- chore(deps): update dependency discord-api-types to v0.38.4 [`#3342`](https://github.com/th-ch/youtube-music/pull/3342)
|
||||||
|
- chore(deps): update dependency rollup to v4.40.2 [`#3301`](https://github.com/th-ch/youtube-music/pull/3301)
|
||||||
|
- chore(deps): update dependency @electron/universal to v2.0.3 [`#3341`](https://github.com/th-ch/youtube-music/pull/3341)
|
||||||
|
- fix(deps): update dependency @hono/zod-validator to v0.5.0 [`#3295`](https://github.com/th-ch/youtube-music/pull/3295)
|
||||||
|
- chore(deps): update dependency @babel/runtime to v7.27.1 [`#3340`](https://github.com/th-ch/youtube-music/pull/3340)
|
||||||
|
- fix(deps): update dependency i18next to v25.1.2 [`#3305`](https://github.com/th-ch/youtube-music/pull/3305)
|
||||||
|
- fix(album-actions): use playlist shelf for playlist detection [`#3306`](https://github.com/th-ch/youtube-music/pull/3306)
|
||||||
|
- chore(deps): update dependency typescript-eslint to v8.32.0 [`#3304`](https://github.com/th-ch/youtube-music/pull/3304)
|
||||||
|
- chore(deps): update dependency vite to v6.3.4 [security] [`#3313`](https://github.com/th-ch/youtube-music/pull/3313)
|
||||||
|
- fix(deps): update dependency @hono/zod-openapi to v0.19.6 [`#3294`](https://github.com/th-ch/youtube-music/pull/3294)
|
||||||
|
- fix(deps): update dependency es-hangul to v2.3.3 [`#3293`](https://github.com/th-ch/youtube-music/pull/3293)
|
||||||
|
- fix(api-server): fix #3572 [`#3572`](https://github.com/th-ch/youtube-music/issues/3572)
|
||||||
|
- fix(youtube-music): fix #3296, and macOS traffic lights [`#3296`](https://github.com/th-ch/youtube-music/issues/3296)
|
||||||
|
- fix: kuromoji zlib and apply rolldown-vite [`f047dd2`](https://github.com/th-ch/youtube-music/commit/f047dd2d2df189b55b60188392c451aad65b7a1b)
|
||||||
|
- fix: apply fix from eslint [`1da83ff`](https://github.com/th-ch/youtube-music/commit/1da83ff27c2ccfcdf48c0b0b125033b1a1c194d2)
|
||||||
|
- feat: refactor [`51b3f53`](https://github.com/th-ch/youtube-music/commit/51b3f535695c0f19cd252049985578d11a853ccb)
|
||||||
|
|
||||||
#### [v3.9.0](https://github.com/th-ch/youtube-music/compare/v3.8.1...v3.9.0)
|
#### [v3.9.0](https://github.com/th-ch/youtube-music/compare/v3.8.1...v3.9.0)
|
||||||
|
|
||||||
|
> 27 April 2025
|
||||||
|
|
||||||
- feat(tuna-obs): added alternativeTitle and tags to tuna [`#3288`](https://github.com/th-ch/youtube-music/pull/3288)
|
- feat(tuna-obs): added alternativeTitle and tags to tuna [`#3288`](https://github.com/th-ch/youtube-music/pull/3288)
|
||||||
- fix: rollback electron version to v34 (for fix #3216) [`#3216`](https://github.com/th-ch/youtube-music/issues/3216)
|
- fix: rollback electron version to v34 (for fix #3216) [`#3216`](https://github.com/th-ch/youtube-music/issues/3216)
|
||||||
- fix(synced-lyrics): fix #3157 [`#3157`](https://github.com/th-ch/youtube-music/issues/3157)
|
- fix(synced-lyrics): fix #3157 [`#3157`](https://github.com/th-ch/youtube-music/issues/3157)
|
||||||
|
|||||||
@ -478,7 +478,7 @@
|
|||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<div class="footer-copyright">© 2024 th-ch</div>
|
<div class="footer-copyright">© 2025 th-ch</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -21,7 +21,7 @@
|
|||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
Lestu þetta á öðrum tungumálum: [🏴 Ensku](../../README.md), [🇰🇷 Kóreska](./README-ko.md), [🇫🇷 Franska](./README-fr.md), [🇮🇸 Íslenskur](./README-is.md), [🇪🇸 Spænska](./README-es.md), [🇷🇺 Rússneska](./README-ru.md), [🇺🇦 Úkraínska](./README-uk.md), [🇧🇷 Portúgalska](./README-pt.md), [🇯🇵 Japanska](./README-ja.md)
|
Lestu þetta á öðrum tungumálum: [🏴 Enska](../../README.md), [🇰🇷 Kóreska](./README-ko.md), [🇫🇷 Franska](./README-fr.md), [🇮🇸 Íslenska](./README-is.md), [🇪🇸 Spænska](./README-es.md), [🇷🇺 Rússneska](./README-ru.md), [🇺🇦 Úkraínska](./README-uk.md), [🇧🇷 Portúgalska](./README-pt.md), [🇭🇺 Ungverska](./README-hu.md) [🇯🇵 Japanska](./README-ja.md)
|
||||||
|
|
||||||
**Electron umbúðir utan um YouTube Tónlist sem inniheldur:**
|
**Electron umbúðir utan um YouTube Tónlist sem inniheldur:**
|
||||||
|
|
||||||
|
|||||||
@ -45,7 +45,7 @@ export default defineConfig({
|
|||||||
formats: ['es'],
|
formats: ['es'],
|
||||||
},
|
},
|
||||||
outDir: 'dist/main',
|
outDir: 'dist/main',
|
||||||
rollupOptions: {
|
rolldownOptions: {
|
||||||
external: ['electron', 'custom-electron-prompt', ...builtinModules],
|
external: ['electron', 'custom-electron-prompt', ...builtinModules],
|
||||||
input: './src/index.ts',
|
input: './src/index.ts',
|
||||||
},
|
},
|
||||||
@ -96,7 +96,7 @@ export default defineConfig({
|
|||||||
commonjsOptions: {
|
commonjsOptions: {
|
||||||
ignoreDynamicRequires: true,
|
ignoreDynamicRequires: true,
|
||||||
},
|
},
|
||||||
rollupOptions: {
|
rolldownOptions: {
|
||||||
external: ['electron', 'custom-electron-prompt', ...builtinModules],
|
external: ['electron', 'custom-electron-prompt', ...builtinModules],
|
||||||
input: './src/preload.ts',
|
input: './src/preload.ts',
|
||||||
},
|
},
|
||||||
@ -149,7 +149,7 @@ export default defineConfig({
|
|||||||
name: 'renderer',
|
name: 'renderer',
|
||||||
},
|
},
|
||||||
outDir: 'dist/renderer',
|
outDir: 'dist/renderer',
|
||||||
rollupOptions: {
|
rolldownOptions: {
|
||||||
external: ['electron', ...builtinModules],
|
external: ['electron', ...builtinModules],
|
||||||
input: './src/index.html',
|
input: './src/index.html',
|
||||||
},
|
},
|
||||||
|
|||||||
@ -31,11 +31,19 @@ export default tsEslint.config(
|
|||||||
rules: {
|
rules: {
|
||||||
'stylistic/arrow-parens': ['error', 'always'],
|
'stylistic/arrow-parens': ['error', 'always'],
|
||||||
'stylistic/object-curly-spacing': ['error', 'always'],
|
'stylistic/object-curly-spacing': ['error', 'always'],
|
||||||
|
'stylistic/jsx-pascal-case': 'error',
|
||||||
|
'stylistic/jsx-curly-spacing': ['error', { when: 'never', children: true }],
|
||||||
|
'stylistic/jsx-sort-props': 'error',
|
||||||
'prettier/prettier': ['error', { singleQuote: true, semi: true, tabWidth: 2, trailingComma: 'all', quoteProps: 'preserve' }],
|
'prettier/prettier': ['error', { singleQuote: true, semi: true, tabWidth: 2, trailingComma: 'all', quoteProps: 'preserve' }],
|
||||||
'@typescript-eslint/no-floating-promises': 'off',
|
'@typescript-eslint/no-floating-promises': 'off',
|
||||||
'@typescript-eslint/no-misused-promises': ['off', { checksVoidReturn: false }],
|
'@typescript-eslint/no-misused-promises': ['off', { checksVoidReturn: false }],
|
||||||
'@typescript-eslint/no-unused-vars': ['warn', { argsIgnorePattern: '^_' }],
|
'@typescript-eslint/no-unused-vars': ['warn', { argsIgnorePattern: '^_' }],
|
||||||
'@typescript-eslint/no-non-null-assertion': 'off',
|
'@typescript-eslint/no-non-null-assertion': 'off',
|
||||||
|
'@typescript-eslint/consistent-type-imports': ['error', {
|
||||||
|
fixStyle: 'inline-type-imports',
|
||||||
|
prefer: 'type-imports',
|
||||||
|
disallowTypeAnnotations: false,
|
||||||
|
}],
|
||||||
'importPlugin/first': 'error',
|
'importPlugin/first': 'error',
|
||||||
'importPlugin/newline-after-import': 'off',
|
'importPlugin/newline-after-import': 'off',
|
||||||
'importPlugin/no-default-export': 'off',
|
'importPlugin/no-default-export': 'off',
|
||||||
|
|||||||
112
package.json
112
package.json
@ -2,7 +2,7 @@
|
|||||||
"name": "youtube-music",
|
"name": "youtube-music",
|
||||||
"desktopName": "com.github.th_ch.youtube_music",
|
"desktopName": "com.github.th_ch.youtube_music",
|
||||||
"productName": "YouTube Music",
|
"productName": "YouTube Music",
|
||||||
"version": "3.10.0",
|
"version": "3.11.0",
|
||||||
"description": "YouTube Music Desktop App - including custom plugins",
|
"description": "YouTube Music Desktop App - including custom plugins",
|
||||||
"main": "./dist/main/index.js",
|
"main": "./dist/main/index.js",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
@ -14,16 +14,16 @@
|
|||||||
"url": "https://github.com/th-ch/youtube-music"
|
"url": "https://github.com/th-ch/youtube-music"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "playwright test",
|
"test": "pnpm playwright test",
|
||||||
"test:debug": "cross-env DEBUG=pw:*,-pw:test:protocol playwright test",
|
"test:debug": "pnpm cross-env DEBUG=pw:*,-pw:test:protocol playwright test",
|
||||||
"build": "electron-vite build",
|
"build": "pnpm electron-vite build",
|
||||||
"vite:inspect": "pnpm clean && electron-vite build --mode development && pnpm exec serve .vite-inspect",
|
"vite:inspect": "pnpm clean && electron-vite build --mode development && pnpm exec serve .vite-inspect",
|
||||||
"start": "electron-vite preview",
|
"start": "pnpm electron-vite preview",
|
||||||
"start:debug": "cross-env ELECTRON_ENABLE_LOGGING=1 pnpm start",
|
"start:debug": "pnpm cross-env ELECTRON_ENABLE_LOGGING=1 pnpm start",
|
||||||
"dev": "cross-env NODE_OPTIONS=--enable-source-maps electron-vite dev --watch",
|
"dev": "pnpm cross-env NODE_ENV=development NODE_OPTIONS=--enable-source-maps electron-vite dev --watch",
|
||||||
"dev:renderer": "cross-env NODE_OPTIONS=--enable-source-maps electron-vite dev",
|
"dev:renderer": "pnpm cross-env NODE_ENV=development NODE_OPTIONS=--enable-source-maps electron-vite dev",
|
||||||
"dev:debug": "cross-env ELECTRON_ENABLE_LOGGING=1 pnpm dev",
|
"dev:debug": "pnpm cross-env ELECTRON_ENABLE_LOGGING=1 pnpm dev",
|
||||||
"clean": "del-cli dist && del-cli pack && del-cli .vite-inspect",
|
"clean": "pnpm del-cli dist && pnpm del-cli pack && pnpm del-cli .vite-inspect",
|
||||||
"dist": "pnpm clean && pnpm build && pnpm electron-builder --win --mac --linux -p never",
|
"dist": "pnpm clean && pnpm build && pnpm electron-builder --win --mac --linux -p never",
|
||||||
"dist:linux": "pnpm clean && pnpm build && pnpm electron-builder --linux -p never",
|
"dist:linux": "pnpm clean && pnpm build && pnpm electron-builder --linux -p never",
|
||||||
"dist:linux:deb-arm64": "pnpm clean && pnpm build && pnpm electron-builder --linux deb:arm64 -p never",
|
"dist:linux:deb-arm64": "pnpm clean && pnpm build && pnpm electron-builder --linux deb:arm64 -p never",
|
||||||
@ -32,12 +32,12 @@
|
|||||||
"dist:mac:arm64": "pnpm clean && pnpm build && pnpm electron-builder --mac dmg:arm64 -p never",
|
"dist:mac:arm64": "pnpm clean && pnpm build && pnpm electron-builder --mac dmg:arm64 -p never",
|
||||||
"dist:win": "pnpm clean && pnpm build && pnpm electron-builder --win -p never",
|
"dist:win": "pnpm clean && pnpm build && pnpm electron-builder --win -p never",
|
||||||
"dist:win:x64": "pnpm clean && pnpm build && pnpm electron-builder --win nsis-web:x64 -p never",
|
"dist:win:x64": "pnpm clean && pnpm build && pnpm electron-builder --win nsis-web:x64 -p never",
|
||||||
"lint": "eslint .",
|
"lint": "pnpm eslint ./src",
|
||||||
"changelog": "npx --yes auto-changelog",
|
"changelog": "pnpm dlx auto-changelog",
|
||||||
"release:linux": "pnpm clean && pnpm build && pnpm electron-builder --linux -p always -c.snap.publish=github",
|
"release:linux": "pnpm clean && pnpm build && pnpm electron-builder --linux -p always -c.snap.publish=github",
|
||||||
"release:mac": "pnpm clean && pnpm build && pnpm electron-builder --mac -p always",
|
"release:mac": "pnpm clean && pnpm build && pnpm electron-builder --mac -p always",
|
||||||
"release:win": "pnpm clean && pnpm build && pnpm electron-builder --win -p always",
|
"release:win": "pnpm clean && pnpm build && pnpm electron-builder --win -p always",
|
||||||
"typecheck": "tsc -p tsconfig.json --noEmit"
|
"typecheck": "pnpm tsc -p tsconfig.json --noEmit"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=22",
|
"node": ">=22",
|
||||||
@ -45,41 +45,43 @@
|
|||||||
},
|
},
|
||||||
"pnpm": {
|
"pnpm": {
|
||||||
"overrides": {
|
"overrides": {
|
||||||
"vite": "npm:rolldown-vite@7.0.8",
|
"vite": "npm:rolldown-vite@7.1.5",
|
||||||
"node-gyp": "11.2.0",
|
"node-gyp": "11.4.2",
|
||||||
"xml2js": "0.6.2",
|
"xml2js": "0.6.2",
|
||||||
"node-fetch": "3.3.2",
|
"node-fetch": "3.3.2",
|
||||||
"@electron/universal": "3.0.0",
|
"@electron/universal": "3.0.1",
|
||||||
"@babel/runtime": "7.27.6",
|
"@babel/runtime": "7.28.4"
|
||||||
"vitefu": "1.1.1"
|
|
||||||
},
|
},
|
||||||
"patchedDependencies": {
|
"patchedDependencies": {
|
||||||
"vudio@2.1.1": "patches/vudio@2.1.1.patch",
|
"vudio@2.1.1": "patches/vudio@2.1.1.patch",
|
||||||
"@malept/flatpak-bundler@0.4.0": "patches/@malept__flatpak-bundler@0.4.0.patch",
|
"@malept/flatpak-bundler@0.4.0": "patches/@malept__flatpak-bundler@0.4.0.patch",
|
||||||
"kuromoji@0.1.2": "patches/kuromoji@0.1.2.patch",
|
"kuromoji@0.1.2": "patches/kuromoji@0.1.2.patch",
|
||||||
"file-type@16.5.4": "patches/file-type@16.5.4.patch"
|
"file-type@16.5.4": "patches/file-type@16.5.4.patch",
|
||||||
|
"electron-is@3.0.0": "patches/electron-is@3.0.0.patch"
|
||||||
},
|
},
|
||||||
"neverBuiltDependencies": []
|
"neverBuiltDependencies": []
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@dehoist/romanize-thai": "1.0.0",
|
||||||
"@electron-toolkit/tsconfig": "1.0.1",
|
"@electron-toolkit/tsconfig": "1.0.1",
|
||||||
"@electron/remote": "2.1.3",
|
"@electron/remote": "2.1.3",
|
||||||
"@ffmpeg.wasm/core-mt": "0.12.0",
|
"@ffmpeg.wasm/core-mt": "0.12.0",
|
||||||
"@ffmpeg.wasm/main": "0.12.0",
|
"@ffmpeg.wasm/main": "0.12.0",
|
||||||
"@floating-ui/dom": "1.7.2",
|
"@floating-ui/dom": "1.7.4",
|
||||||
"@foobar404/wave": "2.0.5",
|
"@foobar404/wave": "2.0.5",
|
||||||
"@ghostery/adblocker-electron": "2.11.1",
|
"@ghostery/adblocker-electron": "2.11.6",
|
||||||
"@ghostery/adblocker-electron-preload": "2.11.1",
|
"@ghostery/adblocker-electron-preload": "2.11.6",
|
||||||
"@hono/node-server": "1.15.0",
|
"@hono/node-server": "1.19.1",
|
||||||
|
"@hono/node-ws": "1.2.0",
|
||||||
"@hono/swagger-ui": "0.5.2",
|
"@hono/swagger-ui": "0.5.2",
|
||||||
"@hono/zod-openapi": "1.0.0-beta.1",
|
"@hono/zod-openapi": "1.1.0",
|
||||||
"@hono/zod-validator": "0.7.0",
|
"@hono/zod-validator": "0.7.2",
|
||||||
"@jellybrick/dbus-next": "0.10.3",
|
"@jellybrick/dbus-next": "0.10.3",
|
||||||
"@jellybrick/electron-better-web-request": "1.0.4",
|
"@jellybrick/electron-better-web-request": "1.0.4",
|
||||||
"@jellybrick/mpris-service": "2.1.5",
|
"@jellybrick/mpris-service": "2.1.5",
|
||||||
"@jimp/plugin-color": "1.6.0",
|
"@jimp/plugin-color": "1.6.0",
|
||||||
"@skyra/jaro-winkler": "1.1.1",
|
"@skyra/jaro-winkler": "1.1.1",
|
||||||
"@xhayper/discord-rpc": "1.2.2",
|
"@xhayper/discord-rpc": "1.3.0",
|
||||||
"async-mutex": "0.5.0",
|
"async-mutex": "0.5.0",
|
||||||
"bgutils-js": "3.2.0",
|
"bgutils-js": "3.2.0",
|
||||||
"butterchurn": "3.0.0-beta.5",
|
"butterchurn": "3.0.0-beta.5",
|
||||||
@ -100,12 +102,12 @@
|
|||||||
"fast-equals": "5.2.2",
|
"fast-equals": "5.2.2",
|
||||||
"fflate": "0.8.2",
|
"fflate": "0.8.2",
|
||||||
"filenamify": "6.0.0",
|
"filenamify": "6.0.0",
|
||||||
"hanja": "1.1.4",
|
"hanja": "1.1.5",
|
||||||
"happy-dom": "18.0.1",
|
"happy-dom": "18.0.1",
|
||||||
"hono": "4.8.4",
|
"hono": "4.9.6",
|
||||||
"howler": "2.2.4",
|
"howler": "2.2.4",
|
||||||
"html-to-text": "9.0.5",
|
"html-to-text": "9.0.5",
|
||||||
"i18next": "25.3.2",
|
"i18next": "25.5.2",
|
||||||
"jimp": "1.6.0",
|
"jimp": "1.6.0",
|
||||||
"keyboardevent-from-electron-accelerator": "2.0.0",
|
"keyboardevent-from-electron-accelerator": "2.0.0",
|
||||||
"keyboardevents-areequal": "0.2.2",
|
"keyboardevents-areequal": "0.2.2",
|
||||||
@ -116,65 +118,63 @@
|
|||||||
"node-html-parser": "7.0.1",
|
"node-html-parser": "7.0.1",
|
||||||
"node-id3": "0.2.9",
|
"node-id3": "0.2.9",
|
||||||
"peerjs": "1.5.5",
|
"peerjs": "1.5.5",
|
||||||
"segmentit": "2.0.3",
|
|
||||||
"semver": "7.7.2",
|
"semver": "7.7.2",
|
||||||
"serve": "14.2.4",
|
"serve": "14.2.5",
|
||||||
"simple-youtube-age-restriction-bypass": "github:organization/Simple-YouTube-Age-Restriction-Bypass#v2.5.9",
|
"simple-youtube-age-restriction-bypass": "github:organization/Simple-YouTube-Age-Restriction-Bypass#v2.5.9",
|
||||||
"socks": "2.8.6",
|
"socks": "2.8.7",
|
||||||
"solid-element": "1.9.1",
|
"solid-element": "1.9.1",
|
||||||
"solid-floating-ui": "0.3.1",
|
"solid-floating-ui": "0.3.1",
|
||||||
"solid-js": "1.9.7",
|
"solid-js": "1.9.9",
|
||||||
"solid-styled-components": "0.28.5",
|
"solid-styled-components": "0.28.5",
|
||||||
"solid-transition-group": "0.3.0",
|
"solid-transition-group": "0.3.0",
|
||||||
"tiny-pinyin": "1.3.2",
|
"tiny-pinyin": "1.3.2",
|
||||||
"tinyld": "1.3.4",
|
"tinyld": "1.3.4",
|
||||||
"ts-morph": "26.0.0",
|
"virtua": "0.42.2",
|
||||||
"virtua": "0.41.5",
|
|
||||||
"vudio": "2.1.1",
|
"vudio": "2.1.1",
|
||||||
"x11": "2.3.0",
|
"x11": "2.3.0",
|
||||||
"youtubei.js": "14.0.0",
|
"youtubei.js": "15.0.1",
|
||||||
"zod": "4.0.5"
|
"zod": "4.1.5"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@eslint/js": "9.31.0",
|
"@electron-toolkit/tsconfig": "1.0.1",
|
||||||
|
"@eslint/js": "9.35.0",
|
||||||
"@malept/flatpak-bundler": "0.4.0",
|
"@malept/flatpak-bundler": "0.4.0",
|
||||||
"@playwright/test": "1.54.1",
|
"@playwright/test": "1.55.0",
|
||||||
"@stylistic/eslint-plugin": "5.1.0",
|
"@stylistic/eslint-plugin": "5.3.1",
|
||||||
"@total-typescript/ts-reset": "0.6.1",
|
"@total-typescript/ts-reset": "0.6.1",
|
||||||
"@types/electron-localshortcut": "3.1.3",
|
"@types/electron-localshortcut": "3.1.3",
|
||||||
"@types/howler": "2.2.12",
|
"@types/howler": "2.2.12",
|
||||||
"@types/html-to-text": "9.0.4",
|
"@types/html-to-text": "9.0.4",
|
||||||
"@types/semver": "7.7.0",
|
"@types/semver": "7.7.1",
|
||||||
"@types/trusted-types": "2.0.7",
|
"@types/trusted-types": "2.0.7",
|
||||||
"bufferutil": "4.0.9",
|
"bufferutil": "4.0.9",
|
||||||
"builtin-modules": "5.0.0",
|
"builtin-modules": "5.0.0",
|
||||||
"cross-env": "7.0.3",
|
"cross-env": "10.0.0",
|
||||||
"del-cli": "6.0.0",
|
"del-cli": "6.0.0",
|
||||||
"discord-api-types": "0.38.15",
|
"discord-api-types": "0.38.23",
|
||||||
"electron": "38.0.0-alpha.5",
|
"electron": "38.0.0",
|
||||||
"electron-builder": "26.0.12",
|
"electron-builder": "26.0.12",
|
||||||
"electron-builder-squirrel-windows": "26.0.12",
|
"electron-builder-squirrel-windows": "26.0.12",
|
||||||
"electron-devtools-installer": "4.0.0",
|
"electron-devtools-installer": "4.0.0",
|
||||||
"electron-vite": "4.0.0",
|
"electron-vite": "4.0.0",
|
||||||
"esbuild": "0.25.6",
|
"eslint": "9.35.0",
|
||||||
"eslint": "9.31.0",
|
"eslint-config-prettier": "10.1.8",
|
||||||
"eslint-config-prettier": "10.1.5",
|
|
||||||
"eslint-import-resolver-exports": "1.0.0-beta.5",
|
"eslint-import-resolver-exports": "1.0.0-beta.5",
|
||||||
"eslint-import-resolver-typescript": "4.4.4",
|
"eslint-import-resolver-typescript": "4.4.4",
|
||||||
"eslint-plugin-import": "2.32.0",
|
"eslint-plugin-import": "2.32.0",
|
||||||
"eslint-plugin-prettier": "5.5.1",
|
"eslint-plugin-prettier": "5.5.4",
|
||||||
"eslint-plugin-solid": "0.14.5",
|
"eslint-plugin-solid": "0.14.5",
|
||||||
"glob": "11.0.3",
|
"glob": "11.0.3",
|
||||||
"node-gyp": "11.2.0",
|
"node-gyp": "11.4.2",
|
||||||
"playwright": "1.54.1",
|
"playwright": "1.55.0",
|
||||||
"rollup": "4.45.0",
|
"ts-morph": "26.0.0",
|
||||||
"typescript": "5.8.3",
|
"typescript": "5.9.2",
|
||||||
"typescript-eslint": "8.36.0",
|
"typescript-eslint": "8.42.0",
|
||||||
"utf-8-validate": "6.0.5",
|
"utf-8-validate": "6.0.5",
|
||||||
"vite": "npm:rolldown-vite@7.0.8",
|
"vite": "npm:rolldown-vite@7.1.5",
|
||||||
"vite-plugin-inspect": "11.3.0",
|
"vite-plugin-inspect": "11.3.3",
|
||||||
"vite-plugin-resolve": "2.5.2",
|
"vite-plugin-resolve": "2.5.2",
|
||||||
"vite-plugin-solid": "2.11.7",
|
"vite-plugin-solid": "2.11.8",
|
||||||
"ws": "8.18.3"
|
"ws": "8.18.3"
|
||||||
},
|
},
|
||||||
"auto-changelog": {
|
"auto-changelog": {
|
||||||
|
|||||||
27
patches/electron-is@3.0.0.patch
Normal file
27
patches/electron-is@3.0.0.patch
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
diff --git a/is.d.ts b/is.d.ts
|
||||||
|
index fb861f7b401914f0f89cb4edf25c51df5cb05812..82144733cd34d88e2deb2e4713b104418e673f2e 100644
|
||||||
|
--- a/is.d.ts
|
||||||
|
+++ b/is.d.ts
|
||||||
|
@@ -5,6 +5,7 @@ declare namespace is {
|
||||||
|
export function macOS(): boolean;
|
||||||
|
export function windows(): boolean;
|
||||||
|
export function linux(): boolean;
|
||||||
|
+ export function freebsd(): boolean;
|
||||||
|
export function x86(): boolean;
|
||||||
|
export function x64(): boolean;
|
||||||
|
export function production(): boolean;
|
||||||
|
diff --git a/is.js b/is.js
|
||||||
|
index a76bb1755a2728bde185b35d847031d3b8ea4ab0..f6b03406c17342f5af078de069e5bbbd2246e152 100644
|
||||||
|
--- a/is.js
|
||||||
|
+++ b/is.js
|
||||||
|
@@ -39,6 +39,10 @@ module.exports = {
|
||||||
|
linux: function () {
|
||||||
|
return process.platform === 'linux'
|
||||||
|
},
|
||||||
|
+ // Checks if we are under FreeBSD OS
|
||||||
|
+ freebsd: function () {
|
||||||
|
+ return process.platform === "freebsd"
|
||||||
|
+ },
|
||||||
|
// Checks if we are the processor's arch is x86
|
||||||
|
x86: function () {
|
||||||
|
return process.arch === 'ia32'
|
||||||
2691
pnpm-lock.yaml
generated
2691
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@ -31,14 +31,16 @@ export interface DefaultConfig {
|
|||||||
likeButtons: string;
|
likeButtons: string;
|
||||||
proxy: string;
|
proxy: string;
|
||||||
startingPage: string;
|
startingPage: string;
|
||||||
|
backgroundMaterial?: 'none' | 'mica' | 'acrylic' | 'tabbed';
|
||||||
overrideUserAgent: boolean;
|
overrideUserAgent: boolean;
|
||||||
usePodcastParticipantAsArtist: boolean;
|
usePodcastParticipantAsArtist: boolean;
|
||||||
themes: string[];
|
themes: string[];
|
||||||
|
customWindowTitle?: string;
|
||||||
};
|
};
|
||||||
'plugins': Record<string, unknown>;
|
'plugins': Record<string, unknown>;
|
||||||
}
|
}
|
||||||
|
|
||||||
const defaultConfig: DefaultConfig = {
|
export const defaultConfig: DefaultConfig = {
|
||||||
'window-size': {
|
'window-size': {
|
||||||
width: 1100,
|
width: 1100,
|
||||||
height: 550,
|
height: 550,
|
||||||
@ -72,5 +74,3 @@ const defaultConfig: DefaultConfig = {
|
|||||||
},
|
},
|
||||||
'plugins': {},
|
'plugins': {},
|
||||||
};
|
};
|
||||||
|
|
||||||
export default defaultConfig;
|
|
||||||
|
|||||||
@ -1,30 +1,36 @@
|
|||||||
import { deepmergeCustom } from 'deepmerge-ts';
|
import { deepmergeCustom } from 'deepmerge-ts';
|
||||||
|
|
||||||
import defaultConfig from './defaults';
|
import { store, type IStore } from './store';
|
||||||
|
|
||||||
import store, { IStore } from './store';
|
|
||||||
import plugins from './plugins';
|
|
||||||
|
|
||||||
import { restart } from '@/providers/app-controls';
|
import { restart } from '@/providers/app-controls';
|
||||||
|
|
||||||
|
import type { defaultConfig } from './defaults';
|
||||||
|
|
||||||
const deepmerge = deepmergeCustom({
|
const deepmerge = deepmergeCustom({
|
||||||
mergeArrays: false,
|
mergeArrays: false,
|
||||||
});
|
});
|
||||||
|
|
||||||
const set = (key: string, value: unknown) => {
|
export { defaultConfig } from './defaults';
|
||||||
|
export * as plugins from './plugins';
|
||||||
|
|
||||||
|
export const set = (key: string, value: unknown) => {
|
||||||
store.set(key, value);
|
store.set(key, value);
|
||||||
};
|
};
|
||||||
const setPartial = (key: string, value: object, defaultValue?: object) => {
|
|
||||||
|
export const setPartial = (
|
||||||
|
key: string,
|
||||||
|
value: object,
|
||||||
|
defaultValue?: object,
|
||||||
|
) => {
|
||||||
const newValue = deepmerge(defaultValue ?? {}, store.get(key) ?? {}, value);
|
const newValue = deepmerge(defaultValue ?? {}, store.get(key) ?? {}, value);
|
||||||
store.set(key, newValue);
|
store.set(key, newValue);
|
||||||
};
|
};
|
||||||
|
|
||||||
function setMenuOption(key: string, value: unknown) {
|
export const setMenuOption = (key: string, value: unknown) => {
|
||||||
set(key, value);
|
set(key, value);
|
||||||
if (store.get('options.restartOnConfigChanges')) {
|
if (store.get('options.restartOnConfigChanges')) {
|
||||||
restart();
|
restart();
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
// MAGIC OF TYPESCRIPT
|
// MAGIC OF TYPESCRIPT
|
||||||
|
|
||||||
@ -74,18 +80,11 @@ type PathValue<T, K extends string> =
|
|||||||
? PathValue<T[A], B>
|
? PathValue<T[A], B>
|
||||||
: T;
|
: T;
|
||||||
|
|
||||||
const get = <Key extends Paths<typeof defaultConfig>>(key: Key) =>
|
export const get = <Key extends Paths<typeof defaultConfig>>(key: Key) =>
|
||||||
store.get(key) as PathValue<typeof defaultConfig, typeof key>;
|
store.get(key) as PathValue<typeof defaultConfig, typeof key>;
|
||||||
|
|
||||||
export default {
|
export const edit = () => store.openInEditor();
|
||||||
defaultConfig,
|
|
||||||
get,
|
export const watch = (cb: Parameters<IStore['onDidAnyChange']>[0]) => {
|
||||||
set,
|
store.onDidAnyChange(cb);
|
||||||
setPartial,
|
|
||||||
setMenuOption,
|
|
||||||
edit: () => store.openInEditor(),
|
|
||||||
watch(cb: Parameters<IStore['onDidAnyChange']>[0]) {
|
|
||||||
store.onDidAnyChange(cb);
|
|
||||||
},
|
|
||||||
plugins,
|
|
||||||
};
|
};
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import { deepmerge } from 'deepmerge-ts';
|
import { deepmerge } from 'deepmerge-ts';
|
||||||
import { allPlugins } from 'virtual:plugins';
|
import { allPlugins } from 'virtual:plugins';
|
||||||
|
|
||||||
import store from './store';
|
import { store } from './store';
|
||||||
|
|
||||||
import { restart } from '@/providers/app-controls';
|
import { restart } from '@/providers/app-controls';
|
||||||
|
|
||||||
@ -68,13 +68,3 @@ export function enable(plugin: string) {
|
|||||||
export function disable(plugin: string) {
|
export function disable(plugin: string) {
|
||||||
setMenuOptions(plugin, { enabled: false }, []);
|
setMenuOptions(plugin, { enabled: false }, []);
|
||||||
}
|
}
|
||||||
|
|
||||||
export default {
|
|
||||||
isEnabled,
|
|
||||||
getPlugins,
|
|
||||||
enable,
|
|
||||||
disable,
|
|
||||||
setOptions,
|
|
||||||
setMenuOptions,
|
|
||||||
getOptions,
|
|
||||||
};
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import Store from 'electron-store';
|
import Store from 'electron-store';
|
||||||
|
|
||||||
import defaults from './defaults';
|
import { defaultConfig as defaults } from './defaults';
|
||||||
|
|
||||||
import { DefaultPresetList, type Preset } from '@/plugins/downloader/types';
|
import { DefaultPresetList, type Preset } from '@/plugins/downloader/types';
|
||||||
|
|
||||||
@ -257,7 +257,7 @@ const migrations = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
export default new Store({
|
export const store = new Store({
|
||||||
defaults: {
|
defaults: {
|
||||||
...defaults,
|
...defaults,
|
||||||
// README: 'plugin' uses deepmerge to populate the default values, so it is not necessary to include it here
|
// README: 'plugin' uses deepmerge to populate the default values, so it is not necessary to include it here
|
||||||
|
|||||||
2
src/custom-electron-prompt.d.ts
vendored
2
src/custom-electron-prompt.d.ts
vendored
@ -1,5 +1,5 @@
|
|||||||
declare module 'custom-electron-prompt' {
|
declare module 'custom-electron-prompt' {
|
||||||
import { BrowserWindow } from 'electron';
|
import { type BrowserWindow } from 'electron';
|
||||||
|
|
||||||
export type SelectOptions = Record<string, string>;
|
export type SelectOptions = Record<string, string>;
|
||||||
|
|
||||||
|
|||||||
@ -1,7 +1,126 @@
|
|||||||
{
|
{
|
||||||
|
"common": {
|
||||||
|
"console": {
|
||||||
|
"plugins": {
|
||||||
|
"execute-failed": "Plagini icra etmək mümkün olmadı {{pluginName}}::{{contextName}}",
|
||||||
|
"executed-at-ms": "Plagin {{pluginName}}::{{contextName}} {{ms}} millisaniyədə icra edildi",
|
||||||
|
"initialize-failed": "\"{{pluginName}}\" plaginini başlatmaq mümkün olmadı",
|
||||||
|
"load-all": "Bütün plaginlər yüklənir",
|
||||||
|
"load-failed": "\"{{pluginName}}\" plaginini yükləmək mümkün olmadı",
|
||||||
|
"loaded": "\"{{pluginName}}\" plagini yükləndi",
|
||||||
|
"unload-failed": "\"{{pluginName}}\" plaqinini yükləmək mümkün olmadı",
|
||||||
|
"unloaded": "\"{{pluginName}}\" plaqini yükləmədən çıxarıldı"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"language": {
|
"language": {
|
||||||
"code": "az",
|
"code": "az",
|
||||||
"local-name": "Azərbaycan dili",
|
"local-name": "Azərbaycan dili",
|
||||||
"name": "Azerbaijani"
|
"name": "Azerbaijani"
|
||||||
|
},
|
||||||
|
"main": {
|
||||||
|
"console": {
|
||||||
|
"did-finish-load": {
|
||||||
|
"dev-tools": "Yükləmə tamamlandı. DevTools açıldı"
|
||||||
|
},
|
||||||
|
"i18n": {
|
||||||
|
"loaded": "i18n yükləndi"
|
||||||
|
},
|
||||||
|
"second-instance": {
|
||||||
|
"receive-command": "Protokol üzərindən əmr alındı: \"{{command}}\""
|
||||||
|
},
|
||||||
|
"theme": {
|
||||||
|
"css-file-not-found": "CSS faylı \"{{cssFile}}\" mövcud deyil, nəzərə alınmır"
|
||||||
|
},
|
||||||
|
"unresponsive": {
|
||||||
|
"details": "Cavabsız Səhv!\n{{error}}"
|
||||||
|
},
|
||||||
|
"when-ready": {
|
||||||
|
"clearing-cache-after-20s": "Proqram keşi təmizlənir"
|
||||||
|
},
|
||||||
|
"window": {
|
||||||
|
"tried-to-render-offscreen": "Pəncərə ekran kənarında göstərilməyə çalışıldı, PəncərəÖlçüsü={{windowSize}}, EkranÖlçüsü={{displaySize}}, Vəziyyət={{position}}"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"dialog": {
|
||||||
|
"hide-menu-enabled": {
|
||||||
|
"detail": "Menu gizlədildi, yenidən göstərmək üçün 'Alt' istifadə edin (Proqramiçi menu üçün 'Esc')",
|
||||||
|
"message": "Gizlət menusu aktivləşdirildi",
|
||||||
|
"title": "Gizlət menusu aktivləşdirildi"
|
||||||
|
},
|
||||||
|
"need-to-restart": {
|
||||||
|
"buttons": {
|
||||||
|
"later": "Sonra",
|
||||||
|
"restart-now": "Yenidən başlat"
|
||||||
|
},
|
||||||
|
"detail": "\"{{pluginName}}\" plaginin işləməsi üçün proqramı yenidən başladın",
|
||||||
|
"message": "\"{{pluginName}}\" üçün proqram yenidən başlamalıdır",
|
||||||
|
"title": "Yenidən başlatmaq tələb edilir"
|
||||||
|
},
|
||||||
|
"unresponsive": {
|
||||||
|
"buttons": {
|
||||||
|
"quit": "Tərk et",
|
||||||
|
"relaunch": "Yenidən işə sal",
|
||||||
|
"wait": "Gözləyin"
|
||||||
|
},
|
||||||
|
"detail": "Narahatçılıq üçün üzr istəyirik! Nə etməli olduğumuzu seçin:",
|
||||||
|
"message": "Proqram cavab vermir",
|
||||||
|
"title": "Pəncərə Cavab vermir"
|
||||||
|
},
|
||||||
|
"update-available": {
|
||||||
|
"buttons": {
|
||||||
|
"disable": "Yeniləmələri deaktiv et",
|
||||||
|
"download": "Yüklə",
|
||||||
|
"ok": "Oldu"
|
||||||
|
},
|
||||||
|
"detail": "Yeni versiya mövcuddur və bu linkdən yüklənə bilər {{downloadLink}}",
|
||||||
|
"message": "Yeni versiya mövcuddur",
|
||||||
|
"title": "Yeniləmə mövcuddur"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"menu": {
|
||||||
|
"about": "Haqqında",
|
||||||
|
"navigation": {
|
||||||
|
"label": "İstiqamət",
|
||||||
|
"submenu": {
|
||||||
|
"copy-current-url": "Hazırkı linki kopyala",
|
||||||
|
"go-back": "Geri qayıt",
|
||||||
|
"go-forward": "İrəli get",
|
||||||
|
"quit": "Çıx",
|
||||||
|
"restart": "Proqramı Yenidən Başlat"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"options": {
|
||||||
|
"label": "Seçimlər",
|
||||||
|
"submenu": {
|
||||||
|
"advanced-options": {
|
||||||
|
"label": "Əlavə seçimlər",
|
||||||
|
"submenu": {
|
||||||
|
"auto-reset-app-cache": "Proqram başlayanda keşi təmizlə",
|
||||||
|
"disable-hardware-acceleration": "Aparat təminatı sürətlənməsini deaktiv et",
|
||||||
|
"edit-config-json": "Config.json dəyiş",
|
||||||
|
"override-user-agent": "User-Agent dəyişdirildi",
|
||||||
|
"restart-on-config-changes": "Konfiqurasiya dəyişikliklərində yenidən başladılır",
|
||||||
|
"set-proxy": {
|
||||||
|
"label": "Proxy təyin et",
|
||||||
|
"prompt": {
|
||||||
|
"label": "Proxy Ünvanını daxil edin: (deaktiv etmək üçün boş buraxın)",
|
||||||
|
"placeholder": "Nümunə: SOCKS5://127.0.0.1:9999",
|
||||||
|
"title": "Proxy təyin et"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"toggle-dev-tools": "DevTools-u açıb bağla"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"always-on-top": "Həmişə üst tərəfdə",
|
||||||
|
"auto-update": "Avtomatik Yeniləmə",
|
||||||
|
"hide-menu": {
|
||||||
|
"dialog": {
|
||||||
|
"message": "Menu will be hidden on next launch, use [Alt] to show it (or backtick [`] if using in-app-menu)"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -150,6 +150,13 @@
|
|||||||
"visual-tweaks": {
|
"visual-tweaks": {
|
||||||
"label": "দৃষ্টিনন্দন পরিবর্তন",
|
"label": "দৃষ্টিনন্দন পরিবর্তন",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
|
"custom-window-title": {
|
||||||
|
"label": "কাস্টম উইন্ডো টাইটেল",
|
||||||
|
"prompt": {
|
||||||
|
"label": "নিজস্ব উইন্ডোর টাইটেল দিন (বন্ধ করতে ফাঁকা রাখুন)",
|
||||||
|
"placeholder": "উদাহরণস্বরূপ: YouTube Music"
|
||||||
|
}
|
||||||
|
},
|
||||||
"like-buttons": {
|
"like-buttons": {
|
||||||
"default": "ডিফল্ট লাইক বাটন",
|
"default": "ডিফল্ট লাইক বাটন",
|
||||||
"force-show": "সবসময় লাইক বাটন দেখান",
|
"force-show": "সবসময় লাইক বাটন দেখান",
|
||||||
@ -381,6 +388,11 @@
|
|||||||
},
|
},
|
||||||
"templates": {
|
"templates": {
|
||||||
"title": "ক্যাপশন নির্বাচক খুলুন"
|
"title": "ক্যাপশন নির্বাচক খুলুন"
|
||||||
|
},
|
||||||
|
"toast": {
|
||||||
|
"caption-changed": "ক্যাপশন {{language}} ভাষায় পরিবর্তিত হয়েছে",
|
||||||
|
"caption-disabled": "ক্যাপশন বন্ধ করা হয়েছে",
|
||||||
|
"no-captions": "এই গানটির জন্য কোনো ক্যাপশন উপলব্ধ নেই"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"compact-sidebar": {
|
"compact-sidebar": {
|
||||||
@ -600,7 +612,15 @@
|
|||||||
},
|
},
|
||||||
"navigation": {
|
"navigation": {
|
||||||
"description": "পরবর্তী/পূর্ববর্তী নেভিগেশন তীরগুলি আপনার প্রিয় ব্রাউজারের মতো সরাসরি ইন্টারফেসে অন্তর্ভুক্ত করা হয়েছে",
|
"description": "পরবর্তী/পূর্ববর্তী নেভিগেশন তীরগুলি আপনার প্রিয় ব্রাউজারের মতো সরাসরি ইন্টারফেসে অন্তর্ভুক্ত করা হয়েছে",
|
||||||
"name": "নেভিগেশন"
|
"name": "নেভিগেশন",
|
||||||
|
"templates": {
|
||||||
|
"back": {
|
||||||
|
"title": "আগের পাতায় যান"
|
||||||
|
},
|
||||||
|
"forward": {
|
||||||
|
"title": "পরের পাতায় যান"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"no-google-login": {
|
"no-google-login": {
|
||||||
"description": "ইন্টারফেস থেকে Google লগইন বাটন এবং লিঙ্কগুলি সরান",
|
"description": "ইন্টারফেস থেকে Google লগইন বাটন এবং লিঙ্কগুলি সরান",
|
||||||
@ -692,7 +712,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"description": "ভিডিও ওভারলেতে একটি বাটনের মাধ্যমে ভিডিও কোয়ালিটি পরিবর্তন করতে দেয়",
|
"description": "ভিডিও ওভারলেতে একটি বাটনের মাধ্যমে ভিডিও কোয়ালিটি পরিবর্তন করতে দেয়",
|
||||||
"name": "ভিডিও কোয়ালিটি পরিবর্তক"
|
"name": "ভিডিও কোয়ালিটি পরিবর্তক",
|
||||||
|
"renderer": {
|
||||||
|
"quality-settings-button": {
|
||||||
|
"label": "প্লেয়ারের মান পরিবর্তনের অপশন খুলুন"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"scrobbler": {
|
"scrobbler": {
|
||||||
"description": "স্ক্রবলিং সমর্থন যোগ করুন (যেমন last.fm, Listenbrainz)",
|
"description": "স্ক্রবলিং সমর্থন যোগ করুন (যেমন last.fm, Listenbrainz)",
|
||||||
@ -857,7 +882,11 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"name": "ভিডিও টগল"
|
"name": "ভিডিও টগল",
|
||||||
|
"templates": {
|
||||||
|
"button-song": "গান",
|
||||||
|
"button-video": "ভিডিও"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"visualizer": {
|
"visualizer": {
|
||||||
"description": "প্লেয়ারে একটি ভিজ্যুয়ালাইজার যোগ করে",
|
"description": "প্লেয়ারে একটি ভিজ্যুয়ালাইজার যোগ করে",
|
||||||
|
|||||||
@ -123,10 +123,79 @@
|
|||||||
},
|
},
|
||||||
"language": {
|
"language": {
|
||||||
"dialog": {
|
"dialog": {
|
||||||
"message": "Jezik će se promijeniti nakon ponovnog pokretanja"
|
"message": "Jezik će se promijeniti nakon ponovnog pokretanja",
|
||||||
|
"title": "Jezik je uspješno promjenjen"
|
||||||
|
},
|
||||||
|
"label": "Jezik",
|
||||||
|
"submenu": {
|
||||||
|
"to-help-translate": "Želite da pomognete s prijevodom? Kliknite ovdje"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"resume-on-start": "Nastavi posljednju pjesmu pri sljedećem pokretaju",
|
||||||
|
"single-instance-lock": "Sprječavanje višestrukog pokretanja",
|
||||||
|
"start-at-login": "Pokreni čim se prijavite",
|
||||||
|
"starting-page": {
|
||||||
|
"label": "Početna stranica",
|
||||||
|
"unset": "Ukinite postavu"
|
||||||
|
},
|
||||||
|
"tray": {
|
||||||
|
"label": "Tacna",
|
||||||
|
"submenu": {
|
||||||
|
"disabled": "Onemogućeno",
|
||||||
|
"enabled-and-hide-app": "Tacna je uključena, i prozor aplikacije skrijte",
|
||||||
|
"enabled-and-show-app": "Tacna je uključena, i prozor aplikacije prikažite",
|
||||||
|
"play-pause-on-click": "Pokreni/Zaustavi na klik"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"visual-tweaks": {
|
||||||
|
"label": "Vizualne postavke",
|
||||||
|
"submenu": {
|
||||||
|
"custom-window-title": {
|
||||||
|
"label": "Prilagođeni naslov prozora",
|
||||||
|
"prompt": {
|
||||||
|
"label": "Unesite vlastiti naslov prozora: (ostavite prazno za isključenje)",
|
||||||
|
"placeholder": "Primjer: YouTube Music"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"like-buttons": {
|
||||||
|
"default": "Zadano",
|
||||||
|
"force-show": "Prinudno prikaži",
|
||||||
|
"hide": "Sakrij",
|
||||||
|
"label": "'Sviđa mi se' dugmadi"
|
||||||
|
},
|
||||||
|
"remove-upgrade-button": "Ukloni dugme za nadogradnju",
|
||||||
|
"theme": {
|
||||||
|
"dialog": {
|
||||||
|
"button": {
|
||||||
|
"cancel": "Otkaži",
|
||||||
|
"remove": "Ukloni"
|
||||||
|
},
|
||||||
|
"remove-theme": "Jeste li sigurni da želite ukloniti prilagođenu temu?",
|
||||||
|
"remove-theme-message": "Ovo će ukloniti prilagođenu temu"
|
||||||
|
},
|
||||||
|
"label": "Tema",
|
||||||
|
"submenu": {
|
||||||
|
"import-css-file": "Uvoz prilagođene CSS datoteke",
|
||||||
|
"no-theme": "Bez teme"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"plugins": {
|
||||||
|
"enabled": "Omogući",
|
||||||
|
"label": "Dodaci",
|
||||||
|
"new": "Novo"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"plugins": {
|
||||||
|
"ambient-mode": {
|
||||||
|
"menu": {
|
||||||
|
"quality": {
|
||||||
|
"label": "Kvalitet"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -150,6 +150,13 @@
|
|||||||
"visual-tweaks": {
|
"visual-tweaks": {
|
||||||
"label": "Opcions visuals",
|
"label": "Opcions visuals",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
|
"custom-window-title": {
|
||||||
|
"label": "Títol personalitzat de la finestra",
|
||||||
|
"prompt": {
|
||||||
|
"label": "Introdueix un títol personalitzat per a la finestra (deixa-ho buit per deshabilitar-ho)",
|
||||||
|
"placeholder": "Exemple: YouTube Music"
|
||||||
|
}
|
||||||
|
},
|
||||||
"like-buttons": {
|
"like-buttons": {
|
||||||
"default": "Per defecte",
|
"default": "Per defecte",
|
||||||
"force-show": "Força que es mostri",
|
"force-show": "Força que es mostri",
|
||||||
@ -381,6 +388,11 @@
|
|||||||
},
|
},
|
||||||
"templates": {
|
"templates": {
|
||||||
"title": "Obra el selector de subtítols"
|
"title": "Obra el selector de subtítols"
|
||||||
|
},
|
||||||
|
"toast": {
|
||||||
|
"caption-changed": "Subtítols canviats a {{language}}",
|
||||||
|
"caption-disabled": "Subtítols desactivats",
|
||||||
|
"no-captions": "Subtítols no disponibles per aquesta cançó"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"compact-sidebar": {
|
"compact-sidebar": {
|
||||||
@ -600,7 +612,15 @@
|
|||||||
},
|
},
|
||||||
"navigation": {
|
"navigation": {
|
||||||
"description": "Fletxes de navegació Següent / Enrere integrades directament a la interfície, com al teu navegador preferit",
|
"description": "Fletxes de navegació Següent / Enrere integrades directament a la interfície, com al teu navegador preferit",
|
||||||
"name": "Navegació"
|
"name": "Navegació",
|
||||||
|
"templates": {
|
||||||
|
"back": {
|
||||||
|
"title": "Tornar a la pàgina anterior"
|
||||||
|
},
|
||||||
|
"forward": {
|
||||||
|
"title": "Anar a la pàgina següent"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"no-google-login": {
|
"no-google-login": {
|
||||||
"description": "Elimina els botons d'inici de sessió de Google de la interfície",
|
"description": "Elimina els botons d'inici de sessió de Google de la interfície",
|
||||||
@ -692,7 +712,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"description": "Permet canviar la qualitat del vídeo amb un botó que s'hi mostra a sobre",
|
"description": "Permet canviar la qualitat del vídeo amb un botó que s'hi mostra a sobre",
|
||||||
"name": "Botó de qualitat del vídeo"
|
"name": "Botó de qualitat del vídeo",
|
||||||
|
"renderer": {
|
||||||
|
"quality-settings-button": {
|
||||||
|
"label": "Obre les opcions de qualitat del reproductor"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"scrobbler": {
|
"scrobbler": {
|
||||||
"description": "Afegeix suport per scrobbling (Last.fm, ListenBrainz, etc.)",
|
"description": "Afegeix suport per scrobbling (Last.fm, ListenBrainz, etc.)",
|
||||||
@ -859,7 +884,8 @@
|
|||||||
},
|
},
|
||||||
"name": "Botó de vídeo",
|
"name": "Botó de vídeo",
|
||||||
"templates": {
|
"templates": {
|
||||||
"button-song": "Cançó"
|
"button-song": "Cançó",
|
||||||
|
"button-video": "Vídeo"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"visualizer": {
|
"visualizer": {
|
||||||
|
|||||||
@ -150,6 +150,13 @@
|
|||||||
"visual-tweaks": {
|
"visual-tweaks": {
|
||||||
"label": "Vzhledové vylepšení",
|
"label": "Vzhledové vylepšení",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
|
"custom-window-title": {
|
||||||
|
"label": "Vlastní název okna",
|
||||||
|
"prompt": {
|
||||||
|
"label": "Zadejte vlastní název okna: (zanechejte prázdné pro zakázání)",
|
||||||
|
"placeholder": "Příklad: Hudba YouTube"
|
||||||
|
}
|
||||||
|
},
|
||||||
"like-buttons": {
|
"like-buttons": {
|
||||||
"default": "Výchozí",
|
"default": "Výchozí",
|
||||||
"force-show": "Vynutit zobrazení",
|
"force-show": "Vynutit zobrazení",
|
||||||
@ -202,7 +209,7 @@
|
|||||||
"show": "Zobrazit okno",
|
"show": "Zobrazit okno",
|
||||||
"tooltip": {
|
"tooltip": {
|
||||||
"default": "Youtube Music",
|
"default": "Youtube Music",
|
||||||
"with-song-info": "Youtube Music {{Umělec}} - {{Titul}}"
|
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -220,7 +227,7 @@
|
|||||||
},
|
},
|
||||||
"album-actions": {
|
"album-actions": {
|
||||||
"description": "Přidává Undislike, Dislike, Like, a Unlike tlačítka k aplikování tohoto ke všem písničkám v seznamu písniček nebo albumu",
|
"description": "Přidává Undislike, Dislike, Like, a Unlike tlačítka k aplikování tohoto ke všem písničkám v seznamu písniček nebo albumu",
|
||||||
"name": "Možnosti Albumu"
|
"name": "Možnosti Alba"
|
||||||
},
|
},
|
||||||
"album-color-theme": {
|
"album-color-theme": {
|
||||||
"description": "Používá dynamický motiv a vizuální efekty na základě palety barev alba",
|
"description": "Používá dynamický motiv a vizuální efekty na základě palety barev alba",
|
||||||
@ -228,7 +235,7 @@
|
|||||||
"color-mix-ratio": {
|
"color-mix-ratio": {
|
||||||
"label": "Poměr míchání barev",
|
"label": "Poměr míchání barev",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"percent": "{{poměr}}%"
|
"percent": "{{ratio}}%"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -280,7 +287,10 @@
|
|||||||
"name": "Ambientní režim"
|
"name": "Ambientní režim"
|
||||||
},
|
},
|
||||||
"amuse": {
|
"amuse": {
|
||||||
"description": "Přídá YouTube Music podporu pro Amuse právě těď hraje widget od 6k Labs"
|
"description": "Přídá YouTube Music podporu pro Amuse ‚právě hraje‘ widget od 6K Labs",
|
||||||
|
"response": {
|
||||||
|
"query": "Server Amuse API běží. Pošli požadavek typu GET na /query, aby ses dozvěděl info o písničce."
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"api-server": {
|
"api-server": {
|
||||||
"description": "Vlož API server abys mohl ovládat přehrávač",
|
"description": "Vlož API server abys mohl ovládat přehrávač",
|
||||||
@ -302,7 +312,7 @@
|
|||||||
"label": "Ověřit při prvním dotazu"
|
"label": "Ověřit při prvním dotazu"
|
||||||
},
|
},
|
||||||
"none": {
|
"none": {
|
||||||
"label": "Žádná autorizace"
|
"label": "Bez ověření"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -329,6 +339,29 @@
|
|||||||
"description": "Apply compression k audiu (snižuje hlasitost nejhlasitěších částí signálu and zvyšuje hlasitost nejjemnějších částí)",
|
"description": "Apply compression k audiu (snižuje hlasitost nejhlasitěších částí signálu and zvyšuje hlasitost nejjemnějších částí)",
|
||||||
"name": "Audio kompresor"
|
"name": "Audio kompresor"
|
||||||
},
|
},
|
||||||
|
"auth-proxy-adapter": {
|
||||||
|
"description": "Podpora pro použití ověřovacích proxy služeb",
|
||||||
|
"menu": {
|
||||||
|
"disable": "Vypnout Proxy Adaptér",
|
||||||
|
"enable": "Zapnout Proxy Adaptér",
|
||||||
|
"hostname": {
|
||||||
|
"label": "Hostname"
|
||||||
|
},
|
||||||
|
"port": {
|
||||||
|
"label": "Port"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"prompt": {
|
||||||
|
"hostname": {
|
||||||
|
"label": "Zadejte hostname lokálního proxy serveru (vyžaduje restart):",
|
||||||
|
"title": "Proxy Hostname"
|
||||||
|
},
|
||||||
|
"port": {
|
||||||
|
"label": "Zadejte port lokálního proxy serveru (vyžaduje restart):",
|
||||||
|
"title": "Proxy Port"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"blur-nav-bar": {
|
"blur-nav-bar": {
|
||||||
"description": "Udělá navigační panel průhledný a rozmazaný",
|
"description": "Udělá navigační panel průhledný a rozmazaný",
|
||||||
"name": "Rozmazaný navigační panel"
|
"name": "Rozmazaný navigační panel"
|
||||||
@ -353,6 +386,11 @@
|
|||||||
},
|
},
|
||||||
"templates": {
|
"templates": {
|
||||||
"title": "Otevřít titulový selector"
|
"title": "Otevřít titulový selector"
|
||||||
|
},
|
||||||
|
"toast": {
|
||||||
|
"caption-changed": "Titulky změněny na {{language}}",
|
||||||
|
"caption-disabled": "Titulky vypnuty",
|
||||||
|
"no-captions": "K této skladbě nejsou titulky dostupné"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"compact-sidebar": {
|
"compact-sidebar": {
|
||||||
@ -469,7 +507,7 @@
|
|||||||
},
|
},
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"advanced": "Pokoročile",
|
"advanced": "Pokoročile",
|
||||||
"enabled": "Zapnuto",
|
"enabled": "Povoleno",
|
||||||
"mode": "Časový režim",
|
"mode": "Časový režim",
|
||||||
"percent": "Procent",
|
"percent": "Procent",
|
||||||
"seconds": "Sekundy"
|
"seconds": "Sekundy"
|
||||||
@ -487,6 +525,18 @@
|
|||||||
"button": "Stáhnout"
|
"button": "Stáhnout"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"equalizer": {
|
||||||
|
"description": "Přidá do přehrávače ekvalizér",
|
||||||
|
"menu": {
|
||||||
|
"presets": {
|
||||||
|
"label": "Předvolby",
|
||||||
|
"list": {
|
||||||
|
"bass-booster": "Zesílení basů"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "Ekvalizér"
|
||||||
|
},
|
||||||
"exponential-volume": {
|
"exponential-volume": {
|
||||||
"description": "Dělá posuvník hlasitosti exponenciální, takže je snazší vybrat nižší hlasitost.",
|
"description": "Dělá posuvník hlasitosti exponenciální, takže je snazší vybrat nižší hlasitost.",
|
||||||
"name": "Exponenciální hlasitost"
|
"name": "Exponenciální hlasitost"
|
||||||
@ -513,7 +563,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"music-together": {
|
"music-together": {
|
||||||
"description": "Sdílejte playlist s ostatními. Když hostitel přehrává písničku, uslyší jí i všichni ostatní.",
|
"description": "Sdílejte playlist s ostatními. Když hostitel přehrává skladbu, uslyší jí i všichni ostatní",
|
||||||
"dialog": {
|
"dialog": {
|
||||||
"enter-host": "Zadejte Host ID"
|
"enter-host": "Zadejte Host ID"
|
||||||
},
|
},
|
||||||
@ -560,7 +610,15 @@
|
|||||||
},
|
},
|
||||||
"navigation": {
|
"navigation": {
|
||||||
"description": "Další/Zpátky navigační šipky přímo integrovány do rozhraní, jako ve vašem oblíbeném prohlížeči",
|
"description": "Další/Zpátky navigační šipky přímo integrovány do rozhraní, jako ve vašem oblíbeném prohlížeči",
|
||||||
"name": "Navigace"
|
"name": "Navigace",
|
||||||
|
"templates": {
|
||||||
|
"back": {
|
||||||
|
"title": "Přejít na předchozí stránku"
|
||||||
|
},
|
||||||
|
"forward": {
|
||||||
|
"title": "Přejít na další stránku"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"no-google-login": {
|
"no-google-login": {
|
||||||
"description": "Odstranit tlačítka Google přihlášení a odkazy z rozhraní",
|
"description": "Odstranit tlačítka Google přihlášení a odkazy z rozhraní",
|
||||||
@ -584,6 +642,9 @@
|
|||||||
},
|
},
|
||||||
"name": "Oznámení"
|
"name": "Oznámení"
|
||||||
},
|
},
|
||||||
|
"performance-improvement": {
|
||||||
|
"description": "Zlepšit výkon povolením experimentálních skriptů"
|
||||||
|
},
|
||||||
"picture-in-picture": {
|
"picture-in-picture": {
|
||||||
"description": "Povoluje switch aplikaci do režimu obrázek v obrázku",
|
"description": "Povoluje switch aplikaci do režimu obrázek v obrázku",
|
||||||
"menu": {
|
"menu": {
|
||||||
@ -648,7 +709,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"description": "Umožňuje měnit kvalitu videa pomocí tlačítka na video overlay",
|
"description": "Umožňuje měnit kvalitu videa pomocí tlačítka na video overlay",
|
||||||
"name": "Měnič kvality videa"
|
"name": "Měnič kvality videa",
|
||||||
|
"renderer": {
|
||||||
|
"quality-settings-button": {
|
||||||
|
"label": "Otevřít volbu kvality přehrávače"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"scrobbler": {
|
"scrobbler": {
|
||||||
"description": "Přidat scrobbing podporu (např .last.fm , Listenbrainz)",
|
"description": "Přidat scrobbing podporu (např .last.fm , Listenbrainz)",
|
||||||
@ -667,6 +733,7 @@
|
|||||||
"listenbrainz": {
|
"listenbrainz": {
|
||||||
"token": "Vložte Listenbrainz user token"
|
"token": "Vložte Listenbrainz user token"
|
||||||
},
|
},
|
||||||
|
"scrobble-alternative-title": "Používat alternativní názvy",
|
||||||
"scrobble-other-media": "Scrobble jiné média"
|
"scrobble-other-media": "Scrobble jiné média"
|
||||||
},
|
},
|
||||||
"name": "Scrobbler",
|
"name": "Scrobbler",
|
||||||
@ -717,8 +784,8 @@
|
|||||||
"synced-lyrics": {
|
"synced-lyrics": {
|
||||||
"description": "Poskytuje synchronizaci textů do písní, pomocí poskytovatelů, jako je LRClib.",
|
"description": "Poskytuje synchronizaci textů do písní, pomocí poskytovatelů, jako je LRClib.",
|
||||||
"errors": {
|
"errors": {
|
||||||
"fetch": "Při hledání textu došlo k chybě. Prosím skuste to znovu později.",
|
"fetch": "⚠️ Při hledání textu došlo k chybě.\n \tProsím zkuste to znovu později.",
|
||||||
"not-found": "Žáden text nebyl pro túto skladbu nalezen."
|
"not-found": "⚠️ Pro tuto skladbu nebyl nalezen žádný text."
|
||||||
},
|
},
|
||||||
"menu": {
|
"menu": {
|
||||||
"default-text-string": {
|
"default-text-string": {
|
||||||
@ -726,8 +793,36 @@
|
|||||||
"tooltip": "Vyberte výchozí znak pro mezeru mezi texty"
|
"tooltip": "Vyberte výchozí znak pro mezeru mezi texty"
|
||||||
},
|
},
|
||||||
"line-effect": {
|
"line-effect": {
|
||||||
"label": "Efekt řádku"
|
"label": "Efekt řádku",
|
||||||
|
"submenu": {
|
||||||
|
"offset": {
|
||||||
|
"label": "Posun"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"precise-timing": {
|
||||||
|
"tooltip": "Vypočítat zobrazení dalšího řádku na milisekundu (může mít menší dopad na výkon)"
|
||||||
|
},
|
||||||
|
"romanization": {
|
||||||
|
"label": "Romanizovat texty",
|
||||||
|
"tooltip": "Pokud je text v jiném jazyce, zkusit zobrazit verzi v latince."
|
||||||
|
},
|
||||||
|
"show-lyrics-even-if-inexact": {
|
||||||
|
"label": "Zobrazit i nepřesné texty"
|
||||||
|
},
|
||||||
|
"show-time-codes": {
|
||||||
|
"label": "Zobrazit časové kódy",
|
||||||
|
"tooltip": "Zobrazit časové kódy vedle textu"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"name": "Synchronizované texty",
|
||||||
|
"refetch-btn": {
|
||||||
|
"fetching": "Získávání..."
|
||||||
|
},
|
||||||
|
"warnings": {
|
||||||
|
"duration-mismatch": "⚠️ - Text nemusí být synchronizován kvůli neshodě v délce trvání.",
|
||||||
|
"inexact": "⚠️ - Text pro tuto skladbu nemusí být přesný",
|
||||||
|
"instrumental": "⚠️ - Tato skladba je instrumentální"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"taskbar-mediacontrol": {
|
"taskbar-mediacontrol": {
|
||||||
@ -765,7 +860,8 @@
|
|||||||
},
|
},
|
||||||
"name": "Přepínač videa",
|
"name": "Přepínač videa",
|
||||||
"templates": {
|
"templates": {
|
||||||
"button-song": "Písnička"
|
"button-song": "Skladba",
|
||||||
|
"button-video": "Video"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"visualizer": {
|
"visualizer": {
|
||||||
|
|||||||
@ -150,6 +150,13 @@
|
|||||||
"visual-tweaks": {
|
"visual-tweaks": {
|
||||||
"label": "Visuelle Optimierungen",
|
"label": "Visuelle Optimierungen",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
|
"custom-window-title": {
|
||||||
|
"label": "Benutzerdefinierter Fenstertitel",
|
||||||
|
"prompt": {
|
||||||
|
"label": "Benutzerdefinierten Fenstertitel eingeben: (zum Deaktivieren leer lassen)",
|
||||||
|
"placeholder": "Beispiel: YouTube Music"
|
||||||
|
}
|
||||||
|
},
|
||||||
"like-buttons": {
|
"like-buttons": {
|
||||||
"default": "Standard",
|
"default": "Standard",
|
||||||
"force-show": "Zeigen erzwungen",
|
"force-show": "Zeigen erzwungen",
|
||||||
@ -345,7 +352,7 @@
|
|||||||
"label": "Port"
|
"label": "Port"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"name": "Auth Proxy Adapter",
|
"name": "Authentifizierungs-Proxyadapter",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
"hostname": {
|
"hostname": {
|
||||||
"label": "Hostnamen eingeben für lokalen Proxy-Server (Neustart erforderlich):",
|
"label": "Hostnamen eingeben für lokalen Proxy-Server (Neustart erforderlich):",
|
||||||
@ -846,6 +853,26 @@
|
|||||||
"description": "Fügt ein TouchBar-Widget für macOS-Benutzer hinzu",
|
"description": "Fügt ein TouchBar-Widget für macOS-Benutzer hinzu",
|
||||||
"name": "TouchBar"
|
"name": "TouchBar"
|
||||||
},
|
},
|
||||||
|
"transparent-player": {
|
||||||
|
"description": "Macht das Player-Fenster transparent",
|
||||||
|
"name": "Transparent Player",
|
||||||
|
"menu": {
|
||||||
|
"opacity": {
|
||||||
|
"label": "Hintergrund-Sichtbarkeit",
|
||||||
|
"submenu": {
|
||||||
|
"percent": "{{opacity}}%"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"label": "Typ",
|
||||||
|
"submenu": {
|
||||||
|
"acrylic": "Acrylic",
|
||||||
|
"mica": "Mica",
|
||||||
|
"tabbed": "Tabbed"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"tuna-obs": {
|
"tuna-obs": {
|
||||||
"description": "Integration mit dem OBS-Plugin Tuna",
|
"description": "Integration mit dem OBS-Plugin Tuna",
|
||||||
"name": "Tuna OBS"
|
"name": "Tuna OBS"
|
||||||
|
|||||||
@ -73,7 +73,7 @@
|
|||||||
"download": "Λήψη",
|
"download": "Λήψη",
|
||||||
"ok": "OK"
|
"ok": "OK"
|
||||||
},
|
},
|
||||||
"detail": "Μια νέα έκδοση είναι διαθέσιμη και μπορεί να ληφθεί από τον σύνδεσμο {{downloadLink}}",
|
"detail": "Μια νέα έκδοση είναι διαθέσιμη και μπορεί να ληφθεί από το {{downloadLink}}",
|
||||||
"message": "Μια νέα έκδοση είναι διαθέσιμη",
|
"message": "Μια νέα έκδοση είναι διαθέσιμη",
|
||||||
"title": "Διατίθεται ενημέρωση"
|
"title": "Διατίθεται ενημέρωση"
|
||||||
}
|
}
|
||||||
@ -132,14 +132,14 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resume-on-start": "Συνέχιση τελευταίου τραγουδιού όταν η εφαρμογή ξεκινά",
|
"resume-on-start": "Συνέχιση τελευταίου τραγουδιού όταν η εφαρμογή ξεκινά",
|
||||||
"single-instance-lock": "Κλείδωμα Μοναδικής Εκδοχής",
|
"single-instance-lock": "Κλείδωμα μοναδικής εκδοχής",
|
||||||
"start-at-login": "Έναρξη κατά την σύνδεση",
|
"start-at-login": "Έναρξη κατά τη σύνδεση",
|
||||||
"starting-page": {
|
"starting-page": {
|
||||||
"label": "Σελίδα έναρξης",
|
"label": "Αρχική σελίδα",
|
||||||
"unset": "Κατάργηση ορισμού"
|
"unset": "Κατάργηση ορισμού"
|
||||||
},
|
},
|
||||||
"tray": {
|
"tray": {
|
||||||
"label": "Δίσκος",
|
"label": "Περιοχή συστήματος",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"disabled": "Απενεργοποιημένο",
|
"disabled": "Απενεργοποιημένο",
|
||||||
"enabled-and-hide-app": "Ενεργοποιημένο και απόκρυψη της εφαρμογής",
|
"enabled-and-hide-app": "Ενεργοποιημένο και απόκρυψη της εφαρμογής",
|
||||||
@ -148,8 +148,15 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"visual-tweaks": {
|
"visual-tweaks": {
|
||||||
"label": "Τροποποιήσεις εμφάνισης",
|
"label": "Οπτικές προσαρμογές",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
|
"custom-window-title": {
|
||||||
|
"label": "Προσαρμοσμένος τίτλος παραθύρου",
|
||||||
|
"prompt": {
|
||||||
|
"label": "Εισαγωγή προσαρμοσμένου τίτλου παραθύρου: (κενό για απενεργοποίηση)",
|
||||||
|
"placeholder": "Παράδειγμα: YouTube Music"
|
||||||
|
}
|
||||||
|
},
|
||||||
"like-buttons": {
|
"like-buttons": {
|
||||||
"default": "Προεπιλογή",
|
"default": "Προεπιλογή",
|
||||||
"force-show": "Επιβολή εμφάνισης",
|
"force-show": "Επιβολή εμφάνισης",
|
||||||
@ -169,7 +176,7 @@
|
|||||||
"label": "Θέμα",
|
"label": "Θέμα",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"import-css-file": "Εισαγωγή προσαρμοσμένου αρχείου CSS",
|
"import-css-file": "Εισαγωγή προσαρμοσμένου αρχείου CSS",
|
||||||
"no-theme": "Κανένα θέμα"
|
"no-theme": "Χωρίς θέμα"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -208,11 +215,11 @@
|
|||||||
},
|
},
|
||||||
"plugins": {
|
"plugins": {
|
||||||
"ad-speedup": {
|
"ad-speedup": {
|
||||||
"description": "Εάν παίξει διαφήμιση κάνει σίγαση του ήχου και θέτει την ταχύτητα αναπαραγωγής στο 16x",
|
"description": "Εάν ξεκινήσει διαφήμιση, ο ήχος απενεργοποιείται και η ταχύτητα αναπαραγωγής ορίζεται σε 16x",
|
||||||
"name": "Γρήγορη προώθηση διαφημίσεων"
|
"name": "Επιτάχυνση διαφημίσεων"
|
||||||
},
|
},
|
||||||
"adblocker": {
|
"adblocker": {
|
||||||
"description": "Αποκλεισμός όλων των διαφημίσεων και tracker",
|
"description": "Αποκλεισμός όλων των διαφημίσεων και της παρακολούθησης από προεπιλογή",
|
||||||
"menu": {
|
"menu": {
|
||||||
"blocker": "Πρόγραμμα αποκλεισμού"
|
"blocker": "Πρόγραμμα αποκλεισμού"
|
||||||
},
|
},
|
||||||
@ -223,28 +230,28 @@
|
|||||||
"name": "Ενέργειες σε Άλμπουμ"
|
"name": "Ενέργειες σε Άλμπουμ"
|
||||||
},
|
},
|
||||||
"album-color-theme": {
|
"album-color-theme": {
|
||||||
"description": "Εφαρμόζει ένα δυναμικό θέμα και οπτικά εφέ με βάση τη χρωματική παλέτα του άλμπουμ",
|
"description": "Εφαρμόζει ένα δυναμικό θέμα και οπτικά εφέ βάσει της παλέτας χρωμάτων του άλμπουμ",
|
||||||
"menu": {
|
"menu": {
|
||||||
"color-mix-ratio": {
|
"color-mix-ratio": {
|
||||||
"label": "Αναλογία μίξης χρωμάτων",
|
"label": "Αναλογία ανάμειξης χρωμάτων",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"percent": "{{ratio}}%"
|
"percent": "{{ratio}}%"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"name": "Θέμα χρώματος άλμπουμ"
|
"name": "Θέμα χρωμάτων άλμπουμ"
|
||||||
},
|
},
|
||||||
"ambient-mode": {
|
"ambient-mode": {
|
||||||
"description": "Εφαρμόζει ένα εφέ φωτισμού ρίχνοντας απαλά χρώματα από το βίντεο στο φόντο της οθόνης σας",
|
"description": "Εφαρμόζει ένα εφέ φωτισμού ρίχνοντας απαλά χρώματα από το βίντεο στο φόντο της οθόνης σας",
|
||||||
"menu": {
|
"menu": {
|
||||||
"blur-amount": {
|
"blur-amount": {
|
||||||
"label": "Ένταση θαμπώματος",
|
"label": "Ποσότητα θολώματος",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"pixels": "{{blurAmount}} pixels"
|
"pixels": "{{blurAmount}} pixels"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"buffer": {
|
"buffer": {
|
||||||
"label": "Buffer",
|
"label": "Ενδιάμεση μνήμη",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"buffer": "{{buffer}}"
|
"buffer": "{{buffer}}"
|
||||||
}
|
}
|
||||||
@ -270,18 +277,18 @@
|
|||||||
"smoothness-transition": {
|
"smoothness-transition": {
|
||||||
"label": "Ομαλή μετάβαση",
|
"label": "Ομαλή μετάβαση",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"during": "Σε {{interpolationTime}} δευτερόλεπτα"
|
"during": "Για {{interpolationTime}} δευτερόλεπτα"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"use-fullscreen": {
|
"use-fullscreen": {
|
||||||
"label": "Χρήση πλήρους οθόνης"
|
"label": "Σε πλήρη οθόνη"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"name": "Λειτουργία περιβάλλοντος"
|
"name": "Λειτουργία περιβάλλοντος"
|
||||||
},
|
},
|
||||||
"amuse": {
|
"amuse": {
|
||||||
"description": "Προσθέτει υποστήριξη μουσικής YouTube για το widget Amuse now playing από την 6K Labs",
|
"description": "Προσθέτει υποστήριξη YouTube Music στο widget Amuse now playing από την 6K Labs",
|
||||||
"name": "Διασκέδαση",
|
"name": "Amuse",
|
||||||
"response": {
|
"response": {
|
||||||
"query": "Ο διακομιστής Amuse API εκτελείται. GET /query για να λάβετε πληροφορίες για το τραγούδι."
|
"query": "Ο διακομιστής Amuse API εκτελείται. GET /query για να λάβετε πληροφορίες για το τραγούδι."
|
||||||
}
|
}
|
||||||
@ -381,6 +388,11 @@
|
|||||||
},
|
},
|
||||||
"templates": {
|
"templates": {
|
||||||
"title": "Ανοίξτε τον επιλογέα λεζάντας"
|
"title": "Ανοίξτε τον επιλογέα λεζάντας"
|
||||||
|
},
|
||||||
|
"toast": {
|
||||||
|
"caption-changed": "Λεζάντα άλλαξε σε {{language}}",
|
||||||
|
"caption-disabled": "Λεζάντες απενεργοποιήθηκαν",
|
||||||
|
"no-captions": "Λεζάντες μη διαθέσιμες για αυτό το τραγούδι"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"compact-sidebar": {
|
"compact-sidebar": {
|
||||||
@ -600,7 +612,15 @@
|
|||||||
},
|
},
|
||||||
"navigation": {
|
"navigation": {
|
||||||
"description": "Βέλη πλοήγησης Επόμενο/Πίσω ενσωματωμένα απευθείας στο περιβάλλον εργασίας, όπως στο αγαπημένο σας πρόγραμμα περιήγησης",
|
"description": "Βέλη πλοήγησης Επόμενο/Πίσω ενσωματωμένα απευθείας στο περιβάλλον εργασίας, όπως στο αγαπημένο σας πρόγραμμα περιήγησης",
|
||||||
"name": "Πλοήγηση"
|
"name": "Πλοήγηση",
|
||||||
|
"templates": {
|
||||||
|
"back": {
|
||||||
|
"title": "Μετάβαση στην προηγούμενη σελίδα"
|
||||||
|
},
|
||||||
|
"forward": {
|
||||||
|
"title": "Μετάβαση στην επόμενη σελίδα"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"no-google-login": {
|
"no-google-login": {
|
||||||
"description": "Αφαίρεση των κουμπιών και των συνδέσμων σύνδεσης Google από το περιβάλλον εργασίας",
|
"description": "Αφαίρεση των κουμπιών και των συνδέσμων σύνδεσης Google από το περιβάλλον εργασίας",
|
||||||
@ -692,7 +712,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"description": "Επιτρέπει την αλλαγή της ποιότητας βίντεο με ένα κουμπί στην επικάλυψη βίντεο",
|
"description": "Επιτρέπει την αλλαγή της ποιότητας βίντεο με ένα κουμπί στην επικάλυψη βίντεο",
|
||||||
"name": "Αλλαγή ποιότητας βίντεο"
|
"name": "Αλλαγή ποιότητας βίντεο",
|
||||||
|
"renderer": {
|
||||||
|
"quality-settings-button": {
|
||||||
|
"label": "Άνοιγμα ρυθμίσεων ποιότητας αναπαραγωγέα"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"scrobbler": {
|
"scrobbler": {
|
||||||
"description": "Προσθήκη υποστήριξης scrobbling (κ.λπ. last.fm, Listenbrainz)",
|
"description": "Προσθήκη υποστήριξης scrobbling (κ.λπ. last.fm, Listenbrainz)",
|
||||||
@ -859,7 +884,8 @@
|
|||||||
},
|
},
|
||||||
"name": "Εναλλαγή βίντεο",
|
"name": "Εναλλαγή βίντεο",
|
||||||
"templates": {
|
"templates": {
|
||||||
"button-song": "Τραγούδι"
|
"button-song": "Τραγούδι",
|
||||||
|
"button-video": "Βίντεο"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"visualizer": {
|
"visualizer": {
|
||||||
|
|||||||
@ -156,6 +156,13 @@
|
|||||||
"hide": "Hide",
|
"hide": "Hide",
|
||||||
"label": "Like buttons"
|
"label": "Like buttons"
|
||||||
},
|
},
|
||||||
|
"custom-window-title": {
|
||||||
|
"label": "Custom window title",
|
||||||
|
"prompt": {
|
||||||
|
"label": "Enter custom window title: (leave empty to disable)",
|
||||||
|
"placeholder": "Example: YouTube Music"
|
||||||
|
}
|
||||||
|
},
|
||||||
"remove-upgrade-button": "Remove upgrade button",
|
"remove-upgrade-button": "Remove upgrade button",
|
||||||
"theme": {
|
"theme": {
|
||||||
"dialog": {
|
"dialog": {
|
||||||
@ -334,7 +341,6 @@
|
|||||||
"name": "Audio Compressor"
|
"name": "Audio Compressor"
|
||||||
},
|
},
|
||||||
"auth-proxy-adapter": {
|
"auth-proxy-adapter": {
|
||||||
"name": "Auth Proxy Adapter",
|
|
||||||
"description": "Support for the use of authentication proxy services",
|
"description": "Support for the use of authentication proxy services",
|
||||||
"menu": {
|
"menu": {
|
||||||
"disable": "Disable Proxy Adapter",
|
"disable": "Disable Proxy Adapter",
|
||||||
@ -346,14 +352,15 @@
|
|||||||
"label": "Port"
|
"label": "Port"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"name": "Auth Proxy Adapter",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
"hostname": {
|
"hostname": {
|
||||||
"title": "Proxy Hostname",
|
"title": "Proxy Hostname",
|
||||||
"label": "Enter hostname for local proxy server (requires restart):"
|
"label": "Enter hostname for local proxy server (requires restart):"
|
||||||
},
|
},
|
||||||
"port": {
|
"port": {
|
||||||
"title": "Proxy Port",
|
"title": "Proxy Port",
|
||||||
"label": "Enter port for local proxy server (requires restart):"
|
"label": "Enter port for local proxy server (requires restart):"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -414,6 +421,19 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"custom-output-device": {
|
||||||
|
"description": "Configure a custom output media device for songs",
|
||||||
|
"menu": {
|
||||||
|
"device-selector": "Select Device"
|
||||||
|
},
|
||||||
|
"name": "Custom Output Device",
|
||||||
|
"prompt": {
|
||||||
|
"device-selector": {
|
||||||
|
"label": "Choose the output media device to be used",
|
||||||
|
"title": "Select Output Device"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"disable-autoplay": {
|
"disable-autoplay": {
|
||||||
"description": "Makes song start in \"paused\" mode",
|
"description": "Makes song start in \"paused\" mode",
|
||||||
"menu": {
|
"menu": {
|
||||||
@ -437,7 +457,15 @@
|
|||||||
"hide-duration-left": "Hide duration left",
|
"hide-duration-left": "Hide duration left",
|
||||||
"hide-github-button": "Hide GitHub link Button",
|
"hide-github-button": "Hide GitHub link Button",
|
||||||
"play-on-youtube-music": "Play on YouTube Music",
|
"play-on-youtube-music": "Play on YouTube Music",
|
||||||
"set-inactivity-timeout": "Set inactivity timeout"
|
"set-inactivity-timeout": "Set inactivity timeout",
|
||||||
|
"set-status-display-type": {
|
||||||
|
"label": "Status text",
|
||||||
|
"submenu": {
|
||||||
|
"youtube-music": "Listening to YouTube Music",
|
||||||
|
"artist": "Listening to {artist}",
|
||||||
|
"title": "Listening to {song title}"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"name": "Discord Rich Presence",
|
"name": "Discord Rich Presence",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
@ -704,13 +732,13 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"description": "Allows changing the video quality with a button on the video overlay",
|
||||||
|
"name": "Video Quality Changer",
|
||||||
"renderer": {
|
"renderer": {
|
||||||
"quality-settings-button": {
|
"quality-settings-button": {
|
||||||
"label": "Open player quality changer"
|
"label": "Open player quality changer"
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
"description": "Allows changing the video quality with a button on the video overlay",
|
|
||||||
"name": "Video Quality Changer"
|
|
||||||
},
|
},
|
||||||
"scrobbler": {
|
"scrobbler": {
|
||||||
"description": "Add scrobbling support (etc. last.fm, Listenbrainz)",
|
"description": "Add scrobbling support (etc. last.fm, Listenbrainz)",
|
||||||
@ -730,6 +758,7 @@
|
|||||||
"token": "Enter ListenBrainz user token"
|
"token": "Enter ListenBrainz user token"
|
||||||
},
|
},
|
||||||
"scrobble-alternative-title": "Use alternative titles",
|
"scrobble-alternative-title": "Use alternative titles",
|
||||||
|
"scrobble-alternative-artist": "Use alternative artists",
|
||||||
"scrobble-other-media": "Scrobble other media"
|
"scrobble-other-media": "Scrobble other media"
|
||||||
},
|
},
|
||||||
"name": "Scrobbler",
|
"name": "Scrobbler",
|
||||||
@ -784,6 +813,14 @@
|
|||||||
"not-found": "⚠️ No lyrics found for this song."
|
"not-found": "⚠️ No lyrics found for this song."
|
||||||
},
|
},
|
||||||
"menu": {
|
"menu": {
|
||||||
|
"preferred-provider": {
|
||||||
|
"label": "Preferred Provider",
|
||||||
|
"tooltip": "Choose the default provider to use",
|
||||||
|
"none": {
|
||||||
|
"label": "None",
|
||||||
|
"tooltip": "No preferred provider"
|
||||||
|
}
|
||||||
|
},
|
||||||
"default-text-string": {
|
"default-text-string": {
|
||||||
"label": "Default character between lyrics",
|
"label": "Default character between lyrics",
|
||||||
"tooltip": "Choose the default character to use for the gap between lyrics"
|
"tooltip": "Choose the default character to use for the gap between lyrics"
|
||||||
@ -846,6 +883,27 @@
|
|||||||
"description": "Adds a TouchBar widget for macOS users",
|
"description": "Adds a TouchBar widget for macOS users",
|
||||||
"name": "TouchBar"
|
"name": "TouchBar"
|
||||||
},
|
},
|
||||||
|
"transparent-player": {
|
||||||
|
"description": "Makes the app window transparent",
|
||||||
|
"name": "Transparent Player",
|
||||||
|
"menu": {
|
||||||
|
"opacity": {
|
||||||
|
"label": "Opacity",
|
||||||
|
"submenu": {
|
||||||
|
"percent": "{{opacity}}%"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"label": "Type",
|
||||||
|
"submenu": {
|
||||||
|
"acrylic": "Acrylic",
|
||||||
|
"mica": "Mica",
|
||||||
|
"tabbed": "Tabbed",
|
||||||
|
"none": "None"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"tuna-obs": {
|
"tuna-obs": {
|
||||||
"description": "Integration with OBS's plugin Tuna",
|
"description": "Integration with OBS's plugin Tuna",
|
||||||
"name": "Tuna OBS"
|
"name": "Tuna OBS"
|
||||||
|
|||||||
@ -45,8 +45,8 @@
|
|||||||
"dialog": {
|
"dialog": {
|
||||||
"hide-menu-enabled": {
|
"hide-menu-enabled": {
|
||||||
"detail": "El menú está oculto, utiliza \"Alt\" para mostrarlo (o \"Escape\" si utilizas el menú integrado en la aplicación)",
|
"detail": "El menú está oculto, utiliza \"Alt\" para mostrarlo (o \"Escape\" si utilizas el menú integrado en la aplicación)",
|
||||||
"message": "Menú Oculto está habilitado",
|
"message": "El \"Menú Oculto\" está habilitado",
|
||||||
"title": "Menú oculto habilitado"
|
"title": "\"Menú oculto\" habilitado"
|
||||||
},
|
},
|
||||||
"need-to-restart": {
|
"need-to-restart": {
|
||||||
"buttons": {
|
"buttons": {
|
||||||
@ -150,6 +150,13 @@
|
|||||||
"visual-tweaks": {
|
"visual-tweaks": {
|
||||||
"label": "Ajustes visuales",
|
"label": "Ajustes visuales",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
|
"custom-window-title": {
|
||||||
|
"label": "Título de ventana personalizado",
|
||||||
|
"prompt": {
|
||||||
|
"label": "Ingresa un título de ventana personalizado: (déjalo vacío para desactivar)",
|
||||||
|
"placeholder": "Ejemplo: YouTube Music"
|
||||||
|
}
|
||||||
|
},
|
||||||
"like-buttons": {
|
"like-buttons": {
|
||||||
"default": "Predeterminado",
|
"default": "Predeterminado",
|
||||||
"force-show": "Forzar la visualización",
|
"force-show": "Forzar la visualización",
|
||||||
@ -381,6 +388,11 @@
|
|||||||
},
|
},
|
||||||
"templates": {
|
"templates": {
|
||||||
"title": "Abrir el selector de subtítulos"
|
"title": "Abrir el selector de subtítulos"
|
||||||
|
},
|
||||||
|
"toast": {
|
||||||
|
"caption-changed": "Subtítulos cambiados a {{language}}",
|
||||||
|
"caption-disabled": "Subtítulos desactivados",
|
||||||
|
"no-captions": "Sin subtítulos para ésta canción"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"compact-sidebar": {
|
"compact-sidebar": {
|
||||||
@ -409,6 +421,19 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"custom-output-device": {
|
||||||
|
"description": "Configura un dispositivo de salida de audio personalizado para las canciones",
|
||||||
|
"menu": {
|
||||||
|
"device-selector": "Seleccionar un dispositivo"
|
||||||
|
},
|
||||||
|
"name": "Dispositivo de audio personalizado",
|
||||||
|
"prompt": {
|
||||||
|
"device-selector": {
|
||||||
|
"label": "Escoge el dispositivo de salida de audio que se va a usar",
|
||||||
|
"title": "Seleccionar un dispositivo de audio"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"disable-autoplay": {
|
"disable-autoplay": {
|
||||||
"description": "Hace que la canción comience en modo \"pausado\"",
|
"description": "Hace que la canción comience en modo \"pausado\"",
|
||||||
"menu": {
|
"menu": {
|
||||||
@ -600,7 +625,15 @@
|
|||||||
},
|
},
|
||||||
"navigation": {
|
"navigation": {
|
||||||
"description": "Flechas de navegación Siguiente/Atrás directamente integradas en la interfaz, como en tu navegador favorito",
|
"description": "Flechas de navegación Siguiente/Atrás directamente integradas en la interfaz, como en tu navegador favorito",
|
||||||
"name": "Navegación"
|
"name": "Navegación",
|
||||||
|
"templates": {
|
||||||
|
"back": {
|
||||||
|
"title": "Volver a la página anterior"
|
||||||
|
},
|
||||||
|
"forward": {
|
||||||
|
"title": "Ir a la siguiente página"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"no-google-login": {
|
"no-google-login": {
|
||||||
"description": "Eliminar los botones y enlaces de inicio de sesión de Google de la interfaz",
|
"description": "Eliminar los botones y enlaces de inicio de sesión de Google de la interfaz",
|
||||||
@ -692,7 +725,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"description": "Permite cambiar la calidad del vídeo con un botón sobre puesto en el vídeo",
|
"description": "Permite cambiar la calidad del vídeo con un botón sobre puesto en el vídeo",
|
||||||
"name": "Ajustador de calidad de vídeo"
|
"name": "Ajustador de calidad de vídeo",
|
||||||
|
"renderer": {
|
||||||
|
"quality-settings-button": {
|
||||||
|
"label": "Abrir selector de calidad del reproductor"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"scrobbler": {
|
"scrobbler": {
|
||||||
"description": "Añadir soporte para scrobbling (last.fm, Listenbrainz, etc.)",
|
"description": "Añadir soporte para scrobbling (last.fm, Listenbrainz, etc.)",
|
||||||
@ -712,7 +750,7 @@
|
|||||||
"token": "Introduzca el token de usuario de ListenBrainz"
|
"token": "Introduzca el token de usuario de ListenBrainz"
|
||||||
},
|
},
|
||||||
"scrobble-alternative-title": "Usar títulos alternativos",
|
"scrobble-alternative-title": "Usar títulos alternativos",
|
||||||
"scrobble-other-media": "Scrobble en otros medios"
|
"scrobble-other-media": "Hacer Scrobble sobre otros medios"
|
||||||
},
|
},
|
||||||
"name": "Scrobbler",
|
"name": "Scrobbler",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
@ -762,8 +800,8 @@
|
|||||||
"synced-lyrics": {
|
"synced-lyrics": {
|
||||||
"description": "Proporciona letras de canciones sincronizadas, utilizando proveedores como LRClib.",
|
"description": "Proporciona letras de canciones sincronizadas, utilizando proveedores como LRClib.",
|
||||||
"errors": {
|
"errors": {
|
||||||
"fetch": "⚠️\tHa ocurrido un error al obtener la letra.\n\tPor favor, inténtalo de nuevo más tarde.",
|
"fetch": "⚠️\tSe produjo un error al obtener la letra.\n\tPor favor, inténtelo de nuevo más tarde.",
|
||||||
"not-found": "⚠️ No se ha encontrado ninguna letra para esta canción."
|
"not-found": "⚠️ No se han encontrado letras para esta canción."
|
||||||
},
|
},
|
||||||
"menu": {
|
"menu": {
|
||||||
"default-text-string": {
|
"default-text-string": {
|
||||||
@ -817,7 +855,7 @@
|
|||||||
"warnings": {
|
"warnings": {
|
||||||
"duration-mismatch": "⚠️ - La letra puede estar desincronizada debido a un desajuste en la duración.",
|
"duration-mismatch": "⚠️ - La letra puede estar desincronizada debido a un desajuste en la duración.",
|
||||||
"inexact": "⚠️ - La letra de esta canción puede no ser exacta",
|
"inexact": "⚠️ - La letra de esta canción puede no ser exacta",
|
||||||
"instrumental": "⚠️ - Se trata de una canción instrumental"
|
"instrumental": "⚠️ - Esta es una canción instrumental"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"taskbar-mediacontrol": {
|
"taskbar-mediacontrol": {
|
||||||
@ -859,7 +897,8 @@
|
|||||||
},
|
},
|
||||||
"name": "Alternador de vídeo",
|
"name": "Alternador de vídeo",
|
||||||
"templates": {
|
"templates": {
|
||||||
"button-song": "Canción"
|
"button-song": "Canción",
|
||||||
|
"button-video": "Vídeo"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"visualizer": {
|
"visualizer": {
|
||||||
|
|||||||
@ -150,6 +150,13 @@
|
|||||||
"visual-tweaks": {
|
"visual-tweaks": {
|
||||||
"label": "Visuaalisia tehosteita",
|
"label": "Visuaalisia tehosteita",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
|
"custom-window-title": {
|
||||||
|
"label": "Mukautettu ikkunan otsikko",
|
||||||
|
"prompt": {
|
||||||
|
"label": "Syötä mukautettu ikkunan otsikko: (jätä tyhjäksi poistaaksesi päältä)",
|
||||||
|
"placeholder": "Esimerkki: YouTube Music"
|
||||||
|
}
|
||||||
|
},
|
||||||
"like-buttons": {
|
"like-buttons": {
|
||||||
"default": "Vakio",
|
"default": "Vakio",
|
||||||
"force-show": "Pakota näyttämään",
|
"force-show": "Pakota näyttämään",
|
||||||
@ -280,7 +287,11 @@
|
|||||||
"name": "Tunnelmallinen Tila"
|
"name": "Tunnelmallinen Tila"
|
||||||
},
|
},
|
||||||
"amuse": {
|
"amuse": {
|
||||||
"description": "Lisää YouTube Music tuen Amusen nyt soitetaan -widgetille, kehittäjänä 6K Labs"
|
"description": "Lisää YouTube Music tuen Amusen nyt soitetaan -widgetille, kehittäjänä 6K Labs",
|
||||||
|
"name": "Amuse",
|
||||||
|
"response": {
|
||||||
|
"query": "Amuse API-palvelin on päällä. Käytä GET /query-rajapintaa saadaksesi kappaleen tiedot."
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"api-server": {
|
"api-server": {
|
||||||
"description": "Lisää API-palvelimen hallitsemaan soitinta",
|
"description": "Lisää API-palvelimen hallitsemaan soitinta",
|
||||||
@ -296,19 +307,31 @@
|
|||||||
},
|
},
|
||||||
"menu": {
|
"menu": {
|
||||||
"auth-strategy": {
|
"auth-strategy": {
|
||||||
|
"label": "Valtuutus-strategia",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
|
"auth-at-first": {
|
||||||
|
"label": "Valtuuta ensimmäisellä kyselyllä"
|
||||||
|
},
|
||||||
"none": {
|
"none": {
|
||||||
"label": "Ei valtuuksia"
|
"label": "Ei valtuuksia"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"hostname": {
|
||||||
|
"label": "Isäntänimi"
|
||||||
|
},
|
||||||
"port": {
|
"port": {
|
||||||
"label": "Portti"
|
"label": "Portti"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"name": "API Serveri [Beta]",
|
"name": "API Serveri [Beta]",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
|
"hostname": {
|
||||||
|
"label": "Syötä isäntänimi (esimerkiksi 0.0.0.0) API-palvelimelle:",
|
||||||
|
"title": "Isäntänimi"
|
||||||
|
},
|
||||||
"port": {
|
"port": {
|
||||||
|
"label": "Syötä API-palvelimen portti:",
|
||||||
"title": "Portti"
|
"title": "Portti"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -317,6 +340,30 @@
|
|||||||
"description": "Lisää äänen kompressointia (hiljentää voimakkaimpien äänien voimakkuutta ja tehostaa pehmeämpien äänien voimakkuutta)",
|
"description": "Lisää äänen kompressointia (hiljentää voimakkaimpien äänien voimakkuutta ja tehostaa pehmeämpien äänien voimakkuutta)",
|
||||||
"name": "Äänen Kompressoija"
|
"name": "Äänen Kompressoija"
|
||||||
},
|
},
|
||||||
|
"auth-proxy-adapter": {
|
||||||
|
"description": "Tukee todennusvälipalvelinten käyttöä",
|
||||||
|
"menu": {
|
||||||
|
"disable": "Poista välipalvelimen adapteri pois käytöstä",
|
||||||
|
"enable": "Aseta välipalvelimen adapteri käyttöön",
|
||||||
|
"hostname": {
|
||||||
|
"label": "Isäntänimi"
|
||||||
|
},
|
||||||
|
"port": {
|
||||||
|
"label": "Portti"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "Todennusvälipalvelinadapteri",
|
||||||
|
"prompt": {
|
||||||
|
"hostname": {
|
||||||
|
"label": "Syötä paikallisen välipalvelimen isäntänimi (vaatii uudelleenkäynnistyksen):",
|
||||||
|
"title": "Välipalvelimen isäntänimi"
|
||||||
|
},
|
||||||
|
"port": {
|
||||||
|
"label": "Syötä paikallisen välipalvelimen portti (vaatii uudelleenkäynnistyksen):",
|
||||||
|
"title": "Välipalvelimen portti"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"blur-nav-bar": {
|
"blur-nav-bar": {
|
||||||
"description": "Tekee siirtymäpalkista läpikuultavan ja sumean",
|
"description": "Tekee siirtymäpalkista läpikuultavan ja sumean",
|
||||||
"name": "Sumenna Siirtymäpalkki"
|
"name": "Sumenna Siirtymäpalkki"
|
||||||
@ -341,6 +388,11 @@
|
|||||||
},
|
},
|
||||||
"templates": {
|
"templates": {
|
||||||
"title": "Avaa tekstitysten valitsin"
|
"title": "Avaa tekstitysten valitsin"
|
||||||
|
},
|
||||||
|
"toast": {
|
||||||
|
"caption-changed": "Tekstitys vaihdettu kieleksi {{language}}",
|
||||||
|
"caption-disabled": "Tekstitykset pois päältä",
|
||||||
|
"no-captions": "Tekstityksiä ei ole saatavilla tälle kappaleelle"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"compact-sidebar": {
|
"compact-sidebar": {
|
||||||
@ -371,6 +423,9 @@
|
|||||||
},
|
},
|
||||||
"disable-autoplay": {
|
"disable-autoplay": {
|
||||||
"description": "Kappaleet alkavat \"pysäytetty\" tilassa",
|
"description": "Kappaleet alkavat \"pysäytetty\" tilassa",
|
||||||
|
"menu": {
|
||||||
|
"apply-once": "Käytetään vain käynnistäessä"
|
||||||
|
},
|
||||||
"name": "Poista automaattinen toisto käytöstä"
|
"name": "Poista automaattinen toisto käytöstä"
|
||||||
},
|
},
|
||||||
"discord": {
|
"discord": {
|
||||||
@ -446,12 +501,18 @@
|
|||||||
"menu": {
|
"menu": {
|
||||||
"choose-download-folder": "Valitse latauskansio",
|
"choose-download-folder": "Valitse latauskansio",
|
||||||
"download-finish-settings": {
|
"download-finish-settings": {
|
||||||
|
"label": "Lataa toiston päätyttyä",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
"last-seconds": "Viimeiset x sekuntia"
|
"last-percent": "x prosentin jälkeen",
|
||||||
|
"last-seconds": "Viimeiset x sekuntia",
|
||||||
|
"title": "Määritä milloin ladata"
|
||||||
},
|
},
|
||||||
"submenu": {
|
"submenu": {
|
||||||
|
"advanced": "Edistynyt",
|
||||||
"enabled": "Päällä",
|
"enabled": "Päällä",
|
||||||
"percent": "Prosentti"
|
"mode": "Aikatila",
|
||||||
|
"percent": "Prosentti",
|
||||||
|
"seconds": "Sekuntia"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"download-playlist": "Lataa soittolista",
|
"download-playlist": "Lataa soittolista",
|
||||||
@ -466,6 +527,18 @@
|
|||||||
"button": "Lataa"
|
"button": "Lataa"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"equalizer": {
|
||||||
|
"description": "Lisää taajuuskorjaimen toistimeen",
|
||||||
|
"menu": {
|
||||||
|
"presets": {
|
||||||
|
"label": "Pohjat",
|
||||||
|
"list": {
|
||||||
|
"bass-booster": "Bassonlisääjä"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "Taajuuskorjain"
|
||||||
|
},
|
||||||
"exponential-volume": {
|
"exponential-volume": {
|
||||||
"description": "Tekee äänenvoimakkuuden säätimestä eksponentiaalisen, jotta matalampien äänenvoimakkuuksien valinta on helpompaa.",
|
"description": "Tekee äänenvoimakkuuden säätimestä eksponentiaalisen, jotta matalampien äänenvoimakkuuksien valinta on helpompaa.",
|
||||||
"name": "Eksponentiaalinen Äänenvoimakkuus"
|
"name": "Eksponentiaalinen Äänenvoimakkuus"
|
||||||
@ -539,7 +612,15 @@
|
|||||||
},
|
},
|
||||||
"navigation": {
|
"navigation": {
|
||||||
"description": "Eteen- ja taaksepäin vievät nuolet suoraan integroituna käyttöliittymään. Juuri niin kuin lempiselaimessasi",
|
"description": "Eteen- ja taaksepäin vievät nuolet suoraan integroituna käyttöliittymään. Juuri niin kuin lempiselaimessasi",
|
||||||
"name": "Siirtyminen"
|
"name": "Siirtyminen",
|
||||||
|
"templates": {
|
||||||
|
"back": {
|
||||||
|
"title": "Palaa edelliselle sivulle"
|
||||||
|
},
|
||||||
|
"forward": {
|
||||||
|
"title": "Siirry seuraavalle sivulle"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"no-google-login": {
|
"no-google-login": {
|
||||||
"description": "Poista Googlen kirjautumispainikkeet ja linkit käyttöliittymästä",
|
"description": "Poista Googlen kirjautumispainikkeet ja linkit käyttöliittymästä",
|
||||||
@ -558,10 +639,15 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"priority": "Ilmoitusten tärkeys",
|
"priority": "Ilmoitusten tärkeys",
|
||||||
|
"toast-style": "Ponnahdusilmoitusten tyyli",
|
||||||
"unpause-notification": "Näytä ilmoitus toistamisen yhteydessä"
|
"unpause-notification": "Näytä ilmoitus toistamisen yhteydessä"
|
||||||
},
|
},
|
||||||
"name": "Ilmoitukset"
|
"name": "Ilmoitukset"
|
||||||
},
|
},
|
||||||
|
"performance-improvement": {
|
||||||
|
"description": "Paranna suorituskykyä käyttämällä kokeellisia skriptejä",
|
||||||
|
"name": "Suorituskykyparannus [Beta]"
|
||||||
|
},
|
||||||
"picture-in-picture": {
|
"picture-in-picture": {
|
||||||
"description": "Sallii sovelluksen vaihtamisen \"kuva kuvassa\" tilaan",
|
"description": "Sallii sovelluksen vaihtamisen \"kuva kuvassa\" tilaan",
|
||||||
"menu": {
|
"menu": {
|
||||||
@ -595,6 +681,7 @@
|
|||||||
"precise-volume": {
|
"precise-volume": {
|
||||||
"description": "Säädä äänenvoimakkuutta tarkasti hiiren rullaa tai pikanäppäimiä käyttäen. Kustomoidulla käyttöliittymällä ja säädettävällä äänenvoimakkuuden porrastuksella",
|
"description": "Säädä äänenvoimakkuutta tarkasti hiiren rullaa tai pikanäppäimiä käyttäen. Kustomoidulla käyttöliittymällä ja säädettävällä äänenvoimakkuuden porrastuksella",
|
||||||
"menu": {
|
"menu": {
|
||||||
|
"arrows-shortcuts": "Paikallinen nuolinäppäinohjaus",
|
||||||
"custom-volume-steps": "Aseta mukautettu äänenvoimakkuuden porrastus",
|
"custom-volume-steps": "Aseta mukautettu äänenvoimakkuuden porrastus",
|
||||||
"global-shortcuts": "Yleiset pikanäppäimet"
|
"global-shortcuts": "Yleiset pikanäppäimet"
|
||||||
},
|
},
|
||||||
@ -605,7 +692,12 @@
|
|||||||
"decrease": "Vähennä äänenvoimakkuutta",
|
"decrease": "Vähennä äänenvoimakkuutta",
|
||||||
"increase": "Lisää äänenvoimakkuutta"
|
"increase": "Lisää äänenvoimakkuutta"
|
||||||
},
|
},
|
||||||
"label": "Valitse yleiset äänenvoimakkuuden pikanäppäimet:"
|
"label": "Valitse yleiset äänenvoimakkuuden pikanäppäimet:",
|
||||||
|
"title": "Globaalit äänenvoimakkuusnäppäimet"
|
||||||
|
},
|
||||||
|
"volume-steps": {
|
||||||
|
"label": "Valitse äänenvoimakkuuden suurennus-/pienennysaskeleet",
|
||||||
|
"title": "Äänenvoimakkuusaskeleet"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -613,18 +705,52 @@
|
|||||||
"backend": {
|
"backend": {
|
||||||
"dialog": {
|
"dialog": {
|
||||||
"quality-changer": {
|
"quality-changer": {
|
||||||
"detail": "Nykyinen laatu: {{quality}}"
|
"detail": "Nykyinen laatu: {{quality}}",
|
||||||
|
"message": "Valitse videon laatu:",
|
||||||
|
"title": "Valitse videon laatu"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"description": "Salli videon laadun muuttaminen videon päällä näkyvällä painikkeella",
|
||||||
|
"name": "Videonlaadunmuuttaja",
|
||||||
|
"renderer": {
|
||||||
|
"quality-settings-button": {
|
||||||
|
"label": "Avaa toistimen laadun muuttaja"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"scrobbler": {
|
"scrobbler": {
|
||||||
|
"description": "Lisää jakamistuki (esim. last.fm, Listenbrainz)",
|
||||||
"dialog": {
|
"dialog": {
|
||||||
"lastfm": {
|
"lastfm": {
|
||||||
"auth-failed": {
|
"auth-failed": {
|
||||||
|
"message": "Last.fm-varmennus epäonnistui\nPiilota ponnahdusikkuna kunnes käynnistät ohjelman uudelleen.",
|
||||||
"title": "Todennus epäonnistui"
|
"title": "Todennus epäonnistui"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"menu": {
|
||||||
|
"lastfm": {
|
||||||
|
"api-settings": "Last.fm API:n asetukset"
|
||||||
|
},
|
||||||
|
"listenbrainz": {
|
||||||
|
"token": "Syötä ListenBrainz-käyttötunnus (token)"
|
||||||
|
},
|
||||||
|
"scrobble-alternative-title": "Käytä vaihtoehtoisia otsikoita",
|
||||||
|
"scrobble-other-media": "Jaa muuta mediaa"
|
||||||
|
},
|
||||||
|
"name": "Jakaja",
|
||||||
|
"prompt": {
|
||||||
|
"lastfm": {
|
||||||
|
"api-key": "Last.fm:n API-avain",
|
||||||
|
"api-secret": "Last.fm:n API-salaisuus"
|
||||||
|
},
|
||||||
|
"listenbrainz": {
|
||||||
|
"token": {
|
||||||
|
"label": "Syötä ListenBrainz käyttötunnuksesi (token):",
|
||||||
|
"title": "ListenBrainz-käyttötunnus"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"shortcuts": {
|
"shortcuts": {
|
||||||
|
|||||||
@ -150,6 +150,13 @@
|
|||||||
"visual-tweaks": {
|
"visual-tweaks": {
|
||||||
"label": "Ajustements visuels",
|
"label": "Ajustements visuels",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
|
"custom-window-title": {
|
||||||
|
"label": "Titre de fenêtre personnalisé",
|
||||||
|
"prompt": {
|
||||||
|
"label": "Entrés un titre de fenêtre : (Laissé vide pour déactiver)",
|
||||||
|
"placeholder": "Exemple : YouTube Musique"
|
||||||
|
}
|
||||||
|
},
|
||||||
"like-buttons": {
|
"like-buttons": {
|
||||||
"default": "Par défaut",
|
"default": "Par défaut",
|
||||||
"force-show": "Forcer à apparaître",
|
"force-show": "Forcer à apparaître",
|
||||||
@ -280,7 +287,7 @@
|
|||||||
"name": "Mode ambiant"
|
"name": "Mode ambiant"
|
||||||
},
|
},
|
||||||
"amuse": {
|
"amuse": {
|
||||||
"description": "Ajoute la prise en charge de YouTube Music pour le widget de lecture en cours Amuse par 6K Labs",
|
"description": "Ajout de la prise en charge de YouTube Music pour le widget Amuse now playing de 6K Labs",
|
||||||
"name": "Amuse",
|
"name": "Amuse",
|
||||||
"response": {
|
"response": {
|
||||||
"query": "Le serveur API Amuse est en cours d'exécution. Envoyez une requête GET /query pour obtenir des informations sur la chanson."
|
"query": "Le serveur API Amuse est en cours d'exécution. Envoyez une requête GET /query pour obtenir des informations sur la chanson."
|
||||||
@ -320,11 +327,11 @@
|
|||||||
"name": "Serveur API [Beta]",
|
"name": "Serveur API [Beta]",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
"hostname": {
|
"hostname": {
|
||||||
"label": "Entrer le nom de l'hôte (par exemple 0.0.0.0) pour le serveur API:",
|
"label": "Entrer le nom de l'hôte (par exemple : 0.0.0.0) pour le serveur API :",
|
||||||
"title": "Nom d'hôte"
|
"title": "Nom d'hôte"
|
||||||
},
|
},
|
||||||
"port": {
|
"port": {
|
||||||
"label": "Entrez le port du serveur de l'API:",
|
"label": "Entrez le port du serveur de l'API :",
|
||||||
"title": "Port"
|
"title": "Port"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -381,6 +388,11 @@
|
|||||||
},
|
},
|
||||||
"templates": {
|
"templates": {
|
||||||
"title": "Ouvrir le sélecteur de sous-titres"
|
"title": "Ouvrir le sélecteur de sous-titres"
|
||||||
|
},
|
||||||
|
"toast": {
|
||||||
|
"caption-changed": "Sous-titres changés en {{language}}",
|
||||||
|
"caption-disabled": "Sous-titres désactivés",
|
||||||
|
"no-captions": "Aucun sous-titre disponible pour cette chanson"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"compact-sidebar": {
|
"compact-sidebar": {
|
||||||
@ -600,7 +612,15 @@
|
|||||||
},
|
},
|
||||||
"navigation": {
|
"navigation": {
|
||||||
"description": "Flèches de navigation Suivant/Retour directement intégrées dans l'interface, comme dans votre navigateur préféré",
|
"description": "Flèches de navigation Suivant/Retour directement intégrées dans l'interface, comme dans votre navigateur préféré",
|
||||||
"name": "Navigation"
|
"name": "Navigation",
|
||||||
|
"templates": {
|
||||||
|
"back": {
|
||||||
|
"title": "Revenir à la page précédente"
|
||||||
|
},
|
||||||
|
"forward": {
|
||||||
|
"title": "Aller à la page suivante"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"no-google-login": {
|
"no-google-login": {
|
||||||
"description": "Supprimer les boutons et liens de connexion Google de l'interface",
|
"description": "Supprimer les boutons et liens de connexion Google de l'interface",
|
||||||
@ -692,7 +712,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"description": "Permet de changer la qualité vidéo avec un bouton sur la vidéo",
|
"description": "Permet de changer la qualité vidéo avec un bouton sur la vidéo",
|
||||||
"name": "Changeur de qualité vidéo"
|
"name": "Changeur de qualité vidéo",
|
||||||
|
"renderer": {
|
||||||
|
"quality-settings-button": {
|
||||||
|
"label": "Ouvrir le sélecteur de qualité du lecteur"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"scrobbler": {
|
"scrobbler": {
|
||||||
"description": "Ajouter le support de scrobbling (ex. last.fm, Listenbrainz)",
|
"description": "Ajouter le support de scrobbling (ex. last.fm, Listenbrainz)",
|
||||||
@ -859,7 +884,8 @@
|
|||||||
},
|
},
|
||||||
"name": "Basculer la vidéo",
|
"name": "Basculer la vidéo",
|
||||||
"templates": {
|
"templates": {
|
||||||
"button-song": "Musique"
|
"button-song": "Musique",
|
||||||
|
"button-video": "Vidéo"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"visualizer": {
|
"visualizer": {
|
||||||
|
|||||||
@ -1,7 +1,60 @@
|
|||||||
{
|
{
|
||||||
|
"common": {
|
||||||
|
"console": {
|
||||||
|
"plugins": {
|
||||||
|
"execute-failed": "Error ao executar o plugin {{pluginName}}::{{contextName}}",
|
||||||
|
"executed-at-ms": "O plugin {{pluginName}}::{{contextName}} foi executado a {{ms}}milisegundos",
|
||||||
|
"initialize-failed": "Erro ao iniciar o plugin \"{{pluginName}}\"",
|
||||||
|
"load-all": "Cargando todos os plugins",
|
||||||
|
"load-failed": "Erro ao cargar o plugin \"{{pluginName}}\"",
|
||||||
|
"loaded": "Plugin \"{{pluginName}}\" cargado",
|
||||||
|
"unload-failed": "Erro descargando o plugin {{pluginName}}",
|
||||||
|
"unloaded": "Plugin {{pluginName}} decargado"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"language": {
|
"language": {
|
||||||
"code": "gl",
|
"code": "gl",
|
||||||
"local-name": "Galego",
|
"local-name": "Galego",
|
||||||
"name": "Galician"
|
"name": "Galego"
|
||||||
|
},
|
||||||
|
"main": {
|
||||||
|
"console": {
|
||||||
|
"did-finish-load": {
|
||||||
|
"dev-tools": "Carga completada. DevTools aberto"
|
||||||
|
},
|
||||||
|
"i18n": {
|
||||||
|
"loaded": "i18n cargado"
|
||||||
|
},
|
||||||
|
"second-instance": {
|
||||||
|
"receive-command": "Recibido comando sobre protocolo \"{{command}}\""
|
||||||
|
},
|
||||||
|
"theme": {
|
||||||
|
"css-file-not-found": "O arquivo CSS \"{{cssFile}}\" non existe, ignorando"
|
||||||
|
},
|
||||||
|
"unresponsive": {
|
||||||
|
"details": "Error irresponsivo!\n{{error}}"
|
||||||
|
},
|
||||||
|
"when-ready": {
|
||||||
|
"clearing-cache-after-20s": "Limpando a caché da app"
|
||||||
|
},
|
||||||
|
"window": {
|
||||||
|
"tried-to-render-offscreen": "A ventana tentou de renderizarse fora da pantalla, windowSize={{windowSize}}, displaySize={{displaySize}}, position={{position}}"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"dialog": {
|
||||||
|
"hide-menu-enabled": {
|
||||||
|
"detail": "O menú está agochado, use 'Alt' para mostralo (ou 'Escape' se usa o menú dentro da app)",
|
||||||
|
"message": "Esconder Menú está deshabilitado",
|
||||||
|
"title": "Esconder Menú Habilitado"
|
||||||
|
},
|
||||||
|
"need-to-restart": {
|
||||||
|
"buttons": {
|
||||||
|
"later": "Despois",
|
||||||
|
"restart-now": "Reiniciar Agora"
|
||||||
|
},
|
||||||
|
"detail": "O plugin \"{{pluginName}}\" precisa dun reinicio para tomar efecto"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -150,6 +150,13 @@
|
|||||||
"visual-tweaks": {
|
"visual-tweaks": {
|
||||||
"label": "दृश्य परिवर्तन",
|
"label": "दृश्य परिवर्तन",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
|
"custom-window-title": {
|
||||||
|
"label": "कस्टम विंडो टाइटल",
|
||||||
|
"prompt": {
|
||||||
|
"label": "कस्टम विंडो टाइटल डालें: (डिसएबल करने के लिए खाली छोड़ें)",
|
||||||
|
"placeholder": "उदाहरण: यूट्यूब संगीत"
|
||||||
|
}
|
||||||
|
},
|
||||||
"like-buttons": {
|
"like-buttons": {
|
||||||
"default": "डिफॉल्ट",
|
"default": "डिफॉल्ट",
|
||||||
"force-show": "बल पूर्वक दिखाएं",
|
"force-show": "बल पूर्वक दिखाएं",
|
||||||
@ -381,6 +388,11 @@
|
|||||||
},
|
},
|
||||||
"templates": {
|
"templates": {
|
||||||
"title": "कैप्शन चयनकर्ता खोलें"
|
"title": "कैप्शन चयनकर्ता खोलें"
|
||||||
|
},
|
||||||
|
"toast": {
|
||||||
|
"caption-changed": "कैप्शन {{language}} में बदल दिया गया है",
|
||||||
|
"caption-disabled": "कैप्शन बंद कर दिए गए हैं",
|
||||||
|
"no-captions": "इस गाने के लिए कोई कैप्शन उपलब्ध नहीं हैं"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"compact-sidebar": {
|
"compact-sidebar": {
|
||||||
@ -477,7 +489,7 @@
|
|||||||
"playlist-has-only-one-song": "प्लेलिस्ट में केवल एक आइटम है, इसे सीधे डाउनलोड करें",
|
"playlist-has-only-one-song": "प्लेलिस्ट में केवल एक आइटम है, इसे सीधे डाउनलोड करें",
|
||||||
"playlist-id-not-found": "कोई प्लेलिस्ट आईडी नहीं मिली",
|
"playlist-id-not-found": "कोई प्लेलिस्ट आईडी नहीं मिली",
|
||||||
"playlist-is-empty": "प्लेलिस्ट ख़ाली है",
|
"playlist-is-empty": "प्लेलिस्ट ख़ाली है",
|
||||||
"playlist-is-mix-or-private": "प्लेलिस्ट जानकारी प्राप्त करने में दिक्कत: सुनिश्चित करें कि यह निजी या \"आपके लिए मिश्रित\" प्लेलिस्ट नहीं है\n\n{{त्रुटि}}",
|
"playlist-is-mix-or-private": "प्लेलिस्ट जानकारी प्राप्त करने में दिक्कत: सुनिश्चित करें कि यह निजी या \"आपके लिए मिश्रित\" प्लेलिस्ट नहीं है\n\n{{error}}",
|
||||||
"preparing-file": "फ़ाइल तैयार की जा रही है…",
|
"preparing-file": "फ़ाइल तैयार की जा रही है…",
|
||||||
"saving": "सेव जा रहा है…",
|
"saving": "सेव जा रहा है…",
|
||||||
"trying-to-get-playlist-id": "प्लेलिस्ट आईडी प्राप्त करने का प्रयास किया जा रहा है: {{playlistId}}",
|
"trying-to-get-playlist-id": "प्लेलिस्ट आईडी प्राप्त करने का प्रयास किया जा रहा है: {{playlistId}}",
|
||||||
@ -525,7 +537,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"name": "इक्वलाइज़र"
|
"name": "एक्विलाइज़र"
|
||||||
},
|
},
|
||||||
"exponential-volume": {
|
"exponential-volume": {
|
||||||
"description": "वॉल्यूम स्लाइडर को घातांकीय बनाता है ताकि कम वॉल्यूम का चयन करना आसान हो।",
|
"description": "वॉल्यूम स्लाइडर को घातांकीय बनाता है ताकि कम वॉल्यूम का चयन करना आसान हो।",
|
||||||
@ -600,7 +612,15 @@
|
|||||||
},
|
},
|
||||||
"navigation": {
|
"navigation": {
|
||||||
"description": "आगे /पीछे नेविगेशन अर्रोस सीधे इंटरफ़ेस में एकीकृत, जैसे आपके पसंदीदा ब्राउज़र में",
|
"description": "आगे /पीछे नेविगेशन अर्रोस सीधे इंटरफ़ेस में एकीकृत, जैसे आपके पसंदीदा ब्राउज़र में",
|
||||||
"name": "नेविगेशन"
|
"name": "नेविगेशन",
|
||||||
|
"templates": {
|
||||||
|
"back": {
|
||||||
|
"title": "पिछले पेज पर जाएं"
|
||||||
|
},
|
||||||
|
"forward": {
|
||||||
|
"title": "अगले पेज पर जाएं"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"no-google-login": {
|
"no-google-login": {
|
||||||
"description": "इंटरफ़ेस से गूगल लॉगिन बटन और लिंक हटाएँ",
|
"description": "इंटरफ़ेस से गूगल लॉगिन बटन और लिंक हटाएँ",
|
||||||
@ -692,7 +712,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"description": "वीडियो ओवरले पर एक बटन के साथ वीडियो की गुणवत्ता बदलने की अनुमति देता है",
|
"description": "वीडियो ओवरले पर एक बटन के साथ वीडियो की गुणवत्ता बदलने की अनुमति देता है",
|
||||||
"name": "वीडियो गुणवत्ता परिवर्तक"
|
"name": "वीडियो गुणवत्ता परिवर्तक",
|
||||||
|
"renderer": {
|
||||||
|
"quality-settings-button": {
|
||||||
|
"label": "प्लेयर क्वालिटी सेटिंग खोलें"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"scrobbler": {
|
"scrobbler": {
|
||||||
"description": "स्क्रोब्लिंग सपोर्ट जोड़ें (etc. last.fm, listenbrainz)",
|
"description": "स्क्रोब्लिंग सपोर्ट जोड़ें (etc. last.fm, listenbrainz)",
|
||||||
@ -728,6 +753,37 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"shortcuts": {
|
||||||
|
"description": "प्लेबैक (प्ले/पॉज़/नेक्स्ट/प्रीवियस) के लिए ग्लोबल हॉटकी सेट करने की सुविधा देता है, मीडिया कुंजियों को ओवरराइड करके मीडिया OSD बंद करता है, Ctrl/CMD + F से खोज चालू करता है, Linux में मीडिया कुंजियों के लिए MPRIS सपोर्ट चालू करता है, और उन्नत उपयोगकर्ताओं के लिए कस्टम हॉटकी की अनुमति देता है",
|
||||||
|
"menu": {
|
||||||
|
"override-media-keys": "मीडिया कुंजियों पर नियंत्रण प्राप्त करें",
|
||||||
|
"set-keybinds": "वैश्विक गीत नियंत्रण सेट करें"
|
||||||
|
},
|
||||||
|
"name": "शॉर्टकट कुंजियाँ (और MPRIS)",
|
||||||
|
"prompt": {
|
||||||
|
"keybind": {
|
||||||
|
"keybind-options": {
|
||||||
|
"next": "अगला",
|
||||||
|
"play-pause": "चलाएं / विराम दें",
|
||||||
|
"previous": "पिछला"
|
||||||
|
},
|
||||||
|
"label": "गाने कंट्रोल करने के लिए ग्लोबल कीबाइंड का चयन करें:",
|
||||||
|
"title": "ग्लोबल कीबाइंडस"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"skip-disliked-songs": {
|
||||||
|
"description": "डिसलाइकड गानो को स्किप करता है",
|
||||||
|
"name": "डिसलाइकड गानो को स्किप करें"
|
||||||
|
},
|
||||||
|
"skip-silences": {
|
||||||
|
"description": "साइलेंट सेक्शन को ऑटोमेटिकली स्किप करें",
|
||||||
|
"name": "साइलेंस स्किप करें"
|
||||||
|
},
|
||||||
|
"sponsorblock": {
|
||||||
|
"description": "Intro/Outro जैसे गैर-संगीत भागों को स्किप करता है",
|
||||||
|
"name": "SponsorBlock"
|
||||||
|
},
|
||||||
"video-toggle": {
|
"video-toggle": {
|
||||||
"menu": {
|
"menu": {
|
||||||
"align": {
|
"align": {
|
||||||
|
|||||||
@ -381,6 +381,11 @@
|
|||||||
},
|
},
|
||||||
"templates": {
|
"templates": {
|
||||||
"title": "Otvori izbornik za titlove"
|
"title": "Otvori izbornik za titlove"
|
||||||
|
},
|
||||||
|
"toast": {
|
||||||
|
"caption-changed": "Titlovi su promenjeni u {{language}}",
|
||||||
|
"caption-disabled": "Titlovi su isključeni",
|
||||||
|
"no-captions": "Za ovu pjesmu nisu dostupni titlovi"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"compact-sidebar": {
|
"compact-sidebar": {
|
||||||
@ -600,7 +605,15 @@
|
|||||||
},
|
},
|
||||||
"navigation": {
|
"navigation": {
|
||||||
"description": "Naprijed/Nazad navigacijske strelice su izravno integrirane u sučelje, kao i u vašem omiljenom pregledniku",
|
"description": "Naprijed/Nazad navigacijske strelice su izravno integrirane u sučelje, kao i u vašem omiljenom pregledniku",
|
||||||
"name": "Navigacija"
|
"name": "Navigacija",
|
||||||
|
"templates": {
|
||||||
|
"back": {
|
||||||
|
"title": "Vrati se na prijethodnu stranicu"
|
||||||
|
},
|
||||||
|
"forward": {
|
||||||
|
"title": "Idi na sljedeću stranicu"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"no-google-login": {
|
"no-google-login": {
|
||||||
"description": "Ukloni Google prijavne gumbe i linkove iz sučelja",
|
"description": "Ukloni Google prijavne gumbe i linkove iz sučelja",
|
||||||
@ -627,6 +640,253 @@
|
|||||||
"performance-improvement": {
|
"performance-improvement": {
|
||||||
"description": "Poboljšati performanse uključivanjem eksperimentalnih skripti",
|
"description": "Poboljšati performanse uključivanjem eksperimentalnih skripti",
|
||||||
"name": "Poboljšanje performansa (Beta)"
|
"name": "Poboljšanje performansa (Beta)"
|
||||||
|
},
|
||||||
|
"picture-in-picture": {
|
||||||
|
"description": "Dozvoljava aplikaciji da se prebaci u režim slike-u-slici",
|
||||||
|
"menu": {
|
||||||
|
"always-on-top": "Uvijek na vrhu",
|
||||||
|
"hotkey": {
|
||||||
|
"label": "Prečac",
|
||||||
|
"prompt": {
|
||||||
|
"keybind-options": {
|
||||||
|
"hotkey": "Prečac"
|
||||||
|
},
|
||||||
|
"label": "Odaberi prečac za prebacivanje u režim slike-u-slici",
|
||||||
|
"title": "Prečac za režim slike-u-slici"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"save-window-position": "Sačuvaj mjesto prozora",
|
||||||
|
"save-window-size": "Sačuvaj veličinu prozora",
|
||||||
|
"use-native-pip": "Koristi izvorni režim slike-u-slici za pretraživače"
|
||||||
|
},
|
||||||
|
"name": "Slika-u-slici",
|
||||||
|
"templates": {
|
||||||
|
"button": "Slika-u-slici"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"playback-speed": {
|
||||||
|
"description": "Slušajte brzo, slušajte sporo! Ovo će dodat klizač koji kontrolira brzinu pjesme",
|
||||||
|
"name": "Brzina pokretanja",
|
||||||
|
"templates": {
|
||||||
|
"button": "Brzina"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"precise-volume": {
|
||||||
|
"description": "Precizno kontrolirajte jačinu zvuka korištenjem točkih na mišu/prečaca, sa prilagođenim sučeljem i prilagodivim stupnjevima jačine",
|
||||||
|
"menu": {
|
||||||
|
"arrows-shortcuts": "Lokalne kontrole tipkih sa strelicama",
|
||||||
|
"custom-volume-steps": "Postavi prilagođene stope za promjenu jačine",
|
||||||
|
"global-shortcuts": "Globalni prečaci"
|
||||||
|
},
|
||||||
|
"name": "Precizna jačina zvuka",
|
||||||
|
"prompt": {
|
||||||
|
"global-shortcuts": {
|
||||||
|
"keybind-options": {
|
||||||
|
"decrease": "Snizi jačinu zvuka",
|
||||||
|
"increase": "Pojačaj jačinu zvuka"
|
||||||
|
},
|
||||||
|
"label": "Odaberi globalne prečace na tipkovnici za jačinu zvuka:",
|
||||||
|
"title": "Globalni prečaci na tipkovnici za jačinu zvuka"
|
||||||
|
},
|
||||||
|
"volume-steps": {
|
||||||
|
"label": "Odaberi stope za povišenje/sniženje jačine zvuka",
|
||||||
|
"title": "Stope za promjenu jačine zvuka"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"quality-changer": {
|
||||||
|
"backend": {
|
||||||
|
"dialog": {
|
||||||
|
"quality-changer": {
|
||||||
|
"detail": "Trenutni kvalitet: {{quality}}",
|
||||||
|
"message": "Odaberi kvalitet videa:",
|
||||||
|
"title": "Odaberi kvalitet videa"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"description": "Dozvoljava promjenu kvaliteta videa pomoću gumba na video preklopu",
|
||||||
|
"name": "Promjena kvalitete videa",
|
||||||
|
"renderer": {
|
||||||
|
"quality-settings-button": {
|
||||||
|
"label": "Otvori izbornik za promjenu kvalitete pokretača"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"scrobbler": {
|
||||||
|
"description": "Dodaj podršku za 'četkanje' (poput last.fm, Listenbrainz)",
|
||||||
|
"dialog": {
|
||||||
|
"lastfm": {
|
||||||
|
"auth-failed": {
|
||||||
|
"message": "Autentifikacija sa Last.fm nije uspjela.\nZatvori skočni prozor do sljedećeg ponovnog pokretanja.",
|
||||||
|
"title": "Autentifikacija je neuspješna"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"menu": {
|
||||||
|
"lastfm": {
|
||||||
|
"api-settings": "Postavke za Last.fm API"
|
||||||
|
},
|
||||||
|
"listenbrainz": {
|
||||||
|
"token": "Unesi korisnički žeton za ListenBrainz"
|
||||||
|
},
|
||||||
|
"scrobble-alternative-title": "Koristi alternativne naslove",
|
||||||
|
"scrobble-other-media": "Učetkaj druge medije"
|
||||||
|
},
|
||||||
|
"name": "Četkarnik",
|
||||||
|
"prompt": {
|
||||||
|
"lastfm": {
|
||||||
|
"api-key": "Last.fm API ključ",
|
||||||
|
"api-secret": "Last.fm API tajna"
|
||||||
|
},
|
||||||
|
"listenbrainz": {
|
||||||
|
"token": {
|
||||||
|
"label": "Unesi svoj ListenBrainz korisnički žeton:",
|
||||||
|
"title": "ListenBrainz žeton"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"shortcuts": {
|
||||||
|
"description": "Dozvoljava postavljanje globalnih prečaca na tipkovnici za reproduciranje (pokreni/zaustavi/sljedeće/prijethodno) i isključivanje OSD-a za medije tako što će prebrisati tipke za medije, uključiti Ctrl/CMD + F za pretragu, isključiti MPRIS podršku za medijske tipke na Linux-u, i prilagođene prečace za napredne korisnike",
|
||||||
|
"menu": {
|
||||||
|
"override-media-keys": "Prebriši medijske tipke",
|
||||||
|
"set-keybinds": "Postavi globalne kontrole za pjesme"
|
||||||
|
},
|
||||||
|
"name": "Prečaci (& MPRIS)",
|
||||||
|
"prompt": {
|
||||||
|
"keybind": {
|
||||||
|
"keybind-options": {
|
||||||
|
"next": "Sljedeće",
|
||||||
|
"play-pause": "Pokreni / Zaustavi",
|
||||||
|
"previous": "Prijethodno"
|
||||||
|
},
|
||||||
|
"label": "Odaberi globalne prečace za upravljanje pjesmama:",
|
||||||
|
"title": "Globalni prečaci na tipkovnici"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"skip-disliked-songs": {
|
||||||
|
"description": "Preskače pjesme koje vam se ne sviđaju",
|
||||||
|
"name": "Preskočite pjesme koje vam se ne sviđaju"
|
||||||
|
},
|
||||||
|
"skip-silences": {
|
||||||
|
"description": "Automatski preskočite dijelove pjesama gdje nema zvuka",
|
||||||
|
"name": "Preskoči tišine"
|
||||||
|
},
|
||||||
|
"sponsorblock": {
|
||||||
|
"description": "Automatski preskače dijelove pjesama koji nisu glazba poput uvoda/odjave ili dijelove spotova u kojima nema muzike",
|
||||||
|
"name": "Bloker sponzora"
|
||||||
|
},
|
||||||
|
"synced-lyrics": {
|
||||||
|
"description": "Obezbjeđava sinkronizirane lirike pjesama, korištenjem dobavljača poput LRClib.",
|
||||||
|
"errors": {
|
||||||
|
"fetch": "⚠️\tDošlo je do greške prilikom dobavljanja stihova pjesme.\n\tMolimo vas da probate ponovno kasnije.",
|
||||||
|
"not-found": "⚠️ Tekst za ovu pjesmu nije pronađen."
|
||||||
|
},
|
||||||
|
"menu": {
|
||||||
|
"default-text-string": {
|
||||||
|
"label": "Zadani karakteri između stihova pjesama",
|
||||||
|
"tooltip": "Odaberi zadane karaktere koji će biti korišteni za razmake između stihova pjesama"
|
||||||
|
},
|
||||||
|
"line-effect": {
|
||||||
|
"label": "Efekat crte",
|
||||||
|
"submenu": {
|
||||||
|
"fancy": {
|
||||||
|
"label": "Kitnjast",
|
||||||
|
"tooltip": "Koristi velike (kao iz aplikacije) efekte na trenutnu crtu"
|
||||||
|
},
|
||||||
|
"focus": {
|
||||||
|
"label": "Fokus",
|
||||||
|
"tooltip": "Pretvorite samo trenutnu crtu bijelu"
|
||||||
|
},
|
||||||
|
"offset": {
|
||||||
|
"label": "Izmak",
|
||||||
|
"tooltip": "Izmak na trenutnoj crti"
|
||||||
|
},
|
||||||
|
"scale": {
|
||||||
|
"label": "Razmjera",
|
||||||
|
"tooltip": "Promjeni razmjeru trenutne crte"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tooltip": "Odaberi efekat koji će biti primjenjen na trenutnoj crti"
|
||||||
|
},
|
||||||
|
"precise-timing": {
|
||||||
|
"label": "Napravi da tekst pjesme bude izvrsno usklađen",
|
||||||
|
"tooltip": "Izračunaj do milisekunde prikaz sljedeće crteteksta (može malo utjecati na učinak)"
|
||||||
|
},
|
||||||
|
"romanization": {
|
||||||
|
"label": "Romanizuj stihove pjesama",
|
||||||
|
"tooltip": "Ako je tekst pjesme na drugom jeziku, probajte da ga prikažete na latinici."
|
||||||
|
},
|
||||||
|
"show-lyrics-even-if-inexact": {
|
||||||
|
"label": "Prikaži tekst pjesme čak i ako je netačan",
|
||||||
|
"tooltip": "Ako pjesma nije pronađena, produžetak će probati ponovno sa novim upitom za pretragu.\nRezultat iz drugog pokušaja možda neće biti tačan."
|
||||||
|
},
|
||||||
|
"show-time-codes": {
|
||||||
|
"label": "Prikaži vremenske oznake",
|
||||||
|
"tooltip": "Prikaži vremenske oznake pored teksta pjesme"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "Sinkronizovani stihovi pjesama",
|
||||||
|
"refetch-btn": {
|
||||||
|
"fetching": "Dobavljanje...",
|
||||||
|
"normal": "Ponovo dobavite tekst pjesme"
|
||||||
|
},
|
||||||
|
"warnings": {
|
||||||
|
"duration-mismatch": "⚠️ - Tekst pjesme možda nije usklađen zbog neuklapanja u daljini trajanja.",
|
||||||
|
"inexact": "⚠️ - Tekst za ovu pjesmu možda nije tačan",
|
||||||
|
"instrumental": "⚠️ - Ovo je instrumentalna glazba"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"taskbar-mediacontrol": {
|
||||||
|
"description": "Upravljajte reprodukcijom iz Windows radne trake",
|
||||||
|
"name": "Upravljanje medijima iz radne trake"
|
||||||
|
},
|
||||||
|
"touchbar": {
|
||||||
|
"description": "Dodaje dodatak dodirne trake za macOS korisnike",
|
||||||
|
"name": "Dodirna Traka"
|
||||||
|
},
|
||||||
|
"tuna-obs": {
|
||||||
|
"description": "Integracija sa OBS-ovim Tuna dodatkom",
|
||||||
|
"name": "Tuna OBS"
|
||||||
|
},
|
||||||
|
"unobtrusive-player": {
|
||||||
|
"description": "Onemogućava pokretaču da iskoči u toku pokretanja pjesme",
|
||||||
|
"name": "Nenametljivi pokretač"
|
||||||
|
},
|
||||||
|
"video-toggle": {
|
||||||
|
"description": "Dodaje gumb za šaltanje između režima za video/numeru. Dodatno, može da ukloni cijelu karticu sa videom",
|
||||||
|
"menu": {
|
||||||
|
"align": {
|
||||||
|
"label": "Izravnanje",
|
||||||
|
"submenu": {
|
||||||
|
"left": "Lijevo",
|
||||||
|
"middle": "Sredina",
|
||||||
|
"right": "Desno"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"force-hide": "Nasilno uklonite karticu sa videom",
|
||||||
|
"mode": {
|
||||||
|
"label": "Režim",
|
||||||
|
"submenu": {
|
||||||
|
"custom": "Prilagođeno šaltanje",
|
||||||
|
"disabled": "Isključeno",
|
||||||
|
"native": "Izvorno šaltanje"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "Video šaltanje",
|
||||||
|
"templates": {
|
||||||
|
"button-song": "Pjesma",
|
||||||
|
"button-video": "Video"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"visualizer": {
|
||||||
|
"description": "Dodaje vizualizator u plejer",
|
||||||
|
"menu": {
|
||||||
|
"visualizer-type": "Tip vizualizacije"
|
||||||
|
},
|
||||||
|
"name": "Vizualizacija"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -381,6 +381,11 @@
|
|||||||
},
|
},
|
||||||
"templates": {
|
"templates": {
|
||||||
"title": "Buka pemilih caption"
|
"title": "Buka pemilih caption"
|
||||||
|
},
|
||||||
|
"toast": {
|
||||||
|
"caption-changed": "caption diganti ke bahasa {{language}}",
|
||||||
|
"caption-disabled": "Caption dinonaktifkan",
|
||||||
|
"no-captions": "tidak tersedia caption untuk lagu ini"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"compact-sidebar": {
|
"compact-sidebar": {
|
||||||
@ -600,7 +605,15 @@
|
|||||||
},
|
},
|
||||||
"navigation": {
|
"navigation": {
|
||||||
"description": "panah navigasi Selanjutnya/Sebelumnya terintegrasi pada antarmuka, layaknya peramban kesukaan Anda",
|
"description": "panah navigasi Selanjutnya/Sebelumnya terintegrasi pada antarmuka, layaknya peramban kesukaan Anda",
|
||||||
"name": "Navigasi"
|
"name": "Navigasi",
|
||||||
|
"templates": {
|
||||||
|
"back": {
|
||||||
|
"title": "Kunjungi halaman sebelumnya"
|
||||||
|
},
|
||||||
|
"forward": {
|
||||||
|
"title": "pergi ke halaman berikutnya"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"no-google-login": {
|
"no-google-login": {
|
||||||
"description": "Hapus tombol dan tautan masuk Google dari antarmuka",
|
"description": "Hapus tombol dan tautan masuk Google dari antarmuka",
|
||||||
@ -692,7 +705,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"description": "Izinkan untuk mengubah kualitas video dengan tombol pada hamparan video",
|
"description": "Izinkan untuk mengubah kualitas video dengan tombol pada hamparan video",
|
||||||
"name": "Pengubah Kualitas Video"
|
"name": "Pengubah Kualitas Video",
|
||||||
|
"renderer": {
|
||||||
|
"quality-settings-button": {
|
||||||
|
"label": "pengubah kualitas pemain terbuka"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"scrobbler": {
|
"scrobbler": {
|
||||||
"description": "Tambahkan dukungan scrobbling (mis. last.fm, Listenbrainz)",
|
"description": "Tambahkan dukungan scrobbling (mis. last.fm, Listenbrainz)",
|
||||||
@ -859,7 +877,8 @@
|
|||||||
},
|
},
|
||||||
"name": "Peralih Video",
|
"name": "Peralih Video",
|
||||||
"templates": {
|
"templates": {
|
||||||
"button-song": "Lagu"
|
"button-song": "Lagu",
|
||||||
|
"button-video": "video"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"visualizer": {
|
"visualizer": {
|
||||||
|
|||||||
@ -573,7 +573,7 @@
|
|||||||
"connected-users": "Utenti connessi",
|
"connected-users": "Utenti connessi",
|
||||||
"disconnect": "Disconetti Music Together",
|
"disconnect": "Disconetti Music Together",
|
||||||
"empty-user": "Utenti non connessi",
|
"empty-user": "Utenti non connessi",
|
||||||
"host": "Music Together Host",
|
"host": "Host di Music Together",
|
||||||
"join": "Unisciti a Music Together",
|
"join": "Unisciti a Music Together",
|
||||||
"permission": {
|
"permission": {
|
||||||
"all": "Consenti ai Guest di controllare la playlist e il player",
|
"all": "Consenti ai Guest di controllare la playlist e il player",
|
||||||
@ -646,13 +646,13 @@
|
|||||||
"menu": {
|
"menu": {
|
||||||
"always-on-top": "Sempre in primo piano",
|
"always-on-top": "Sempre in primo piano",
|
||||||
"hotkey": {
|
"hotkey": {
|
||||||
"label": "Hotkey",
|
"label": "Tasto di scelta rapida",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
"keybind-options": {
|
"keybind-options": {
|
||||||
"hotkey": "Hotkey"
|
"hotkey": "Tasto di scelta rapida"
|
||||||
},
|
},
|
||||||
"label": "Scegliere un'hotkey per attivare Picture-in-picture",
|
"label": "Scegliere un'hotkey per attivare Picture-in-picture",
|
||||||
"title": "Picture-in-picture Hotkey"
|
"title": "Tasto di scelta rapida per Picture-in-picture"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"save-window-position": "Salva la posizione della finestra",
|
"save-window-position": "Salva la posizione della finestra",
|
||||||
@ -705,7 +705,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"description": "Permette di cambiare la qualità del video con un pulsante in sovrimpressione",
|
"description": "Permette di cambiare la qualità del video con un pulsante in sovrimpressione",
|
||||||
"name": "Cambia qualità video"
|
"name": "Cambia qualità video",
|
||||||
|
"renderer": {
|
||||||
|
"quality-settings-button": {
|
||||||
|
"label": "Apri il selettore di qualità del player"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"scrobbler": {
|
"scrobbler": {
|
||||||
"description": "Aggiunge il supporto per lo scrobbling (Last.fm, Listenbrainz ecc.)",
|
"description": "Aggiunge il supporto per lo scrobbling (Last.fm, Listenbrainz ecc.)",
|
||||||
@ -761,7 +766,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"skip-disliked-songs": {
|
"skip-disliked-songs": {
|
||||||
"description": "Salta i brani che non ti piacciono",
|
"description": "Salta le canzoni non gradite",
|
||||||
"name": "Salta i brani che non ti piacciono"
|
"name": "Salta i brani che non ti piacciono"
|
||||||
},
|
},
|
||||||
"skip-silences": {
|
"skip-silences": {
|
||||||
|
|||||||
@ -150,6 +150,13 @@
|
|||||||
"visual-tweaks": {
|
"visual-tweaks": {
|
||||||
"label": "見た目の微調整",
|
"label": "見た目の微調整",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
|
"custom-window-title": {
|
||||||
|
"label": "カスタムウィンドウタイトル",
|
||||||
|
"prompt": {
|
||||||
|
"label": "カスタムウィンドウタイトルを入力: (未入力の場合無効になります)",
|
||||||
|
"placeholder": "例: YouTube Music"
|
||||||
|
}
|
||||||
|
},
|
||||||
"like-buttons": {
|
"like-buttons": {
|
||||||
"default": "デフォルト",
|
"default": "デフォルト",
|
||||||
"force-show": "強制的に表示",
|
"force-show": "強制的に表示",
|
||||||
@ -334,6 +341,7 @@
|
|||||||
"name": "オーディオコンプレッサー"
|
"name": "オーディオコンプレッサー"
|
||||||
},
|
},
|
||||||
"auth-proxy-adapter": {
|
"auth-proxy-adapter": {
|
||||||
|
"description": "認証プロキシサービスの利用サポート",
|
||||||
"menu": {
|
"menu": {
|
||||||
"disable": "プロキシアダプターを無効にする",
|
"disable": "プロキシアダプターを無効にする",
|
||||||
"enable": "プロキシアダプターを有効にする",
|
"enable": "プロキシアダプターを有効にする",
|
||||||
@ -344,6 +352,7 @@
|
|||||||
"label": "ポート"
|
"label": "ポート"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"name": "認証プロキシアダプタ",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
"hostname": {
|
"hostname": {
|
||||||
"label": "ローカルプロキシサーバのホスト名を入力します(再起動が必要です):",
|
"label": "ローカルプロキシサーバのホスト名を入力します(再起動が必要です):",
|
||||||
@ -379,6 +388,11 @@
|
|||||||
},
|
},
|
||||||
"templates": {
|
"templates": {
|
||||||
"title": "字幕選択機を開く"
|
"title": "字幕選択機を開く"
|
||||||
|
},
|
||||||
|
"toast": {
|
||||||
|
"caption-changed": "字幕を{{language}}に変更しました",
|
||||||
|
"caption-disabled": "字幕を無効にしました",
|
||||||
|
"no-captions": "この曲には字幕がありません"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"compact-sidebar": {
|
"compact-sidebar": {
|
||||||
@ -598,7 +612,15 @@
|
|||||||
},
|
},
|
||||||
"navigation": {
|
"navigation": {
|
||||||
"description": "ブラウザの戻る・進むボタンのようにUIからコントロールできるボタン",
|
"description": "ブラウザの戻る・進むボタンのようにUIからコントロールできるボタン",
|
||||||
"name": "ナビゲーション"
|
"name": "ナビゲーション",
|
||||||
|
"templates": {
|
||||||
|
"back": {
|
||||||
|
"title": "前のページに戻ります"
|
||||||
|
},
|
||||||
|
"forward": {
|
||||||
|
"title": "次のページに進みます"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"no-google-login": {
|
"no-google-login": {
|
||||||
"description": "インターフェースからGoogleのログインボタンとリンクを削除",
|
"description": "インターフェースからGoogleのログインボタンとリンクを削除",
|
||||||
@ -690,7 +712,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"description": "ビデオオーバーレイのボタンを使用してビデオ品質を変更できるようにします",
|
"description": "ビデオオーバーレイのボタンを使用してビデオ品質を変更できるようにします",
|
||||||
"name": "ビデオ品質チェンジャー"
|
"name": "ビデオ品質チェンジャー",
|
||||||
|
"renderer": {
|
||||||
|
"quality-settings-button": {
|
||||||
|
"label": "ビデオ品質チェンジャーを開きます"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"scrobbler": {
|
"scrobbler": {
|
||||||
"description": "スクロブリング対応を追加します(例:last.fm、Listenbrainzなど)",
|
"description": "スクロブリング対応を追加します(例:last.fm、Listenbrainzなど)",
|
||||||
@ -857,7 +884,8 @@
|
|||||||
},
|
},
|
||||||
"name": "動画の切り替え",
|
"name": "動画の切り替え",
|
||||||
"templates": {
|
"templates": {
|
||||||
"button-song": "曲"
|
"button-song": "曲",
|
||||||
|
"button-video": "動画"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"visualizer": {
|
"visualizer": {
|
||||||
|
|||||||
@ -150,6 +150,13 @@
|
|||||||
"visual-tweaks": {
|
"visual-tweaks": {
|
||||||
"label": "시각적 변경",
|
"label": "시각적 변경",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
|
"custom-window-title": {
|
||||||
|
"label": "사용자 정의 앱 제목",
|
||||||
|
"prompt": {
|
||||||
|
"label": "앱 제목으로 표시할 내용 : (빈 칸 일시 비활성화)",
|
||||||
|
"placeholder": "예: YouTube Music"
|
||||||
|
}
|
||||||
|
},
|
||||||
"like-buttons": {
|
"like-buttons": {
|
||||||
"default": "기본",
|
"default": "기본",
|
||||||
"force-show": "강제로 표시",
|
"force-show": "강제로 표시",
|
||||||
@ -334,7 +341,7 @@
|
|||||||
"name": "오디오 컴프레서"
|
"name": "오디오 컴프레서"
|
||||||
},
|
},
|
||||||
"auth-proxy-adapter": {
|
"auth-proxy-adapter": {
|
||||||
"description": "인증 프록시 서비스 사용 지원",
|
"description": "아이디/패스워드가 필요한 프록시를 지원합니다",
|
||||||
"menu": {
|
"menu": {
|
||||||
"disable": "프록시 어댑터 차단",
|
"disable": "프록시 어댑터 차단",
|
||||||
"enable": "프록시 어댑터 허용",
|
"enable": "프록시 어댑터 허용",
|
||||||
@ -414,6 +421,19 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"custom-output-device": {
|
||||||
|
"description": "미디어 출력 장치 구성",
|
||||||
|
"menu": {
|
||||||
|
"device-selector": "장치 선택"
|
||||||
|
},
|
||||||
|
"name": "출력 장치 커스텀",
|
||||||
|
"prompt": {
|
||||||
|
"device-selector": {
|
||||||
|
"label": "사용할 미디어 출력 장치를 선택하세요",
|
||||||
|
"title": "출력 장치 선택"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"disable-autoplay": {
|
"disable-autoplay": {
|
||||||
"description": "노래를 '일시 정지' 모드로 시작하게 합니다",
|
"description": "노래를 '일시 정지' 모드로 시작하게 합니다",
|
||||||
"menu": {
|
"menu": {
|
||||||
@ -437,7 +457,15 @@
|
|||||||
"hide-duration-left": "남은 재생 시간 숨기기",
|
"hide-duration-left": "남은 재생 시간 숨기기",
|
||||||
"hide-github-button": "GitHub 링크 버튼 숨기기",
|
"hide-github-button": "GitHub 링크 버튼 숨기기",
|
||||||
"play-on-youtube-music": "유튜브 뮤직에서 재생",
|
"play-on-youtube-music": "유튜브 뮤직에서 재생",
|
||||||
"set-inactivity-timeout": "비활성 시간 제한 설정"
|
"set-inactivity-timeout": "비활성 시간 제한 설정",
|
||||||
|
"set-status-display-type": {
|
||||||
|
"label": "상태 텍스트",
|
||||||
|
"submenu": {
|
||||||
|
"artist": "{아티스트} 듣는 중",
|
||||||
|
"title": "{곡 제목} 듣는 중",
|
||||||
|
"youtube-music": "YouTube Music 듣는 중"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"name": "디스코드 활동 상태",
|
"name": "디스코드 활동 상태",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
@ -729,6 +757,7 @@
|
|||||||
"listenbrainz": {
|
"listenbrainz": {
|
||||||
"token": "ListenBrainz 유저 토큰 입력"
|
"token": "ListenBrainz 유저 토큰 입력"
|
||||||
},
|
},
|
||||||
|
"scrobble-alternative-artist": "대체 아티스트 명 사용",
|
||||||
"scrobble-alternative-title": "대체 제목 사용하기",
|
"scrobble-alternative-title": "대체 제목 사용하기",
|
||||||
"scrobble-other-media": "다른 미디어 스크로블하기"
|
"scrobble-other-media": "다른 미디어 스크로블하기"
|
||||||
},
|
},
|
||||||
@ -814,6 +843,14 @@
|
|||||||
"label": "가사를 최대한 정교하게 동기화",
|
"label": "가사를 최대한 정교하게 동기화",
|
||||||
"tooltip": "다음 줄의 표시를 밀리초 단위로 계산합니다 (성능에 약간의 영향을 미칠 수 있음)"
|
"tooltip": "다음 줄의 표시를 밀리초 단위로 계산합니다 (성능에 약간의 영향을 미칠 수 있음)"
|
||||||
},
|
},
|
||||||
|
"preferred-provider": {
|
||||||
|
"label": "선호하는 가사 제공자",
|
||||||
|
"none": {
|
||||||
|
"label": "없음",
|
||||||
|
"tooltip": "선호하는 가사 제공자 없음"
|
||||||
|
},
|
||||||
|
"tooltip": "사용할 기본 가사 제공자를 선택하세요"
|
||||||
|
},
|
||||||
"romanization": {
|
"romanization": {
|
||||||
"label": "가사 로마자 변환",
|
"label": "가사 로마자 변환",
|
||||||
"tooltip": "가사가 영어가 아닌 언어로 되어있는 경우, 로마자 표기를 표시합니다."
|
"tooltip": "가사가 영어가 아닌 언어로 되어있는 경우, 로마자 표기를 표시합니다."
|
||||||
@ -846,6 +883,27 @@
|
|||||||
"description": "macOS 사용자를 위한 TouchBar 위젯을 추가합니다",
|
"description": "macOS 사용자를 위한 TouchBar 위젯을 추가합니다",
|
||||||
"name": "TouchBar"
|
"name": "TouchBar"
|
||||||
},
|
},
|
||||||
|
"transparent-player": {
|
||||||
|
"description": "애플리케이션 창을 투명하게 만듭니다",
|
||||||
|
"menu": {
|
||||||
|
"opacity": {
|
||||||
|
"label": "불투명도",
|
||||||
|
"submenu": {
|
||||||
|
"percent": "{{opacity}}%"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"label": "종류",
|
||||||
|
"submenu": {
|
||||||
|
"acrylic": "아크릴",
|
||||||
|
"mica": "미카",
|
||||||
|
"none": "없음",
|
||||||
|
"tabbed": "탭"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "투명 플레이어"
|
||||||
|
},
|
||||||
"tuna-obs": {
|
"tuna-obs": {
|
||||||
"description": "OBS의 확장인 Tuna와의 통합을 활성화합니다",
|
"description": "OBS의 확장인 Tuna와의 통합을 활성화합니다",
|
||||||
"name": "Tuna OBS"
|
"name": "Tuna OBS"
|
||||||
|
|||||||
@ -207,6 +207,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"plugins": {
|
"plugins": {
|
||||||
|
"ad-speedup": {
|
||||||
|
"description": "Jeigu gros reklama, bus įrašo garsas išjungtas ir pagreitintas 16x",
|
||||||
|
"name": "Reklamos Pagreitinimas"
|
||||||
|
},
|
||||||
"adblocker": {
|
"adblocker": {
|
||||||
"description": "Blokuoti visas reklamas ir seklius",
|
"description": "Blokuoti visas reklamas ir seklius",
|
||||||
"menu": {
|
"menu": {
|
||||||
@ -215,6 +219,7 @@
|
|||||||
"name": "Reklamų blokuotojas"
|
"name": "Reklamų blokuotojas"
|
||||||
},
|
},
|
||||||
"album-actions": {
|
"album-actions": {
|
||||||
|
"description": "Prideda Nepatinka, Patinka bei atžymėti Nepatika ir Patinka visoms dainoms grojaraštyje arba albume.",
|
||||||
"name": "Albumo Veiksmai"
|
"name": "Albumo Veiksmai"
|
||||||
},
|
},
|
||||||
"album-color-theme": {
|
"album-color-theme": {
|
||||||
@ -274,6 +279,56 @@
|
|||||||
},
|
},
|
||||||
"name": "Aplinkos rėžimas"
|
"name": "Aplinkos rėžimas"
|
||||||
},
|
},
|
||||||
|
"amuse": {
|
||||||
|
"description": "Prideda Youtube Muzika palaikyma Amuse grojimo valdikliui pagal 6K Labs",
|
||||||
|
"name": "Amuse (Platforma Dainininkams)",
|
||||||
|
"response": {
|
||||||
|
"query": "Amuse API serveris yra veikiantis. Parašykite Get /query kad gautumėte dainos informacija."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"api-server": {
|
||||||
|
"description": "Prideda API serveri, kad būtų galima kontroliuoti grotuvą",
|
||||||
|
"dialog": {
|
||||||
|
"request": {
|
||||||
|
"buttons": {
|
||||||
|
"allow": "Leisti",
|
||||||
|
"deny": "Neleisti"
|
||||||
|
},
|
||||||
|
"message": "Leisti {{ID}} ({{origin}}) prieiga prie API?",
|
||||||
|
"title": "API įgaliojimo užklausa"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"menu": {
|
||||||
|
"auth-strategy": {
|
||||||
|
"label": "Įgaliojimo strategija",
|
||||||
|
"submenu": {
|
||||||
|
"auth-at-first": {
|
||||||
|
"label": "Įgalioti per pirmą užklausą"
|
||||||
|
},
|
||||||
|
"none": {
|
||||||
|
"label": "Nėra įgaliojimo"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"hostname": {
|
||||||
|
"label": "Serverio Pavadinimas"
|
||||||
|
},
|
||||||
|
"port": {
|
||||||
|
"label": "Prievadas"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "API Serverio {Beta}",
|
||||||
|
"prompt": {
|
||||||
|
"hostname": {
|
||||||
|
"label": "Įveskite serverio pavadinimą (pavyzdžiui kaip 0.0.0.0) skirtą API serveriui:",
|
||||||
|
"title": "Serverio Pavadinimas"
|
||||||
|
},
|
||||||
|
"port": {
|
||||||
|
"label": "Įveskite prievadą API serveriui:",
|
||||||
|
"title": "Prievadas"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"audio-compressor": {
|
"audio-compressor": {
|
||||||
"description": "Pritaikyti garso kompresiją (sumažina garsiausių signalo dalių garsumą ir padidina švelniausių dalių garsumą)",
|
"description": "Pritaikyti garso kompresiją (sumažina garsiausių signalo dalių garsumą ir padidina švelniausių dalių garsumą)",
|
||||||
"name": "Garso Kompresorius"
|
"name": "Garso Kompresorius"
|
||||||
@ -583,6 +638,17 @@
|
|||||||
"description": "Automatiškai praleidžia ne muzikines dalis, pvz., įžangą/užvedimą arba muzikinių vaizdo įrašų dalis, kuriose daina negrojama",
|
"description": "Automatiškai praleidžia ne muzikines dalis, pvz., įžangą/užvedimą arba muzikinių vaizdo įrašų dalis, kuriose daina negrojama",
|
||||||
"name": "Rėmėjų blokuotojas"
|
"name": "Rėmėjų blokuotojas"
|
||||||
},
|
},
|
||||||
|
"synced-lyrics": {
|
||||||
|
"refetch-btn": {
|
||||||
|
"fetching": "Gaunama...",
|
||||||
|
"normal": "Atgauti dainos žodžius"
|
||||||
|
},
|
||||||
|
"warnings": {
|
||||||
|
"duration-mismatch": "⚠️ - Dainos žodžiai gali būti nesinchronizuoti dėl trukmės nesutikimo.",
|
||||||
|
"inexact": "⚠️ - Dainos žodžiai gali šiek tiek skirtis",
|
||||||
|
"instrumental": "⚠️ – Tai instrumentinė daina"
|
||||||
|
}
|
||||||
|
},
|
||||||
"taskbar-mediacontrol": {
|
"taskbar-mediacontrol": {
|
||||||
"description": "Valdykite atkūrimą iš „Windows“ užduočių juostos",
|
"description": "Valdykite atkūrimą iš „Windows“ užduočių juostos",
|
||||||
"name": "Užduočių juostos medijos valdymas"
|
"name": "Užduočių juostos medijos valdymas"
|
||||||
|
|||||||
@ -381,6 +381,11 @@
|
|||||||
},
|
},
|
||||||
"templates": {
|
"templates": {
|
||||||
"title": "Atvērt subtitru izvēlni"
|
"title": "Atvērt subtitru izvēlni"
|
||||||
|
},
|
||||||
|
"toast": {
|
||||||
|
"caption-changed": "Subtitri pamainīti uz {{language}}",
|
||||||
|
"caption-disabled": "Subtitri izslēgti",
|
||||||
|
"no-captions": "Subtitri nav pieejami priekš šīs dziesmas"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"compact-sidebar": {
|
"compact-sidebar": {
|
||||||
@ -479,7 +484,9 @@
|
|||||||
"playlist-is-empty": "Atskaņošanas saraksts ir tukšs",
|
"playlist-is-empty": "Atskaņošanas saraksts ir tukšs",
|
||||||
"playlist-is-mix-or-private": "Neizdevās iegūt atskaņošanas saraksta informāciju: pārliecinieties, ka tas nav privāts vai \"Jums izveidotā izlase\" saraksts.\n\n{{error}}",
|
"playlist-is-mix-or-private": "Neizdevās iegūt atskaņošanas saraksta informāciju: pārliecinieties, ka tas nav privāts vai \"Jums izveidotā izlase\" saraksts.\n\n{{error}}",
|
||||||
"preparing-file": "Faila sagatavošana…",
|
"preparing-file": "Faila sagatavošana…",
|
||||||
"saving": "Saglabāšana…"
|
"saving": "Saglabāšana…",
|
||||||
|
"video-id-not-found": "Video nav atrasts",
|
||||||
|
"writing-id3": "Rakstam ID3 tegus…"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -381,6 +381,11 @@
|
|||||||
},
|
},
|
||||||
"templates": {
|
"templates": {
|
||||||
"title": "क्याप्सन चयनकर्ता खोल्नुहोस्"
|
"title": "क्याप्सन चयनकर्ता खोल्नुहोस्"
|
||||||
|
},
|
||||||
|
"toast": {
|
||||||
|
"caption-changed": "क्याप्सन {{language}} मा परिवर्तन भयो",
|
||||||
|
"caption-disabled": "क्याप्सन उपलब्ध छैन",
|
||||||
|
"no-captions": "यो गीतको लागि कुनै क्याप्सन उपलब्ध छैन।"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"compact-sidebar": {
|
"compact-sidebar": {
|
||||||
@ -600,7 +605,15 @@
|
|||||||
},
|
},
|
||||||
"navigation": {
|
"navigation": {
|
||||||
"description": "अर्को/पछाडि नेभिगेसन तपाईँको मनपर्ने ब्राउजरमा जस्तै सिधा इन्टरफेसमा एकीकृत तीरहरू",
|
"description": "अर्को/पछाडि नेभिगेसन तपाईँको मनपर्ने ब्राउजरमा जस्तै सिधा इन्टरफेसमा एकीकृत तीरहरू",
|
||||||
"name": "नेभिगेसन"
|
"name": "नेभिगेसन",
|
||||||
|
"templates": {
|
||||||
|
"back": {
|
||||||
|
"title": "अघिल्लो पृष्ठमा जानुहोस्"
|
||||||
|
},
|
||||||
|
"forward": {
|
||||||
|
"title": "अर्को पृष्ठमा जानुहोस्"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"no-google-login": {
|
"no-google-login": {
|
||||||
"description": "इन्टरफेसबाट गुगल लगइन बटन र लिङ्कहरू हटाउनुहोस्",
|
"description": "इन्टरफेसबाट गुगल लगइन बटन र लिङ्कहरू हटाउनुहोस्",
|
||||||
@ -859,7 +872,8 @@
|
|||||||
},
|
},
|
||||||
"name": "भिडियो टगल",
|
"name": "भिडियो टगल",
|
||||||
"templates": {
|
"templates": {
|
||||||
"button-song": "गीत"
|
"button-song": "गीत",
|
||||||
|
"button-video": "भिडियो"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"visualizer": {
|
"visualizer": {
|
||||||
|
|||||||
@ -150,6 +150,13 @@
|
|||||||
"visual-tweaks": {
|
"visual-tweaks": {
|
||||||
"label": "Visuele Aanpassingen",
|
"label": "Visuele Aanpassingen",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
|
"custom-window-title": {
|
||||||
|
"label": "Aangepaste venstertitel",
|
||||||
|
"prompt": {
|
||||||
|
"label": "Voer aangepaste venstertitel in: (laat leeg om uit te schakelen)",
|
||||||
|
"placeholder": "Voorbeeld: Youtube Music"
|
||||||
|
}
|
||||||
|
},
|
||||||
"like-buttons": {
|
"like-buttons": {
|
||||||
"default": "Standaard",
|
"default": "Standaard",
|
||||||
"force-show": "Forceren weergeven",
|
"force-show": "Forceren weergeven",
|
||||||
@ -163,12 +170,12 @@
|
|||||||
"cancel": "Annuleren",
|
"cancel": "Annuleren",
|
||||||
"remove": "Verwijderen"
|
"remove": "Verwijderen"
|
||||||
},
|
},
|
||||||
"remove-theme": "Weet je zeker dat je het aangepaste thema wilt verwijderen?",
|
"remove-theme": "Weet je zeker dat je het aangepaste thema wil verwijderen?",
|
||||||
"remove-theme-message": "Dit verwijderd het aangepaste thema"
|
"remove-theme-message": "Dit verwijdert het aangepaste thema"
|
||||||
},
|
},
|
||||||
"label": "Thema",
|
"label": "Thema",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"import-css-file": "Aangepast CSS-bestand importeren",
|
"import-css-file": "Importeer aangepast CSS-bestand",
|
||||||
"no-theme": "Geen thema"
|
"no-theme": "Geen thema"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -178,11 +185,11 @@
|
|||||||
},
|
},
|
||||||
"plugins": {
|
"plugins": {
|
||||||
"enabled": "Ingeschakeld",
|
"enabled": "Ingeschakeld",
|
||||||
"label": "Plugins",
|
"label": "Invoegtoepassingen",
|
||||||
"new": "NIEUW"
|
"new": "NIEUW"
|
||||||
},
|
},
|
||||||
"view": {
|
"view": {
|
||||||
"label": "Weergave",
|
"label": "Weergeven",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"force-reload": "Forceer Herladen",
|
"force-reload": "Forceer Herladen",
|
||||||
"reload": "Herladen",
|
"reload": "Herladen",
|
||||||
@ -195,31 +202,31 @@
|
|||||||
},
|
},
|
||||||
"tray": {
|
"tray": {
|
||||||
"next": "Volgende",
|
"next": "Volgende",
|
||||||
"play-pause": "Afspelen/Pauzeren",
|
"play-pause": "Afspelen/Pauze",
|
||||||
"previous": "Vorige",
|
"previous": "Vorige",
|
||||||
"quit": "Afsluiten",
|
"quit": "Afsluiten",
|
||||||
"restart": "Applicatie Opnieuw Opstarten",
|
"restart": "Herstarten App",
|
||||||
"show": "Venster Weergeven",
|
"show": "Weergeven Venster",
|
||||||
"tooltip": {
|
"tooltip": {
|
||||||
"default": "YouTube Music",
|
"default": "YouTube Music",
|
||||||
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
|
"with-song-info": "YouTube Music: {{artiest}} - {{titel}}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"plugins": {
|
"plugins": {
|
||||||
"ad-speedup": {
|
"ad-speedup": {
|
||||||
"description": "Wanneer een advertentie afspeelt, dempt het geluid en versnelt de playback naar 16x",
|
"description": "Bij het afspelen van een advertentie wordt het geluid gedempt en wordt de afspeelsnelheid wordt verhoogd naar 16x",
|
||||||
"name": "Snellere advertenties"
|
"name": "Advertenties versnellen"
|
||||||
},
|
},
|
||||||
"adblocker": {
|
"adblocker": {
|
||||||
"description": "Blokkeer alle advertenties en tracking vanuit de doos",
|
"description": "Blokkeer alle advertenties en trackers buiten het kader",
|
||||||
"menu": {
|
"menu": {
|
||||||
"blocker": "Blokkeerder"
|
"blocker": "Blokkeerder"
|
||||||
},
|
},
|
||||||
"name": "Advertentieblokkeerder"
|
"name": "Advertentieblokkeerder"
|
||||||
},
|
},
|
||||||
"album-actions": {
|
"album-actions": {
|
||||||
"description": "Voegt knoppen toe voor Ondisliken, Disliken, Liken en Ontliken om dit toe te passen op alle nummers in een afspeellijst of album",
|
"description": "Voegt niet-Niet Leuk, Niet Leuk, Leuk, niet-Leuk knoppen toe om dit toe te passen op alle nummers in een afspeellijst of album",
|
||||||
"name": "Albumacties"
|
"name": "Albumacties"
|
||||||
},
|
},
|
||||||
"album-color-theme": {
|
"album-color-theme": {
|
||||||
@ -345,7 +352,7 @@
|
|||||||
"label": "Poort"
|
"label": "Poort"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"name": "Auth proxy adapter",
|
"name": "Proxy-authenticatieadapter",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
"hostname": {
|
"hostname": {
|
||||||
"label": "Hostname voor lokale proxy server (vereist herstart):",
|
"label": "Hostname voor lokale proxy server (vereist herstart):",
|
||||||
@ -381,6 +388,11 @@
|
|||||||
},
|
},
|
||||||
"templates": {
|
"templates": {
|
||||||
"title": "Open ondertitelkeuze"
|
"title": "Open ondertitelkeuze"
|
||||||
|
},
|
||||||
|
"toast": {
|
||||||
|
"caption-changed": "Ondertitel veranderd naar {{language}}",
|
||||||
|
"caption-disabled": "Ondertitels uitgeschakeld",
|
||||||
|
"no-captions": "Geen ondertitels beschikbaar voor dit lied"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"compact-sidebar": {
|
"compact-sidebar": {
|
||||||
@ -600,7 +612,15 @@
|
|||||||
},
|
},
|
||||||
"navigation": {
|
"navigation": {
|
||||||
"description": "Volgende/Vorige navigatiepijlen rechtstreeks geïntegreerd in de interface, zoals in je favoriete browser",
|
"description": "Volgende/Vorige navigatiepijlen rechtstreeks geïntegreerd in de interface, zoals in je favoriete browser",
|
||||||
"name": "Navigatie"
|
"name": "Navigatie",
|
||||||
|
"templates": {
|
||||||
|
"back": {
|
||||||
|
"title": "Ga naar de vorige pagina"
|
||||||
|
},
|
||||||
|
"forward": {
|
||||||
|
"title": "Ga naar de volgende pagina"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"no-google-login": {
|
"no-google-login": {
|
||||||
"description": "Verwijder Google aanmeldknoppen en -links uit de interface",
|
"description": "Verwijder Google aanmeldknoppen en -links uit de interface",
|
||||||
@ -692,7 +712,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"description": "Maakt het mogelijk de videokwaliteit te wijzigen met een knop op de video-overlay",
|
"description": "Maakt het mogelijk de videokwaliteit te wijzigen met een knop op de video-overlay",
|
||||||
"name": "Videokwaliteitwisselaar"
|
"name": "Videokwaliteitwisselaar",
|
||||||
|
"renderer": {
|
||||||
|
"quality-settings-button": {
|
||||||
|
"label": "Open speler kwaliteitswisselaar"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"scrobbler": {
|
"scrobbler": {
|
||||||
"description": "Ondersteuning voor scrobbling toevoegen (etc. last.fm, Listenbrainz)",
|
"description": "Ondersteuning voor scrobbling toevoegen (etc. last.fm, Listenbrainz)",
|
||||||
@ -859,7 +884,8 @@
|
|||||||
},
|
},
|
||||||
"name": "Videoschakelaar",
|
"name": "Videoschakelaar",
|
||||||
"templates": {
|
"templates": {
|
||||||
"button-song": "Nummer"
|
"button-song": "Nummer",
|
||||||
|
"button-video": "Video"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"visualizer": {
|
"visualizer": {
|
||||||
|
|||||||
@ -150,6 +150,13 @@
|
|||||||
"visual-tweaks": {
|
"visual-tweaks": {
|
||||||
"label": "Poprawki wizualne",
|
"label": "Poprawki wizualne",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
|
"custom-window-title": {
|
||||||
|
"label": "Niestandardowy tytuł okna",
|
||||||
|
"prompt": {
|
||||||
|
"label": "Podaj niestandardowy tytuł okna (zostaw puste, aby to wyłączyć):",
|
||||||
|
"placeholder": "Przykład: YouTube Music"
|
||||||
|
}
|
||||||
|
},
|
||||||
"like-buttons": {
|
"like-buttons": {
|
||||||
"default": "Domyślne",
|
"default": "Domyślne",
|
||||||
"force-show": "Wymuś pokazywanie",
|
"force-show": "Wymuś pokazywanie",
|
||||||
@ -381,6 +388,11 @@
|
|||||||
},
|
},
|
||||||
"templates": {
|
"templates": {
|
||||||
"title": "Otwórz selektor napisów"
|
"title": "Otwórz selektor napisów"
|
||||||
|
},
|
||||||
|
"toast": {
|
||||||
|
"caption-changed": "Zmieniono napisy na {{language}}",
|
||||||
|
"caption-disabled": "Napisy zostały wyłączone",
|
||||||
|
"no-captions": "Nie znaleziono napisów dla tego utworu"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"compact-sidebar": {
|
"compact-sidebar": {
|
||||||
@ -600,7 +612,15 @@
|
|||||||
},
|
},
|
||||||
"navigation": {
|
"navigation": {
|
||||||
"description": "Strzałki nawigacyjne Dalej/Wstecz zintegrowane bezpośrednio z interfejsem, tak jak w Twojej ulubionej przeglądarce",
|
"description": "Strzałki nawigacyjne Dalej/Wstecz zintegrowane bezpośrednio z interfejsem, tak jak w Twojej ulubionej przeglądarce",
|
||||||
"name": "Nawigacja"
|
"name": "Nawigacja",
|
||||||
|
"templates": {
|
||||||
|
"back": {
|
||||||
|
"title": "Przejdź do poprzedniej strony"
|
||||||
|
},
|
||||||
|
"forward": {
|
||||||
|
"title": "Przejdź do następnej strony"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"no-google-login": {
|
"no-google-login": {
|
||||||
"description": "Usuń przyciski i linki logowania Google z interfejsu",
|
"description": "Usuń przyciski i linki logowania Google z interfejsu",
|
||||||
@ -692,7 +712,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"description": "Umożliwia zmianę jakości wideo za pomocą przycisku na nakładce wideo",
|
"description": "Umożliwia zmianę jakości wideo za pomocą przycisku na nakładce wideo",
|
||||||
"name": "Zmieniacz jakości wideo"
|
"name": "Zmieniacz jakości wideo",
|
||||||
|
"renderer": {
|
||||||
|
"quality-settings-button": {
|
||||||
|
"label": "Otwórz manipulator jakości odtwarzacza"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"scrobbler": {
|
"scrobbler": {
|
||||||
"description": "Umożliwia scrobbling utworów do m.in. last.fm lub Listenbrainz",
|
"description": "Umożliwia scrobbling utworów do m.in. last.fm lub Listenbrainz",
|
||||||
@ -859,7 +884,8 @@
|
|||||||
},
|
},
|
||||||
"name": "Przełącznik wideo",
|
"name": "Przełącznik wideo",
|
||||||
"templates": {
|
"templates": {
|
||||||
"button-song": "Utwór"
|
"button-song": "Utwór",
|
||||||
|
"button-video": "Wideo"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"visualizer": {
|
"visualizer": {
|
||||||
|
|||||||
@ -150,6 +150,13 @@
|
|||||||
"visual-tweaks": {
|
"visual-tweaks": {
|
||||||
"label": "Ajustes visuais",
|
"label": "Ajustes visuais",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
|
"custom-window-title": {
|
||||||
|
"label": "Título da janela customizado",
|
||||||
|
"prompt": {
|
||||||
|
"label": "Insira título customizado para a janela: (deixe em branco para desabilitar)",
|
||||||
|
"placeholder": "Exemplo: Youtube Music"
|
||||||
|
}
|
||||||
|
},
|
||||||
"like-buttons": {
|
"like-buttons": {
|
||||||
"default": "Padrão",
|
"default": "Padrão",
|
||||||
"force-show": "Forçar exibir",
|
"force-show": "Forçar exibir",
|
||||||
@ -381,6 +388,11 @@
|
|||||||
},
|
},
|
||||||
"templates": {
|
"templates": {
|
||||||
"title": "Abrir seletor de legendas"
|
"title": "Abrir seletor de legendas"
|
||||||
|
},
|
||||||
|
"toast": {
|
||||||
|
"caption-changed": "Legenda alterada para {{language}}",
|
||||||
|
"caption-disabled": "Legendas desativadas",
|
||||||
|
"no-captions": "Sem legendas disponíveis para essa música"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"compact-sidebar": {
|
"compact-sidebar": {
|
||||||
@ -409,6 +421,19 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"custom-output-device": {
|
||||||
|
"description": "Configure um dispositivo de saída de mídia personalizado para músicas",
|
||||||
|
"menu": {
|
||||||
|
"device-selector": "Selecionar dispositivo"
|
||||||
|
},
|
||||||
|
"name": "Dispositivo de saída personalizado",
|
||||||
|
"prompt": {
|
||||||
|
"device-selector": {
|
||||||
|
"label": "Escolha o dispositivo de saída de mídia que será usado",
|
||||||
|
"title": "Selecionar dispositivo de saída"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"disable-autoplay": {
|
"disable-autoplay": {
|
||||||
"description": "Faz a música começar no modo \"pausado\"",
|
"description": "Faz a música começar no modo \"pausado\"",
|
||||||
"menu": {
|
"menu": {
|
||||||
@ -432,7 +457,15 @@
|
|||||||
"hide-duration-left": "Ocultar duração restante",
|
"hide-duration-left": "Ocultar duração restante",
|
||||||
"hide-github-button": "Ocultar botão do GitHub",
|
"hide-github-button": "Ocultar botão do GitHub",
|
||||||
"play-on-youtube-music": "Reproduzir no YouTube Music",
|
"play-on-youtube-music": "Reproduzir no YouTube Music",
|
||||||
"set-inactivity-timeout": "Definir tempo limite de inatividade"
|
"set-inactivity-timeout": "Definir tempo limite de inatividade",
|
||||||
|
"set-status-display-type": {
|
||||||
|
"label": "Texto de status",
|
||||||
|
"submenu": {
|
||||||
|
"artist": "Ouvindo {artist}",
|
||||||
|
"title": "Ouvindo {song title}",
|
||||||
|
"youtube-music": "Ouvindo YouTube Music"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"name": "Rich Presence do Discord",
|
"name": "Rich Presence do Discord",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
@ -600,7 +633,15 @@
|
|||||||
},
|
},
|
||||||
"navigation": {
|
"navigation": {
|
||||||
"description": "Setas de navegação para avançar/retornar diretamente integradas na interface, como no seu navegador favorito",
|
"description": "Setas de navegação para avançar/retornar diretamente integradas na interface, como no seu navegador favorito",
|
||||||
"name": "Navegação"
|
"name": "Navegação",
|
||||||
|
"templates": {
|
||||||
|
"back": {
|
||||||
|
"title": "Ir para a página anterior"
|
||||||
|
},
|
||||||
|
"forward": {
|
||||||
|
"title": "Ir para a próxima página"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"no-google-login": {
|
"no-google-login": {
|
||||||
"description": "Remova os botões e links de login do Google da interface",
|
"description": "Remova os botões e links de login do Google da interface",
|
||||||
@ -692,7 +733,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"description": "Permite alterar a qualidade do vídeo com um botão na sobreposição de vídeo",
|
"description": "Permite alterar a qualidade do vídeo com um botão na sobreposição de vídeo",
|
||||||
"name": "Alterador de qualidade do vídeo"
|
"name": "Alterador de qualidade do vídeo",
|
||||||
|
"renderer": {
|
||||||
|
"quality-settings-button": {
|
||||||
|
"label": "Abrir o player de troca de qualidade"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"scrobbler": {
|
"scrobbler": {
|
||||||
"description": "Adicionar suporte para scrobbling (last.fm, Listenbrainz, etc.)",
|
"description": "Adicionar suporte para scrobbling (last.fm, Listenbrainz, etc.)",
|
||||||
@ -859,7 +905,8 @@
|
|||||||
},
|
},
|
||||||
"name": "Alternar vídeo",
|
"name": "Alternar vídeo",
|
||||||
"templates": {
|
"templates": {
|
||||||
"button-song": "Música"
|
"button-song": "Música",
|
||||||
|
"button-video": "Vídeo"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"visualizer": {
|
"visualizer": {
|
||||||
|
|||||||
@ -2,13 +2,13 @@
|
|||||||
"common": {
|
"common": {
|
||||||
"console": {
|
"console": {
|
||||||
"plugins": {
|
"plugins": {
|
||||||
"execute-failed": "Não foi possível executar o plugin {{pluginName}}::{{contextName}}",
|
"execute-failed": "Falha ao executar o plugin {{pluginName}}::{{contextName}}",
|
||||||
"executed-at-ms": "Plugin {{pluginName}}::{{contextName}} executado em {{ms}}ms",
|
"executed-at-ms": "Plugin {{pluginName}}::{{contextName}} executado em {{ms}} ms",
|
||||||
"initialize-failed": "Não foi possível iniciar o plugin \"{{pluginName}}\"",
|
"initialize-failed": "Falha ao iniciar o plugin \"{{pluginName}}\"",
|
||||||
"load-all": "A carregar todos os plugins",
|
"load-all": "A carregar todos os plugins",
|
||||||
"load-failed": "Não foi possível ativar o plugin \"{{pluginName}}\"",
|
"load-failed": "Falha ao ativar o plugin \"{{pluginName}}\"",
|
||||||
"loaded": "Plugin \"{{pluginName}}\" ativado",
|
"loaded": "Plugin \"{{pluginName}}\" ativado",
|
||||||
"unload-failed": "Não foi possível desativar o plugin \"{{pluginName}}\"",
|
"unload-failed": "Falha ao desativar o plugin \"{{pluginName}}\"",
|
||||||
"unloaded": "Plugin \"{{pluginName}}\" desativado"
|
"unloaded": "Plugin \"{{pluginName}}\" desativado"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -36,30 +36,30 @@
|
|||||||
"details": "Erro de falta de resposta!\n{{error}}"
|
"details": "Erro de falta de resposta!\n{{error}}"
|
||||||
},
|
},
|
||||||
"when-ready": {
|
"when-ready": {
|
||||||
"clearing-cache-after-20s": "A limpar a cache da aplicação"
|
"clearing-cache-after-20s": "A limpar cache da aplicação"
|
||||||
},
|
},
|
||||||
"window": {
|
"window": {
|
||||||
"tried-to-render-offscreen": "Tentativa de desenho fora do ecrã na janela, windowSize={{windowSize}}, displaySize={{displaySize}}, position={{position}}"
|
"tried-to-render-offscreen": "Tentativa de desenho fora do ecrã na janela, tamanho da janela={{windowSize}}, tamanho do ecrã={{displaySize}}, posição={{position}}"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"dialog": {
|
"dialog": {
|
||||||
"hide-menu-enabled": {
|
"hide-menu-enabled": {
|
||||||
"detail": "O menu está oculto, utilize \"Alt\" para o mostrar (ou \"Escape\" se estiver a utilizar o menu da aplicação)",
|
"detail": "O menu está oculto, utilize \"Alt\" para o mostrar (ou \"Escape\" se estiver a utilizar o menu da aplicação)",
|
||||||
"message": "Ocultar Menu está ativado",
|
"message": "Ocultar menu está ativado",
|
||||||
"title": "Ocultar Menu ativado"
|
"title": "Ocultar menu ativado"
|
||||||
},
|
},
|
||||||
"need-to-restart": {
|
"need-to-restart": {
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"later": "Depois",
|
"later": "Depois",
|
||||||
"restart-now": "Reiniciar agora"
|
"restart-now": "Reiniciar agora"
|
||||||
},
|
},
|
||||||
"detail": "O plugin \"{{pluginName}}\" requer um reinício para ter efeito",
|
"detail": "Tem que reiniciar a aplicação para ativar \"{{pluginName}}\"",
|
||||||
"message": "\"{{pluginName}}\" precisa de ser reiniciado",
|
"message": "Tem que reiniciar \"{{pluginName}}\"",
|
||||||
"title": "É necessário reiniciar"
|
"title": "Tem que reiniciar"
|
||||||
},
|
},
|
||||||
"unresponsive": {
|
"unresponsive": {
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"quit": "Sair",
|
"quit": "Fechar",
|
||||||
"relaunch": "Reiniciar",
|
"relaunch": "Reiniciar",
|
||||||
"wait": "Esperar"
|
"wait": "Esperar"
|
||||||
},
|
},
|
||||||
@ -70,24 +70,24 @@
|
|||||||
"update-available": {
|
"update-available": {
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"disable": "Desativar atualizações",
|
"disable": "Desativar atualizações",
|
||||||
"download": "Transferir",
|
"download": "Descarregar",
|
||||||
"ok": "Ok"
|
"ok": "Aceitar"
|
||||||
},
|
},
|
||||||
"detail": "Está disponível uma nova versão que pode ser descarregada em {{downloadLink}}",
|
"detail": "Pode descarregar a nova versão em {{downloadLink}}",
|
||||||
"message": "Está disponível uma nova versão",
|
"message": "Está disponível uma nova versão",
|
||||||
"title": "Atualização disponível"
|
"title": "Atualização disponível"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"menu": {
|
"menu": {
|
||||||
"about": "Acerca de",
|
"about": "Acerca",
|
||||||
"navigation": {
|
"navigation": {
|
||||||
"label": "Navegação",
|
"label": "Navegação",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"copy-current-url": "Copiar URL atual",
|
"copy-current-url": "Copiar URL atual",
|
||||||
"go-back": "Retroceder",
|
"go-back": "Recuar",
|
||||||
"go-forward": "Avançar",
|
"go-forward": "Avançar",
|
||||||
"quit": "Sair",
|
"quit": "Sair",
|
||||||
"restart": "Reiniciar a aplicação"
|
"restart": "Reiniciar aplicação"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"options": {
|
"options": {
|
||||||
@ -96,11 +96,11 @@
|
|||||||
"advanced-options": {
|
"advanced-options": {
|
||||||
"label": "Opções avançadas",
|
"label": "Opções avançadas",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"auto-reset-app-cache": "Repor a cache quando a aplicação é iniciada",
|
"auto-reset-app-cache": "Repor cache ao iniciar a aplicação",
|
||||||
"disable-hardware-acceleration": "Desativar a aceleração de hardware",
|
"disable-hardware-acceleration": "Desativar aceleração por hardware",
|
||||||
"edit-config-json": "Editar config.json",
|
"edit-config-json": "Editar config.json",
|
||||||
"override-user-agent": "Substituir User-Agent",
|
"override-user-agent": "Substituir User-Agent",
|
||||||
"restart-on-config-changes": "Reiniciar após alterações de configuração",
|
"restart-on-config-changes": "Reiniciar após alterar as configurações",
|
||||||
"set-proxy": {
|
"set-proxy": {
|
||||||
"label": "Definir proxy",
|
"label": "Definir proxy",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
@ -112,51 +112,58 @@
|
|||||||
"toggle-dev-tools": "Ativar DevTools"
|
"toggle-dev-tools": "Ativar DevTools"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"always-on-top": "Sempre no topo",
|
"always-on-top": "Sempre na frente",
|
||||||
"auto-update": "Atualizações automáticas",
|
"auto-update": "Atualizações automáticas",
|
||||||
"hide-menu": {
|
"hide-menu": {
|
||||||
"dialog": {
|
"dialog": {
|
||||||
"message": "O menu será ocultado da próxima vez que abrir a aplicação, utilize [Alt] para o mostrar (ou [`] se estiver a utilizar o menu interno da aplicação)",
|
"message": "O menu será ocultado após reiniciar a aplicação. Utilize [Alt] para o mostrar (ou [`] se estiver a utilizar o menu da aplicação)",
|
||||||
"title": "Ocultar Menu ativado"
|
"title": "Ocultar menu ativado"
|
||||||
},
|
},
|
||||||
"label": "Ocultar Menu"
|
"label": "Ocultar menu"
|
||||||
},
|
},
|
||||||
"language": {
|
"language": {
|
||||||
"dialog": {
|
"dialog": {
|
||||||
"message": "O idioma será alterado após o reinício",
|
"message": "O idioma será alterado após reiniciar",
|
||||||
"title": "Idioma alterado"
|
"title": "Idioma alterado"
|
||||||
},
|
},
|
||||||
"label": "Idioma",
|
"label": "Idioma",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"to-help-translate": "Quer ajudar na tradução? Clique aqui"
|
"to-help-translate": "Deseja ajudar na tradução? Clique aqui"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resume-on-start": "Retomar a última música quando a app é iniciada",
|
"resume-on-start": "Continuar reprodução ao iniciar",
|
||||||
"single-instance-lock": "Limitar a uma única instância",
|
"single-instance-lock": "Limitar a uma instância",
|
||||||
"start-at-login": "Iniciar com o sistema",
|
"start-at-login": "Iniciar com o sistema",
|
||||||
"starting-page": {
|
"starting-page": {
|
||||||
"label": "Página inicial",
|
"label": "Página inicial",
|
||||||
"unset": "Não definida"
|
"unset": "Limpar"
|
||||||
},
|
},
|
||||||
"tray": {
|
"tray": {
|
||||||
"label": "Tabuleiro do sistema",
|
"label": "Área de notificação",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"disabled": "Desativado",
|
"disabled": "Desativada",
|
||||||
"enabled-and-hide-app": "Ativado e ocultar a aplicação",
|
"enabled-and-hide-app": "Ativado e ocultar aplicação",
|
||||||
"enabled-and-show-app": "Ativado e mostrar a aplicação",
|
"enabled-and-show-app": "Ativada e a mostrar aplicação",
|
||||||
"play-pause-on-click": "Reproduzir/Pausar ao clicar"
|
"play-pause-on-click": "Reprodução/Pausa ao clicar"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"visual-tweaks": {
|
"visual-tweaks": {
|
||||||
"label": "Ajustes visuais",
|
"label": "Ajustes visuais",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
|
"custom-window-title": {
|
||||||
|
"label": "Título de janela personalizado",
|
||||||
|
"prompt": {
|
||||||
|
"label": "Introduza um título: (deixe em branco para desativar)",
|
||||||
|
"placeholder": "Exemplo: YouTube Music"
|
||||||
|
}
|
||||||
|
},
|
||||||
"like-buttons": {
|
"like-buttons": {
|
||||||
"default": "Padrão",
|
"default": "Padrão",
|
||||||
"force-show": "Mostrar sempre",
|
"force-show": "Mostrar sempre",
|
||||||
"hide": "Esconder",
|
"hide": "Ocultar",
|
||||||
"label": "Botões do \"Gosto\""
|
"label": "Botões \"Gosto\""
|
||||||
},
|
},
|
||||||
"remove-upgrade-button": "Remover o botão de upgrade",
|
"remove-upgrade-button": "Remover botão \"Upgrade\"",
|
||||||
"theme": {
|
"theme": {
|
||||||
"dialog": {
|
"dialog": {
|
||||||
"button": {
|
"button": {
|
||||||
@ -164,11 +171,11 @@
|
|||||||
"remove": "Remover"
|
"remove": "Remover"
|
||||||
},
|
},
|
||||||
"remove-theme": "Tem a certeza de que pretende remover o tema personalizado?",
|
"remove-theme": "Tem a certeza de que pretende remover o tema personalizado?",
|
||||||
"remove-theme-message": "Isto irá remover o tema personalizado"
|
"remove-theme-message": "Irá remover o tema personalizado"
|
||||||
},
|
},
|
||||||
"label": "Tema",
|
"label": "Tema",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"import-css-file": "Importar ficheiro CSS personalizado",
|
"import-css-file": "Importar ficheiro CSS",
|
||||||
"no-theme": "Sem tema"
|
"no-theme": "Sem tema"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -179,23 +186,23 @@
|
|||||||
"plugins": {
|
"plugins": {
|
||||||
"enabled": "Ativado",
|
"enabled": "Ativado",
|
||||||
"label": "Plugins",
|
"label": "Plugins",
|
||||||
"new": "NOVO"
|
"new": "Novo"
|
||||||
},
|
},
|
||||||
"view": {
|
"view": {
|
||||||
"label": "Ver",
|
"label": "Ver",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"force-reload": "Forçar Recarregamento",
|
"force-reload": "Impor recarregamento",
|
||||||
"reload": "Recarregar",
|
"reload": "Recarregar",
|
||||||
"reset-zoom": "Tamanho real",
|
"reset-zoom": "Tamanho real",
|
||||||
"toggle-fullscreen": "Ativar ecrã inteiro",
|
"toggle-fullscreen": "Ativar ecrã completo",
|
||||||
"zoom-in": "Aumentar o zoom",
|
"zoom-in": "Ampliar",
|
||||||
"zoom-out": "Diminuir o zoom"
|
"zoom-out": "Reduzir"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"tray": {
|
"tray": {
|
||||||
"next": "Próxima",
|
"next": "Seguinte",
|
||||||
"play-pause": "Reproduzir/Pausar",
|
"play-pause": "Reprodução/Pausa",
|
||||||
"previous": "Anterior",
|
"previous": "Anterior",
|
||||||
"quit": "Sair",
|
"quit": "Sair",
|
||||||
"restart": "Reiniciar aplicação",
|
"restart": "Reiniciar aplicação",
|
||||||
@ -209,24 +216,24 @@
|
|||||||
"plugins": {
|
"plugins": {
|
||||||
"ad-speedup": {
|
"ad-speedup": {
|
||||||
"description": "Se um anúncio for reproduzido, silencia o áudio e define a velocidade de reprodução para 16x",
|
"description": "Se um anúncio for reproduzido, silencia o áudio e define a velocidade de reprodução para 16x",
|
||||||
"name": "Acelerar os anúncios"
|
"name": "Acelerador de anúncios"
|
||||||
},
|
},
|
||||||
"adblocker": {
|
"adblocker": {
|
||||||
"description": "Bloqueie todos os anúncios e monitorização automaticamente",
|
"description": "Bloquear anúncios e monitorização",
|
||||||
"menu": {
|
"menu": {
|
||||||
"blocker": "Bloqueador"
|
"blocker": "Bloqueador"
|
||||||
},
|
},
|
||||||
"name": "Bloqueador de anúncios"
|
"name": "Bloqueador de anúncios"
|
||||||
},
|
},
|
||||||
"album-actions": {
|
"album-actions": {
|
||||||
"description": "Adiciona os botões Anular Rejeição, Não Gostei, Gostei e Anular o Gosto para ser aplicado a todas as músicas de uma lista de reprodução ou álbum",
|
"description": "Adiciona os botões \"Anular Não gosto\", \"Não gosto\", \"Gosto\" e \"Não gosto\" para aplicar a todas as músicas de uma lista de reprodução ou álbum",
|
||||||
"name": "Ações no álbum"
|
"name": "Ações do álbum"
|
||||||
},
|
},
|
||||||
"album-color-theme": {
|
"album-color-theme": {
|
||||||
"description": "Aplica um tema dinâmico e efeitos visuais baseados na paleta de cores do álbum",
|
"description": "Aplica um tema dinâmico e efeitos visuais baseados na paleta de cores do álbum",
|
||||||
"menu": {
|
"menu": {
|
||||||
"color-mix-ratio": {
|
"color-mix-ratio": {
|
||||||
"label": "Proporção de mistura de cores",
|
"label": "Rácio de mistura de cores",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"percent": "{{ratio}}%"
|
"percent": "{{ratio}}%"
|
||||||
}
|
}
|
||||||
@ -235,12 +242,12 @@
|
|||||||
"name": "Tema de cores do álbum"
|
"name": "Tema de cores do álbum"
|
||||||
},
|
},
|
||||||
"ambient-mode": {
|
"ambient-mode": {
|
||||||
"description": "Aplica um efeito de iluminação, projetando cores suaves do vídeo no fundo do ecrã",
|
"description": "Aplica um efeito de iluminação, projetando cores suaves do vídeo para o fundo do ecrã",
|
||||||
"menu": {
|
"menu": {
|
||||||
"blur-amount": {
|
"blur-amount": {
|
||||||
"label": "Quantidade de desfoque",
|
"label": "Quantidade de desfoque",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"pixels": "{{blurAmount}} píxeis"
|
"pixels": "{{blurAmount}} pixéis"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"buffer": {
|
"buffer": {
|
||||||
@ -258,7 +265,7 @@
|
|||||||
"quality": {
|
"quality": {
|
||||||
"label": "Qualidade",
|
"label": "Qualidade",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"pixels": "{{quality}} píxeis"
|
"pixels": "{{quality}} pixéis"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"size": {
|
"size": {
|
||||||
@ -270,29 +277,29 @@
|
|||||||
"smoothness-transition": {
|
"smoothness-transition": {
|
||||||
"label": "Transição suave",
|
"label": "Transição suave",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"during": "Durante {{interpolationTime}}s"
|
"during": "Durante {{interpolationTime}} s"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"use-fullscreen": {
|
"use-fullscreen": {
|
||||||
"label": "Utilizar o ecrã inteiro"
|
"label": "Utilizar ecrã completo"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"name": "Modo Ambiente"
|
"name": "Modo ambiente"
|
||||||
},
|
},
|
||||||
"amuse": {
|
"amuse": {
|
||||||
"description": "Adiciona suporte ao YouTube Music para o widget Amuse now playing da 6K Labs",
|
"description": "Adiciona suporte ao YouTube Music para o widget Amuse now playing de 6K Labs",
|
||||||
"name": "Amuse",
|
"name": "Amuse",
|
||||||
"response": {
|
"response": {
|
||||||
"query": "O servidor da API Amuse está a ser executado. GET /query para obter informações sobre uma música."
|
"query": "O servidor da API Amuse está a ser executado. GET/query para obter informações sobre a faixa."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"api-server": {
|
"api-server": {
|
||||||
"description": "Adiciona um servidor API para controlar o leitor",
|
"description": "Adiciona um servidor API para controlar o reprodutor",
|
||||||
"dialog": {
|
"dialog": {
|
||||||
"request": {
|
"request": {
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"allow": "Permitir",
|
"allow": "Permitir",
|
||||||
"deny": "Negar"
|
"deny": "Recusar"
|
||||||
},
|
},
|
||||||
"message": "Permitir que {{ID}} ({{origin}}) aceda à API?",
|
"message": "Permitir que {{ID}} ({{origin}}) aceda à API?",
|
||||||
"title": "Pedido de autorização da API"
|
"title": "Pedido de autorização da API"
|
||||||
@ -330,30 +337,30 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"audio-compressor": {
|
"audio-compressor": {
|
||||||
"description": "Aplicar compressão ao áudio (diminui o volume das partes mais altas do sinal e aumenta o volume das partes mais suaves)",
|
"description": "Aplicar compressão ao áudio (diminui o volume nas partes mais altas do sinal e aumenta o volume nas partes mais suaves)",
|
||||||
"name": "Compressor de Áudio"
|
"name": "Compressor de áudio"
|
||||||
},
|
},
|
||||||
"auth-proxy-adapter": {
|
"auth-proxy-adapter": {
|
||||||
"description": "Suporte para o uso de serviços de proxy de autenticação",
|
"description": "Suporte para serviços de proxy de autenticação",
|
||||||
"menu": {
|
"menu": {
|
||||||
"disable": "Desativar adaptador proxy",
|
"disable": "Desativar adaptador proxy",
|
||||||
"enable": "Ativar adaptador proxy",
|
"enable": "Ativar adaptador proxy",
|
||||||
"hostname": {
|
"hostname": {
|
||||||
"label": "Nome do host"
|
"label": "Nome do anfitrião"
|
||||||
},
|
},
|
||||||
"port": {
|
"port": {
|
||||||
"label": "Porta"
|
"label": "Porta"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"name": "Adaptador de proxy de autenticação",
|
"name": "Adaptador do proxy de autenticação",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
"hostname": {
|
"hostname": {
|
||||||
"label": "Digite o nome do host para o servidor proxy local (requer reinicialização):",
|
"label": "Introduza o nome do anfitrião para o servidor proxy local (tem que reiniciar):",
|
||||||
"title": "Nome do host do proxy"
|
"title": "Nome do anfitrião do proxy"
|
||||||
},
|
},
|
||||||
"port": {
|
"port": {
|
||||||
"label": "Digite a porta para o servidor proxy local (requer reinicialização):",
|
"label": "Introduza a porta para o servidor proxy local (tem que reiniciar):",
|
||||||
"title": "Porta Proxy"
|
"title": "Porta do proxy"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -362,42 +369,47 @@
|
|||||||
"name": "Barra de navegação desfocada"
|
"name": "Barra de navegação desfocada"
|
||||||
},
|
},
|
||||||
"bypass-age-restrictions": {
|
"bypass-age-restrictions": {
|
||||||
"description": "Ignorar a verificação de idade do YouTube",
|
"description": "Ignorar verificação de idade do YouTube",
|
||||||
"name": "Ignorar restrições de idade"
|
"name": "Ignorar restrições de idade"
|
||||||
},
|
},
|
||||||
"captions-selector": {
|
"captions-selector": {
|
||||||
"description": "Seletor de legendas para as faixas de áudio do YouTube Music",
|
"description": "Seletor de legendas para as faixas de áudio do YouTube Music",
|
||||||
"menu": {
|
"menu": {
|
||||||
"autoload": "Selecionar automaticamente a última legenda utilizada",
|
"autoload": "Selecionar automaticamente a última legenda utilizada",
|
||||||
"disable-captions": "Sem legendas por defeito"
|
"disable-captions": "Sem legendas por omissão"
|
||||||
},
|
},
|
||||||
"name": "Seletor de legendas",
|
"name": "Seletor de legendas",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
"selector": {
|
"selector": {
|
||||||
"label": "Idioma atual das legendas: {{language}}",
|
"label": "Idioma atual da legenda: {{language}}",
|
||||||
"none": "Nenhuma",
|
"none": "Nenhum",
|
||||||
"title": "Selecione o idioma das legendas"
|
"title": "Selecione o idioma da legenda"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"templates": {
|
"templates": {
|
||||||
"title": "Abrir o seletor de legendas"
|
"title": "Abrir seletor de legendas"
|
||||||
|
},
|
||||||
|
"toast": {
|
||||||
|
"caption-changed": "Legenda alterada para {{language}}",
|
||||||
|
"caption-disabled": "Legendas desativadas",
|
||||||
|
"no-captions": "Não existem legendas para esta faixa"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"compact-sidebar": {
|
"compact-sidebar": {
|
||||||
"description": "Definir sempre a barra lateral no modo compacto",
|
"description": "Utilizar barra lateral no modo compacto",
|
||||||
"name": "Barra lateral compacta"
|
"name": "Barra lateral compacta"
|
||||||
},
|
},
|
||||||
"crossfade": {
|
"crossfade": {
|
||||||
"description": "Transição entre músicas",
|
"description": "Transição entre faixas",
|
||||||
"menu": {
|
"menu": {
|
||||||
"advanced": "Avançado"
|
"advanced": "Avançado"
|
||||||
},
|
},
|
||||||
"name": "Transição entre músicas [Beta]",
|
"name": "Transição entre faixas [Beta]",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
"options": {
|
"options": {
|
||||||
"multi-input": {
|
"multi-input": {
|
||||||
"fade-in-duration": "Duração da transição (fade-in) no início (ms)",
|
"fade-in-duration": "Duração da transição no início (ms)",
|
||||||
"fade-out-duration": "Duração da transição (fade-out) no final (ms)",
|
"fade-out-duration": "Duração da transição no fim (ms)",
|
||||||
"fade-scaling": {
|
"fade-scaling": {
|
||||||
"label": "Escala da transição",
|
"label": "Escala da transição",
|
||||||
"linear": "Linear",
|
"linear": "Linear",
|
||||||
@ -410,35 +422,35 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"disable-autoplay": {
|
"disable-autoplay": {
|
||||||
"description": "Faz com que a música comece no modo \"pausado\"",
|
"description": "Faz com que a música inicie no modo \"pausa\"",
|
||||||
"menu": {
|
"menu": {
|
||||||
"apply-once": "Aplicar apenas no arranque"
|
"apply-once": "Aplicar apenas ao iniciar"
|
||||||
},
|
},
|
||||||
"name": "Desativar reprodução automática"
|
"name": "Desativar reprodução automática"
|
||||||
},
|
},
|
||||||
"discord": {
|
"discord": {
|
||||||
"backend": {
|
"backend": {
|
||||||
"already-connected": "Tentativa de conexão com ligação já ativa",
|
"already-connected": "Tentativa de conexão com ligação já ativa",
|
||||||
"connected": "Conectado ao Discord",
|
"connected": "Conectado a Discord",
|
||||||
"disconnected": "Desconectado do Discord"
|
"disconnected": "Desconectado de Discord"
|
||||||
},
|
},
|
||||||
"description": "Mostre aos seus amigos o que está a ouvir com a Rich Presence",
|
"description": "Mostre aos seus amigos o que está a ouvir com Rich Presence",
|
||||||
"menu": {
|
"menu": {
|
||||||
"auto-reconnect": "Reconectar automaticamente",
|
"auto-reconnect": "Conexão automática",
|
||||||
"clear-activity": "Limpar atividade",
|
"clear-activity": "Limpar atividade",
|
||||||
"clear-activity-after-timeout": "Limpar atividade após o tempo limite",
|
"clear-activity-after-timeout": "Limpar atividade após o tempo limite",
|
||||||
"connected": "Conectado",
|
"connected": "Conectado",
|
||||||
"disconnected": "Desconectado",
|
"disconnected": "Desconectado",
|
||||||
"hide-duration-left": "Ocultar duração restante",
|
"hide-duration-left": "Ocultar tempo restante",
|
||||||
"hide-github-button": "Ocultar botão do GitHub",
|
"hide-github-button": "Ocultar botão GitHub",
|
||||||
"play-on-youtube-music": "Reproduzir no YouTube Music",
|
"play-on-youtube-music": "Reproduzir em YouTube Music",
|
||||||
"set-inactivity-timeout": "Definir tempo limite de inatividade"
|
"set-inactivity-timeout": "Definir tempo de inatividade"
|
||||||
},
|
},
|
||||||
"name": "Discord Rich Presence",
|
"name": "Discord Rich Presence",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
"set-inactivity-timeout": {
|
"set-inactivity-timeout": {
|
||||||
"label": "Insira o tempo limite de inatividade em segundos:",
|
"label": "Introduza o tempo limite de inatividade em segundos:",
|
||||||
"title": "Definir tempo limite de inatividade"
|
"title": "Definir tempo de inatividade"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -447,18 +459,18 @@
|
|||||||
"dialog": {
|
"dialog": {
|
||||||
"error": {
|
"error": {
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"ok": "OK"
|
"ok": "Aceitar"
|
||||||
},
|
},
|
||||||
"message": "Ah! Desculpas, o download falhou…",
|
"message": "Falha ao descarregar…",
|
||||||
"title": "Erro ao transferir!"
|
"title": "Erro ao descarregar!"
|
||||||
},
|
},
|
||||||
"start-download-playlist": {
|
"start-download-playlist": {
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"ok": "OK"
|
"ok": "Aceitar"
|
||||||
},
|
},
|
||||||
"detail": "({{playlistSize}} músicas)",
|
"detail": "({{playlistSize}} músicas)",
|
||||||
"message": "A descarregar a lista de reprodução {{playlistTitle}}",
|
"message": "A descarregar lista de reprodução {{playlistTitle}}",
|
||||||
"title": "Download iniciado"
|
"title": "Descarga iniciada"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"feedback": {
|
"feedback": {
|
||||||
@ -466,32 +478,32 @@
|
|||||||
"converting": "A converter…",
|
"converting": "A converter…",
|
||||||
"done": "Concluído: {{filePath}}",
|
"done": "Concluído: {{filePath}}",
|
||||||
"download-info": "A descarregar {{artist}} - {{title}} {{videoId}}",
|
"download-info": "A descarregar {{artist}} - {{title}} {{videoId}}",
|
||||||
"download-progress": "A transferir: {{percent}}%",
|
"download-progress": "A descarregar: {{percent}}%",
|
||||||
"downloading": "A transferir…",
|
"downloading": "A descarregar…",
|
||||||
"downloading-counter": "A transferir {{current}}/{{total}}…",
|
"downloading-counter": "A descarregar {{current}}/{{total}}…",
|
||||||
"downloading-playlist": "A descarregar a lista de reprodução \"{{playlistTitle}}\" - {{playlistSize}} músicas ({{playlistId}})",
|
"downloading-playlist": "A descarregar lista de reprodução \"{{playlistTitle}}\" - {{playlistSize}} músicas ({{playlistId}})",
|
||||||
"error-while-downloading": "Erro ao descarregar \"{{author}} - {{title}}\": {{error}}",
|
"error-while-downloading": "Erro ao descarregar \"{{author}} - {{title}}\": {{error}}",
|
||||||
"folder-already-exists": "A pasta {{playlistFolder}} já existe",
|
"folder-already-exists": "A pasta {{playlistFolder}} já existe",
|
||||||
"getting-playlist-info": "A obter informações da playlist…",
|
"getting-playlist-info": "A obter informações da lista…",
|
||||||
"loading": "A carregar…",
|
"loading": "A carregar…",
|
||||||
"playlist-has-only-one-song": "A lista de reprodução tem apenas um item, descarregando-o diretamente",
|
"playlist-has-only-one-song": "A lista de reprodução tem apenas um item, descarregar diretamente",
|
||||||
"playlist-id-not-found": "Não foi encontrado nenhum ID da lista de reprodução",
|
"playlist-id-not-found": "Não foi encontrado o ID da lista de reprodução",
|
||||||
"playlist-is-empty": "Lista de reprodução vazia",
|
"playlist-is-empty": "Lista de reprodução vazia",
|
||||||
"playlist-is-mix-or-private": "Erro ao obter informações da playlist: certifique-se de que ela não seja privada ou uma mix personalizada\n\n{{error}}",
|
"playlist-is-mix-or-private": "Erro ao obter as informações da lista: certifique-se de que não é uma lista ou mistura personalizada\n\n{{error}}",
|
||||||
"preparing-file": "A preparar o ficheiro…",
|
"preparing-file": "A preparar ficheiro…",
|
||||||
"saving": "A guardar…",
|
"saving": "A guardar…",
|
||||||
"trying-to-get-playlist-id": "A tentar obter o ID da playlist: {{playlistId}}",
|
"trying-to-get-playlist-id": "A tentar obter o ID da lista: {{playlistId}}",
|
||||||
"video-id-not-found": "Vídeo não encontrado",
|
"video-id-not-found": "Vídeo não encontrado",
|
||||||
"writing-id3": "A guardar etiquetas ID3…"
|
"writing-id3": "A guardar etiquetas ID3…"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"description": "Descarregue MP3 / fonte de áudio diretamente da interface",
|
"description": "Descarregar MP3/fonte de áudio diretamente da interface",
|
||||||
"menu": {
|
"menu": {
|
||||||
"choose-download-folder": "Escolha a pasta de download",
|
"choose-download-folder": "Escolha a pasta para a descarga",
|
||||||
"download-finish-settings": {
|
"download-finish-settings": {
|
||||||
"label": "Transferir ao terminar",
|
"label": "Descarregar ao terminar",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
"last-percent": "Depois de x por cento",
|
"last-percent": "Após uma %",
|
||||||
"last-seconds": "Últimos x segundos",
|
"last-seconds": "Últimos x segundos",
|
||||||
"title": "Configurar quando descarregar"
|
"title": "Configurar quando descarregar"
|
||||||
},
|
},
|
||||||
@ -503,11 +515,11 @@
|
|||||||
"seconds": "Segundos"
|
"seconds": "Segundos"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"download-playlist": "Descarregar playlist",
|
"download-playlist": "Descarregar lista de reprodução",
|
||||||
"presets": "Pré-configurações",
|
"presets": "Predefinições",
|
||||||
"skip-existing": "Ignorar ficheiros existentes"
|
"skip-existing": "Ignorar ficheiros existentes"
|
||||||
},
|
},
|
||||||
"name": "Downloader",
|
"name": "Descarregador",
|
||||||
"renderer": {
|
"renderer": {
|
||||||
"can-not-update-progress": "Não é possível atualizar o progresso"
|
"can-not-update-progress": "Não é possível atualizar o progresso"
|
||||||
},
|
},
|
||||||
@ -516,10 +528,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"equalizer": {
|
"equalizer": {
|
||||||
"description": "Adiciona um equalizador ao leitor",
|
"description": "Adiciona um equalizador ao reprodutor",
|
||||||
"menu": {
|
"menu": {
|
||||||
"presets": {
|
"presets": {
|
||||||
"label": "Pré-configurações",
|
"label": "Predefinições",
|
||||||
"list": {
|
"list": {
|
||||||
"bass-booster": "Amplificador de graves"
|
"bass-booster": "Amplificador de graves"
|
||||||
}
|
}
|
||||||
@ -528,18 +540,18 @@
|
|||||||
"name": "Equalizador"
|
"name": "Equalizador"
|
||||||
},
|
},
|
||||||
"exponential-volume": {
|
"exponential-volume": {
|
||||||
"description": "Torna o controlo do volume exponencial para que seja mais fácil selecionar volumes mais baixos.",
|
"description": "Controlo do volume exponencial para que seja mais fácil selecionar volumes mais baixos",
|
||||||
"name": "Volume Exponencial"
|
"name": "Volume exponencial"
|
||||||
},
|
},
|
||||||
"in-app-menu": {
|
"in-app-menu": {
|
||||||
"description": "Dá às barras de menu uma aparência sofisticada, escura ou com a cor do álbum",
|
"description": "Barras de menu com aparência sofisticada, escura ou com a cor do álbum",
|
||||||
"menu": {
|
"menu": {
|
||||||
"hide-dom-window-controls": "Ocultar os controlos da janela DOM"
|
"hide-dom-window-controls": "Ocultar controlos da janela DOM"
|
||||||
},
|
},
|
||||||
"name": "Menu da aplicação"
|
"name": "Menu da aplicação"
|
||||||
},
|
},
|
||||||
"lumiastream": {
|
"lumiastream": {
|
||||||
"description": "Adiciona suporte a Lumia Stream",
|
"description": "Adicionar suporte a Lumia Stream",
|
||||||
"name": "Lumia Stream [Beta]"
|
"name": "Lumia Stream [Beta]"
|
||||||
},
|
},
|
||||||
"lyrics-genius": {
|
"lyrics-genius": {
|
||||||
@ -553,7 +565,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"music-together": {
|
"music-together": {
|
||||||
"description": "Partilhe uma playlist com outros. Quando o anfitrião tocar uma música, todos os outros ouvirão a mesma música",
|
"description": "Partilhe uma lista de reprodução com terceiros. Sempre que o anfitrião tocar uma música, todos os outros ouvirão a mesma música",
|
||||||
"dialog": {
|
"dialog": {
|
||||||
"enter-host": "Introduza o ID do anfitrião"
|
"enter-host": "Introduza o ID do anfitrião"
|
||||||
},
|
},
|
||||||
@ -563,17 +575,17 @@
|
|||||||
"unknown-user": "Utilizador desconhecido"
|
"unknown-user": "Utilizador desconhecido"
|
||||||
},
|
},
|
||||||
"menu": {
|
"menu": {
|
||||||
"click-to-copy-id": "Copiar o ID do anfitrião",
|
"click-to-copy-id": "Copiar ID do anfitrião",
|
||||||
"close": "Fechar o Music Together",
|
"close": "Fechar Music Together",
|
||||||
"connected-users": "Utilizadores conectados",
|
"connected-users": "Utilizadores conectados",
|
||||||
"disconnect": "Desconectar Music Together",
|
"disconnect": "Desconectar Music Together",
|
||||||
"empty-user": "Sem utilizadores conectados",
|
"empty-user": "Sem utilizadores conectados",
|
||||||
"host": "Anfitrião do Music Together",
|
"host": "Anfitrião Music Together",
|
||||||
"join": "Juntar-se ao Music Together",
|
"join": "Integrar Music Together",
|
||||||
"permission": {
|
"permission": {
|
||||||
"all": "Permitir que os convidados controlem a playlist e o leitor",
|
"all": "Permitir que os convidados controlem a a lista de reprodução e o reprodutor",
|
||||||
"host-only": "Apenas o anfitrião pode controlar a playlist e o leitor",
|
"host-only": "Apenas o anfitrião pode controlar a lista de reprodução e o reprodutor",
|
||||||
"playlist": "Permitir que os convidados controlem a playlist"
|
"playlist": "Permitir que os convidados controlem a lista de reprodução"
|
||||||
},
|
},
|
||||||
"set-permission": "Alterar permissões de controlo",
|
"set-permission": "Alterar permissões de controlo",
|
||||||
"status": {
|
"status": {
|
||||||
@ -587,59 +599,67 @@
|
|||||||
"add-song-failed": "Falha ao adicionar música",
|
"add-song-failed": "Falha ao adicionar música",
|
||||||
"closed": "Music Together fechado",
|
"closed": "Music Together fechado",
|
||||||
"disconnected": "Music Together desconectado",
|
"disconnected": "Music Together desconectado",
|
||||||
"host-failed": "Falha ao hospedar o Music Together",
|
"host-failed": "Falha ao alojar Music Together",
|
||||||
"id-copied": "ID do anfitrião copiado para a Área de Transferência",
|
"id-copied": "ID do anfitrião copiado para a área de transferência",
|
||||||
"id-copy-failed": "Falha ao copiar o ID do anfitrião para a Área de Transferência",
|
"id-copy-failed": "Falha ao copiar a ID do anfitrião para a área de transferência",
|
||||||
"join-failed": "Falha ao entrar no Music Together",
|
"join-failed": "Falha ao entrar em Music Together",
|
||||||
"joined": "Entrou no Music Together",
|
"joined": "Entrou em Music Together",
|
||||||
"permission-changed": "A permissão do Music Together foi alterada para \"{{permission}}\"",
|
"permission-changed": "A permissão Music Together foi alterada para \"{{permission}}\"",
|
||||||
"remove-song-failed": "Falha ao remover música",
|
"remove-song-failed": "Falha ao remover música",
|
||||||
"user-connected": "{{name}} entrou no Music Together",
|
"user-connected": "{{name}} entrou em Music Together",
|
||||||
"user-disconnected": "{{name}} saiu do Music Together"
|
"user-disconnected": "{{name}} saiu de Music Together"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"navigation": {
|
"navigation": {
|
||||||
"description": "Setas de navegação Avançar/Retroceder integradas diretamente na interface, como no seu navegador favorito",
|
"description": "Setas de navegação Avançar/Recuar integradas na interface tal como acontece nos navegadores web",
|
||||||
"name": "Navegação"
|
"name": "Navegação",
|
||||||
|
"templates": {
|
||||||
|
"back": {
|
||||||
|
"title": "Ir para a página anterior"
|
||||||
|
},
|
||||||
|
"forward": {
|
||||||
|
"title": "Ir para a página seguinte"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"no-google-login": {
|
"no-google-login": {
|
||||||
"description": "Remove os botões de login do Google e links da interface",
|
"description": "Remove os botões de início de sessão Google e as ligações na interface",
|
||||||
"name": "Sem login do Google"
|
"name": "Sem acesso Google"
|
||||||
},
|
},
|
||||||
"notifications": {
|
"notifications": {
|
||||||
"description": "Exibir uma notificação quando uma música começar a tocar (notificações interativas estão disponíveis no Windows)",
|
"description": "Mostrar uma notificação ao iniciar a reprodução de uma música (notificações interativas em sistemas Windows)",
|
||||||
"menu": {
|
"menu": {
|
||||||
"interactive": "Notificações interativas",
|
"interactive": "Notificações interativas",
|
||||||
"interactive-settings": {
|
"interactive-settings": {
|
||||||
"label": "Definições interativas",
|
"label": "Definições interativas",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"hide-button-text": "Ocultar o texto do botão",
|
"hide-button-text": "Ocultar texto do botão",
|
||||||
"refresh-on-play-pause": "Atualizar ao reproduzir/pausar",
|
"refresh-on-play-pause": "Recarregar ao reproduzir/pausa",
|
||||||
"tray-controls": "Abrir/Fechar com um clique no tabuleiro do sistema"
|
"tray-controls": "Abrir/fechar com um clique na bandeja"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"priority": "Prioridade da notificação",
|
"priority": "Prioridade da notificação",
|
||||||
"toast-style": "Estilo da notificação",
|
"toast-style": "Estilo da notificação",
|
||||||
"unpause-notification": "Mostrar notificação ao desativar a pausa"
|
"unpause-notification": "Mostrar notificação ao retomar reprodução"
|
||||||
},
|
},
|
||||||
"name": "Notificações"
|
"name": "Notificações"
|
||||||
},
|
},
|
||||||
"performance-improvement": {
|
"performance-improvement": {
|
||||||
"description": "Melhore o desempenho habilitando scripts experimentais",
|
"description": "Melhore o desempenho ativando scripts experimentais",
|
||||||
"name": "Melhoria de desempenho [Beta]"
|
"name": "Melhoria de desempenho [Beta]"
|
||||||
},
|
},
|
||||||
"picture-in-picture": {
|
"picture-in-picture": {
|
||||||
"description": "Permite mudar a aplicação para o modo picture-in-picture",
|
"description": "Permite mudar a aplicação para o modo 'picture-in-picture'",
|
||||||
"menu": {
|
"menu": {
|
||||||
"always-on-top": "Sempre em cima",
|
"always-on-top": "Sempre na frente",
|
||||||
"hotkey": {
|
"hotkey": {
|
||||||
"label": "Tecla de atalho",
|
"label": "Tecla de atalho",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
"keybind-options": {
|
"keybind-options": {
|
||||||
"hotkey": "Tecla de atalho"
|
"hotkey": "Tecla de atalho"
|
||||||
},
|
},
|
||||||
"label": "Escolha uma tecla de atalho para ativar o picture-in-picture",
|
"label": "Escolha a tecla de atalho para ativar 'picture-in-picture'",
|
||||||
"title": "Tecla de atalho picture-in-picture"
|
"title": "Tecla de atalho 'picture-in-picture'"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"save-window-position": "Guardar posição da janela",
|
"save-window-position": "Guardar posição da janela",
|
||||||
@ -652,7 +672,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"playback-speed": {
|
"playback-speed": {
|
||||||
"description": "Ouça rápido, ouça devagar! Adiciona um controlo deslizante que controla a velocidade da música",
|
"description": "Adiciona um controlo deslizante para controlar a velocidade de reprodução",
|
||||||
"name": "Velocidade de reprodução",
|
"name": "Velocidade de reprodução",
|
||||||
"templates": {
|
"templates": {
|
||||||
"button": "Velocidade"
|
"button": "Velocidade"
|
||||||
@ -661,22 +681,22 @@
|
|||||||
"precise-volume": {
|
"precise-volume": {
|
||||||
"description": "Controle o volume com precisão utilizando a roda do rato/teclas de atalho, com um HUD personalizado e incrementos de volume personalizáveis",
|
"description": "Controle o volume com precisão utilizando a roda do rato/teclas de atalho, com um HUD personalizado e incrementos de volume personalizáveis",
|
||||||
"menu": {
|
"menu": {
|
||||||
"arrows-shortcuts": "Controlo preciso com as teclas de seta esq./dir.",
|
"arrows-shortcuts": "Controlo preciso com as teclas de seta",
|
||||||
"custom-volume-steps": "Definir incrementos de volume personalizados",
|
"custom-volume-steps": "Definir incrementos de volume",
|
||||||
"global-shortcuts": "Teclas de atalho globais"
|
"global-shortcuts": "Teclas de atalho globais"
|
||||||
},
|
},
|
||||||
"name": "Volume preciso",
|
"name": "Volume preciso",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
"global-shortcuts": {
|
"global-shortcuts": {
|
||||||
"keybind-options": {
|
"keybind-options": {
|
||||||
"decrease": "Diminuir o volume",
|
"decrease": "Diminuir volume",
|
||||||
"increase": "Aumentar o volume"
|
"increase": "Aumentar volume"
|
||||||
},
|
},
|
||||||
"label": "Escolha atalhos de teclado para o volume global:",
|
"label": "Escolha as teclas de atalho para o volume global:",
|
||||||
"title": "Atalhos de teclado para o volume global"
|
"title": "Teclas de atalho para volume global"
|
||||||
},
|
},
|
||||||
"volume-steps": {
|
"volume-steps": {
|
||||||
"label": "Escolha o tamanho dos incrementos/decrementos de volume",
|
"label": "Escolha o valor para aumentar/diminuir o volume",
|
||||||
"title": "Incrementos de volume"
|
"title": "Incrementos de volume"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -692,140 +712,145 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"description": "Permite alterar a qualidade do vídeo com um botão sobreposto ao vídeo",
|
"description": "Permite alterar a qualidade do vídeo com um botão sobreposto ao vídeo",
|
||||||
"name": "Alterador de qualidade de vídeo"
|
"name": "Comutador da qualidade de vídeo",
|
||||||
|
"renderer": {
|
||||||
|
"quality-settings-button": {
|
||||||
|
"label": "Abrir comutador de qualidade"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"scrobbler": {
|
"scrobbler": {
|
||||||
"description": "Adicionar suporte para scrobbling (last.fm, Listenbrainz, etc.)",
|
"description": "Adicionar suporte para 'scrobbling' (last.fm, Listenbrainz, etc.)",
|
||||||
"dialog": {
|
"dialog": {
|
||||||
"lastfm": {
|
"lastfm": {
|
||||||
"auth-failed": {
|
"auth-failed": {
|
||||||
"message": "Falha ao autenticar com a Last.fm\nO pop-up será ocultado até reiniciar a aplicação.",
|
"message": "Falha de autenticação em Last.fm\nA janela será ocultada até reiniciar a aplicação.",
|
||||||
"title": "Falha na autenticação"
|
"title": "Falha na autenticação"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"menu": {
|
"menu": {
|
||||||
"lastfm": {
|
"lastfm": {
|
||||||
"api-settings": "Definições da API da Last.fm"
|
"api-settings": "Definições da API Last.fm"
|
||||||
},
|
},
|
||||||
"listenbrainz": {
|
"listenbrainz": {
|
||||||
"token": "Introduza o token de utilizador do ListenBrainz"
|
"token": "Introduza o 'token' do utilizador ListenBrainz"
|
||||||
},
|
},
|
||||||
"scrobble-alternative-title": "Usar títulos alternativos",
|
"scrobble-alternative-title": "Utilizar títulos alternativos",
|
||||||
"scrobble-other-media": "Scrobble de outros conteúdos"
|
"scrobble-other-media": "Scrobble de outros conteúdos"
|
||||||
},
|
},
|
||||||
"name": "Scrobbler",
|
"name": "Scrobbler",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
"lastfm": {
|
"lastfm": {
|
||||||
"api-key": "Chave da API da Last.fm",
|
"api-key": "Chave da API Last.fm",
|
||||||
"api-secret": "Segredo da API da Last.fm"
|
"api-secret": "Segredo da API Last.fm"
|
||||||
},
|
},
|
||||||
"listenbrainz": {
|
"listenbrainz": {
|
||||||
"token": {
|
"token": {
|
||||||
"label": "Introduza o seu token de utilizador ListenBrainz:",
|
"label": "Introduza o 'token' do utilizador ListenBrainz:",
|
||||||
"title": "Token ListenBrainz"
|
"title": "Token ListenBrainz"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"shortcuts": {
|
"shortcuts": {
|
||||||
"description": "Permite definir teclas de atalho globais para a reprodução (reproduzir/pausar/próximo/anterior) e desativar o OSD multimédia substituindo as teclas multimédia, ativar Ctrl/CMD + F para pesquisar, ativar o suporte Linux MPRIS para teclas multimédia e teclas de atalho personalizadas para utilizadores avançados",
|
"description": "Permite definir teclas de atalho globais para a reprodução (reproduzir/pausa/seguinte/anterior) e desativar o OSD, substituindo as teclas multimédia e ativando Ctrl/CMD + F para pesquisar, o suporte Linux MPRIS para teclas multimédia e teclas de atalho personalizadas para utilizadores avançados",
|
||||||
"menu": {
|
"menu": {
|
||||||
"override-media-keys": "Substituir as teclas de multimédia",
|
"override-media-keys": "Substituir teclas multimédia",
|
||||||
"set-keybinds": "Definir controlos globais para a música"
|
"set-keybinds": "Definir controlos globais para a música"
|
||||||
},
|
},
|
||||||
"name": "Atalhos (& MPRIS)",
|
"name": "Atalhos (& MPRIS)",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
"keybind": {
|
"keybind": {
|
||||||
"keybind-options": {
|
"keybind-options": {
|
||||||
"next": "Próximo",
|
"next": "Seguinte",
|
||||||
"play-pause": "Reproduzir / Pausar",
|
"play-pause": "Reproduzir/Pausa",
|
||||||
"previous": "Anterior"
|
"previous": "Anterior"
|
||||||
},
|
},
|
||||||
"label": "Escolha teclas globais para o controlo da música:",
|
"label": "Escolha as teclas globais para o controlo de músicas:",
|
||||||
"title": "Atalhos globais do teclado"
|
"title": "Atalhos globais do teclado"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"skip-disliked-songs": {
|
"skip-disliked-songs": {
|
||||||
"description": "Salta as canções de que não gosta",
|
"description": "Ignorar músicas de que não gostei",
|
||||||
"name": "Saltar músicas que não gostei"
|
"name": "Ignorar músicas não gostadas"
|
||||||
},
|
},
|
||||||
"skip-silences": {
|
"skip-silences": {
|
||||||
"description": "Saltar automaticamente as partes silenciosas das canções",
|
"description": "Ignorar automaticamente as partes silenciosas das músicas",
|
||||||
"name": "Saltar silêncios"
|
"name": "Ignorar silêncio"
|
||||||
},
|
},
|
||||||
"sponsorblock": {
|
"sponsorblock": {
|
||||||
"description": "Salta automaticamente partes que não são música, como a intro/outro ou partes de vídeos de música em que a música não está a ser reproduzida",
|
"description": "Ignorar automaticamente partes que não são música, como a introdução e outras partes dos vídeos em que a música não está a ser reproduzida",
|
||||||
"name": "SponsorBlock"
|
"name": "SponsorBlock"
|
||||||
},
|
},
|
||||||
"synced-lyrics": {
|
"synced-lyrics": {
|
||||||
"description": "Fornece letras de músicas sincronizadas, utilizando fornecedores como o LRClib.",
|
"description": "Disponibiliza letras de músicas sincronizadas, utilizando fornecedores como o LRClib",
|
||||||
"errors": {
|
"errors": {
|
||||||
"fetch": "⚠️ Ocorreu um erro ao obter a letra da música.\n\tPor favor, tente novamente mais tarde.",
|
"fetch": "⚠️\tOcorreu um erro ao obter a letrad da música.\n\tPor favor tente mais tarde.",
|
||||||
"not-found": "⚠️ Não foram encontradas letras para esta canção."
|
"not-found": "⚠️ Não foram encontradas letras para esta música."
|
||||||
},
|
},
|
||||||
"menu": {
|
"menu": {
|
||||||
"default-text-string": {
|
"default-text-string": {
|
||||||
"label": "Carácter predefinido entre letras",
|
"label": "Carácter padrão entre letras",
|
||||||
"tooltip": "Escolha o carácter predefinido a utilizar para o intervalo entre letras"
|
"tooltip": "Escolha o carácter padrão a utilizar para o intervalo entre as letras"
|
||||||
},
|
},
|
||||||
"line-effect": {
|
"line-effect": {
|
||||||
"label": "Efeito da linha",
|
"label": "Efeito da linha",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"fancy": {
|
"fancy": {
|
||||||
"label": "Elegante",
|
"label": "Elegante",
|
||||||
"tooltip": "Utilizar grandes efeitos semelhantes aos da aplicação na linha atual"
|
"tooltip": "Utilizar grandes efeitos semelhantes aos da aplicação (na linha atual)"
|
||||||
},
|
},
|
||||||
"focus": {
|
"focus": {
|
||||||
"label": "Foco",
|
"label": "Foco",
|
||||||
"tooltip": "Tornar branca apenas a linha atual"
|
"tooltip": "Definir apenas a linha atual como branca"
|
||||||
},
|
},
|
||||||
"offset": {
|
"offset": {
|
||||||
"label": "Deslocamento",
|
"label": "Deslocação",
|
||||||
"tooltip": "Desloque a linha atual para a direita"
|
"tooltip": "Deslocação à direita da linha atual"
|
||||||
},
|
},
|
||||||
"scale": {
|
"scale": {
|
||||||
"label": "Escala",
|
"label": "Escala",
|
||||||
"tooltip": "Escalar a linha atual"
|
"tooltip": "Ajustar linha atual"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"tooltip": "Escolha o efeito a ser aplicado à linha atual"
|
"tooltip": "Escolha o efeito para aplicar à linha atual"
|
||||||
},
|
},
|
||||||
"precise-timing": {
|
"precise-timing": {
|
||||||
"label": "Fazer com que as letras estejam perfeitamente sincronizadas",
|
"label": "Sincronização perfeita da entre letra e música",
|
||||||
"tooltip": "Calcular ao milissegundo a visualização da linha seguinte (pode ter um pequeno impacto no desempenho)"
|
"tooltip": "Calcular, ao milissegundo, a exibição da linha seguinte (pode ter um pequeno impacto no desempenho)"
|
||||||
},
|
},
|
||||||
"romanization": {
|
"romanization": {
|
||||||
"label": "Letras Romanas",
|
"label": "Letras romanas",
|
||||||
"tooltip": "Se as letras estiverem numa linguagem diferente, tente mostrar uma versão em latim."
|
"tooltip": "Se as letras estiverem num idioma diferente, tentar mostrar uma versão em latim"
|
||||||
},
|
},
|
||||||
"show-lyrics-even-if-inexact": {
|
"show-lyrics-even-if-inexact": {
|
||||||
"label": "Mostrar as letras, mesmo que sejam imprecisas",
|
"label": "Mostrar letras, mesmo que imprecisas",
|
||||||
"tooltip": "Se a música não for encontrada, o plugin tenta novamente com uma consulta de pesquisa diferente.\nO resultado da segunda tentativa pode não ser exato."
|
"tooltip": "Se a música não for encontrada, o plugin tenta novamente com uma consulta de pesquisa diferente.\nO resultado da segunda tentativa pode não ser exato."
|
||||||
},
|
},
|
||||||
"show-time-codes": {
|
"show-time-codes": {
|
||||||
"label": "Mostrar códigos de tempo",
|
"label": "Mostrar códigos temporais",
|
||||||
"tooltip": "Mostrar os códigos de tempo ao lado das letras"
|
"tooltip": "Mostrar códigos temporais ao lado das letras"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"name": "Letras Sincronizadas",
|
"name": "Letras sincronizadas",
|
||||||
"refetch-btn": {
|
"refetch-btn": {
|
||||||
"fetching": "A obter...",
|
"fetching": "A obter...",
|
||||||
"normal": "Buscar as letras novamente"
|
"normal": "Tentar nova obtenção"
|
||||||
},
|
},
|
||||||
"warnings": {
|
"warnings": {
|
||||||
"duration-mismatch": "⚠️ - A letra da música pode estar dessincronizada devido a um erro de duração.",
|
"duration-mismatch": "⚠️ - A letra da música pode não estar corretamente sincronizada devido a um erro de duração.",
|
||||||
"inexact": "⚠️ - A letra desta canção pode não ser exata",
|
"inexact": "⚠️ - A letra desta canção pode não ser exata",
|
||||||
"instrumental": "⚠️ - Esta é uma música instrumental"
|
"instrumental": "⚠️ - Esta é uma música instrumental"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"taskbar-mediacontrol": {
|
"taskbar-mediacontrol": {
|
||||||
"description": "Controle a reprodução a partir da barra de tarefas do Windows",
|
"description": "Controlar reprodução a partir da barra de tarefas do Windows",
|
||||||
"name": "Controlo multimédia da barra de tarefas"
|
"name": "Controlo multimédia na barra de tarefas"
|
||||||
},
|
},
|
||||||
"touchbar": {
|
"touchbar": {
|
||||||
"description": "Adiciona um widget TouchBar para utilizadores do macOS",
|
"description": "Adicionar widget TouchBar para utilizadores macOS",
|
||||||
"name": "TouchBar"
|
"name": "TouchBar"
|
||||||
},
|
},
|
||||||
"tuna-obs": {
|
"tuna-obs": {
|
||||||
@ -833,11 +858,11 @@
|
|||||||
"name": "Tuna OBS"
|
"name": "Tuna OBS"
|
||||||
},
|
},
|
||||||
"unobtrusive-player": {
|
"unobtrusive-player": {
|
||||||
"description": "Previne o programa de aparecer enquanto toca uma música",
|
"description": "Impede o aparecimento do reprodutor durante a reprodução",
|
||||||
"name": "Reprodutor não obstrutivo"
|
"name": "Reprodutor discreto"
|
||||||
},
|
},
|
||||||
"video-toggle": {
|
"video-toggle": {
|
||||||
"description": "Adiciona um botão para alternar entre o modo Vídeo/ Música. Opcionalmente, também pode remover completamente o separador do vídeo",
|
"description": "Adiciona um botão para alternar entre o modo Vídeo/Música. Opcionalmente, também pode remover completamente o separador de vídeo",
|
||||||
"menu": {
|
"menu": {
|
||||||
"align": {
|
"align": {
|
||||||
"label": "Alinhamento",
|
"label": "Alinhamento",
|
||||||
@ -847,23 +872,24 @@
|
|||||||
"right": "Direita"
|
"right": "Direita"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"force-hide": "Forçar a remoção do separador de vídeo",
|
"force-hide": "Remover separador de vídeo",
|
||||||
"mode": {
|
"mode": {
|
||||||
"label": "Modo",
|
"label": "Modo",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"custom": "Alternar personalizado",
|
"custom": "Ativar modo personalizado",
|
||||||
"disabled": "Desativado",
|
"disabled": "Desativado",
|
||||||
"native": "Alternar nativo"
|
"native": "Ativar modo nativo"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"name": "Botão de Alternar Vídeo",
|
"name": "Alternância de vídeo",
|
||||||
"templates": {
|
"templates": {
|
||||||
"button-song": "Música"
|
"button-song": "Música",
|
||||||
|
"button-video": "Vídeo"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"visualizer": {
|
"visualizer": {
|
||||||
"description": "Adiciona um visualizador ao leitor",
|
"description": "Adiciona um visualizador ao reprodutor",
|
||||||
"menu": {
|
"menu": {
|
||||||
"visualizer-type": "Tipo de visualizador"
|
"visualizer-type": "Tipo de visualizador"
|
||||||
},
|
},
|
||||||
|
|||||||
@ -150,6 +150,13 @@
|
|||||||
"visual-tweaks": {
|
"visual-tweaks": {
|
||||||
"label": "Modificări Vizuale",
|
"label": "Modificări Vizuale",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
|
"custom-window-title": {
|
||||||
|
"label": "Titlul ferestrei personalizate",
|
||||||
|
"prompt": {
|
||||||
|
"label": "Introduceți titlul ferestrei personalizate: (lăsați gol pentru a dezactiva)",
|
||||||
|
"placeholder": "Exemplu: Youtube Music"
|
||||||
|
}
|
||||||
|
},
|
||||||
"like-buttons": {
|
"like-buttons": {
|
||||||
"default": "Default",
|
"default": "Default",
|
||||||
"force-show": "Forțează randarea",
|
"force-show": "Forțează randarea",
|
||||||
@ -381,6 +388,11 @@
|
|||||||
},
|
},
|
||||||
"templates": {
|
"templates": {
|
||||||
"title": "Deschide selectorul de subtitrări"
|
"title": "Deschide selectorul de subtitrări"
|
||||||
|
},
|
||||||
|
"toast": {
|
||||||
|
"caption-changed": "Subtitrare schimbata in {{language}}",
|
||||||
|
"caption-disabled": "Subtitrari dezactivate",
|
||||||
|
"no-captions": "Nu exista subtitrari disponibile pentru aceasta piesa"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"compact-sidebar": {
|
"compact-sidebar": {
|
||||||
@ -600,7 +612,15 @@
|
|||||||
},
|
},
|
||||||
"navigation": {
|
"navigation": {
|
||||||
"description": "Săgețile pentru Următorul/Anteriorul integrate direct în interfață, ca în browser-ul tău preferat",
|
"description": "Săgețile pentru Următorul/Anteriorul integrate direct în interfață, ca în browser-ul tău preferat",
|
||||||
"name": "Navigație"
|
"name": "Navigație",
|
||||||
|
"templates": {
|
||||||
|
"back": {
|
||||||
|
"title": "Inapoi la pagina anterioara"
|
||||||
|
},
|
||||||
|
"forward": {
|
||||||
|
"title": "Urmatoarea pagina"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"no-google-login": {
|
"no-google-login": {
|
||||||
"description": "Elimină butonul de autentificare Google și link-urile din interfață",
|
"description": "Elimină butonul de autentificare Google și link-urile din interfață",
|
||||||
@ -859,7 +879,8 @@
|
|||||||
},
|
},
|
||||||
"name": "Comutator video",
|
"name": "Comutator video",
|
||||||
"templates": {
|
"templates": {
|
||||||
"button-song": "Melodie"
|
"button-song": "Melodie",
|
||||||
|
"button-video": "Video"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"visualizer": {
|
"visualizer": {
|
||||||
|
|||||||
@ -21,7 +21,7 @@
|
|||||||
"main": {
|
"main": {
|
||||||
"console": {
|
"console": {
|
||||||
"did-finish-load": {
|
"did-finish-load": {
|
||||||
"dev-tools": "Загрузка завершена. DevTools открыт"
|
"dev-tools": "Загрузка завершена. DevTools открыты"
|
||||||
},
|
},
|
||||||
"i18n": {
|
"i18n": {
|
||||||
"loaded": "i18n загружен"
|
"loaded": "i18n загружен"
|
||||||
@ -150,6 +150,13 @@
|
|||||||
"visual-tweaks": {
|
"visual-tweaks": {
|
||||||
"label": "Визуальные настройки",
|
"label": "Визуальные настройки",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
|
"custom-window-title": {
|
||||||
|
"label": "Собственное название окна",
|
||||||
|
"prompt": {
|
||||||
|
"label": "Введите собственное название окна: (оставьте пустым, чтобы отключить)",
|
||||||
|
"placeholder": "Например: YouTube Music"
|
||||||
|
}
|
||||||
|
},
|
||||||
"like-buttons": {
|
"like-buttons": {
|
||||||
"default": "Default",
|
"default": "Default",
|
||||||
"force-show": "Всегда показывать",
|
"force-show": "Всегда показывать",
|
||||||
@ -414,6 +421,19 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"custom-output-device": {
|
||||||
|
"description": "Настройка устройства вывода медиа для песен",
|
||||||
|
"menu": {
|
||||||
|
"device-selector": "Выберите устройство"
|
||||||
|
},
|
||||||
|
"name": "Пользовательское устройство вывода",
|
||||||
|
"prompt": {
|
||||||
|
"device-selector": {
|
||||||
|
"label": "Выберите устройство вывода медиа, которое будет использоваться",
|
||||||
|
"title": "Выберите устройство вывода"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"disable-autoplay": {
|
"disable-autoplay": {
|
||||||
"description": "Запускает песню сразу на паузе",
|
"description": "Запускает песню сразу на паузе",
|
||||||
"menu": {
|
"menu": {
|
||||||
@ -437,7 +457,15 @@
|
|||||||
"hide-duration-left": "Скрыть сколько осталось времени",
|
"hide-duration-left": "Скрыть сколько осталось времени",
|
||||||
"hide-github-button": "Скрыть ссылку на GitHub",
|
"hide-github-button": "Скрыть ссылку на GitHub",
|
||||||
"play-on-youtube-music": "Воспроизвести на YouTube Music",
|
"play-on-youtube-music": "Воспроизвести на YouTube Music",
|
||||||
"set-inactivity-timeout": "Поставить таймер неактивности"
|
"set-inactivity-timeout": "Поставить таймер неактивности",
|
||||||
|
"set-status-display-type": {
|
||||||
|
"label": "Текст статуса",
|
||||||
|
"submenu": {
|
||||||
|
"artist": "Слушает {исполнитель}",
|
||||||
|
"title": "Слушает {название трека}",
|
||||||
|
"youtube-music": "Слушает YouTube Music"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"name": "Discord Rich Presence",
|
"name": "Discord Rich Presence",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
@ -729,6 +757,7 @@
|
|||||||
"listenbrainz": {
|
"listenbrainz": {
|
||||||
"token": "Введите токен пользователя ListenBrainz"
|
"token": "Введите токен пользователя ListenBrainz"
|
||||||
},
|
},
|
||||||
|
"scrobble-alternative-artist": "Использовать альтернативных исполнителей",
|
||||||
"scrobble-alternative-title": "Использовать альтернативные названия",
|
"scrobble-alternative-title": "Использовать альтернативные названия",
|
||||||
"scrobble-other-media": "Скробблинг других медиа"
|
"scrobble-other-media": "Скробблинг других медиа"
|
||||||
},
|
},
|
||||||
@ -846,6 +875,27 @@
|
|||||||
"description": "Добавляет виджет тачбара для пользователей macOS",
|
"description": "Добавляет виджет тачбара для пользователей macOS",
|
||||||
"name": "Тачбар"
|
"name": "Тачбар"
|
||||||
},
|
},
|
||||||
|
"transparent-player": {
|
||||||
|
"description": "Делает окно приложения прозрачным",
|
||||||
|
"menu": {
|
||||||
|
"opacity": {
|
||||||
|
"label": "Непрозрачность",
|
||||||
|
"submenu": {
|
||||||
|
"percent": "{{opacity}}%"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"label": "Тип",
|
||||||
|
"submenu": {
|
||||||
|
"acrylic": "Acrylic",
|
||||||
|
"mica": "Mica",
|
||||||
|
"none": "Отключено",
|
||||||
|
"tabbed": "Tabbed"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "Прозрачный плеер"
|
||||||
|
},
|
||||||
"tuna-obs": {
|
"tuna-obs": {
|
||||||
"description": "Интеграция с плагином Tuna от OBS",
|
"description": "Интеграция с плагином Tuna от OBS",
|
||||||
"name": "Tuna OBS"
|
"name": "Tuna OBS"
|
||||||
|
|||||||
10
src/i18n/resources/sq.json
Normal file
10
src/i18n/resources/sq.json
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"common": {
|
||||||
|
"console": {
|
||||||
|
"plugins": {
|
||||||
|
"execute-failed": "Dështoi në ekzekutimin e plugin-it {{pluginName}}::{{contextName}}",
|
||||||
|
"executed-at-ms": "Shtojca {{pluginName}}::{{contextName}} u ekzekutua në {{ms}}ms"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -132,7 +132,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resume-on-start": "Nastavi trenutnu numeru pri sledećem pokretanju",
|
"resume-on-start": "Nastavi trenutnu numeru pri sledećem pokretanju",
|
||||||
"single-instance-lock": "Jedna instanca aplikacije",
|
"single-instance-lock": "Sprečavanje višestrukog pokretanja",
|
||||||
"start-at-login": "Pokreni po prijavi u sistem",
|
"start-at-login": "Pokreni po prijavi u sistem",
|
||||||
"starting-page": {
|
"starting-page": {
|
||||||
"label": "Početna strana",
|
"label": "Početna strana",
|
||||||
@ -150,6 +150,13 @@
|
|||||||
"visual-tweaks": {
|
"visual-tweaks": {
|
||||||
"label": "Vizuelna podešavanja",
|
"label": "Vizuelna podešavanja",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
|
"custom-window-title": {
|
||||||
|
"label": "Prilagođeni naziv prozora",
|
||||||
|
"prompt": {
|
||||||
|
"label": "Unesite prilagođeni naslov prozora: (ostavite prazno da onemogućite)",
|
||||||
|
"placeholder": "Primer: YouTube Muzika"
|
||||||
|
}
|
||||||
|
},
|
||||||
"like-buttons": {
|
"like-buttons": {
|
||||||
"default": "Podrazumevano",
|
"default": "Podrazumevano",
|
||||||
"force-show": "Prinudno prikaži",
|
"force-show": "Prinudno prikaži",
|
||||||
@ -281,7 +288,7 @@
|
|||||||
},
|
},
|
||||||
"amuse": {
|
"amuse": {
|
||||||
"description": "Dodaje podršku za 'Amuse now' vidžet (6K Labs) u YouTube Muziku",
|
"description": "Dodaje podršku za 'Amuse now' vidžet (6K Labs) u YouTube Muziku",
|
||||||
"name": "Amuse",
|
"name": "Zabavi",
|
||||||
"response": {
|
"response": {
|
||||||
"query": "Amuse API server je pokrenut. Koristite GET /query da biste dobili informacije o numeri."
|
"query": "Amuse API server je pokrenut. Koristite GET /query da biste dobili informacije o numeri."
|
||||||
}
|
}
|
||||||
@ -439,7 +446,7 @@
|
|||||||
"play-on-youtube-music": "Reprodukuj na YouTube Muzici",
|
"play-on-youtube-music": "Reprodukuj na YouTube Muzici",
|
||||||
"set-inactivity-timeout": "Podesi tajmer za neaktivnost"
|
"set-inactivity-timeout": "Podesi tajmer za neaktivnost"
|
||||||
},
|
},
|
||||||
"name": "Discord Rich Presence",
|
"name": "Discord Bogato Prisustvo",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
"set-inactivity-timeout": {
|
"set-inactivity-timeout": {
|
||||||
"label": "Unesi vreme za tajmer neaktivnosti u sekundama:",
|
"label": "Unesi vreme za tajmer neaktivnosti u sekundama:",
|
||||||
@ -713,7 +720,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"scrobbler": {
|
"scrobbler": {
|
||||||
"description": "Dodaj podršku za 'scrobbling' (poput last.fm, Listenbrainz)",
|
"description": "Dodaj podršku za 'četkanje' (poput last.fm, Listenbrainz)",
|
||||||
"dialog": {
|
"dialog": {
|
||||||
"lastfm": {
|
"lastfm": {
|
||||||
"auth-failed": {
|
"auth-failed": {
|
||||||
@ -727,21 +734,21 @@
|
|||||||
"api-settings": "Podešavanja za Last.fm API"
|
"api-settings": "Podešavanja za Last.fm API"
|
||||||
},
|
},
|
||||||
"listenbrainz": {
|
"listenbrainz": {
|
||||||
"token": "Unesi korisnički token za ListenBrainz"
|
"token": "Unesi korisnički žeton za ListenBrainz"
|
||||||
},
|
},
|
||||||
"scrobble-alternative-title": "Koristi alternativne naslove",
|
"scrobble-alternative-title": "Koristi alternativne naslove",
|
||||||
"scrobble-other-media": "'Scrobble'-uj druge medije"
|
"scrobble-other-media": "Učetkaj druge medije"
|
||||||
},
|
},
|
||||||
"name": "Scrobbler",
|
"name": "Četkarnik",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
"lastfm": {
|
"lastfm": {
|
||||||
"api-key": "Last.fm API ključ",
|
"api-key": "Last.fm API ključ",
|
||||||
"api-secret": "Last.fm API tajna (secret)"
|
"api-secret": "Last.fm API tajna"
|
||||||
},
|
},
|
||||||
"listenbrainz": {
|
"listenbrainz": {
|
||||||
"token": {
|
"token": {
|
||||||
"label": "Unesi svoj ListenBrainz korisnički token:",
|
"label": "Unesi svoj ListenBrainz korisnički žeton:",
|
||||||
"title": "ListenBrainz token"
|
"title": "ListenBrainz žeton"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -750,7 +757,7 @@
|
|||||||
"description": "Dozvoljava postavljanje globalnih prečica na tastaturi za reproduciju (pusti/pauziraj/sledeće/prethodno) i isključivanje OSD za medije tako što će prepisati tastere za medije, uključiti Ctrl/CMD + F za pretragu, isključiti MPRIS podršku za medija tastere na Linux-u, i prilagođene prečice za napredne korisnike",
|
"description": "Dozvoljava postavljanje globalnih prečica na tastaturi za reproduciju (pusti/pauziraj/sledeće/prethodno) i isključivanje OSD za medije tako što će prepisati tastere za medije, uključiti Ctrl/CMD + F za pretragu, isključiti MPRIS podršku za medija tastere na Linux-u, i prilagođene prečice za napredne korisnike",
|
||||||
"menu": {
|
"menu": {
|
||||||
"override-media-keys": "Prepiši medija tastere",
|
"override-media-keys": "Prepiši medija tastere",
|
||||||
"set-keybinds": "Podesi globalne kontrole za numere"
|
"set-keybinds": "Podesi globalne kontrole za pesme"
|
||||||
},
|
},
|
||||||
"name": "Prečice (& MPRIS)",
|
"name": "Prečice (& MPRIS)",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
@ -760,27 +767,27 @@
|
|||||||
"play-pause": "Pusti / Pauziraj",
|
"play-pause": "Pusti / Pauziraj",
|
||||||
"previous": "Prethodno"
|
"previous": "Prethodno"
|
||||||
},
|
},
|
||||||
"label": "Izaberi globalne prečice za upravljanje numerama:",
|
"label": "Izaberi globalne prečice za upravljanje pesmama:",
|
||||||
"title": "Globalne prečice na tastaturi"
|
"title": "Globalne prečice na tastaturi"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"skip-disliked-songs": {
|
"skip-disliked-songs": {
|
||||||
"description": "Preskače numere koje su označene sa 'Ne sviđa mi se'",
|
"description": "Preskače pesme koje vam se nisu svidele",
|
||||||
"name": "Preskoči pesme označene sa 'Ne sviđa mi se'"
|
"name": "Preskočite pesme koje vam se nisu svidele"
|
||||||
},
|
},
|
||||||
"skip-silences": {
|
"skip-silences": {
|
||||||
"description": "Automatski preskoči delove numera u kojima je tišina",
|
"description": "Automatski preskočite delove pesama gde nema zvuka",
|
||||||
"name": "Preskoči tišine"
|
"name": "Preskoči tišine"
|
||||||
},
|
},
|
||||||
"sponsorblock": {
|
"sponsorblock": {
|
||||||
"description": "Automatski preskače delove numera koji nisu muzika poput uvod/odjava ili delove muzičkih spotova u kojima se muzika ne pušta",
|
"description": "Automatski preskače delove pesama koji nisu muzika poput uvod/odjava ili delove muzičkih spotova u kojima nema muzike",
|
||||||
"name": "Blok sponzora"
|
"name": "Blok sponzora"
|
||||||
},
|
},
|
||||||
"synced-lyrics": {
|
"synced-lyrics": {
|
||||||
"description": "Obezbeđuje sinhronizovane tekstove pesama, korišćenjem dobavljača poput LRClib.",
|
"description": "Obezbeđuje sinhronizovane lirike pesama, korišćenjem dobavljača poput LRClib.",
|
||||||
"errors": {
|
"errors": {
|
||||||
"fetch": "⚠️\tDošlo je do greške prilikom dobavljanja teksta pesme.\n\tMolimo vas da pokušate ponovo kasnije.",
|
"fetch": "⚠️\tDošlo je do greške prilikom dobavljanja stihova pesme.\n\tMolimo vas da pokušate ponovo kasnije.",
|
||||||
"not-found": "⚠️ Tekst za ovu pesmu nije pronađen."
|
"not-found": "⚠️ Tekst za ovu pesmu nije pronađen."
|
||||||
},
|
},
|
||||||
"menu": {
|
"menu": {
|
||||||
@ -792,7 +799,7 @@
|
|||||||
"label": "Efekat linije",
|
"label": "Efekat linije",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"fancy": {
|
"fancy": {
|
||||||
"label": "Fensi",
|
"label": "Kitnjast",
|
||||||
"tooltip": "Koristi velike (kao iz aplikacije) efekte na trenutnu liniju"
|
"tooltip": "Koristi velike (kao iz aplikacije) efekte na trenutnu liniju"
|
||||||
},
|
},
|
||||||
"focus": {
|
"focus": {
|
||||||
@ -800,8 +807,8 @@
|
|||||||
"tooltip": "Učini samo trenutnu liniju belom"
|
"tooltip": "Učini samo trenutnu liniju belom"
|
||||||
},
|
},
|
||||||
"offset": {
|
"offset": {
|
||||||
"label": "Pomeraj (offset)",
|
"label": "Pomeraj",
|
||||||
"tooltip": "Pomeraj (offset) na trenutnoj liniji"
|
"tooltip": "Pomeraj na trenutnoj liniji"
|
||||||
},
|
},
|
||||||
"scale": {
|
"scale": {
|
||||||
"label": "Razmera",
|
"label": "Razmera",
|
||||||
@ -812,7 +819,7 @@
|
|||||||
},
|
},
|
||||||
"precise-timing": {
|
"precise-timing": {
|
||||||
"label": "Učini da tekst pesme bude savršeno usklađen",
|
"label": "Učini da tekst pesme bude savršeno usklađen",
|
||||||
"tooltip": "Izračunaj do milisekunde prikaz sledeće linije teksta (može malo uticati na performanse)"
|
"tooltip": "Izračunaj do milisekunde prikaz sledeće linije teksta (može malo uticati na učinak)"
|
||||||
},
|
},
|
||||||
"romanization": {
|
"romanization": {
|
||||||
"label": "Romanizuj tekstove pesama",
|
"label": "Romanizuj tekstove pesama",
|
||||||
@ -820,7 +827,7 @@
|
|||||||
},
|
},
|
||||||
"show-lyrics-even-if-inexact": {
|
"show-lyrics-even-if-inexact": {
|
||||||
"label": "Prikaži tekst pesme čak iako nije tačan",
|
"label": "Prikaži tekst pesme čak iako nije tačan",
|
||||||
"tooltip": "Ako numera nije pronađena, ekstenzija će pokušati ponovo sa novim upitom za pretragu.\nRezultat iz drugog pokušaja možda neće biti tačan."
|
"tooltip": "Ako pesma nije pronađena, produžetak će pokušati ponovo sa novim upitom za pretragu.\nRezultat iz drugog pokušaja možda neće biti tačan."
|
||||||
},
|
},
|
||||||
"show-time-codes": {
|
"show-time-codes": {
|
||||||
"label": "Prikaži vremenske oznake",
|
"label": "Prikaži vremenske oznake",
|
||||||
@ -835,7 +842,7 @@
|
|||||||
"warnings": {
|
"warnings": {
|
||||||
"duration-mismatch": "⚠️ - Tekst pesme možda nije usklađen zbog neuklapanja u dužini trajanja.",
|
"duration-mismatch": "⚠️ - Tekst pesme možda nije usklađen zbog neuklapanja u dužini trajanja.",
|
||||||
"inexact": "⚠️ - Tekst za ovu pesmu možda nije tačan",
|
"inexact": "⚠️ - Tekst za ovu pesmu možda nije tačan",
|
||||||
"instrumental": "⚠️ - Ovo je instrumentalna numera"
|
"instrumental": "⚠️ - Ovo je instrumentalna pesma"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"taskbar-mediacontrol": {
|
"taskbar-mediacontrol": {
|
||||||
@ -843,15 +850,15 @@
|
|||||||
"name": "Upravljanje medijima iz trake sa zadacima"
|
"name": "Upravljanje medijima iz trake sa zadacima"
|
||||||
},
|
},
|
||||||
"touchbar": {
|
"touchbar": {
|
||||||
"description": "Dodaje 'TouchBar' vidžet za macOS korisnike",
|
"description": "Dodaje dodatak dodirne trake za macOS korisnike",
|
||||||
"name": "TouchBar"
|
"name": "Dodirna Traka"
|
||||||
},
|
},
|
||||||
"tuna-obs": {
|
"tuna-obs": {
|
||||||
"description": "Integracija sa OBS-ovom ekstenzijom Tuna",
|
"description": "Integracija sa OBS-ovim Tuna dodatkom",
|
||||||
"name": "Tuna OBS"
|
"name": "Tuna OBS"
|
||||||
},
|
},
|
||||||
"unobtrusive-player": {
|
"unobtrusive-player": {
|
||||||
"description": "Onemogućava plejeru da iskače kada reprodukuje numeru",
|
"description": "Onemogućava plejeru da iskače u toku pokretanja pesme",
|
||||||
"name": "Nenametljivi plejer"
|
"name": "Nenametljivi plejer"
|
||||||
},
|
},
|
||||||
"video-toggle": {
|
"video-toggle": {
|
||||||
@ -877,7 +884,7 @@
|
|||||||
},
|
},
|
||||||
"name": "Video prebacivanje",
|
"name": "Video prebacivanje",
|
||||||
"templates": {
|
"templates": {
|
||||||
"button-song": "Numera",
|
"button-song": "Pesma",
|
||||||
"button-video": "Video"
|
"button-video": "Video"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@ -2,14 +2,14 @@
|
|||||||
"common": {
|
"common": {
|
||||||
"console": {
|
"console": {
|
||||||
"plugins": {
|
"plugins": {
|
||||||
"execute-failed": "Misslyckades med att köra plugin {{pluginName}}::{{contextName}}",
|
"execute-failed": "Misslyckades med att köra tillägget {{pluginName}}::{{contextName}}",
|
||||||
"executed-at-ms": "Plugin {{pluginName}}::{{contextName}} kördes på {{ms}} ms",
|
"executed-at-ms": "Tillägget {{pluginName}}::{{contextName}} kördes på {{ms}}ms",
|
||||||
"initialize-failed": "Misslyckades med att initialisera pluginen \"{{pluginName}}\"",
|
"initialize-failed": "Misslyckades med att initialisera tillägget \"{{pluginName}}\"",
|
||||||
"load-all": "Laddar alla pluginer",
|
"load-all": "Laddar alla tillägg",
|
||||||
"load-failed": "Misslyckades med att ladda pluginen \"{{pluginName}}\"",
|
"load-failed": "Misslyckades med att ladda tillägget \"{{pluginName}}\"",
|
||||||
"loaded": "Pluginen \"{{pluginName}}\" laddad",
|
"loaded": "Tillägget \"{{pluginName}}\" laddades in",
|
||||||
"unload-failed": "Misslyckades med att avlasta pluginen \"{{pluginName}}\"",
|
"unload-failed": "Kunde inte inaktivera {{pluginName}}-tillägget",
|
||||||
"unloaded": "Pluginen \"{{pluginName}}\" avlastad"
|
"unloaded": "{{pluginName}}-tillägget inaktiverat"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -21,7 +21,7 @@
|
|||||||
"main": {
|
"main": {
|
||||||
"console": {
|
"console": {
|
||||||
"did-finish-load": {
|
"did-finish-load": {
|
||||||
"dev-tools": "Laddning klar. DevTools öppnad"
|
"dev-tools": "Laddning slutförd. Utvecklarverktyg öppnad"
|
||||||
},
|
},
|
||||||
"i18n": {
|
"i18n": {
|
||||||
"loaded": "i18n laddad"
|
"loaded": "i18n laddad"
|
||||||
@ -45,16 +45,16 @@
|
|||||||
"dialog": {
|
"dialog": {
|
||||||
"hide-menu-enabled": {
|
"hide-menu-enabled": {
|
||||||
"detail": "Menyn är dold, använd 'Alt' för att visa den (eller 'Escape' om du använder inbyggd meny)",
|
"detail": "Menyn är dold, använd 'Alt' för att visa den (eller 'Escape' om du använder inbyggd meny)",
|
||||||
"message": "Dölj Meny är aktiverat",
|
"message": "Dölj meny är aktiverad",
|
||||||
"title": "Dölj Meny aktiverad"
|
"title": "Dölj meny aktiverad"
|
||||||
},
|
},
|
||||||
"need-to-restart": {
|
"need-to-restart": {
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"later": "Senare",
|
"later": "Senare",
|
||||||
"restart-now": "Starta om nu"
|
"restart-now": "Starta om nu"
|
||||||
},
|
},
|
||||||
"detail": "\"{{pluginName}}\" pluginen kräver en omstart för att träda i kraft",
|
"detail": "\"{{pluginName}}\"-tillägget kräver en omstart för att träda i kraft",
|
||||||
"message": "\"{{pluginName}}\" behöver startas om",
|
"message": "\"{{pluginName}}\"-tillägget behöver startas om",
|
||||||
"title": "Omstart krävs"
|
"title": "Omstart krävs"
|
||||||
},
|
},
|
||||||
"unresponsive": {
|
"unresponsive": {
|
||||||
@ -84,17 +84,17 @@
|
|||||||
"label": "Navigering",
|
"label": "Navigering",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"copy-current-url": "Kopiera nuvarande länk",
|
"copy-current-url": "Kopiera nuvarande länk",
|
||||||
"go-back": "Föregående",
|
"go-back": "Gå tillbaka",
|
||||||
"go-forward": "Nästa",
|
"go-forward": "Gå framåt",
|
||||||
"quit": "Lämna",
|
"quit": "Lämna",
|
||||||
"restart": "Starta om appen"
|
"restart": "Starta om appen"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"options": {
|
"options": {
|
||||||
"label": "Valmöjligheter",
|
"label": "Alternativ",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"advanced-options": {
|
"advanced-options": {
|
||||||
"label": "Avancerade valmöjligheter",
|
"label": "Avancerade alternativ",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"auto-reset-app-cache": "Nollställ appcache när appen startar",
|
"auto-reset-app-cache": "Nollställ appcache när appen startar",
|
||||||
"disable-hardware-acceleration": "Stäng av hårdvaruacceleration",
|
"disable-hardware-acceleration": "Stäng av hårdvaruacceleration",
|
||||||
@ -114,60 +114,589 @@
|
|||||||
},
|
},
|
||||||
"always-on-top": "Alltid överst",
|
"always-on-top": "Alltid överst",
|
||||||
"auto-update": "Uppdatera automatiskt",
|
"auto-update": "Uppdatera automatiskt",
|
||||||
|
"hide-menu": {
|
||||||
|
"dialog": {
|
||||||
|
"message": "Menyn kommer att döljas efter omstart, använd [Alt] för att visa menyn (eller [`] vid användning av menyn inuti applikationen)",
|
||||||
|
"title": "Dölj meny aktiverad"
|
||||||
|
},
|
||||||
|
"label": "Dölj meny"
|
||||||
|
},
|
||||||
"language": {
|
"language": {
|
||||||
"dialog": {
|
"dialog": {
|
||||||
"message": "Språket ändras efter omstart",
|
"message": "Språket ändras efter omstart",
|
||||||
"title": "Språket har ändrats"
|
"title": "Språket har ändrats"
|
||||||
},
|
},
|
||||||
"label": "Språk"
|
"label": "Språk",
|
||||||
|
"submenu": {
|
||||||
|
"to-help-translate": "Vill du hjälpa till att översätta? Klicka här"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"resume-on-start": "Fortsätt spela när appen öppnas"
|
"resume-on-start": "Fortsätt spela när appen öppnas",
|
||||||
|
"single-instance-lock": "Lås enskild instans",
|
||||||
|
"start-at-login": "Starta vid inloggning",
|
||||||
|
"starting-page": {
|
||||||
|
"label": "Startsidа",
|
||||||
|
"unset": "Ej inställt"
|
||||||
|
},
|
||||||
|
"tray": {
|
||||||
|
"label": "Systemfält",
|
||||||
|
"submenu": {
|
||||||
|
"disabled": "Inaktiverad",
|
||||||
|
"enabled-and-hide-app": "Aktiverad och dölj app",
|
||||||
|
"enabled-and-show-app": "Aktiverad och visa app",
|
||||||
|
"play-pause-on-click": "Spela/Pausa vid klick"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"visual-tweaks": {
|
||||||
|
"label": "Visuella justeringar",
|
||||||
|
"submenu": {
|
||||||
|
"custom-window-title": {
|
||||||
|
"label": "Anpassad titel på fönstret",
|
||||||
|
"prompt": {
|
||||||
|
"label": "Ange anpassad fönstertitel: (lämna tomt för att inaktivera)",
|
||||||
|
"placeholder": "Exempelvis: YouTube Music"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"like-buttons": {
|
||||||
|
"default": "Standard",
|
||||||
|
"force-show": "Tvinga fram visning",
|
||||||
|
"hide": "Dölj",
|
||||||
|
"label": "Gilla-knappar"
|
||||||
|
},
|
||||||
|
"remove-upgrade-button": "Ta bort knappen för uppgradering",
|
||||||
|
"theme": {
|
||||||
|
"dialog": {
|
||||||
|
"button": {
|
||||||
|
"cancel": "Avbryt",
|
||||||
|
"remove": "Ta bort"
|
||||||
|
},
|
||||||
|
"remove-theme": "Vill du verkligen radera det anpassade temat?",
|
||||||
|
"remove-theme-message": "Det här raderar ditt anpassade tema"
|
||||||
|
},
|
||||||
|
"label": "Tema",
|
||||||
|
"submenu": {
|
||||||
|
"import-css-file": "Importera anpassad CSS-fil",
|
||||||
|
"no-theme": "Inget tema"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"plugins": {
|
||||||
|
"enabled": "Aktiverad",
|
||||||
|
"label": "Tillägg",
|
||||||
|
"new": "NY"
|
||||||
|
},
|
||||||
|
"view": {
|
||||||
|
"label": "Visa",
|
||||||
|
"submenu": {
|
||||||
|
"force-reload": "Tvinga omladdning",
|
||||||
|
"reload": "Ladda om",
|
||||||
|
"reset-zoom": "Verklig storlek",
|
||||||
|
"toggle-fullscreen": "Växla helskärm",
|
||||||
|
"zoom-in": "Zooma in",
|
||||||
|
"zoom-out": "Zooma ut"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tray": {
|
||||||
|
"next": "Nästa",
|
||||||
|
"play-pause": "Spela/Pausa",
|
||||||
|
"previous": "Föregående",
|
||||||
|
"quit": "Stäng",
|
||||||
|
"restart": "Starta om appen",
|
||||||
|
"show": "Visa fönster",
|
||||||
|
"tooltip": {
|
||||||
|
"default": "YouTube Music",
|
||||||
|
"with-song-info": "YouTube Music: {{artist}} – {{title}}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"plugins": {
|
"plugins": {
|
||||||
|
"ad-speedup": {
|
||||||
|
"description": "Om en annons spelas, tystas ljudet och uppspelningshastigheten sätts till 16×",
|
||||||
|
"name": "Snabba upp annonser"
|
||||||
|
},
|
||||||
|
"adblocker": {
|
||||||
|
"description": "Blockerar annonser och spårning automatiskt",
|
||||||
|
"menu": {
|
||||||
|
"blocker": "Blockerare"
|
||||||
|
},
|
||||||
|
"name": "Annonsblockerare"
|
||||||
|
},
|
||||||
|
"album-actions": {
|
||||||
|
"description": "Lägger till knappar för Undislike, Dislike, Like och Unlike för att använda detta på alla spår i en spellista eller ett album",
|
||||||
|
"name": "Albumåtgärder"
|
||||||
|
},
|
||||||
|
"album-color-theme": {
|
||||||
|
"description": "Använder ett dynamiskt tema och visuella effekter baserat på albumets färgpalett",
|
||||||
|
"menu": {
|
||||||
|
"color-mix-ratio": {
|
||||||
|
"label": "Färgblandningsförhållande",
|
||||||
|
"submenu": {
|
||||||
|
"percent": "{{ratio}} %"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "Albumfärgtema"
|
||||||
|
},
|
||||||
|
"ambient-mode": {
|
||||||
|
"description": "Ger en ljuseffekt genom att försiktigt kasta färger från videon på skärmens bakgrund",
|
||||||
|
"menu": {
|
||||||
|
"blur-amount": {
|
||||||
|
"label": "Oskärpa",
|
||||||
|
"submenu": {
|
||||||
|
"pixels": "{{blurAmount}} pixlar"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"buffer": {
|
||||||
|
"label": "Buffert",
|
||||||
|
"submenu": {
|
||||||
|
"buffer": "{{buffer}}"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"opacity": {
|
||||||
|
"label": "Opacitet",
|
||||||
|
"submenu": {
|
||||||
|
"percent": "{{opacity}}%"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"quality": {
|
||||||
|
"label": "Kvalitet",
|
||||||
|
"submenu": {
|
||||||
|
"pixels": "{{quality}} pixlar"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"size": {
|
||||||
|
"label": "Storlek",
|
||||||
|
"submenu": {
|
||||||
|
"percent": "{{size}}%"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"smoothness-transition": {
|
||||||
|
"label": "Mjuk övergång",
|
||||||
|
"submenu": {
|
||||||
|
"during": "Under {{interpolationTime}} s"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"use-fullscreen": {
|
||||||
|
"label": "Använder helskärm"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "Ambiensläge"
|
||||||
|
},
|
||||||
|
"amuse": {
|
||||||
|
"description": "Lägger till stöd för YouTube Music i Amuse ‘Now Playing’-widgeten av 6K Labs",
|
||||||
|
"name": "Amuse",
|
||||||
|
"response": {
|
||||||
|
"query": "Amuse API-servern körs. Använd GET /query för att hämta information om låt."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"api-server": {
|
||||||
|
"description": "Lägger till en API-server för att styra spelaren",
|
||||||
|
"dialog": {
|
||||||
|
"request": {
|
||||||
|
"buttons": {
|
||||||
|
"allow": "Tillåt",
|
||||||
|
"deny": "Avvisa"
|
||||||
|
},
|
||||||
|
"message": "Tillåt {{ID}} ({{origin}}) att få åtkomst till API:et?",
|
||||||
|
"title": "Förfrågan om API-åtkomst"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"menu": {
|
||||||
|
"auth-strategy": {
|
||||||
|
"label": "Metod för åtkomstkontroll",
|
||||||
|
"submenu": {
|
||||||
|
"auth-at-first": {
|
||||||
|
"label": "Ge åtkomst vid första begäran"
|
||||||
|
},
|
||||||
|
"none": {
|
||||||
|
"label": "Ingen åtkomstkontroll"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"hostname": {
|
||||||
|
"label": "Värdnamn"
|
||||||
|
},
|
||||||
|
"port": {
|
||||||
|
"label": "Port"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "API-server [Beta]",
|
||||||
|
"prompt": {
|
||||||
|
"hostname": {
|
||||||
|
"label": "Ange värdnamnet (t.ex. 0.0.0.0) för API-servern:",
|
||||||
|
"title": "Värdnamn"
|
||||||
|
},
|
||||||
|
"port": {
|
||||||
|
"label": "Ange porten för API-servern:",
|
||||||
|
"title": "Port"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"audio-compressor": {
|
||||||
|
"description": "Applicera komprimering på ljudet (sänker volymen på de starkaste delarna av signalen och höjer volymen på de svagaste delarna)",
|
||||||
|
"name": "Ljudkompressor"
|
||||||
|
},
|
||||||
|
"auth-proxy-adapter": {
|
||||||
|
"description": "Stöd för användning av autentiseringsproxy-tjänster",
|
||||||
|
"menu": {
|
||||||
|
"disable": "Inaktivera proxy-adapter",
|
||||||
|
"enable": "Aktivera proxy-adapter",
|
||||||
|
"hostname": {
|
||||||
|
"label": "Värdnamn"
|
||||||
|
},
|
||||||
|
"port": {
|
||||||
|
"label": "Port"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "Adapter För Autentiseringsproxy",
|
||||||
|
"prompt": {
|
||||||
|
"hostname": {
|
||||||
|
"label": "Ange värdnamn för lokal proxyserver (kräver omstart):",
|
||||||
|
"title": "Proxy-värdnamn"
|
||||||
|
},
|
||||||
|
"port": {
|
||||||
|
"label": "Ange port för lokal proxyserver (kräver omstart):",
|
||||||
|
"title": "Port för proxy"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"blur-nav-bar": {
|
||||||
|
"description": "Gör navigeringsfältet transparent och suddigt",
|
||||||
|
"name": "Suddigt Navigeringsfält"
|
||||||
|
},
|
||||||
|
"bypass-age-restrictions": {
|
||||||
|
"description": "Hoppa över YouTubes åldersverifiering",
|
||||||
|
"name": "Hoppa Över Åldersbegränsningar"
|
||||||
|
},
|
||||||
|
"captions-selector": {
|
||||||
|
"description": "Välj textning för YouTube Music-ljudspår",
|
||||||
|
"menu": {
|
||||||
|
"autoload": "Välj automatiskt senast använda textning",
|
||||||
|
"disable-captions": "Ingen textning som standard"
|
||||||
|
},
|
||||||
|
"name": "Textväljare",
|
||||||
|
"prompt": {
|
||||||
|
"selector": {
|
||||||
|
"label": "Aktuellt textningsspråk: {{language}}",
|
||||||
|
"none": "Inget",
|
||||||
|
"title": "Välj textspråk"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"templates": {
|
||||||
|
"title": "Öppna textväljaren"
|
||||||
|
},
|
||||||
|
"toast": {
|
||||||
|
"caption-changed": "Textning ändrad till {{language}}",
|
||||||
|
"caption-disabled": "Textning inaktiverad",
|
||||||
|
"no-captions": "Inga undertexter tillgängliga för denna låt"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"compact-sidebar": {
|
||||||
|
"description": "Sätt alltid sidomenyn i kompakt läge",
|
||||||
|
"name": "Kompakt Sidomeny"
|
||||||
|
},
|
||||||
|
"crossfade": {
|
||||||
|
"description": "Mjuk övergång mellan låtar",
|
||||||
|
"menu": {
|
||||||
|
"advanced": "Avancerat"
|
||||||
|
},
|
||||||
|
"name": "Mjuk Övergång [Beta]",
|
||||||
|
"prompt": {
|
||||||
|
"options": {
|
||||||
|
"multi-input": {
|
||||||
|
"fade-in-duration": "Fade-in-varaktighet (ms)",
|
||||||
|
"fade-out-duration": "Fade-out-varaktighet (ms)",
|
||||||
|
"fade-scaling": {
|
||||||
|
"label": "Fade-skalning",
|
||||||
|
"linear": "Linjär",
|
||||||
|
"logarithmic": "Logaritmisk"
|
||||||
|
},
|
||||||
|
"seconds-before-end": "Övergång i sekunder före slutet"
|
||||||
|
},
|
||||||
|
"title": "Övergångsinställningar"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"disable-autoplay": {
|
||||||
|
"description": "Starta låt i \"pausat\" läge",
|
||||||
|
"menu": {
|
||||||
|
"apply-once": "Gäller endast vid uppstart"
|
||||||
|
},
|
||||||
|
"name": "Inaktivera Automatisk Uppspelning"
|
||||||
|
},
|
||||||
|
"discord": {
|
||||||
|
"backend": {
|
||||||
|
"already-connected": "Försökte ansluta med aktiv anslutning",
|
||||||
|
"connected": "Ansluten till Discord",
|
||||||
|
"disconnected": "Frånkopplad från Discord"
|
||||||
|
},
|
||||||
|
"description": "Visa dina vänner vad du lyssnar på med Aktivitetsdelning",
|
||||||
|
"menu": {
|
||||||
|
"auto-reconnect": "Automatisk återanslutning",
|
||||||
|
"clear-activity": "Rensa aktivitet",
|
||||||
|
"clear-activity-after-timeout": "Rensa aktivitet efter tidsgräns",
|
||||||
|
"connected": "Ansluten",
|
||||||
|
"disconnected": "Frånkopplad",
|
||||||
|
"hide-duration-left": "Dölj återstående tid",
|
||||||
|
"hide-github-button": "Dölj knapp för GitHub-länk",
|
||||||
|
"play-on-youtube-music": "Spela på YouTube Music",
|
||||||
|
"set-inactivity-timeout": "Ställ in inaktivitetstid"
|
||||||
|
},
|
||||||
|
"name": "Discord Aktivitetsdelning",
|
||||||
|
"prompt": {
|
||||||
|
"set-inactivity-timeout": {
|
||||||
|
"label": "Ange inaktivitetstid i sekunder:",
|
||||||
|
"title": "Ställ in inaktivitetstid"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"downloader": {
|
||||||
|
"backend": {
|
||||||
|
"dialog": {
|
||||||
|
"error": {
|
||||||
|
"buttons": {
|
||||||
|
"ok": "OK"
|
||||||
|
},
|
||||||
|
"message": "Hoppsan! Nedladdningen misslyckades…",
|
||||||
|
"title": "Fel vid nedladdning!"
|
||||||
|
},
|
||||||
|
"start-download-playlist": {
|
||||||
|
"buttons": {
|
||||||
|
"ok": "OK"
|
||||||
|
},
|
||||||
|
"detail": "({{playlistSize}} låtar)",
|
||||||
|
"message": "Laddar ner {{playlistTitle}}-spellistan",
|
||||||
|
"title": "Nedladdning påbörjad"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"feedback": {
|
||||||
|
"conversion-progress": "Konvertering: {{percent}}%",
|
||||||
|
"converting": "Konverterar…",
|
||||||
|
"done": "Klart: {{filePath}}",
|
||||||
|
"download-info": "Laddar ner {{artist}} - {{title}} [{{videoId}}",
|
||||||
|
"download-progress": "Nedladdning: {{percent}}%",
|
||||||
|
"downloading": "Laddar ner…",
|
||||||
|
"downloading-counter": "Laddar ner {{current}}/{{total}}…",
|
||||||
|
"downloading-playlist": "Laddar ner {{playlistTitle}}-spellistan — {{playlistSize}} spår ({{playlistId}})",
|
||||||
|
"error-while-downloading": "Fel vid nedladdning \"{{author}} - {{title}}\": {{error}}",
|
||||||
|
"folder-already-exists": "Mappen {{playlistFolder}} finns redan",
|
||||||
|
"getting-playlist-info": "Hämtar information om spellista…",
|
||||||
|
"loading": "Laddar…",
|
||||||
|
"playlist-has-only-one-song": "Spellistan innehåller bara ett objekt. Laddar ner direkt.",
|
||||||
|
"playlist-id-not-found": "Hittade inget ID för spellista",
|
||||||
|
"playlist-is-empty": "Spellistan är tom",
|
||||||
|
"playlist-is-mix-or-private": "Fel vid hämtning av spellisteinformation. Se till att den inte är privat eller en 'Mixed for you'-spellista\n\n{{error}}",
|
||||||
|
"preparing-file": "Förbereder fil…",
|
||||||
|
"saving": "Sparar…",
|
||||||
|
"trying-to-get-playlist-id": "Försöker hämta spelliste-ID: {{playlistId}}",
|
||||||
|
"video-id-not-found": "Videon hittades inte",
|
||||||
|
"writing-id3": "Skriver ID3-taggar…"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"description": "Laddar ner MP3 / originalljud direkt från gränssnittet",
|
||||||
|
"menu": {
|
||||||
|
"choose-download-folder": "Välj nedladdningsmapp",
|
||||||
|
"download-finish-settings": {
|
||||||
|
"label": "Ladda ner när klart",
|
||||||
|
"prompt": {
|
||||||
|
"last-percent": "Efter x procent",
|
||||||
|
"last-seconds": "Senaste x sekunderna",
|
||||||
|
"title": "Ställ in när nedladdning ska ske"
|
||||||
|
},
|
||||||
|
"submenu": {
|
||||||
|
"advanced": "Avancerat",
|
||||||
|
"enabled": "Aktiverad",
|
||||||
|
"mode": "Tidsläge",
|
||||||
|
"percent": "Procent",
|
||||||
|
"seconds": "Sekunder"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"download-playlist": "Ladda ner spellista",
|
||||||
|
"presets": "Förinställningar",
|
||||||
|
"skip-existing": "Hoppa över befintliga filer"
|
||||||
|
},
|
||||||
|
"name": "Nedladdare",
|
||||||
|
"renderer": {
|
||||||
|
"can-not-update-progress": "Kan inte uppdatera förlopp"
|
||||||
|
},
|
||||||
|
"templates": {
|
||||||
|
"button": "Ladda ner"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"equalizer": {
|
||||||
|
"description": "Lägger till en equalizer i spelaren",
|
||||||
|
"menu": {
|
||||||
|
"presets": {
|
||||||
|
"label": "Förinställningar",
|
||||||
|
"list": {
|
||||||
|
"bass-booster": "Basförstärkning"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "Equalizer"
|
||||||
|
},
|
||||||
|
"exponential-volume": {
|
||||||
|
"description": "Gör volymreglaget exponentiellt så att det blir lättare att välja lägre volymer.",
|
||||||
|
"name": "Exponentiell Volym"
|
||||||
|
},
|
||||||
|
"in-app-menu": {
|
||||||
|
"description": "Ger menyrader ett snyggt, mörkt, eller albumfärgat utseende",
|
||||||
|
"menu": {
|
||||||
|
"hide-dom-window-controls": "Dölj DOM-fönsterkontroller"
|
||||||
|
},
|
||||||
|
"name": "Meny I Appen"
|
||||||
|
},
|
||||||
|
"lumiastream": {
|
||||||
|
"description": "Lägger till stöd för Lumia Stream",
|
||||||
|
"name": "Lumia Stream [Beta]"
|
||||||
|
},
|
||||||
|
"lyrics-genius": {
|
||||||
|
"description": "Lägger till stöd för texter till de flesta låtar",
|
||||||
|
"menu": {
|
||||||
|
"romanized-lyrics": "Romiserade texter"
|
||||||
|
},
|
||||||
|
"name": "Texter från Genius",
|
||||||
|
"renderer": {
|
||||||
|
"fetched-lyrics": "Hämtade texter från Genius"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"music-together": {
|
||||||
|
"description": "Dela en spellista med andra. När värden spelar en låt kommer alla andra höra samma låt",
|
||||||
|
"dialog": {
|
||||||
|
"enter-host": "Ange värd-ID"
|
||||||
|
},
|
||||||
|
"internal": {
|
||||||
|
"save": "Spara",
|
||||||
|
"track-source": "Ljudkälla",
|
||||||
|
"unknown-user": "Okänd användare"
|
||||||
|
},
|
||||||
|
"menu": {
|
||||||
|
"click-to-copy-id": "Kopiera värd-ID",
|
||||||
|
"close": "Stäng \"Music Together\"",
|
||||||
|
"connected-users": "Anslutna användare",
|
||||||
|
"disconnect": "Koppla från \"Music Together\"",
|
||||||
|
"empty-user": "Inga anslutna användare",
|
||||||
|
"host": "Värd för \"Music Together\"",
|
||||||
|
"join": "Gå med i \"Music Together\"",
|
||||||
|
"permission": {
|
||||||
|
"all": "Tillåt gäster att styra spellista och spelare",
|
||||||
|
"host-only": "Endast värden kan styra spellista och spelare",
|
||||||
|
"playlist": "Tillåt gäster att styra spellistan"
|
||||||
|
},
|
||||||
|
"set-permission": "Ändra behörighet för styrning",
|
||||||
|
"status": {
|
||||||
|
"disconnected": "Frånkopplad",
|
||||||
|
"guest": "Ansluten som gäst",
|
||||||
|
"host": "Ansluten som värd"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "Music Together [Beta]",
|
||||||
|
"toast": {
|
||||||
|
"add-song-failed": "Misslyckades med att lägga till låt",
|
||||||
|
"closed": "\"Music Together\" stängdes",
|
||||||
|
"disconnected": "\"Music Together\" frånkopplad",
|
||||||
|
"host-failed": "Misslyckades med att vara värd för \"Music Together\"",
|
||||||
|
"id-copied": "Värd-ID kopierat till urklipp",
|
||||||
|
"id-copy-failed": "Misslyckades med att kopiera värd-ID till urklipp",
|
||||||
|
"join-failed": "Misslyckades med att gå med i \"Music Together\"",
|
||||||
|
"joined": "Gick med i \"Music Together\"",
|
||||||
|
"permission-changed": "Behörighet för \"Music Together\" ändrad till \"{{permission}}\"",
|
||||||
|
"remove-song-failed": "Misslyckades med att radera låt",
|
||||||
|
"user-connected": "{{name}} gick med i \"Music Together\"",
|
||||||
|
"user-disconnected": "{{name}} lämnade \"Music Together\""
|
||||||
|
}
|
||||||
|
},
|
||||||
"navigation": {
|
"navigation": {
|
||||||
"name": "Navigering"
|
"description": "Direkt integrering av Nästa-/Tillbaka-navigeringspilar i gränssnittet, som i din favoritwebbläsare",
|
||||||
|
"name": "Navigering",
|
||||||
|
"templates": {
|
||||||
|
"back": {
|
||||||
|
"title": "Gå till föregående sida"
|
||||||
|
},
|
||||||
|
"forward": {
|
||||||
|
"title": "Gå till nästa sida"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"no-google-login": {
|
"no-google-login": {
|
||||||
"name": "Inget Google Login"
|
"description": "Ta bort Google-inloggningsknappar och länkar från gränssnittet",
|
||||||
|
"name": "Ingen Google-inloggning"
|
||||||
},
|
},
|
||||||
"notifications": {
|
"notifications": {
|
||||||
|
"description": "Visa en notis när en låt börjar spelas (interaktiva notiser finns på Windows)",
|
||||||
|
"menu": {
|
||||||
|
"interactive": "Interaktiva notiser",
|
||||||
|
"interactive-settings": {
|
||||||
|
"label": "Interaktiva inställningar",
|
||||||
|
"submenu": {
|
||||||
|
"hide-button-text": "Dölj knapptext",
|
||||||
|
"refresh-on-play-pause": "Uppdatera vid Play/Pause",
|
||||||
|
"tray-controls": "Öppna/stäng vid klick i systemfältet"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"priority": "Notisprioritet",
|
||||||
|
"toast-style": "Stil för \"toast\"-notiser",
|
||||||
|
"unpause-notification": "Visa notis när uppspelning återupptas"
|
||||||
|
},
|
||||||
"name": "Notiser"
|
"name": "Notiser"
|
||||||
},
|
},
|
||||||
|
"performance-improvement": {
|
||||||
|
"description": "Förbättra prestanda genom att aktivera experimentella skript",
|
||||||
|
"name": "Prestandaförbättring [Beta]"
|
||||||
|
},
|
||||||
"picture-in-picture": {
|
"picture-in-picture": {
|
||||||
|
"description": "Tillåter appen att växla till bild-i-bild-läge",
|
||||||
"menu": {
|
"menu": {
|
||||||
|
"always-on-top": "Alltid överst",
|
||||||
"hotkey": {
|
"hotkey": {
|
||||||
"label": "Snabbkommando",
|
"label": "Snabbkommando",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
"keybind-options": {
|
"keybind-options": {
|
||||||
"hotkey": "Snabbkommando"
|
"hotkey": "Snabbkommando"
|
||||||
},
|
},
|
||||||
|
"label": "Välj ett snabbkommando för att växla bild-i-bild-läge",
|
||||||
"title": "Bild-I-Bild genväg"
|
"title": "Bild-I-Bild genväg"
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
"save-window-position": "Spara fönsterposition",
|
||||||
|
"save-window-size": "Spara fönsterstorlek",
|
||||||
|
"use-native-pip": "Använd webbläsarens inbyggda bild-i-bild"
|
||||||
},
|
},
|
||||||
"name": "Bild-I-Bild",
|
"name": "Bild-i-bild",
|
||||||
"templates": {
|
"templates": {
|
||||||
"button": "Bild-i-bild"
|
"button": "Bild-i-bild"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"playback-speed": {
|
"playback-speed": {
|
||||||
|
"description": "Lägger till ett reglage för att ändra uppspelningshastighet",
|
||||||
"name": "Uppspelningshastighet",
|
"name": "Uppspelningshastighet",
|
||||||
"templates": {
|
"templates": {
|
||||||
"button": "Hasighet"
|
"button": "Hastighet"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"precise-volume": {
|
"precise-volume": {
|
||||||
|
"description": "Styr ljudstyrkan exakt med mushjul/snabbtangenter, med anpassat skärmlager och justerbara volymsteg",
|
||||||
|
"menu": {
|
||||||
|
"arrows-shortcuts": "Kontroller för lokala piltangenter",
|
||||||
|
"custom-volume-steps": "Ställ in egna volymsteg",
|
||||||
|
"global-shortcuts": "Globala snabbkommandon"
|
||||||
|
},
|
||||||
|
"name": "Noggrann Volymkontroll",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
"global-shortcuts": {
|
"global-shortcuts": {
|
||||||
"keybind-options": {
|
"keybind-options": {
|
||||||
"decrease": "Minska Volym",
|
"decrease": "Sänk volymen",
|
||||||
"increase": "Öka Volym"
|
"increase": "Öka volymen"
|
||||||
}
|
},
|
||||||
|
"label": "Välj globala kortkommandon för volym:",
|
||||||
|
"title": "Globala kortkommandon för volym"
|
||||||
},
|
},
|
||||||
"volume-steps": {
|
"volume-steps": {
|
||||||
|
"label": "Välj volymsteg för ökning/minskning",
|
||||||
"title": "Volymsteg"
|
"title": "Volymsteg"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -176,54 +705,195 @@
|
|||||||
"backend": {
|
"backend": {
|
||||||
"dialog": {
|
"dialog": {
|
||||||
"quality-changer": {
|
"quality-changer": {
|
||||||
"detail": "Nuvarande kvalité: {{quality}}",
|
"detail": "Nuvarande kvalitet: {{quality}}",
|
||||||
"message": "Välj Video Kvalité:",
|
"message": "Välj videokvalitet:",
|
||||||
"title": "Välj Video Kvalité"
|
"title": "Välj videokvalitet"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"description": "Tillåter att ändra videokvalitet med en knapp i videons overlay",
|
||||||
|
"name": "Videokvalitetsväxlare",
|
||||||
|
"renderer": {
|
||||||
|
"quality-settings-button": {
|
||||||
|
"label": "Öppna kvalitetsväxlare för spelaren"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"scrobbler": {
|
"scrobbler": {
|
||||||
|
"description": "Lägg till scrobbling-stöd (t.ex. last.fm, Listenbrainz)",
|
||||||
|
"dialog": {
|
||||||
|
"lastfm": {
|
||||||
|
"auth-failed": {
|
||||||
|
"message": "Misslyckades att autentisera med Last.fm\nDölj popup-fönstret till nästa omstart.",
|
||||||
|
"title": "Autentisering misslyckades"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"menu": {
|
||||||
|
"lastfm": {
|
||||||
|
"api-settings": "Last.fm API-inställningar"
|
||||||
|
},
|
||||||
|
"listenbrainz": {
|
||||||
|
"token": "Ange ListenBrainz användartoken"
|
||||||
|
},
|
||||||
|
"scrobble-alternative-title": "Använd alternativa titlar",
|
||||||
|
"scrobble-other-media": "Scrobbla annan media"
|
||||||
|
},
|
||||||
|
"name": "Scrobbler",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
"lastfm": {
|
"lastfm": {
|
||||||
"api-key": "Last.fm API nyckel"
|
"api-key": "Last.fm API nyckel",
|
||||||
|
"api-secret": "Last.fm API-hemlighet"
|
||||||
},
|
},
|
||||||
"listenbrainz": {
|
"listenbrainz": {
|
||||||
"token": {
|
"token": {
|
||||||
|
"label": "Ange din ListenBrainz användartoken:",
|
||||||
"title": "ListenBrainz token"
|
"title": "ListenBrainz token"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"shortcuts": {
|
"shortcuts": {
|
||||||
|
"description": "Tillåter inställning av globala kortkommandon för uppspelning (spela/pausa/nästa/föregående) och inaktiverar medie-OSD genom att åsidosätta medietangenter. Aktiverar Ctrl/CMD + F för sökning. Aktiverar Linux MPRIS-stöd för medietangenter och anpassade kortkommandon för avancerade användare",
|
||||||
|
"menu": {
|
||||||
|
"override-media-keys": "Åsidosätt medietangenter",
|
||||||
|
"set-keybinds": "Ställ in globala kontroller för låtar"
|
||||||
|
},
|
||||||
|
"name": "Genvägar (& MPRIS)",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
"keybind": {
|
"keybind": {
|
||||||
"keybind-options": {
|
"keybind-options": {
|
||||||
"next": "Nästa",
|
"next": "Nästa",
|
||||||
"play-pause": "Spela / Pausa",
|
"play-pause": "Spela / Pausa",
|
||||||
"previous": "Föregående"
|
"previous": "Föregående"
|
||||||
}
|
},
|
||||||
|
"label": "Välj globala kortkommandon för kontroll av låtar:",
|
||||||
|
"title": "Globala kortkommandon"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"skip-disliked-songs": {
|
||||||
|
"description": "Hoppar över låtar du inte gillar",
|
||||||
|
"name": "Hoppa Över Låtar Du Inte Gillar"
|
||||||
|
},
|
||||||
|
"skip-silences": {
|
||||||
|
"description": "Hoppa automatiskt över tysta partier i låtar",
|
||||||
|
"name": "Hoppa Över Tysta Partier"
|
||||||
|
},
|
||||||
|
"sponsorblock": {
|
||||||
|
"description": "Hoppar automatiskt över icke-musikdelar som intro/outro eller delar av musikvideor där ingen musik spelas",
|
||||||
|
"name": "Blockera Sponsorer"
|
||||||
|
},
|
||||||
|
"synced-lyrics": {
|
||||||
|
"description": "Visar synkroniserade låttexter med hjälp av tjänster som LRClib.",
|
||||||
|
"errors": {
|
||||||
|
"fetch": "⚠️ Ett fel uppstod när texterna skulle hämtas.\n\tFörsök igen senare.",
|
||||||
|
"not-found": "⚠️ Inga texter hittades för denna låt."
|
||||||
|
},
|
||||||
|
"menu": {
|
||||||
|
"default-text-string": {
|
||||||
|
"label": "Standardtecken mellan låttexter",
|
||||||
|
"tooltip": "Välj standardtecken att använda för mellanrummet mellan låttexter"
|
||||||
|
},
|
||||||
|
"line-effect": {
|
||||||
|
"label": "Linjeeffekt",
|
||||||
|
"submenu": {
|
||||||
|
"fancy": {
|
||||||
|
"label": "Stiligt",
|
||||||
|
"tooltip": "Använd stora, app-liknande effekter på den aktuella raden"
|
||||||
|
},
|
||||||
|
"focus": {
|
||||||
|
"label": "Fokus",
|
||||||
|
"tooltip": "Gör endast den aktuella raden vit"
|
||||||
|
},
|
||||||
|
"offset": {
|
||||||
|
"label": "Förskjutning",
|
||||||
|
"tooltip": "Förskjut den aktuella raden åt höger"
|
||||||
|
},
|
||||||
|
"scale": {
|
||||||
|
"label": "Skala",
|
||||||
|
"tooltip": "Skala den aktuella raden"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tooltip": "Välj effekt att applicera på den aktuella raden"
|
||||||
|
},
|
||||||
|
"precise-timing": {
|
||||||
|
"label": "Gör låttexterna perfekt synkroniserade",
|
||||||
|
"tooltip": "Beräkna till millisekunden när nästa rad ska visas (kan ha en liten inverkan på prestanda)"
|
||||||
|
},
|
||||||
|
"romanization": {
|
||||||
|
"label": "Romanisera låttexter",
|
||||||
|
"tooltip": "Om låttexterna är på ett annat språk, försök visa en latinsk version."
|
||||||
|
},
|
||||||
|
"show-lyrics-even-if-inexact": {
|
||||||
|
"label": "Visa låttexter även om de inte är exakta",
|
||||||
|
"tooltip": "Om låten inte hittas försöker tillägget igen med en annan sökförfrågan.\nResultatet från det andra försöket kanske inte är exakt."
|
||||||
|
},
|
||||||
|
"show-time-codes": {
|
||||||
|
"label": "Visa tidskoder",
|
||||||
|
"tooltip": "Visa tidskoderna bredvid låttexterna"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "Synkroniserade Låttexter",
|
||||||
|
"refetch-btn": {
|
||||||
|
"fetching": "Hämtar...",
|
||||||
|
"normal": "Hämta låttexter igen"
|
||||||
|
},
|
||||||
|
"warnings": {
|
||||||
|
"duration-mismatch": "⚠️ - Texterna kan vara osynkroniserade på grund av en skillnad i spårlängd.",
|
||||||
|
"inexact": "⚠️ - Låttexterna för den här låten kanske inte är exakta",
|
||||||
|
"instrumental": "⚠️ - Det här är en instrumentallåt"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"taskbar-mediacontrol": {
|
||||||
|
"description": "Kontrollera uppspelning från aktivitetsfältet i Windows",
|
||||||
|
"name": "Mediakontroll i aktivitetsfältet"
|
||||||
|
},
|
||||||
|
"touchbar": {
|
||||||
|
"description": "Lägger till en TouchBar-widget för macOS-användare",
|
||||||
|
"name": "TouchBar"
|
||||||
|
},
|
||||||
|
"tuna-obs": {
|
||||||
|
"description": "Integration med OBS-pluginprogrammet Tuna",
|
||||||
|
"name": "Tuna OBS"
|
||||||
|
},
|
||||||
|
"unobtrusive-player": {
|
||||||
|
"description": "Undviker att spelaren visas när musik spelas",
|
||||||
|
"name": "Diskret Spelare"
|
||||||
|
},
|
||||||
"video-toggle": {
|
"video-toggle": {
|
||||||
|
"description": "Lägger till en knapp för att växla mellan video/musik-läge. Kan också valfritt ta bort hela videofliken",
|
||||||
"menu": {
|
"menu": {
|
||||||
"align": {
|
"align": {
|
||||||
|
"label": "Justering",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"left": "Vänster",
|
"left": "Vänster",
|
||||||
"middle": "Mitten",
|
"middle": "Mitten",
|
||||||
"right": "Höger"
|
"right": "Höger"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"force-hide": "Tvinga borttagning av videoflik",
|
||||||
"mode": {
|
"mode": {
|
||||||
|
"label": "Läge",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"disabled": "Inaktiverad"
|
"custom": "Anpassad växling",
|
||||||
|
"disabled": "Inaktiverad",
|
||||||
|
"native": "Inbyggd växling"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"name": "Video PÅ/AV",
|
||||||
"templates": {
|
"templates": {
|
||||||
"button-song": "Låt"
|
"button-song": "Låt",
|
||||||
|
"button-video": "Video"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"visualizer": {
|
||||||
|
"description": "Lägger till en visualisering i spelaren",
|
||||||
|
"menu": {
|
||||||
|
"visualizer-type": "Visualiseringstyp"
|
||||||
|
},
|
||||||
|
"name": "Visualiserare"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -150,6 +150,13 @@
|
|||||||
"visual-tweaks": {
|
"visual-tweaks": {
|
||||||
"label": "காட்சி மாற்றங்கள்",
|
"label": "காட்சி மாற்றங்கள்",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
|
"custom-window-title": {
|
||||||
|
"label": "தனிப்பயன் சாளர தலைப்பு",
|
||||||
|
"prompt": {
|
||||||
|
"label": "தனிப்பயன் சாளர தலைப்பை உள்ளிடவும்: (முடக்க காலியாக விடவும்)",
|
||||||
|
"placeholder": "எடுத்துக்காட்டு: YouTube இசை"
|
||||||
|
}
|
||||||
|
},
|
||||||
"like-buttons": {
|
"like-buttons": {
|
||||||
"default": "இயல்புநிலை",
|
"default": "இயல்புநிலை",
|
||||||
"force-show": "படை நிகழ்ச்சி",
|
"force-show": "படை நிகழ்ச்சி",
|
||||||
@ -381,6 +388,11 @@
|
|||||||
},
|
},
|
||||||
"templates": {
|
"templates": {
|
||||||
"title": "திறந்த தலைப்புகள் தேர்வாளர்"
|
"title": "திறந்த தலைப்புகள் தேர்வாளர்"
|
||||||
|
},
|
||||||
|
"toast": {
|
||||||
|
"caption-changed": "தலைப்பு {{language}} என மாற்றப்பட்டது",
|
||||||
|
"caption-disabled": "தலைப்புகள் முடக்கப்பட்டன",
|
||||||
|
"no-captions": "இந்த பாடலுக்கு தலைப்புகள் எதுவும் கிடைக்கவில்லை"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"compact-sidebar": {
|
"compact-sidebar": {
|
||||||
@ -600,7 +612,15 @@
|
|||||||
},
|
},
|
||||||
"navigation": {
|
"navigation": {
|
||||||
"description": "உங்களுக்கு பிடித்த உலாவியைப் போலவே இடைமுகத்தில் நேரடியாக ஒருங்கிணைக்கப்பட்ட அடுத்த/பின் வழிசெலுத்தல் அம்புகள்",
|
"description": "உங்களுக்கு பிடித்த உலாவியைப் போலவே இடைமுகத்தில் நேரடியாக ஒருங்கிணைக்கப்பட்ட அடுத்த/பின் வழிசெலுத்தல் அம்புகள்",
|
||||||
"name": "வானோடல்"
|
"name": "வானோடல்",
|
||||||
|
"templates": {
|
||||||
|
"back": {
|
||||||
|
"title": "முந்தைய பக்கத்திற்குச் செல்"
|
||||||
|
},
|
||||||
|
"forward": {
|
||||||
|
"title": "அடுத்த பக்கத்திற்குச் செல்"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"no-google-login": {
|
"no-google-login": {
|
||||||
"description": "இடைமுகத்திலிருந்து Google உள்நுழைவு பொத்தான்கள் மற்றும் இணைப்புகளை அகற்று",
|
"description": "இடைமுகத்திலிருந்து Google உள்நுழைவு பொத்தான்கள் மற்றும் இணைப்புகளை அகற்று",
|
||||||
@ -692,7 +712,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"description": "வீடியோ மேலடுக்கில் ஒரு பொத்தானைக் கொண்டு வீடியோ தரத்தை மாற்ற அனுமதிக்கிறது",
|
"description": "வீடியோ மேலடுக்கில் ஒரு பொத்தானைக் கொண்டு வீடியோ தரத்தை மாற்ற அனுமதிக்கிறது",
|
||||||
"name": "வீடியோ தர மாற்றி"
|
"name": "வீடியோ தர மாற்றி",
|
||||||
|
"renderer": {
|
||||||
|
"quality-settings-button": {
|
||||||
|
"label": "திறந்த பிளேயர் தர மாற்றி"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"scrobbler": {
|
"scrobbler": {
|
||||||
"description": "ச்க்ரோப்ளிங் ஆதரவைச் சேர் (last.fm, Listenbrainz முதலியன)",
|
"description": "ச்க்ரோப்ளிங் ஆதரவைச் சேர் (last.fm, Listenbrainz முதலியன)",
|
||||||
|
|||||||
@ -150,6 +150,13 @@
|
|||||||
"visual-tweaks": {
|
"visual-tweaks": {
|
||||||
"label": "ปรับแต่งหน้าตาแอป",
|
"label": "ปรับแต่งหน้าตาแอป",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
|
"custom-window-title": {
|
||||||
|
"label": "ชื่อหน้าต่างกำหนดเอง",
|
||||||
|
"prompt": {
|
||||||
|
"label": "กำหนดชื่อหน้าต่างที่ต้องการ: (ปล่อยว่างเพื่อปิดใช้งาน)",
|
||||||
|
"placeholder": "ตัวอย่าง: Youtube Music"
|
||||||
|
}
|
||||||
|
},
|
||||||
"like-buttons": {
|
"like-buttons": {
|
||||||
"default": "ค่าเริ่มต้น",
|
"default": "ค่าเริ่มต้น",
|
||||||
"force-show": "บังคับให้แสดง",
|
"force-show": "บังคับให้แสดง",
|
||||||
@ -381,6 +388,11 @@
|
|||||||
},
|
},
|
||||||
"templates": {
|
"templates": {
|
||||||
"title": "เปิดตัวเลือกคำบรรยาย"
|
"title": "เปิดตัวเลือกคำบรรยาย"
|
||||||
|
},
|
||||||
|
"toast": {
|
||||||
|
"caption-changed": "เปลี่ยนคำบรรยายเป็นภาษา {{language}}",
|
||||||
|
"caption-disabled": "คำบรรยายถูกปิดใช้งาน",
|
||||||
|
"no-captions": "ไม่มีคำบรรยายสำหรับเพลงนี้"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"compact-sidebar": {
|
"compact-sidebar": {
|
||||||
@ -432,7 +444,15 @@
|
|||||||
"hide-duration-left": "ซ่อนระยะเวลาที่เหลือ",
|
"hide-duration-left": "ซ่อนระยะเวลาที่เหลือ",
|
||||||
"hide-github-button": "ซ่อนปุ่มลิงก์ GitHub",
|
"hide-github-button": "ซ่อนปุ่มลิงก์ GitHub",
|
||||||
"play-on-youtube-music": "เล่นบน YouTube Music",
|
"play-on-youtube-music": "เล่นบน YouTube Music",
|
||||||
"set-inactivity-timeout": "ตั้งระยะเวลาไม่มีกิจกรรม"
|
"set-inactivity-timeout": "ตั้งระยะเวลาไม่มีกิจกรรม",
|
||||||
|
"set-status-display-type": {
|
||||||
|
"label": "ข้อความสถานะ",
|
||||||
|
"submenu": {
|
||||||
|
"artist": "กำลังฟัง {ชื่อนักร้อง}",
|
||||||
|
"title": "กำลังฟัง {ชื่อเพลง}",
|
||||||
|
"youtube-music": "กำลังฟัง YouTube Music"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"name": "แสดงกิจกรรมบนดิสคอร์ด",
|
"name": "แสดงกิจกรรมบนดิสคอร์ด",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
@ -600,7 +620,15 @@
|
|||||||
},
|
},
|
||||||
"navigation": {
|
"navigation": {
|
||||||
"description": "ลูกศรนำทางถัดไป/ย้อนกลับรวมอยู่ในอินเทอร์เฟซโดยตรง เช่นเดียวกับในเบราว์เซอร์ที่คุณชื่นชอบ",
|
"description": "ลูกศรนำทางถัดไป/ย้อนกลับรวมอยู่ในอินเทอร์เฟซโดยตรง เช่นเดียวกับในเบราว์เซอร์ที่คุณชื่นชอบ",
|
||||||
"name": "การนำทาง"
|
"name": "การนำทาง",
|
||||||
|
"templates": {
|
||||||
|
"back": {
|
||||||
|
"title": "ไปหน้าก่อนหน้า"
|
||||||
|
},
|
||||||
|
"forward": {
|
||||||
|
"title": "ไปหน้าถัดไป"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"no-google-login": {
|
"no-google-login": {
|
||||||
"description": "ลบปุ่มเข้าสู่ระบบ Google และลิงก์ออกจากอินเทอร์เฟซ",
|
"description": "ลบปุ่มเข้าสู่ระบบ Google และลิงก์ออกจากอินเทอร์เฟซ",
|
||||||
@ -692,7 +720,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"description": "อนุญาตให้เปลี่ยนคุณภาพของวิดีโอด้วยปุ่มที่แสดงเหนือวิดีโอ",
|
"description": "อนุญาตให้เปลี่ยนคุณภาพของวิดีโอด้วยปุ่มที่แสดงเหนือวิดีโอ",
|
||||||
"name": "ที่เปลี่ยนคุณภาพวิดีโอ"
|
"name": "ที่เปลี่ยนคุณภาพวิดีโอ",
|
||||||
|
"renderer": {
|
||||||
|
"quality-settings-button": {
|
||||||
|
"label": "เปิดตัวเปลี่ยนคุณภาพเครื่องเล่น"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"scrobbler": {
|
"scrobbler": {
|
||||||
"description": "รองรับการบันทึกการเล่นเพลง (เช่น last.fm, Listenbrainz)",
|
"description": "รองรับการบันทึกการเล่นเพลง (เช่น last.fm, Listenbrainz)",
|
||||||
@ -859,7 +892,8 @@
|
|||||||
},
|
},
|
||||||
"name": "ปุ่มวิดีโอ",
|
"name": "ปุ่มวิดีโอ",
|
||||||
"templates": {
|
"templates": {
|
||||||
"button-song": "เพลง"
|
"button-song": "เพลง",
|
||||||
|
"button-video": "วิดีโอ"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"visualizer": {
|
"visualizer": {
|
||||||
|
|||||||
@ -150,6 +150,13 @@
|
|||||||
"visual-tweaks": {
|
"visual-tweaks": {
|
||||||
"label": "Görsel İnce Ayarlar",
|
"label": "Görsel İnce Ayarlar",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
|
"custom-window-title": {
|
||||||
|
"label": "Özel pencere başlığı",
|
||||||
|
"prompt": {
|
||||||
|
"label": "Özel pencere başlığı girin: (devre dışı bırakmak için boş bırakın)",
|
||||||
|
"placeholder": "Örnek: Youtube Music"
|
||||||
|
}
|
||||||
|
},
|
||||||
"like-buttons": {
|
"like-buttons": {
|
||||||
"default": "Varsayılan",
|
"default": "Varsayılan",
|
||||||
"force-show": "Zorla göster",
|
"force-show": "Zorla göster",
|
||||||
@ -414,6 +421,19 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"custom-output-device": {
|
||||||
|
"description": "Şarkılar için özel bir medya çıkış aygıtı ayarlayın",
|
||||||
|
"menu": {
|
||||||
|
"device-selector": "Aygıt Seçin"
|
||||||
|
},
|
||||||
|
"name": "Özel Çıkış Aygıtı",
|
||||||
|
"prompt": {
|
||||||
|
"device-selector": {
|
||||||
|
"label": "Kullanılacak medya çıkış aygıtını seçin",
|
||||||
|
"title": "Çıkış Aygıtını Seçin"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"disable-autoplay": {
|
"disable-autoplay": {
|
||||||
"description": "Şarkıların otomatik olarak duraklatılmasını sağlar",
|
"description": "Şarkıların otomatik olarak duraklatılmasını sağlar",
|
||||||
"menu": {
|
"menu": {
|
||||||
@ -437,7 +457,15 @@
|
|||||||
"hide-duration-left": "Kalan süreyi gizle",
|
"hide-duration-left": "Kalan süreyi gizle",
|
||||||
"hide-github-button": "GitHub bağlantısını gizle",
|
"hide-github-button": "GitHub bağlantısını gizle",
|
||||||
"play-on-youtube-music": "YouTube Music de oynat",
|
"play-on-youtube-music": "YouTube Music de oynat",
|
||||||
"set-inactivity-timeout": "Hareketsizlik zaman aşımını ayarla"
|
"set-inactivity-timeout": "Hareketsizlik zaman aşımını ayarla",
|
||||||
|
"set-status-display-type": {
|
||||||
|
"label": "Durum metni",
|
||||||
|
"submenu": {
|
||||||
|
"artist": "{artist} Dinleniyor",
|
||||||
|
"title": "{song title} Dinleniyor",
|
||||||
|
"youtube-music": "YouTube Müzik Dinleniyor"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"name": "Discord Etkinlik Durumu",
|
"name": "Discord Etkinlik Durumu",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
@ -729,6 +757,7 @@
|
|||||||
"listenbrainz": {
|
"listenbrainz": {
|
||||||
"token": "ListenBrainz kullanıcı kimliğinizi girin"
|
"token": "ListenBrainz kullanıcı kimliğinizi girin"
|
||||||
},
|
},
|
||||||
|
"scrobble-alternative-artist": "Alternatif sanatçıları kullan",
|
||||||
"scrobble-alternative-title": "Alternatif başlıklar kullan",
|
"scrobble-alternative-title": "Alternatif başlıklar kullan",
|
||||||
"scrobble-other-media": "Diğer medya ortamlarında listele"
|
"scrobble-other-media": "Diğer medya ortamlarında listele"
|
||||||
},
|
},
|
||||||
@ -846,6 +875,27 @@
|
|||||||
"description": "macOS kullanıcıları için bir TouchBar widget'ı ekler",
|
"description": "macOS kullanıcıları için bir TouchBar widget'ı ekler",
|
||||||
"name": "TouchBar"
|
"name": "TouchBar"
|
||||||
},
|
},
|
||||||
|
"transparent-player": {
|
||||||
|
"description": "Uygulama penceresini şeffaf yapar",
|
||||||
|
"menu": {
|
||||||
|
"opacity": {
|
||||||
|
"label": "Opaklık",
|
||||||
|
"submenu": {
|
||||||
|
"percent": "%{{opacity}}"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"label": "Tür",
|
||||||
|
"submenu": {
|
||||||
|
"acrylic": "Akrilik",
|
||||||
|
"mica": "Mika",
|
||||||
|
"none": "Hiçbiri",
|
||||||
|
"tabbed": "Sekmeli"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "Şeffaf Oynatıcı"
|
||||||
|
},
|
||||||
"tuna-obs": {
|
"tuna-obs": {
|
||||||
"description": "OBS eklentisi Tuna ile entegrasyon sağlar",
|
"description": "OBS eklentisi Tuna ile entegrasyon sağlar",
|
||||||
"name": "Tuna OBS"
|
"name": "Tuna OBS"
|
||||||
|
|||||||
@ -30,7 +30,7 @@
|
|||||||
"receive-command": "Đã nhận được lệnh qua giao thức: \"{{command}}\""
|
"receive-command": "Đã nhận được lệnh qua giao thức: \"{{command}}\""
|
||||||
},
|
},
|
||||||
"theme": {
|
"theme": {
|
||||||
"css-file-not-found": "Tệp tin CSS \"{{cssFile}}\"không tồn tại, đang bỏ qua"
|
"css-file-not-found": "Tệp CSS \"{{cssFile}}\" không tồn tại, đang bỏ qua"
|
||||||
},
|
},
|
||||||
"unresponsive": {
|
"unresponsive": {
|
||||||
"details": "Lỗi không phản hồi!\n{{error}}"
|
"details": "Lỗi không phản hồi!\n{{error}}"
|
||||||
@ -44,7 +44,7 @@
|
|||||||
},
|
},
|
||||||
"dialog": {
|
"dialog": {
|
||||||
"hide-menu-enabled": {
|
"hide-menu-enabled": {
|
||||||
"detail": "Menu đã ẩn, ấn phím 'Alt' để hiện menu (hoặc ấn 'Escape' nếu bạn đang bật In-app Menu)",
|
"detail": "Menu đã ẩn, ấn phím 'Alt' để hiện menu (hoặc ấn phím 'Esc' nếu bạn đang bật In-app Menu)",
|
||||||
"message": "Ẩn Menu đã được bật",
|
"message": "Ẩn Menu đã được bật",
|
||||||
"title": "Ẩn Menu đã được bật"
|
"title": "Ẩn Menu đã được bật"
|
||||||
},
|
},
|
||||||
@ -53,7 +53,7 @@
|
|||||||
"later": "Để sau",
|
"later": "Để sau",
|
||||||
"restart-now": "Khởi động lại ngay"
|
"restart-now": "Khởi động lại ngay"
|
||||||
},
|
},
|
||||||
"detail": "Tiện ích mở rộng \"{{pluginName}}\" yêu cầu khởi động lại ứng dụng để áp dụng",
|
"detail": "Phần mở rộng \"{{pluginName}}\" yêu cầu khởi động lại ứng dụng để áp dụng",
|
||||||
"message": "\"{{pluginName}}\" cần khởi động lại",
|
"message": "\"{{pluginName}}\" cần khởi động lại",
|
||||||
"title": "Yêu cầu khởi động lại"
|
"title": "Yêu cầu khởi động lại"
|
||||||
},
|
},
|
||||||
@ -74,7 +74,7 @@
|
|||||||
"ok": "Đồng ý"
|
"ok": "Đồng ý"
|
||||||
},
|
},
|
||||||
"detail": "Đã có phiên bản mới hơn, bạn có thể tải xuống tại {{downloadLink}}",
|
"detail": "Đã có phiên bản mới hơn, bạn có thể tải xuống tại {{downloadLink}}",
|
||||||
"message": "Đã có phiên bản mới",
|
"message": "Đã có một phiên bản mới",
|
||||||
"title": "Cập nhật có sẵn"
|
"title": "Cập nhật có sẵn"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -96,7 +96,7 @@
|
|||||||
"advanced-options": {
|
"advanced-options": {
|
||||||
"label": "Tùy chọn nâng cao",
|
"label": "Tùy chọn nâng cao",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"auto-reset-app-cache": "Làm mới bộ nhớ đệm khi khởi động ứng dụng",
|
"auto-reset-app-cache": "Làm mới bộ nhớ đệm khi mở ứng dụng",
|
||||||
"disable-hardware-acceleration": "Vô hiệu hóa tăng tốc phần cứng",
|
"disable-hardware-acceleration": "Vô hiệu hóa tăng tốc phần cứng",
|
||||||
"edit-config-json": "Chỉnh sửa config.json",
|
"edit-config-json": "Chỉnh sửa config.json",
|
||||||
"override-user-agent": "Ghi đè User-Agent",
|
"override-user-agent": "Ghi đè User-Agent",
|
||||||
@ -106,7 +106,7 @@
|
|||||||
"prompt": {
|
"prompt": {
|
||||||
"label": "Nhập địa chỉ Proxy: (để trống nếu muốn tắt)",
|
"label": "Nhập địa chỉ Proxy: (để trống nếu muốn tắt)",
|
||||||
"placeholder": "Ví dụ: SOCKS5://127.0.0.1:9999",
|
"placeholder": "Ví dụ: SOCKS5://127.0.0.1:9999",
|
||||||
"title": "Cài proxy"
|
"title": "Cài đặt proxy"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"toggle-dev-tools": "Bật/tắt DevTools"
|
"toggle-dev-tools": "Bật/tắt DevTools"
|
||||||
@ -116,19 +116,19 @@
|
|||||||
"auto-update": "Tự động cập nhật",
|
"auto-update": "Tự động cập nhật",
|
||||||
"hide-menu": {
|
"hide-menu": {
|
||||||
"dialog": {
|
"dialog": {
|
||||||
"message": "Menu sẽ bị ẩn khi ứng dụng được chạy vào lần tới, dùng phím [Alt] để hiện nó (hoặc phím [`] nếu sử dụng in-app-menu)",
|
"message": "Menu sẽ bị ẩn trong lần khởi chạy tiếp theo, dùng phím [Alt] để hiện nó (hoặc phím [`] nếu sử dụng in-app-menu)",
|
||||||
"title": "Ẩn Menu đã được bật"
|
"title": "Ẩn Menu đã được bật"
|
||||||
},
|
},
|
||||||
"label": "Ẩn Menu"
|
"label": "Ẩn Menu"
|
||||||
},
|
},
|
||||||
"language": {
|
"language": {
|
||||||
"dialog": {
|
"dialog": {
|
||||||
"message": "Ngôn ngữ sẽ được thay đổi sau khi ứng dụng khởi động lại",
|
"message": "Ngôn ngữ sẽ được thay đổi sau khi khởi động lại ứng dụng",
|
||||||
"title": "Ngôn ngữ đã thay đổi"
|
"title": "Ngôn ngữ đã thay đổi"
|
||||||
},
|
},
|
||||||
"label": "Ngôn ngữ",
|
"label": "Ngôn ngữ",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"to-help-translate": "Bạn muốn giúp dịch? Bấm vào đây"
|
"to-help-translate": "— Bạn muốn hỗ trợ dịch? Bấm vào đây —"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resume-on-start": "Tiếp tục bài hát cuối cùng khi ứng dụng khởi động",
|
"resume-on-start": "Tiếp tục bài hát cuối cùng khi ứng dụng khởi động",
|
||||||
@ -150,6 +150,13 @@
|
|||||||
"visual-tweaks": {
|
"visual-tweaks": {
|
||||||
"label": "Tinh chỉnh hình ảnh",
|
"label": "Tinh chỉnh hình ảnh",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
|
"custom-window-title": {
|
||||||
|
"label": "Tiêu đề cửa sổ tùy chỉnh",
|
||||||
|
"prompt": {
|
||||||
|
"label": "Nhập tiêu đề cửa sổ tùy chỉnh: (để trống để vô hiệu hóa)",
|
||||||
|
"placeholder": "Ví dụ: Youtube Music"
|
||||||
|
}
|
||||||
|
},
|
||||||
"like-buttons": {
|
"like-buttons": {
|
||||||
"default": "Mặc định",
|
"default": "Mặc định",
|
||||||
"force-show": "Tập trung hiển thị",
|
"force-show": "Tập trung hiển thị",
|
||||||
@ -163,7 +170,7 @@
|
|||||||
"cancel": "Hủy",
|
"cancel": "Hủy",
|
||||||
"remove": "Loại bỏ"
|
"remove": "Loại bỏ"
|
||||||
},
|
},
|
||||||
"remove-theme": "Bạn có chắc muốn loại bỏ chủ đề tùy chỉnh không?",
|
"remove-theme": "Bạn có chắc muốn loại bỏ chủ đề tùy chỉnh này không?",
|
||||||
"remove-theme-message": "Tùy chọn này sẽ loại bỏ chủ đề tùy chỉnh"
|
"remove-theme-message": "Tùy chọn này sẽ loại bỏ chủ đề tùy chỉnh"
|
||||||
},
|
},
|
||||||
"label": "Chủ đề",
|
"label": "Chủ đề",
|
||||||
@ -186,7 +193,7 @@
|
|||||||
"submenu": {
|
"submenu": {
|
||||||
"force-reload": "Buộc tải lại",
|
"force-reload": "Buộc tải lại",
|
||||||
"reload": "Tải lại",
|
"reload": "Tải lại",
|
||||||
"reset-zoom": "Kích thước thực",
|
"reset-zoom": "Đặt lại",
|
||||||
"toggle-fullscreen": "Bật chế độ toàn màn hình",
|
"toggle-fullscreen": "Bật chế độ toàn màn hình",
|
||||||
"zoom-in": "Phóng to",
|
"zoom-in": "Phóng to",
|
||||||
"zoom-out": "Thu nhỏ"
|
"zoom-out": "Thu nhỏ"
|
||||||
@ -202,7 +209,7 @@
|
|||||||
"show": "Hiện cửa sổ",
|
"show": "Hiện cửa sổ",
|
||||||
"tooltip": {
|
"tooltip": {
|
||||||
"default": "YouTube Music",
|
"default": "YouTube Music",
|
||||||
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
|
"with-song-info": "YouTube Music: {{title}} - {{artist}}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -219,7 +226,7 @@
|
|||||||
"name": "Chặn quảng cáo"
|
"name": "Chặn quảng cáo"
|
||||||
},
|
},
|
||||||
"album-actions": {
|
"album-actions": {
|
||||||
"description": "Thêm nút hủy không thích, không thích, thích và không thích để áp dụng cho tất cả danh sách phát hoặc album",
|
"description": "Thêm nút Hủy không thích, Không thích, Thích và Hủy thích để áp dụng cho tất cả bài hát trong danh sách phát hoặc album",
|
||||||
"name": "Tác vụ với album"
|
"name": "Tác vụ với album"
|
||||||
},
|
},
|
||||||
"album-color-theme": {
|
"album-color-theme": {
|
||||||
@ -280,7 +287,7 @@
|
|||||||
"name": "Chế độ Môi trường xung quanh"
|
"name": "Chế độ Môi trường xung quanh"
|
||||||
},
|
},
|
||||||
"amuse": {
|
"amuse": {
|
||||||
"description": "Thêm hỗ trợ YouTube Music cho tiện ích hiển thị bài hát đang phát Amuse của 6K Labs.",
|
"description": "Thêm hỗ trợ YouTube Music cho tiện ích hiển thị bài hát đang phát Amuse của 6K Labs",
|
||||||
"name": "Amuse",
|
"name": "Amuse",
|
||||||
"response": {
|
"response": {
|
||||||
"query": "Máy chủ API của Amuse đang chạy. GET /query để lấy thông tin về bài hát."
|
"query": "Máy chủ API của Amuse đang chạy. GET /query để lấy thông tin về bài hát."
|
||||||
@ -317,7 +324,7 @@
|
|||||||
"label": "Cổng"
|
"label": "Cổng"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"name": "Máy chủ API [Beta]",
|
"name": "Máy chủ API [Thử nghiệm]",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
"hostname": {
|
"hostname": {
|
||||||
"label": "Điền tên máy chủ (như 0.0.0.0) cho máy chủ API:",
|
"label": "Điền tên máy chủ (như 0.0.0.0) cho máy chủ API:",
|
||||||
@ -348,7 +355,7 @@
|
|||||||
"name": "Bộ chuyển đổi xác minh máy chủ Proxy",
|
"name": "Bộ chuyển đổi xác minh máy chủ Proxy",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
"hostname": {
|
"hostname": {
|
||||||
"label": "Nhập tên của máy chủ proxy lân cận (bắt buộc khởi động lại ứng dụng):",
|
"label": "Nhập tên của máy chủ proxy lân cận (yêu cầu khởi động lại ứng dụng):",
|
||||||
"title": "Tên máy chủ Proxy"
|
"title": "Tên máy chủ Proxy"
|
||||||
},
|
},
|
||||||
"port": {
|
"port": {
|
||||||
@ -369,7 +376,7 @@
|
|||||||
"description": "Bộ lựa chọn phụ đề cho các bài hát trên Youtube Music",
|
"description": "Bộ lựa chọn phụ đề cho các bài hát trên Youtube Music",
|
||||||
"menu": {
|
"menu": {
|
||||||
"autoload": "Tự động chọn phụ đề vừa sử dụng",
|
"autoload": "Tự động chọn phụ đề vừa sử dụng",
|
||||||
"disable-captions": "Không có phụ đề đặt làm mặc định"
|
"disable-captions": "Không có phụ đề làm mặc định"
|
||||||
},
|
},
|
||||||
"name": "Bộ lựa chọn phụ đề",
|
"name": "Bộ lựa chọn phụ đề",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
@ -381,10 +388,15 @@
|
|||||||
},
|
},
|
||||||
"templates": {
|
"templates": {
|
||||||
"title": "Mở lựa chọn phụ đề"
|
"title": "Mở lựa chọn phụ đề"
|
||||||
|
},
|
||||||
|
"toast": {
|
||||||
|
"caption-changed": "Phụ đề đã chuyển sang {{language}}",
|
||||||
|
"caption-disabled": "Tắt phụ đề",
|
||||||
|
"no-captions": "Không có phụ đề nào cho bài hát này"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"compact-sidebar": {
|
"compact-sidebar": {
|
||||||
"description": "Luôn đặt thanh bên cạnh ở chế độ thu gọn",
|
"description": "Luôn đặt thanh bên ở chế độ thu gọn",
|
||||||
"name": "Thanh bên thu gọn"
|
"name": "Thanh bên thu gọn"
|
||||||
},
|
},
|
||||||
"crossfade": {
|
"crossfade": {
|
||||||
@ -392,12 +404,12 @@
|
|||||||
"menu": {
|
"menu": {
|
||||||
"advanced": "Nâng cao"
|
"advanced": "Nâng cao"
|
||||||
},
|
},
|
||||||
"name": "Xen kẽ [thử nghiệm]",
|
"name": "Xen kẽ [Thử nghiệm]",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
"options": {
|
"options": {
|
||||||
"multi-input": {
|
"multi-input": {
|
||||||
"fade-in-duration": "Xuất hiện mờ dần trong khoảng thời gian (ms)",
|
"fade-in-duration": "Thời lượng mờ dần vào (ms)",
|
||||||
"fade-out-duration": "Khoảng thời gian hoát ra mờ dần (ms)",
|
"fade-out-duration": "Thời lượng mờ dần ra (ms)",
|
||||||
"fade-scaling": {
|
"fade-scaling": {
|
||||||
"label": "Làm mờ theo tỉ lệ",
|
"label": "Làm mờ theo tỉ lệ",
|
||||||
"linear": "Trực tuyến",
|
"linear": "Trực tuyến",
|
||||||
@ -409,10 +421,23 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"disable-autoplay": {
|
"custom-output-device": {
|
||||||
"description": "Bắt đầu bài hát khi ở chế độ \"tạm dừng\"",
|
"description": "Cài đặt cho thiết bị đầu ra tùy chỉnh cho bài hát",
|
||||||
"menu": {
|
"menu": {
|
||||||
"apply-once": "Áp dụng khi khởi động"
|
"device-selector": "Chọn thiết bị"
|
||||||
|
},
|
||||||
|
"name": "Thiết bị đầu ra tùy chỉnh",
|
||||||
|
"prompt": {
|
||||||
|
"device-selector": {
|
||||||
|
"label": "Chọn thiết bị phát làm đầu ra để dùng",
|
||||||
|
"title": "Chọn thiết bị đầu ra"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"disable-autoplay": {
|
||||||
|
"description": "Làm nhạc bắt đầu ở chế độ \"tạm dừng\". Ngoài ra có thể dừng nhạc khi khởi động ứng dụng (nếu có bật tính năng \"Tiếp tục bài hát cuối cùng khi ứng dụng khởi động\")",
|
||||||
|
"menu": {
|
||||||
|
"apply-once": "Chỉ áp dụng khi khởi động"
|
||||||
},
|
},
|
||||||
"name": "Tắt tự động phát"
|
"name": "Tắt tự động phát"
|
||||||
},
|
},
|
||||||
@ -432,9 +457,17 @@
|
|||||||
"hide-duration-left": "Ẩn thời lượng còn lại",
|
"hide-duration-left": "Ẩn thời lượng còn lại",
|
||||||
"hide-github-button": "Ẩn nút liên kết GitHub",
|
"hide-github-button": "Ẩn nút liên kết GitHub",
|
||||||
"play-on-youtube-music": "Phát trong Youtube Music",
|
"play-on-youtube-music": "Phát trong Youtube Music",
|
||||||
"set-inactivity-timeout": "Đặt thời gian chờ không hoạt động"
|
"set-inactivity-timeout": "Đặt thời gian chờ không hoạt động",
|
||||||
|
"set-status-display-type": {
|
||||||
|
"label": "Văn bản trạng thái",
|
||||||
|
"submenu": {
|
||||||
|
"artist": "Đang nghe nhạc của {artist}",
|
||||||
|
"title": "Đang nghe nhạc {song title}",
|
||||||
|
"youtube-music": "Đang nghe Youtube Music"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"name": "Discord Rich Presence",
|
"name": "Tích hợp trạng thái Discord",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
"set-inactivity-timeout": {
|
"set-inactivity-timeout": {
|
||||||
"label": "Nhập thời gian chờ không hoạt động tính bằng giây:",
|
"label": "Nhập thời gian chờ không hoạt động tính bằng giây:",
|
||||||
@ -477,8 +510,8 @@
|
|||||||
"playlist-has-only-one-song": "Danh sách phát chỉ có một mục, tải trực tiếp",
|
"playlist-has-only-one-song": "Danh sách phát chỉ có một mục, tải trực tiếp",
|
||||||
"playlist-id-not-found": "Không tìm thấy ID danh sách phát",
|
"playlist-id-not-found": "Không tìm thấy ID danh sách phát",
|
||||||
"playlist-is-empty": "Danh sách phát trống",
|
"playlist-is-empty": "Danh sách phát trống",
|
||||||
"playlist-is-mix-or-private": "Lỗi lấy thông tin danh sách phát: đảm bảo danh sách phát không ở chế độ riêng tư hoặc là danh sách phát \"Dành cho bạn\"\n\n{{error}}",
|
"playlist-is-mix-or-private": "Lỗi lấy thông tin danh sách phát: hãy đảm bảo danh sách phát không ở chế độ riêng tư hoặc danh sách phát \"Dành cho bạn\"\n\n{{error}}",
|
||||||
"preparing-file": "Đang chuẩn bị thư mục…",
|
"preparing-file": "Đang chuẩn bị tệp…",
|
||||||
"saving": "Đang lưu…",
|
"saving": "Đang lưu…",
|
||||||
"trying-to-get-playlist-id": "Đang lấy ID danh sách phát: {{playlistId}}",
|
"trying-to-get-playlist-id": "Đang lấy ID danh sách phát: {{playlistId}}",
|
||||||
"video-id-not-found": "Không tìm thấy video",
|
"video-id-not-found": "Không tìm thấy video",
|
||||||
@ -504,8 +537,8 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"download-playlist": "Tải danh sách phát",
|
"download-playlist": "Tải danh sách phát",
|
||||||
"presets": "Cài đặt sẵn",
|
"presets": "Tùy chọn định dạng",
|
||||||
"skip-existing": "Bỏ qua các tập tin hiện có"
|
"skip-existing": "Bỏ qua các tập tin đã có"
|
||||||
},
|
},
|
||||||
"name": "Trình tải xuống",
|
"name": "Trình tải xuống",
|
||||||
"renderer": {
|
"renderer": {
|
||||||
@ -516,15 +549,16 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"equalizer": {
|
"equalizer": {
|
||||||
"description": "Thêm bộ cân bằng âm thanh vào trình phát nhạc.",
|
"description": "Thêm bộ chỉnh âm để điều chỉnh âm thanh cho trình phát nhạc",
|
||||||
"menu": {
|
"menu": {
|
||||||
"presets": {
|
"presets": {
|
||||||
|
"label": "Thiết lập có sẵn",
|
||||||
"list": {
|
"list": {
|
||||||
"bass-booster": "Bộ tăng âm trầm"
|
"bass-booster": "Tăng âm trầm"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"name": "Cân bằng âm thanh"
|
"name": "Bộ chỉnh âm"
|
||||||
},
|
},
|
||||||
"exponential-volume": {
|
"exponential-volume": {
|
||||||
"description": "Làm cho thanh trượt âm lượng theo cấp số nhân để dễ dàng chọn âm lượng thấp hơn.",
|
"description": "Làm cho thanh trượt âm lượng theo cấp số nhân để dễ dàng chọn âm lượng thấp hơn.",
|
||||||
@ -544,7 +578,7 @@
|
|||||||
"lyrics-genius": {
|
"lyrics-genius": {
|
||||||
"description": "Thêm hỗ trợ lời bài hát cho hầu hết các bài hát",
|
"description": "Thêm hỗ trợ lời bài hát cho hầu hết các bài hát",
|
||||||
"menu": {
|
"menu": {
|
||||||
"romanized-lyrics": "Lời bài hát La Mã"
|
"romanized-lyrics": "Chuyển lời bài hát sang chữ Latin"
|
||||||
},
|
},
|
||||||
"name": "Lời bài hát từ Genius",
|
"name": "Lời bài hát từ Genius",
|
||||||
"renderer": {
|
"renderer": {
|
||||||
@ -599,7 +633,15 @@
|
|||||||
},
|
},
|
||||||
"navigation": {
|
"navigation": {
|
||||||
"description": "Mũi tên điều hướng Tiếp theo/Quay lại được tích hợp trực tiếp trong giao diện, giống như trong trình duyệt yêu thích của bạn",
|
"description": "Mũi tên điều hướng Tiếp theo/Quay lại được tích hợp trực tiếp trong giao diện, giống như trong trình duyệt yêu thích của bạn",
|
||||||
"name": "Điều hướng"
|
"name": "Điều hướng",
|
||||||
|
"templates": {
|
||||||
|
"back": {
|
||||||
|
"title": "Đi đến trang trước"
|
||||||
|
},
|
||||||
|
"forward": {
|
||||||
|
"title": "Đi đến trang tiếp theo"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"no-google-login": {
|
"no-google-login": {
|
||||||
"description": "Xóa các nút và liên kết đăng nhập Google khỏi giao diện",
|
"description": "Xóa các nút và liên kết đăng nhập Google khỏi giao diện",
|
||||||
@ -613,7 +655,7 @@
|
|||||||
"label": "Cài đặt tương tác",
|
"label": "Cài đặt tương tác",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"hide-button-text": "Ẩn tên nút",
|
"hide-button-text": "Ẩn tên nút",
|
||||||
"refresh-on-play-pause": "Làm mới khi phát/tạm dừng",
|
"refresh-on-play-pause": "Làm mới khi Phát/Tạm dừng",
|
||||||
"tray-controls": "Mở/Đóng khi nhấp vào khay"
|
"tray-controls": "Mở/Đóng khi nhấp vào khay"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -625,20 +667,20 @@
|
|||||||
},
|
},
|
||||||
"performance-improvement": {
|
"performance-improvement": {
|
||||||
"description": "Cải thiện hiệu suất thông qua kích hoạt scripts thử nghiệm",
|
"description": "Cải thiện hiệu suất thông qua kích hoạt scripts thử nghiệm",
|
||||||
"name": "Cải thiện hiệu năng [Beta]"
|
"name": "Cải thiện hiệu năng [Thử nghiệm]"
|
||||||
},
|
},
|
||||||
"picture-in-picture": {
|
"picture-in-picture": {
|
||||||
"description": "Cho phép chuyển ứng dụng sang chế độ ảnh trong ảnh",
|
"description": "Cho phép chuyển ứng dụng sang chế độ ảnh trong ảnh",
|
||||||
"menu": {
|
"menu": {
|
||||||
"always-on-top": "Luôn ở trên cùng",
|
"always-on-top": "Luôn ở trên cùng",
|
||||||
"hotkey": {
|
"hotkey": {
|
||||||
"label": "Phím nóng",
|
"label": "Phím tắt",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
"keybind-options": {
|
"keybind-options": {
|
||||||
"hotkey": "Phím nóng"
|
"hotkey": "Phím tắt"
|
||||||
},
|
},
|
||||||
"label": "Chọn phím nóng để chuyển đổi ảnh trong ảnh",
|
"label": "Chọn phím tắt để chuyển đổi ảnh trong ảnh",
|
||||||
"title": "Phím nóng ảnh trong ảnh"
|
"title": "Phím tắt ảnh trong ảnh"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"save-window-position": "Lưu vị trí cửa sổ",
|
"save-window-position": "Lưu vị trí cửa sổ",
|
||||||
@ -686,19 +728,24 @@
|
|||||||
"quality-changer": {
|
"quality-changer": {
|
||||||
"detail": "Chất lượng hiện tại: {{quality}}",
|
"detail": "Chất lượng hiện tại: {{quality}}",
|
||||||
"message": "Chọn chất lượng video:",
|
"message": "Chọn chất lượng video:",
|
||||||
"title": "Chọn chất lượng video:"
|
"title": "Chọn chất lượng video"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"description": "Cho phép thay đổi chất lượng video bằng một nút trên lớp phủ video",
|
"description": "Cho phép thay đổi chất lượng video bằng một nút trên lớp phủ video",
|
||||||
"name": "Thay đổi chất lượng video"
|
"name": "Thay đổi chất lượng video",
|
||||||
|
"renderer": {
|
||||||
|
"quality-settings-button": {
|
||||||
|
"label": "Mở trình thay đổi chất lượng"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"scrobbler": {
|
"scrobbler": {
|
||||||
"description": "Thêm hỗ trợ scrobbling (v.v. Last.fm, Listenbrainz)",
|
"description": "Thêm hỗ trợ scrobbling (v.v. Last.fm, Listenbrainz)",
|
||||||
"dialog": {
|
"dialog": {
|
||||||
"lastfm": {
|
"lastfm": {
|
||||||
"auth-failed": {
|
"auth-failed": {
|
||||||
"message": "Không thể xác minh với \nẨn thông báo cho đến lần bật ứng dụng tiếp theo.",
|
"message": "Không thể xác minh với Last.fm \nẨn thông báo cho đến lần bật ứng dụng tiếp theo.",
|
||||||
"title": "Xác minh thất bại"
|
"title": "Xác minh thất bại"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -710,6 +757,7 @@
|
|||||||
"listenbrainz": {
|
"listenbrainz": {
|
||||||
"token": "Nhập mã người dùng ListenBrainz"
|
"token": "Nhập mã người dùng ListenBrainz"
|
||||||
},
|
},
|
||||||
|
"scrobble-alternative-artist": "Dùng nghệ sĩ thay thế",
|
||||||
"scrobble-alternative-title": "Dùng tiêu đề thay thế",
|
"scrobble-alternative-title": "Dùng tiêu đề thay thế",
|
||||||
"scrobble-other-media": "Scrobber nội dung khác"
|
"scrobble-other-media": "Scrobber nội dung khác"
|
||||||
},
|
},
|
||||||
@ -747,45 +795,46 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"skip-disliked-songs": {
|
"skip-disliked-songs": {
|
||||||
"description": "Bỏ qua những bài hát không thích",
|
"description": "Tự động bỏ qua những bài hát bạn nhấn không thích",
|
||||||
"name": "Bỏ qua những bài hát không thích"
|
"name": "Bỏ qua bài hát không thích"
|
||||||
},
|
},
|
||||||
"skip-silences": {
|
"skip-silences": {
|
||||||
"description": "Tự động bỏ qua các đoạn im lặng trong bài hát",
|
"description": "Tự động bỏ qua các đoạn im lặng trong bài hát",
|
||||||
"name": "Bỏ qua đoạn im lặng"
|
"name": "Bỏ qua đoạn im lặng"
|
||||||
},
|
},
|
||||||
"sponsorblock": {
|
"sponsorblock": {
|
||||||
"description": "Tự động bỏ qua các phần không phải âm nhạc như phần giới thiệu/kết thúc hoặc các phần của video nhạc mà bài hát không được phát",
|
"description": "Tự động bỏ qua các phần không phải âm nhạc như phần intro/outro hoặc các phần không được phát của video nhạc",
|
||||||
"name": "SponsorBlock"
|
"name": "SponsorBlock"
|
||||||
},
|
},
|
||||||
"synced-lyrics": {
|
"synced-lyrics": {
|
||||||
"description": "Cung cấp lời bài hát được đồng bộ hoá với các bài hát, sử dụng những nhà cung cấp như LRClib.",
|
"description": "Cung cấp lời được đồng bộ với bài hát, sử dụng các nhà cung cấp như LRClib.",
|
||||||
"errors": {
|
"errors": {
|
||||||
"fetch": "⚠️\t\tĐã xảy ra lỗi khi tìm lời bài hát.\n\tVui lòng thử lại sau.",
|
"fetch": "⚠️\t\tĐã xảy ra lỗi khi tìm lời bài hát.\n\tVui lòng thử lại sau.",
|
||||||
"not-found": "⚠️ Không tìm thấy lời cho bài hát này."
|
"not-found": "⚠️ Không tìm thấy lời cho bài hát này."
|
||||||
},
|
},
|
||||||
"menu": {
|
"menu": {
|
||||||
"default-text-string": {
|
"default-text-string": {
|
||||||
"label": "Kí tự mặc định giữa các lời bài hát",
|
"label": "Kí tự giữa các lời bài hát",
|
||||||
"tooltip": "Chọn kí tự mặc định cho khoảng trống giữa các lời bài hát"
|
"tooltip": "Chọn kí tự mặc định cho khoảng trống giữa các lời bài hát"
|
||||||
},
|
},
|
||||||
"line-effect": {
|
"line-effect": {
|
||||||
"label": "Kiểu đường thẳng",
|
"label": "Kiểu lời nhạc",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"fancy": {
|
"fancy": {
|
||||||
"label": "Màu mè"
|
"label": "Màu mè",
|
||||||
|
"tooltip": "Làm đoạn lời nhạc đang nghe to hơn và nổi bật hơn"
|
||||||
},
|
},
|
||||||
"focus": {
|
"focus": {
|
||||||
"label": "Tập trung",
|
"label": "Tập trung",
|
||||||
"tooltip": "Chỉ làm cho dòng hiện tại có màu trắng"
|
"tooltip": "Chỉ làm cho dòng hiện tại có màu trắng"
|
||||||
},
|
},
|
||||||
"offset": {
|
"offset": {
|
||||||
"label": "Độ lệch",
|
"label": "Lệch",
|
||||||
"tooltip": "Độ lệch bên phải của dòng hiện tại"
|
"tooltip": "Làm dòng hiện tại lệch sang bên phải"
|
||||||
},
|
},
|
||||||
"scale": {
|
"scale": {
|
||||||
"label": "Tỉ lệ",
|
"label": "Phóng to",
|
||||||
"tooltip": "Áp dụng tỉ lệ cho dòng hiện tại"
|
"tooltip": "Làm dòng hiện tại to hơn các dòng khác"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"tooltip": "Chọn kiểu để áp dụng cho dòng hiện tại"
|
"tooltip": "Chọn kiểu để áp dụng cho dòng hiện tại"
|
||||||
@ -815,27 +864,48 @@
|
|||||||
"warnings": {
|
"warnings": {
|
||||||
"duration-mismatch": "⚠️ - Lời bài hát có thể không đồng bộ do thời lượng không khớp.",
|
"duration-mismatch": "⚠️ - Lời bài hát có thể không đồng bộ do thời lượng không khớp.",
|
||||||
"inexact": "⚠️ - Lời bài hát này có thể không chính xác",
|
"inexact": "⚠️ - Lời bài hát này có thể không chính xác",
|
||||||
"instrumental": "⚠️ - Đây là một bài hát trình diễn bằng nhạc khí"
|
"instrumental": "⚠️ - Đây là một bài hát không lời"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"taskbar-mediacontrol": {
|
"taskbar-mediacontrol": {
|
||||||
"description": "Kiểm soát phát lại từ thanh tác vụ Windows của bạn",
|
"description": "Điều khiển nhạc từ cửa sổ xem trước trên thanh tác vụ Windows của bạn",
|
||||||
"name": "Kiểm soát phương tiện trên thanh tác vụ"
|
"name": "Điều khiển phương tiện trên thanh tác vụ"
|
||||||
},
|
},
|
||||||
"touchbar": {
|
"touchbar": {
|
||||||
"description": "Thêm tiện ích TouchBar cho người dùng macOS",
|
"description": "Thêm tiện ích TouchBar cho người dùng macOS",
|
||||||
"name": "TouchBar"
|
"name": "TouchBar"
|
||||||
},
|
},
|
||||||
|
"transparent-player": {
|
||||||
|
"description": "Làm cho cửa sổ ứng dụng có hiệu ứng trong suốt",
|
||||||
|
"menu": {
|
||||||
|
"opacity": {
|
||||||
|
"label": "Độ mờ",
|
||||||
|
"submenu": {
|
||||||
|
"percent": "{{opacity}}%"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"label": "Kiểu nền",
|
||||||
|
"submenu": {
|
||||||
|
"acrylic": "Acrylic",
|
||||||
|
"mica": "Mica",
|
||||||
|
"none": "Không có",
|
||||||
|
"tabbed": "Tabbed"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "Trình phát trong suốt"
|
||||||
|
},
|
||||||
"tuna-obs": {
|
"tuna-obs": {
|
||||||
"description": "Tích hợp với plugin Tuna của OBS",
|
"description": "Tích hợp với plugin Tuna của OBS",
|
||||||
"name": "Tuna OBS"
|
"name": "Tuna OBS"
|
||||||
},
|
},
|
||||||
"unobtrusive-player": {
|
"unobtrusive-player": {
|
||||||
"description": "Ngăn trình phát nhạc xuất hiện đột ngột khi phát một bài hát.",
|
"description": "Ngăn trình phát nhạc xuất hiện đột ngột khi phát một bài hát",
|
||||||
"name": "Trình phát nhạc ẩn"
|
"name": "Không hiện trình phát nhạc khi phát"
|
||||||
},
|
},
|
||||||
"video-toggle": {
|
"video-toggle": {
|
||||||
"description": "Thêm nút để chuyển giữa chế độ Video/Bài hát. Cũng có thể tùy ý xóa toàn bộ tab video",
|
"description": "Thêm nút để chuyển giữa chế độ Video/Bài hát. Cũng có thể ẩn toàn bộ video",
|
||||||
"menu": {
|
"menu": {
|
||||||
"align": {
|
"align": {
|
||||||
"label": "Căn chỉnh",
|
"label": "Căn chỉnh",
|
||||||
@ -845,27 +915,28 @@
|
|||||||
"right": "Phải"
|
"right": "Phải"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"force-hide": "Buộc loại bỏ tab video",
|
"force-hide": "Buộc ẩn video",
|
||||||
"mode": {
|
"mode": {
|
||||||
"label": "Chế độ",
|
"label": "Chế độ",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"custom": "Chuyển đổi tùy chỉnh",
|
"custom": "Tùy chỉnh",
|
||||||
"disabled": "Vô hiệu hoá",
|
"disabled": "Vô hiệu hoá",
|
||||||
"native": "Chuyển đổi gốc"
|
"native": "Gốc"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"name": "Chuyển đổi video",
|
"name": "Chuyển đổi video",
|
||||||
"templates": {
|
"templates": {
|
||||||
"button-song": "Bài hát"
|
"button-song": "Bài hát",
|
||||||
|
"button-video": "Video"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"visualizer": {
|
"visualizer": {
|
||||||
"description": "Thêm trình hiển thị cho trình phát",
|
"description": "Hiển thị sóng nhạc thay thế cho video (hay \"Music visualizer\")",
|
||||||
"menu": {
|
"menu": {
|
||||||
"visualizer-type": "Loại trình hiển thị"
|
"visualizer-type": "Loại Sóng nhạc"
|
||||||
},
|
},
|
||||||
"name": "Trình hiển thị"
|
"name": "Sóng nhạc"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -150,6 +150,13 @@
|
|||||||
"visual-tweaks": {
|
"visual-tweaks": {
|
||||||
"label": "视觉调整",
|
"label": "视觉调整",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
|
"custom-window-title": {
|
||||||
|
"label": "自定义窗口标题",
|
||||||
|
"prompt": {
|
||||||
|
"label": "输入自定义窗口标题:(留空表示停用)",
|
||||||
|
"placeholder": "示例:YouTube Music"
|
||||||
|
}
|
||||||
|
},
|
||||||
"like-buttons": {
|
"like-buttons": {
|
||||||
"default": "默认",
|
"default": "默认",
|
||||||
"force-show": "强制显示",
|
"force-show": "强制显示",
|
||||||
@ -414,6 +421,19 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"custom-output-device": {
|
||||||
|
"description": "配置歌曲的自定义输出媒体设备",
|
||||||
|
"menu": {
|
||||||
|
"device-selector": "选择设备"
|
||||||
|
},
|
||||||
|
"name": "自定义输出设备",
|
||||||
|
"prompt": {
|
||||||
|
"device-selector": {
|
||||||
|
"label": "选择要使用的输出媒体设备",
|
||||||
|
"title": "选择输出设备"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"disable-autoplay": {
|
"disable-autoplay": {
|
||||||
"description": "让曲目开始时处于 “暂停” 模式",
|
"description": "让曲目开始时处于 “暂停” 模式",
|
||||||
"menu": {
|
"menu": {
|
||||||
@ -437,7 +457,15 @@
|
|||||||
"hide-duration-left": "隐藏剩余时长",
|
"hide-duration-left": "隐藏剩余时长",
|
||||||
"hide-github-button": "隐藏 GitHub 链接按钮",
|
"hide-github-button": "隐藏 GitHub 链接按钮",
|
||||||
"play-on-youtube-music": "转至 YouTube Music 播放",
|
"play-on-youtube-music": "转至 YouTube Music 播放",
|
||||||
"set-inactivity-timeout": "设置非活跃时长"
|
"set-inactivity-timeout": "设置非活跃时长",
|
||||||
|
"set-status-display-type": {
|
||||||
|
"label": "状态文本",
|
||||||
|
"submenu": {
|
||||||
|
"artist": "在听 {artist}",
|
||||||
|
"title": "在听 {song title}",
|
||||||
|
"youtube-music": "在听 YouTube Music"
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"name": "Discord Rich Presence 状态显示",
|
"name": "Discord Rich Presence 状态显示",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
@ -729,6 +757,7 @@
|
|||||||
"listenbrainz": {
|
"listenbrainz": {
|
||||||
"token": "输入 ListenBrainz 用户令牌"
|
"token": "输入 ListenBrainz 用户令牌"
|
||||||
},
|
},
|
||||||
|
"scrobble-alternative-artist": "使用替代艺术家",
|
||||||
"scrobble-alternative-title": "使用替代标题",
|
"scrobble-alternative-title": "使用替代标题",
|
||||||
"scrobble-other-media": "记录其他媒体文件"
|
"scrobble-other-media": "记录其他媒体文件"
|
||||||
},
|
},
|
||||||
@ -846,6 +875,27 @@
|
|||||||
"description": "为 macOS 用户启用 TouchBar 支持",
|
"description": "为 macOS 用户启用 TouchBar 支持",
|
||||||
"name": "TouchBar"
|
"name": "TouchBar"
|
||||||
},
|
},
|
||||||
|
"transparent-player": {
|
||||||
|
"description": "把应用窗口变透明",
|
||||||
|
"menu": {
|
||||||
|
"opacity": {
|
||||||
|
"label": "不透明",
|
||||||
|
"submenu": {
|
||||||
|
"percent": "{{opacity}}%"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"label": "类型",
|
||||||
|
"submenu": {
|
||||||
|
"acrylic": "亚克力",
|
||||||
|
"mica": "云母",
|
||||||
|
"none": "无",
|
||||||
|
"tabbed": "标签"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "透明播放器"
|
||||||
|
},
|
||||||
"tuna-obs": {
|
"tuna-obs": {
|
||||||
"description": "与 OBS 的 Tuna 插件集成",
|
"description": "与 OBS 的 Tuna 插件集成",
|
||||||
"name": "Tuna OBS"
|
"name": "Tuna OBS"
|
||||||
|
|||||||
@ -53,17 +53,17 @@
|
|||||||
"later": "稍後",
|
"later": "稍後",
|
||||||
"restart-now": "立即重啟"
|
"restart-now": "立即重啟"
|
||||||
},
|
},
|
||||||
"detail": "\"{{pluginName}}\" 外掛需要重新啟動之後才會生效",
|
"detail": "外掛 \"{{pluginName}}\" 需要重啟應用才會生效",
|
||||||
"message": "\"{{pluginName}}\" 需要重新啟動",
|
"message": "\"{{pluginName}}\" 需要重啟應用",
|
||||||
"title": "需要重新啟動"
|
"title": "需要重啟應用"
|
||||||
},
|
},
|
||||||
"unresponsive": {
|
"unresponsive": {
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"quit": "結束",
|
"quit": "離開",
|
||||||
"relaunch": "重新啟動",
|
"relaunch": "重啟應用",
|
||||||
"wait": "等一下"
|
"wait": "稍等"
|
||||||
},
|
},
|
||||||
"detail": "造成不便我們深表歉意!請選擇動作:",
|
"detail": "造成不便我們深表歉意!請選擇動作:",
|
||||||
"message": "應用程式沒有回應",
|
"message": "應用程式沒有回應",
|
||||||
"title": "視窗沒有回應"
|
"title": "視窗沒有回應"
|
||||||
},
|
},
|
||||||
@ -73,7 +73,7 @@
|
|||||||
"download": "前往下載",
|
"download": "前往下載",
|
||||||
"ok": "略過"
|
"ok": "略過"
|
||||||
},
|
},
|
||||||
"detail": "新版本已經推出,你可以至 {{downloadLink}} 下載",
|
"detail": "新版本已經推出,前往下載 {{downloadLink}}",
|
||||||
"message": "有新版本可用",
|
"message": "有新版本可用",
|
||||||
"title": "有可用的更新"
|
"title": "有可用的更新"
|
||||||
}
|
}
|
||||||
@ -83,11 +83,11 @@
|
|||||||
"navigation": {
|
"navigation": {
|
||||||
"label": "導覽列",
|
"label": "導覽列",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"copy-current-url": "複製目前頁面的網址",
|
"copy-current-url": "複製當前頁面的網址",
|
||||||
"go-back": "回到上一頁",
|
"go-back": "返回上一頁",
|
||||||
"go-forward": "回到下一頁",
|
"go-forward": "前往下一頁",
|
||||||
"quit": "結束",
|
"quit": "退出",
|
||||||
"restart": "重新啟動"
|
"restart": "重啟應用"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"options": {
|
"options": {
|
||||||
@ -96,20 +96,20 @@
|
|||||||
"advanced-options": {
|
"advanced-options": {
|
||||||
"label": "進階選項",
|
"label": "進階選項",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
"auto-reset-app-cache": "啟動時重設應用快取",
|
"auto-reset-app-cache": "啟動時清除應用程式快取",
|
||||||
"disable-hardware-acceleration": "關閉硬體加速",
|
"disable-hardware-acceleration": "關閉硬體加速",
|
||||||
"edit-config-json": "編輯 config.json",
|
"edit-config-json": "編輯 config.json",
|
||||||
"override-user-agent": "覆寫使用者代理",
|
"override-user-agent": "覆寫使用者代理",
|
||||||
"restart-on-config-changes": "設定變更時自動重新啟動",
|
"restart-on-config-changes": "設定變更時自動重啟應用",
|
||||||
"set-proxy": {
|
"set-proxy": {
|
||||||
"label": "設定代理伺服器",
|
"label": "設定代理伺服器",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
"label": "輸入代理伺服器位置:(留空以停用本設定)",
|
"label": "輸入代理伺服器位置:(留空以停用本設定)",
|
||||||
"placeholder": "範例:SOCKS5://127.0.0.1:9999",
|
"placeholder": "例: SOCKS5://127.0.0.1:9999",
|
||||||
"title": "設定代理伺服器"
|
"title": "設定代理伺服器"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"toggle-dev-tools": "切換開發者人員工具"
|
"toggle-dev-tools": "開發人員工具"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"always-on-top": "最上層顯示",
|
"always-on-top": "最上層顯示",
|
||||||
@ -123,7 +123,7 @@
|
|||||||
},
|
},
|
||||||
"language": {
|
"language": {
|
||||||
"dialog": {
|
"dialog": {
|
||||||
"message": "語言會在重新啟動後變更",
|
"message": "語言會在重啟應用後變更",
|
||||||
"title": "語言已變更"
|
"title": "語言已變更"
|
||||||
},
|
},
|
||||||
"label": "語言",
|
"label": "語言",
|
||||||
@ -150,6 +150,13 @@
|
|||||||
"visual-tweaks": {
|
"visual-tweaks": {
|
||||||
"label": "介面設定",
|
"label": "介面設定",
|
||||||
"submenu": {
|
"submenu": {
|
||||||
|
"custom-window-title": {
|
||||||
|
"label": "客制化窗口標題",
|
||||||
|
"prompt": {
|
||||||
|
"label": "輸入客制化窗口標題: (留空讓其禁用)",
|
||||||
|
"placeholder": "例如: YouTube 音樂"
|
||||||
|
}
|
||||||
|
},
|
||||||
"like-buttons": {
|
"like-buttons": {
|
||||||
"default": "預設",
|
"default": "預設",
|
||||||
"force-show": "強制顯示",
|
"force-show": "強制顯示",
|
||||||
@ -201,8 +208,8 @@
|
|||||||
"restart": "重新啟動應用程式",
|
"restart": "重新啟動應用程式",
|
||||||
"show": "顯示視窗",
|
"show": "顯示視窗",
|
||||||
"tooltip": {
|
"tooltip": {
|
||||||
"default": "YouTube Music",
|
"default": "YouTube 音樂",
|
||||||
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
|
"with-song-info": "YouTube 音樂: {{artist}} - {{title}}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -366,26 +373,26 @@
|
|||||||
"name": "繞過年齡驗證"
|
"name": "繞過年齡驗證"
|
||||||
},
|
},
|
||||||
"captions-selector": {
|
"captions-selector": {
|
||||||
"description": "YouTube Music 音軌字幕選擇器",
|
"description": "Youtube Music 音軌字幕選項",
|
||||||
"menu": {
|
"menu": {
|
||||||
"autoload": "自動選擇上次使用的字幕",
|
"autoload": "自動選擇上次使用的字幕",
|
||||||
"disable-captions": "預設無標題"
|
"disable-captions": "預設無字幕"
|
||||||
},
|
},
|
||||||
"name": "標題選擇器",
|
"name": "字幕選項",
|
||||||
"prompt": {
|
"prompt": {
|
||||||
"selector": {
|
"selector": {
|
||||||
"label": "目前字幕語言:{{language}}",
|
"label": "當前語言: {{language}}",
|
||||||
"none": "無",
|
"none": "無",
|
||||||
"title": "選擇字幕語言"
|
"title": "選擇字幕語言"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"templates": {
|
"templates": {
|
||||||
"title": "打開標題選擇器"
|
"title": "開啟字幕選項"
|
||||||
},
|
},
|
||||||
"toast": {
|
"toast": {
|
||||||
"caption-changed": "字幕語言更改為{{language}}",
|
"caption-changed": "字幕語言已更改至 {{language}}",
|
||||||
"caption-disabled": "停用字幕",
|
"caption-disabled": "字幕已停用",
|
||||||
"no-captions": "此歌曲無標題"
|
"no-captions": "該首歌曲無可用的字幕"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"compact-sidebar": {
|
"compact-sidebar": {
|
||||||
|
|||||||
29
src/index.ts
29
src/index.ts
@ -15,7 +15,7 @@ import {
|
|||||||
type BrowserWindowConstructorOptions,
|
type BrowserWindowConstructorOptions,
|
||||||
} from 'electron';
|
} from 'electron';
|
||||||
import enhanceWebRequest, {
|
import enhanceWebRequest, {
|
||||||
BetterSession,
|
type BetterSession,
|
||||||
} from '@jellybrick/electron-better-web-request';
|
} from '@jellybrick/electron-better-web-request';
|
||||||
import is from 'electron-is';
|
import is from 'electron-is';
|
||||||
import unhandled from 'electron-unhandled';
|
import unhandled from 'electron-unhandled';
|
||||||
@ -29,7 +29,7 @@ import { allPlugins, mainPlugins } from 'virtual:plugins';
|
|||||||
|
|
||||||
import { languageResources } from 'virtual:i18n';
|
import { languageResources } from 'virtual:i18n';
|
||||||
|
|
||||||
import config from '@/config';
|
import * as config from '@/config';
|
||||||
|
|
||||||
import { refreshMenu, setApplicationMenu } from '@/menu';
|
import { refreshMenu, setApplicationMenu } from '@/menu';
|
||||||
import { fileExists, injectCSS, injectCSSAsFile } from '@/plugins/utils/main';
|
import { fileExists, injectCSS, injectCSSAsFile } from '@/plugins/utils/main';
|
||||||
@ -61,13 +61,6 @@ import { defaultAuthProxyConfig } from '@/plugins/auth-proxy-adapter/config';
|
|||||||
|
|
||||||
import type { PluginConfig } from '@/types/plugins';
|
import type { PluginConfig } from '@/types/plugins';
|
||||||
|
|
||||||
if (!is.macOS()) {
|
|
||||||
delete (await allPlugins())['touchbar'];
|
|
||||||
}
|
|
||||||
if (!is.windows()) {
|
|
||||||
delete (await allPlugins())['taskbar-mediacontrol'];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Catch errors and log them
|
// Catch errors and log them
|
||||||
unhandled({
|
unhandled({
|
||||||
logger: console.error,
|
logger: console.error,
|
||||||
@ -356,10 +349,12 @@ async function createMainWindow() {
|
|||||||
delete decorations.titleBarStyle;
|
delete decorations.titleBarStyle;
|
||||||
}
|
}
|
||||||
|
|
||||||
const win = new BrowserWindow({
|
const electronWindowSettings: Electron.BrowserWindowConstructorOptions = {
|
||||||
icon,
|
icon,
|
||||||
width: windowSize.width,
|
width: windowSize.width,
|
||||||
height: windowSize.height,
|
height: windowSize.height,
|
||||||
|
minWidth: 325,
|
||||||
|
minHeight: 425,
|
||||||
backgroundColor: '#000',
|
backgroundColor: '#000',
|
||||||
show: false,
|
show: false,
|
||||||
webPreferences: {
|
webPreferences: {
|
||||||
@ -374,7 +369,10 @@ async function createMainWindow() {
|
|||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
...decorations,
|
...decorations,
|
||||||
});
|
};
|
||||||
|
|
||||||
|
const win = new BrowserWindow(electronWindowSettings);
|
||||||
|
|
||||||
await initHook(win);
|
await initHook(win);
|
||||||
initTheme(win);
|
initTheme(win);
|
||||||
|
|
||||||
@ -599,6 +597,15 @@ app.once('browser-window-created', (_event, win) => {
|
|||||||
win.webContents.on('will-prevent-unload', (event) => {
|
win.webContents.on('will-prevent-unload', (event) => {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const customWindowTitle = config.get('options.customWindowTitle');
|
||||||
|
|
||||||
|
if (customWindowTitle) {
|
||||||
|
win.on('page-title-updated', (event) => {
|
||||||
|
event.preventDefault();
|
||||||
|
win.setTitle(customWindowTitle);
|
||||||
|
});
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
app.on('window-all-closed', () => {
|
app.on('window-all-closed', () => {
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
import { BrowserWindow, ipcMain } from 'electron';
|
import { type BrowserWindow, ipcMain } from 'electron';
|
||||||
|
|
||||||
import { deepmerge } from 'deepmerge-ts';
|
import { deepmerge } from 'deepmerge-ts';
|
||||||
import { allPlugins, mainPlugins } from 'virtual:plugins';
|
import { allPlugins, mainPlugins } from 'virtual:plugins';
|
||||||
|
|
||||||
import config from '@/config';
|
import * as config from '@/config';
|
||||||
import { LoggerPrefix, startPlugin, stopPlugin } from '@/utils';
|
import { LoggerPrefix, startPlugin, stopPlugin } from '@/utils';
|
||||||
|
|
||||||
import { t } from '@/i18n';
|
import { t } from '@/i18n';
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import { deepmerge } from 'deepmerge-ts';
|
import { deepmerge } from 'deepmerge-ts';
|
||||||
import { allPlugins } from 'virtual:plugins';
|
import { allPlugins } from 'virtual:plugins';
|
||||||
|
|
||||||
import config from '@/config';
|
import * as config from '@/config';
|
||||||
import { setApplicationMenu } from '@/menu';
|
import { setApplicationMenu } from '@/menu';
|
||||||
|
|
||||||
import { LoggerPrefix } from '@/utils';
|
import { LoggerPrefix } from '@/utils';
|
||||||
|
|||||||
@ -3,7 +3,7 @@ import { allPlugins, preloadPlugins } from 'virtual:plugins';
|
|||||||
|
|
||||||
import { LoggerPrefix, startPlugin, stopPlugin } from '@/utils';
|
import { LoggerPrefix, startPlugin, stopPlugin } from '@/utils';
|
||||||
|
|
||||||
import config from '@/config';
|
import * as config from '@/config';
|
||||||
|
|
||||||
import { t } from '@/i18n';
|
import { t } from '@/i18n';
|
||||||
|
|
||||||
|
|||||||
37
src/menu.ts
37
src/menu.ts
@ -1,11 +1,11 @@
|
|||||||
import is from 'electron-is';
|
import is from 'electron-is';
|
||||||
import {
|
import {
|
||||||
app,
|
app,
|
||||||
BrowserWindow,
|
type BrowserWindow,
|
||||||
clipboard,
|
clipboard,
|
||||||
dialog,
|
dialog,
|
||||||
Menu,
|
Menu,
|
||||||
MenuItem,
|
type MenuItem,
|
||||||
shell,
|
shell,
|
||||||
} from 'electron';
|
} from 'electron';
|
||||||
import prompt from 'custom-electron-prompt';
|
import prompt from 'custom-electron-prompt';
|
||||||
@ -15,7 +15,7 @@ import { allPlugins } from 'virtual:plugins';
|
|||||||
|
|
||||||
import { languageResources } from 'virtual:i18n';
|
import { languageResources } from 'virtual:i18n';
|
||||||
|
|
||||||
import config from './config';
|
import * as config from './config';
|
||||||
|
|
||||||
import { restart } from './providers/app-controls';
|
import { restart } from './providers/app-controls';
|
||||||
import { startingPages } from './providers/extracted-data';
|
import { startingPages } from './providers/extracted-data';
|
||||||
@ -216,6 +216,37 @@ export const mainMenuTemplate = async (
|
|||||||
);
|
);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
label: t(
|
||||||
|
'main.menu.options.submenu.visual-tweaks.submenu.custom-window-title.label',
|
||||||
|
),
|
||||||
|
async click() {
|
||||||
|
const output = await prompt(
|
||||||
|
{
|
||||||
|
title: t(
|
||||||
|
'main.menu.options.submenu.visual-tweaks.submenu.custom-window-title.label',
|
||||||
|
),
|
||||||
|
label: t(
|
||||||
|
'main.menu.options.submenu.visual-tweaks.submenu.custom-window-title.prompt.label',
|
||||||
|
),
|
||||||
|
value: config.get('options.customWindowTitle') || '',
|
||||||
|
type: 'input',
|
||||||
|
inputAttrs: {
|
||||||
|
type: 'text',
|
||||||
|
placeholder: t(
|
||||||
|
'main.menu.options.submenu.visual-tweaks.submenu.custom-window-title.prompt.placeholder',
|
||||||
|
),
|
||||||
|
},
|
||||||
|
width: 500,
|
||||||
|
...promptOptions(),
|
||||||
|
},
|
||||||
|
win,
|
||||||
|
);
|
||||||
|
if (typeof output === 'string') {
|
||||||
|
config.setMenuOption('options.customWindowTitle', output);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
label: t(
|
label: t(
|
||||||
'main.menu.options.submenu.visual-tweaks.submenu.like-buttons.label',
|
'main.menu.options.submenu.visual-tweaks.submenu.like-buttons.label',
|
||||||
|
|||||||
@ -81,26 +81,26 @@ export default createPlugin<
|
|||||||
<>
|
<>
|
||||||
<Show when={showUnDislike()}>
|
<Show when={showUnDislike()}>
|
||||||
<UnDislikeButton
|
<UnDislikeButton
|
||||||
onClick={this.loadFullList}
|
|
||||||
maskSize={unDislikeMaskSize()}
|
maskSize={unDislikeMaskSize()}
|
||||||
|
onClick={this.loadFullList}
|
||||||
/>
|
/>
|
||||||
</Show>
|
</Show>
|
||||||
<Show when={showDislike()}>
|
<Show when={showDislike()}>
|
||||||
<DislikeButton
|
<DislikeButton
|
||||||
onClick={this.loadFullList}
|
|
||||||
maskSize={dislikeMaskSize()}
|
maskSize={dislikeMaskSize()}
|
||||||
|
onClick={this.loadFullList}
|
||||||
/>
|
/>
|
||||||
</Show>
|
</Show>
|
||||||
<Show when={showLike()}>
|
<Show when={showLike()}>
|
||||||
<LikeButton
|
<LikeButton
|
||||||
onClick={this.loadFullList}
|
|
||||||
maskSize={likeMaskSize()}
|
maskSize={likeMaskSize()}
|
||||||
|
onClick={this.loadFullList}
|
||||||
/>
|
/>
|
||||||
</Show>
|
</Show>
|
||||||
<Show when={showUnLike()}>
|
<Show when={showUnLike()}>
|
||||||
<UnLikeButton
|
<UnLikeButton
|
||||||
onClick={this.loadFullList}
|
|
||||||
maskSize={unLikeMaskSize()}
|
maskSize={unLikeMaskSize()}
|
||||||
|
onClick={this.loadFullList}
|
||||||
/>
|
/>
|
||||||
</Show>
|
</Show>
|
||||||
</>
|
</>
|
||||||
|
|||||||
@ -6,22 +6,23 @@ export interface DislikeButtonProps {
|
|||||||
export const DislikeButton = (props: DislikeButtonProps) => (
|
export const DislikeButton = (props: DislikeButtonProps) => (
|
||||||
<div class="style-scope">
|
<div class="style-scope">
|
||||||
<button
|
<button
|
||||||
id="alldislike"
|
|
||||||
data-type="dislike"
|
|
||||||
data-filled="false"
|
|
||||||
class="like-menu yt-spec-button-shape-next yt-spec-button-shape-next--text yt-spec-button-shape-next--mono yt-spec-button-shape-next--size-m yt-spec-button-shape-next--icon-button"
|
|
||||||
aria-pressed="false"
|
|
||||||
aria-label="Dislike all"
|
aria-label="Dislike all"
|
||||||
|
aria-pressed="false"
|
||||||
|
class="like-menu yt-spec-button-shape-next yt-spec-button-shape-next--text yt-spec-button-shape-next--mono yt-spec-button-shape-next--size-m yt-spec-button-shape-next--icon-button"
|
||||||
|
data-filled="false"
|
||||||
|
data-type="dislike"
|
||||||
|
id="alldislike"
|
||||||
onClick={(e) => props.onClick?.(e)}
|
onClick={(e) => props.onClick?.(e)}
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
|
aria-hidden="true"
|
||||||
class="yt-spec-button-shape-next__icon"
|
class="yt-spec-button-shape-next__icon"
|
||||||
style={{
|
style={{
|
||||||
'color': 'var(--ytmusic-setting-item-toggle-active)',
|
'color': 'var(--ytmusic-setting-item-toggle-active)',
|
||||||
}}
|
}}
|
||||||
aria-hidden="true"
|
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
|
aria-hidden="true"
|
||||||
class="yt-spec-button-shape-next__icon"
|
class="yt-spec-button-shape-next__icon"
|
||||||
style={{
|
style={{
|
||||||
'color': 'white',
|
'color': 'white',
|
||||||
@ -32,24 +33,23 @@ export const DislikeButton = (props: DislikeButtonProps) => (
|
|||||||
'z-index': 1,
|
'z-index': 1,
|
||||||
'position': 'absolute',
|
'position': 'absolute',
|
||||||
}}
|
}}
|
||||||
aria-hidden="true"
|
|
||||||
>
|
>
|
||||||
<div style={{ 'width': '24px', 'height': '24px' }}>
|
<div style={{ 'width': '24px', 'height': '24px' }}>
|
||||||
<svg
|
<svg
|
||||||
viewBox="0 0 24 24"
|
|
||||||
preserveAspectRatio="xMidYMid meet"
|
|
||||||
class="style-scope yt-icon"
|
class="style-scope yt-icon"
|
||||||
|
preserveAspectRatio="xMidYMid meet"
|
||||||
style={{
|
style={{
|
||||||
'pointer-events': 'none',
|
'pointer-events': 'none',
|
||||||
'display': 'block',
|
'display': 'block',
|
||||||
'width': '100%',
|
'width': '100%',
|
||||||
'height': '100%',
|
'height': '100%',
|
||||||
}}
|
}}
|
||||||
|
viewBox="0 0 24 24"
|
||||||
>
|
>
|
||||||
<g class="style-scope yt-icon">
|
<g class="style-scope yt-icon">
|
||||||
<path
|
<path
|
||||||
d="M18,4h3v10h-3V4z M5.23,14h4.23l-1.52,4.94C7.62,19.97,8.46,21,9.62,21c0.58,0,1.14-0.24,1.52-0.65L17,14V4H6.57 C5.5,4,4.59,4.67,4.38,5.61l-1.34,6C2.77,12.85,3.82,14,5.23,14z"
|
|
||||||
class="style-scope yt-icon"
|
class="style-scope yt-icon"
|
||||||
|
d="M18,4h3v10h-3V4z M5.23,14h4.23l-1.52,4.94C7.62,19.97,8.46,21,9.62,21c0.58,0,1.14-0.24,1.52-0.65L17,14V4H6.57 C5.5,4,4.59,4.67,4.38,5.61l-1.34,6C2.77,12.85,3.82,14,5.23,14z"
|
||||||
/>
|
/>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
@ -62,20 +62,20 @@ export const DislikeButton = (props: DislikeButtonProps) => (
|
|||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
viewBox="0 0 24 24"
|
|
||||||
preserveAspectRatio="xMidYMid meet"
|
|
||||||
class="style-scope yt-icon"
|
class="style-scope yt-icon"
|
||||||
|
preserveAspectRatio="xMidYMid meet"
|
||||||
style={{
|
style={{
|
||||||
'pointer-events': 'none',
|
'pointer-events': 'none',
|
||||||
'display': 'block',
|
'display': 'block',
|
||||||
'width': '100%',
|
'width': '100%',
|
||||||
'height': '100%',
|
'height': '100%',
|
||||||
}}
|
}}
|
||||||
|
viewBox="0 0 24 24"
|
||||||
>
|
>
|
||||||
<g class="style-scope yt-icon">
|
<g class="style-scope yt-icon">
|
||||||
<path
|
<path
|
||||||
d="M18,4h3v10h-3V4z M5.23,14h4.23l-1.52,4.94C7.62,19.97,8.46,21,9.62,21c0.58,0,1.14-0.24,1.52-0.65L17,14V4H6.57 C5.5,4,4.59,4.67,4.38,5.61l-1.34,6C2.77,12.85,3.82,14,5.23,14z"
|
|
||||||
class="style-scope yt-icon"
|
class="style-scope yt-icon"
|
||||||
|
d="M18,4h3v10h-3V4z M5.23,14h4.23l-1.52,4.94C7.62,19.97,8.46,21,9.62,21c0.58,0,1.14-0.24,1.52-0.65L17,14V4H6.57 C5.5,4,4.59,4.67,4.38,5.61l-1.34,6C2.77,12.85,3.82,14,5.23,14z"
|
||||||
/>
|
/>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
@ -87,8 +87,8 @@ export const DislikeButton = (props: DislikeButtonProps) => (
|
|||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="yt-spec-touch-feedback-shape yt-spec-touch-feedback-shape--touch-response"
|
|
||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
|
class="yt-spec-touch-feedback-shape yt-spec-touch-feedback-shape--touch-response"
|
||||||
>
|
>
|
||||||
<div class="yt-spec-touch-feedback-shape__stroke" />
|
<div class="yt-spec-touch-feedback-shape__stroke" />
|
||||||
<div class="yt-spec-touch-feedback-shape__fill" />
|
<div class="yt-spec-touch-feedback-shape__fill" />
|
||||||
|
|||||||
@ -6,22 +6,23 @@ export interface LikeButtonProps {
|
|||||||
export const LikeButton = (props: LikeButtonProps) => (
|
export const LikeButton = (props: LikeButtonProps) => (
|
||||||
<div class="style-scope">
|
<div class="style-scope">
|
||||||
<button
|
<button
|
||||||
id="alllike"
|
|
||||||
data-type="like"
|
|
||||||
data-filled="false"
|
|
||||||
class="like-menu yt-spec-button-shape-next yt-spec-button-shape-next--text yt-spec-button-shape-next--mono yt-spec-button-shape-next--size-m yt-spec-button-shape-next--icon-button"
|
|
||||||
aria-pressed="false"
|
|
||||||
aria-label="Like all"
|
aria-label="Like all"
|
||||||
|
aria-pressed="false"
|
||||||
|
class="like-menu yt-spec-button-shape-next yt-spec-button-shape-next--text yt-spec-button-shape-next--mono yt-spec-button-shape-next--size-m yt-spec-button-shape-next--icon-button"
|
||||||
|
data-filled="false"
|
||||||
|
data-type="like"
|
||||||
|
id="alllike"
|
||||||
onClick={(e) => props.onClick?.(e)}
|
onClick={(e) => props.onClick?.(e)}
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
|
aria-hidden="true"
|
||||||
class="yt-spec-button-shape-next__icon"
|
class="yt-spec-button-shape-next__icon"
|
||||||
style={{
|
style={{
|
||||||
'color': 'var(--ytmusic-setting-item-toggle-active)',
|
'color': 'var(--ytmusic-setting-item-toggle-active)',
|
||||||
}}
|
}}
|
||||||
aria-hidden="true"
|
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
|
aria-hidden="true"
|
||||||
class="yt-spec-button-shape-next__icon"
|
class="yt-spec-button-shape-next__icon"
|
||||||
style={{
|
style={{
|
||||||
'color': 'white',
|
'color': 'white',
|
||||||
@ -32,24 +33,23 @@ export const LikeButton = (props: LikeButtonProps) => (
|
|||||||
'z-index': 1,
|
'z-index': 1,
|
||||||
'position': 'absolute',
|
'position': 'absolute',
|
||||||
}}
|
}}
|
||||||
aria-hidden="true"
|
|
||||||
>
|
>
|
||||||
<div style={{ 'width': '24px', 'height': '24px' }}>
|
<div style={{ 'width': '24px', 'height': '24px' }}>
|
||||||
<svg
|
<svg
|
||||||
viewBox="0 0 24 24"
|
|
||||||
preserveAspectRatio="xMidYMid meet"
|
|
||||||
class="style-scope yt-icon"
|
class="style-scope yt-icon"
|
||||||
|
preserveAspectRatio="xMidYMid meet"
|
||||||
style={{
|
style={{
|
||||||
'pointer-events': 'none',
|
'pointer-events': 'none',
|
||||||
'display': 'block',
|
'display': 'block',
|
||||||
'width': '100%',
|
'width': '100%',
|
||||||
'height': '100%',
|
'height': '100%',
|
||||||
}}
|
}}
|
||||||
|
viewBox="0 0 24 24"
|
||||||
>
|
>
|
||||||
<g class="style-scope yt-icon">
|
<g class="style-scope yt-icon">
|
||||||
<path
|
<path
|
||||||
d="M3,11h3v10H3V11z M18.77,11h-4.23l1.52-4.94C16.38,5.03,15.54,4,14.38,4c-0.58,0-1.14,0.24-1.52,0.65L7,11v10h10.43 c1.06,0,1.98-0.67,2.19-1.61l1.34-6C21.23,12.15,20.18,11,18.77,11z"
|
|
||||||
class="style-scope yt-icon"
|
class="style-scope yt-icon"
|
||||||
|
d="M3,11h3v10H3V11z M18.77,11h-4.23l1.52-4.94C16.38,5.03,15.54,4,14.38,4c-0.58,0-1.14,0.24-1.52,0.65L7,11v10h10.43 c1.06,0,1.98-0.67,2.19-1.61l1.34-6C21.23,12.15,20.18,11,18.77,11z"
|
||||||
/>
|
/>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
@ -57,20 +57,20 @@ export const LikeButton = (props: LikeButtonProps) => (
|
|||||||
</div>
|
</div>
|
||||||
<div style={{ 'width': '24px', 'height': '24px' }}>
|
<div style={{ 'width': '24px', 'height': '24px' }}>
|
||||||
<svg
|
<svg
|
||||||
viewBox="0 0 24 24"
|
|
||||||
preserveAspectRatio="xMidYMid meet"
|
|
||||||
class="style-scope yt-icon"
|
class="style-scope yt-icon"
|
||||||
|
preserveAspectRatio="xMidYMid meet"
|
||||||
style={{
|
style={{
|
||||||
'pointer-events': 'none',
|
'pointer-events': 'none',
|
||||||
'display': 'block',
|
'display': 'block',
|
||||||
'width': '100%',
|
'width': '100%',
|
||||||
'height': '100%',
|
'height': '100%',
|
||||||
}}
|
}}
|
||||||
|
viewBox="0 0 24 24"
|
||||||
>
|
>
|
||||||
<g class="style-scope yt-icon">
|
<g class="style-scope yt-icon">
|
||||||
<path
|
<path
|
||||||
d="M3,11h3v10H3V11z M18.77,11h-4.23l1.52-4.94C16.38,5.03,15.54,4,14.38,4c-0.58,0-1.14,0.24-1.52,0.65L7,11v10h10.43 c1.06,0,1.98-0.67,2.19-1.61l1.34-6C21.23,12.15,20.18,11,18.77,11z"
|
|
||||||
class="style-scope yt-icon"
|
class="style-scope yt-icon"
|
||||||
|
d="M3,11h3v10H3V11z M18.77,11h-4.23l1.52-4.94C16.38,5.03,15.54,4,14.38,4c-0.58,0-1.14,0.24-1.52,0.65L7,11v10h10.43 c1.06,0,1.98-0.67,2.19-1.61l1.34-6C21.23,12.15,20.18,11,18.77,11z"
|
||||||
/>
|
/>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
@ -78,8 +78,8 @@ export const LikeButton = (props: LikeButtonProps) => (
|
|||||||
</div>
|
</div>
|
||||||
<yt-touch-feedback-shape style={{ 'border-radius': 'inherit' }}>
|
<yt-touch-feedback-shape style={{ 'border-radius': 'inherit' }}>
|
||||||
<div
|
<div
|
||||||
class="yt-spec-touch-feedback-shape yt-spec-touch-feedback-shape--touch-response"
|
|
||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
|
class="yt-spec-touch-feedback-shape yt-spec-touch-feedback-shape--touch-response"
|
||||||
>
|
>
|
||||||
<div class="yt-spec-touch-feedback-shape__stroke" />
|
<div class="yt-spec-touch-feedback-shape__stroke" />
|
||||||
<div class="yt-spec-touch-feedback-shape__fill" />
|
<div class="yt-spec-touch-feedback-shape__fill" />
|
||||||
|
|||||||
@ -6,22 +6,23 @@ export interface UnDislikeButtonProps {
|
|||||||
export const UnDislikeButton = (props: UnDislikeButtonProps) => (
|
export const UnDislikeButton = (props: UnDislikeButtonProps) => (
|
||||||
<div class="style-scope">
|
<div class="style-scope">
|
||||||
<button
|
<button
|
||||||
id="allundislike"
|
|
||||||
data-type="dislike"
|
|
||||||
data-filled="true"
|
|
||||||
class="like-menu yt-spec-button-shape-next yt-spec-button-shape-next--text yt-spec-button-shape-next--mono yt-spec-button-shape-next--size-m yt-spec-button-shape-next--icon-button"
|
|
||||||
aria-pressed="false"
|
|
||||||
aria-label="Undislike all"
|
aria-label="Undislike all"
|
||||||
|
aria-pressed="false"
|
||||||
|
class="like-menu yt-spec-button-shape-next yt-spec-button-shape-next--text yt-spec-button-shape-next--mono yt-spec-button-shape-next--size-m yt-spec-button-shape-next--icon-button"
|
||||||
|
data-filled="true"
|
||||||
|
data-type="dislike"
|
||||||
|
id="allundislike"
|
||||||
onClick={(e) => props.onClick?.(e)}
|
onClick={(e) => props.onClick?.(e)}
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
|
aria-hidden="true"
|
||||||
class="yt-spec-button-shape-next__icon"
|
class="yt-spec-button-shape-next__icon"
|
||||||
style={{
|
style={{
|
||||||
color: 'var(--ytmusic-setting-item-toggle-active)',
|
color: 'var(--ytmusic-setting-item-toggle-active)',
|
||||||
}}
|
}}
|
||||||
aria-hidden="true"
|
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
|
aria-hidden="true"
|
||||||
class="yt-spec-button-shape-next__icon"
|
class="yt-spec-button-shape-next__icon"
|
||||||
style={{
|
style={{
|
||||||
'color': 'white',
|
'color': 'white',
|
||||||
@ -32,7 +33,6 @@ export const UnDislikeButton = (props: UnDislikeButtonProps) => (
|
|||||||
'z-index': 1,
|
'z-index': 1,
|
||||||
'position': 'absolute',
|
'position': 'absolute',
|
||||||
}}
|
}}
|
||||||
aria-hidden="true"
|
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
style={{
|
style={{
|
||||||
@ -41,20 +41,20 @@ export const UnDislikeButton = (props: UnDislikeButtonProps) => (
|
|||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
viewBox="0 0 24 24"
|
|
||||||
preserveAspectRatio="xMidYMid meet"
|
|
||||||
class="style-scope yt-icon"
|
class="style-scope yt-icon"
|
||||||
|
preserveAspectRatio="xMidYMid meet"
|
||||||
style={{
|
style={{
|
||||||
'pointer-events': 'none',
|
'pointer-events': 'none',
|
||||||
'display': 'block',
|
'display': 'block',
|
||||||
'width': '100%',
|
'width': '100%',
|
||||||
'height': '100%',
|
'height': '100%',
|
||||||
}}
|
}}
|
||||||
|
viewBox="0 0 24 24"
|
||||||
>
|
>
|
||||||
<g class="style-scope yt-icon">
|
<g class="style-scope yt-icon">
|
||||||
<path
|
<path
|
||||||
d="M17,4h-1H6.57C5.5,4,4.59,4.67,4.38,5.61l-1.34,6C2.77,12.85,3.82,14,5.23,14h4.23l-1.52,4.94C7.62,19.97,8.46,21,9.62,21 c0.58,0,1.14-0.24,1.52-0.65L17,14h4V4H17z M10.4,19.67C10.21,19.88,9.92,20,9.62,20c-0.26,0-0.5-0.11-0.63-0.3 c-0.07-0.1-0.15-0.26-0.09-0.47l1.52-4.94l0.4-1.29H9.46H5.23c-0.41,0-0.8-0.17-1.03-0.46c-0.12-0.15-0.25-0.4-0.18-0.72l1.34-6 C5.46,5.35,5.97,5,6.57,5H16v8.61L10.4,19.67z M20,13h-3V5h3V13z"
|
|
||||||
class="style-scope yt-icon"
|
class="style-scope yt-icon"
|
||||||
|
d="M17,4h-1H6.57C5.5,4,4.59,4.67,4.38,5.61l-1.34,6C2.77,12.85,3.82,14,5.23,14h4.23l-1.52,4.94C7.62,19.97,8.46,21,9.62,21 c0.58,0,1.14-0.24,1.52-0.65L17,14h4V4H17z M10.4,19.67C10.21,19.88,9.92,20,9.62,20c-0.26,0-0.5-0.11-0.63-0.3 c-0.07-0.1-0.15-0.26-0.09-0.47l1.52-4.94l0.4-1.29H9.46H5.23c-0.41,0-0.8-0.17-1.03-0.46c-0.12-0.15-0.25-0.4-0.18-0.72l1.34-6 C5.46,5.35,5.97,5,6.57,5H16v8.61L10.4,19.67z M20,13h-3V5h3V13z"
|
||||||
/>
|
/>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
@ -67,20 +67,20 @@ export const UnDislikeButton = (props: UnDislikeButtonProps) => (
|
|||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
viewBox="0 0 24 24"
|
|
||||||
preserveAspectRatio="xMidYMid meet"
|
|
||||||
class="style-scope yt-icon"
|
class="style-scope yt-icon"
|
||||||
|
preserveAspectRatio="xMidYMid meet"
|
||||||
style={{
|
style={{
|
||||||
'pointer-events': 'none',
|
'pointer-events': 'none',
|
||||||
'display': 'block',
|
'display': 'block',
|
||||||
'width': '100%',
|
'width': '100%',
|
||||||
'height': '100%',
|
'height': '100%',
|
||||||
}}
|
}}
|
||||||
|
viewBox="0 0 24 24"
|
||||||
>
|
>
|
||||||
<g class="style-scope yt-icon">
|
<g class="style-scope yt-icon">
|
||||||
<path
|
<path
|
||||||
d="M17,4h-1H6.57C5.5,4,4.59,4.67,4.38,5.61l-1.34,6C2.77,12.85,3.82,14,5.23,14h4.23l-1.52,4.94C7.62,19.97,8.46,21,9.62,21 c0.58,0,1.14-0.24,1.52-0.65L17,14h4V4H17z M10.4,19.67C10.21,19.88,9.92,20,9.62,20c-0.26,0-0.5-0.11-0.63-0.3 c-0.07-0.1-0.15-0.26-0.09-0.47l1.52-4.94l0.4-1.29H9.46H5.23c-0.41,0-0.8-0.17-1.03-0.46c-0.12-0.15-0.25-0.4-0.18-0.72l1.34-6 C5.46,5.35,5.97,5,6.57,5H16v8.61L10.4,19.67z M20,13h-3V5h3V13z"
|
|
||||||
class="style-scope yt-icon"
|
class="style-scope yt-icon"
|
||||||
|
d="M17,4h-1H6.57C5.5,4,4.59,4.67,4.38,5.61l-1.34,6C2.77,12.85,3.82,14,5.23,14h4.23l-1.52,4.94C7.62,19.97,8.46,21,9.62,21 c0.58,0,1.14-0.24,1.52-0.65L17,14h4V4H17z M10.4,19.67C10.21,19.88,9.92,20,9.62,20c-0.26,0-0.5-0.11-0.63-0.3 c-0.07-0.1-0.15-0.26-0.09-0.47l1.52-4.94l0.4-1.29H9.46H5.23c-0.41,0-0.8-0.17-1.03-0.46c-0.12-0.15-0.25-0.4-0.18-0.72l1.34-6 C5.46,5.35,5.97,5,6.57,5H16v8.61L10.4,19.67z M20,13h-3V5h3V13z"
|
||||||
/>
|
/>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
@ -92,8 +92,8 @@ export const UnDislikeButton = (props: UnDislikeButtonProps) => (
|
|||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="yt-spec-touch-feedback-shape yt-spec-touch-feedback-shape--touch-response"
|
|
||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
|
class="yt-spec-touch-feedback-shape yt-spec-touch-feedback-shape--touch-response"
|
||||||
>
|
>
|
||||||
<div class="yt-spec-touch-feedback-shape__stroke" />
|
<div class="yt-spec-touch-feedback-shape__stroke" />
|
||||||
<div class="yt-spec-touch-feedback-shape__fill" />
|
<div class="yt-spec-touch-feedback-shape__fill" />
|
||||||
|
|||||||
@ -6,22 +6,23 @@ export interface UnLikeButtonProps {
|
|||||||
export const UnLikeButton = (props: UnLikeButtonProps) => (
|
export const UnLikeButton = (props: UnLikeButtonProps) => (
|
||||||
<div class="style-scope">
|
<div class="style-scope">
|
||||||
<button
|
<button
|
||||||
id="allunlike"
|
|
||||||
data-type="like"
|
|
||||||
data-filled="true"
|
|
||||||
class="like-menu yt-spec-button-shape-next yt-spec-button-shape-next--text yt-spec-button-shape-next--mono yt-spec-button-shape-next--size-m yt-spec-button-shape-next--icon-button"
|
|
||||||
aria-pressed="false"
|
|
||||||
aria-label="Unlike all"
|
aria-label="Unlike all"
|
||||||
|
aria-pressed="false"
|
||||||
|
class="like-menu yt-spec-button-shape-next yt-spec-button-shape-next--text yt-spec-button-shape-next--mono yt-spec-button-shape-next--size-m yt-spec-button-shape-next--icon-button"
|
||||||
|
data-filled="true"
|
||||||
|
data-type="like"
|
||||||
|
id="allunlike"
|
||||||
onClick={(e) => props.onClick?.(e)}
|
onClick={(e) => props.onClick?.(e)}
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
|
aria-hidden="true"
|
||||||
class="yt-spec-button-shape-next__icon"
|
class="yt-spec-button-shape-next__icon"
|
||||||
style={{
|
style={{
|
||||||
'color': 'var(--ytmusic-setting-item-toggle-active)',
|
'color': 'var(--ytmusic-setting-item-toggle-active)',
|
||||||
}}
|
}}
|
||||||
aria-hidden="true"
|
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
|
aria-hidden="true"
|
||||||
class="yt-spec-button-shape-next__icon"
|
class="yt-spec-button-shape-next__icon"
|
||||||
style={{
|
style={{
|
||||||
'color': 'white',
|
'color': 'white',
|
||||||
@ -32,7 +33,6 @@ export const UnLikeButton = (props: UnLikeButtonProps) => (
|
|||||||
'z-index': 1,
|
'z-index': 1,
|
||||||
'position': 'absolute',
|
'position': 'absolute',
|
||||||
}}
|
}}
|
||||||
aria-hidden="true"
|
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
style={{
|
style={{
|
||||||
@ -41,20 +41,20 @@ export const UnLikeButton = (props: UnLikeButtonProps) => (
|
|||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
viewBox="0 0 24 24"
|
|
||||||
preserveAspectRatio="xMidYMid meet"
|
|
||||||
class="style-scope yt-icon"
|
class="style-scope yt-icon"
|
||||||
|
preserveAspectRatio="xMidYMid meet"
|
||||||
style={{
|
style={{
|
||||||
'pointer-events': 'none',
|
'pointer-events': 'none',
|
||||||
'display': 'block',
|
'display': 'block',
|
||||||
'width': '100%',
|
'width': '100%',
|
||||||
'height': '100%',
|
'height': '100%',
|
||||||
}}
|
}}
|
||||||
|
viewBox="0 0 24 24"
|
||||||
>
|
>
|
||||||
<g class="style-scope yt-icon">
|
<g class="style-scope yt-icon">
|
||||||
<path
|
<path
|
||||||
d="M18.77,11h-4.23l1.52-4.94C16.38,5.03,15.54,4,14.38,4c-0.58,0-1.14,0.24-1.52,0.65L7,11H3v10h4h1h9.43 c1.06,0,1.98-0.67,2.19-1.61l1.34-6C21.23,12.15,20.18,11,18.77,11z M7,20H4v-8h3V20z M19.98,13.17l-1.34,6 C18.54,19.65,18.03,20,17.43,20H8v-8.61l5.6-6.06C13.79,5.12,14.08,5,14.38,5c0.26,0,0.5,0.11,0.63,0.3 c0.07,0.1,0.15,0.26,0.09,0.47l-1.52,4.94L13.18,12h1.35h4.23c0.41,0,0.8,0.17,1.03,0.46C19.92,12.61,20.05,12.86,19.98,13.17z"
|
|
||||||
class="style-scope yt-icon"
|
class="style-scope yt-icon"
|
||||||
|
d="M18.77,11h-4.23l1.52-4.94C16.38,5.03,15.54,4,14.38,4c-0.58,0-1.14,0.24-1.52,0.65L7,11H3v10h4h1h9.43 c1.06,0,1.98-0.67,2.19-1.61l1.34-6C21.23,12.15,20.18,11,18.77,11z M7,20H4v-8h3V20z M19.98,13.17l-1.34,6 C18.54,19.65,18.03,20,17.43,20H8v-8.61l5.6-6.06C13.79,5.12,14.08,5,14.38,5c0.26,0,0.5,0.11,0.63,0.3 c0.07,0.1,0.15,0.26,0.09,0.47l-1.52,4.94L13.18,12h1.35h4.23c0.41,0,0.8,0.17,1.03,0.46C19.92,12.61,20.05,12.86,19.98,13.17z"
|
||||||
/>
|
/>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
@ -67,20 +67,20 @@ export const UnLikeButton = (props: UnLikeButtonProps) => (
|
|||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
viewBox="0 0 24 24"
|
|
||||||
preserveAspectRatio="xMidYMid meet"
|
|
||||||
class="style-scope yt-icon"
|
class="style-scope yt-icon"
|
||||||
|
preserveAspectRatio="xMidYMid meet"
|
||||||
style={{
|
style={{
|
||||||
'pointer-events': 'none',
|
'pointer-events': 'none',
|
||||||
'display': 'block',
|
'display': 'block',
|
||||||
'width': '100%',
|
'width': '100%',
|
||||||
'height': '100%',
|
'height': '100%',
|
||||||
}}
|
}}
|
||||||
|
viewBox="0 0 24 24"
|
||||||
>
|
>
|
||||||
<g class="style-scope yt-icon">
|
<g class="style-scope yt-icon">
|
||||||
<path
|
<path
|
||||||
d="M18.77,11h-4.23l1.52-4.94C16.38,5.03,15.54,4,14.38,4c-0.58,0-1.14,0.24-1.52,0.65L7,11H3v10h4h1h9.43 c1.06,0,1.98-0.67,2.19-1.61l1.34-6C21.23,12.15,20.18,11,18.77,11z M7,20H4v-8h3V20z M19.98,13.17l-1.34,6 C18.54,19.65,18.03,20,17.43,20H8v-8.61l5.6-6.06C13.79,5.12,14.08,5,14.38,5c0.26,0,0.5,0.11,0.63,0.3 c0.07,0.1,0.15,0.26,0.09,0.47l-1.52,4.94L13.18,12h1.35h4.23c0.41,0,0.8,0.17,1.03,0.46C19.92,12.61,20.05,12.86,19.98,13.17z"
|
|
||||||
class="style-scope yt-icon"
|
class="style-scope yt-icon"
|
||||||
|
d="M18.77,11h-4.23l1.52-4.94C16.38,5.03,15.54,4,14.38,4c-0.58,0-1.14,0.24-1.52,0.65L7,11H3v10h4h1h9.43 c1.06,0,1.98-0.67,2.19-1.61l1.34-6C21.23,12.15,20.18,11,18.77,11z M7,20H4v-8h3V20z M19.98,13.17l-1.34,6 C18.54,19.65,18.03,20,17.43,20H8v-8.61l5.6-6.06C13.79,5.12,14.08,5,14.38,5c0.26,0,0.5,0.11,0.63,0.3 c0.07,0.1,0.15,0.26,0.09,0.47l-1.52,4.94L13.18,12h1.35h4.23c0.41,0,0.8,0.17,1.03,0.46C19.92,12.61,20.05,12.86,19.98,13.17z"
|
||||||
/>
|
/>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
@ -92,8 +92,8 @@ export const UnLikeButton = (props: UnLikeButtonProps) => (
|
|||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="yt-spec-touch-feedback-shape yt-spec-touch-feedback-shape--touch-response"
|
|
||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
|
class="yt-spec-touch-feedback-shape yt-spec-touch-feedback-shape--touch-response"
|
||||||
>
|
>
|
||||||
<div class="yt-spec-touch-feedback-shape__stroke" />
|
<div class="yt-spec-touch-feedback-shape__stroke" />
|
||||||
<div class="yt-spec-touch-feedback-shape__fill" />
|
<div class="yt-spec-touch-feedback-shape__fill" />
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import { FastAverageColor } from 'fast-average-color';
|
import { FastAverageColor } from 'fast-average-color';
|
||||||
import Color, { ColorInstance } from 'color';
|
import Color, { type ColorInstance } from 'color';
|
||||||
|
|
||||||
import style from './style.css?inline';
|
import style from './style.css?inline';
|
||||||
|
|
||||||
@ -31,7 +31,7 @@ export default createPlugin<
|
|||||||
alpha?: number,
|
alpha?: number,
|
||||||
ratioMultiply?: number,
|
ratioMultiply?: number,
|
||||||
): string;
|
): string;
|
||||||
updateColor(): void;
|
updateColor(alpha: number): void;
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
enabled: boolean;
|
enabled: boolean;
|
||||||
@ -143,7 +143,16 @@ export default createPlugin<
|
|||||||
document.documentElement.style.setProperty(DARK_COLOR_KEY, '0, 0, 0');
|
document.documentElement.style.setProperty(DARK_COLOR_KEY, '0, 0, 0');
|
||||||
}
|
}
|
||||||
|
|
||||||
this.updateColor();
|
let alpha: number | null = null;
|
||||||
|
if (await window.mainConfig.plugins.isEnabled('transparent-player')) {
|
||||||
|
const value: unknown = window.mainConfig.get(
|
||||||
|
'plugins.transparent-player.opacity',
|
||||||
|
);
|
||||||
|
if (typeof value === 'number' && value >= 0 && value <= 1) {
|
||||||
|
alpha = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.updateColor(alpha ?? 1);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
onConfigChange(config) {
|
onConfigChange(config) {
|
||||||
@ -163,7 +172,7 @@ export default createPlugin<
|
|||||||
}
|
}
|
||||||
return `color-mix(in srgb, ${color} ${originalRatio}, ${keyColor} ${colorRatio})`;
|
return `color-mix(in srgb, ${color} ${originalRatio}, ${keyColor} ${colorRatio})`;
|
||||||
},
|
},
|
||||||
updateColor() {
|
updateColor(alpha: number) {
|
||||||
const variableMap = {
|
const variableMap = {
|
||||||
'--ytmusic-color-black1': '#212121',
|
'--ytmusic-color-black1': '#212121',
|
||||||
'--ytmusic-color-black2': '#181818',
|
'--ytmusic-color-black2': '#181818',
|
||||||
@ -202,19 +211,20 @@ export default createPlugin<
|
|||||||
Object.entries(variableMap).map(([variable, color]) => {
|
Object.entries(variableMap).map(([variable, color]) => {
|
||||||
document.documentElement.style.setProperty(
|
document.documentElement.style.setProperty(
|
||||||
variable,
|
variable,
|
||||||
this.getMixedColor(color, COLOR_KEY),
|
this.getMixedColor(color, COLOR_KEY, alpha),
|
||||||
'important',
|
'important',
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
document.body.style.setProperty(
|
document.body.style.setProperty(
|
||||||
'background',
|
'background',
|
||||||
this.getMixedColor('#030303', COLOR_KEY),
|
this.getMixedColor('rgba(3, 3, 3)', DARK_COLOR_KEY, alpha),
|
||||||
'important',
|
'important',
|
||||||
);
|
);
|
||||||
document.documentElement.style.setProperty(
|
document.documentElement.style.setProperty(
|
||||||
'--ytmusic-background',
|
'--ytmusic-background',
|
||||||
this.getMixedColor('#030303', DARK_COLOR_KEY),
|
// #030303
|
||||||
|
this.getMixedColor('rgba(3, 3, 3)', DARK_COLOR_KEY, alpha),
|
||||||
'important',
|
'important',
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|||||||
@ -3,7 +3,7 @@ import style from './style.css?inline';
|
|||||||
import { t } from '@/i18n';
|
import { t } from '@/i18n';
|
||||||
import { createPlugin } from '@/utils';
|
import { createPlugin } from '@/utils';
|
||||||
import { menu } from './menu';
|
import { menu } from './menu';
|
||||||
import { AmbientModePluginConfig } from './types';
|
import { type AmbientModePluginConfig } from './types';
|
||||||
import { waitForElement } from '@/utils/wait-for-element';
|
import { waitForElement } from '@/utils/wait-for-element';
|
||||||
|
|
||||||
const defaultConfig: AmbientModePluginConfig = {
|
const defaultConfig: AmbientModePluginConfig = {
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
import { MenuItemConstructorOptions } from 'electron';
|
import { type MenuItemConstructorOptions } from 'electron';
|
||||||
|
|
||||||
import { t } from '@/i18n';
|
import { t } from '@/i18n';
|
||||||
import { MenuContext } from '@/types/contexts';
|
import { type MenuContext } from '@/types/contexts';
|
||||||
import { AmbientModePluginConfig } from './types';
|
import { type AmbientModePluginConfig } from './types';
|
||||||
|
|
||||||
export interface menuParameters {
|
export interface menuParameters {
|
||||||
getConfig: () => AmbientModePluginConfig | Promise<AmbientModePluginConfig>;
|
getConfig: () => AmbientModePluginConfig | Promise<AmbientModePluginConfig>;
|
||||||
|
|||||||
@ -4,7 +4,7 @@ import { type Context, Hono } from 'hono';
|
|||||||
import { cors } from 'hono/cors';
|
import { cors } from 'hono/cors';
|
||||||
import { serve } from '@hono/node-server';
|
import { serve } from '@hono/node-server';
|
||||||
|
|
||||||
import registerCallback, { type SongInfo } from '@/providers/song-info';
|
import { registerCallback, type SongInfo } from '@/providers/song-info';
|
||||||
import { createBackend } from '@/utils';
|
import { createBackend } from '@/utils';
|
||||||
|
|
||||||
import type { AmuseSongInfo } from './types';
|
import type { AmuseSongInfo } from './types';
|
||||||
|
|||||||
1
src/plugins/api-server/backend/api-version.ts
Normal file
1
src/plugins/api-server/backend/api-version.ts
Normal file
@ -0,0 +1 @@
|
|||||||
|
export const API_VERSION = 'v1';
|
||||||
@ -3,17 +3,22 @@ import { OpenAPIHono as Hono } from '@hono/zod-openapi';
|
|||||||
import { cors } from 'hono/cors';
|
import { cors } from 'hono/cors';
|
||||||
import { swaggerUI } from '@hono/swagger-ui';
|
import { swaggerUI } from '@hono/swagger-ui';
|
||||||
import { serve } from '@hono/node-server';
|
import { serve } from '@hono/node-server';
|
||||||
|
import { createNodeWebSocket } from '@hono/node-ws';
|
||||||
|
|
||||||
import registerCallback from '@/providers/song-info';
|
import { registerCallback } from '@/providers/song-info';
|
||||||
import { createBackend } from '@/utils';
|
import { createBackend } from '@/utils';
|
||||||
|
|
||||||
import { JWTPayloadSchema } from './scheme';
|
import { JWTPayloadSchema } from './scheme';
|
||||||
import { registerAuth, registerControl } from './routes';
|
import { registerAuth, registerControl, registerWebsocket } from './routes';
|
||||||
|
|
||||||
import { type APIServerConfig, AuthStrategy } from '../config';
|
import { type APIServerConfig, AuthStrategy } from '../config';
|
||||||
|
|
||||||
import type { BackendType } from './types';
|
import type { BackendType } from './types';
|
||||||
import type { RepeatMode } from '@/types/datahost-get-state';
|
import type {
|
||||||
|
LikeType,
|
||||||
|
RepeatMode,
|
||||||
|
VolumeState,
|
||||||
|
} from '@/types/datahost-get-state';
|
||||||
|
|
||||||
export const backend = createBackend<BackendType, APIServerConfig>({
|
export const backend = createBackend<BackendType, APIServerConfig>({
|
||||||
async start(ctx) {
|
async start(ctx) {
|
||||||
@ -25,9 +30,12 @@ export const backend = createBackend<BackendType, APIServerConfig>({
|
|||||||
});
|
});
|
||||||
|
|
||||||
ctx.ipc.on('ytmd:player-api-loaded', () => {
|
ctx.ipc.on('ytmd:player-api-loaded', () => {
|
||||||
|
ctx.ipc.send('ytmd:setup-seeked-listener');
|
||||||
ctx.ipc.send('ytmd:setup-time-changed-listener');
|
ctx.ipc.send('ytmd:setup-time-changed-listener');
|
||||||
ctx.ipc.send('ytmd:setup-repeat-changed-listener');
|
ctx.ipc.send('ytmd:setup-repeat-changed-listener');
|
||||||
|
ctx.ipc.send('ytmd:setup-like-changed-listener');
|
||||||
ctx.ipc.send('ytmd:setup-volume-changed-listener');
|
ctx.ipc.send('ytmd:setup-volume-changed-listener');
|
||||||
|
ctx.ipc.send('ytmd:setup-shuffle-changed-listener');
|
||||||
});
|
});
|
||||||
|
|
||||||
ctx.ipc.on(
|
ctx.ipc.on(
|
||||||
@ -37,7 +45,7 @@ export const backend = createBackend<BackendType, APIServerConfig>({
|
|||||||
|
|
||||||
ctx.ipc.on(
|
ctx.ipc.on(
|
||||||
'ytmd:volume-changed',
|
'ytmd:volume-changed',
|
||||||
(newVolume: number) => (this.volume = newVolume),
|
(newVolumeState: VolumeState) => (this.volumeState = newVolumeState),
|
||||||
);
|
);
|
||||||
|
|
||||||
this.run(config.hostname, config.port);
|
this.run(config.hostname, config.port);
|
||||||
@ -63,6 +71,10 @@ export const backend = createBackend<BackendType, APIServerConfig>({
|
|||||||
init(backendCtx) {
|
init(backendCtx) {
|
||||||
this.app = new Hono();
|
this.app = new Hono();
|
||||||
|
|
||||||
|
const ws = createNodeWebSocket({
|
||||||
|
app: this.app,
|
||||||
|
});
|
||||||
|
|
||||||
this.app.use('*', cors());
|
this.app.use('*', cors());
|
||||||
|
|
||||||
// for web remote control
|
// for web remote control
|
||||||
@ -103,9 +115,14 @@ export const backend = createBackend<BackendType, APIServerConfig>({
|
|||||||
backendCtx,
|
backendCtx,
|
||||||
() => this.songInfo,
|
() => this.songInfo,
|
||||||
() => this.currentRepeatMode,
|
() => this.currentRepeatMode,
|
||||||
() => this.volume,
|
() =>
|
||||||
|
backendCtx.window.webContents.executeJavaScript(
|
||||||
|
'document.querySelector("#like-button-renderer")?.likeStatus',
|
||||||
|
) as Promise<LikeType>,
|
||||||
|
() => this.volumeState,
|
||||||
);
|
);
|
||||||
registerAuth(this.app, backendCtx);
|
registerAuth(this.app, backendCtx);
|
||||||
|
registerWebsocket(this.app, backendCtx, ws);
|
||||||
|
|
||||||
// swagger
|
// swagger
|
||||||
this.app.openAPIRegistry.registerComponent(
|
this.app.openAPIRegistry.registerComponent(
|
||||||
@ -133,6 +150,8 @@ export const backend = createBackend<BackendType, APIServerConfig>({
|
|||||||
});
|
});
|
||||||
|
|
||||||
this.app.get('/swagger', swaggerUI({ url: '/doc' }));
|
this.app.get('/swagger', swaggerUI({ url: '/doc' }));
|
||||||
|
|
||||||
|
this.injectWebSocket = ws.injectWebSocket.bind(this);
|
||||||
},
|
},
|
||||||
run(hostname, port) {
|
run(hostname, port) {
|
||||||
if (!this.app) return;
|
if (!this.app) return;
|
||||||
@ -143,6 +162,10 @@ export const backend = createBackend<BackendType, APIServerConfig>({
|
|||||||
port,
|
port,
|
||||||
hostname,
|
hostname,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (this.injectWebSocket && this.server) {
|
||||||
|
this.injectWebSocket(this.server);
|
||||||
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error(err);
|
console.error(err);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -75,9 +75,11 @@ export const register = (
|
|||||||
// SKIP CHECK
|
// SKIP CHECK
|
||||||
}
|
}
|
||||||
|
|
||||||
setConfig({
|
if (!config.authorizedClients.includes(id)) {
|
||||||
authorizedClients: [...config.authorizedClients, id],
|
setConfig({
|
||||||
});
|
authorizedClients: [...config.authorizedClients, id],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
const token = await sign(
|
const token = await sign(
|
||||||
{
|
{
|
||||||
|
|||||||
@ -1,8 +1,12 @@
|
|||||||
import { createRoute, z } from '@hono/zod-openapi';
|
import { createRoute, z } from '@hono/zod-openapi';
|
||||||
|
|
||||||
import { ipcMain } from 'electron';
|
import { ipcMain } from 'electron';
|
||||||
|
|
||||||
import getSongControls from '@/providers/song-controls';
|
import { getSongControls } from '@/providers/song-controls';
|
||||||
|
import {
|
||||||
|
LikeType,
|
||||||
|
type RepeatMode,
|
||||||
|
type VolumeState,
|
||||||
|
} from '@/types/datahost-get-state';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
AddSongToQueueSchema,
|
AddSongToQueueSchema,
|
||||||
@ -19,8 +23,8 @@ import {
|
|||||||
SwitchRepeatSchema,
|
SwitchRepeatSchema,
|
||||||
type ResponseSongInfo,
|
type ResponseSongInfo,
|
||||||
} from '../scheme';
|
} from '../scheme';
|
||||||
|
import { API_VERSION } from '../api-version';
|
||||||
|
|
||||||
import type { RepeatMode } from '@/types/datahost-get-state';
|
|
||||||
import type { SongInfo } from '@/providers/song-info';
|
import type { SongInfo } from '@/providers/song-info';
|
||||||
import type { BackendContext } from '@/types/contexts';
|
import type { BackendContext } from '@/types/contexts';
|
||||||
import type { APIServerConfig } from '../../config';
|
import type { APIServerConfig } from '../../config';
|
||||||
@ -28,8 +32,6 @@ import type { HonoApp } from '../types';
|
|||||||
import type { QueueResponse } from '@/types/youtube-music-desktop-internal';
|
import type { QueueResponse } from '@/types/youtube-music-desktop-internal';
|
||||||
import type { Context } from 'hono';
|
import type { Context } from 'hono';
|
||||||
|
|
||||||
const API_VERSION = 'v1';
|
|
||||||
|
|
||||||
const routes = {
|
const routes = {
|
||||||
previous: createRoute({
|
previous: createRoute({
|
||||||
method: 'post',
|
method: 'post',
|
||||||
@ -87,6 +89,24 @@ const routes = {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
|
getLikeState: createRoute({
|
||||||
|
method: 'get',
|
||||||
|
path: `/api/${API_VERSION}/like-state`,
|
||||||
|
summary: 'get like state',
|
||||||
|
description: 'Get the current like state',
|
||||||
|
responses: {
|
||||||
|
200: {
|
||||||
|
description: 'Success',
|
||||||
|
content: {
|
||||||
|
'application/json': {
|
||||||
|
schema: z.object({
|
||||||
|
state: z.enum(LikeType).nullable(),
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}),
|
||||||
like: createRoute({
|
like: createRoute({
|
||||||
method: 'post',
|
method: 'post',
|
||||||
path: `/api/${API_VERSION}/like`,
|
path: `/api/${API_VERSION}/like`,
|
||||||
@ -274,6 +294,7 @@ const routes = {
|
|||||||
'application/json': {
|
'application/json': {
|
||||||
schema: z.object({
|
schema: z.object({
|
||||||
state: z.number(),
|
state: z.number(),
|
||||||
|
isMuted: z.boolean(),
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -526,12 +547,15 @@ const routes = {
|
|||||||
}),
|
}),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
type PromiseOrValue<T> = T | Promise<T>;
|
||||||
|
|
||||||
export const register = (
|
export const register = (
|
||||||
app: HonoApp,
|
app: HonoApp,
|
||||||
{ window }: BackendContext<APIServerConfig>,
|
{ window }: BackendContext<APIServerConfig>,
|
||||||
songInfoGetter: () => SongInfo | undefined,
|
songInfoGetter: () => PromiseOrValue<SongInfo | undefined>,
|
||||||
repeatModeGetter: () => RepeatMode | undefined,
|
repeatModeGetter: () => PromiseOrValue<RepeatMode | undefined>,
|
||||||
volumeGetter: () => number | undefined,
|
likeTypeGetter: () => PromiseOrValue<LikeType | undefined>,
|
||||||
|
volumeStateGetter: () => PromiseOrValue<VolumeState | undefined>,
|
||||||
) => {
|
) => {
|
||||||
const controller = getSongControls(window);
|
const controller = getSongControls(window);
|
||||||
|
|
||||||
@ -565,6 +589,10 @@ export const register = (
|
|||||||
ctx.status(204);
|
ctx.status(204);
|
||||||
return ctx.body(null);
|
return ctx.body(null);
|
||||||
});
|
});
|
||||||
|
app.openapi(routes.getLikeState, async (ctx) => {
|
||||||
|
ctx.status(200);
|
||||||
|
return ctx.json({ state: (await likeTypeGetter()) ?? null });
|
||||||
|
});
|
||||||
app.openapi(routes.like, (ctx) => {
|
app.openapi(routes.like, (ctx) => {
|
||||||
controller.like();
|
controller.like();
|
||||||
|
|
||||||
@ -624,9 +652,9 @@ export const register = (
|
|||||||
return ctx.body(null);
|
return ctx.body(null);
|
||||||
});
|
});
|
||||||
|
|
||||||
app.openapi(routes.repeatMode, (ctx) => {
|
app.openapi(routes.repeatMode, async (ctx) => {
|
||||||
ctx.status(200);
|
ctx.status(200);
|
||||||
return ctx.json({ mode: repeatModeGetter() ?? null });
|
return ctx.json({ mode: (await repeatModeGetter()) ?? null });
|
||||||
});
|
});
|
||||||
app.openapi(routes.switchRepeat, (ctx) => {
|
app.openapi(routes.switchRepeat, (ctx) => {
|
||||||
const { iteration } = ctx.req.valid('json');
|
const { iteration } = ctx.req.valid('json');
|
||||||
@ -642,9 +670,11 @@ export const register = (
|
|||||||
ctx.status(204);
|
ctx.status(204);
|
||||||
return ctx.body(null);
|
return ctx.body(null);
|
||||||
});
|
});
|
||||||
app.openapi(routes.getVolumeState, (ctx) => {
|
app.openapi(routes.getVolumeState, async (ctx) => {
|
||||||
ctx.status(200);
|
ctx.status(200);
|
||||||
return ctx.json({ state: volumeGetter() ?? 0 });
|
return ctx.json(
|
||||||
|
(await volumeStateGetter()) ?? { state: 0, isMuted: false },
|
||||||
|
);
|
||||||
});
|
});
|
||||||
app.openapi(routes.setFullscreen, (ctx) => {
|
app.openapi(routes.setFullscreen, (ctx) => {
|
||||||
const { state } = ctx.req.valid('json');
|
const { state } = ctx.req.valid('json');
|
||||||
@ -678,8 +708,8 @@ export const register = (
|
|||||||
return ctx.json({ state: fullscreen });
|
return ctx.json({ state: fullscreen });
|
||||||
});
|
});
|
||||||
|
|
||||||
const songInfo = (ctx: Context) => {
|
const songInfo = async (ctx: Context) => {
|
||||||
const info = songInfoGetter();
|
const info = await songInfoGetter();
|
||||||
|
|
||||||
if (!info) {
|
if (!info) {
|
||||||
ctx.status(204);
|
ctx.status(204);
|
||||||
|
|||||||
@ -1,2 +1,3 @@
|
|||||||
export { register as registerControl } from './control';
|
export { register as registerControl } from './control';
|
||||||
export { register as registerAuth } from './auth';
|
export { register as registerAuth } from './auth';
|
||||||
|
export { register as registerWebsocket } from './websocket';
|
||||||
|
|||||||
154
src/plugins/api-server/backend/routes/websocket.ts
Normal file
154
src/plugins/api-server/backend/routes/websocket.ts
Normal file
@ -0,0 +1,154 @@
|
|||||||
|
import { createRoute } from '@hono/zod-openapi';
|
||||||
|
|
||||||
|
import { type NodeWebSocket } from '@hono/node-ws';
|
||||||
|
|
||||||
|
import {
|
||||||
|
registerCallback,
|
||||||
|
type SongInfo,
|
||||||
|
SongInfoEvent,
|
||||||
|
} from '@/providers/song-info';
|
||||||
|
|
||||||
|
import { API_VERSION } from '../api-version';
|
||||||
|
|
||||||
|
import type { WSContext } from 'hono/ws';
|
||||||
|
import type { Context, Next } from 'hono';
|
||||||
|
import type { RepeatMode, VolumeState } from '@/types/datahost-get-state';
|
||||||
|
import type { HonoApp } from '../types';
|
||||||
|
import type { BackendContext } from '@/types/contexts';
|
||||||
|
import type { APIServerConfig } from '@/plugins/api-server/config';
|
||||||
|
|
||||||
|
enum DataTypes {
|
||||||
|
PlayerInfo = 'PLAYER_INFO',
|
||||||
|
VideoChanged = 'VIDEO_CHANGED',
|
||||||
|
PlayerStateChanged = 'PLAYER_STATE_CHANGED',
|
||||||
|
PositionChanged = 'POSITION_CHANGED',
|
||||||
|
VolumeChanged = 'VOLUME_CHANGED',
|
||||||
|
RepeatChanged = 'REPEAT_CHANGED',
|
||||||
|
ShuffleChanged = 'SHUFFLE_CHANGED',
|
||||||
|
}
|
||||||
|
|
||||||
|
type PlayerState = {
|
||||||
|
song?: SongInfo;
|
||||||
|
isPlaying: boolean;
|
||||||
|
muted: boolean;
|
||||||
|
position: number;
|
||||||
|
volume: number;
|
||||||
|
repeat: RepeatMode;
|
||||||
|
shuffle: boolean;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const register = (
|
||||||
|
app: HonoApp,
|
||||||
|
{ ipc }: BackendContext<APIServerConfig>,
|
||||||
|
{ upgradeWebSocket }: NodeWebSocket,
|
||||||
|
) => {
|
||||||
|
let volumeState: VolumeState | undefined = undefined;
|
||||||
|
let repeat: RepeatMode = 'NONE';
|
||||||
|
let shuffle = false;
|
||||||
|
let lastSongInfo: SongInfo | undefined = undefined;
|
||||||
|
|
||||||
|
const sockets = new Set<WSContext<WebSocket>>();
|
||||||
|
|
||||||
|
const send = (type: DataTypes, state: Partial<PlayerState>) => {
|
||||||
|
sockets.forEach((socket) =>
|
||||||
|
socket.send(JSON.stringify({ type, ...state })),
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const createPlayerState = ({
|
||||||
|
songInfo,
|
||||||
|
volumeState,
|
||||||
|
repeat,
|
||||||
|
shuffle,
|
||||||
|
}: {
|
||||||
|
songInfo?: SongInfo;
|
||||||
|
volumeState?: VolumeState;
|
||||||
|
repeat: RepeatMode;
|
||||||
|
shuffle: boolean;
|
||||||
|
}): PlayerState => ({
|
||||||
|
song: songInfo,
|
||||||
|
isPlaying: songInfo ? !songInfo.isPaused : false,
|
||||||
|
muted: volumeState?.isMuted ?? false,
|
||||||
|
position: songInfo?.elapsedSeconds ?? 0,
|
||||||
|
volume: volumeState?.state ?? 100,
|
||||||
|
repeat,
|
||||||
|
shuffle,
|
||||||
|
});
|
||||||
|
|
||||||
|
registerCallback((songInfo, event) => {
|
||||||
|
if (event === SongInfoEvent.VideoSrcChanged) {
|
||||||
|
send(DataTypes.VideoChanged, { song: songInfo, position: 0 });
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event === SongInfoEvent.PlayOrPaused) {
|
||||||
|
send(DataTypes.PlayerStateChanged, {
|
||||||
|
isPlaying: !(songInfo?.isPaused ?? true),
|
||||||
|
position: songInfo.elapsedSeconds,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event === SongInfoEvent.TimeChanged) {
|
||||||
|
send(DataTypes.PositionChanged, { position: songInfo.elapsedSeconds });
|
||||||
|
}
|
||||||
|
|
||||||
|
lastSongInfo = { ...songInfo };
|
||||||
|
});
|
||||||
|
|
||||||
|
ipc.on('ytmd:volume-changed', (newVolumeState: VolumeState) => {
|
||||||
|
volumeState = newVolumeState;
|
||||||
|
send(DataTypes.VolumeChanged, {
|
||||||
|
volume: volumeState.state,
|
||||||
|
muted: volumeState.isMuted,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
ipc.on('ytmd:repeat-changed', (mode: RepeatMode) => {
|
||||||
|
repeat = mode;
|
||||||
|
send(DataTypes.RepeatChanged, { repeat });
|
||||||
|
});
|
||||||
|
|
||||||
|
ipc.on('ytmd:seeked', (t: number) => {
|
||||||
|
send(DataTypes.PositionChanged, { position: t });
|
||||||
|
});
|
||||||
|
|
||||||
|
ipc.on('ytmd:shuffle-changed', (newShuffle: boolean) => {
|
||||||
|
shuffle = newShuffle;
|
||||||
|
send(DataTypes.ShuffleChanged, { shuffle });
|
||||||
|
});
|
||||||
|
|
||||||
|
app.openapi(
|
||||||
|
createRoute({
|
||||||
|
method: 'get',
|
||||||
|
path: `/api/${API_VERSION}/ws`,
|
||||||
|
summary: 'websocket endpoint',
|
||||||
|
description: 'WebSocket endpoint for real-time updates',
|
||||||
|
responses: {
|
||||||
|
101: {
|
||||||
|
description: 'Switching Protocols',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
upgradeWebSocket(() => ({
|
||||||
|
onOpen(_, ws) {
|
||||||
|
// "Unsafe argument of type `WSContext<WebSocket>` assigned to a parameter of type `WSContext<WebSocket>`. (@typescript-eslint/no-unsafe-argument)" ????? what?
|
||||||
|
sockets.add(ws as WSContext<WebSocket>);
|
||||||
|
|
||||||
|
ws.send(
|
||||||
|
JSON.stringify({
|
||||||
|
type: DataTypes.PlayerInfo,
|
||||||
|
...createPlayerState({
|
||||||
|
songInfo: lastSongInfo,
|
||||||
|
volumeState,
|
||||||
|
repeat,
|
||||||
|
shuffle,
|
||||||
|
}),
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
|
onClose(_, ws) {
|
||||||
|
sockets.delete(ws as WSContext<WebSocket>);
|
||||||
|
},
|
||||||
|
})) as (ctx: Context, next: Next) => Promise<Response>,
|
||||||
|
);
|
||||||
|
};
|
||||||
@ -1,9 +1,9 @@
|
|||||||
import { OpenAPIHono as Hono } from '@hono/zod-openapi';
|
import { type OpenAPIHono as Hono } from '@hono/zod-openapi';
|
||||||
import { serve } from '@hono/node-server';
|
import { type serve } from '@hono/node-server';
|
||||||
|
|
||||||
|
import type { RepeatMode, VolumeState } from '@/types/datahost-get-state';
|
||||||
import type { BackendContext } from '@/types/contexts';
|
import type { BackendContext } from '@/types/contexts';
|
||||||
import type { SongInfo } from '@/providers/song-info';
|
import type { SongInfo } from '@/providers/song-info';
|
||||||
import type { RepeatMode } from '@/types/datahost-get-state';
|
|
||||||
import type { APIServerConfig } from '../config';
|
import type { APIServerConfig } from '../config';
|
||||||
|
|
||||||
export type HonoApp = Hono;
|
export type HonoApp = Hono;
|
||||||
@ -13,7 +13,8 @@ export type BackendType = {
|
|||||||
oldConfig?: APIServerConfig;
|
oldConfig?: APIServerConfig;
|
||||||
songInfo?: SongInfo;
|
songInfo?: SongInfo;
|
||||||
currentRepeatMode?: RepeatMode;
|
currentRepeatMode?: RepeatMode;
|
||||||
volume?: number;
|
volumeState?: VolumeState;
|
||||||
|
injectWebSocket?: (server: ReturnType<typeof serve>) => void;
|
||||||
|
|
||||||
init: (ctx: BackendContext<APIServerConfig>) => void;
|
init: (ctx: BackendContext<APIServerConfig>) => void;
|
||||||
run: (hostname: string, port: number) => void;
|
run: (hostname: string, port: number) => void;
|
||||||
|
|||||||
@ -1,26 +1,133 @@
|
|||||||
import { createPlugin } from '@/utils';
|
import { createPlugin } from '@/utils';
|
||||||
import { t } from '@/i18n';
|
import { t } from '@/i18n';
|
||||||
|
import { type YoutubePlayer } from '@/types/youtube-player';
|
||||||
|
|
||||||
|
const lazySafeTry = (...fns: (() => void)[]) => {
|
||||||
|
for (const fn of fns) {
|
||||||
|
try {
|
||||||
|
fn();
|
||||||
|
} catch {}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const createCompressorNode = (
|
||||||
|
audioContext: AudioContext,
|
||||||
|
): DynamicsCompressorNode => {
|
||||||
|
const compressor = audioContext.createDynamicsCompressor();
|
||||||
|
|
||||||
|
compressor.threshold.value = -50;
|
||||||
|
compressor.ratio.value = 12;
|
||||||
|
compressor.knee.value = 40;
|
||||||
|
compressor.attack.value = 0;
|
||||||
|
compressor.release.value = 0.25;
|
||||||
|
|
||||||
|
return compressor;
|
||||||
|
};
|
||||||
|
|
||||||
|
class Storage {
|
||||||
|
lastSource: MediaElementAudioSourceNode | null = null;
|
||||||
|
lastContext: AudioContext | null = null;
|
||||||
|
lastCompressor: DynamicsCompressorNode | null = null;
|
||||||
|
|
||||||
|
connected: WeakMap<MediaElementAudioSourceNode, DynamicsCompressorNode> =
|
||||||
|
new WeakMap();
|
||||||
|
|
||||||
|
connectToCompressor = (
|
||||||
|
source: MediaElementAudioSourceNode | null = null,
|
||||||
|
audioContext: AudioContext | null = null,
|
||||||
|
compressor: DynamicsCompressorNode | null = null,
|
||||||
|
): boolean => {
|
||||||
|
if (!(source && audioContext && compressor)) return false;
|
||||||
|
|
||||||
|
const current = this.connected.get(source);
|
||||||
|
if (current === compressor) return false;
|
||||||
|
|
||||||
|
this.lastSource = source;
|
||||||
|
this.lastContext = audioContext;
|
||||||
|
this.lastCompressor = compressor;
|
||||||
|
|
||||||
|
if (current) {
|
||||||
|
lazySafeTry(
|
||||||
|
() => source.disconnect(current),
|
||||||
|
() => current.disconnect(audioContext.destination),
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
lazySafeTry(() => source.disconnect(audioContext.destination));
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
source.connect(compressor);
|
||||||
|
compressor.connect(audioContext.destination);
|
||||||
|
this.connected.set(source, compressor);
|
||||||
|
return true;
|
||||||
|
} catch (error) {
|
||||||
|
console.error('connectToCompressor failed', error);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
disconnectCompressor = (): boolean => {
|
||||||
|
const source = this.lastSource;
|
||||||
|
const audioContext = this.lastContext;
|
||||||
|
if (!(source && audioContext)) return false;
|
||||||
|
const current = this.connected.get(source);
|
||||||
|
if (!current) return false;
|
||||||
|
|
||||||
|
lazySafeTry(
|
||||||
|
() => source.connect(audioContext.destination),
|
||||||
|
() => source.disconnect(current),
|
||||||
|
() => current.disconnect(audioContext.destination),
|
||||||
|
);
|
||||||
|
this.connected.delete(source);
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const storage = new Storage();
|
||||||
|
|
||||||
|
const audioCanPlayHandler = ({
|
||||||
|
detail: { audioSource, audioContext },
|
||||||
|
}: CustomEvent<Compressor>) => {
|
||||||
|
storage.connectToCompressor(
|
||||||
|
audioSource,
|
||||||
|
audioContext,
|
||||||
|
createCompressorNode(audioContext),
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const ensureAudioContextLoad = (playerApi: YoutubePlayer) => {
|
||||||
|
if (playerApi.getPlayerState() !== 1 || storage.lastContext) return;
|
||||||
|
|
||||||
|
playerApi.loadVideoById(
|
||||||
|
playerApi.getPlayerResponse().videoDetails.videoId,
|
||||||
|
playerApi.getCurrentTime(),
|
||||||
|
playerApi.getUserPlaybackQualityPreference(),
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
export default createPlugin({
|
export default createPlugin({
|
||||||
name: () => t('plugins.audio-compressor.name'),
|
name: () => t('plugins.audio-compressor.name'),
|
||||||
description: () => t('plugins.audio-compressor.description'),
|
description: () => t('plugins.audio-compressor.description'),
|
||||||
|
|
||||||
renderer() {
|
renderer: {
|
||||||
document.addEventListener(
|
onPlayerApiReady(playerApi) {
|
||||||
'ytmd:audio-can-play',
|
ensureAudioContextLoad(playerApi);
|
||||||
({ detail: { audioSource, audioContext } }) => {
|
},
|
||||||
const compressor = audioContext.createDynamicsCompressor();
|
|
||||||
|
|
||||||
compressor.threshold.value = -50;
|
start() {
|
||||||
compressor.ratio.value = 12;
|
document.addEventListener('ytmd:audio-can-play', audioCanPlayHandler, {
|
||||||
compressor.knee.value = 40;
|
passive: true,
|
||||||
compressor.attack.value = 0;
|
});
|
||||||
compressor.release.value = 0.25;
|
storage.connectToCompressor(
|
||||||
|
storage.lastSource,
|
||||||
|
storage.lastContext,
|
||||||
|
storage.lastCompressor,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
audioSource.connect(compressor);
|
stop() {
|
||||||
compressor.connect(audioContext.destination);
|
document.removeEventListener('ytmd:audio-can-play', audioCanPlayHandler);
|
||||||
},
|
storage.disconnectCompressor();
|
||||||
{ once: true, passive: true },
|
},
|
||||||
);
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@ -1,17 +1,15 @@
|
|||||||
import net from 'net';
|
import * as net from 'node:net';
|
||||||
|
|
||||||
import { SocksClient, SocksClientOptions } from 'socks';
|
|
||||||
|
|
||||||
|
import { SocksClient, type SocksClientOptions } from 'socks';
|
||||||
import is from 'electron-is';
|
import is from 'electron-is';
|
||||||
|
|
||||||
import { createBackend, LoggerPrefix } from '@/utils';
|
import { createBackend, LoggerPrefix } from '@/utils';
|
||||||
|
|
||||||
import { BackendType } from './types';
|
import * as config from '@/config';
|
||||||
|
|
||||||
import config from '@/config';
|
import { type AuthProxyConfig, defaultAuthProxyConfig } from '../config';
|
||||||
|
|
||||||
import { AuthProxyConfig, defaultAuthProxyConfig } from '../config';
|
|
||||||
|
|
||||||
|
import type { BackendType } from './types';
|
||||||
import type { BackendContext } from '@/types/contexts';
|
import type { BackendContext } from '@/types/contexts';
|
||||||
|
|
||||||
// Parsing the upstream authentication SOCK proxy URL
|
// Parsing the upstream authentication SOCK proxy URL
|
||||||
|
|||||||
@ -1,5 +1,4 @@
|
|||||||
import net from 'net';
|
import type net from 'net';
|
||||||
|
|
||||||
import type { AuthProxyConfig } from '../config';
|
import type { AuthProxyConfig } from '../config';
|
||||||
import type { Server } from 'http';
|
import type { Server } from 'http';
|
||||||
|
|
||||||
|
|||||||
@ -2,7 +2,10 @@ import { createPlugin } from '@/utils';
|
|||||||
import { t } from '@/i18n';
|
import { t } from '@/i18n';
|
||||||
|
|
||||||
import backend from './back';
|
import backend from './back';
|
||||||
import renderer, { CaptionsSelectorConfig, LanguageOptions } from './renderer';
|
import renderer, {
|
||||||
|
type CaptionsSelectorConfig,
|
||||||
|
type LanguageOptions,
|
||||||
|
} from './renderer';
|
||||||
|
|
||||||
import type { YoutubePlayer } from '@/types/youtube-player';
|
import type { YoutubePlayer } from '@/types/youtube-player';
|
||||||
|
|
||||||
|
|||||||
@ -9,10 +9,10 @@ export const CaptionsSettingButton = (props: CaptionsSettingsButtonProps) => (
|
|||||||
aria-label={props.label}
|
aria-label={props.label}
|
||||||
class="player-captions-button style-scope ytmusic-player-bar"
|
class="player-captions-button style-scope ytmusic-player-bar"
|
||||||
icon={'yt-icons:subtitles'}
|
icon={'yt-icons:subtitles'}
|
||||||
|
on:click={(e) => props.onClick(e)}
|
||||||
role={'button'}
|
role={'button'}
|
||||||
tabindex={0}
|
tabindex={0}
|
||||||
title={props.label}
|
title={props.label}
|
||||||
on:click={(e) => props.onClick(e)}
|
|
||||||
>
|
>
|
||||||
<span class="yt-icon-shape style-scope yt-icon yt-spec-icon-shape">
|
<span class="yt-icon-shape style-scope yt-icon yt-spec-icon-shape">
|
||||||
<div
|
<div
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
import { Innertube } from 'youtubei.js';
|
import { Innertube } from 'youtubei.js';
|
||||||
|
|
||||||
import { BrowserWindow } from 'electron';
|
|
||||||
import prompt from 'custom-electron-prompt';
|
import prompt from 'custom-electron-prompt';
|
||||||
|
|
||||||
import { Howl } from 'howler';
|
import { Howl } from 'howler';
|
||||||
@ -12,6 +11,7 @@ import { VolumeFader } from './fader';
|
|||||||
|
|
||||||
import { t } from '@/i18n';
|
import { t } from '@/i18n';
|
||||||
|
|
||||||
|
import type { BrowserWindow } from 'electron';
|
||||||
import type { RendererContext } from '@/types/contexts';
|
import type { RendererContext } from '@/types/contexts';
|
||||||
|
|
||||||
export type CrossfadePluginConfig = {
|
export type CrossfadePluginConfig = {
|
||||||
|
|||||||
54
src/plugins/custom-output-device/index.ts
Normal file
54
src/plugins/custom-output-device/index.ts
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
import prompt from 'custom-electron-prompt';
|
||||||
|
|
||||||
|
import { t } from '@/i18n';
|
||||||
|
import promptOptions from '@/providers/prompt-options';
|
||||||
|
import { createPlugin } from '@/utils';
|
||||||
|
import { renderer } from './renderer';
|
||||||
|
|
||||||
|
export interface CustomOutputPluginConfig {
|
||||||
|
enabled: boolean;
|
||||||
|
output: string;
|
||||||
|
devices: Record<string, string>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default createPlugin({
|
||||||
|
name: () => t('plugins.custom-output-device.name'),
|
||||||
|
description: () => t('plugins.custom-output-device.description'),
|
||||||
|
restartNeeded: true,
|
||||||
|
config: {
|
||||||
|
enabled: false,
|
||||||
|
output: 'default',
|
||||||
|
devices: {},
|
||||||
|
} as CustomOutputPluginConfig,
|
||||||
|
menu: ({ setConfig, getConfig, window }) => {
|
||||||
|
const promptDeviceSelector = async () => {
|
||||||
|
const options = await getConfig();
|
||||||
|
|
||||||
|
const response = await prompt(
|
||||||
|
{
|
||||||
|
title: t('plugins.custom-output-device.prompt.device-selector.title'),
|
||||||
|
label: t('plugins.custom-output-device.prompt.device-selector.label'),
|
||||||
|
value: options.output || 'default',
|
||||||
|
type: 'select',
|
||||||
|
selectOptions: options.devices,
|
||||||
|
width: 500,
|
||||||
|
...promptOptions(),
|
||||||
|
},
|
||||||
|
window,
|
||||||
|
).catch(console.error);
|
||||||
|
|
||||||
|
if (!response) return;
|
||||||
|
options.output = response;
|
||||||
|
setConfig(options);
|
||||||
|
};
|
||||||
|
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
label: t('plugins.custom-output-device.menu.device-selector'),
|
||||||
|
click: promptDeviceSelector,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
},
|
||||||
|
|
||||||
|
renderer,
|
||||||
|
});
|
||||||
76
src/plugins/custom-output-device/renderer.ts
Normal file
76
src/plugins/custom-output-device/renderer.ts
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
import { createRenderer } from '@/utils';
|
||||||
|
|
||||||
|
import type { YoutubePlayer } from '@/types/youtube-player';
|
||||||
|
import type { RendererContext } from '@/types/contexts';
|
||||||
|
import type { CustomOutputPluginConfig } from './index';
|
||||||
|
|
||||||
|
const updateDeviceList = async (
|
||||||
|
context: RendererContext<CustomOutputPluginConfig>,
|
||||||
|
) => {
|
||||||
|
const newDevices: Record<string, string> = {};
|
||||||
|
const devices = await navigator.mediaDevices
|
||||||
|
.enumerateDevices()
|
||||||
|
.then((devices) =>
|
||||||
|
devices.filter((device) => device.kind === 'audiooutput'),
|
||||||
|
);
|
||||||
|
for (const device of devices) {
|
||||||
|
newDevices[device.deviceId] = device.label;
|
||||||
|
}
|
||||||
|
const options = await context.getConfig();
|
||||||
|
options.devices = newDevices;
|
||||||
|
context.setConfig(options);
|
||||||
|
};
|
||||||
|
|
||||||
|
const updateSinkId = async (
|
||||||
|
audioContext?: AudioContext & {
|
||||||
|
setSinkId?: (sinkId: string) => Promise<void>;
|
||||||
|
},
|
||||||
|
sinkId?: string,
|
||||||
|
) => {
|
||||||
|
if (!audioContext || !sinkId) return;
|
||||||
|
if (!('setSinkId' in audioContext)) return;
|
||||||
|
|
||||||
|
if (typeof audioContext.setSinkId === 'function') {
|
||||||
|
await audioContext.setSinkId(sinkId);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export const renderer = createRenderer<
|
||||||
|
{
|
||||||
|
options?: CustomOutputPluginConfig;
|
||||||
|
audioContext?: AudioContext;
|
||||||
|
audioCanPlayHandler: (event: CustomEvent<Compressor>) => Promise<void>;
|
||||||
|
},
|
||||||
|
CustomOutputPluginConfig
|
||||||
|
>({
|
||||||
|
async audioCanPlayHandler({ detail: { audioContext } }) {
|
||||||
|
this.audioContext = audioContext;
|
||||||
|
await updateSinkId(audioContext, this.options!.output);
|
||||||
|
},
|
||||||
|
|
||||||
|
async onPlayerApiReady(_: YoutubePlayer, context) {
|
||||||
|
this.options = await context.getConfig();
|
||||||
|
await navigator.mediaDevices.getUserMedia({ audio: true, video: false });
|
||||||
|
navigator.mediaDevices.ondevicechange = async () =>
|
||||||
|
await updateDeviceList(context);
|
||||||
|
|
||||||
|
document.addEventListener('ytmd:audio-can-play', this.audioCanPlayHandler, {
|
||||||
|
once: true,
|
||||||
|
passive: true,
|
||||||
|
});
|
||||||
|
await updateDeviceList(context);
|
||||||
|
},
|
||||||
|
|
||||||
|
stop() {
|
||||||
|
document.removeEventListener(
|
||||||
|
'ytmd:audio-can-play',
|
||||||
|
this.audioCanPlayHandler,
|
||||||
|
);
|
||||||
|
navigator.mediaDevices.ondevicechange = null;
|
||||||
|
},
|
||||||
|
|
||||||
|
async onConfigChange(config) {
|
||||||
|
this.options = config;
|
||||||
|
await updateSinkId(this.audioContext, config.output);
|
||||||
|
},
|
||||||
|
});
|
||||||
@ -98,8 +98,11 @@ export class DiscordService {
|
|||||||
|
|
||||||
const activityInfo: SetActivity = {
|
const activityInfo: SetActivity = {
|
||||||
type: ActivityType.Listening,
|
type: ActivityType.Listening,
|
||||||
details: truncateString(songInfo.title, 128), // Song title
|
statusDisplayType: config.statusDisplayType,
|
||||||
state: truncateString(songInfo.artist, 128), // Artist name
|
details: truncateString(songInfo.alternativeTitle ?? songInfo.title, 128), // Song title
|
||||||
|
detailsUrl: songInfo.url ?? undefined,
|
||||||
|
state: truncateString(songInfo.tags?.at(0) ?? songInfo.artist, 128), // Artist name
|
||||||
|
stateUrl: songInfo.artistUrl,
|
||||||
largeImageKey: songInfo.imageSrc ?? undefined,
|
largeImageKey: songInfo.imageSrc ?? undefined,
|
||||||
largeImageText: songInfo.album
|
largeImageText: songInfo.album
|
||||||
? truncateString(songInfo.album, 128)
|
? truncateString(songInfo.album, 128)
|
||||||
|
|||||||
@ -1,3 +1,5 @@
|
|||||||
|
import { StatusDisplayType } from 'discord-api-types/v10';
|
||||||
|
|
||||||
import { createPlugin } from '@/utils';
|
import { createPlugin } from '@/utils';
|
||||||
import { backend } from './main';
|
import { backend } from './main';
|
||||||
import { onMenu } from './menu';
|
import { onMenu } from './menu';
|
||||||
@ -33,6 +35,10 @@ export type DiscordPluginConfig = {
|
|||||||
* Hide the "duration left" in the rich presence
|
* Hide the "duration left" in the rich presence
|
||||||
*/
|
*/
|
||||||
hideDurationLeft: boolean;
|
hideDurationLeft: boolean;
|
||||||
|
/**
|
||||||
|
* Controls which field is displayed in the Discord status text
|
||||||
|
*/
|
||||||
|
statusDisplayType: (typeof StatusDisplayType)[keyof typeof StatusDisplayType];
|
||||||
};
|
};
|
||||||
|
|
||||||
export default createPlugin({
|
export default createPlugin({
|
||||||
@ -47,6 +53,7 @@ export default createPlugin({
|
|||||||
playOnYouTubeMusic: true,
|
playOnYouTubeMusic: true,
|
||||||
hideGitHubButton: false,
|
hideGitHubButton: false,
|
||||||
hideDurationLeft: false,
|
hideDurationLeft: false,
|
||||||
|
statusDisplayType: StatusDisplayType.Details,
|
||||||
} as DiscordPluginConfig,
|
} as DiscordPluginConfig,
|
||||||
menu: onMenu,
|
menu: onMenu,
|
||||||
backend,
|
backend,
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import { app } from 'electron';
|
import { app } from 'electron';
|
||||||
|
|
||||||
import registerCallback, { SongInfoEvent } from '@/providers/song-info';
|
import { registerCallback, SongInfoEvent } from '@/providers/song-info';
|
||||||
import { createBackend } from '@/utils';
|
import { createBackend } from '@/utils';
|
||||||
|
|
||||||
import { DiscordService } from './discord-service';
|
import { DiscordService } from './discord-service';
|
||||||
|
|||||||
@ -1,22 +1,30 @@
|
|||||||
import prompt from 'custom-electron-prompt';
|
import prompt from 'custom-electron-prompt';
|
||||||
|
|
||||||
import { discordService } from './main';
|
import { StatusDisplayType } from 'discord-api-types/v10';
|
||||||
|
|
||||||
|
import { discordService } from './main';
|
||||||
import { singleton } from '@/providers/decorators';
|
import { singleton } from '@/providers/decorators';
|
||||||
import promptOptions from '@/providers/prompt-options';
|
import promptOptions from '@/providers/prompt-options';
|
||||||
import { setMenuOptions } from '@/config/plugins';
|
import { setMenuOptions } from '@/config/plugins';
|
||||||
|
|
||||||
import { t } from '@/i18n';
|
import { t } from '@/i18n';
|
||||||
|
|
||||||
import type { MenuContext } from '@/types/contexts';
|
import type { MenuContext } from '@/types/contexts';
|
||||||
import type { DiscordPluginConfig } from './index';
|
import type { DiscordPluginConfig } from './index';
|
||||||
|
|
||||||
import type { MenuTemplate } from '@/menu';
|
import type { MenuTemplate } from '@/menu';
|
||||||
|
|
||||||
const registerRefreshOnce = singleton((refreshMenu: () => void) => {
|
const registerRefreshOnce = singleton((refreshMenu: () => void) => {
|
||||||
discordService?.registerRefreshCallback(refreshMenu);
|
discordService?.registerRefreshCallback(refreshMenu);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const DiscordStatusDisplayTypeLabels: Record<StatusDisplayType, string> = {
|
||||||
|
[StatusDisplayType.Name]:
|
||||||
|
'plugins.discord.menu.set-status-display-type.submenu.youtube-music',
|
||||||
|
[StatusDisplayType.State]:
|
||||||
|
'plugins.discord.menu.set-status-display-type.submenu.artist',
|
||||||
|
[StatusDisplayType.Details]:
|
||||||
|
'plugins.discord.menu.set-status-display-type.submenu.title',
|
||||||
|
};
|
||||||
|
|
||||||
export const onMenu = async ({
|
export const onMenu = async ({
|
||||||
window,
|
window,
|
||||||
getConfig,
|
getConfig,
|
||||||
@ -92,6 +100,27 @@ export const onMenu = async ({
|
|||||||
label: t('plugins.discord.menu.set-inactivity-timeout'),
|
label: t('plugins.discord.menu.set-inactivity-timeout'),
|
||||||
click: () => setInactivityTimeout(window, config),
|
click: () => setInactivityTimeout(window, config),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
label: t('plugins.discord.menu.set-status-display-type.label'),
|
||||||
|
submenu: Object.values(StatusDisplayType)
|
||||||
|
.filter(
|
||||||
|
(v) => typeof StatusDisplayType[v as StatusDisplayType] !== 'number',
|
||||||
|
)
|
||||||
|
.map((statusDisplayType) => ({
|
||||||
|
label: t(
|
||||||
|
DiscordStatusDisplayTypeLabels[
|
||||||
|
statusDisplayType as StatusDisplayType
|
||||||
|
],
|
||||||
|
),
|
||||||
|
type: 'radio',
|
||||||
|
checked: config.statusDisplayType === statusDisplayType,
|
||||||
|
click() {
|
||||||
|
setConfig({
|
||||||
|
statusDisplayType: statusDisplayType as StatusDisplayType,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
})),
|
||||||
|
},
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { TimerKey } from './constants';
|
import type { TimerKey } from './constants';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Manages NodeJS Timers, ensuring only one timer exists per key.
|
* Manages NodeJS Timers, ensuring only one timer exists per key.
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { DefaultPresetList, Preset } from './types';
|
import { DefaultPresetList, type Preset } from './types';
|
||||||
|
|
||||||
import style from './style.css?inline';
|
import style from './style.css?inline';
|
||||||
|
|
||||||
|
|||||||
@ -2,12 +2,12 @@ import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
|
|||||||
import { join } from 'node:path';
|
import { join } from 'node:path';
|
||||||
import { randomBytes } from 'node:crypto';
|
import { randomBytes } from 'node:crypto';
|
||||||
|
|
||||||
import { app, BrowserWindow, dialog, ipcMain } from 'electron';
|
import { app, type BrowserWindow, dialog, ipcMain } from 'electron';
|
||||||
import { Innertube, UniversalCache, Utils, YTNodes } from 'youtubei.js';
|
import { Innertube, UniversalCache, Utils, YTNodes } from 'youtubei.js';
|
||||||
import is from 'electron-is';
|
import is from 'electron-is';
|
||||||
import filenamify from 'filenamify';
|
import filenamify from 'filenamify';
|
||||||
import { Mutex } from 'async-mutex';
|
import { Mutex } from 'async-mutex';
|
||||||
import NodeID3, { TagConstants } from 'node-id3';
|
import * as NodeID3 from 'node-id3';
|
||||||
import { BG, type BgConfig } from 'bgutils-js';
|
import { BG, type BgConfig } from 'bgutils-js';
|
||||||
import { lazy } from 'lazy-var';
|
import { lazy } from 'lazy-var';
|
||||||
|
|
||||||
@ -17,7 +17,8 @@ import {
|
|||||||
sendFeedback as sendFeedback_,
|
sendFeedback as sendFeedback_,
|
||||||
setBadge,
|
setBadge,
|
||||||
} from './utils';
|
} from './utils';
|
||||||
import registerCallback, {
|
import {
|
||||||
|
registerCallback,
|
||||||
cleanupName,
|
cleanupName,
|
||||||
getImage,
|
getImage,
|
||||||
MediaType,
|
MediaType,
|
||||||
@ -590,7 +591,7 @@ async function writeID3(
|
|||||||
tags.image = {
|
tags.image = {
|
||||||
mime: 'image/png',
|
mime: 'image/png',
|
||||||
type: {
|
type: {
|
||||||
id: TagConstants.AttachedPicture.PictureType.FRONT_COVER,
|
id: NodeID3.TagConstants.AttachedPicture.PictureType.FRONT_COVER,
|
||||||
},
|
},
|
||||||
description: 'thumbnail',
|
description: 'thumbnail',
|
||||||
imageBuffer: coverBuffer,
|
imageBuffer: coverBuffer,
|
||||||
@ -848,5 +849,7 @@ const getMetadata = (info: TrackInfo): CustomSongInfo => ({
|
|||||||
const getAndroidTvInfo = async (id: string): Promise<VideoInfo> => {
|
const getAndroidTvInfo = async (id: string): Promise<VideoInfo> => {
|
||||||
// GetInfo 404s with the bypass, so we use getBasicInfo instead
|
// GetInfo 404s with the bypass, so we use getBasicInfo instead
|
||||||
// that's fine as we only need the streaming data
|
// that's fine as we only need the streaming data
|
||||||
return await yt.getBasicInfo(id, 'TV_EMBEDDED');
|
return await yt.getBasicInfo(id, {
|
||||||
|
client: 'TV_EMBEDDED',
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { app, BrowserWindow } from 'electron';
|
import { app, type BrowserWindow } from 'electron';
|
||||||
import is from 'electron-is';
|
import is from 'electron-is';
|
||||||
|
|
||||||
export const getFolder = (customFolder?: string) =>
|
export const getFolder = (customFolder?: string) =>
|
||||||
|
|||||||
@ -2,11 +2,14 @@ import { createSignal } from 'solid-js';
|
|||||||
|
|
||||||
import { render } from 'solid-js/web';
|
import { render } from 'solid-js/web';
|
||||||
|
|
||||||
import defaultConfig from '@/config/defaults';
|
import { defaultConfig } from '@/config/defaults';
|
||||||
import { getSongMenu } from '@/providers/dom-elements';
|
import { getSongMenu } from '@/providers/dom-elements';
|
||||||
import { getSongInfo } from '@/providers/song-info-front';
|
import { getSongInfo } from '@/providers/song-info-front';
|
||||||
import { t } from '@/i18n';
|
import { t } from '@/i18n';
|
||||||
import { isMusicOrVideoTrack } from '@/plugins/utils/renderer/check';
|
import {
|
||||||
|
isAlbumOrPlaylist,
|
||||||
|
isMusicOrVideoTrack,
|
||||||
|
} from '@/plugins/utils/renderer/check';
|
||||||
|
|
||||||
import { DownloadButton } from './templates/download';
|
import { DownloadButton } from './templates/download';
|
||||||
|
|
||||||
@ -25,7 +28,7 @@ const menuObserver = new MutationObserver(() => {
|
|||||||
if (
|
if (
|
||||||
!menu ||
|
!menu ||
|
||||||
menu.contains(buttonContainer) ||
|
menu.contains(buttonContainer) ||
|
||||||
!isMusicOrVideoTrack() ||
|
!(isMusicOrVideoTrack() || isAlbumOrPlaylist()) ||
|
||||||
!buttonContainer
|
!buttonContainer
|
||||||
) {
|
) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
@ -5,8 +5,8 @@ export const DownloadButton = (props: {
|
|||||||
<a
|
<a
|
||||||
class="yt-simple-endpoint style-scope ytmusic-menu-navigation-item-renderer"
|
class="yt-simple-endpoint style-scope ytmusic-menu-navigation-item-renderer"
|
||||||
id="navigation-endpoint"
|
id="navigation-endpoint"
|
||||||
tabindex={-1}
|
|
||||||
onClick={props.onClick}
|
onClick={props.onClick}
|
||||||
|
tabindex={-1}
|
||||||
>
|
>
|
||||||
<div class="icon ytmd-menu-item style-scope ytmusic-menu-navigation-item-renderer">
|
<div class="icon ytmd-menu-item style-scope ytmusic-menu-navigation-item-renderer">
|
||||||
<svg
|
<svg
|
||||||
|
|||||||
@ -1,8 +1,15 @@
|
|||||||
import { createPlugin } from '@/utils';
|
import { createPlugin } from '@/utils';
|
||||||
import { t } from '@/i18n';
|
import { t } from '@/i18n';
|
||||||
import { MenuContext } from '@/types/contexts';
|
|
||||||
import { MenuTemplate } from '@/menu';
|
import {
|
||||||
import { defaultPresets, presetConfigs, Preset, FilterConfig } from './presets';
|
defaultPresets,
|
||||||
|
presetConfigs,
|
||||||
|
type Preset,
|
||||||
|
type FilterConfig,
|
||||||
|
} from './presets';
|
||||||
|
|
||||||
|
import type { MenuContext } from '@/types/contexts';
|
||||||
|
import type { MenuTemplate } from '@/menu';
|
||||||
|
|
||||||
export type EqualizerPluginConfig = {
|
export type EqualizerPluginConfig = {
|
||||||
enabled: boolean;
|
enabled: boolean;
|
||||||
|
|||||||
@ -1,6 +1,8 @@
|
|||||||
import { createPlugin } from '@/utils';
|
import { createPlugin } from '@/utils';
|
||||||
import { t } from '@/i18n';
|
import { t } from '@/i18n';
|
||||||
|
|
||||||
|
import type { YoutubePlayer } from '@/types/youtube-player';
|
||||||
|
|
||||||
export default createPlugin({
|
export default createPlugin({
|
||||||
name: () => t('plugins.exponential-volume.name'),
|
name: () => t('plugins.exponential-volume.name'),
|
||||||
description: () => t('plugins.exponential-volume.description'),
|
description: () => t('plugins.exponential-volume.description'),
|
||||||
@ -9,7 +11,16 @@ export default createPlugin({
|
|||||||
enabled: false,
|
enabled: false,
|
||||||
},
|
},
|
||||||
renderer: {
|
renderer: {
|
||||||
onPlayerApiReady() {
|
onPlayerApiReady(playerApi) {
|
||||||
|
const syncVolume = (playerApi: YoutubePlayer) => {
|
||||||
|
if (playerApi.getPlayerState() === 3) {
|
||||||
|
setTimeout(() => syncVolume(playerApi), 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
playerApi.setVolume(playerApi.getVolume());
|
||||||
|
};
|
||||||
|
|
||||||
// "YouTube Music fix volume ratio 0.4" by Marco Pfeiffer
|
// "YouTube Music fix volume ratio 0.4" by Marco Pfeiffer
|
||||||
// https://greasyfork.org/en/scripts/397686-youtube-music-fix-volume-ratio/
|
// https://greasyfork.org/en/scripts/397686-youtube-music-fix-volume-ratio/
|
||||||
|
|
||||||
@ -48,6 +59,7 @@ export default createPlugin({
|
|||||||
propertyDescriptor?.set?.call(this, lowVolume);
|
propertyDescriptor?.set?.call(this, lowVolume);
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
syncVolume(playerApi);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@ -3,10 +3,10 @@ import { register } from 'electron-localshortcut';
|
|||||||
import {
|
import {
|
||||||
BrowserWindow,
|
BrowserWindow,
|
||||||
Menu,
|
Menu,
|
||||||
MenuItem,
|
type MenuItem,
|
||||||
ipcMain,
|
ipcMain,
|
||||||
nativeImage,
|
nativeImage,
|
||||||
WebContents,
|
type WebContents,
|
||||||
} from 'electron';
|
} from 'electron';
|
||||||
|
|
||||||
import type { BackendContext } from '@/types/contexts';
|
import type { BackendContext } from '@/types/contexts';
|
||||||
|
|||||||
@ -2,7 +2,7 @@ import { createSignal } from 'solid-js';
|
|||||||
import { render } from 'solid-js/web';
|
import { render } from 'solid-js/web';
|
||||||
|
|
||||||
import { TitleBar } from './renderer/TitleBar';
|
import { TitleBar } from './renderer/TitleBar';
|
||||||
import { defaultInAppMenuConfig, InAppMenuConfig } from './constants';
|
import { defaultInAppMenuConfig, type InAppMenuConfig } from './constants';
|
||||||
|
|
||||||
import type { RendererContext } from '@/types/contexts';
|
import type { RendererContext } from '@/types/contexts';
|
||||||
|
|
||||||
@ -33,12 +33,12 @@ export const onRendererLoad = async ({
|
|||||||
render(
|
render(
|
||||||
() => (
|
() => (
|
||||||
<TitleBar
|
<TitleBar
|
||||||
ipc={ipc}
|
|
||||||
isMacOS={isMacOS}
|
|
||||||
enableController={
|
enableController={
|
||||||
isNotWindowsOrMacOS && !config().hideDOMWindowControls
|
isNotWindowsOrMacOS && !config().hideDOMWindowControls
|
||||||
}
|
}
|
||||||
initialCollapsed={window.mainConfig.get('options.hideMenu')}
|
initialCollapsed={window.mainConfig.get('options.hideMenu')}
|
||||||
|
ipc={ipc}
|
||||||
|
isMacOS={isMacOS}
|
||||||
/>
|
/>
|
||||||
),
|
),
|
||||||
document.body,
|
document.body,
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { JSX } from 'solid-js';
|
import { type JSX } from 'solid-js';
|
||||||
import { css } from 'solid-styled-components';
|
import { css } from 'solid-styled-components';
|
||||||
|
|
||||||
import { cacheNoArgs } from '@/providers/decorators';
|
import { cacheNoArgs } from '@/providers/decorators';
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { JSX, splitProps } from 'solid-js';
|
import { type JSX, splitProps } from 'solid-js';
|
||||||
import { css } from 'solid-styled-components';
|
import { css } from 'solid-styled-components';
|
||||||
|
|
||||||
import { cacheNoArgs } from '@/providers/decorators';
|
import { cacheNoArgs } from '@/providers/decorators';
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { createSignal, JSX, Show, splitProps, mergeProps } from 'solid-js';
|
import { createSignal, type JSX, Show, splitProps, mergeProps } from 'solid-js';
|
||||||
import { Portal } from 'solid-js/web';
|
import { Portal } from 'solid-js/web';
|
||||||
import { css } from 'solid-styled-components';
|
import { css } from 'solid-styled-components';
|
||||||
import { Transition } from 'solid-transition-group';
|
import { Transition } from 'solid-transition-group';
|
||||||
@ -6,7 +6,7 @@ import {
|
|||||||
autoUpdate,
|
autoUpdate,
|
||||||
flip,
|
flip,
|
||||||
offset,
|
offset,
|
||||||
OffsetOptions,
|
type OffsetOptions,
|
||||||
size,
|
size,
|
||||||
} from '@floating-ui/dom';
|
} from '@floating-ui/dom';
|
||||||
import { useFloating } from 'solid-floating-ui';
|
import { useFloating } from 'solid-floating-ui';
|
||||||
@ -149,17 +149,17 @@ export const Panel = (props: PanelProps) => {
|
|||||||
<Portal>
|
<Portal>
|
||||||
<Transition
|
<Transition
|
||||||
appear
|
appear
|
||||||
enterClass={animationStyle().enter}
|
|
||||||
enterActiveClass={animationStyle().enterActive}
|
enterActiveClass={animationStyle().enterActive}
|
||||||
exitToClass={animationStyle().exitTo}
|
enterClass={animationStyle().enter}
|
||||||
exitActiveClass={animationStyle().exitActive}
|
exitActiveClass={animationStyle().exitActive}
|
||||||
|
exitToClass={animationStyle().exitTo}
|
||||||
>
|
>
|
||||||
<Show when={local.open}>
|
<Show when={local.open}>
|
||||||
<ul
|
<ul
|
||||||
{...leftProps}
|
{...leftProps}
|
||||||
|
class={panelStyle()}
|
||||||
data-ytmd-sub-panel={true}
|
data-ytmd-sub-panel={true}
|
||||||
ref={setPanel}
|
ref={setPanel}
|
||||||
class={panelStyle()}
|
|
||||||
style={{
|
style={{
|
||||||
'--offset-x': `${position.x}px`,
|
'--offset-x': `${position.x}px`,
|
||||||
'--offset-y': `${position.y}px`,
|
'--offset-y': `${position.y}px`,
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import { createSignal, Match, Show, Switch } from 'solid-js';
|
import { createSignal, Match, Show, Switch } from 'solid-js';
|
||||||
import { JSX } from 'solid-js/jsx-runtime';
|
import { type JSX } from 'solid-js/jsx-runtime';
|
||||||
import { css } from 'solid-styled-components';
|
import { css } from 'solid-styled-components';
|
||||||
import { Portal } from 'solid-js/web';
|
import { Portal } from 'solid-js/web';
|
||||||
|
|
||||||
@ -290,80 +290,80 @@ export const PanelItem = (props: PanelItemProps) => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<li
|
<li
|
||||||
ref={setAnchor}
|
|
||||||
class={itemStyle()}
|
class={itemStyle()}
|
||||||
onMouseEnter={handleHover}
|
|
||||||
onClick={handleClick}
|
|
||||||
data-selected={open()}
|
data-selected={open()}
|
||||||
|
onClick={handleClick}
|
||||||
|
onMouseEnter={handleHover}
|
||||||
|
ref={setAnchor}
|
||||||
>
|
>
|
||||||
<Switch fallback={<div class={itemIconStyle()} />}>
|
<Switch fallback={<div class={itemIconStyle()} />}>
|
||||||
<Match when={props.type === 'checkbox' && props.checked}>
|
<Match when={props.type === 'checkbox' && props.checked}>
|
||||||
<svg
|
<svg
|
||||||
class={itemIconStyle()}
|
class={itemIconStyle()}
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
stroke-width="1.5"
|
|
||||||
stroke="currentColor"
|
|
||||||
fill="none"
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
stroke-linecap="round"
|
stroke-linecap="round"
|
||||||
stroke-linejoin="round"
|
stroke-linejoin="round"
|
||||||
|
stroke-width="1.5"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
>
|
>
|
||||||
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
|
<path d="M0 0h24v24H0z" fill="none" stroke="none" />
|
||||||
<path d="M5 12l5 5l10 -10" />
|
<path d="M5 12l5 5l10 -10" />
|
||||||
</svg>
|
</svg>
|
||||||
</Match>
|
</Match>
|
||||||
<Match when={props.type === 'radio' && props.checked}>
|
<Match when={props.type === 'radio' && props.checked}>
|
||||||
<svg
|
<svg
|
||||||
class={itemIconStyle()}
|
class={itemIconStyle()}
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
viewBox="0 0 20 20"
|
|
||||||
style={{ padding: '6px' }}
|
style={{ padding: '6px' }}
|
||||||
|
viewBox="0 0 20 20"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
>
|
>
|
||||||
<path
|
<path
|
||||||
fill="currentColor"
|
|
||||||
d="M10,5 C7.2,5 5,7.2 5,10 C5,12.8 7.2,15 10,15 C12.8,15 15,12.8 15,10 C15,7.2 12.8,5 10,5 L10,5 Z M10,0 C4.5,0 0,4.5 0,10 C0,15.5 4.5,20 10,20 C15.5,20 20,15.5 20,10 C20,4.5 15.5,0 10,0 L10,0 Z M10,18 C5.6,18 2,14.4 2,10 C2,5.6 5.6,2 10,2 C14.4,2 18,5.6 18,10 C18,14.4 14.4,18 10,18 L10,18 Z"
|
d="M10,5 C7.2,5 5,7.2 5,10 C5,12.8 7.2,15 10,15 C12.8,15 15,12.8 15,10 C15,7.2 12.8,5 10,5 L10,5 Z M10,0 C4.5,0 0,4.5 0,10 C0,15.5 4.5,20 10,20 C15.5,20 20,15.5 20,10 C20,4.5 15.5,0 10,0 L10,0 Z M10,18 C5.6,18 2,14.4 2,10 C2,5.6 5.6,2 10,2 C14.4,2 18,5.6 18,10 C18,14.4 14.4,18 10,18 L10,18 Z"
|
||||||
|
fill="currentColor"
|
||||||
/>
|
/>
|
||||||
</svg>
|
</svg>
|
||||||
</Match>
|
</Match>
|
||||||
<Match when={props.type === 'radio' && !props.checked}>
|
<Match when={props.type === 'radio' && !props.checked}>
|
||||||
<svg
|
<svg
|
||||||
class={itemIconStyle()}
|
class={itemIconStyle()}
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
viewBox="0 0 20 20"
|
|
||||||
style={{ padding: '6px' }}
|
style={{ padding: '6px' }}
|
||||||
|
viewBox="0 0 20 20"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
>
|
>
|
||||||
<path
|
<path
|
||||||
fill="currentColor"
|
|
||||||
d="M10,0 C4.5,0 0,4.5 0,10 C0,15.5 4.5,20 10,20 C15.5,20 20,15.5 20,10 C20,4.5 15.5,0 10,0 L10,0 Z M10,18 C5.6,18 2,14.4 2,10 C2,5.6 5.6,2 10,2 C14.4,2 18,5.6 18,10 C18,14.4 14.4,18 10,18 L10,18 Z"
|
d="M10,0 C4.5,0 0,4.5 0,10 C0,15.5 4.5,20 10,20 C15.5,20 20,15.5 20,10 C20,4.5 15.5,0 10,0 L10,0 Z M10,18 C5.6,18 2,14.4 2,10 C2,5.6 5.6,2 10,2 C14.4,2 18,5.6 18,10 C18,14.4 14.4,18 10,18 L10,18 Z"
|
||||||
|
fill="currentColor"
|
||||||
/>
|
/>
|
||||||
</svg>
|
</svg>
|
||||||
</Match>
|
</Match>
|
||||||
</Switch>
|
</Switch>
|
||||||
<span class={itemLabelStyle()}>{props.name}</span>
|
<span class={itemLabelStyle()}>{props.name}</span>
|
||||||
<Show when={props.chip} fallback={<div />}>
|
<Show fallback={<div />} when={props.chip}>
|
||||||
<span class={itemChipStyle()}>{props.chip}</span>
|
<span class={itemChipStyle()}>{props.chip}</span>
|
||||||
</Show>
|
</Show>
|
||||||
<Show when={props.type === 'submenu'}>
|
<Show when={props.type === 'submenu'}>
|
||||||
<svg
|
<svg
|
||||||
class={itemIconStyle()}
|
class={itemIconStyle()}
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
stroke-width="1.5"
|
|
||||||
stroke="currentColor"
|
|
||||||
fill="none"
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
stroke-linecap="round"
|
stroke-linecap="round"
|
||||||
stroke-linejoin="round"
|
stroke-linejoin="round"
|
||||||
|
stroke-width="1.5"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
>
|
>
|
||||||
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
|
<path d="M0 0h24v24H0z" fill="none" stroke="none" />
|
||||||
<polyline points="9 6 15 12 9 18" />
|
<polyline points="9 6 15 12 9 18" />
|
||||||
</svg>
|
</svg>
|
||||||
<Panel
|
<Panel
|
||||||
ref={setChild}
|
|
||||||
open={open()}
|
|
||||||
anchor={anchor()}
|
anchor={anchor()}
|
||||||
placement={'right-start'}
|
|
||||||
data-level={props.type === 'submenu' && props.level.join('/')}
|
data-level={props.type === 'submenu' && props.level.join('/')}
|
||||||
offset={{ mainAxis: 8 }}
|
offset={{ mainAxis: 8 }}
|
||||||
|
open={open()}
|
||||||
|
placement={'right-start'}
|
||||||
|
ref={setChild}
|
||||||
>
|
>
|
||||||
{props.type === 'submenu' && props.children}
|
{props.type === 'submenu' && props.children}
|
||||||
</Panel>
|
</Panel>
|
||||||
@ -371,8 +371,8 @@ export const PanelItem = (props: PanelItemProps) => {
|
|||||||
<Show when={props.toolTip}>
|
<Show when={props.toolTip}>
|
||||||
<Portal>
|
<Portal>
|
||||||
<div
|
<div
|
||||||
ref={setToolTip}
|
|
||||||
class={popupStyle()}
|
class={popupStyle()}
|
||||||
|
ref={setToolTip}
|
||||||
style={{
|
style={{
|
||||||
'--offset-x': `${position.x}px`,
|
'--offset-x': `${position.x}px`,
|
||||||
'--offset-y': `${position.y}px`,
|
'--offset-y': `${position.y}px`,
|
||||||
@ -380,10 +380,10 @@ export const PanelItem = (props: PanelItemProps) => {
|
|||||||
>
|
>
|
||||||
<Transition
|
<Transition
|
||||||
appear
|
appear
|
||||||
enterClass={animationStyle().enter}
|
|
||||||
enterActiveClass={animationStyle().enterActive}
|
enterActiveClass={animationStyle().enterActive}
|
||||||
exitToClass={animationStyle().exitTo}
|
enterClass={animationStyle().enter}
|
||||||
exitActiveClass={animationStyle().exitActive}
|
exitActiveClass={animationStyle().exitActive}
|
||||||
|
exitToClass={animationStyle().exitTo}
|
||||||
>
|
>
|
||||||
<Show when={toolTipOpen()}>
|
<Show when={toolTipOpen()}>
|
||||||
<div class={toolTipStyle()}>{props.toolTip}</div>
|
<div class={toolTipStyle()}>{props.toolTip}</div>
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { Menu, MenuItem } from 'electron';
|
import { type Menu, type MenuItem } from 'electron';
|
||||||
import {
|
import {
|
||||||
createEffect,
|
createEffect,
|
||||||
createResource,
|
createResource,
|
||||||
@ -120,22 +120,22 @@ const PanelRenderer = (props: PanelRendererProps) => {
|
|||||||
<Switch>
|
<Switch>
|
||||||
<Match when={subItem().type === 'normal'}>
|
<Match when={subItem().type === 'normal'}>
|
||||||
<PanelItem
|
<PanelItem
|
||||||
type={'normal'}
|
|
||||||
name={subItem().label}
|
|
||||||
chip={subItem().sublabel}
|
chip={subItem().sublabel}
|
||||||
toolTip={subItem().toolTip}
|
|
||||||
commandId={subItem().commandId}
|
commandId={subItem().commandId}
|
||||||
|
name={subItem().label}
|
||||||
onClick={() => props.onClick?.(subItem().commandId)}
|
onClick={() => props.onClick?.(subItem().commandId)}
|
||||||
|
toolTip={subItem().toolTip}
|
||||||
|
type={'normal'}
|
||||||
/>
|
/>
|
||||||
</Match>
|
</Match>
|
||||||
<Match when={subItem().type === 'submenu'}>
|
<Match when={subItem().type === 'submenu'}>
|
||||||
<PanelItem
|
<PanelItem
|
||||||
type={'submenu'}
|
|
||||||
name={subItem().label}
|
|
||||||
chip={subItem().sublabel}
|
chip={subItem().sublabel}
|
||||||
toolTip={subItem().toolTip}
|
|
||||||
level={[...(props.level ?? []), subItem().commandId]}
|
|
||||||
commandId={subItem().commandId}
|
commandId={subItem().commandId}
|
||||||
|
level={[...(props.level ?? []), subItem().commandId]}
|
||||||
|
name={subItem().label}
|
||||||
|
toolTip={subItem().toolTip}
|
||||||
|
type={'submenu'}
|
||||||
>
|
>
|
||||||
<PanelRenderer
|
<PanelRenderer
|
||||||
items={subItem().submenu?.items ?? []}
|
items={subItem().submenu?.items ?? []}
|
||||||
@ -146,26 +146,26 @@ const PanelRenderer = (props: PanelRendererProps) => {
|
|||||||
</Match>
|
</Match>
|
||||||
<Match when={subItem().type === 'checkbox'}>
|
<Match when={subItem().type === 'checkbox'}>
|
||||||
<PanelItem
|
<PanelItem
|
||||||
type={'checkbox'}
|
|
||||||
name={subItem().label}
|
|
||||||
checked={subItem().checked}
|
checked={subItem().checked}
|
||||||
chip={subItem().sublabel}
|
chip={subItem().sublabel}
|
||||||
toolTip={subItem().toolTip}
|
|
||||||
commandId={subItem().commandId}
|
commandId={subItem().commandId}
|
||||||
|
name={subItem().label}
|
||||||
onChange={() => props.onClick?.(subItem().commandId)}
|
onChange={() => props.onClick?.(subItem().commandId)}
|
||||||
|
toolTip={subItem().toolTip}
|
||||||
|
type={'checkbox'}
|
||||||
/>
|
/>
|
||||||
</Match>
|
</Match>
|
||||||
<Match when={subItem().type === 'radio'}>
|
<Match when={subItem().type === 'radio'}>
|
||||||
<PanelItem
|
<PanelItem
|
||||||
type={'radio'}
|
|
||||||
name={subItem().label}
|
|
||||||
checked={subItem().checked}
|
checked={subItem().checked}
|
||||||
chip={subItem().sublabel}
|
chip={subItem().sublabel}
|
||||||
toolTip={subItem().toolTip}
|
|
||||||
commandId={subItem().commandId}
|
commandId={subItem().commandId}
|
||||||
|
name={subItem().label}
|
||||||
onChange={() =>
|
onChange={() =>
|
||||||
props.onClick?.(subItem().commandId, radioGroup())
|
props.onClick?.(subItem().commandId, radioGroup())
|
||||||
}
|
}
|
||||||
|
toolTip={subItem().toolTip}
|
||||||
|
type={'radio'}
|
||||||
/>
|
/>
|
||||||
</Match>
|
</Match>
|
||||||
<Match when={subItem().type === 'separator'}>
|
<Match when={subItem().type === 'separator'}>
|
||||||
@ -325,10 +325,11 @@ export const TitleBar = (props: TitleBarProps) => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<nav
|
<nav
|
||||||
data-ytmd-main-panel={true}
|
|
||||||
class={titleStyle()}
|
class={titleStyle()}
|
||||||
data-macos={props.isMacOS}
|
data-macos={props.isMacOS}
|
||||||
data-show={mouseY() < 32}
|
data-show={mouseY() < 32}
|
||||||
|
data-ytmd-main-panel={true}
|
||||||
|
id={'ytmd-title-bar-main-panel'}
|
||||||
>
|
>
|
||||||
<IconButton
|
<IconButton
|
||||||
onClick={() => setCollapsed(!collapsed())}
|
onClick={() => setCollapsed(!collapsed())}
|
||||||
@ -336,7 +337,7 @@ export const TitleBar = (props: TitleBarProps) => {
|
|||||||
'border-top-left-radius': '4px',
|
'border-top-left-radius': '4px',
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<svg width={16} height={16} viewBox={'0 0 24 24'}>
|
<svg height={16} viewBox={'0 0 24 24'} width={16}>
|
||||||
<path
|
<path
|
||||||
d="M3 17h12a1 1 0 0 1 .117 1.993L15 19H3a1 1 0 0 1-.117-1.993L3 17h12H3Zm0-6h18a1 1 0 0 1 .117 1.993L21 13H3a1 1 0 0 1-.117-1.993L3 11h18H3Zm0-6h15a1 1 0 0 1 .117 1.993L18 7H3a1 1 0 0 1-.117-1.993L3 5h15H3Z"
|
d="M3 17h12a1 1 0 0 1 .117 1.993L15 19H3a1 1 0 0 1-.117-1.993L3 17h12H3Zm0-6h18a1 1 0 0 1 .117 1.993L21 13H3a1 1 0 0 1-.117-1.993L3 11h18H3Zm0-6h15a1 1 0 0 1 .117 1.993L18 7H3a1 1 0 0 1-.117-1.993L3 5h15H3Z"
|
||||||
fill="currentColor"
|
fill="currentColor"
|
||||||
@ -344,26 +345,29 @@ export const TitleBar = (props: TitleBarProps) => {
|
|||||||
</svg>
|
</svg>
|
||||||
</IconButton>
|
</IconButton>
|
||||||
<TransitionGroup
|
<TransitionGroup
|
||||||
enterClass={
|
|
||||||
ignoreTransition()
|
|
||||||
? animationStyle().fakeTarget
|
|
||||||
: animationStyle().enter
|
|
||||||
}
|
|
||||||
enterActiveClass={
|
enterActiveClass={
|
||||||
ignoreTransition()
|
ignoreTransition()
|
||||||
? animationStyle().fake
|
? animationStyle().fake
|
||||||
: animationStyle().enterActive
|
: animationStyle().enterActive
|
||||||
}
|
}
|
||||||
exitToClass={
|
enterClass={
|
||||||
ignoreTransition()
|
ignoreTransition()
|
||||||
? animationStyle().fakeTarget
|
? animationStyle().fakeTarget
|
||||||
: animationStyle().exitTo
|
: animationStyle().enter
|
||||||
}
|
}
|
||||||
exitActiveClass={
|
exitActiveClass={
|
||||||
ignoreTransition()
|
ignoreTransition()
|
||||||
? animationStyle().fake
|
? animationStyle().fake
|
||||||
: animationStyle().exitActive
|
: animationStyle().exitActive
|
||||||
}
|
}
|
||||||
|
exitToClass={
|
||||||
|
ignoreTransition()
|
||||||
|
? animationStyle().fakeTarget
|
||||||
|
: animationStyle().exitTo
|
||||||
|
}
|
||||||
|
onAfterEnter={(element) => {
|
||||||
|
(element as HTMLElement).style.removeProperty('transition-delay');
|
||||||
|
}}
|
||||||
onBeforeEnter={(element) => {
|
onBeforeEnter={(element) => {
|
||||||
if (ignoreTransition()) return;
|
if (ignoreTransition()) return;
|
||||||
const index = Number(element.getAttribute('data-index') ?? 0);
|
const index = Number(element.getAttribute('data-index') ?? 0);
|
||||||
@ -373,9 +377,6 @@ export const TitleBar = (props: TitleBarProps) => {
|
|||||||
`${index * 0.025}s`,
|
`${index * 0.025}s`,
|
||||||
);
|
);
|
||||||
}}
|
}}
|
||||||
onAfterEnter={(element) => {
|
|
||||||
(element as HTMLElement).style.removeProperty('transition-delay');
|
|
||||||
}}
|
|
||||||
onBeforeExit={(element) => {
|
onBeforeExit={(element) => {
|
||||||
if (ignoreTransition()) return;
|
if (ignoreTransition()) return;
|
||||||
const index = Number(element.getAttribute('data-index') ?? 0);
|
const index = Number(element.getAttribute('data-index') ?? 0);
|
||||||
@ -405,18 +406,18 @@ export const TitleBar = (props: TitleBarProps) => {
|
|||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<MenuButton
|
<MenuButton
|
||||||
ref={setAnchor}
|
|
||||||
text={item().label}
|
|
||||||
onClick={handleClick}
|
|
||||||
selected={openTarget() === anchor()}
|
|
||||||
data-index={index}
|
data-index={index}
|
||||||
data-length={data()?.items.length}
|
data-length={data()?.items.length}
|
||||||
|
onClick={handleClick}
|
||||||
|
ref={setAnchor}
|
||||||
|
selected={openTarget() === anchor()}
|
||||||
|
text={item().label}
|
||||||
/>
|
/>
|
||||||
<Panel
|
<Panel
|
||||||
open={openTarget() === anchor()}
|
|
||||||
anchor={anchor()}
|
anchor={anchor()}
|
||||||
placement={'bottom-start'}
|
|
||||||
offset={{ mainAxis: 8 }}
|
offset={{ mainAxis: 8 }}
|
||||||
|
open={openTarget() === anchor()}
|
||||||
|
placement={'bottom-start'}
|
||||||
>
|
>
|
||||||
<PanelRenderer
|
<PanelRenderer
|
||||||
items={item().submenu?.items ?? []}
|
items={item().submenu?.items ?? []}
|
||||||
@ -433,9 +434,9 @@ export const TitleBar = (props: TitleBarProps) => {
|
|||||||
<div style={{ flex: 1 }} />
|
<div style={{ flex: 1 }} />
|
||||||
<WindowController
|
<WindowController
|
||||||
isMaximize={isMaximized()}
|
isMaximize={isMaximized()}
|
||||||
onToggleMaximize={handleToggleMaximize}
|
|
||||||
onMinimize={handleMinimize}
|
|
||||||
onClose={handleClose}
|
onClose={handleClose}
|
||||||
|
onMinimize={handleMinimize}
|
||||||
|
onToggleMaximize={handleToggleMaximize}
|
||||||
/>
|
/>
|
||||||
</Show>
|
</Show>
|
||||||
</nav>
|
</nav>
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user