mirror of
https://github.com/th-ch/youtube-music.git
synced 2026-01-10 10:11:46 +00:00
Compare commits
375 Commits
v3.9.0
...
78cd3a786c
| Author | SHA1 | Date | |
|---|---|---|---|
| 78cd3a786c | |||
| adb88991d9 | |||
| 4dad68d255 | |||
| 33a09cc8e1 | |||
| e2c849f6c4 | |||
| 7b41775b26 | |||
| 6284b87fc7 | |||
| f3f63d4fcd | |||
| cf80dd396c | |||
| c79fc799b2 | |||
| 7789d5d444 | |||
| e0dbd4b88f | |||
| 1c74bbd954 | |||
| d949e3550f | |||
| d76115ab5d | |||
| 5be467a869 | |||
| b2dfbe1ed3 | |||
| a9e9e0bdc2 | |||
| 93ce9cc359 | |||
| 2a626a5ff1 | |||
| 1ccabb8e25 | |||
| 2dae8688c2 | |||
| 65459726a4 | |||
| 0c21accb10 | |||
| 125d2d5163 | |||
| 6c1855b5a5 | |||
| 82c5222610 | |||
| 0d0e2a11e1 | |||
| daf724f9dc | |||
| be2cdb4cb5 | |||
| ff2fdab77d | |||
| 9047169a39 | |||
| 9525df343f | |||
| be2abee85d | |||
| 7d5f7a9527 | |||
| b53ece5836 | |||
| c04dc92d39 | |||
| 78acd2ddbb | |||
| 7126c290e2 | |||
| 58651857e2 | |||
| 8e7c95e68f | |||
| 1c68c5637d | |||
| c44d5ea111 | |||
| b48e05ab28 | |||
| 7e5a5a77fe | |||
| 77c4566ad3 | |||
| 6305f52947 | |||
| b8baf0fad4 | |||
| 038244bf43 | |||
| ef22b48aae | |||
| 62b3abd502 | |||
| e1f8ece433 | |||
| dd9ed5e5e6 | |||
| 3f442a97c5 | |||
| 61e19cfa9f | |||
| f73188ab83 | |||
| 4c4a39b9a7 | |||
| 1da83ff27c | |||
| 2cfc38757a | |||
| b5f82f5ed8 | |||
| d13484a47b | |||
| 4d33921881 | |||
| 6fdac6facf | |||
| 51a87566e5 | |||
| f715dcd9b4 | |||
| 275f78a180 | |||
| bc8d199c77 | |||
| e114e0ef44 | |||
| 9ccd126eee | |||
| e3c79c789c | |||
| c9ab69eb9e | |||
| d444f52c27 | |||
| cd51d2c8df | |||
| 84c592f45f | |||
| 83f7ebc087 | |||
| 35a7ab288d | |||
| c1c4c22ec2 | |||
| 5eb0c9f98c | |||
| 733b0166c8 | |||
| c5f7c80542 | |||
| c840e31a80 | |||
| 22181afe73 | |||
| f698614b21 | |||
| adeffdabad | |||
| acdffea563 | |||
| cf1806dc10 | |||
| ff69803fdc | |||
| f7140d78bd | |||
| e4d8365170 | |||
| c64d69f33b | |||
| 16a3fa7469 | |||
| 1e867d10f2 | |||
| 3466b1a863 | |||
| a5cc2f555a | |||
| 9445379280 | |||
| 68c79ded99 | |||
| 9e59a8c1d5 | |||
| cc20cb5620 | |||
| be69d85d27 | |||
| f851c2de20 | |||
| 2319821851 | |||
| 5ba0fee18a | |||
| 8ac7c4ea9d | |||
| 3649ad092a | |||
| 4adaa27beb | |||
| e6ab13a42b | |||
| fb16badcb3 | |||
| fc0da887e1 | |||
| f65add2e28 | |||
| c3b7ee54de | |||
| 245974da42 | |||
| 4e756f7117 | |||
| bed4f1bfe9 | |||
| 0e79d9d5cc | |||
| 136f9f429f | |||
| 97d8cb5ad1 | |||
| b21862f2be | |||
| bedfd20f7e | |||
| 46a95a4f97 | |||
| 80f1d10309 | |||
| 9f38f1fb26 | |||
| 0061318f4c | |||
| 6ba36fcba5 | |||
| 63c8f4d0e1 | |||
| bef304865c | |||
| fec4702ee0 | |||
| ab07b71888 | |||
| 0253bfe193 | |||
| 3e9429879d | |||
| c1ac07d287 | |||
| fa0f68e308 | |||
| 38b2bb64fc | |||
| be92e6c6f7 | |||
| eabbfe94bc | |||
| bcbc691435 | |||
| 90c832733d | |||
| e3b76115aa | |||
| 8fc9692ae4 | |||
| 40ab32cbe7 | |||
| f047dd2d2d | |||
| 1877460094 | |||
| eae4e952f5 | |||
| 89479a5045 | |||
| a702a3284c | |||
| 47674e9a5a | |||
| 93deee665b | |||
| 95385cb9de | |||
| 35f9ac0f9a | |||
| 42b8f57216 | |||
| 56cb3b6cc8 | |||
| 01e137f5d4 | |||
| 0bbc1b4546 | |||
| 40429034b6 | |||
| 49cb29c2fe | |||
| 432427ec5a | |||
| ce0568cc52 | |||
| d6ed6bdc2b | |||
| 65b6417777 | |||
| 7b2c537290 | |||
| cbb7709159 | |||
| 232ca99243 | |||
| 47990c7b95 | |||
| 21a95709a2 | |||
| d43803c14c | |||
| 5fe10a9660 | |||
| fa9e031bbb | |||
| a592520e2a | |||
| f7f82f20f1 | |||
| e8214fa6ee | |||
| 1f0978d5ad | |||
| 2b0295d95c | |||
| 355d9870a1 | |||
| 4eb2d63a82 | |||
| 315fa15eec | |||
| 6037491f98 | |||
| 9e3d84e78e | |||
| de7f7abc91 | |||
| ad0d1ec37d | |||
| 2acd51cec3 | |||
| 96a1df3d0a | |||
| 576cd14ca0 | |||
| baeef8e2c3 | |||
| 1823740dd8 | |||
| ce73d6c075 | |||
| 1e1b469dba | |||
| da6c3b907c | |||
| be90fecbad | |||
| cce5419985 | |||
| fb2bbdc381 | |||
| dbd4113314 | |||
| 49e915d2e1 | |||
| 96cd219a0f | |||
| 7390119143 | |||
| d8a84a3500 | |||
| 34601dd6af | |||
| ee28471146 | |||
| e80bc304c5 | |||
| 2593092f04 | |||
| fc52af96b2 | |||
| c31eaefdee | |||
| 83212294c9 | |||
| fbe1729ac3 | |||
| 419e51a814 | |||
| 170b3132ad | |||
| 5ef2dc5a9a | |||
| 43d6950ee3 | |||
| 6070300c22 | |||
| ef1504ab30 | |||
| c52d8d93b3 | |||
| f6ddfc3807 | |||
| 5035c6a8d8 | |||
| 58ca9523c5 | |||
| 5b2e9c0de9 | |||
| 4a3ca1af75 | |||
| 7beac0b6ad | |||
| af05ff6582 | |||
| 77703e0268 | |||
| dadca8b1c4 | |||
| 87db1dd461 | |||
| 2799f81906 | |||
| bfe96b004f | |||
| 51f7d10113 | |||
| 60ca5ec17e | |||
| 8d1082da4e | |||
| 1858b0712b | |||
| d5b3fbbdb2 | |||
| 346ce00144 | |||
| f9d5e67f3f | |||
| 73dd56416e | |||
| ca97e624cd | |||
| b639fb1073 | |||
| 8488dfd8f4 | |||
| 7eed86608c | |||
| 67dfc618d1 | |||
| 38394193f5 | |||
| c9ca1b8be6 | |||
| 8ce25613ae | |||
| 145cf8563b | |||
| c9b0577ed4 | |||
| 8a5c3a670a | |||
| 17259d68d0 | |||
| aa77ab0779 | |||
| 481fff56f5 | |||
| 0da013a962 | |||
| eeb051dd29 | |||
| 708c96a8e9 | |||
| 4f7e2f29c1 | |||
| b754e16fb6 | |||
| f53d3abef8 | |||
| c9e48782aa | |||
| a49d711c67 | |||
| 878ab6307e | |||
| ad17e9a557 | |||
| bc9ca62cbe | |||
| 4329ac6bf3 | |||
| a49733877f | |||
| a3ca565faf | |||
| a51670c1c8 | |||
| a9b4b42a74 | |||
| f6b51d92a4 | |||
| c4efbcbbeb | |||
| 3de06655df | |||
| 2c649c50f6 | |||
| bccefb9380 | |||
| 6c5009d520 | |||
| a45b8f88cb | |||
| 3a82129d37 | |||
| 16fe257073 | |||
| 39d6b6d30b | |||
| 2dbaecff6e | |||
| 77c9d44823 | |||
| aaea3ba768 | |||
| 2cb44054df | |||
| 3effb58282 | |||
| 1d9573e15d | |||
| f8df3e6548 | |||
| d76ebde673 | |||
| 2e4a15442a | |||
| 716566593e | |||
| 9c0d1788b0 | |||
| 51b3f53569 | |||
| 88111185a3 | |||
| ac0a46cff6 | |||
| 529c798e49 | |||
| 611afd7403 | |||
| 6ac1fec5ab | |||
| 22cfefb5f9 | |||
| e1962810e9 | |||
| cd740880c8 | |||
| 382caaabb0 | |||
| 9f5236439c | |||
| bb69f31f3a | |||
| afe5fed760 | |||
| 981a7f319e | |||
| 42cb9b0ea8 | |||
| d9ead78083 | |||
| 329ea64989 | |||
| 8c1673c6a8 | |||
| dedca8fdd1 | |||
| 02bf057fbc | |||
| 98be48bb13 | |||
| 3200d088cf | |||
| edea7b59e1 | |||
| d10c6ec8fc | |||
| 91a2eb9063 | |||
| dfa427f2ed | |||
| 6d3ac985b2 | |||
| d874fcd117 | |||
| 5158b9cd04 | |||
| efc8038210 | |||
| 8f18fb80ea | |||
| a257d4dfbc | |||
| e2f1d1d611 | |||
| d4c00b6d74 | |||
| 823fbf4a78 | |||
| 806dc11d4a | |||
| d8dcbddbf1 | |||
| 1219de1ae9 | |||
| 1e764f7707 | |||
| 809947716d | |||
| d88406447e | |||
| dbfe9d517a | |||
| 703ad71ff3 | |||
| 3b4f319871 | |||
| 852933d4d7 | |||
| b9269bf085 | |||
| 3b8edf115e | |||
| 97a277a192 | |||
| 41ce2320fa | |||
| 1350ca0816 | |||
| 5e29628351 | |||
| 006aacfb35 | |||
| e5cef89a27 | |||
| e91d44d018 | |||
| f35328fab4 | |||
| d84c308572 | |||
| 733866efea | |||
| 079e625c69 | |||
| 64f87d4fec | |||
| da5c18dcf1 | |||
| f67ff2ee11 | |||
| 0c1d300103 | |||
| e0abc4a43b | |||
| de273da85f | |||
| b52caa5f17 | |||
| fec7d3b1c4 | |||
| 63f7254b60 | |||
| 03501790fb | |||
| 7570dad1b5 | |||
| 2f8b889849 | |||
| 5eb2457c36 | |||
| 52c6e09917 | |||
| 8bfc93b948 | |||
| 5b09123feb | |||
| 2334e4d800 | |||
| 6bf812f9bf | |||
| b0cd8332fc | |||
| 73f7164584 | |||
| 2117bc830c | |||
| cd5e7ef646 | |||
| 0eecd4b6a5 | |||
| 407f01aa19 | |||
| 0d3fb0400f | |||
| 6d46024f42 | |||
| c8812d8ab6 | |||
| 2819740429 | |||
| e1b20baf4d | |||
| 25d02154ed | |||
| 8f59b78059 | |||
| 46c32b18a0 | |||
| 3eb6ba2499 | |||
| 9208547881 | |||
| 8bfcd4a139 | |||
| 00041fd146 | |||
| 98feeed7eb |
4
.github/workflows/build.yml
vendored
4
.github/workflows/build.yml
vendored
@ -6,7 +6,7 @@ on:
|
||||
pull_request:
|
||||
|
||||
env:
|
||||
NODE_VERSION: "20.x"
|
||||
NODE_VERSION: "22.x"
|
||||
|
||||
jobs:
|
||||
build:
|
||||
@ -162,7 +162,7 @@ jobs:
|
||||
|
||||
- name: Commit changelog
|
||||
if: ${{ env.VERSION_HASH == '' }}
|
||||
uses: stefanzweifel/git-auto-commit-action@v5
|
||||
uses: stefanzweifel/git-auto-commit-action@v6
|
||||
with:
|
||||
commit_message: Update changelog for ${{ env.VERSION_TAG }}
|
||||
file_pattern: "changelog.md"
|
||||
|
||||
3
.gitignore
vendored
3
.gitignore
vendored
@ -1,7 +1,6 @@
|
||||
node_modules
|
||||
/dist
|
||||
/pack
|
||||
electron-builder.yml
|
||||
.vscode/settings.json
|
||||
.idea
|
||||
|
||||
@ -13,3 +12,5 @@ electron-builder.yml
|
||||
!.yarn/sdks
|
||||
!.yarn/versions
|
||||
.vite-inspect
|
||||
|
||||
.DS_Store
|
||||
|
||||
@ -1,5 +1,7 @@
|
||||
{
|
||||
"tabWidth": 2,
|
||||
"useTabs": false,
|
||||
"singleQuote": true
|
||||
"singleQuote": true,
|
||||
"trailingComma": "all",
|
||||
"quoteProps": "consistent"
|
||||
}
|
||||
|
||||
@ -21,7 +21,7 @@
|
||||
</a>
|
||||
</div>
|
||||
|
||||
Read this in other languages: [🇰🇷](./docs/readme/README-ko.md), [🇫🇷](./docs/readme/README-fr.md), [🇮🇸](./docs/readme/README-is.md), [🇨🇱 🇪🇸](./docs/readme/README-es.md), [🇷🇺](./docs/readme/README-ru.md), [🇭🇺](./docs/readme/README-hu.md), [🇧🇷](./docs/readme/README-pt.md), [🇯🇵](./docs/readme/README-ja.md)
|
||||
Read this in other languages: [한국어](./docs/readme/README-ko.md), [Française](./docs/readme/README-fr.md), [Íslenska](./docs/readme/README-is.md), [Español](./docs/readme/README-es.md), [Pусский](./docs/readme/README-ru.md), [Українська](./docs/readme/README-uk.md), [Magyar](./docs/readme/README-hu.md), [Português](./docs/readme/README-pt.md), [日本語](./docs/readme/README-ja.md)
|
||||
|
||||
**Electron wrapper around YouTube Music featuring:**
|
||||
|
||||
@ -153,6 +153,8 @@ Read this in other languages: [🇰🇷](./docs/readme/README-ko.md), [🇫🇷]
|
||||
- **Tuna OBS**: Integration with [OBS](https://obsproject.com/)'s
|
||||
plugin [Tuna](https://obsproject.com/forum/resources/tuna.843/)
|
||||
|
||||
- **Unobtrusive Player**: Prevents the player from popping up when playing a song
|
||||
|
||||
- **Video Quality Changer**: Allows changing the video quality with
|
||||
a [button](https://user-images.githubusercontent.com/78568641/138574366-70324a5e-2d64-4f6a-acdd-dc2a2b9cecc5.png) on
|
||||
the video overlay
|
||||
|
||||
184
changelog.md
184
changelog.md
@ -2,8 +2,192 @@
|
||||
|
||||
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)
|
||||
|
||||
> 27 April 2025
|
||||
|
||||
- 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(synced-lyrics): fix #3157 [`#3157`](https://github.com/th-ch/youtube-music/issues/3157)
|
||||
- feat(performance-improvement): added "performance improvement" plugin [`1c76415`](https://github.com/th-ch/youtube-music/commit/1c764158461da414cea8bf34c3b514f1f98d7adf)
|
||||
- chore(i18n): Translated using Weblate (Bosnian) [`a3d620b`](https://github.com/th-ch/youtube-music/commit/a3d620ba52b7fa8ae623b9d42b0652a22eaf65e7)
|
||||
- Update changelog for v3.8.1 [`58cf1a5`](https://github.com/th-ch/youtube-music/commit/58cf1a543d98419c1a944e57407c0ea53b8168d8)
|
||||
|
||||
#### [v3.8.1](https://github.com/th-ch/youtube-music/compare/v3.8.0...v3.8.1)
|
||||
|
||||
> 25 April 2025
|
||||
|
||||
- chore(deps): update dependency glob to v11.0.2 [`#3283`](https://github.com/th-ch/youtube-music/pull/3283)
|
||||
- fix(deps): update dependency i18next to v25.0.1 [`#3284`](https://github.com/th-ch/youtube-music/pull/3284)
|
||||
- chore(deps): update dependency typescript-eslint to v8.31.0 [`#3286`](https://github.com/th-ch/youtube-music/pull/3286)
|
||||
|
||||
@ -21,7 +21,7 @@
|
||||
</a>
|
||||
</div>
|
||||
|
||||
Lee esto en otros idiomas: [🏴 Inglés](../../README.md), [🇰🇷 Coreano](./README-ko.md), [🇫🇷 Francés](./README-fr.md), [🇮🇸 Islandés](./README-is.md), [🇪🇸 Español](./README-es.md), [🇷🇺 Ruso](./README-ru.md), [🇧🇷 Portugués](./README-pt.md), [🇯🇵 Japonés](./README-ja.md)
|
||||
Lee esto en otros idiomas: [🏴 Inglés](../../README.md), [🇰🇷 Coreano](./README-ko.md), [🇫🇷 Francés](./README-fr.md), [🇮🇸 Islandés](./README-is.md), [🇪🇸 Español](./README-es.md), [🇷🇺 Ruso](./README-ru.md), [🇺🇦 Ucraniano](./README-uk.md), [🇧🇷 Portugués](./README-pt.md), [🇯🇵 Japonés](./README-ja.md)
|
||||
|
||||
**Electron wrapper de YouTube Music con las siguientes características:**
|
||||
|
||||
@ -132,7 +132,7 @@ Lee esto en otros idiomas: [🏴 Inglés](../../README.md), [🇰🇷 Coreano](.
|
||||
teclas multimedia + [atajos personalizados](https://github.com/Araxeus/youtube-music/blob/1e591d6a3df98449bcda6e63baab249b28026148/providers/song-controls.js#L13-L50)
|
||||
para [usuarios avanzados](https://github.com/th-ch/youtube-music/issues/106#issuecomment-952156902)
|
||||
|
||||
- **Saltar Canción no Gustada**: Salta las canciones que no te gustan
|
||||
- **Omitir Canciones No Deseadas**: Salta las canciones que no te gustan
|
||||
|
||||
- **Saltar Silencios**: Salta automáticamente las secciones de silencio
|
||||
|
||||
|
||||
@ -21,7 +21,7 @@
|
||||
</a>
|
||||
</div>
|
||||
|
||||
Lisez ceci dans d'autres langues: [🏴 Anglais](../../README.md), [🇰🇷 Coréen](./README-ko.md), [🇫🇷 Français](./README-fr.md), [🇮🇸 Islandais](./README-is.md), [🇪🇸 Espagnol](./README-es.md), [🇷🇺 Russe](./README-ru.md), [🇧🇷 Portugais](./README-pt.md), [🇯🇵 Japonais](./README-ja.md)
|
||||
Lisez ceci dans d'autres langues: [🏴 Anglais](../../README.md), [🇰🇷 Coréen](./README-ko.md), [🇫🇷 Français](./README-fr.md), [🇮🇸 Islandais](./README-is.md), [🇪🇸 Espagnol](./README-es.md), [🇷🇺 Russe](./README-ru.md), [🇺🇦 Ukrainien](./README-uk.md), [🇧🇷 Portugais](./README-pt.md), [🇯🇵 Japonais](./README-ja.md)
|
||||
|
||||
**Enveloppe Electron autour de YouTube Music offrant :**
|
||||
|
||||
|
||||
@ -21,7 +21,7 @@
|
||||
</a>
|
||||
</div>
|
||||
|
||||
Olvasd el más nyelveken: [🏴 Angol](../../README.md), [🇰🇷 Korea](./README-ko.md), [🇫🇷 Francia](./README-fr.md), [🇮🇸 Izland](./README-is.md), [🇪🇸 Spanyol](./README-es.md), [🇷🇺 Orosz](./README-ru.md), [🇧🇷 Portugál](./README-pt.md), [🇯🇵 Japán](./README-ja.md)
|
||||
Olvasd el más nyelveken: [🏴 Angol](../../README.md), [🇰🇷 Korea](./README-ko.md), [🇫🇷 Francia](./README-fr.md), [🇮🇸 Izland](./README-is.md), [🇪🇸 Spanyol](./README-es.md), [🇷🇺 Orosz](./README-ru.md), [🇺🇦 Ukrán](./README-uk.md), [🇧🇷 Portugál](./README-pt.md), [🇯🇵 Japán](./README-ja.md)
|
||||
|
||||
**Electron keretrendszerre épülő alkalmazás a YouTube Music számára, amely a következőket kínálja:**
|
||||
|
||||
|
||||
@ -21,7 +21,7 @@
|
||||
</a>
|
||||
</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), [🇧🇷 Portúgalska](./README-pt.md), [🇯🇵 Japanska](./README-ja.md)
|
||||
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)
|
||||
|
||||
**Electron umbúðir utan um YouTube Tónlist sem inniheldur:**
|
||||
|
||||
|
||||
@ -21,7 +21,7 @@
|
||||
</a>
|
||||
</div>
|
||||
|
||||
他の言語で読む: [🏴 英語](../../README.md), [🇰🇷 韓国語](./README-ko.md), [🇫🇷 フランス語](./README-fr.md), [🇮🇸 アイスランド語](./README-is.md), [🇪🇸 スペイン語](./README-es.md), [🇷🇺 ロシア語](./README-ru.md)
|
||||
他の言語で読む: [🏴 英語](../../README.md), [🇰🇷 韓国語](./README-ko.md), [🇫🇷 フランス語](./README-fr.md), [🇮🇸 アイスランド語](./README-is.md), [🇪🇸 スペイン語](./README-es.md), [🇷🇺 ロシア語](./README-ru.md), [🇺🇦 ウクライナ語](./README-uk.md)
|
||||
|
||||
**YouTube MusicのElectronラッパーには以下の機能があります:**
|
||||
|
||||
|
||||
@ -20,7 +20,7 @@
|
||||
</a>
|
||||
</div>
|
||||
|
||||
다른 언어로 읽어보세요: [🏴 영어](../../README.md), [🇰🇷 한국인](./README-ko.md), [🇫🇷 프랑스 국민](./README-fr.md), [🇮🇸 아이슬란드어](./README-is.md), [🇪🇸 스페인 사람](./README-es.md), [🇷🇺 러시아인](./README-ru.md), [🇧🇷 포르투갈어](./README-pt.md), [🇯🇵 일본어](./README-ja.md)
|
||||
다른 언어로 읽어보세요: [🏴 영어](../../README.md), [🇰🇷 한국인](./README-ko.md), [🇫🇷 프랑스 국민](./README-fr.md), [🇮🇸 아이슬란드어](./README-is.md), [🇪🇸 스페인 사람](./README-es.md), [🇷🇺 러시아인](./README-ru.md), [🇺🇦 우크라이나어](./README-uk.md), [🇧🇷 포르투갈어](./README-pt.md), [🇯🇵 일본어](./README-ja.md)
|
||||
|
||||
**유튜브 뮤직의 Electron 래퍼; 기능:**
|
||||
|
||||
|
||||
@ -21,7 +21,7 @@
|
||||
</a>
|
||||
</div>
|
||||
|
||||
Leia em outros idiomas: [🏴 Inglês](../../README.md), [🇰🇷 Coreano](./README-ko.md), [🇫🇷 Francês](./README-fr.md), [🇮🇸 Islandês](./README-is.md), [🇪🇸 Espanhol](./README-es.md), [🇷🇺 Russo](./README-ru.md), [🇧🇷 Português](./README-pt.md)
|
||||
Leia em outros idiomas: [🏴 Inglês](../../README.md), [🇰🇷 Coreano](./README-ko.md), [🇫🇷 Francês](./README-fr.md), [🇮🇸 Islandês](./README-is.md), [🇪🇸 Espanhol](./README-es.md), [🇷🇺 Russo](./README-ru.md), [🇺🇦 Ucraniano](./README-uk.md), [🇧🇷 Português](./README-pt.md)
|
||||
|
||||
**Wrapper do Electron para o YouTube Music com os seguintes recursos:**
|
||||
|
||||
|
||||
@ -21,7 +21,7 @@
|
||||
</a>
|
||||
</div>
|
||||
|
||||
Прочтите это на других языках: [🏴 Английский](../../README.md), [🇰🇷 корейский](./README-ko.md), [🇫🇷 Французский](./README-fr.md), [🇮🇸 исландский](./README-is.md), [🇪🇸 испанский](./README-es.md), [🇷🇺 Русский](./README-ru.md), [🇧🇷 Португальский](./README-pt.md)
|
||||
Прочтите это на других языках: [🏴 Английский](../../README.md), [🇰🇷 корейский](./README-ko.md), [🇫🇷 Французский](./README-fr.md), [🇮🇸 исландский](./README-is.md), [🇪🇸 испанский](./README-es.md), [🇷🇺 Русский](./README-ru.md), [🇺🇦 Украинский](./README-uk.md), [🇧🇷 Португальский](./README-pt.md)
|
||||
|
||||
**Клиент для YouTube Music основанный на Electron с поддержкой:**
|
||||
|
||||
|
||||
372
docs/readme/README-uk.md
Normal file
372
docs/readme/README-uk.md
Normal file
@ -0,0 +1,372 @@
|
||||
<div align="center">
|
||||
|
||||
# YouTube Music
|
||||
|
||||
[](https://github.com/th-ch/youtube-music/releases/)
|
||||
[](https://github.com/th-ch/youtube-music/blob/master/license)
|
||||
[](https://github.com/th-ch/youtube-music/blob/master/eslint.config.mjs)
|
||||
[](https://GitHub.com/th-ch/youtube-music/releases/)
|
||||
[](https://GitHub.com/th-ch/youtube-music/releases/)
|
||||
[](https://aur.archlinux.org/packages/youtube-music-bin)
|
||||
[](https://snyk.io/test/github/th-ch/youtube-music)
|
||||
|
||||
</div>
|
||||
|
||||

|
||||
|
||||
|
||||
<div align="center">
|
||||
<a href="https://github.com/th-ch/youtube-music/releases/latest">
|
||||
<img src="../../web/youtube-music.svg" width="400" height="100" alt="YouTube Music SVG">
|
||||
</a>
|
||||
</div>
|
||||
|
||||
Прочитайте це іншими мовами: [🏴 Англійська](../../README.md), [🇰🇷 Корейська](./README-ko.md), [🇫🇷 Французька](./README-fr.md), [🇮🇸 Ісландська](./README-is.md), [🇪🇸 Іспанська](./README-es.md), [🇷🇺 Російська](./README-ru.md), [🇺🇦 Українська](./README-uk.md), [🇭🇺 Угорська](./README-hu.md), [🇧🇷 Португальська](./README-pt.md), [🇯🇵 Японська](./README-ja.md)
|
||||
|
||||
**Клієнт YouTube Music на основі Electron, що має:**
|
||||
|
||||
- Нативний вигляд і функціонал, що має на меті зберегти оригінальний інтерфейс
|
||||
- Фреймворк для користувацьких плагінів: змінюйте YouTube Music відповідно до ваших потреб (стиль, вміст, функції), вмикайте/вимикайте плагіни одним клацанням миші
|
||||
|
||||
## Демонстраційне зображення
|
||||
|
||||
| Екран плеєра (колірна тема альбому та режим Ambient) |
|
||||
|:---------------------------------------------------------------------------------------------------------:|
|
||||
||
|
||||
|
||||
## Зміст
|
||||
|
||||
- [Можливості](#Можливості)
|
||||
- [Доступні плагіни](#Доступні-плагіни)
|
||||
- [Переклад](#Переклад)
|
||||
- [Завантажити](#Завантажити)
|
||||
- [Arch Linux](#arch-linux)
|
||||
- [MacOS](#macos)
|
||||
- [Windows](#windows)
|
||||
- [Як встановити без підключення до Інтернету? (у Windows)](#Встановлення-без-підключення-до-Інтернету-у-Windows)
|
||||
- [Теми](#Теми)
|
||||
- [Розробка](#Розробка)
|
||||
- [Створіть власні плагіни](#Створіть-власні-плагіни)
|
||||
- [Створення плагіна](#Створення-плагіна)
|
||||
- [Поширені випадки використання](#Поширені-випадки-використання)
|
||||
- [Збірка](#Збірка)
|
||||
- [Попередній перегляд для producción](#Попередній-перегляд-для-production)
|
||||
- [Тести](#Тести)
|
||||
- [Ліцензія](#Ліцензія)
|
||||
- [Поширені запитання](#Поширені-запитання)
|
||||
|
||||
## Можливості:
|
||||
|
||||
- **Автоматичне підтвердження під час паузи** (Завжди ввімкнено): вимикає спливаюче вікно ["Продовжити перегляд?"](https://user-images.githubusercontent.com/61631665/129977894-01c60740-7ec6-4bf0-9a2c-25da24491b0e.png),
|
||||
яке призупиняє музику через певний час
|
||||
|
||||
- Та багато іншого...
|
||||
|
||||
## Доступні плагіни:
|
||||
|
||||
- **Блокувальник реклами**: Блокує всю рекламу та відстеження «з коробки»
|
||||
|
||||
- **Дії з альбомом**: Додає кнопки «Скасувати "Не подобається"», «Не подобається», «Подобається» та «Скасувати "Подобається"», щоб застосувати це до всіх пісень у списку відтворення або альбомі
|
||||
|
||||
- **Колірна тема альбому**: Застосовує динамічну тему та візуальні ефекти на основі колірної палітри альбому
|
||||
|
||||
- **Режим Ambient**: Застосовує ефект освітлення, проектуючи м'які кольори з відео на фон екрана
|
||||
|
||||
- **Аудіокомпресор**: Застосовує компресію до аудіо (знижує гучність найгучніших частин сигналу та підвищує гучність найтихіших частин)
|
||||
|
||||
- **Розмиття панелі навігації**: робить панель навігації прозорою та розмитою
|
||||
|
||||
- **Обхід вікових обмежень**: обходить перевірку віку YouTube
|
||||
|
||||
- **Вибір субтитрів**: Увімкнути субтитри
|
||||
|
||||
- **Компактна бічна панель**: Завжди встановлювати бічну панель у компактному режимі
|
||||
|
||||
- **Плавний перехід**: Плавний перехід між піснями
|
||||
|
||||
- **Вимкнути автопрогравання**: Кожна пісня починається в режимі "пауза"
|
||||
|
||||
- **[Discord](https://discord.com/) Rich Presence**: Покажіть друзям, що ви слухаєте, за допомогою [Rich Presence](https://user-images.githubusercontent.com/28219076/104362104-a7a0b980-5513-11eb-9744-bb89eabe0016.png)
|
||||
|
||||
- **Завантажувач**: завантажує MP3 [безпосередньо з інтерфейсу](https://user-images.githubusercontent.com/61631665/129977677-83a7d067-c192-45e1-98ae-b5a4927393be.png) [(youtube-dl)](https://github.com/ytdl-org/youtube-dl)
|
||||
|
||||
- **Експоненціальна гучність**: Робить повзунок гучності [експоненціальним](https://greasyfork.org/en/scripts/397686-youtube-music-fix-volume-ratio/), щоб було легше вибирати нижчу гучність
|
||||
|
||||
- **Меню в програмі**: [надає панелям модного, темного вигляду](https://user-images.githubusercontent.com/78568641/112215894-923dbf00-8c29-11eb-95c3-3ce15db27eca.png)
|
||||
|
||||
> (дивіться [цей пост](https://github.com/th-ch/youtube-music/issues/410#issuecomment-952060709), якщо у вас виникли проблеми з доступом до меню після ввімкнення цього плагіна та опції приховування меню)
|
||||
|
||||
- **Скробблер**: Додає підтримку скробблінгу для [Last.fm](https://www.last.fm/) та [ListenBrainz](https://listenbrainz.org/)
|
||||
|
||||
- **Lumia Stream**: Додає підтримку [Lumia Stream](https://lumiastream.com/)
|
||||
|
||||
- **Тексти пісень Genius**: Додає підтримку текстів для більшості пісень
|
||||
|
||||
- **Музика разом**: Поділіться списком відтворення з іншими. Коли хост відтворює пісню, всі інші чутимуть ту саму пісню
|
||||
|
||||
- **Навігація**: Стрілки навігації «Вперед»/«Назад» безпосередньо інтегровані в інтерфейс, як у вашому улюбленому браузері
|
||||
|
||||
- **Без входу в Google**: Видаляє кнопки та посилання для входу в Google з інтерфейсу
|
||||
|
||||
- **Сповіщення**: Відображає сповіщення, коли починає грати пісня ([інтерактивні сповіщення](https://user-images.githubusercontent.com/78568641/114102651-63ce0e00-98d0-11eb-9dfe-c5a02bb54f9c.png) доступні у Windows)
|
||||
|
||||
- **Картинка в картинці**: дозволяє перемикати програму в режим «картинка в картинці»
|
||||
|
||||
- **Швидкість відтворення**: Слухайте швидко, слухайте повільно! [Додає повзунок, який контролює швидкість пісні](https://user-images.githubusercontent.com/61631665/129976003-e55db5ba-bf42-448c-a059-26a009775e68.png)
|
||||
|
||||
- **Точна гучність**: Точно керуйте гучністю за допомогою коліщатка миші/гарячих клавіш, з власним HUD та настроюваними кроками гучності
|
||||
|
||||
- **Гарячі клавіші (та MPRIS)**: Дозволяє встановлювати глобальні гарячі клавіші для відтворення (відтворення/пауза/наступна/попередня) + вимкнути [екранне меню медіа](https://user-images.githubusercontent.com/84923831/128601225-afa38c1f-dea8-4209-9f72-0f84c1dd8b54.png) шляхом перевизначення медіаклавіш + увімкнути Ctrl/CMD + F для пошуку + увімкнути підтримку mpris у Linux для медіаклавіш + [власні гарячі клавіші](https://github.com/Araxeus/youtube-music/blob/1e591d6a3df98449bcda6e63baab249b28026148/providers/song-controls.js#L13-L50) для [досвідчених користувачів](https://github.com/th-ch/youtube-music/issues/106#issuecomment-952156902)
|
||||
|
||||
- **Пропускати пісні, що не сподобалися**: Пропускає пісні, які вам не сподобалися
|
||||
|
||||
- **Пропускати тишу**: Автоматично пропускати тихі фрагменти
|
||||
|
||||
- [**SponsorBlock**](https://github.com/ajayyy/SponsorBlock): Автоматично пропускає немузичні частини, такі як інтро/аутро, або частини музичних відео, де пісня не грає
|
||||
|
||||
- **Керування медіа на панелі завдань**: Керуйте відтворенням з [панелі завдань Windows](https://user-images.githubusercontent.com/78568641/111916130-24a35e80-8a82-11eb-80c8-5021c1aa27f4.png)
|
||||
|
||||
- **TouchBar**: Власний макет TouchBar для macOS
|
||||
|
||||
- **Tuna OBS**: Інтеграція з плагіном [Tuna](https://obsproject.com/forum/resources/tuna.843/) для [OBS](https://obsproject.com/)
|
||||
|
||||
- **Зміна якості відео**: Дозволяє змінювати якість відео за допомогою [кнопки](https://user-images.githubusercontent.com/78568641/138574366-70324a5e-2d64-4f6a-acdd-dc2a2b9cecc5.png) на відеопрогравачі
|
||||
|
||||
- **Перемикач відео**: Додає [кнопку](https://user-images.githubusercontent.com/28893833/173663950-63e6610e-a532-49b7-9afa-54cb57ddfc15.png) для перемикання між режимом відео/пісні. Також може опціонально видалити всю вкладку відео
|
||||
|
||||
- **Візуалізатор**: Різні музичні візуалізатори
|
||||
|
||||
- **Синхронізовані тексти**: Надає синхронізовані тексти пісень, використовуючи такі джерела, як [LRClib](https://lrclib.net).
|
||||
|
||||
## Переклад
|
||||
|
||||
Ви можете допомогти з перекладом на [Hosted Weblate](https://hosted.weblate.org/projects/youtube-music/).
|
||||
|
||||
<a href="https://hosted.weblate.org/engage/youtube-music/">
|
||||
<img src="https://hosted.weblate.org/widget/youtube-music/i18n/multi-auto.svg" alt="статус перекладу" />
|
||||
<img src="https://hosted.weblate.org/widget/youtube-music/i18n/287x66-black.png" alt="статус перекладу 2" />
|
||||
</a>
|
||||
|
||||
## Завантажити
|
||||
|
||||
Ви можете переглянути [останній реліз](https://github.com/th-ch/youtube-music/releases/latest), щоб швидко знайти найновішу версію.
|
||||
|
||||
### Arch Linux
|
||||
|
||||
Встановіть пакет [`youtube-music-bin`](https://aur.archlinux.org/packages/youtube-music-bin) з AUR. Інструкції щодо встановлення з AUR можна знайти на цій [сторінці вікі](https://wiki.archlinux.org/index.php/Arch_User_Repository#Installing_packages).
|
||||
|
||||
### macOS
|
||||
|
||||
Ви можете встановити програму за допомогою Homebrew (дивіться [визначення cask](https://github.com/th-ch/homebrew-youtube-music)):
|
||||
|
||||
```bash
|
||||
brew install th-ch/youtube-music/youtube-music
|
||||
```
|
||||
|
||||
Якщо ви встановлюєте програму вручну та отримуєте помилку "is damaged and can’t be opened.", запустіть у Терміналі таку команду:
|
||||
|
||||
```bash
|
||||
/usr/bin/xattr -cr /Applications/YouTube\ Music.app
|
||||
```
|
||||
|
||||
### Windows
|
||||
|
||||
Ви можете використовувати [менеджер пакунків Scoop](https://scoop.sh) для встановлення пакунка `youtube-music` з [`extras` bucket](https://github.com/ScoopInstaller/Extras).
|
||||
|
||||
```bash
|
||||
scoop bucket add extras
|
||||
scoop install extras/youtube-music
|
||||
```
|
||||
|
||||
Крім того, ви можете використовувати [Winget](https://learn.microsoft.com/en-us/windows/package-manager/winget/), офіційний менеджер пакунків командного рядка Windows 11, для встановлення пакунка `th-ch.YouTubeMusic`.
|
||||
|
||||
*Примітка: Microsoft Defender SmartScreen може блокувати встановлення, оскільки воно від "невідомого видавця". Це також стосується ручного встановлення під час спроби запустити виконуваний файл (.exe) після ручного завантаження тут, на GitHub (той самий файл).*
|
||||
|
||||
```bash
|
||||
winget install th-ch.YouTubeMusic
|
||||
```
|
||||
|
||||
#### Як встановити без підключення до Інтернету? (у Windows)
|
||||
|
||||
- Завантажте файл `*.nsis.7z` для _архітектури вашого пристрою_ зі [сторінки релізів](https://github.com/th-ch/youtube-music/releases/latest).
|
||||
- `x64` для 64-розрядної Windows
|
||||
- `ia32` для 32-розрядної Windows
|
||||
- `arm64` для ARM64 Windows
|
||||
- Завантажте інсталятор зі сторінки релізів. (`*-Setup.exe`)
|
||||
- Розмістіть їх в **одному каталозі**.
|
||||
- Запустіть інсталятор.
|
||||
|
||||
## Теми
|
||||
|
||||
Ви можете завантажити файли CSS, щоб змінити вигляд програми (Опції > Візуальні налаштування > Теми).
|
||||
|
||||
Деякі попередньо визначені теми доступні за адресою https://github.com/kerichdev/themes-for-ytmdesktop-player.
|
||||
|
||||
## Розробка
|
||||
|
||||
```bash
|
||||
git clone https://github.com/th-ch/youtube-music
|
||||
cd youtube-music
|
||||
pnpm install --frozen-lockfile
|
||||
pnpm dev
|
||||
```
|
||||
|
||||
## Створіть власні плагіни
|
||||
|
||||
Використовуючи плагіни, ви можете:
|
||||
|
||||
- маніпулювати програмою - `BrowserWindow` з Electron передається обробнику плагінів
|
||||
- змінювати фронтенд, маніпулюючи HTML/CSS
|
||||
|
||||
### Створення плагіна
|
||||
|
||||
Створіть теку в `src/plugins/НАЗВА_ВАШОГО_ПЛАГІНА`:
|
||||
|
||||
- `index.ts`: основний файл плагіна
|
||||
```typescript
|
||||
import style from './style.css?inline'; // імпортувати стиль як вбудований
|
||||
|
||||
import { createPlugin } from '@/utils';
|
||||
|
||||
export default createPlugin({
|
||||
name: 'Назва плагіна',
|
||||
restartNeeded: true, // якщо значення true, ytmusic покаже діалогове вікно перезапуску
|
||||
config: {
|
||||
enabled: false,
|
||||
}, // ваша власна конфігурація
|
||||
stylesheets: [style], // ваш власний стиль,
|
||||
menu: async ({ getConfig, setConfig }) => {
|
||||
// Усі методи *Config є обгорнутими Promise<T>
|
||||
const config = await getConfig();
|
||||
return [
|
||||
{
|
||||
label: 'меню',
|
||||
submenu: [1, 2, 3].map((value) => ({
|
||||
label: `значення ${value}`,
|
||||
type: 'radio',
|
||||
checked: config.value === value,
|
||||
click() {
|
||||
setConfig({ value });
|
||||
},
|
||||
})),
|
||||
},
|
||||
];
|
||||
},
|
||||
backend: {
|
||||
start({ window, ipc }) {
|
||||
window.maximize();
|
||||
|
||||
// ви можете спілкуватися з плагіном рендерера
|
||||
ipc.handle('some-event', () => {
|
||||
return 'hello';
|
||||
});
|
||||
},
|
||||
// викликається при зміні конфігурації
|
||||
onConfigChange(newConfig) { /* ... */ },
|
||||
// викликається при вимкненні плагіна
|
||||
stop(context) { /* ... */ },
|
||||
},
|
||||
renderer: {
|
||||
async start(context) {
|
||||
console.log(await context.ipc.invoke('some-event'));
|
||||
},
|
||||
// Хук, доступний лише для рендерера
|
||||
onPlayerApiReady(api: YoutubePlayer, context: RendererContext) {
|
||||
// легко встановити конфігурацію плагіна
|
||||
context.setConfig({ myConfig: api.getVolume() });
|
||||
},
|
||||
onConfigChange(newConfig) { /* ... */ },
|
||||
stop(_context) { /* ... */ },
|
||||
},
|
||||
preload: {
|
||||
async start({ getConfig }) {
|
||||
const config = await getConfig();
|
||||
},
|
||||
onConfigChange(newConfig) {},
|
||||
stop(_context) {},
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
### Поширені випадки використання
|
||||
|
||||
- ін'єкція власного CSS: створіть файл `style.css` у тій самій теці, а потім:
|
||||
|
||||
```typescript
|
||||
// index.ts
|
||||
import style from './style.css?inline'; // імпортувати стиль як вбудований
|
||||
|
||||
import { createPlugin } from '@/utils';
|
||||
|
||||
export default createPlugin({
|
||||
name: 'Назва плагіна',
|
||||
restartNeeded: true, // якщо значення true, ytmusic покаже діалогове вікно перезапуску
|
||||
config: {
|
||||
enabled: false,
|
||||
}, // ваша власна конфігурація
|
||||
stylesheets: [style], // ваш власний стиль
|
||||
renderer() {} // визначити хук рендерера
|
||||
});
|
||||
```
|
||||
|
||||
- Якщо ви хочете змінити HTML:
|
||||
|
||||
```typescript
|
||||
import { createPlugin } from '@/utils';
|
||||
|
||||
export default createPlugin({
|
||||
name: 'Назва плагіна',
|
||||
restartNeeded: true, // якщо значення true, ytmusic покаже діалогове вікно перезапуску
|
||||
config: {
|
||||
enabled: false,
|
||||
}, // ваша власна конфігурація
|
||||
renderer() {
|
||||
// Видалити кнопку входу
|
||||
document.querySelector(".sign-in-link.ytmusic-nav-bar").remove();
|
||||
} // визначити хук рендерера
|
||||
});
|
||||
```
|
||||
|
||||
- зв'язок між фронтендом та бекендом: можна здійснити за допомогою модуля ipcMain з Electron. Дивіться файл `index.ts` та
|
||||
приклад у плагіні `sponsorblock`.
|
||||
|
||||
## Збірка
|
||||
|
||||
1. Клонуйте репозиторій
|
||||
2. Дотримуйтесь [цієї інструкції](https://pnpm.io/installation), щоб встановити `pnpm`
|
||||
3. Запустіть `pnpm install --frozen-lockfile` для встановлення залежностей
|
||||
4. Запустіть `pnpm build:OS`
|
||||
|
||||
- `pnpm dist:win` - Windows
|
||||
- `pnpm dist:linux` - Linux (amd64)
|
||||
- `pnpm dist:linux:deb-arm64` - Linux (arm64 для Debian)
|
||||
- `pnpm dist:linux:rpm-arm64` - Linux (arm64 для Fedora)
|
||||
- `pnpm dist:mac` - macOS (amd64)
|
||||
- `pnpm dist:mac:arm64` - macOS (arm64)
|
||||
|
||||
Збирає програму для macOS, Linux та Windows,
|
||||
використовуючи [electron-builder](https://github.com/electron-userland/electron-builder).
|
||||
|
||||
## Попередній перегляд для production
|
||||
|
||||
```bash
|
||||
pnpm start
|
||||
```
|
||||
|
||||
## Тести
|
||||
|
||||
```bash
|
||||
pnpm test
|
||||
```
|
||||
|
||||
Використовує [Playwright](https://playwright.dev/) для тестування програми.
|
||||
|
||||
## Ліцензія
|
||||
|
||||
MIT © [th-ch](https://github.com/th-ch/youtube-music)
|
||||
|
||||
## Поширені запитання
|
||||
|
||||
### Чому меню програми не відображається?
|
||||
|
||||
Якщо опція `Приховати меню` увімкнена - ви можете показати меню клавішею <kbd>Alt</kbd> (або <kbd>\`</kbd> [зворотний апостроф], якщо використовуєте плагін "Меню в програмі")
|
||||
125
electron-builder.yml
Normal file
125
electron-builder.yml
Normal file
@ -0,0 +1,125 @@
|
||||
appId: com.github.th-ch.youtube-music
|
||||
productName: YouTube Music
|
||||
files:
|
||||
- '!*'
|
||||
- dist
|
||||
- assets
|
||||
- license
|
||||
- '!node_modules'
|
||||
- 'node_modules/custom-electron-prompt/**'
|
||||
- 'node_modules/@ghostery/adblocker-electron-preload/**'
|
||||
- 'node_modules/@ffmpeg.wasm/core-mt/**'
|
||||
- '!node_modules/**/*.map'
|
||||
- '!node_modules/**/*.ts'
|
||||
asarUnpack:
|
||||
- assets
|
||||
mac:
|
||||
identity: null
|
||||
target:
|
||||
- target: dmg
|
||||
arch:
|
||||
- x64
|
||||
- arm64
|
||||
icon: assets/generated/icons/mac/icon.icns
|
||||
compression: maximum
|
||||
win:
|
||||
icon: assets/generated/icons/win/icon.ico
|
||||
target:
|
||||
- target: nsis-web
|
||||
arch:
|
||||
- x64
|
||||
- ia32
|
||||
- arm64
|
||||
- target: portable
|
||||
arch:
|
||||
- x64
|
||||
- ia32
|
||||
- arm64
|
||||
compression: maximum
|
||||
nsisWeb:
|
||||
runAfterFinish: false
|
||||
linux:
|
||||
icon: assets/generated/icons/png
|
||||
category: AudioVideo
|
||||
desktop:
|
||||
entry:
|
||||
StartupWMClass: com.github.th_ch.youtube_music
|
||||
target:
|
||||
- target: AppImage
|
||||
arch:
|
||||
- x64
|
||||
- arm64
|
||||
- armv7l
|
||||
- target: flatpak
|
||||
arch:
|
||||
- x64
|
||||
- target: deb
|
||||
arch:
|
||||
- x64
|
||||
- arm64
|
||||
- armv7l
|
||||
- target: rpm
|
||||
arch:
|
||||
- x64
|
||||
- arm64
|
||||
- target: snap
|
||||
arch:
|
||||
- x64
|
||||
- target: freebsd
|
||||
arch:
|
||||
- x64
|
||||
- arm64
|
||||
- armv7l
|
||||
- target: tar.gz
|
||||
arch:
|
||||
- x64
|
||||
- arm64
|
||||
- armv7l
|
||||
appImage:
|
||||
description: >-
|
||||
YouTube Music Desktop App bundled with custom plugins (and built-in ad
|
||||
blocker / downloader)
|
||||
category: AudioVideo
|
||||
flatpak:
|
||||
description: >-
|
||||
YouTube Music Desktop App bundled with custom plugins (and built-in ad
|
||||
blocker / downloader)
|
||||
category: AudioVideo
|
||||
runtimeVersion: '24.08'
|
||||
baseVersion: '24.08'
|
||||
finishArgs:
|
||||
- '--socket=wayland'
|
||||
- '--socket=x11'
|
||||
- '--share=ipc'
|
||||
- '--device=dri'
|
||||
- '--socket=pulseaudio'
|
||||
- '--share=network'
|
||||
- '--filesystem=xdg-music:rw'
|
||||
- '--talk-name=org.freedesktop.Notifications'
|
||||
- '--talk-name=org.gnome.SessionManager'
|
||||
- '--talk-name=org.kde.StatusNotifierWatcher'
|
||||
- '--own-name=org.mpris.MediaPlayer2.YoutubeMusic.*'
|
||||
deb:
|
||||
depends:
|
||||
- libgtk-3-0
|
||||
- libnotify4
|
||||
- libnss3
|
||||
- libxss1
|
||||
- libxtst6
|
||||
- xdg-utils
|
||||
- libatspi2.0-0
|
||||
- libuuid1
|
||||
- libasound2
|
||||
- libgbm1
|
||||
rpm:
|
||||
depends:
|
||||
- /usr/lib64/libuuid.so.1
|
||||
fpm:
|
||||
- '--rpm-rpmbuild-define'
|
||||
- _build_id_links none
|
||||
snap:
|
||||
slots:
|
||||
- mpris:
|
||||
interface: mpris
|
||||
directories:
|
||||
output: ./pack/
|
||||
@ -1,16 +1,17 @@
|
||||
import { dirname, join, resolve } from 'node:path';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
|
||||
import { UserConfig } from 'vite';
|
||||
import { defineConfig, defineViteConfig } from 'electron-vite';
|
||||
import builtinModules from 'builtin-modules';
|
||||
import viteResolve from 'vite-plugin-resolve';
|
||||
|
||||
import Inspect from 'vite-plugin-inspect';
|
||||
import solidPlugin from 'vite-plugin-solid';
|
||||
import viteResolve from 'vite-plugin-resolve';
|
||||
|
||||
import { withFilter, type UserConfig } from 'vite';
|
||||
|
||||
import { pluginVirtualModuleGenerator } from './vite-plugins/plugin-importer.mjs';
|
||||
import pluginLoader from './vite-plugins/plugin-loader.mjs';
|
||||
|
||||
import { i18nImporter } from './vite-plugins/i18n-importer.mjs';
|
||||
|
||||
const __dirname = dirname(fileURLToPath(import.meta.url));
|
||||
@ -23,6 +24,9 @@ const resolveAlias = {
|
||||
export default defineConfig({
|
||||
main: defineViteConfig(({ mode }) => {
|
||||
const commonConfig: UserConfig = {
|
||||
experimental: {
|
||||
enableNativePlugin: true,
|
||||
},
|
||||
plugins: [
|
||||
pluginLoader('backend'),
|
||||
viteResolve({
|
||||
@ -31,15 +35,16 @@ export default defineConfig({
|
||||
}),
|
||||
],
|
||||
publicDir: 'assets',
|
||||
define: {
|
||||
'__dirname': 'import.meta.dirname',
|
||||
'__filename': 'import.meta.filename',
|
||||
},
|
||||
build: {
|
||||
lib: {
|
||||
entry: 'src/index.ts',
|
||||
formats: ['cjs'],
|
||||
formats: ['es'],
|
||||
},
|
||||
outDir: 'dist/main',
|
||||
commonjsOptions: {
|
||||
ignoreDynamicRequires: true,
|
||||
},
|
||||
rollupOptions: {
|
||||
external: ['electron', 'custom-electron-prompt', ...builtinModules],
|
||||
input: './src/index.ts',
|
||||
@ -72,6 +77,9 @@ export default defineConfig({
|
||||
}),
|
||||
preload: defineViteConfig(({ mode }) => {
|
||||
const commonConfig: UserConfig = {
|
||||
experimental: {
|
||||
enableNativePlugin: true,
|
||||
},
|
||||
plugins: [
|
||||
pluginLoader('preload'),
|
||||
viteResolve({
|
||||
@ -120,13 +128,18 @@ export default defineConfig({
|
||||
}),
|
||||
renderer: defineViteConfig(({ mode }) => {
|
||||
const commonConfig: UserConfig = {
|
||||
experimental: {
|
||||
enableNativePlugin: mode !== 'development', // Disable native plugin in development mode to avoid issues with HMR (bug in rolldown-vite)
|
||||
},
|
||||
plugins: [
|
||||
pluginLoader('renderer'),
|
||||
viteResolve({
|
||||
'virtual:i18n': i18nImporter(),
|
||||
'virtual:plugins': pluginVirtualModuleGenerator('renderer'),
|
||||
}),
|
||||
solidPlugin(),
|
||||
withFilter(solidPlugin(), {
|
||||
load: { id: [/\.(tsx|jsx)$/, '/@solid-refresh'] },
|
||||
}),
|
||||
],
|
||||
root: './src/',
|
||||
build: {
|
||||
@ -136,9 +149,6 @@ export default defineConfig({
|
||||
name: 'renderer',
|
||||
},
|
||||
outDir: 'dist/renderer',
|
||||
commonjsOptions: {
|
||||
ignoreDynamicRequires: true,
|
||||
},
|
||||
rollupOptions: {
|
||||
external: ['electron', ...builtinModules],
|
||||
input: './src/index.html',
|
||||
|
||||
@ -2,7 +2,8 @@
|
||||
|
||||
import eslint from '@eslint/js';
|
||||
import prettier from 'eslint-plugin-prettier/recommended';
|
||||
import stylistic from '@stylistic/eslint-plugin-js';
|
||||
import solid from 'eslint-plugin-solid/configs/recommended';
|
||||
import stylistic from '@stylistic/eslint-plugin';
|
||||
import tsEslint from 'typescript-eslint';
|
||||
|
||||
import * as importPlugin from 'eslint-plugin-import';
|
||||
@ -12,6 +13,7 @@ export default tsEslint.config(
|
||||
tsEslint.configs.eslintRecommended,
|
||||
...tsEslint.configs.recommendedTypeChecked,
|
||||
prettier,
|
||||
solid,
|
||||
{ ignores: ['dist', 'node_modules', '*.config.*js', '*.test.*js'] },
|
||||
{
|
||||
plugins: {
|
||||
|
||||
287
package.json
287
package.json
@ -2,9 +2,10 @@
|
||||
"name": "youtube-music",
|
||||
"desktopName": "com.github.th_ch.youtube_music",
|
||||
"productName": "YouTube Music",
|
||||
"version": "3.9.0",
|
||||
"version": "3.10.0",
|
||||
"description": "YouTube Music Desktop App - including custom plugins",
|
||||
"main": "./dist/main/index.js",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
"repository": "th-ch/youtube-music",
|
||||
"author": {
|
||||
@ -12,184 +13,6 @@
|
||||
"email": "th-ch@users.noreply.github.com",
|
||||
"url": "https://github.com/th-ch/youtube-music"
|
||||
},
|
||||
"build": {
|
||||
"appId": "com.github.th-ch.youtube-music",
|
||||
"productName": "YouTube Music",
|
||||
"files": [
|
||||
"!*",
|
||||
"dist",
|
||||
"assets",
|
||||
"license",
|
||||
"!node_modules",
|
||||
"node_modules/custom-electron-prompt/**",
|
||||
"node_modules/@ghostery/adblocker-electron-preload/**",
|
||||
"node_modules/@ffmpeg.wasm/core-mt/**",
|
||||
"!node_modules/**/*.map",
|
||||
"!node_modules/**/*.ts"
|
||||
],
|
||||
"asarUnpack": [
|
||||
"assets"
|
||||
],
|
||||
"mac": {
|
||||
"identity": null,
|
||||
"target": [
|
||||
{
|
||||
"target": "dmg",
|
||||
"arch": [
|
||||
"x64",
|
||||
"arm64"
|
||||
]
|
||||
}
|
||||
],
|
||||
"icon": "assets/generated/icons/mac/icon.icns",
|
||||
"compression": "maximum"
|
||||
},
|
||||
"win": {
|
||||
"icon": "assets/generated/icons/win/icon.ico",
|
||||
"target": [
|
||||
{
|
||||
"target": "nsis-web",
|
||||
"arch": [
|
||||
"x64",
|
||||
"ia32",
|
||||
"arm64"
|
||||
]
|
||||
},
|
||||
{
|
||||
"target": "portable",
|
||||
"arch": [
|
||||
"x64",
|
||||
"ia32",
|
||||
"arm64"
|
||||
]
|
||||
}
|
||||
],
|
||||
"compression": "maximum"
|
||||
},
|
||||
"nsisWeb": {
|
||||
"runAfterFinish": false
|
||||
},
|
||||
"linux": {
|
||||
"icon": "assets/generated/icons/png",
|
||||
"category": "AudioVideo",
|
||||
"desktop": {
|
||||
"entry": {
|
||||
"StartupWMClass": "com.github.th_ch.youtube_music"
|
||||
}
|
||||
},
|
||||
"target": [
|
||||
{
|
||||
"target": "AppImage",
|
||||
"arch": [
|
||||
"x64",
|
||||
"arm64",
|
||||
"armv7l"
|
||||
]
|
||||
},
|
||||
{
|
||||
"target": "flatpak",
|
||||
"arch": [
|
||||
"x64"
|
||||
]
|
||||
},
|
||||
{
|
||||
"target": "deb",
|
||||
"arch": [
|
||||
"x64",
|
||||
"arm64",
|
||||
"armv7l"
|
||||
]
|
||||
},
|
||||
{
|
||||
"target": "rpm",
|
||||
"arch": [
|
||||
"x64",
|
||||
"arm64"
|
||||
]
|
||||
},
|
||||
{
|
||||
"target": "snap",
|
||||
"arch": [
|
||||
"x64"
|
||||
]
|
||||
},
|
||||
{
|
||||
"target": "freebsd",
|
||||
"arch": [
|
||||
"x64",
|
||||
"arm64",
|
||||
"armv7l"
|
||||
]
|
||||
},
|
||||
{
|
||||
"target": "tar.gz",
|
||||
"arch": [
|
||||
"x64",
|
||||
"arm64",
|
||||
"armv7l"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"appImage": {
|
||||
"description": "YouTube Music Desktop App bundled with custom plugins (and built-in ad blocker / downloader)",
|
||||
"category": "AudioVideo"
|
||||
},
|
||||
"flatpak": {
|
||||
"description": "YouTube Music Desktop App bundled with custom plugins (and built-in ad blocker / downloader)",
|
||||
"category": "AudioVideo",
|
||||
"runtimeVersion": "24.08",
|
||||
"baseVersion": "24.08",
|
||||
"finishArgs": [
|
||||
"--socket=wayland",
|
||||
"--socket=x11",
|
||||
"--share=ipc",
|
||||
"--device=dri",
|
||||
"--socket=pulseaudio",
|
||||
"--share=network",
|
||||
"--filesystem=xdg-music:rw",
|
||||
"--talk-name=org.freedesktop.Notifications",
|
||||
"--talk-name=org.gnome.SessionManager",
|
||||
"--talk-name=org.kde.StatusNotifierWatcher",
|
||||
"--own-name=org.mpris.MediaPlayer2.YoutubeMusic.*"
|
||||
]
|
||||
},
|
||||
"deb": {
|
||||
"depends": [
|
||||
"libgtk-3-0",
|
||||
"libnotify4",
|
||||
"libnss3",
|
||||
"libxss1",
|
||||
"libxtst6",
|
||||
"xdg-utils",
|
||||
"libatspi2.0-0",
|
||||
"libuuid1",
|
||||
"libasound2",
|
||||
"libgbm1"
|
||||
]
|
||||
},
|
||||
"rpm": {
|
||||
"depends": [
|
||||
"/usr/lib64/libuuid.so.1"
|
||||
],
|
||||
"fpm": [
|
||||
"--rpm-rpmbuild-define",
|
||||
"_build_id_links none"
|
||||
]
|
||||
},
|
||||
"snap": {
|
||||
"slots": [
|
||||
{
|
||||
"mpris": {
|
||||
"interface": "mpris"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"directories": {
|
||||
"output": "./pack/"
|
||||
}
|
||||
},
|
||||
"scripts": {
|
||||
"test": "playwright test",
|
||||
"test:debug": "cross-env DEBUG=pw:*,-pw:test:protocol playwright test",
|
||||
@ -217,69 +40,72 @@
|
||||
"typecheck": "tsc -p tsconfig.json --noEmit"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=18",
|
||||
"node": ">=22",
|
||||
"pnpm": ">=10"
|
||||
},
|
||||
"pnpm": {
|
||||
"overrides": {
|
||||
"vite": "6.3.3",
|
||||
"vite": "npm:rolldown-vite@7.0.8",
|
||||
"node-gyp": "11.2.0",
|
||||
"xml2js": "0.6.2",
|
||||
"node-fetch": "3.3.2",
|
||||
"@electron/universal": "2.0.2",
|
||||
"@babel/runtime": "7.27.0"
|
||||
"@electron/universal": "3.0.0",
|
||||
"@babel/runtime": "7.27.6",
|
||||
"vitefu": "1.1.1"
|
||||
},
|
||||
"patchedDependencies": {
|
||||
"vudio@2.1.1": "patches/vudio@2.1.1.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"
|
||||
},
|
||||
"neverBuiltDependencies": []
|
||||
},
|
||||
"dependencies": {
|
||||
"@electron-toolkit/tsconfig": "1.0.1",
|
||||
"@electron/remote": "2.1.2",
|
||||
"@electron/remote": "2.1.3",
|
||||
"@ffmpeg.wasm/core-mt": "0.12.0",
|
||||
"@ffmpeg.wasm/main": "0.12.0",
|
||||
"@floating-ui/dom": "1.6.13",
|
||||
"@floating-ui/dom": "1.7.2",
|
||||
"@foobar404/wave": "2.0.5",
|
||||
"@ghostery/adblocker-electron": "2.5.1",
|
||||
"@ghostery/adblocker-electron-preload": "2.5.1",
|
||||
"@hono/node-server": "1.14.1",
|
||||
"@hono/swagger-ui": "0.5.1",
|
||||
"@hono/zod-openapi": "0.19.5",
|
||||
"@hono/zod-validator": "0.4.3",
|
||||
"@ghostery/adblocker-electron": "2.11.1",
|
||||
"@ghostery/adblocker-electron-preload": "2.11.1",
|
||||
"@hono/node-server": "1.15.0",
|
||||
"@hono/swagger-ui": "0.5.2",
|
||||
"@hono/zod-openapi": "1.0.0-beta.1",
|
||||
"@hono/zod-validator": "0.7.0",
|
||||
"@jellybrick/dbus-next": "0.10.3",
|
||||
"@jellybrick/electron-better-web-request": "1.0.4",
|
||||
"@jellybrick/mpris-service": "2.1.5",
|
||||
"@jimp/plugin-color": "1.6.0",
|
||||
"@skyra/jaro-winkler": "1.1.1",
|
||||
"@xhayper/discord-rpc": "1.2.1",
|
||||
"@xhayper/discord-rpc": "1.2.2",
|
||||
"async-mutex": "0.5.0",
|
||||
"bgutils-js": "3.2.0",
|
||||
"butterchurn": "3.0.0-beta.4",
|
||||
"butterchurn": "3.0.0-beta.5",
|
||||
"butterchurn-presets": "3.0.0-beta.4",
|
||||
"color": "5.0.0",
|
||||
"conf": "13.1.0",
|
||||
"conf": "14.0.0",
|
||||
"custom-electron-prompt": "1.5.8",
|
||||
"deepmerge-ts": "7.1.5",
|
||||
"delay": "6.0.0",
|
||||
"electron-debug": "4.1.0",
|
||||
"electron-is": "3.0.0",
|
||||
"electron-localshortcut": "3.2.1",
|
||||
"electron-store": "10.0.1",
|
||||
"electron-unhandled": "4.0.1",
|
||||
"electron-store": "10.1.0",
|
||||
"electron-unhandled": "5.0.0",
|
||||
"electron-updater": "6.6.2",
|
||||
"es-hangul": "2.3.2",
|
||||
"es-hangul": "2.3.5",
|
||||
"fast-average-color": "9.5.0",
|
||||
"fast-equals": "5.2.2",
|
||||
"fflate": "0.8.2",
|
||||
"filenamify": "6.0.0",
|
||||
"hanja": "1.1.4",
|
||||
"happy-dom": "17.4.4",
|
||||
"hono": "4.7.7",
|
||||
"happy-dom": "18.0.1",
|
||||
"hono": "4.8.4",
|
||||
"howler": "2.2.4",
|
||||
"html-to-text": "9.0.5",
|
||||
"i18next": "25.0.1",
|
||||
"i18next": "25.3.2",
|
||||
"jimp": "1.6.0",
|
||||
"keyboardevent-from-electron-accelerator": "2.0.0",
|
||||
"keyboardevents-areequal": "0.2.2",
|
||||
@ -289,27 +115,31 @@
|
||||
"lazy-var": "2.2.2",
|
||||
"node-html-parser": "7.0.1",
|
||||
"node-id3": "0.2.9",
|
||||
"peerjs": "1.5.4",
|
||||
"pinyin": "4.0.0-alpha.2",
|
||||
"peerjs": "1.5.5",
|
||||
"segmentit": "2.0.3",
|
||||
"semver": "7.7.1",
|
||||
"semver": "7.7.2",
|
||||
"serve": "14.2.4",
|
||||
"simple-youtube-age-restriction-bypass": "github:organization/Simple-YouTube-Age-Restriction-Bypass#v2.5.9",
|
||||
"socks": "2.8.6",
|
||||
"solid-element": "1.9.1",
|
||||
"solid-floating-ui": "0.3.1",
|
||||
"solid-js": "1.9.5",
|
||||
"solid-js": "1.9.7",
|
||||
"solid-styled-components": "0.28.5",
|
||||
"solid-transition-group": "0.3.0",
|
||||
"ts-morph": "25.0.1",
|
||||
"tiny-pinyin": "1.3.2",
|
||||
"tinyld": "1.3.4",
|
||||
"ts-morph": "26.0.0",
|
||||
"virtua": "0.41.5",
|
||||
"vudio": "2.1.1",
|
||||
"x11": "2.3.0",
|
||||
"youtubei.js": "13.4.0",
|
||||
"zod": "3.24.3"
|
||||
"youtubei.js": "14.0.0",
|
||||
"zod": "4.0.5"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@eslint/js": "9.25.1",
|
||||
"@eslint/js": "9.31.0",
|
||||
"@malept/flatpak-bundler": "0.4.0",
|
||||
"@playwright/test": "1.52.0",
|
||||
"@stylistic/eslint-plugin-js": "4.2.0",
|
||||
"@playwright/test": "1.54.1",
|
||||
"@stylistic/eslint-plugin": "5.1.0",
|
||||
"@total-typescript/ts-reset": "0.6.1",
|
||||
"@types/electron-localshortcut": "3.1.3",
|
||||
"@types/howler": "2.2.12",
|
||||
@ -320,31 +150,32 @@
|
||||
"builtin-modules": "5.0.0",
|
||||
"cross-env": "7.0.3",
|
||||
"del-cli": "6.0.0",
|
||||
"discord-api-types": "0.38.1",
|
||||
"electron": "34.5.3",
|
||||
"discord-api-types": "0.38.15",
|
||||
"electron": "38.0.0-alpha.5",
|
||||
"electron-builder": "26.0.12",
|
||||
"electron-builder-squirrel-windows": "26.0.12",
|
||||
"electron-devtools-installer": "4.0.0",
|
||||
"electron-vite": "3.1.0",
|
||||
"esbuild": "0.25.3",
|
||||
"eslint": "9.25.1",
|
||||
"eslint-config-prettier": "10.1.2",
|
||||
"electron-vite": "4.0.0",
|
||||
"esbuild": "0.25.6",
|
||||
"eslint": "9.31.0",
|
||||
"eslint-config-prettier": "10.1.5",
|
||||
"eslint-import-resolver-exports": "1.0.0-beta.5",
|
||||
"eslint-import-resolver-typescript": "4.3.4",
|
||||
"eslint-plugin-import": "2.31.0",
|
||||
"eslint-plugin-prettier": "5.2.6",
|
||||
"glob": "11.0.2",
|
||||
"eslint-import-resolver-typescript": "4.4.4",
|
||||
"eslint-plugin-import": "2.32.0",
|
||||
"eslint-plugin-prettier": "5.5.1",
|
||||
"eslint-plugin-solid": "0.14.5",
|
||||
"glob": "11.0.3",
|
||||
"node-gyp": "11.2.0",
|
||||
"playwright": "1.52.0",
|
||||
"rollup": "4.40.0",
|
||||
"playwright": "1.54.1",
|
||||
"rollup": "4.45.0",
|
||||
"typescript": "5.8.3",
|
||||
"typescript-eslint": "8.31.0",
|
||||
"typescript-eslint": "8.36.0",
|
||||
"utf-8-validate": "6.0.5",
|
||||
"vite": "6.3.3",
|
||||
"vite-plugin-inspect": "11.0.1",
|
||||
"vite": "npm:rolldown-vite@7.0.8",
|
||||
"vite-plugin-inspect": "11.3.0",
|
||||
"vite-plugin-resolve": "2.5.2",
|
||||
"vite-plugin-solid": "2.11.6",
|
||||
"ws": "8.18.1"
|
||||
"vite-plugin-solid": "2.11.7",
|
||||
"ws": "8.18.3"
|
||||
},
|
||||
"auto-changelog": {
|
||||
"hideCredit": true,
|
||||
|
||||
14
patches/file-type@16.5.4.patch
Normal file
14
patches/file-type@16.5.4.patch
Normal file
@ -0,0 +1,14 @@
|
||||
diff --git a/core.js b/core.js
|
||||
index d653e66a4056c27cca777d4e25222acae3b2ec85..a91741d67df85fd9627889a6c7197ac4e6a3a813 100644
|
||||
--- a/core.js
|
||||
+++ b/core.js
|
||||
@@ -1415,8 +1415,7 @@ async function _fromTokenizer(tokenizer) {
|
||||
}
|
||||
|
||||
const stream = readableStream => new Promise((resolve, reject) => {
|
||||
- // Using `eval` to work around issues when bundling with Webpack
|
||||
- const stream = eval('require')('stream'); // eslint-disable-line no-eval
|
||||
+ const stream = require('node:stream');
|
||||
|
||||
readableStream.on('error', reject);
|
||||
readableStream.once('readable', async () => {
|
||||
File diff suppressed because it is too large
Load Diff
3072
pnpm-lock.yaml
generated
3072
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@ -12,8 +12,8 @@ export interface DefaultConfig {
|
||||
'window-size': WindowSizeConfig;
|
||||
'window-maximized': boolean;
|
||||
'window-position': WindowPositionConfig;
|
||||
url: string;
|
||||
options: {
|
||||
'url': string;
|
||||
'options': {
|
||||
language?: string;
|
||||
tray: boolean;
|
||||
appVisible: boolean;
|
||||
@ -35,7 +35,7 @@ export interface DefaultConfig {
|
||||
usePodcastParticipantAsArtist: boolean;
|
||||
themes: string[];
|
||||
};
|
||||
plugins: Record<string, unknown>;
|
||||
'plugins': Record<string, unknown>;
|
||||
}
|
||||
|
||||
const defaultConfig: DefaultConfig = {
|
||||
|
||||
@ -11,9 +11,9 @@ export function getPlugins() {
|
||||
return store.get('plugins') as Record<string, PluginConfig>;
|
||||
}
|
||||
|
||||
export function isEnabled(plugin: string) {
|
||||
export async function isEnabled(plugin: string) {
|
||||
const pluginConfig = deepmerge(
|
||||
allPlugins[plugin].config ?? { enabled: false },
|
||||
(await allPlugins())[plugin].config ?? { enabled: false },
|
||||
(store.get('plugins') as Record<string, PluginConfig>)[plugin] ?? {},
|
||||
);
|
||||
return pluginConfig !== undefined && pluginConfig.enabled;
|
||||
|
||||
@ -4,10 +4,39 @@ import defaults from './defaults';
|
||||
|
||||
import { DefaultPresetList, type Preset } from '@/plugins/downloader/types';
|
||||
|
||||
// prettier-ignore
|
||||
export type IStore = InstanceType<typeof import('conf/dist/source/index').default<Record<string, unknown>>>;
|
||||
import type { SyncedLyricsPluginConfig } from '@/plugins/synced-lyrics/types';
|
||||
|
||||
export type IStore = InstanceType<
|
||||
typeof import('conf').default<Record<string, unknown>>
|
||||
>;
|
||||
|
||||
const migrations = {
|
||||
'>=3.10.0'(store: IStore) {
|
||||
const lyricGeniusConfig = store.get('plugins.lyrics-genius') as
|
||||
| {
|
||||
enabled?: boolean;
|
||||
romanizedLyrics?: boolean;
|
||||
}
|
||||
| undefined;
|
||||
|
||||
if (lyricGeniusConfig) {
|
||||
const syncedLyricsConfig = store.get('plugins.synced-lyrics') as
|
||||
| SyncedLyricsPluginConfig
|
||||
| undefined;
|
||||
|
||||
if (
|
||||
!syncedLyricsConfig ||
|
||||
syncedLyricsConfig?.enabled !== lyricGeniusConfig?.enabled
|
||||
) {
|
||||
store.set('plugins.synced-lyrics', {
|
||||
...syncedLyricsConfig,
|
||||
enabled: lyricGeniusConfig.enabled,
|
||||
});
|
||||
}
|
||||
|
||||
store.delete('plugins.lyrics-genius');
|
||||
}
|
||||
},
|
||||
'>=3.3.0'(store: IStore) {
|
||||
const lastfmConfig = store.get('plugins.lastfm') as {
|
||||
enabled?: boolean;
|
||||
|
||||
@ -4,7 +4,7 @@ import { languageResources } from 'virtual:i18n';
|
||||
|
||||
export const loadI18n = async () =>
|
||||
await init({
|
||||
resources: languageResources,
|
||||
resources: await languageResources(),
|
||||
lng: 'en',
|
||||
fallbackLng: 'en',
|
||||
interpolation: {
|
||||
|
||||
@ -2,9 +2,9 @@ export interface LanguageResources {
|
||||
[lang: string]: {
|
||||
translation: Record<string, unknown> & {
|
||||
language?: {
|
||||
name: string;
|
||||
'name': string;
|
||||
'local-name': string;
|
||||
code: string;
|
||||
'code': string;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@ -333,6 +333,30 @@
|
||||
"description": "تطبيق الضغط على الصوت (يخفض مستوى صوت الأجزاء الأعلى من الإشارة ويرفع مستوى صوت الأجزاء الأكثر نعومة)",
|
||||
"name": "ضاغط الصوت"
|
||||
},
|
||||
"auth-proxy-adapter": {
|
||||
"description": "دعم استخدام خدمات وكيل المصادقة",
|
||||
"menu": {
|
||||
"disable": "تعطيل مكيف الوكيل",
|
||||
"enable": "تفعيل مكيف الوكيل",
|
||||
"hostname": {
|
||||
"label": "إسم المستضيف"
|
||||
},
|
||||
"port": {
|
||||
"label": "المدخل"
|
||||
}
|
||||
},
|
||||
"name": "مكيّف وسيط المصادقة",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "أدخل اسم المستضيف لخادم الوسيط المحلي (يتطلب إعادة التشغيل):",
|
||||
"title": "إسم مستضيف الوسيط"
|
||||
},
|
||||
"port": {
|
||||
"label": "أدخل مدخلًا لخادم الوسيط المحلي (يتطلب إعادة التشغيل):",
|
||||
"title": "مدخل الوسيط"
|
||||
}
|
||||
}
|
||||
},
|
||||
"blur-nav-bar": {
|
||||
"description": "يجعل شريط التنقل شفاف و ضبابي",
|
||||
"name": "تغبيش شريط التنقل"
|
||||
@ -357,6 +381,11 @@
|
||||
},
|
||||
"templates": {
|
||||
"title": "فتح محدد الترجمة"
|
||||
},
|
||||
"toast": {
|
||||
"caption-changed": "تم تغيير الترجمة الى {{language}}",
|
||||
"caption-disabled": "الترجمة معطلة",
|
||||
"no-captions": "الترجمة لهاته الأغنية غير متاحة"
|
||||
}
|
||||
},
|
||||
"compact-sidebar": {
|
||||
@ -576,7 +605,15 @@
|
||||
},
|
||||
"navigation": {
|
||||
"description": "أسهم التنقل \"التالي/السابق\" مدمجة مباشرة في الواجهة، كما في متصفحك",
|
||||
"name": "التنقل"
|
||||
"name": "التنقل",
|
||||
"templates": {
|
||||
"back": {
|
||||
"title": "العودة إلى الصفحة السابقة"
|
||||
},
|
||||
"forward": {
|
||||
"title": "إذهب إلى الصفحة المقبلة"
|
||||
}
|
||||
}
|
||||
},
|
||||
"no-google-login": {
|
||||
"description": "إزالة أزرار وروابط تسجيل الدخول بجوجل من الواجهة",
|
||||
@ -600,6 +637,10 @@
|
||||
},
|
||||
"name": "الإشعارات"
|
||||
},
|
||||
"performance-improvement": {
|
||||
"description": "تحسين الأداء عبر تفعيل السكربتات التجريبية",
|
||||
"name": "تحسين الأداء [بيتا]"
|
||||
},
|
||||
"picture-in-picture": {
|
||||
"description": "يسمح بتحويل التطبيق إلى وضع الصورة داخل الصورة",
|
||||
"menu": {
|
||||
@ -664,7 +705,12 @@
|
||||
}
|
||||
},
|
||||
"description": "يسمح بتغيير جودة الفيديو باستخدام زر على صورة الفيديو",
|
||||
"name": "مغير جودة الفيديو"
|
||||
"name": "مغير جودة الفيديو",
|
||||
"renderer": {
|
||||
"quality-settings-button": {
|
||||
"label": "إفتح مغير الجودة"
|
||||
}
|
||||
}
|
||||
},
|
||||
"scrobbler": {
|
||||
"description": "إضافة دعم Scrobbling (مثل Last.fm، ListenBrainz)",
|
||||
@ -831,7 +877,8 @@
|
||||
},
|
||||
"name": "تفعيل الفيديو",
|
||||
"templates": {
|
||||
"button": "أغنية"
|
||||
"button-song": "أغنية",
|
||||
"button-video": "فيديو"
|
||||
}
|
||||
},
|
||||
"visualizer": {
|
||||
|
||||
7
src/i18n/resources/az.json
Normal file
7
src/i18n/resources/az.json
Normal file
@ -0,0 +1,7 @@
|
||||
{
|
||||
"language": {
|
||||
"code": "az",
|
||||
"local-name": "Azərbaycan dili",
|
||||
"name": "Azerbaijani"
|
||||
}
|
||||
}
|
||||
@ -333,6 +333,30 @@
|
||||
"description": "Прилага компресия на аудиото (намалява обема на най-силните части от сигнала и увеличава обема на най-тихите части)",
|
||||
"name": "Аудио компресор"
|
||||
},
|
||||
"auth-proxy-adapter": {
|
||||
"description": "Поддръжка за използване на услуги за удостоверяване чрез прокси",
|
||||
"menu": {
|
||||
"disable": "Деактивирай адаптера за удостоверяване чрез прокси",
|
||||
"enable": "Активирай адаптера за удостоверяване чрез прокси",
|
||||
"hostname": {
|
||||
"label": "Име на хост"
|
||||
},
|
||||
"port": {
|
||||
"label": "Порт"
|
||||
}
|
||||
},
|
||||
"name": "Адаптер за удостоверяване чрез прокси",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "Въведи име за локалния прокси сървър (необходимо е рестартиране):",
|
||||
"title": "Име на прокси хост"
|
||||
},
|
||||
"port": {
|
||||
"label": "Въведи порт за локалния прокси сървър (необходимо е рестартиране):",
|
||||
"title": "Прокси порт"
|
||||
}
|
||||
}
|
||||
},
|
||||
"blur-nav-bar": {
|
||||
"description": "Прави навигационната лента прозрачна и размазана",
|
||||
"name": "Размазанa навигационна лента"
|
||||
@ -357,6 +381,11 @@
|
||||
},
|
||||
"templates": {
|
||||
"title": "Отвори избора на надписи"
|
||||
},
|
||||
"toast": {
|
||||
"caption-changed": "Надписите са сменени на {{language}}",
|
||||
"caption-disabled": "Надписите са деактивирани",
|
||||
"no-captions": "Няма налични надписи за тази песен"
|
||||
}
|
||||
},
|
||||
"compact-sidebar": {
|
||||
@ -576,7 +605,15 @@
|
||||
},
|
||||
"navigation": {
|
||||
"description": "Навигационни стрелки Напред/Назад, директно интегрирани в интерфейса, както в любимия ви браузър",
|
||||
"name": "Навигация"
|
||||
"name": "Навигация",
|
||||
"templates": {
|
||||
"back": {
|
||||
"title": "Предишна страница"
|
||||
},
|
||||
"forward": {
|
||||
"title": "Следваща страница"
|
||||
}
|
||||
}
|
||||
},
|
||||
"no-google-login": {
|
||||
"description": "Премахни бутоните за вход с Google и връзките от интерфейса",
|
||||
@ -600,6 +637,10 @@
|
||||
},
|
||||
"name": "Известия"
|
||||
},
|
||||
"performance-improvement": {
|
||||
"description": "Подобри производителността като пуснеш експериментални скриптове",
|
||||
"name": "Производителни подобрения"
|
||||
},
|
||||
"picture-in-picture": {
|
||||
"description": "Позволява превключване на приложението в режим картинка във картинка",
|
||||
"menu": {
|
||||
@ -664,7 +705,12 @@
|
||||
}
|
||||
},
|
||||
"description": "Позволява промяна на качеството на видеото с бутон върху видеото",
|
||||
"name": "Промяна на качеството на видеото"
|
||||
"name": "Промяна на качеството на видеото",
|
||||
"renderer": {
|
||||
"quality-settings-button": {
|
||||
"label": "Отвори настройките за качество на плейъра"
|
||||
}
|
||||
}
|
||||
},
|
||||
"scrobbler": {
|
||||
"description": "Добавяне на скробблинг поддръжка (last.fm, Listenbrainz и т.н.)",
|
||||
@ -831,7 +877,8 @@
|
||||
},
|
||||
"name": "Превключване на видео",
|
||||
"templates": {
|
||||
"button": "Песен"
|
||||
"button-song": "Песен",
|
||||
"button-video": "Видео"
|
||||
}
|
||||
},
|
||||
"visualizer": {
|
||||
|
||||
870
src/i18n/resources/bn.json
Normal file
870
src/i18n/resources/bn.json
Normal file
@ -0,0 +1,870 @@
|
||||
{
|
||||
"common": {
|
||||
"console": {
|
||||
"plugins": {
|
||||
"execute-failed": "প্লাগইন {{pluginName}}::{{contextName}} কার্যকর করতে ব্যর্থ হয়েছে",
|
||||
"executed-at-ms": "প্লাগইন {{pluginName}}::{{contextName}} {{ms}}মিলিসেকেন্ডে কার্যকর হয়েছে",
|
||||
"initialize-failed": "প্লাগইন \"{{pluginName}}\" চালু করতে ব্যর্থ হয়েছে",
|
||||
"load-all": "সকল প্লাগইন লোড করা হচ্ছে",
|
||||
"load-failed": "প্লাগইন \"{{pluginName}}\" লোড হতে ব্যর্থ হয়েছে",
|
||||
"loaded": "প্লাগইন \"{{pluginName}}\" লোড হয়েছে",
|
||||
"unload-failed": "প্লাগইন \"{{pluginName}}\" আনলোড করতে ব্যর্থ হয়েছে",
|
||||
"unloaded": "প্লাগইন \"{{pluginName}}\" আনলোড হয়েছে"
|
||||
}
|
||||
}
|
||||
},
|
||||
"language": {
|
||||
"code": "bn",
|
||||
"local-name": "বাংলা",
|
||||
"name": "Bengali"
|
||||
},
|
||||
"main": {
|
||||
"console": {
|
||||
"did-finish-load": {
|
||||
"dev-tools": "লোড সম্পন্ন হয়েছে। ডেভটুলস খোলা হয়েছে"
|
||||
},
|
||||
"i18n": {
|
||||
"loaded": "i18n লোড হয়েছে"
|
||||
},
|
||||
"second-instance": {
|
||||
"receive-command": "প্রোটোকলের মাধ্যমে কমান্ড গ্রহণ করা হয়েছে: \"{{command}}\""
|
||||
},
|
||||
"theme": {
|
||||
"css-file-not-found": "CSS ফাইল \"{{cssFile}}\" পাওয়া যায়নি, ইগনোর করা হয়েছে"
|
||||
},
|
||||
"unresponsive": {
|
||||
"details": "অকার্যকর ত্রুটি!\n{{error}}"
|
||||
},
|
||||
"when-ready": {
|
||||
"clearing-cache-after-20s": "অ্যাপ ক্যাশ মুছে ফেলা হচ্ছে"
|
||||
},
|
||||
"window": {
|
||||
"tried-to-render-offscreen": "উইন্ডোটি স্ক্রিনের বাইরে রেন্ডার করার চেষ্টা করেছে, windowSize={{windowSize}}, displaySize={{displaySize}}, position={{position}}"
|
||||
}
|
||||
},
|
||||
"dialog": {
|
||||
"hide-menu-enabled": {
|
||||
"detail": "মেনু লুকানো রয়েছে, দেখতে 'Alt' চাপুন ( অথবা ইন-অ্যাপ মেনু ব্যবহার করে থাকলে 'Escape' চাপুন )",
|
||||
"message": "মেনু লুকান সক্রিয় করা হয়েছে",
|
||||
"title": "মেনু লুকান সক্রিয় হয়েছে"
|
||||
},
|
||||
"need-to-restart": {
|
||||
"buttons": {
|
||||
"later": "পরে",
|
||||
"restart-now": "রিস্টার্ট করুন"
|
||||
},
|
||||
"detail": "\"{{pluginName}}\" প্লাগইন কার্যকর করতে পুনরারম্ভ করতে হবে",
|
||||
"message": "\"{{pluginName}}\" পুনরায় চালু করা প্রয়োজন",
|
||||
"title": "পুনরায় চালু করা প্রয়োজন"
|
||||
},
|
||||
"unresponsive": {
|
||||
"buttons": {
|
||||
"quit": "বন্ধ করুন",
|
||||
"relaunch": "পুনরায় চালু করুন",
|
||||
"wait": "অপেক্ষা করুন"
|
||||
},
|
||||
"detail": "অসুবিধার জন্য আমরা দুঃখিত! অনুগ্রহ করে কী করতে চান তা নির্বাচন করুন:",
|
||||
"message": "অ্যাপ্লিকেশনটি কাজ করছে না",
|
||||
"title": "উইন্ডোটি কাজ করছে না"
|
||||
},
|
||||
"update-available": {
|
||||
"buttons": {
|
||||
"disable": "আপডেট বন্ধ করুন",
|
||||
"download": "ডাউনলোড",
|
||||
"ok": "ওকে"
|
||||
},
|
||||
"detail": "একটি নতুন ভার্সন এসেছে এবং এটি {{downloadLink}} থেকে ডাউনলোড করতে পারেন",
|
||||
"message": "একটি নতুন ভার্সন এসেছে",
|
||||
"title": "আপডেট করতে পারেন"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"about": "সম্পর্কে",
|
||||
"navigation": {
|
||||
"label": "নেভিগেশন",
|
||||
"submenu": {
|
||||
"copy-current-url": "বর্তমান URL কপি করুন",
|
||||
"go-back": "পেছনে যান",
|
||||
"go-forward": "সামনে যান",
|
||||
"quit": "বন্ধ",
|
||||
"restart": "অ্যাপ পুনরায় চালু করুন"
|
||||
}
|
||||
},
|
||||
"options": {
|
||||
"label": "অপশন",
|
||||
"submenu": {
|
||||
"advanced-options": {
|
||||
"label": "এডভ্যান্স অপশন",
|
||||
"submenu": {
|
||||
"auto-reset-app-cache": "অ্যাপ চালুর সময় ক্যাশ রিসেট করুন",
|
||||
"disable-hardware-acceleration": "হার্ডওয়্যার অ্যাকসেলারেশন নিষ্ক্রিয় করুন",
|
||||
"edit-config-json": "config.json এডিট করুন",
|
||||
"override-user-agent": "ইউজার এজেন্ট বদলান",
|
||||
"restart-on-config-changes": "কনফিগ পরিবর্তন হলে আবার চালু করুন",
|
||||
"set-proxy": {
|
||||
"label": "প্রক্সি সেট করুন",
|
||||
"prompt": {
|
||||
"label": "প্রক্সি ঠিকানা দিন: (বন্ধ করতে ফাকা রাখুন)",
|
||||
"placeholder": "যেমন: SOCKS5://127.0.0.1:9999",
|
||||
"title": "প্রক্সি সেট করুন"
|
||||
}
|
||||
},
|
||||
"toggle-dev-tools": "ডেভ টুল চালু/বন্ধ"
|
||||
}
|
||||
},
|
||||
"always-on-top": "সবসময় উপরে রাখুন",
|
||||
"auto-update": "স্বয়ংক্রিয় আপডেট চালু করুন",
|
||||
"hide-menu": {
|
||||
"dialog": {
|
||||
"message": "পরবর্তী চালুর সময় মেনু লুকানো থাকবে, দেখতে [Alt] চাপুন (অথবা ইন-অ্যাপ মেনু হলে [`] ব্যবহার করুন)",
|
||||
"title": "মেনু লুকানো হয়েছে"
|
||||
},
|
||||
"label": "মেনু লুকান"
|
||||
},
|
||||
"language": {
|
||||
"dialog": {
|
||||
"message": "পুনরায় চালু করলে ভাষা পরিবর্তন হয়ে যাবে",
|
||||
"title": "ভাষা নির্বাচন করুন"
|
||||
},
|
||||
"label": "ভাষা",
|
||||
"submenu": {
|
||||
"to-help-translate": "অনুবাদে সাহায্য করতে চান? এখানে চাপ দিন"
|
||||
}
|
||||
},
|
||||
"resume-on-start": "অ্যাপ চালু হলে শেষ গানটি আবার চালু করুন",
|
||||
"single-instance-lock": "একক ইনস্ট্যান্স লক",
|
||||
"start-at-login": "লগইনের সময় চালু করুন",
|
||||
"starting-page": {
|
||||
"label": "শুরুর পেজ",
|
||||
"unset": "নির্ধারণ করা হয়নি"
|
||||
},
|
||||
"tray": {
|
||||
"label": "ট্রে",
|
||||
"submenu": {
|
||||
"disabled": "ট্রে বন্ধ",
|
||||
"enabled-and-hide-app": "ট্রে চালু ও অ্যাপ লুকান",
|
||||
"enabled-and-show-app": "ট্রে চালু ও অ্যাপ দেখান",
|
||||
"play-pause-on-click": "ট্রে ক্লিক করলে প্লে/পজ"
|
||||
}
|
||||
},
|
||||
"visual-tweaks": {
|
||||
"label": "দৃষ্টিনন্দন পরিবর্তন",
|
||||
"submenu": {
|
||||
"like-buttons": {
|
||||
"default": "ডিফল্ট লাইক বাটন",
|
||||
"force-show": "সবসময় লাইক বাটন দেখান",
|
||||
"hide": "লাইক বাটন লুকান",
|
||||
"label": "লাইক বাটনের নিয়ন্ত্রণ"
|
||||
},
|
||||
"remove-upgrade-button": "আপগ্রেড বাটন সরান",
|
||||
"theme": {
|
||||
"dialog": {
|
||||
"button": {
|
||||
"cancel": "বাতিল",
|
||||
"remove": "থিম সরান"
|
||||
},
|
||||
"remove-theme": "থিম সরাতে চান?",
|
||||
"remove-theme-message": "এটি কাস্টম থিমটি বাদ দিয়ে দিবে"
|
||||
},
|
||||
"label": "থিম",
|
||||
"submenu": {
|
||||
"import-css-file": "CSS ফাইল ইমপোর্ট করুন",
|
||||
"no-theme": "কোন থিম নেই"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"enabled": "প্লাগইন চালু",
|
||||
"label": "প্লাগইন",
|
||||
"new": "নতুন প্লাগইন"
|
||||
},
|
||||
"view": {
|
||||
"label": "দেখুন",
|
||||
"submenu": {
|
||||
"force-reload": "জোর করে রিফ্রেশ করুন",
|
||||
"reload": "রিফ্রেশ করুন",
|
||||
"reset-zoom": "জুম রিসেট করুন",
|
||||
"toggle-fullscreen": "ফুলস্ক্রিন চালু/বন্ধ",
|
||||
"zoom-in": "বড় করুন",
|
||||
"zoom-out": "ছোট করুন"
|
||||
}
|
||||
}
|
||||
},
|
||||
"tray": {
|
||||
"next": "নেক্সট",
|
||||
"play-pause": "চালু/বন্ধ",
|
||||
"previous": "পূর্ববর্তী",
|
||||
"quit": "বন্ধ",
|
||||
"restart": "অ্যাপ পুনরায় চালু করুন",
|
||||
"show": "উইন্ডো দেখান",
|
||||
"tooltip": {
|
||||
"default": "ইউটিউব মিউজিক",
|
||||
"with-song-info": "ইউটিউব মিউজিক: {{artist}} - {{title}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"ad-speedup": {
|
||||
"description": "বিজ্ঞাপন চললে, এটি অডিও বন্ধ করে দেয় এবং প্লেব্যাক গতি ১৬ গুণ করে দেয়",
|
||||
"name": "বিজ্ঞাপন দ্রুত করুন"
|
||||
},
|
||||
"adblocker": {
|
||||
"description": "সব বিজ্ঞাপন ও ট্র্যাকিং শুরু থেকেই ব্লক করুন",
|
||||
"menu": {
|
||||
"blocker": "ব্লকার"
|
||||
},
|
||||
"name": "এড ব্লকার"
|
||||
},
|
||||
"album-actions": {
|
||||
"description": "প্লেলিস্ট বা অ্যালবামের সব গানেই প্রয়োগ করতে আনডিসলাইক, ডিসলাইক, লাইক ও আনলাইক বাটন যোগ করে",
|
||||
"name": "অ্যালবাম অ্যাকশনসমূহ"
|
||||
},
|
||||
"album-color-theme": {
|
||||
"description": "অ্যালবামের রঙের উপর ভিত্তি করে ডাইনামিক থিম ও ভিজ্যুয়াল ইফেক্ট প্রয়োগ করুন",
|
||||
"menu": {
|
||||
"color-mix-ratio": {
|
||||
"label": "কালার মিক্স রেশিও",
|
||||
"submenu": {
|
||||
"percent": "{{ratio}}%"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "এলবাম এর কালার থিম"
|
||||
},
|
||||
"ambient-mode": {
|
||||
"description": "ভিডিও থেকে নরম আলো ছড়িয়ে আপনার স্ক্রিনের ব্যাকগ্রাউন্ডে লাইটিং ইফেক্ট প্রয়োগ করে",
|
||||
"menu": {
|
||||
"blur-amount": {
|
||||
"label": "ব্লার এর পরিমাণ",
|
||||
"submenu": {
|
||||
"pixels": "{{blurAmount}} পিক্সেল"
|
||||
}
|
||||
},
|
||||
"buffer": {
|
||||
"label": "বাফার",
|
||||
"submenu": {
|
||||
"buffer": "{{buffer}}"
|
||||
}
|
||||
},
|
||||
"opacity": {
|
||||
"label": "স্বচ্ছতা",
|
||||
"submenu": {
|
||||
"percent": "{{opacity}}%"
|
||||
}
|
||||
},
|
||||
"quality": {
|
||||
"label": "কোয়ালিটি",
|
||||
"submenu": {
|
||||
"pixels": "{{quality}}পিক্সেল"
|
||||
}
|
||||
},
|
||||
"size": {
|
||||
"label": "আকার",
|
||||
"submenu": {
|
||||
"percent": "{{size}}শতাংশ"
|
||||
}
|
||||
},
|
||||
"smoothness-transition": {
|
||||
"label": "মসৃণ রূপান্তর",
|
||||
"submenu": {
|
||||
"during": "{{interpolationTime}} সেকেন্ড সময়কালে"
|
||||
}
|
||||
},
|
||||
"use-fullscreen": {
|
||||
"label": "পূর্ণপর্দা ব্যবহার করা"
|
||||
}
|
||||
},
|
||||
"name": "পরিবেষ্টিত মোড"
|
||||
},
|
||||
"amuse": {
|
||||
"description": "ইউটিউব মিউজিকে অ্যামিউজ সমর্থন যোগ করা হয়েছে যা এখন ৬কে ল্যাবস উইজেটে চলছে",
|
||||
"name": "মনোরঞ্জন",
|
||||
"response": {
|
||||
"query": "অ্যামিউজ API সার্ভার চলছে। /query ব্যবহার করে গান সম্পর্কিত তথ্য পান।"
|
||||
}
|
||||
},
|
||||
"api-server": {
|
||||
"description": "প্লেয়ার নিয়ন্ত্রণের জন্য একটি API সার্ভার যোগ করা হয়েছে",
|
||||
"dialog": {
|
||||
"request": {
|
||||
"buttons": {
|
||||
"allow": "অনুমতি দিন",
|
||||
"deny": "অস্বীকার করা"
|
||||
},
|
||||
"message": "{{ID}} ({{origin}}) কে API ব্যবহারের অনুমতি দিবেন?",
|
||||
"title": "API অথোরাইজ এর অনুরোধ"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"auth-strategy": {
|
||||
"label": "অথোরাইজেশন স্ট্র্যাটেজি",
|
||||
"submenu": {
|
||||
"auth-at-first": {
|
||||
"label": "প্রথম অনুরোধে অথোরাইজ করুন"
|
||||
},
|
||||
"none": {
|
||||
"label": "কোন অথোরাইজেশন নেই"
|
||||
}
|
||||
}
|
||||
},
|
||||
"hostname": {
|
||||
"label": "হোস্টনেম"
|
||||
},
|
||||
"port": {
|
||||
"label": "পোর্ট"
|
||||
}
|
||||
},
|
||||
"name": "API সার্ভার [বেটা]",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "API সার্ভারের জন্য হোস্টনেম (যেমন 0.0.0.0) লিখুন:",
|
||||
"title": "হোস্টনেম"
|
||||
},
|
||||
"port": {
|
||||
"label": "API সার্ভারের জন্য পোর্ট লিখুন:",
|
||||
"title": "পোর্ট"
|
||||
}
|
||||
}
|
||||
},
|
||||
"audio-compressor": {
|
||||
"description": "অডিওতে কম্প্রেশন প্রয়োগ করুন (উচ্চতর শব্দের অংশগুলোর ভলিউম কমিয়ে দেয় এবং নীরবতম অংশগুলোর ভলিউম বাড়িয়ে দেয়)",
|
||||
"name": "অডিও কম্প্রেসর"
|
||||
},
|
||||
"auth-proxy-adapter": {
|
||||
"description": "অথেনটিকেশন প্রক্সি সার্ভিস ব্যবহারের সাপোর্ট",
|
||||
"menu": {
|
||||
"disable": "প্রক্সি অ্যাডাপ্টার বন্ধ করুন",
|
||||
"enable": "প্রক্সি অ্যাডাপ্টার চালু করুন",
|
||||
"hostname": {
|
||||
"label": "হোস্টনেম"
|
||||
},
|
||||
"port": {
|
||||
"label": "পোর্ট"
|
||||
}
|
||||
},
|
||||
"name": "অথেনটিকেশন প্রক্সি অ্যাডাপ্টার",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "লোকাল প্রক্সি সার্ভারের জন্য হোস্টনেম লিখুন (পুনরায় চালু করতে হবে):",
|
||||
"title": "প্রক্সি হোস্টনেম"
|
||||
},
|
||||
"port": {
|
||||
"label": "লোকাল প্রক্সি সার্ভারের জন্য পোর্ট লিখুন (পুনরায় চালু করতে হবে):",
|
||||
"title": "প্রক্সি পোর্ট"
|
||||
}
|
||||
}
|
||||
},
|
||||
"blur-nav-bar": {
|
||||
"description": "নেভিগেশন বারকে স্বচ্ছ এবং ঝাপসা করে",
|
||||
"name": "নেভিগেশন বার ঝাপসা করুন"
|
||||
},
|
||||
"bypass-age-restrictions": {
|
||||
"description": "ইউটিউবের বয়স যাচাইকরণ এড়িয়ে যান",
|
||||
"name": "বয়স সীমাবদ্ধতা এড়ান"
|
||||
},
|
||||
"captions-selector": {
|
||||
"description": "ইউটিউব মিউজিক অডিও ট্র্যাকের জন্য ক্যাপশন নির্বাচক",
|
||||
"menu": {
|
||||
"autoload": "সর্বশেষ ব্যবহৃত ক্যাপশন স্বয়ংক্রিয়ভাবে নির্বাচন করুন",
|
||||
"disable-captions": "ডিফল্টভাবে কোন ক্যাপশন নেই"
|
||||
},
|
||||
"name": "ক্যাপশন নির্বাচক",
|
||||
"prompt": {
|
||||
"selector": {
|
||||
"label": "বর্তমান ক্যাপশন ভাষা: {{language}}",
|
||||
"none": "কোনোটি নয়",
|
||||
"title": "ক্যাপশন ভাষা নির্বাচন করুন"
|
||||
}
|
||||
},
|
||||
"templates": {
|
||||
"title": "ক্যাপশন নির্বাচক খুলুন"
|
||||
}
|
||||
},
|
||||
"compact-sidebar": {
|
||||
"description": "সাইডবারকে সবসময় কম্প্যাক্ট মোডে সেট করুন",
|
||||
"name": "কম্প্যাক্ট সাইডবার"
|
||||
},
|
||||
"crossfade": {
|
||||
"description": "গানগুলির মধ্যে ক্রসফেড করুন",
|
||||
"menu": {
|
||||
"advanced": "এডভান্স"
|
||||
},
|
||||
"name": "ক্রসফেড [বেটা]",
|
||||
"prompt": {
|
||||
"options": {
|
||||
"multi-input": {
|
||||
"fade-in-duration": "ফেড-ইন সময়কাল (ms)",
|
||||
"fade-out-duration": "ফেড-আউট সময়কাল (ms)",
|
||||
"fade-scaling": {
|
||||
"label": "ফেড স্কেলিং",
|
||||
"linear": "রৈখিক",
|
||||
"logarithmic": "লগারিদমিক"
|
||||
},
|
||||
"seconds-before-end": "শেষ হওয়ার N সেকেন্ড আগে ক্রসফেড করুন"
|
||||
},
|
||||
"title": "ক্রসফেড অপশনসমূহ"
|
||||
}
|
||||
}
|
||||
},
|
||||
"disable-autoplay": {
|
||||
"description": "গান \"পজ\" মোডে শুরু করে",
|
||||
"menu": {
|
||||
"apply-once": "শুধুমাত্র স্টার্টআপে প্রয়োগ হয়"
|
||||
},
|
||||
"name": "অটোপ্লে বন্ধ করুন"
|
||||
},
|
||||
"discord": {
|
||||
"backend": {
|
||||
"already-connected": "একটিভ সংযোগের সাথে সংযোগ করার চেষ্টা করা হয়েছে",
|
||||
"connected": "ডিসকর্ডের সাথে সংযুক্ত",
|
||||
"disconnected": "ডিসকর্ড থেকে সংযোগ বিচ্ছিন্ন"
|
||||
},
|
||||
"description": "রিচ প্রেজেন্স ব্যবহার করে আপনি কি শুনছেন তা আপনার বন্ধুদের দেখান",
|
||||
"menu": {
|
||||
"auto-reconnect": "স্বয়ংক্রিয় রিকানেক্ট",
|
||||
"clear-activity": "কার্যকলাপ মুছুন",
|
||||
"clear-activity-after-timeout": "সময়সীমা শেষ হওয়ার পরে কার্যকলাপ মুছুন",
|
||||
"connected": "সংযুক্ত",
|
||||
"disconnected": "সংযোগ বিচ্ছিন্ন",
|
||||
"hide-duration-left": "অবশিষ্ট সময় লুকান",
|
||||
"hide-github-button": "গিটহাব লিঙ্ক বাটন লুকান",
|
||||
"play-on-youtube-music": "ইউটিউব মিউজিকে চালান",
|
||||
"set-inactivity-timeout": "নিষ্ক্রিয়তার সময়সীমা সেট করুন"
|
||||
},
|
||||
"name": "ডিসকর্ড রিচ প্রেজেন্স",
|
||||
"prompt": {
|
||||
"set-inactivity-timeout": {
|
||||
"label": "নিষ্ক্রিয়তার সময়সীমা সেকেন্ডে লিখুন:",
|
||||
"title": "নিষ্ক্রিয়তার সময়সীমা সেট করুন"
|
||||
}
|
||||
}
|
||||
},
|
||||
"downloader": {
|
||||
"backend": {
|
||||
"dialog": {
|
||||
"error": {
|
||||
"buttons": {
|
||||
"ok": "ঠিক আছে"
|
||||
},
|
||||
"message": "আহ! দুঃখিত, ডাউনলোড ব্যর্থ হয়েছে…",
|
||||
"title": "ডাউনলোডে সমস্যা!"
|
||||
},
|
||||
"start-download-playlist": {
|
||||
"buttons": {
|
||||
"ok": "ঠিক আছে"
|
||||
},
|
||||
"detail": "({{playlistSize}} টি গান)",
|
||||
"message": "প্লেলিস্ট {{playlistTitle}} ডাউনলোড করা হচ্ছে",
|
||||
"title": "ডাউনলোড শুরু হয়েছে"
|
||||
}
|
||||
},
|
||||
"feedback": {
|
||||
"conversion-progress": "রূপান্তর: {{percent}}%",
|
||||
"converting": "রূপান্তর করা হচ্ছে…",
|
||||
"done": "সম্পন্ন: {{filePath}}",
|
||||
"download-info": "ডাউনলোড হচ্ছে {{artist}} - {{title}} [{{videoId}}",
|
||||
"download-progress": "ডাউনলোড: {{percent}}%",
|
||||
"downloading": "ডাউনলোড হচ্ছে…",
|
||||
"downloading-counter": "ডাউনলোড হচ্ছে {{current}}/{{total}}…",
|
||||
"downloading-playlist": "প্লেলিস্ট \"{{playlistTitle}}\" - {{playlistSize}}টি গান ({{playlistId}}) ডাউনলোড হচ্ছে",
|
||||
"error-while-downloading": "\"{{author}} - {{title}}\" ডাউনলোড করতে সমস্যা: {{error}}",
|
||||
"folder-already-exists": "{{playlistFolder}} ফোল্ডারটি ইতিমধ্যে বিদ্যমান",
|
||||
"getting-playlist-info": "প্লেলিস্ট তথ্য নেওয়া হচ্ছে…",
|
||||
"loading": "লোড হচ্ছে…",
|
||||
"playlist-has-only-one-song": "প্লেলিস্টে শুধুমাত্র একটি আইটেম আছে, সরাসরি ডাউনলোড করা হচ্ছে",
|
||||
"playlist-id-not-found": "কোনো প্লেলিস্ট আইডি পাওয়া যায়নি",
|
||||
"playlist-is-empty": "প্লেলিস্ট খালি",
|
||||
"playlist-is-mix-or-private": "প্লেলিস্ট তথ্য পেতে সমস্যা: নিশ্চিত করুন এটি প্রাইভেট বা \"আপনার জন্য মিক্সড\" প্লেলিস্ট নয়\n\n{{error}}",
|
||||
"preparing-file": "ফাইল প্রস্তুত করা হচ্ছে…",
|
||||
"saving": "সংরক্ষণ করা হচ্ছে…",
|
||||
"trying-to-get-playlist-id": "প্লেলিস্ট আইডি পাওয়ার চেষ্টা করা হচ্ছে: {{playlistId}}",
|
||||
"video-id-not-found": "ভিডিও পাওয়া যায়নি",
|
||||
"writing-id3": "ID3 ট্যাগ লেখা হচ্ছে…"
|
||||
}
|
||||
},
|
||||
"description": "ইন্টারফেস থেকে সরাসরি MP3 / উৎস অডিও ডাউনলোড করে",
|
||||
"menu": {
|
||||
"choose-download-folder": "ডাউনলোড ফোল্ডার বেছে নিন",
|
||||
"download-finish-settings": {
|
||||
"label": "শেষ হলে ডাউনলোড করুন",
|
||||
"prompt": {
|
||||
"last-percent": "x শতাংশ পরে",
|
||||
"last-seconds": "শেষ x সেকেন্ড",
|
||||
"title": "কখন ডাউনলোড করবেন তা কনফিগার করুন"
|
||||
},
|
||||
"submenu": {
|
||||
"advanced": "উন্নত",
|
||||
"enabled": "সক্রিয়",
|
||||
"mode": "টাইম মোড",
|
||||
"percent": "শতাংশ",
|
||||
"seconds": "সেকেন্ড"
|
||||
}
|
||||
},
|
||||
"download-playlist": "প্লেলিস্ট ডাউনলোড করুন",
|
||||
"presets": "প্রিসেট",
|
||||
"skip-existing": "বিদ্যমান ফাইলগুলি এড়িয়ে যান"
|
||||
},
|
||||
"name": "ডাউনলোডার",
|
||||
"renderer": {
|
||||
"can-not-update-progress": "প্রগ্রেস আপডেট করা যাচ্ছে না"
|
||||
},
|
||||
"templates": {
|
||||
"button": "ডাউনলোড"
|
||||
}
|
||||
},
|
||||
"equalizer": {
|
||||
"description": "প্লেয়ারে একটি ইকুয়ালাইজার যোগ করে",
|
||||
"menu": {
|
||||
"presets": {
|
||||
"label": "প্রিসেট",
|
||||
"list": {
|
||||
"bass-booster": "বেস বুস্টার"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "ইকুয়ালাইজার"
|
||||
},
|
||||
"exponential-volume": {
|
||||
"description": "ভলিউম স্লাইডারকে এক্সপোটেনশিয়াল করে তোলে যাতে কম ভলিউম নির্বাচন করা সহজ হয়।",
|
||||
"name": "এক্সপোটেনশিয়াল ভলিউম"
|
||||
},
|
||||
"in-app-menu": {
|
||||
"description": "মেনু-বারগুলোকে আকর্ষণীয়, গাঢ় বা অ্যালবাম-রঙের চেহারা দেয়",
|
||||
"menu": {
|
||||
"hide-dom-window-controls": "DOM উইন্ডো কন্ট্রোলগুলো লুকান"
|
||||
},
|
||||
"name": "অ্যাপ-ভিতরের মেনু"
|
||||
},
|
||||
"lumiastream": {
|
||||
"description": "লুমিয়া স্ট্রিম সমর্থন যোগ করে",
|
||||
"name": "লুমিয়া স্ট্রিম [বেটা]"
|
||||
},
|
||||
"lyrics-genius": {
|
||||
"description": "বেশিরভাগ গানের জন্য লিরিক্স সমর্থন যোগ করে",
|
||||
"menu": {
|
||||
"romanized-lyrics": "রোমানাইজড লিরিক্স"
|
||||
},
|
||||
"name": "লিরিক্স জিনিয়াস",
|
||||
"renderer": {
|
||||
"fetched-lyrics": "জিনিয়াসের জন্য লিরিক্স সংগ্রহ করা হয়েছে"
|
||||
}
|
||||
},
|
||||
"music-together": {
|
||||
"description": "অন্যদের সাথে প্লেলিস্ট শেয়ার করুন। যখন হোস্ট একটি গান বাজায়, অন্য সবাই একই গানটি শুনবে",
|
||||
"dialog": {
|
||||
"enter-host": "হোস্ট আইডি লিখুন"
|
||||
},
|
||||
"internal": {
|
||||
"save": "সংরক্ষণ করুন",
|
||||
"track-source": "ট্র্যাক উৎস",
|
||||
"unknown-user": "অজানা ব্যবহারকারী"
|
||||
},
|
||||
"menu": {
|
||||
"click-to-copy-id": "হোস্ট আইডি কপি করুন",
|
||||
"close": "মিউজিক টুগেদার বন্ধ করুন",
|
||||
"connected-users": "সংযুক্ত ব্যবহারকারীরা",
|
||||
"disconnect": "মিউজিক টুগেদার সংযোগ বিচ্ছিন্ন করুন",
|
||||
"empty-user": "কোন সংযুক্ত ব্যবহারকারী নেই",
|
||||
"host": "মিউজিক টুগেদার হোস্ট",
|
||||
"join": "মিউজিক টুগেদারে যোগ দিন",
|
||||
"permission": {
|
||||
"all": "অতিথিদের প্লেলিস্ট এবং প্লেয়ার নিয়ন্ত্রণ করতে দিন",
|
||||
"host-only": "শুধুমাত্র হোস্ট প্লেলিস্ট এবং প্লেয়ার নিয়ন্ত্রণ করতে পারবেন",
|
||||
"playlist": "অতিথিদের প্লেলিস্ট নিয়ন্ত্রণ করতে দিন"
|
||||
},
|
||||
"set-permission": "নিয়ন্ত্রণ অনুমতি পরিবর্তন করুন",
|
||||
"status": {
|
||||
"disconnected": "সংযোগ বিচ্ছিন্ন",
|
||||
"guest": "অতিথি হিসাবে সংযুক্ত",
|
||||
"host": "হোস্ট হিসাবে সংযুক্ত"
|
||||
}
|
||||
},
|
||||
"name": "মিউজিক টুগেদার [বেটা]",
|
||||
"toast": {
|
||||
"add-song-failed": "গান যোগ করা ব্যর্থ হয়েছে",
|
||||
"closed": "মিউজিক টুগেদার বন্ধ হয়েছে",
|
||||
"disconnected": "মিউজিক টুগেদার সংযোগ বিচ্ছিন্ন হয়েছে",
|
||||
"host-failed": "মিউজিক টুগেদার হোস্ট করা ব্যর্থ হয়েছে",
|
||||
"id-copied": "হোস্ট আইডি ক্লিপবোর্ডে কপি করা হয়েছে",
|
||||
"id-copy-failed": "হোস্ট আইডি ক্লিপবোর্ডে কপি করা ব্যর্থ হয়েছে",
|
||||
"join-failed": "মিউজিক টুগেদারে যোগদান ব্যর্থ হয়েছে",
|
||||
"joined": "মিউজিক টুগেদারে যোগ দেওয়া হয়েছে",
|
||||
"permission-changed": "মিউজিক টুগেদার অনুমতি \"{{permission}}\" এ পরিবর্তন করা হয়েছে",
|
||||
"remove-song-failed": "গান সরানো ব্যর্থ হয়েছে",
|
||||
"user-connected": "{{name}} মিউজিক টুগেদারে যোগ দিয়েছেন",
|
||||
"user-disconnected": "{{name}} মিউজিক টুগেদার ছেড়ে চলে গেছেন"
|
||||
}
|
||||
},
|
||||
"navigation": {
|
||||
"description": "পরবর্তী/পূর্ববর্তী নেভিগেশন তীরগুলি আপনার প্রিয় ব্রাউজারের মতো সরাসরি ইন্টারফেসে অন্তর্ভুক্ত করা হয়েছে",
|
||||
"name": "নেভিগেশন"
|
||||
},
|
||||
"no-google-login": {
|
||||
"description": "ইন্টারফেস থেকে Google লগইন বাটন এবং লিঙ্কগুলি সরান",
|
||||
"name": "গুগল লগইন নয়"
|
||||
},
|
||||
"notifications": {
|
||||
"description": "একটি গান বাজতে শুরু হলে একটি বিজ্ঞপ্তি প্রদর্শন করে (উইন্ডোজে ইন্টারঅ্যাকটিভ বিজ্ঞপ্তিগুলি উপলব্ধ)",
|
||||
"menu": {
|
||||
"interactive": "ইন্টারঅ্যাকটিভ বিজ্ঞপ্তিসমূহ",
|
||||
"interactive-settings": {
|
||||
"label": "ইন্টারঅ্যাকটিভ সেটিংস",
|
||||
"submenu": {
|
||||
"hide-button-text": "বাটন টেক্সট লুকান",
|
||||
"refresh-on-play-pause": "প্লে/পজে রিফ্রেশ করুন",
|
||||
"tray-controls": "ট্রে ক্লিকে খুলুন/বন্ধ করুন"
|
||||
}
|
||||
},
|
||||
"priority": "বিজ্ঞপ্তি অগ্রাধিকার",
|
||||
"toast-style": "টোস্ট স্টাইল",
|
||||
"unpause-notification": "বিরতি থেকে ফিরলে বিজ্ঞপ্তি দেখান"
|
||||
},
|
||||
"name": "বিজ্ঞপ্তিসমূহ"
|
||||
},
|
||||
"performance-improvement": {
|
||||
"description": "পরীক্ষামূলক স্ক্রিপ্টগুলি সক্ষম করে পারফরম্যান্স উন্নত করুন",
|
||||
"name": "পারফরম্যান্স উন্নতিকরণ [বেটা]"
|
||||
},
|
||||
"picture-in-picture": {
|
||||
"description": "অ্যাপকে পিকচার-ইন-পিকচার মোডে স্যুইচ করতে অনুমতি দেয়",
|
||||
"menu": {
|
||||
"always-on-top": "সবসময় উপরে",
|
||||
"hotkey": {
|
||||
"label": "হটকি",
|
||||
"prompt": {
|
||||
"keybind-options": {
|
||||
"hotkey": "হটকি"
|
||||
},
|
||||
"label": "পিকচার-ইন-পিকচার টগল করার জন্য একটি হটকি নির্বাচন করুন",
|
||||
"title": "পিকচার-ইন-পিকচার হটকি"
|
||||
}
|
||||
},
|
||||
"save-window-position": "উইন্ডো অবস্থান সংরক্ষণ করুন",
|
||||
"save-window-size": "উইন্ডো আকার সংরক্ষণ করুন",
|
||||
"use-native-pip": "ব্রাউজারের নেটিভ PiP ব্যবহার করুন"
|
||||
},
|
||||
"name": "পিকচার-ইন-পিকচার",
|
||||
"templates": {
|
||||
"button": "পিকচার-ইন-পিকচার"
|
||||
}
|
||||
},
|
||||
"playback-speed": {
|
||||
"description": "দ্রুত শুনুন, ধীরে শুনুন! গানের গতি নিয়ন্ত্রণ করার জন্য একটি স্লাইডার যোগ করে",
|
||||
"name": "প্লেব্যাক স্পিড",
|
||||
"templates": {
|
||||
"button": "গতি"
|
||||
}
|
||||
},
|
||||
"precise-volume": {
|
||||
"description": "মাউসহুইল/হটকি ব্যবহার করে সঠিকভাবে ভলিউম নিয়ন্ত্রণ করুন, কাস্টম HUD এবং কাস্টমাইজযোগ্য ভলিউম স্টেপ সহ",
|
||||
"menu": {
|
||||
"arrows-shortcuts": "লোকাল অ্যারো-কি কন্ট্রোল",
|
||||
"custom-volume-steps": "কাস্টম ভলিউম স্টেপ সেট করুন",
|
||||
"global-shortcuts": "গ্লোবাল হটকি"
|
||||
},
|
||||
"name": "নির্ভুল ভলিউম",
|
||||
"prompt": {
|
||||
"global-shortcuts": {
|
||||
"keybind-options": {
|
||||
"decrease": "ভলিউম কমান",
|
||||
"increase": "ভলিউম বাড়ান"
|
||||
},
|
||||
"label": "গ্লোবাল ভলিউম কিবাইন্ড নির্বাচন করুন:",
|
||||
"title": "গ্লোবাল ভলিউম কিবাইন্ড"
|
||||
},
|
||||
"volume-steps": {
|
||||
"label": "ভলিউম বৃদ্ধি/হ্রাস স্টেপ নির্বাচন করুন",
|
||||
"title": "ভলিউম স্টেপস"
|
||||
}
|
||||
}
|
||||
},
|
||||
"quality-changer": {
|
||||
"backend": {
|
||||
"dialog": {
|
||||
"quality-changer": {
|
||||
"detail": "বর্তমান কোয়ালিটি: {{quality}}",
|
||||
"message": "ভিডিও কোয়ালিটি নির্বাচন করুন:",
|
||||
"title": "ভিডিও কোয়ালিটি নির্বাচন করুন"
|
||||
}
|
||||
}
|
||||
},
|
||||
"description": "ভিডিও ওভারলেতে একটি বাটনের মাধ্যমে ভিডিও কোয়ালিটি পরিবর্তন করতে দেয়",
|
||||
"name": "ভিডিও কোয়ালিটি পরিবর্তক"
|
||||
},
|
||||
"scrobbler": {
|
||||
"description": "স্ক্রবলিং সমর্থন যোগ করুন (যেমন last.fm, Listenbrainz)",
|
||||
"dialog": {
|
||||
"lastfm": {
|
||||
"auth-failed": {
|
||||
"message": "Last.fm এর সাথে প্রমাণীকরণ ব্যর্থ হয়েছে\nপরবর্তী পুনরায় চালু না হওয়া পর্যন্ত পপআপ লুকান।",
|
||||
"title": "প্রমাণীকরণ ব্যর্থ হয়েছে"
|
||||
}
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"lastfm": {
|
||||
"api-settings": "Last.fm API সেটিংস"
|
||||
},
|
||||
"listenbrainz": {
|
||||
"token": "ListenBrainz ব্যবহারকারী টোকেন লিখুন"
|
||||
},
|
||||
"scrobble-alternative-title": "বিকল্প শিরোনাম ব্যবহার করুন",
|
||||
"scrobble-other-media": "অন্যান্য মিডিয়া স্ক্রবল করুন"
|
||||
},
|
||||
"name": "স্ক্রবলার",
|
||||
"prompt": {
|
||||
"lastfm": {
|
||||
"api-key": "Last.fm API কি",
|
||||
"api-secret": "Last.fm API সিক্রেট"
|
||||
},
|
||||
"listenbrainz": {
|
||||
"token": {
|
||||
"label": "আপনার ListenBrainz ব্যবহারকারী টোকেন লিখুন:",
|
||||
"title": "ListenBrainz টোকেন"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"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": "স্বয়ংক্রিয়ভাবে ইন্ট্রো/আউটট্রো বা মিউজিক ভিডিওর যেসব অংশে গান বাজছে না সেগুলি এড়িয়ে যায়",
|
||||
"name": "স্পনসরব্লক"
|
||||
},
|
||||
"synced-lyrics": {
|
||||
"description": "LRClib এর মত প্রোভাইডার ব্যবহার করে গানের সাথে সিঙ্ক করা লিরিক্স প্রদান করে।",
|
||||
"errors": {
|
||||
"fetch": "⚠️\tলিরিক্স আনার সময় একটি ত্রুটি ঘটেছে।\n\tঅনুগ্রহ করে পরে আবার চেষ্টা করুন।",
|
||||
"not-found": "⚠️ এই গানের জন্য কোন লিরিক্স পাওয়া যায়নি।"
|
||||
},
|
||||
"menu": {
|
||||
"default-text-string": {
|
||||
"label": "লিরিক্সের মাঝে ডিফল্ট অক্ষর",
|
||||
"tooltip": "লিরিক্সের মধ্যে ফাঁকের জন্য ব্যবহৃত ডিফল্ট অক্ষর নির্বাচন করুন"
|
||||
},
|
||||
"line-effect": {
|
||||
"label": "লাইন ইফেক্ট",
|
||||
"submenu": {
|
||||
"fancy": {
|
||||
"label": "ফ্যান্সি",
|
||||
"tooltip": "বর্তমান লাইনে বড়, অ্যাপের মত ইফেক্ট ব্যবহার করুন"
|
||||
},
|
||||
"focus": {
|
||||
"label": "ফোকাস",
|
||||
"tooltip": "শুধুমাত্র বর্তমান লাইনটি সাদা করুন"
|
||||
},
|
||||
"offset": {
|
||||
"label": "অফসেট",
|
||||
"tooltip": "বর্তমান লাইনকে ডানদিকে অফসেট করুন"
|
||||
},
|
||||
"scale": {
|
||||
"label": "স্কেল",
|
||||
"tooltip": "বর্তমান লাইন স্কেল করুন"
|
||||
}
|
||||
},
|
||||
"tooltip": "বর্তমান লাইনে প্রয়োগ করার জন্য ইফেক্ট নির্বাচন করুন"
|
||||
},
|
||||
"precise-timing": {
|
||||
"label": "লিরিক্স পুরোপুরি সিঙ্ক করুন",
|
||||
"tooltip": "পরবর্তী লাইন প্রদর্শনের মিলিসেকেন্ড পর্যন্ত গণনা করুন (পারফরম্যান্সে সামান্য প্রভাব পড়তে পারে)"
|
||||
},
|
||||
"romanization": {
|
||||
"label": "লিরিক্স রোমানাইজ করুন",
|
||||
"tooltip": "যদি লিরিক্স ভিন্ন ভাষায় হয়, তাহলে একটি ল্যাটিন সংস্করণ প্রদর্শন করার চেষ্টা করুন।"
|
||||
},
|
||||
"show-lyrics-even-if-inexact": {
|
||||
"label": "অনির্ভুল হলেও লিরিক্স দেখান",
|
||||
"tooltip": "যদি গানটি না পাওয়া যায়, প্লাগইনটি একটি ভিন্ন অনুসন্ধান কোয়েরি দিয়ে আবার চেষ্টা করে।\nদ্বিতীয় প্রচেষ্টার ফলাফল সঠিক নাও হতে পারে।"
|
||||
},
|
||||
"show-time-codes": {
|
||||
"label": "টাইম কোড দেখান",
|
||||
"tooltip": "লিরিক্সের পাশে টাইম কোড দেখান"
|
||||
}
|
||||
},
|
||||
"name": "সিঙ্ক করা লিরিক্স",
|
||||
"refetch-btn": {
|
||||
"fetching": "আনছে..।",
|
||||
"normal": "লিরিক্স পুনরায় আনুন"
|
||||
},
|
||||
"warnings": {
|
||||
"duration-mismatch": "⚠️ - সময়কাল মিলে না যাওয়ার কারণে লিরিক্স সিঙ্ক হতে নাও পারে।",
|
||||
"inexact": "⚠️ - এই গানের লিরিক্স সঠিক নাও হতে পারে",
|
||||
"instrumental": "⚠️ - এটি একটি ইনস্ট্রুমেন্টাল গান"
|
||||
}
|
||||
},
|
||||
"taskbar-mediacontrol": {
|
||||
"description": "উইন্ডোজ টাস্কবার থেকে প্লেব্যাক নিয়ন্ত্রণ করুন",
|
||||
"name": "টাস্কবার মিডিয়া কন্ট্রোল"
|
||||
},
|
||||
"touchbar": {
|
||||
"description": "macOS ব্যবহারকারীদের জন্য একটি টাচবার উইজেট যোগ করে",
|
||||
"name": "টাচবার"
|
||||
},
|
||||
"tuna-obs": {
|
||||
"description": "OBS এর প্লাগইন টুনার সাথে সংযোগ",
|
||||
"name": "টুনা OBS"
|
||||
},
|
||||
"unobtrusive-player": {
|
||||
"description": "গান চালানোর সময় প্লেয়ারকে পপ আপ হওয়া থেকে বিরত রাখে",
|
||||
"name": "অনাড়ম্বর প্লেয়ার"
|
||||
},
|
||||
"video-toggle": {
|
||||
"description": "ভিডিও/গান মোডের মধ্যে স্যুইচ করার জন্য একটি বাটন যোগ করে। ঐচ্ছিকভাবে সম্পূর্ণ ভিডিও ট্যাবও সরাতে পারে",
|
||||
"menu": {
|
||||
"align": {
|
||||
"label": "সারিবদ্ধকরণ",
|
||||
"submenu": {
|
||||
"left": "বাম",
|
||||
"middle": "মাঝখানে",
|
||||
"right": "ডান"
|
||||
}
|
||||
},
|
||||
"force-hide": "জোর করে ভিডিও ট্যাব সরান",
|
||||
"mode": {
|
||||
"label": "মোড",
|
||||
"submenu": {
|
||||
"custom": "কাস্টম টগল",
|
||||
"disabled": "নিষ্ক্রিয়",
|
||||
"native": "নেটিভ টগল"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "ভিডিও টগল"
|
||||
},
|
||||
"visualizer": {
|
||||
"description": "প্লেয়ারে একটি ভিজ্যুয়ালাইজার যোগ করে",
|
||||
"menu": {
|
||||
"visualizer-type": "ভিজ্যুয়ালাইজার প্রকার"
|
||||
},
|
||||
"name": "ভিজ্যুয়ালাইজার"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -4,11 +4,11 @@
|
||||
"plugins": {
|
||||
"execute-failed": "Ha fallat l'execució de l'extensió {{pluginName}}::{{contextName}}",
|
||||
"executed-at-ms": "L'extensió {{pluginName}}::{{contextName}} s'ha executat als {{ms}}ms",
|
||||
"initialize-failed": "Ha fallat la inicialització de l'extensió «{{pluginName}}»",
|
||||
"initialize-failed": "Ha fallat la inicialització de l'extensió \"{{pluginName}}\"",
|
||||
"load-all": "Carregant totes les extensions",
|
||||
"load-failed": "Error al carregar l'extensió «{{pluginName}}»",
|
||||
"load-failed": "Error en carregar l'extensió «{{pluginName}}»",
|
||||
"loaded": "L'extensió «{{pluginName}}» s'ha carregat",
|
||||
"unload-failed": "Error al deshabilitar l'extensió «{{pluginName}}»",
|
||||
"unload-failed": "Error en deshabilitar l'extensió «{{pluginName}}»",
|
||||
"unloaded": "Extensió «{{pluginName}}» deshabilitada"
|
||||
}
|
||||
}
|
||||
@ -279,6 +279,13 @@
|
||||
},
|
||||
"name": "Mode ambient"
|
||||
},
|
||||
"amuse": {
|
||||
"description": "Afegeix suport a Youtube Music per el widget \"now playing\" d'Amuse per 6K Labs",
|
||||
"name": "Amuse",
|
||||
"response": {
|
||||
"query": "L'API del servidor de Amuse està funcionant. GET /query per tenir informació de la cançó."
|
||||
}
|
||||
},
|
||||
"api-server": {
|
||||
"description": "Afegeix un servidor API per controlar el reproductor",
|
||||
"dialog": {
|
||||
@ -326,6 +333,30 @@
|
||||
"description": "Aplica compressió a l'àudio (baixa el volum de les parts més sorolloses de la senyal d'àudio i puja el volum de les parts més fluixes)",
|
||||
"name": "Compressió d'àudio"
|
||||
},
|
||||
"auth-proxy-adapter": {
|
||||
"description": "Suport per l'ús de servidors d'autenticació proxy",
|
||||
"menu": {
|
||||
"disable": "Desactivar adaptador Proxy",
|
||||
"enable": "Activar adaptador Proxy",
|
||||
"hostname": {
|
||||
"label": "Hostname"
|
||||
},
|
||||
"port": {
|
||||
"label": "Port"
|
||||
}
|
||||
},
|
||||
"name": "Adaptador de proxy d'autenticació",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "Posa hostname pel servidor del proxy local (requereix reiniciar):",
|
||||
"title": "Hostname del proxy"
|
||||
},
|
||||
"port": {
|
||||
"label": "Entra un port pel servidor local del proxy (requereix reiniciar):",
|
||||
"title": "Port proxy"
|
||||
}
|
||||
}
|
||||
},
|
||||
"blur-nav-bar": {
|
||||
"description": "Desenfoca i aplica transparència a la barra de navegació",
|
||||
"name": "Desenfoca la barra de navegació"
|
||||
@ -484,6 +515,18 @@
|
||||
"button": "Descarrega"
|
||||
}
|
||||
},
|
||||
"equalizer": {
|
||||
"description": "Afegeix un equalitzador al reproductor",
|
||||
"menu": {
|
||||
"presets": {
|
||||
"label": "Predefinits",
|
||||
"list": {
|
||||
"bass-booster": "Augmentar baixos"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Equalitzador"
|
||||
},
|
||||
"exponential-volume": {
|
||||
"description": "Fa que el control lliscant del volum sigui exponencial per que sigui més fàcil seleccionar volums més baixos.",
|
||||
"name": "Volum exponencial"
|
||||
@ -581,6 +624,10 @@
|
||||
},
|
||||
"name": "Notificacions"
|
||||
},
|
||||
"performance-improvement": {
|
||||
"description": "Millora el rendiment habilitant scripts experimentals",
|
||||
"name": "Millora del rendiment [Beta]"
|
||||
},
|
||||
"picture-in-picture": {
|
||||
"description": "Permet commutar el mode d'imatge en imatge (PiP)",
|
||||
"menu": {
|
||||
@ -664,6 +711,7 @@
|
||||
"listenbrainz": {
|
||||
"token": "Introduir token d'usuari de ListenBrainz"
|
||||
},
|
||||
"scrobble-alternative-title": "Useu títols alternatius",
|
||||
"scrobble-other-media": "Scrobble amb altres mitjans"
|
||||
},
|
||||
"name": "Scrobbler",
|
||||
@ -714,8 +762,8 @@
|
||||
"synced-lyrics": {
|
||||
"description": "Proporciona lletres sincronitzades amb les cançons, a través de proveïdors com LRClib.",
|
||||
"errors": {
|
||||
"fetch": "⚠️ - Se ha produït un error en descarregar la lletra. Si us plau, intenta-ho més tard.",
|
||||
"not-found": "⚠️ - No s'ha trobat la lletra per aquesta cançó."
|
||||
"fetch": "⚠️\tS'ha produït un error en descarregar la lletra.\n\tSi us plau, intenta-ho més tard.",
|
||||
"not-found": "⚠️ No s'ha trobat la lletra per aquesta cançó."
|
||||
},
|
||||
"menu": {
|
||||
"default-text-string": {
|
||||
@ -725,6 +773,10 @@
|
||||
"line-effect": {
|
||||
"label": "Efecte de la línia",
|
||||
"submenu": {
|
||||
"fancy": {
|
||||
"label": "Caprici",
|
||||
"tooltip": "Utilitza efectes grans \"app-like\" en la línia actual"
|
||||
},
|
||||
"focus": {
|
||||
"label": "Focus",
|
||||
"tooltip": "Mostra tan sols la línia actual en blanc"
|
||||
@ -744,6 +796,10 @@
|
||||
"label": "Fes que les lletres es sincronitzin a la perfecció",
|
||||
"tooltip": "Calcula al mil·lisegon l'aparició de la següent línia (pot tenir un petit impacte en el rendiment)"
|
||||
},
|
||||
"romanization": {
|
||||
"label": "Romanitza les lletres",
|
||||
"tooltip": "Si les lletres són en un idioma diferent, intenta mostrar la versió amb alfabet llatí."
|
||||
},
|
||||
"show-lyrics-even-if-inexact": {
|
||||
"label": "Mostra la lletra tot i que sigui inexacta",
|
||||
"tooltip": "Si no es troba la cançó, el plugin torna a intentar obtenir la lletra amb una cerca diferent.\nEl resultat d'aquesta segona cerca podria no ser exacte."
|
||||
@ -776,6 +832,10 @@
|
||||
"description": "Integració amb l'extensió «Tuna» del OBS",
|
||||
"name": "Tuna OBS"
|
||||
},
|
||||
"unobtrusive-player": {
|
||||
"description": "Impedeix que salti el reproductor mentre se sent una cançó",
|
||||
"name": "Reproductor Discret"
|
||||
},
|
||||
"video-toggle": {
|
||||
"description": "Afegeix un botó per commutar entre el mode de vídeo o de cançó. Opcionalment, es pot eliminar la pestanya de vídeo per complet",
|
||||
"menu": {
|
||||
@ -799,7 +859,7 @@
|
||||
},
|
||||
"name": "Botó de vídeo",
|
||||
"templates": {
|
||||
"button": "Cançó"
|
||||
"button-song": "Cançó"
|
||||
}
|
||||
},
|
||||
"visualizer": {
|
||||
|
||||
@ -394,7 +394,7 @@
|
||||
"connected": "Připojeno k Discordu",
|
||||
"disconnected": "Odpojeno od Discordu"
|
||||
},
|
||||
"description": "Ukažte svým přátelům, co posloucháte s Bohatou přítomností",
|
||||
"description": "Ukažte svým přátelům, co posloucháte pomocí Rich Persence",
|
||||
"menu": {
|
||||
"auto-reconnect": "Automaticky znovu připojit",
|
||||
"clear-activity": "Vymazat aktivitu",
|
||||
@ -406,7 +406,7 @@
|
||||
"play-on-youtube-music": "Hrát na YouTube Music",
|
||||
"set-inactivity-timeout": "Nastavit timeout pro neaktivitu"
|
||||
},
|
||||
"name": "Discord Bohatá přítomnost",
|
||||
"name": "Discord Rich Persence",
|
||||
"prompt": {
|
||||
"set-inactivity-timeout": {
|
||||
"label": "Zadejte timeout neaktivity v sekundách:",
|
||||
@ -765,7 +765,7 @@
|
||||
},
|
||||
"name": "Přepínač videa",
|
||||
"templates": {
|
||||
"button": "Písnička"
|
||||
"button-song": "Písnička"
|
||||
}
|
||||
},
|
||||
"visualizer": {
|
||||
|
||||
@ -333,6 +333,30 @@
|
||||
"description": "Kompressor auf Audio anwenden (senkt die Lautstärke der lautesten Teile des Signals und hebt die Lautstärke der leisesten Teile an)",
|
||||
"name": "Audio-Komprimierer"
|
||||
},
|
||||
"auth-proxy-adapter": {
|
||||
"description": "Unterstützung für Proxy-Authentifizierungsdienste",
|
||||
"menu": {
|
||||
"disable": "Proxy-Adapter deaktivieren",
|
||||
"enable": "Proxy-Adapter aktivieren",
|
||||
"hostname": {
|
||||
"label": "Hostname"
|
||||
},
|
||||
"port": {
|
||||
"label": "Port"
|
||||
}
|
||||
},
|
||||
"name": "Auth Proxy Adapter",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "Hostnamen eingeben für lokalen Proxy-Server (Neustart erforderlich):",
|
||||
"title": "Proxy Hostname"
|
||||
},
|
||||
"port": {
|
||||
"label": "Geben Sie den Port für den lokalen Proxyserver ein (Neustart erforderlich):",
|
||||
"title": "Proxy Port"
|
||||
}
|
||||
}
|
||||
},
|
||||
"blur-nav-bar": {
|
||||
"description": "Macht Navigationsleiste durchsichtig und unscharf",
|
||||
"name": "Verschwommene Navigationsleiste"
|
||||
@ -357,6 +381,11 @@
|
||||
},
|
||||
"templates": {
|
||||
"title": "Untertitelwähler öffnen"
|
||||
},
|
||||
"toast": {
|
||||
"caption-changed": "Untertitel gewechselt zu {{language}}",
|
||||
"caption-disabled": "Untertitel deaktiviert",
|
||||
"no-captions": "Keine Untertitel für dieses Lied verfügbar"
|
||||
}
|
||||
},
|
||||
"compact-sidebar": {
|
||||
@ -523,7 +552,7 @@
|
||||
"menu": {
|
||||
"romanized-lyrics": "Romanisierte Songtexte"
|
||||
},
|
||||
"name": "Liedtexte von Genius",
|
||||
"name": "Songtexte von Genius",
|
||||
"renderer": {
|
||||
"fetched-lyrics": "Liedtexte für Genius abgerufen"
|
||||
}
|
||||
@ -576,7 +605,15 @@
|
||||
},
|
||||
"navigation": {
|
||||
"description": "Vorwärts/Zurück Navigationspfeile direkt in die Oberfläche integriert - wie in deinem geliebten Browser",
|
||||
"name": "Navigation"
|
||||
"name": "Navigation",
|
||||
"templates": {
|
||||
"back": {
|
||||
"title": "Zur vorherigen Seite gehen"
|
||||
},
|
||||
"forward": {
|
||||
"title": "Zur nächsten Seite gehen"
|
||||
}
|
||||
}
|
||||
},
|
||||
"no-google-login": {
|
||||
"description": "Googles Anmelden-Knöpfe und -Links von der Oberfläche entfernen",
|
||||
@ -600,6 +637,10 @@
|
||||
},
|
||||
"name": "Benachrichtigungen"
|
||||
},
|
||||
"performance-improvement": {
|
||||
"description": "Leistung durch Aktivieren experimenteller Skripte verbessern",
|
||||
"name": "Leistungs Verbesserung [Beta]"
|
||||
},
|
||||
"picture-in-picture": {
|
||||
"description": "Erlaubt die App in den Bild-im-Bild-Modus zu wechseln",
|
||||
"menu": {
|
||||
@ -664,7 +705,12 @@
|
||||
}
|
||||
},
|
||||
"description": "Erlaubt die Videoqualität über einen Knopf auf dem Video",
|
||||
"name": "Videoqualitätsänderer"
|
||||
"name": "Videoqualitätsänderer",
|
||||
"renderer": {
|
||||
"quality-settings-button": {
|
||||
"label": "Videoqualität ändern"
|
||||
}
|
||||
}
|
||||
},
|
||||
"scrobbler": {
|
||||
"description": "Scrobbling-Unterstützung aktivieren (z.B. für last.fm, Listenbrainz)",
|
||||
@ -773,7 +819,7 @@
|
||||
"tooltip": "Wenn der Liedtext in einer anderen Schrift ist, zeige nach Möglichkeit eine Version in lateinischer Schrift an."
|
||||
},
|
||||
"show-lyrics-even-if-inexact": {
|
||||
"label": "Zeige die Liedtexte, auch wenn sie ungenau sind.",
|
||||
"label": "Songtext anzeigen, auch wenn er ungenau ist",
|
||||
"tooltip": "Die Erweiterung sucht mit anderen Suchparameter nochmals, wenn der Song nicht gefunden wurde.\nEs kann sein, dass das Ergebnis von der zweiten Anfrage nicht genau ist."
|
||||
},
|
||||
"show-time-codes": {
|
||||
@ -788,7 +834,7 @@
|
||||
},
|
||||
"warnings": {
|
||||
"duration-mismatch": "⚠️ - Es kann sein, dass die Synchronization nicht stimmt, da die Songdauer nicht übereinstimmt.",
|
||||
"inexact": "⚠️ - Es ist Möglich, dass der Songtext für diesen Song nicht übereinstimmt.",
|
||||
"inexact": "⚠️ - Der Songtext stimmt möglicherweise nicht überein",
|
||||
"instrumental": "⚠️ - Das ist ein instrumentales Lied"
|
||||
}
|
||||
},
|
||||
@ -831,7 +877,8 @@
|
||||
},
|
||||
"name": "Videoumschalter",
|
||||
"templates": {
|
||||
"button": "Lied"
|
||||
"button-song": "Lied",
|
||||
"button-video": "Video"
|
||||
}
|
||||
},
|
||||
"visualizer": {
|
||||
|
||||
@ -8,8 +8,8 @@
|
||||
"load-all": "Φόρτωση όλων των πρόσθετων",
|
||||
"load-failed": "Απέτυχε η φόρτωση του πρόσθετου \"{{pluginName}}\"",
|
||||
"loaded": "Το πρόσθετο \"{{pluginName}}\" φορτώθηκε",
|
||||
"unload-failed": "Απέτυχε η απεγκατάσταση του πρόσθετου \"{{pluginName}}\"",
|
||||
"unloaded": "Το πρόσθετο \"{{pluginName}}\" απεγκαταστάθηκε"
|
||||
"unload-failed": "Απέτυχε η κατάργηση φόρτωσης του πρόσθετου \"{{pluginName}}\"",
|
||||
"unloaded": "Η φόρτωση του πρόσθετου \"{{pluginName}}\" καταργήθηκε"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -21,7 +21,7 @@
|
||||
"main": {
|
||||
"console": {
|
||||
"did-finish-load": {
|
||||
"dev-tools": "Η φόρτωση ολοκληρώθηκε. Τα DevTools άνοιξαν"
|
||||
"dev-tools": "Ολοκληρώθηκε η φόρτωση. Τα DevTools άνοιξαν"
|
||||
},
|
||||
"i18n": {
|
||||
"loaded": "Το i18n φορτώθηκε"
|
||||
@ -30,10 +30,10 @@
|
||||
"receive-command": "Λήφθηκε εντολή μέσω πρωτοκόλλου: \"{{command}}\""
|
||||
},
|
||||
"theme": {
|
||||
"css-file-not-found": "Το αρχείο CSS \"{{cssFile}}\" δεν υπάρχει, αγνοείται"
|
||||
"css-file-not-found": "Το αρχείο CSS \"{{cssFile}}\" δεν υπάρχει, αγνόηση"
|
||||
},
|
||||
"unresponsive": {
|
||||
"details": "Σφάλμα ανταπόκρισης!\n{{error}}"
|
||||
"details": "Σφάλμα απόκρισης!\n{{error}}"
|
||||
},
|
||||
"when-ready": {
|
||||
"clearing-cache-after-20s": "Εκκαθάριση μνήμης cache εφαρμογής"
|
||||
@ -59,13 +59,13 @@
|
||||
},
|
||||
"unresponsive": {
|
||||
"buttons": {
|
||||
"quit": "Παραιτηθείτε",
|
||||
"quit": "Τερματισμός",
|
||||
"relaunch": "Επανεκκίνηση",
|
||||
"wait": "Περιμένετε"
|
||||
"wait": "Αναμονή"
|
||||
},
|
||||
"detail": "Λυπούμαστε για την ταλαιπωρία! Παρακαλώ επιλέξτε τι να κάνετε:",
|
||||
"message": "Η εφαρμογή δεν ανταποκρίνεται",
|
||||
"title": "Το παράθυρο δεν ανταποκρίνεται"
|
||||
"message": "Η εφαρμογή δεν αποκρίνεται",
|
||||
"title": "Το παράθυρο δεν αποκρίνεται"
|
||||
},
|
||||
"update-available": {
|
||||
"buttons": {
|
||||
@ -79,7 +79,7 @@
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"about": "Σχετικά",
|
||||
"about": "Πληροφορίες",
|
||||
"navigation": {
|
||||
"label": "Πλοήγηση",
|
||||
"submenu": {
|
||||
@ -117,7 +117,7 @@
|
||||
"hide-menu": {
|
||||
"dialog": {
|
||||
"message": "Το μενού θα κρυφτεί στην επόμενη εκκίνηση, χρησιμοποιήστε [Alt] για να το εμφανίσετε (ή το πλήκτρο backtick [`] αν χρησιμοποιείτε το μενού εφαρμογής)",
|
||||
"title": "Η Δυνατότητα Απόκρυψης του Μενού ενεργοποιήθηκε"
|
||||
"title": "Η απόκρυψη μενού ενεργοποιήθηκε"
|
||||
},
|
||||
"label": "Απόκρυψη μενού"
|
||||
},
|
||||
@ -154,7 +154,7 @@
|
||||
"default": "Προεπιλογή",
|
||||
"force-show": "Επιβολή εμφάνισης",
|
||||
"hide": "Απόκρυψη",
|
||||
"label": "Μου αρέσει"
|
||||
"label": "Κουμπιά Μου αρέσει"
|
||||
},
|
||||
"remove-upgrade-button": "Αφαίρεση κουμπιού αναβάθμισης",
|
||||
"theme": {
|
||||
@ -201,8 +201,8 @@
|
||||
"restart": "Επανεκκίνηση εφαρμογής",
|
||||
"show": "Εμφάνιση παραθύρου",
|
||||
"tooltip": {
|
||||
"default": "YouTube Μουσική",
|
||||
"with-song-info": "YouTube Μουσική: {{artist}} - {{title}}"
|
||||
"default": "YouTube Music",
|
||||
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -214,16 +214,16 @@
|
||||
"adblocker": {
|
||||
"description": "Αποκλεισμός όλων των διαφημίσεων και tracker",
|
||||
"menu": {
|
||||
"blocker": "Μέθοδος αποκλεισμού"
|
||||
"blocker": "Πρόγραμμα αποκλεισμού"
|
||||
},
|
||||
"name": "Μπλοκάρισμα Διαφημίσεων"
|
||||
"name": "Πρόγραμμα αποκλεισμού διαφημίσεων"
|
||||
},
|
||||
"album-actions": {
|
||||
"description": "Προσθέτει κουμπιά Like/Unlike και Dislike/Undislike που δρουν συνολικά σε όλα τα κομμάτια μιας playlist ή ενός άλμπουμ",
|
||||
"name": "Ενέργειες σε Άλμπουμ"
|
||||
},
|
||||
"album-color-theme": {
|
||||
"description": "Εφαρμόζει ένα δυναμικό θέμα και εφέ με βάση τη χρωματική παλέτα του άλμπουμ",
|
||||
"description": "Εφαρμόζει ένα δυναμικό θέμα και οπτικά εφέ με βάση τη χρωματική παλέτα του άλμπουμ",
|
||||
"menu": {
|
||||
"color-mix-ratio": {
|
||||
"label": "Αναλογία μίξης χρωμάτων",
|
||||
@ -333,6 +333,30 @@
|
||||
"description": "Συμπίεση ήχου (μειώνει την ένταση των πιο δυνατών τμημάτων του κύματος και αυξάνει την ένταση των πιο μαλακών τμημάτων)",
|
||||
"name": "Συμπιεστής ήχου"
|
||||
},
|
||||
"auth-proxy-adapter": {
|
||||
"description": "Υποστήριξη για τη χρήση υπηρεσιών μεσολάβησης αυθεντικοποίησης",
|
||||
"menu": {
|
||||
"disable": "Απενεργοποίηση προσαρμογέα μεσολάβησης",
|
||||
"enable": "Ενεργοποίηση προσαρμογέα μεσολάβησης",
|
||||
"hostname": {
|
||||
"label": "Όνομα οικοδεσπότη"
|
||||
},
|
||||
"port": {
|
||||
"label": "Θύρα"
|
||||
}
|
||||
},
|
||||
"name": "Προσαρμογέας μεσολάβησης Auth",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "Εισάγετε το όνομα κεντρικού υπολογιστή για τον τοπικό διακομιστή μεσολάβησης (απαιτείται επανεκκίνηση):",
|
||||
"title": "Όνομα κεντρικού υπολογιστή μεσολάβησης"
|
||||
},
|
||||
"port": {
|
||||
"label": "Εισάγετε τη θύρα για τον τοπικό διακομιστή μεσολάβησης (απαιτεί επανεκκίνηση):",
|
||||
"title": "Θύρα διακομιστή μεσολάβησης"
|
||||
}
|
||||
}
|
||||
},
|
||||
"blur-nav-bar": {
|
||||
"description": "θέτει τη γραμμή πλοήγησης διαφανή και θολή",
|
||||
"name": "Θόλωμα γραμμής πλοήγησης"
|
||||
@ -600,6 +624,10 @@
|
||||
},
|
||||
"name": "Ειδοποιήσεις"
|
||||
},
|
||||
"performance-improvement": {
|
||||
"description": "Βελτιώστε την απόδοση ενεργοποιώντας πειραματικές δέσμες ενεργειών",
|
||||
"name": "Βελτίωση της απόδοσης με την ενεργοποίηση επικίνδυνων σεναρίωνΒελτίωση της απόδοσης [Beta]"
|
||||
},
|
||||
"picture-in-picture": {
|
||||
"description": "Επιτρέπει την εναλλαγή της εφαρμογής σε λειτουργία εικόνας σε εικόνα",
|
||||
"menu": {
|
||||
@ -831,7 +859,7 @@
|
||||
},
|
||||
"name": "Εναλλαγή βίντεο",
|
||||
"templates": {
|
||||
"button": "Τραγούδι"
|
||||
"button-song": "Τραγούδι"
|
||||
}
|
||||
},
|
||||
"visualizer": {
|
||||
|
||||
@ -333,6 +333,30 @@
|
||||
"description": "Apply compression to audio (lowers the volume of the loudest parts of the signal and raises the volume of the softest parts)",
|
||||
"name": "Audio Compressor"
|
||||
},
|
||||
"auth-proxy-adapter": {
|
||||
"name": "Auth Proxy Adapter",
|
||||
"description": "Support for the use of authentication proxy services",
|
||||
"menu": {
|
||||
"disable": "Disable Proxy Adapter",
|
||||
"enable": "Enable Proxy Adapter",
|
||||
"hostname": {
|
||||
"label": "Hostname"
|
||||
},
|
||||
"port": {
|
||||
"label": "Port"
|
||||
}
|
||||
},
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"title": "Proxy Hostname",
|
||||
"label": "Enter hostname for local proxy server (requires restart):"
|
||||
},
|
||||
"port": {
|
||||
"title": "Proxy Port",
|
||||
"label": "Enter port for local proxy server (requires restart):"
|
||||
}
|
||||
}
|
||||
},
|
||||
"blur-nav-bar": {
|
||||
"description": "Makes navigation bar transparent and blurry",
|
||||
"name": "Blur Navigation Bar"
|
||||
@ -357,6 +381,11 @@
|
||||
},
|
||||
"templates": {
|
||||
"title": "Open captions selector"
|
||||
},
|
||||
"toast": {
|
||||
"caption-changed": "Caption changed to {{language}}",
|
||||
"caption-disabled": "Captions disabled",
|
||||
"no-captions": "No captions available for this song"
|
||||
}
|
||||
},
|
||||
"compact-sidebar": {
|
||||
@ -491,6 +520,18 @@
|
||||
"button": "Download"
|
||||
}
|
||||
},
|
||||
"equalizer": {
|
||||
"description": "Adds an equalizer to the player",
|
||||
"menu": {
|
||||
"presets": {
|
||||
"label": "Presets",
|
||||
"list": {
|
||||
"bass-booster": "Bass booster"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Equalizer"
|
||||
},
|
||||
"exponential-volume": {
|
||||
"description": "Makes the volume slider exponential so it's easier to select lower volumes.",
|
||||
"name": "Exponential Volume"
|
||||
@ -564,7 +605,15 @@
|
||||
},
|
||||
"navigation": {
|
||||
"description": "Next/Back navigation arrows directly integrated in the interface, like in your favorite browser",
|
||||
"name": "Navigation"
|
||||
"name": "Navigation",
|
||||
"templates": {
|
||||
"back": {
|
||||
"title": "Go to previous page"
|
||||
},
|
||||
"forward": {
|
||||
"title": "Go to next page"
|
||||
}
|
||||
}
|
||||
},
|
||||
"no-google-login": {
|
||||
"description": "Remove Google login buttons and links from the interface",
|
||||
@ -589,7 +638,7 @@
|
||||
"name": "Notifications"
|
||||
},
|
||||
"performance-improvement": {
|
||||
"description": "Improve performance by enabling dangerous scripts",
|
||||
"description": "Improve performance by enabling experimental scripts",
|
||||
"name": "Performance improvement [Beta]"
|
||||
},
|
||||
"picture-in-picture": {
|
||||
@ -655,6 +704,11 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"renderer": {
|
||||
"quality-settings-button": {
|
||||
"label": "Open player quality changer"
|
||||
}
|
||||
},
|
||||
"description": "Allows changing the video quality with a button on the video overlay",
|
||||
"name": "Video Quality Changer"
|
||||
},
|
||||
@ -675,8 +729,8 @@
|
||||
"listenbrainz": {
|
||||
"token": "Enter ListenBrainz user token"
|
||||
},
|
||||
"scrobble-other-media": "Scrobble other media",
|
||||
"scrobble-alternative-title": "Use alternative titles"
|
||||
"scrobble-alternative-title": "Use alternative titles",
|
||||
"scrobble-other-media": "Scrobble other media"
|
||||
},
|
||||
"name": "Scrobbler",
|
||||
"prompt": {
|
||||
@ -823,7 +877,8 @@
|
||||
},
|
||||
"name": "Video Toggle",
|
||||
"templates": {
|
||||
"button": "Song"
|
||||
"button-song": "Song",
|
||||
"button-video": "Video"
|
||||
}
|
||||
},
|
||||
"visualizer": {
|
||||
@ -832,18 +887,6 @@
|
||||
"visualizer-type": "Visualizer Type"
|
||||
},
|
||||
"name": "Visualizer"
|
||||
},
|
||||
"equalizer": {
|
||||
"description": "Adds an equalizer to the player",
|
||||
"name": "Equalizer",
|
||||
"menu": {
|
||||
"presets": {
|
||||
"label": "Presets",
|
||||
"list": {
|
||||
"bass-booster": "Bass booster"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -333,6 +333,30 @@
|
||||
"description": "Aplicar compresión al audio (reduce la diferencia entre las partes más fuertes y más suaves de una pista para que tenga un nivel más consistente)",
|
||||
"name": "Compresor de audio"
|
||||
},
|
||||
"auth-proxy-adapter": {
|
||||
"description": "Soporte para el uso de servicios de proxy de autenticación",
|
||||
"menu": {
|
||||
"disable": "Deshabilitar el adaptador proxy",
|
||||
"enable": "Habilitar el adaptador proxy",
|
||||
"hostname": {
|
||||
"label": "Nombre de host"
|
||||
},
|
||||
"port": {
|
||||
"label": "Puerto"
|
||||
}
|
||||
},
|
||||
"name": "Adaptador de proxy de autenticación",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "Ingrese el nombre de host del servidor proxy local (requiere reinicio):",
|
||||
"title": "Nombre de host del proxy"
|
||||
},
|
||||
"port": {
|
||||
"label": "Ingrese el puerto para el servidor de proxy local (requiere reinicio):",
|
||||
"title": "Puerto de proxy"
|
||||
}
|
||||
}
|
||||
},
|
||||
"blur-nav-bar": {
|
||||
"description": "Hace que la barra de navegación se vea transparente y borrosa",
|
||||
"name": "Desenfocar barra de navegación"
|
||||
@ -600,6 +624,10 @@
|
||||
},
|
||||
"name": "Notificaciones"
|
||||
},
|
||||
"performance-improvement": {
|
||||
"description": "Mejore el rendimiento habilitando scripts experimentales",
|
||||
"name": "Mejora del rendimiento [Beta]"
|
||||
},
|
||||
"picture-in-picture": {
|
||||
"description": "Permite cambiar la aplicación al modo picture-in-picture",
|
||||
"menu": {
|
||||
@ -806,7 +834,7 @@
|
||||
},
|
||||
"unobtrusive-player": {
|
||||
"description": "Evita que el reproductor aparezca al reproducir una canción",
|
||||
"name": "Jugador discreto"
|
||||
"name": "Reproductor discreto"
|
||||
},
|
||||
"video-toggle": {
|
||||
"description": "Añade un botón para cambiar entre el modo Vídeo/Canción. También puede eliminar opcionalmente toda la pestaña de vídeo",
|
||||
@ -831,7 +859,7 @@
|
||||
},
|
||||
"name": "Alternador de vídeo",
|
||||
"templates": {
|
||||
"button": "Canción"
|
||||
"button-song": "Canción"
|
||||
}
|
||||
},
|
||||
"visualizer": {
|
||||
|
||||
@ -65,10 +65,12 @@
|
||||
"ok": "Sobib"
|
||||
},
|
||||
"detail": "Saadaval on uus versioon, ning seda saad alla laadida siit {{downloadLink}}",
|
||||
"message": "Uus versioon on saadaval"
|
||||
"message": "Uus versioon on saadaval",
|
||||
"title": "Rakenduse uuendus on saadaval"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"about": "Rakenduse teave",
|
||||
"navigation": {
|
||||
"label": "Liikumine",
|
||||
"submenu": {
|
||||
@ -89,7 +91,18 @@
|
||||
"disable-hardware-acceleration": "Lülita raudvaraline kiirendamine välja",
|
||||
"edit-config-json": "Muuda config.json faili"
|
||||
}
|
||||
}
|
||||
},
|
||||
"language": {
|
||||
"dialog": {
|
||||
"message": "Keele muutmine jõustub peale uuesti käivitamist",
|
||||
"title": "Keel on muutunud"
|
||||
},
|
||||
"label": "Keel",
|
||||
"submenu": {
|
||||
"to-help-translate": "Soovid aidata tõlkimisel? Klõpsi siin"
|
||||
}
|
||||
},
|
||||
"resume-on-start": "Rakenduse käivitamisel jätka viimatiesitatud loo esitamist"
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
@ -98,6 +111,7 @@
|
||||
},
|
||||
"view": {
|
||||
"submenu": {
|
||||
"toggle-fullscreen": "Lülita täisekraanivaade sisse/välja",
|
||||
"zoom-in": "Suumi sisse",
|
||||
"zoom-out": "Suumi välja"
|
||||
}
|
||||
@ -140,6 +154,12 @@
|
||||
"submenu": {
|
||||
"pixels": "{{quality}} pikslit"
|
||||
}
|
||||
},
|
||||
"size": {
|
||||
"label": "Suurus",
|
||||
"submenu": {
|
||||
"percent": "{{size}}%"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
7
src/i18n/resources/eu.json
Normal file
7
src/i18n/resources/eu.json
Normal file
@ -0,0 +1,7 @@
|
||||
{
|
||||
"language": {
|
||||
"code": "eu",
|
||||
"local-name": "Euskara",
|
||||
"name": "Basque"
|
||||
}
|
||||
}
|
||||
@ -333,6 +333,30 @@
|
||||
"description": "اعمال فشردهسازی به صدا (کاهش حجم بلندترین بخشهای سیگنال و افزایش حجم بخشهای نرمتر)",
|
||||
"name": "فشردهساز صدا"
|
||||
},
|
||||
"auth-proxy-adapter": {
|
||||
"description": "پشتیبانی برای استفاده از سرویسهای پروکسی احراز هویت",
|
||||
"menu": {
|
||||
"disable": "غیرفعال کردن آداپتور پروکسی",
|
||||
"enable": "فعال کردن آداپتور پروکسی",
|
||||
"hostname": {
|
||||
"label": "نام میزبان"
|
||||
},
|
||||
"port": {
|
||||
"label": "پورت"
|
||||
}
|
||||
},
|
||||
"name": "آداپتور پروکسی احراز هویت",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "نام میزبان را برای سرور پروکسی محلی وارد کنید (نیاز به راه اندازی مجدد دارد):",
|
||||
"title": "پروکسی نام میزبان"
|
||||
},
|
||||
"port": {
|
||||
"label": "پورت مربوط به پروکسی سرور محلی را وارد کنید(نیاز به راه اندازی مجدد دارد):",
|
||||
"title": "پورت پروکسی"
|
||||
}
|
||||
}
|
||||
},
|
||||
"blur-nav-bar": {
|
||||
"description": "شفاف و محو کردن نوار کنترل",
|
||||
"name": "محو کردن نوار کنترل"
|
||||
@ -357,6 +381,11 @@
|
||||
},
|
||||
"templates": {
|
||||
"title": "باز کردن انتخابکننده زیرنویس"
|
||||
},
|
||||
"toast": {
|
||||
"caption-changed": "زیرنویس تغییر کرد به {{language}}",
|
||||
"caption-disabled": "زیرنویس غیرفعال شده",
|
||||
"no-captions": "برای این آهنگ زیرنویسی موجود نیست"
|
||||
}
|
||||
},
|
||||
"compact-sidebar": {
|
||||
@ -576,7 +605,15 @@
|
||||
},
|
||||
"navigation": {
|
||||
"description": "بعدی/قبلی به طور مستقیم در رابط یکپارچه شدهاند، مانند مرورگر مورد علاقه شما",
|
||||
"name": "کنترل های رابط"
|
||||
"name": "کنترل های رابط",
|
||||
"templates": {
|
||||
"back": {
|
||||
"title": "برو به صفحه قبل"
|
||||
},
|
||||
"forward": {
|
||||
"title": "برو به صفحه بعد"
|
||||
}
|
||||
}
|
||||
},
|
||||
"no-google-login": {
|
||||
"description": "حذف دکمهها و لینکهای ورود به گوگل از رابط کاربری",
|
||||
@ -600,6 +637,10 @@
|
||||
},
|
||||
"name": "اعلانها"
|
||||
},
|
||||
"performance-improvement": {
|
||||
"description": "بهبود عملکرد با فعال کردن اسکریپتهای آزمایشی",
|
||||
"name": "بهبود عملکرد [بتا]"
|
||||
},
|
||||
"picture-in-picture": {
|
||||
"description": "اجازه میدهد تا برنامه به حالت تصویر در تصویر تغییر کند",
|
||||
"menu": {
|
||||
@ -664,7 +705,12 @@
|
||||
}
|
||||
},
|
||||
"description": "امکان تغییر کیفیت ویدیو با استفاده از دکمه در رابط پخش ویدیو",
|
||||
"name": "تغییر دهنده کیفیت ویدیو"
|
||||
"name": "تغییر دهنده کیفیت ویدیو",
|
||||
"renderer": {
|
||||
"quality-settings-button": {
|
||||
"label": "باز کردن تغییر دهنده کیفیت پخش کننده"
|
||||
}
|
||||
}
|
||||
},
|
||||
"scrobbler": {
|
||||
"description": "اضافه کردن پشتیبانی از اسکرابلینگ (etc. last.fm, Listenbrainz)",
|
||||
@ -831,7 +877,8 @@
|
||||
},
|
||||
"name": "ویدیو به آهنگ",
|
||||
"templates": {
|
||||
"button": "ترانه"
|
||||
"button-song": "ترانه",
|
||||
"button-video": "ویدیو"
|
||||
}
|
||||
},
|
||||
"visualizer": {
|
||||
|
||||
@ -571,6 +571,10 @@
|
||||
},
|
||||
"name": "Mga Abiso"
|
||||
},
|
||||
"performance-improvement": {
|
||||
"description": "Pagbutihin ang performance sa pamamagitan ng pagpapagana ng mga mapanganib na script",
|
||||
"name": "Pagpapabuti ng performance [Beta]"
|
||||
},
|
||||
"picture-in-picture": {
|
||||
"description": "Payagan ang pag-palit ng app sa picture-in-picture mode",
|
||||
"menu": {
|
||||
@ -780,7 +784,7 @@
|
||||
}
|
||||
},
|
||||
"templates": {
|
||||
"button": "Kanta"
|
||||
"button-song": "Kanta"
|
||||
}
|
||||
},
|
||||
"visualizer": {
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
"execute-failed": "Échec de l'exécution du plugin {{pluginName}}::{{contextName}}",
|
||||
"executed-at-ms": "Plugin {{pluginName}}::{{contextName}} exécuté en {{ms}}ms",
|
||||
"initialize-failed": "Échec de l'initialisation du plugin \"{{pluginName}}\"",
|
||||
"load-all": "Chargement des plugins",
|
||||
"load-all": "Chargement de tous les plugins",
|
||||
"load-failed": "Échec du chargement du plugin \"{{pluginName}}\"",
|
||||
"loaded": "Plugin \"{{pluginName}}\" chargé",
|
||||
"unload-failed": "Échec du déchargement du plugin \"{{pluginName}}\"",
|
||||
@ -27,7 +27,7 @@
|
||||
"loaded": "i18n chargé"
|
||||
},
|
||||
"second-instance": {
|
||||
"receive-command": "Received command over protocol : \"{{command}}\""
|
||||
"receive-command": "Received command over protocol : \"{{command}}\""
|
||||
},
|
||||
"theme": {
|
||||
"css-file-not-found": "Le fichier de CSS \"{{cssFile}}\" n'existe pas, ignorer"
|
||||
@ -333,6 +333,30 @@
|
||||
"description": "Appliquer une compression à l'audio (diminue le volume des parties les plus fortes du signal et augmente le volume des parties les plus faibles)",
|
||||
"name": "Compresseur audio"
|
||||
},
|
||||
"auth-proxy-adapter": {
|
||||
"description": "Prise en charge de l'utilisation des services de proxy d'authentification",
|
||||
"menu": {
|
||||
"disable": "Désactiver l'Adaptateur Proxy",
|
||||
"enable": "Activer l'Adaptateur Proxy",
|
||||
"hostname": {
|
||||
"label": "Nom d'hôte"
|
||||
},
|
||||
"port": {
|
||||
"label": "Port"
|
||||
}
|
||||
},
|
||||
"name": "Adaptateur de Proxy d'Authentification",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "Saisir le nom d'hôte pour le serveur proxy local (nécessite un redémarrage) :",
|
||||
"title": "Nom d'hôte du proxy"
|
||||
},
|
||||
"port": {
|
||||
"label": "Saisir le port pour le serveur proxy local (nécessite un redémarrage) :",
|
||||
"title": "Port du proxy"
|
||||
}
|
||||
}
|
||||
},
|
||||
"blur-nav-bar": {
|
||||
"description": "Rend la barre de navigation transparente et floue",
|
||||
"name": "Barre de navigation floue"
|
||||
@ -600,6 +624,10 @@
|
||||
},
|
||||
"name": "Notifications"
|
||||
},
|
||||
"performance-improvement": {
|
||||
"description": "Améliorer les performances en activant les scripts expérimentaux",
|
||||
"name": "Amélioration des performances [Beta]"
|
||||
},
|
||||
"picture-in-picture": {
|
||||
"description": "Permet de basculer l’application en mode image dans image",
|
||||
"menu": {
|
||||
@ -831,7 +859,7 @@
|
||||
},
|
||||
"name": "Basculer la vidéo",
|
||||
"templates": {
|
||||
"button": "Musique"
|
||||
"button-song": "Musique"
|
||||
}
|
||||
},
|
||||
"visualizer": {
|
||||
|
||||
7
src/i18n/resources/gl.json
Normal file
7
src/i18n/resources/gl.json
Normal file
@ -0,0 +1,7 @@
|
||||
{
|
||||
"language": {
|
||||
"code": "gl",
|
||||
"local-name": "Galego",
|
||||
"name": "Galician"
|
||||
}
|
||||
}
|
||||
@ -182,10 +182,10 @@
|
||||
"new": "חדש"
|
||||
},
|
||||
"view": {
|
||||
"label": "מראה",
|
||||
"label": "צפה",
|
||||
"submenu": {
|
||||
"force-reload": "התחל מחדש בכוח",
|
||||
"reload": "טען מחדש",
|
||||
"reload": "רענון",
|
||||
"reset-zoom": "גודל אמיתי",
|
||||
"toggle-fullscreen": "מסך מלא",
|
||||
"zoom-in": "התקרב",
|
||||
@ -226,6 +226,7 @@
|
||||
"description": "מחיל נושא דינמי ואפקטים חזותיים המבוססים על לוח הצבעים של האלבום",
|
||||
"menu": {
|
||||
"color-mix-ratio": {
|
||||
"label": "יחס ערבוב צבעים",
|
||||
"submenu": {
|
||||
"percent": "{{ratio}}%"
|
||||
}
|
||||
@ -266,6 +267,7 @@
|
||||
}
|
||||
},
|
||||
"smoothness-transition": {
|
||||
"label": "מעבר חלק",
|
||||
"submenu": {
|
||||
"during": "במהלך {{interpolationTime}} שניות"
|
||||
}
|
||||
@ -277,10 +279,145 @@
|
||||
"name": "מצב אווירה"
|
||||
},
|
||||
"amuse": {
|
||||
"description": "מוסיף תמיכה ב-YouTube Music עבור הווידג'ט של Amuse המתנגן כעת על ידי 6K Labs"
|
||||
"description": "מוסיף תמיכה ב-YouTube Music עבור הווידג'ט של Amuse המתנגן כעת על ידי 6K Labs",
|
||||
"name": "משעשע",
|
||||
"response": {
|
||||
"query": "שרת ה-API של Amuse פועל. קבל מידע על השיר באמצעות GET /query."
|
||||
}
|
||||
},
|
||||
"api-server": {
|
||||
"description": "הוסף כתובת שירות כדי לשלוט בנגן",
|
||||
"dialog": {
|
||||
"request": {
|
||||
"buttons": {
|
||||
"allow": "מותר",
|
||||
"deny": "לדחות"
|
||||
},
|
||||
"message": "אפשר ל {{ID}}{{origin}} לגשת לשירות?",
|
||||
"title": "בקשת לאימות השירות"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"auth-strategy": {
|
||||
"label": "שיטת אימות",
|
||||
"submenu": {
|
||||
"auth-at-first": {
|
||||
"label": "לאמת בבקשה הראשונה"
|
||||
},
|
||||
"none": {
|
||||
"label": "ללא אימות"
|
||||
}
|
||||
}
|
||||
},
|
||||
"hostname": {
|
||||
"label": "שם שרת אחסון"
|
||||
},
|
||||
"port": {
|
||||
"label": "פורט"
|
||||
}
|
||||
},
|
||||
"name": "כתובת שירות (בטא)",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "הכנסת את כתובת IP של השרת (לדוגמה 0.0.0.0) לשירות:",
|
||||
"title": "שם שרת אחסון"
|
||||
},
|
||||
"port": {
|
||||
"label": "הכנסת מספר פורט של השירות:",
|
||||
"title": "פורט"
|
||||
}
|
||||
}
|
||||
},
|
||||
"audio-compressor": {
|
||||
"description": "החל דחיסה על אודיו (מורידה את עוצמת הקול של החלקים הרועשים ביותר של האות ומעלה את עוצמת הקול של החלקים החלשים ביותר)",
|
||||
"name": "דוחס ומצפין קול"
|
||||
},
|
||||
"auth-proxy-adapter": {
|
||||
"description": "תמיכה בשימוש בשירותי פרוקסי אימות",
|
||||
"menu": {
|
||||
"disable": "השבת מתאם פרוקסי",
|
||||
"enable": "הפעל מתאם פרוקסי",
|
||||
"hostname": {
|
||||
"label": "שם שרת מאחסן"
|
||||
},
|
||||
"port": {
|
||||
"label": "פורט"
|
||||
}
|
||||
},
|
||||
"name": "מתאם זיהוי פרוקסי",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "הזן שם מארח עבור שרת הפרוקסי המקומי (דורש הפעלה מחדש):",
|
||||
"title": "שם פרוקסי של שרת מאחסן"
|
||||
},
|
||||
"port": {
|
||||
"label": "הזן פורט עבור שרת הפרוקסי המקומי (דורש הפעלה מחדש):",
|
||||
"title": "יציאת פרוקסי"
|
||||
}
|
||||
}
|
||||
},
|
||||
"blur-nav-bar": {
|
||||
"description": "הפוך את סרגל הניווט לשקוף ומטושטש",
|
||||
"name": "טשטש את סרגל הניווט"
|
||||
},
|
||||
"bypass-age-restrictions": {
|
||||
"description": "עקוף את אימות גיל המשתמש של יוטיוב",
|
||||
"name": "עקוף את ההחמרות של הגיל"
|
||||
},
|
||||
"captions-selector": {
|
||||
"description": "בורר כתוביות עבור רצועות אודיו של YouTube Music",
|
||||
"menu": {
|
||||
"autoload": "בחר אוטומטי את הכתובית האחרונה שנבחרה",
|
||||
"disable-captions": "ברירת מחד ללא כתוביות"
|
||||
},
|
||||
"name": "בוחר כתוביות",
|
||||
"prompt": {
|
||||
"selector": {
|
||||
"label": "שפת כתוביות נוכחית: {{language}}",
|
||||
"none": "ללא",
|
||||
"title": "בחר שפת כתוביות"
|
||||
}
|
||||
},
|
||||
"templates": {
|
||||
"title": "פתח בחירת כתוביות"
|
||||
}
|
||||
},
|
||||
"compact-sidebar": {
|
||||
"description": "הגדר תמיד את סרגל הצד למצב קומפקטי",
|
||||
"name": "סרגל צד קומפקטי"
|
||||
},
|
||||
"crossfade": {
|
||||
"description": "עמעם בין השירים",
|
||||
"menu": {
|
||||
"advanced": "מתקדם"
|
||||
},
|
||||
"prompt": {
|
||||
"options": {
|
||||
"multi-input": {
|
||||
"fade-scaling": {
|
||||
"linear": "לינארי",
|
||||
"logarithmic": "לוגריתמי"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"disable-autoplay": {
|
||||
"menu": {
|
||||
"apply-once": "חל רק בהפעלה"
|
||||
},
|
||||
"name": "השבתת הפעלה אוטומטית"
|
||||
},
|
||||
"discord": {
|
||||
"backend": {
|
||||
"connected": "התחבר לדיסקורד",
|
||||
"disconnected": "התנתק לדיסקורד"
|
||||
},
|
||||
"menu": {
|
||||
"auto-reconnect": "חיבור מחדש אוטומטי",
|
||||
"clear-activity": "נקה פעילות",
|
||||
"connected": "מחובר",
|
||||
"disconnected": "מנותק",
|
||||
"hide-github-button": "הסתר את לחצן הקישור של GitHub",
|
||||
"play-on-youtube-music": "הפעל ביוטיוב מיוזיק",
|
||||
"set-inactivity-timeout": "הגדר פסק זמן לחוסר פעילות"
|
||||
@ -290,7 +427,18 @@
|
||||
"backend": {
|
||||
"dialog": {
|
||||
"error": {
|
||||
"buttons": {
|
||||
"ok": "אוקיי"
|
||||
},
|
||||
"message": "אה ! מתנצלים, הורדה נכשלה",
|
||||
"title": "שגיאה בהורדה!"
|
||||
},
|
||||
"start-download-playlist": {
|
||||
"buttons": {
|
||||
"ok": "אוקיי"
|
||||
},
|
||||
"message": "מוריד פלייליסט {{playlistTitle}}",
|
||||
"title": "הורדה התחילה"
|
||||
}
|
||||
},
|
||||
"feedback": {
|
||||
|
||||
@ -256,7 +256,7 @@
|
||||
}
|
||||
},
|
||||
"quality": {
|
||||
"label": "गुणवत्ता",
|
||||
"label": "स्पष्टता",
|
||||
"submenu": {
|
||||
"pixels": "{{quality}} पिक्सल"
|
||||
}
|
||||
@ -287,11 +287,443 @@
|
||||
}
|
||||
},
|
||||
"api-server": {
|
||||
"description": "प्लेयर को नियंत्रित करने के लिए एक API सर्वर जोड़ता है",
|
||||
"dialog": {
|
||||
"request": {
|
||||
"buttons": {
|
||||
"allow": "अनुमति दें",
|
||||
"deny": "मना करना"
|
||||
},
|
||||
"message": "{{ID}} ({{origin}}) को ए.पि.ऐ. ऐकसेस करने की अनुमति दे?",
|
||||
"title": "एपीआई अनुमोदन अनुरोध"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"auth-strategy": {
|
||||
"label": "अनुमोदन रणनीति",
|
||||
"submenu": {
|
||||
"auth-at-first": {
|
||||
"label": "अधिकार प्रदान प्रारंभिक अनुरोध पर"
|
||||
},
|
||||
"none": {
|
||||
"label": "कोई प्राधिकरण नहीं"
|
||||
}
|
||||
}
|
||||
},
|
||||
"hostname": {
|
||||
"label": "होस्टनेम"
|
||||
},
|
||||
"port": {
|
||||
"label": "पोर्ट"
|
||||
}
|
||||
},
|
||||
"name": "एपीआई सर्वर [बीटा]",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "एपीआई सर्वर के लिए होस्ट नाम (जैसे 0.0.0.0) दर्ज करें:",
|
||||
"title": "होस्टनेम"
|
||||
},
|
||||
"port": {
|
||||
"label": "एपीआई सर्वर के लिए पोर्ट दर्ज करें:",
|
||||
"title": "पोर्ट"
|
||||
}
|
||||
}
|
||||
},
|
||||
"audio-compressor": {
|
||||
"description": "ऑडियो पर कम्प्रेशन लागू करें (सिग्नल के सबसे ऊँचे हिस्सों की आवाज़ को कम करता है और सबसे नर्म हिस्सों की आवाज़ को बढ़ाता है)",
|
||||
"name": "ऑडियो कंप्रेसर"
|
||||
},
|
||||
"auth-proxy-adapter": {
|
||||
"description": "ऑथेंटिकेशन प्रॉक्सी सेवाओं के उपयोग के लिए सपोर्ट",
|
||||
"menu": {
|
||||
"disable": "प्रॉक्सी एडाप्टर बंद करें",
|
||||
"enable": "प्रॉक्सी एडाप्टर शुरू करें",
|
||||
"hostname": {
|
||||
"label": "होस्ट का नाम"
|
||||
},
|
||||
"port": {
|
||||
"label": "पोर्ट"
|
||||
}
|
||||
},
|
||||
"name": "ऑथ प्रॉक्सी एडाप्टर",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "स्थानीय प्रॉक्सी सर्वर के लिए होस्ट का नाम लिखें (पुनः आरंभ ज़रूरी है):",
|
||||
"title": "प्रॉक्सी होस्ट का नाम"
|
||||
},
|
||||
"port": {
|
||||
"label": "स्थानीय प्रॉक्सी सर्वर के लिए पोर्ट लिखें (पुनः प्रारंभ जरूरी है):",
|
||||
"title": "प्रॉक्सी का पोर्ट"
|
||||
}
|
||||
}
|
||||
},
|
||||
"blur-nav-bar": {
|
||||
"description": "नेविगेशन बार को पारदर्शी और धुंधला बनाता है",
|
||||
"name": "नेविगेशन बार को ब्लर करें"
|
||||
},
|
||||
"bypass-age-restrictions": {
|
||||
"description": "YouTube आयु की जांच को बायपास करें",
|
||||
"name": "आयु प्रतिबंध को बायपास करें"
|
||||
},
|
||||
"captions-selector": {
|
||||
"description": "YouTube म्यूज़िक ऑडियो ट्रैक के लिए कैप्शन चयनकर्ता",
|
||||
"menu": {
|
||||
"autoload": "अंतिम बार उपयोग किए गए कैप्शन का ऑटोमैटिक रूप से चयन करें",
|
||||
"disable-captions": "डिफ़ॉल्ट रूप में कोई कैप्शन नहीं"
|
||||
},
|
||||
"name": "कैप्शन चयनकर्ता",
|
||||
"prompt": {
|
||||
"selector": {
|
||||
"label": "वर्तमान कैप्शन भाषा: {{language}}",
|
||||
"none": "कुछ नहीं",
|
||||
"title": "कैप्शन भाषा चुनें"
|
||||
}
|
||||
},
|
||||
"templates": {
|
||||
"title": "कैप्शन चयनकर्ता खोलें"
|
||||
}
|
||||
},
|
||||
"compact-sidebar": {
|
||||
"description": "साइडबार को हमेशा कॉम्पैक्ट मोड में सेट करें",
|
||||
"name": "कॉम्पैक्ट साइडबार"
|
||||
},
|
||||
"crossfade": {
|
||||
"description": "गानों के बीच क्रॉसफ़ेड करें",
|
||||
"menu": {
|
||||
"advanced": "आधुनिक"
|
||||
},
|
||||
"name": "क्रॉसफ़ेड [बीटा]",
|
||||
"prompt": {
|
||||
"options": {
|
||||
"multi-input": {
|
||||
"fade-in-duration": "फ़ेड इन अवधि (मिलीसेकंड)",
|
||||
"fade-out-duration": "फ़ेड आउट अवधि (मिलीसेकंड)",
|
||||
"fade-scaling": {
|
||||
"label": "फेड स्केलिंग",
|
||||
"linear": "रेखिक",
|
||||
"logarithmic": "लघुगणक"
|
||||
},
|
||||
"seconds-before-end": "अंत से पहले N सेकंड तक क्रॉसफ़ेड करें"
|
||||
},
|
||||
"title": "क्रॉसफ़ेड विकल्प"
|
||||
}
|
||||
}
|
||||
},
|
||||
"disable-autoplay": {
|
||||
"description": "गीत को \"रुके हुए \" मोड में शुरू करता है",
|
||||
"menu": {
|
||||
"apply-once": "केवल प्रारम्भ पर लागू होता है"
|
||||
},
|
||||
"name": "ऑटोप्ले अयोग्य करें"
|
||||
},
|
||||
"discord": {
|
||||
"backend": {
|
||||
"already-connected": "सक्रिय कनेक्शन से जुड़ने का प्रयास किया गया",
|
||||
"connected": "डिस्कॉर्ड से कनेक्टेड है",
|
||||
"disconnected": "डिस्कॉर्ड से कनेक्टेड नहीं है"
|
||||
},
|
||||
"description": "Rich Presence के साथ अपने दोस्तों के साथ बाटें कि आप क्या सुनते हैं",
|
||||
"menu": {
|
||||
"auto-reconnect": "स्वतः पुनः कनेक्ट करें",
|
||||
"clear-activity": "Activity साफ़ करें",
|
||||
"clear-activity-after-timeout": "समय समाप्त होने के बाद एक्टिविटी साफ़ करें",
|
||||
"connected": "स्थापित",
|
||||
"disconnected": "डिस्कनेक्ट किया गया",
|
||||
"hide-duration-left": "शेष अवधि छिपाएँ",
|
||||
"hide-github-button": "GitHub लिंक के बटन को छिपाएँ",
|
||||
"play-on-youtube-music": "YouTube म्यूज़िक पर चलाएँ",
|
||||
"set-inactivity-timeout": "निष्क्रियता समय समाप्ति सेट करें"
|
||||
},
|
||||
"name": "डिस्कॉर्ड रिच प्रेजेंस",
|
||||
"prompt": {
|
||||
"set-inactivity-timeout": {
|
||||
"label": "निष्क्रियता समय समाप्ति सेकंड में दर्ज करें:",
|
||||
"title": "निष्क्रियता समय समाप्ति सेट करें"
|
||||
}
|
||||
}
|
||||
},
|
||||
"downloader": {
|
||||
"backend": {
|
||||
"dialog": {
|
||||
"error": {
|
||||
"buttons": {
|
||||
"ok": "ठीक है"
|
||||
},
|
||||
"message": "आह! क्षमा करें, डाउनलोड विफल हो गया…",
|
||||
"title": "डाउनलोड में दिक्कत है !"
|
||||
},
|
||||
"start-download-playlist": {
|
||||
"buttons": {
|
||||
"ok": "ठीक है"
|
||||
},
|
||||
"detail": "({{playlistSize}} गाने)",
|
||||
"message": "प्लेलिस्ट {{playlistTitle}} डाउनलोड हो रही है",
|
||||
"title": "डाउनलोड शुरू"
|
||||
}
|
||||
},
|
||||
"feedback": {
|
||||
"conversion-progress": "कन्वर्ज़न: {{percent}}%",
|
||||
"converting": "परिवर्तित हो रहा है…",
|
||||
"done": "हो गया: {{filePath}}",
|
||||
"download-info": "{{artist}} - {{title}} डाउनलोड हो रहा है [{{videoId}}",
|
||||
"download-progress": "डाउनलोड करें: {{percent}}%",
|
||||
"downloading": "डाउनलोड हो रहा है…",
|
||||
"downloading-counter": "{{current}}/{{total}} डाउनलोड हो रहा है…",
|
||||
"downloading-playlist": "प्लेलिस्ट \"{{playlistTitle}}\" - {{playlistSize}} गाने ({{playlistId}}) डाउनलोड हो रहे हैं",
|
||||
"error-while-downloading": "\"{{author}} - {{title}}\" डाउनलोड करते समय दिक्कत: {{error}}",
|
||||
"folder-already-exists": "फ़ोल्डर {{playlistFolder}} पहले से मौजूद है",
|
||||
"getting-playlist-info": "प्लेलिस्ट की जानकारी प्राप्त हो रही है…",
|
||||
"loading": "लोड हो रहा है…",
|
||||
"playlist-has-only-one-song": "प्लेलिस्ट में केवल एक आइटम है, इसे सीधे डाउनलोड करें",
|
||||
"playlist-id-not-found": "कोई प्लेलिस्ट आईडी नहीं मिली",
|
||||
"playlist-is-empty": "प्लेलिस्ट ख़ाली है",
|
||||
"playlist-is-mix-or-private": "प्लेलिस्ट जानकारी प्राप्त करने में दिक्कत: सुनिश्चित करें कि यह निजी या \"आपके लिए मिश्रित\" प्लेलिस्ट नहीं है\n\n{{त्रुटि}}",
|
||||
"preparing-file": "फ़ाइल तैयार की जा रही है…",
|
||||
"saving": "सेव जा रहा है…",
|
||||
"trying-to-get-playlist-id": "प्लेलिस्ट आईडी प्राप्त करने का प्रयास किया जा रहा है: {{playlistId}}",
|
||||
"video-id-not-found": "वीडियो नहीं मिला",
|
||||
"writing-id3": "ID3 टैग लिख रहे हैं…"
|
||||
}
|
||||
},
|
||||
"description": "इंटरफ़ेस से सीधे MP3 / स्रोत ऑडियो डाउनलोड करता है",
|
||||
"menu": {
|
||||
"choose-download-folder": "डाउनलोड फ़ोल्डर चुनें",
|
||||
"download-finish-settings": {
|
||||
"label": "समाप्त होने पर डाउनलोड करें",
|
||||
"prompt": {
|
||||
"last-percent": "x प्रतिशत के बाद",
|
||||
"last-seconds": "अंतिम x सेकंड",
|
||||
"title": "डाउनलोड करने का समय कॉन्फ़िगर करें"
|
||||
},
|
||||
"submenu": {
|
||||
"advanced": "विकसित",
|
||||
"enabled": "सक्रिय",
|
||||
"mode": "टाइम मोड",
|
||||
"percent": "प्रतिशत",
|
||||
"seconds": "सेकंड"
|
||||
}
|
||||
},
|
||||
"download-playlist": "प्लेलिस्ट डाउनलोड करें",
|
||||
"presets": "प्रीसेट",
|
||||
"skip-existing": "मौजूदा फ़ाइलें छोड़ें"
|
||||
},
|
||||
"name": "डाउनलोडर",
|
||||
"renderer": {
|
||||
"can-not-update-progress": "प्रगति अपडेट नहीं की जा सकती"
|
||||
},
|
||||
"templates": {
|
||||
"button": "डाउनलोड"
|
||||
}
|
||||
},
|
||||
"equalizer": {
|
||||
"description": "प्लेयर में एक एक्विलाइज़र जोड़ता है",
|
||||
"menu": {
|
||||
"presets": {
|
||||
"label": "प्रीसेट",
|
||||
"list": {
|
||||
"bass-booster": "bass वर्धक"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "इक्वलाइज़र"
|
||||
},
|
||||
"exponential-volume": {
|
||||
"description": "वॉल्यूम स्लाइडर को घातांकीय बनाता है ताकि कम वॉल्यूम का चयन करना आसान हो।",
|
||||
"name": "तीव्र वॉल्यूम"
|
||||
},
|
||||
"in-app-menu": {
|
||||
"description": "मेनू-बार को फैंसी, गहरा या एल्बम-रंग का रूप दें",
|
||||
"menu": {
|
||||
"hide-dom-window-controls": "DOM विंडो कंट्रोल को छिपाएँ"
|
||||
},
|
||||
"name": "इन-ऐप मेनू"
|
||||
},
|
||||
"lumiastream": {
|
||||
"description": "लूमिया स्ट्रीम सपोर्ट जोड़ा गया",
|
||||
"name": "लूमिया स्ट्रीम [बीटा]"
|
||||
},
|
||||
"lyrics-genius": {
|
||||
"description": "अधिकांश गानों के लिए गीत के लिरिक्स को जोड़ता है",
|
||||
"menu": {
|
||||
"romanized-lyrics": "रोमनकृत लिरिक्स"
|
||||
},
|
||||
"name": "लिरिक्स जीनियस",
|
||||
"renderer": {
|
||||
"fetched-lyrics": "जीनियस के लिए प्राप्त किये गए लिरिक्स"
|
||||
}
|
||||
},
|
||||
"music-together": {
|
||||
"description": "दूसरों के साथ प्लेलिस्ट साझा करें। जब होस्ट कोई गाना बजाता है, तो बाकी सभी लोग वही गाना सुनेंगे",
|
||||
"dialog": {
|
||||
"enter-host": "होस्ट आईडी दर्ज करें"
|
||||
},
|
||||
"internal": {
|
||||
"save": "सेव",
|
||||
"track-source": "ट्रैक स्रोत",
|
||||
"unknown-user": "अज्ञात उपयोगकर्ता"
|
||||
},
|
||||
"menu": {
|
||||
"click-to-copy-id": "होस्ट आईडी कॉपी करें",
|
||||
"close": "संगीत को एक साथ बंद करें",
|
||||
"connected-users": "जुड़े हुए उपयोगकर्ता",
|
||||
"disconnect": "संगीत को एक साथ डिस्कनेक्ट करें",
|
||||
"empty-user": "कोई जुड़े हुए उपयोगकर्ता नहीं",
|
||||
"host": "म्यूजिक टुगेदर होस्ट",
|
||||
"join": "संगीत से साथ में जुड़ें",
|
||||
"permission": {
|
||||
"all": "मेहमानों को प्लेलिस्ट और प्लेयर को नियंत्रित करने की अनुमति दें",
|
||||
"host-only": "केवल होस्ट ही प्लेलिस्ट और प्लेयर को नियंत्रित कर सकता है",
|
||||
"playlist": "मेहमानों को प्लेलिस्ट नियंत्रित करने की अनुमति दें"
|
||||
},
|
||||
"set-permission": "नियंत्रण अनुमति बदलें",
|
||||
"status": {
|
||||
"disconnected": "डिस्कनेक्ट किया गया",
|
||||
"guest": "अतिथि के रूप में जुड़े हुए",
|
||||
"host": "मेज़बान के रूप में जुड़े हुए"
|
||||
}
|
||||
},
|
||||
"name": "संगीत टुगेदर [बीटा]",
|
||||
"toast": {
|
||||
"add-song-failed": "गाना जोड़ने में असफलता",
|
||||
"closed": "म्यूजिक टुगेदर बंद हुआ",
|
||||
"disconnected": "म्यूजिक टुगेदर डिस्कनेक्ट हुआ",
|
||||
"host-failed": "म्यूज़िक टुगेदर होस्ट करने में असफल",
|
||||
"id-copied": "होस्ट आईडी क्लिपबोर्ड पर कॉपी की गई",
|
||||
"id-copy-failed": "होस्ट आईडी को क्लिपबोर्ड पर कॉपी करने में असफल",
|
||||
"join-failed": "म्यूजिक टुगेदर में शामिल होने में विफल",
|
||||
"joined": "म्यूजिक टुगेदर में शामिल होने में सफल",
|
||||
"permission-changed": "म्यूजिक टुगेदर की अनुमति बदलकर \"{{permission}}\" कर दी गई है",
|
||||
"remove-song-failed": "गाना हटाने में विफल",
|
||||
"user-connected": "{{name}} म्यूजिक टुगेदर में शामिल हुए",
|
||||
"user-disconnected": "{{name}} ने म्यूजिक टुगेदर छोड़ा"
|
||||
}
|
||||
},
|
||||
"navigation": {
|
||||
"description": "आगे /पीछे नेविगेशन अर्रोस सीधे इंटरफ़ेस में एकीकृत, जैसे आपके पसंदीदा ब्राउज़र में",
|
||||
"name": "नेविगेशन"
|
||||
},
|
||||
"no-google-login": {
|
||||
"description": "इंटरफ़ेस से गूगल लॉगिन बटन और लिंक हटाएँ",
|
||||
"name": "कोई गूगल लॉगिन नहीं"
|
||||
},
|
||||
"notifications": {
|
||||
"description": "जब कोई गाना बजना शुरू हो जाए तो नोटिफ़िकेशन दें (विंडोज़ पर इंटरैक्टिव नोटिफ़िकेशन्स उपलब्ध हैं)",
|
||||
"menu": {
|
||||
"interactive": "इंटरैक्टिव नोटिफ़िकेशन्स",
|
||||
"interactive-settings": {
|
||||
"label": "इंटरैक्टिव सेटिंग्स",
|
||||
"submenu": {
|
||||
"hide-button-text": "बटन टेक्स्ट को छिपाएँ",
|
||||
"refresh-on-play-pause": "प्ले/पॉज़ पर रिफ्रेश करें",
|
||||
"tray-controls": "ट्रे क्लिक पर खोलें/बंद करें"
|
||||
}
|
||||
},
|
||||
"priority": "नोटिफ़िकेशन प्राथमिकता",
|
||||
"toast-style": "टोस्ट स्टाइल",
|
||||
"unpause-notification": "पॉज हटने पर नोटिफ़िकेशन दिखाएं"
|
||||
},
|
||||
"name": "नोटिफ़िकेशन्स"
|
||||
},
|
||||
"performance-improvement": {
|
||||
"description": "प्रयोगात्मक स्क्रिप्ट सक्षम करके प्रदर्शन में सुधार करें",
|
||||
"name": "प्रदर्शन सुधार [Beta]"
|
||||
},
|
||||
"picture-in-picture": {
|
||||
"description": "ऐप को पिक्चर-इन-पिक्चर मोड में बदलने की अनुमति दें",
|
||||
"menu": {
|
||||
"always-on-top": "हमेशा ऊपर",
|
||||
"hotkey": {
|
||||
"label": "हॉट की",
|
||||
"prompt": {
|
||||
"keybind-options": {
|
||||
"hotkey": "हॉट की"
|
||||
},
|
||||
"label": "पिक्चर-इन-पिक्चर टॉगल करने के लिए हॉट की चुनें",
|
||||
"title": "पिक्चर-इन-पिक्चर हॉट की"
|
||||
}
|
||||
},
|
||||
"save-window-position": "विंडो पोज़ीशन सेव करें",
|
||||
"save-window-size": "विंडो के आकार को सेव करें",
|
||||
"use-native-pip": "ब्राउज़र के नेटिव PiP का उपयोग करें"
|
||||
},
|
||||
"name": "पिक्चर-इन-पिक्चर",
|
||||
"templates": {
|
||||
"button": "पिक्चर-इन-पिक्चर"
|
||||
}
|
||||
},
|
||||
"playback-speed": {
|
||||
"description": "तेज़ सुनो, धीरे सुनो! गाने की गति को नियंत्रित करने वाला स्लाइडर जोडें",
|
||||
"name": "प्लेबैक गति",
|
||||
"templates": {
|
||||
"button": "गति"
|
||||
}
|
||||
},
|
||||
"precise-volume": {
|
||||
"description": "कस्टम HUD और कस्टोमिज़ाबले वॉल्यूम चरणों के साथ, माउसव्हील/हॉट कीज़ का उपयोग करके वॉल्यूम को सटीक रूप से नियंत्रित करें",
|
||||
"menu": {
|
||||
"arrows-shortcuts": "लोकल एरो-की नियंत्रण",
|
||||
"custom-volume-steps": "कस्टम वॉल्यूम चरण सेट करें",
|
||||
"global-shortcuts": "वैश्विक हॉट कीज़"
|
||||
},
|
||||
"name": "सटीक वॉल्यूम",
|
||||
"prompt": {
|
||||
"global-shortcuts": {
|
||||
"keybind-options": {
|
||||
"decrease": "वॉल्यूम घटाएँ",
|
||||
"increase": "वॉल्यूम बढ़ाएँ"
|
||||
},
|
||||
"label": "ग्लोबल वॉल्यूम कीबाइंड्स चुनें:",
|
||||
"title": "ग्लोबल वॉल्यूम कीबाइंड्स"
|
||||
},
|
||||
"volume-steps": {
|
||||
"label": "वॉल्यूम बढ़ाने/घटाने के चरण चुनें",
|
||||
"title": "वॉल्यूम चरण"
|
||||
}
|
||||
}
|
||||
},
|
||||
"quality-changer": {
|
||||
"backend": {
|
||||
"dialog": {
|
||||
"quality-changer": {
|
||||
"detail": "वर्तमान गुणवत्ता: {{quality}}",
|
||||
"message": "वीडियो गुणवत्ता चुनें:",
|
||||
"title": "वीडियो गुणवत्ता चुनें"
|
||||
}
|
||||
}
|
||||
},
|
||||
"description": "वीडियो ओवरले पर एक बटन के साथ वीडियो की गुणवत्ता बदलने की अनुमति देता है",
|
||||
"name": "वीडियो गुणवत्ता परिवर्तक"
|
||||
},
|
||||
"scrobbler": {
|
||||
"description": "स्क्रोब्लिंग सपोर्ट जोड़ें (etc. last.fm, listenbrainz)",
|
||||
"dialog": {
|
||||
"lastfm": {
|
||||
"auth-failed": {
|
||||
"message": "Last.fm के साथ प्रमाणीकरण विफल\nअगले पुनरारंभ तक पॉपअप छिपाएँ।",
|
||||
"title": "प्रमाणीकरण विफल"
|
||||
}
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"lastfm": {
|
||||
"api-settings": "Last.fm API सेटिंग्स"
|
||||
},
|
||||
"listenbrainz": {
|
||||
"token": "listenbrainz उपयोगकर्ता टोकन दर्ज करें"
|
||||
},
|
||||
"scrobble-alternative-title": "वैकल्पिक शीर्षक का उपयोग करें",
|
||||
"scrobble-other-media": "अन्य मीडिया स्क्रोबल करें"
|
||||
},
|
||||
"name": "स्क्रोब्लर",
|
||||
"prompt": {
|
||||
"lastfm": {
|
||||
"api-key": "Last.fm API की",
|
||||
"api-secret": "Last.fm गुप्त API"
|
||||
},
|
||||
"listenbrainz": {
|
||||
"token": {
|
||||
"label": "अपना ListenBrainz उपयोगकर्ता टोकन दर्ज करें:",
|
||||
"title": "ListenBrainz टोकन"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -2,12 +2,14 @@
|
||||
"common": {
|
||||
"console": {
|
||||
"plugins": {
|
||||
"execute-failed": "Neuspjelo izvršenje plugina {{pluginName}}::{{contextName}}",
|
||||
"executed-at-ms": "Plugin{{pluginName}}::{{contextName}}{{je izvršen za {{ms}}ms",
|
||||
"initialize-failed": "Nije uspilo inicijalitirati plugin \"{{pluginName}}\"",
|
||||
"load-all": "Učitavaju se svi plugini",
|
||||
"load-failed": "Neuspješno ućitavanje plugina \"{{pluginName}}\"",
|
||||
"loaded": "Plugin \"{{pluginName}}\" je učitan"
|
||||
"execute-failed": "Neuspješno izvršavanje plugina {{pluginName}}::{{contextName}}",
|
||||
"executed-at-ms": "Plugin {{pluginName}}::{{contextName}} je izvršen za {{ms}}ms",
|
||||
"initialize-failed": "Neuspješno inicijaliziranje plugina \"{{pluginName}}\"",
|
||||
"load-all": "Učitavanje svih plugina",
|
||||
"load-failed": "Neuspješno učitavanje plugina \"{{pluginName}}\"",
|
||||
"loaded": "Plugin \"{{pluginName}}\" je učitan",
|
||||
"unload-failed": "Neuspješna deaktivacija plugina \"{{pluginName}}\"",
|
||||
"unloaded": "Plugin \"{{pluginName}}\" deaktiviran"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -18,31 +20,613 @@
|
||||
},
|
||||
"main": {
|
||||
"console": {
|
||||
"did-finish-load": {
|
||||
"dev-tools": "Završeno učitavanje. DevTools je otvoren"
|
||||
},
|
||||
"i18n": {
|
||||
"loaded": "i18n je učitan"
|
||||
},
|
||||
"second-instance": {
|
||||
"receive-command": "Zaprimljena komanda preko protokola: \"{{command}}\""
|
||||
"receive-command": "Zaprimljena naredba preko protokola: \"{{command}}\""
|
||||
},
|
||||
"theme": {
|
||||
"css-file-not-found": "CSS fajl \"{{cssFile}}\" ne postoji, ignorišem"
|
||||
"css-file-not-found": "CSS datoteka \"{{cssFile}}\" ne postoji, zanemarujem"
|
||||
},
|
||||
"unresponsive": {
|
||||
"details": "Neresponzivna Pogreška!\n{{error}}"
|
||||
},
|
||||
"when-ready": {
|
||||
"clearing-cache-after-20s": "Brisanje cache memorije u toku"
|
||||
"clearing-cache-after-20s": "Brisanje predmemorije aplikacije"
|
||||
},
|
||||
"window": {
|
||||
"tried-to-render-offscreen": "Prozor se pokušao prikazat van ekrana, windowSize={{windowSize}}, displaySize={{displaySize}}, position={{position}}"
|
||||
}
|
||||
},
|
||||
"dialog": {
|
||||
"hide-menu-enabled": {
|
||||
"detail": "Meni je sakriven, pritisni 'Alt' da bi se prikazao (ili 'Escape' ako se koristi In-App Menu)",
|
||||
"message": "Sakriveni Meni je uključen"
|
||||
"detail": "Izbornik je sakriven, pritisnite 'Alt' da bi se prikazao (ili 'Escape' ako koristite unutar aplikacijski izbornik)",
|
||||
"message": "Sakrij Izbornik je uključen",
|
||||
"title": "Sakrij Izbornik Ukljućen"
|
||||
},
|
||||
"need-to-restart": {
|
||||
"buttons": {
|
||||
"later": "Kasnije",
|
||||
"restart-now": "Pokreni ponovo"
|
||||
"restart-now": "Ponovo Pokreni Sada"
|
||||
},
|
||||
"detail": "\"{{pluginName}}\" dodatak zahtjeva pokretanje aplikacije ponovo da bi promjene bile vidljive"
|
||||
"detail": "\"{{pluginName}}\" plugin zahtjeva ponovno pokretanje da bi postao aktivan",
|
||||
"message": "\"{{pluginName}}\" se treba ponovo pokreniti",
|
||||
"title": "Ponovno Pokrećanje je Potrebno"
|
||||
},
|
||||
"unresponsive": {
|
||||
"buttons": {
|
||||
"quit": "Izađi",
|
||||
"relaunch": "Ponovno Pokretanje",
|
||||
"wait": "Čekaj"
|
||||
},
|
||||
"detail": "Ispričavamo se zbog neugodnosti! izaberite sljedeću radnju:",
|
||||
"message": "Aplikacija je Neresponzivna",
|
||||
"title": "Prozor je Neresponzivan"
|
||||
},
|
||||
"update-available": {
|
||||
"buttons": {
|
||||
"disable": "Isključi Ažuriranja",
|
||||
"download": "Preuzmi",
|
||||
"ok": "OK"
|
||||
},
|
||||
"detail": "Nova verzija je dostupna i može se preuzeti preko {{downloadLink}}",
|
||||
"message": "Nova verzija je dostupna",
|
||||
"title": "Dostupno Ažuriranje"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"about": "O programu",
|
||||
"navigation": {
|
||||
"label": "Navigacija",
|
||||
"submenu": {
|
||||
"copy-current-url": "Kopiraj trenutni URL",
|
||||
"go-back": "Idi natrag",
|
||||
"go-forward": "Idi naprijed",
|
||||
"quit": "Izađi",
|
||||
"restart": "Ponovno Pokreni Aplikaciju"
|
||||
}
|
||||
},
|
||||
"options": {
|
||||
"label": "Opcije",
|
||||
"submenu": {
|
||||
"advanced-options": {
|
||||
"label": "Napredne opcije",
|
||||
"submenu": {
|
||||
"auto-reset-app-cache": "Resetiraj predmemoriju aplikacije pri pokretanju",
|
||||
"disable-hardware-acceleration": "Isključi hardversku akceleraciju",
|
||||
"edit-config-json": "Uredi config.json",
|
||||
"override-user-agent": "Promijeni User-Agent",
|
||||
"restart-on-config-changes": "Ponovno pokreni na promjene konfiguracije",
|
||||
"set-proxy": {
|
||||
"label": "Postavi proxy",
|
||||
"prompt": {
|
||||
"label": "Unesi Adresu za Proxy: (ostavite prazno ako želite onemogućiti)",
|
||||
"placeholder": "Primjer: SOCKS5://127.0.0.1:9999",
|
||||
"title": "Postavi proxy"
|
||||
}
|
||||
},
|
||||
"toggle-dev-tools": "Uključi/isključi DevTools"
|
||||
}
|
||||
},
|
||||
"always-on-top": "Uvijek na vrhu",
|
||||
"auto-update": "Automatsko Ažuriranje",
|
||||
"hide-menu": {
|
||||
"dialog": {
|
||||
"message": "Izbornik će se sakriti pri sljedećem pokretanju, stisnite [Alt] da se prikaže (ili backtick [`] ako koristite meni unutar aplikacije)",
|
||||
"title": "Sakrij Izbornik Uključen"
|
||||
},
|
||||
"label": "Sakrij Izbornik"
|
||||
},
|
||||
"language": {
|
||||
"dialog": {
|
||||
"message": "Jezik će se promijeniti nakon ponovnog pokretanja",
|
||||
"title": "Jezik promijenjen"
|
||||
},
|
||||
"label": "Jezik",
|
||||
"submenu": {
|
||||
"to-help-translate": "Želite pomoć za prijevodom? Kliknite ovdje"
|
||||
}
|
||||
},
|
||||
"resume-on-start": "Nastavi zadnju pjesmu kad se aplikacija pokrene",
|
||||
"single-instance-lock": "Sprječavanje višestrukog pokretanja",
|
||||
"start-at-login": "Počni od prijave",
|
||||
"starting-page": {
|
||||
"label": "Početna stranica",
|
||||
"unset": "Nepostavljeno"
|
||||
},
|
||||
"tray": {
|
||||
"label": "Traka",
|
||||
"submenu": {
|
||||
"disabled": "Isključeno",
|
||||
"enabled-and-hide-app": "Uključena i skrivena aplikacija",
|
||||
"enabled-and-show-app": "Uključena i prikaži aplikaciju",
|
||||
"play-pause-on-click": "Reproduciraj/Pauziraj na klik"
|
||||
}
|
||||
},
|
||||
"visual-tweaks": {
|
||||
"label": "Vizualna podešavanja",
|
||||
"submenu": {
|
||||
"like-buttons": {
|
||||
"default": "Zadano",
|
||||
"force-show": "Prisilno prikaži",
|
||||
"hide": "Sakrij",
|
||||
"label": "\"Sviđa mi se\" gumbi"
|
||||
},
|
||||
"remove-upgrade-button": "Ukloni gumb za nadogradnju",
|
||||
"theme": {
|
||||
"dialog": {
|
||||
"button": {
|
||||
"cancel": "Odustani",
|
||||
"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": "Uvezi prilagođenu CSS datoteku",
|
||||
"no-theme": "Bez teme"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"enabled": "Uključeno",
|
||||
"label": "Plugini",
|
||||
"new": "NOVO"
|
||||
},
|
||||
"view": {
|
||||
"label": "Pogled",
|
||||
"submenu": {
|
||||
"force-reload": "Prisilno Ponovo Učitaj",
|
||||
"reload": "Ponovno učitaj",
|
||||
"reset-zoom": "Prava Veličina",
|
||||
"toggle-fullscreen": "Uključi/Isključi Prikaz Preko Cijelog Ekrana",
|
||||
"zoom-in": "Povećaj",
|
||||
"zoom-out": "Smanji"
|
||||
}
|
||||
}
|
||||
},
|
||||
"tray": {
|
||||
"next": "Sljedeće",
|
||||
"play-pause": "Reproduciraj/Pauziraj",
|
||||
"previous": "Prethodni",
|
||||
"quit": "Izađi",
|
||||
"restart": "Ponovo Pokreni Aplikaciju",
|
||||
"show": "Prikaži prozor",
|
||||
"tooltip": {
|
||||
"default": "YouTube Glazba",
|
||||
"with-song-info": "YouTube Glazba: {{artist}} - {{title}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"ad-speedup": {
|
||||
"description": "Ako se pokrene oglas, zvuk se isključi i brzina reprodukcije se postavi na 16x",
|
||||
"name": "Ubrzanje Oglasa"
|
||||
},
|
||||
"adblocker": {
|
||||
"description": "Blokiraj sve oglase i praćenje odmah po pokretanju",
|
||||
"menu": {
|
||||
"blocker": "Blokator"
|
||||
},
|
||||
"name": "Blokator Oglasa"
|
||||
},
|
||||
"album-actions": {
|
||||
"description": "Dodaje tipke za 'Ne sviđa mi se', 'Sviđa mi se' i 'Dislike'/'Like' za primjenu na sve pjesme u playlisti ili albumu",
|
||||
"name": "Radnje Albuma"
|
||||
},
|
||||
"album-color-theme": {
|
||||
"description": "Primjenjuje dinamičnu temu i vizualne efekte prema paleti boje albuma",
|
||||
"menu": {
|
||||
"color-mix-ratio": {
|
||||
"label": "Omjer miješanja boja",
|
||||
"submenu": {
|
||||
"percent": "{{ratio}}%"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Boja teme albuma"
|
||||
},
|
||||
"ambient-mode": {
|
||||
"description": "Primjenjuje efekt osvjetljenja prikazivajući nježne boje iz videa na pozadinu vašeg ekrana",
|
||||
"menu": {
|
||||
"blur-amount": {
|
||||
"label": "Količina zamućenja",
|
||||
"submenu": {
|
||||
"pixels": "{{blurAmount}} pikseli"
|
||||
}
|
||||
},
|
||||
"buffer": {
|
||||
"label": "Predmemorija (Bufer)",
|
||||
"submenu": {
|
||||
"buffer": "{{buffer}}"
|
||||
}
|
||||
},
|
||||
"opacity": {
|
||||
"label": "Prozirnost",
|
||||
"submenu": {
|
||||
"percent": "{{opacity}}%"
|
||||
}
|
||||
},
|
||||
"quality": {
|
||||
"label": "Kvaliteta",
|
||||
"submenu": {
|
||||
"pixels": "{{quality}} pikseli"
|
||||
}
|
||||
},
|
||||
"size": {
|
||||
"label": "Veličina",
|
||||
"submenu": {
|
||||
"percent": "{{size}}%"
|
||||
}
|
||||
},
|
||||
"smoothness-transition": {
|
||||
"label": "Glatakoća prijelaza",
|
||||
"submenu": {
|
||||
"during": "Tijekom {{interpolationTime}} s"
|
||||
}
|
||||
},
|
||||
"use-fullscreen": {
|
||||
"label": "Koristi se prikaz preko cijelog ekrana"
|
||||
}
|
||||
},
|
||||
"name": "Ambijentalni Način"
|
||||
},
|
||||
"amuse": {
|
||||
"description": "Dodaje podršku za YouTube Glazbu za widget \"sada reproducira\" od Amuse od strane 6K Labs",
|
||||
"name": "Amuse",
|
||||
"response": {
|
||||
"query": "Amuse API poslužitelj je pokrenut. Koristi GET /query za dohvat informacija o pjesmi."
|
||||
}
|
||||
},
|
||||
"api-server": {
|
||||
"description": "Dodaje API poslužitelj za kontrolu medija",
|
||||
"dialog": {
|
||||
"request": {
|
||||
"buttons": {
|
||||
"allow": "Dozvoli",
|
||||
"deny": "Odbij"
|
||||
},
|
||||
"message": "Dozvoli {{ID}} ({{origin}}) pristup API-ju?",
|
||||
"title": "Zahtjev za autorizaciju API-ja"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"auth-strategy": {
|
||||
"label": "Strategija autorizacije",
|
||||
"submenu": {
|
||||
"auth-at-first": {
|
||||
"label": "Autorizacija pri prvom zahjtevu"
|
||||
},
|
||||
"none": {
|
||||
"label": "Bez autorizacije"
|
||||
}
|
||||
}
|
||||
},
|
||||
"hostname": {
|
||||
"label": "Naziv hosta"
|
||||
},
|
||||
"port": {
|
||||
"label": "Port"
|
||||
}
|
||||
},
|
||||
"name": "API Poslužitelj [Beta]",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "Unesite ime hosta (npr. 0.0.0.0) od API poslužitelja:",
|
||||
"title": "Naziv hosta"
|
||||
},
|
||||
"port": {
|
||||
"label": "Unesite port od API poslužitelja:",
|
||||
"title": "Port"
|
||||
}
|
||||
}
|
||||
},
|
||||
"audio-compressor": {
|
||||
"description": "Primijeni kompresiju na zvuk (smanjuje glasnoću najglasnijih dijelova signala i povećava glasnoću najslabijih dijelova)",
|
||||
"name": "Kompresor Zvuka"
|
||||
},
|
||||
"auth-proxy-adapter": {
|
||||
"description": "Podrška za korištenje usluga autentifikacijskog proxyja",
|
||||
"menu": {
|
||||
"disable": "Onemogući proxy adapter",
|
||||
"enable": "Omogući proxy adapter",
|
||||
"hostname": {
|
||||
"label": "Naziv hosta"
|
||||
},
|
||||
"port": {
|
||||
"label": "Port"
|
||||
}
|
||||
},
|
||||
"name": "Proxy adapter za autentifikaciju",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "Unesite naziv hosta za lokalnog proxy poslužitelja (zahtijeva ponovno pokretanje):",
|
||||
"title": "Naziv hosta proxyja"
|
||||
},
|
||||
"port": {
|
||||
"label": "Unesite port za lokalni proxy poslužitelj (zahtijeva ponovno pokretanje):",
|
||||
"title": "Port proxyja"
|
||||
}
|
||||
}
|
||||
},
|
||||
"blur-nav-bar": {
|
||||
"description": "Čini navigacijsku traku prozirnom i zamagljenom",
|
||||
"name": "Zamagli Navigacijsku Traku"
|
||||
},
|
||||
"bypass-age-restrictions": {
|
||||
"description": "Zaobiđi YouTubeovu provjeru dobi",
|
||||
"name": "Zaobiđi dobna ograničenja"
|
||||
},
|
||||
"captions-selector": {
|
||||
"description": "Izbornik titlova za audiozapise od YouTube Musica",
|
||||
"menu": {
|
||||
"autoload": "Automatski izaberi posljednje korištene titlove",
|
||||
"disable-captions": "Bez titlova"
|
||||
},
|
||||
"name": "Izbornik za titlove",
|
||||
"prompt": {
|
||||
"selector": {
|
||||
"label": "Trenutni jezik za titlove: {{language}}",
|
||||
"none": "Ništa",
|
||||
"title": "Izaberi jezik za titlove"
|
||||
}
|
||||
},
|
||||
"templates": {
|
||||
"title": "Otvori izbornik za titlove"
|
||||
}
|
||||
},
|
||||
"compact-sidebar": {
|
||||
"description": "Uvijek postavi bočnu traku na kompaktni način rada",
|
||||
"name": "Kompaktna bočna traka"
|
||||
},
|
||||
"crossfade": {
|
||||
"description": "Pretapanje (cross-fade) između pjesama",
|
||||
"menu": {
|
||||
"advanced": "Napredno"
|
||||
},
|
||||
"name": "Pretapanje (cross-fade) [Beta]",
|
||||
"prompt": {
|
||||
"options": {
|
||||
"multi-input": {
|
||||
"fade-in-duration": "Trajanje postepenog pojačavanja zvuka (Fade in) (ms)",
|
||||
"fade-out-duration": "Trajanje postepenog smanjenje zvuka (Fade out) (ms)",
|
||||
"fade-scaling": {
|
||||
"label": "Skaliranje postepenog prijelaza (Fade scaling)",
|
||||
"linear": "Linearno",
|
||||
"logarithmic": "Logaritamsko"
|
||||
},
|
||||
"seconds-before-end": "Pretapanje (cross-fade) N sekundi prije kraja"
|
||||
},
|
||||
"title": "Opcije za pretapanje (cross-fade)"
|
||||
}
|
||||
}
|
||||
},
|
||||
"disable-autoplay": {
|
||||
"description": "Postavlja da pjesma počne pauzirana",
|
||||
"menu": {
|
||||
"apply-once": "Primjenjuje se samo pri pokretanju aplikacije"
|
||||
},
|
||||
"name": "Isključi automatsko reprodukciju"
|
||||
},
|
||||
"discord": {
|
||||
"backend": {
|
||||
"already-connected": "Pokušano je povezivanje s aktivnom vezom",
|
||||
"connected": "Spojen na Discord",
|
||||
"disconnected": "Odspojen od Discorda"
|
||||
},
|
||||
"description": "Pokaži svojim prijateljima što slušate sa Rich Presence",
|
||||
"menu": {
|
||||
"auto-reconnect": "Automatski se ponovo spoji",
|
||||
"clear-activity": "Očisti aktivnosti",
|
||||
"clear-activity-after-timeout": "Očisti aktivnosti nakon isteka vremena",
|
||||
"connected": "Spojen",
|
||||
"disconnected": "Odspojen",
|
||||
"hide-duration-left": "Sakrij preostalo vrijeme",
|
||||
"hide-github-button": "Sakrij gumb sa GitHub poveznicom",
|
||||
"play-on-youtube-music": "Reproduciraj na YouTube Musicu",
|
||||
"set-inactivity-timeout": "Postavi vremensko ograničenje neaktivnosti (inactivity timeout)"
|
||||
},
|
||||
"name": "Discord Rich Presence",
|
||||
"prompt": {
|
||||
"set-inactivity-timeout": {
|
||||
"label": "Postavi vremensko ograničenje neaktivnosti u sekundama:",
|
||||
"title": "Postavi vremensko ograničenje neaktivnosti"
|
||||
}
|
||||
}
|
||||
},
|
||||
"downloader": {
|
||||
"backend": {
|
||||
"dialog": {
|
||||
"error": {
|
||||
"buttons": {
|
||||
"ok": "OK"
|
||||
},
|
||||
"message": "Jao! Oprostite, preuzimanje je bilo neuspješno…",
|
||||
"title": "Pogreška pri preuzimanju!"
|
||||
},
|
||||
"start-download-playlist": {
|
||||
"buttons": {
|
||||
"ok": "OK"
|
||||
},
|
||||
"detail": "({{playlistSize}} pjesma)",
|
||||
"message": "Preuzimanje Playliste {{playlistTitle}}",
|
||||
"title": "Preuzimanje započeto"
|
||||
}
|
||||
},
|
||||
"feedback": {
|
||||
"conversion-progress": "Konverzija: {{percent}}%",
|
||||
"converting": "Konvertiranje…",
|
||||
"done": "Gotov: {{filePath}}",
|
||||
"download-info": "Preuzimanje {{artist}} - {{title}} [{{videoId}}",
|
||||
"download-progress": "Preuzimanje: {{percent}}%",
|
||||
"downloading": "Preuzimanje…",
|
||||
"downloading-counter": "Preuzimanje {{current}}/{{total}}…",
|
||||
"downloading-playlist": "Preuzimanje playliste \"{{playlistTitle}}\" - {{playlistSize}} pjesama ({{playlistId}})",
|
||||
"error-while-downloading": "Pogreška pri preuzimanju \"{{author}} - {{title}}\": {{error}}",
|
||||
"folder-already-exists": "Mapa {{playlistFolder}} već postoji",
|
||||
"getting-playlist-info": "Dobavljaju se informacije o playlisti…",
|
||||
"loading": "Učitavanje…",
|
||||
"playlist-has-only-one-song": "Playlista ima samo jedan stavku, preuzeti će se direktno",
|
||||
"playlist-id-not-found": "Nije pronađen ID playliste",
|
||||
"playlist-is-empty": "Playlista je prazna",
|
||||
"playlist-is-mix-or-private": "Pogreška pri dobivanju informacija o playlisti: provjerite da nije ili privatna ili \"Za vas\" playlista\n\n{{error}}",
|
||||
"preparing-file": "Priprema se datoteka…",
|
||||
"saving": "Spremanje…",
|
||||
"trying-to-get-playlist-id": "Pokušavam dobaviti playlist ID: {{playlistId}}",
|
||||
"video-id-not-found": "Videozapis nije pronađen",
|
||||
"writing-id3": "Zapisujem ID3 tagove…"
|
||||
}
|
||||
},
|
||||
"description": "Preuzima MP3 / izvorni audiozapis izravno iz sučelja",
|
||||
"menu": {
|
||||
"choose-download-folder": "Odaberite mapu za preuzimanje",
|
||||
"download-finish-settings": {
|
||||
"label": "Preuzmi pri završetku",
|
||||
"prompt": {
|
||||
"last-percent": "Nakon x posto",
|
||||
"last-seconds": "Zadnjih x sekundi",
|
||||
"title": "Podesi kada preuzeti"
|
||||
},
|
||||
"submenu": {
|
||||
"advanced": "Napredno",
|
||||
"enabled": "Uključeno",
|
||||
"mode": "Tip vremena",
|
||||
"percent": "Postotak",
|
||||
"seconds": "Sekunde"
|
||||
}
|
||||
},
|
||||
"download-playlist": "Preuzmi playlistu",
|
||||
"presets": "Unaprijed postavljeno",
|
||||
"skip-existing": "Preskoči datoteke koje već postoje"
|
||||
},
|
||||
"name": "Preuzimatelj",
|
||||
"renderer": {
|
||||
"can-not-update-progress": "Nemoguće ažuriranje napredka"
|
||||
},
|
||||
"templates": {
|
||||
"button": "Preuzmi"
|
||||
}
|
||||
},
|
||||
"equalizer": {
|
||||
"description": "Dodaje equalizer reprodukciji",
|
||||
"menu": {
|
||||
"presets": {
|
||||
"label": "Zadane postavke",
|
||||
"list": {
|
||||
"bass-booster": "Pojačivač basa"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Ekvalizator"
|
||||
},
|
||||
"exponential-volume": {
|
||||
"description": "Čini klizač glasnoće (volume slider) eksponencijalnim za lakše odabranje niže glasnoće.",
|
||||
"name": "Eksponencijalna Glasnoća"
|
||||
},
|
||||
"in-app-menu": {
|
||||
"description": "Daje izbornicima fensi, tamni ili prema boji albuma izgled",
|
||||
"menu": {
|
||||
"hide-dom-window-controls": "Sakrij kontrole prozora DOM-a"
|
||||
},
|
||||
"name": "Izbornik unutar aplikacije"
|
||||
},
|
||||
"lumiastream": {
|
||||
"description": "Dodaje podršku za Lumia Stream",
|
||||
"name": "Lumia Stream [Beta]"
|
||||
},
|
||||
"lyrics-genius": {
|
||||
"description": "Dodaje podršku za tekstove pjesama za većinu pjesama",
|
||||
"menu": {
|
||||
"romanized-lyrics": "Romanizirani tekstovi pjesme"
|
||||
},
|
||||
"name": "Genius teksovi pjesme",
|
||||
"renderer": {
|
||||
"fetched-lyrics": "Dobavljen tekst pjesme s Genius-a"
|
||||
}
|
||||
},
|
||||
"music-together": {
|
||||
"description": "Podijeli playlistu s drugima. Kada domaćin (host) pusti pjesmu, svi ostali će čuti istu pjesmu",
|
||||
"dialog": {
|
||||
"enter-host": "Unesi ID hosta"
|
||||
},
|
||||
"internal": {
|
||||
"save": "Spremi",
|
||||
"track-source": "Izvor Pjesme",
|
||||
"unknown-user": "Nepoznati Korisnik"
|
||||
},
|
||||
"menu": {
|
||||
"click-to-copy-id": "Kopiraj ID Hosta",
|
||||
"close": "Zatvori Glazbu Zajedno",
|
||||
"connected-users": "Spojeni Korisnici",
|
||||
"disconnect": "Odspoji Glazbu Zajedno",
|
||||
"empty-user": "Nema spojenih korisnika",
|
||||
"host": "Host Glazbe Zajedno",
|
||||
"join": "Pridruži se Glazbi Zajedno",
|
||||
"permission": {
|
||||
"all": "Dopusti gostima da kontroliraju playlistu i reprodukciju",
|
||||
"host-only": "Samo host može kontrolirati playlistu i reprodukciju",
|
||||
"playlist": "Dozvoli gostima da kontroliraju playlistu"
|
||||
},
|
||||
"set-permission": "Promijeni dozvolu za upravljanje",
|
||||
"status": {
|
||||
"disconnected": "Odspojen",
|
||||
"guest": "Spojen kao Gost",
|
||||
"host": "Spojen kao Host"
|
||||
}
|
||||
},
|
||||
"name": "Glazba Zajedno [Beta]",
|
||||
"toast": {
|
||||
"add-song-failed": "Neuspješno dodavanje pjesme",
|
||||
"closed": "Glazba Zajedno je zatvorena",
|
||||
"disconnected": "Glazba Zajedno je odspojena",
|
||||
"host-failed": "Neuspješno hostanje Glazbe Zajedno",
|
||||
"id-copied": "ID hosta kopiran u međuspremnik",
|
||||
"id-copy-failed": "Neuspješno kopiranje ID-a hosta u međuspremnik",
|
||||
"join-failed": "Neuspješno pridruživanje Glazbi Zajedno",
|
||||
"joined": "Pridružen Glazbi Zajedno",
|
||||
"permission-changed": "Dozvola Glazbe Zajedno promijenjena na '{{permission}}'",
|
||||
"remove-song-failed": "Neuspješno uklanjanje pjesme",
|
||||
"user-connected": "{{name}} se pridružio Glazbi Zajedno",
|
||||
"user-disconnected": "{{name}} je napustio Glazbu Zajedno"
|
||||
}
|
||||
},
|
||||
"navigation": {
|
||||
"description": "Naprijed/Nazad navigacijske strelice su izravno integrirane u sučelje, kao i u vašem omiljenom pregledniku",
|
||||
"name": "Navigacija"
|
||||
},
|
||||
"no-google-login": {
|
||||
"description": "Ukloni Google prijavne gumbe i linkove iz sučelja",
|
||||
"name": "Nema Google Prijave"
|
||||
},
|
||||
"notifications": {
|
||||
"description": "Prikažite obavijest kada pjesma počne svirati (interaktivne obavijesti dostupne su na Windowsu)",
|
||||
"menu": {
|
||||
"interactive": "Interaktivne Obavijesti",
|
||||
"interactive-settings": {
|
||||
"label": "Interaktivne Postavke",
|
||||
"submenu": {
|
||||
"hide-button-text": "Sakrij tekst gumba",
|
||||
"refresh-on-play-pause": "Osvježi pri Reprodukciji/Pauzi",
|
||||
"tray-controls": "Otvori/Zatvori klikom na traku"
|
||||
}
|
||||
},
|
||||
"priority": "Prioritet Obavijesti",
|
||||
"toast-style": "Tipa Toast (kao Android obavjest)",
|
||||
"unpause-notification": "Prikaži notifikaciju pri nastavku"
|
||||
},
|
||||
"name": "Obavijesti"
|
||||
},
|
||||
"performance-improvement": {
|
||||
"description": "Poboljšati performanse uključivanjem eksperimentalnih skripti",
|
||||
"name": "Poboljšanje performansa (Beta)"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -831,7 +831,7 @@
|
||||
},
|
||||
"name": "Videó váltó",
|
||||
"templates": {
|
||||
"button": "Zeneszám"
|
||||
"button-song": "Zeneszám"
|
||||
}
|
||||
},
|
||||
"visualizer": {
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
"common": {
|
||||
"console": {
|
||||
"plugins": {
|
||||
"execute-failed": "Plugin {{pluginName}}::{{contextName}} dieksekusi di {{ms}}ms",
|
||||
"execute-failed": "Gagal menjalankan plugin {{pluginName}}::{{contextName}}",
|
||||
"executed-at-ms": "Plugin {{pluginName}}::{{contextName}} dieksekusi pada {{ms}}ms",
|
||||
"initialize-failed": "Gagal dalam menginisialisasi plugin \"{{pluginName}}\"",
|
||||
"load-all": "Memuat semua plugin",
|
||||
@ -333,35 +333,59 @@
|
||||
"description": "Menerapkan kompresi pada audio (mengurangi volume pada bagian paling keras dari sinyal dan meningkatkan volume pada bagian paling lembut)",
|
||||
"name": "Kompresi suara"
|
||||
},
|
||||
"auth-proxy-adapter": {
|
||||
"description": "Dukungan untuk penggunaan layanan proxy autentikasi",
|
||||
"menu": {
|
||||
"disable": "Nonaktifkan Adapter Proxy",
|
||||
"enable": "Aktifkan Adapter Proxy",
|
||||
"hostname": {
|
||||
"label": "Nama host"
|
||||
},
|
||||
"port": {
|
||||
"label": "Port"
|
||||
}
|
||||
},
|
||||
"name": "Adapter Proxy Autentikasi",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "Masukkan nama host untuk server proxy lokal (memerlukan restart):",
|
||||
"title": "Proxy Nama host"
|
||||
},
|
||||
"port": {
|
||||
"label": "Masukkan port untuk server proxy lokal (memerlukan restart):",
|
||||
"title": "Port Proxy"
|
||||
}
|
||||
}
|
||||
},
|
||||
"blur-nav-bar": {
|
||||
"description": "Jadikan bar navigasi blur dan transparan",
|
||||
"name": "buramkan bar navigasi"
|
||||
"name": "Buramkan Bar Navigasi"
|
||||
},
|
||||
"bypass-age-restrictions": {
|
||||
"description": "Lewati verifikasi umur dari YouTube",
|
||||
"name": "Lewati batasan umur"
|
||||
},
|
||||
"captions-selector": {
|
||||
"description": "pemilih caption untuk trek audio YouTube Music",
|
||||
"description": "Pemilih caption untuk trek audio YouTube Music",
|
||||
"menu": {
|
||||
"autoload": "pilih caption terakhir secara otomatis",
|
||||
"disable-captions": "bawaannya tanpa caption"
|
||||
"autoload": "Pilih caption terakhir secara otomatis",
|
||||
"disable-captions": "Tidak ada caption secara default"
|
||||
},
|
||||
"name": "pemilih caption",
|
||||
"name": "Pemilih Caption",
|
||||
"prompt": {
|
||||
"selector": {
|
||||
"label": "bahasa caption yang dipakai sekarang: {{language}}",
|
||||
"none": "tidak ada",
|
||||
"title": "pilih bahasa caption"
|
||||
"label": "Bahasa caption saat ini: {{language}}",
|
||||
"none": "Tidak ada",
|
||||
"title": "Pilih bahasa caption"
|
||||
}
|
||||
},
|
||||
"templates": {
|
||||
"title": "buka pemilih caption"
|
||||
"title": "Buka pemilih caption"
|
||||
}
|
||||
},
|
||||
"compact-sidebar": {
|
||||
"description": "Selalu atur sidebar dalam mode kompak",
|
||||
"name": "sidebar ringkas"
|
||||
"name": "Sidebar Ringkas"
|
||||
},
|
||||
"crossfade": {
|
||||
"description": "Crossfade antar lagu",
|
||||
@ -372,10 +396,10 @@
|
||||
"prompt": {
|
||||
"options": {
|
||||
"multi-input": {
|
||||
"fade-in-duration": "durasi fade in (ms)",
|
||||
"fade-out-duration": "durasi fade out (ms)",
|
||||
"fade-in-duration": "Durasi fade in (ms)",
|
||||
"fade-out-duration": "Durasi fade out (ms)",
|
||||
"fade-scaling": {
|
||||
"label": "redup perlahan",
|
||||
"label": "Skala fade",
|
||||
"linear": "Linear",
|
||||
"logarithmic": "Logaritmik"
|
||||
},
|
||||
@ -398,15 +422,15 @@
|
||||
"connected": "Terhubung dengan Discord",
|
||||
"disconnected": "Terputus dari Discord"
|
||||
},
|
||||
"description": "tunjukan apa yang kamu dengarkan dengan Rich Presence",
|
||||
"description": "Tunjukkan apa yang kamu dengarkan dengan Rich Presence",
|
||||
"menu": {
|
||||
"auto-reconnect": "Reconnect otomatis",
|
||||
"clear-activity": "Hapus riwayat aktifitas",
|
||||
"clear-activity-after-timeout": "hapus riwayat aktifitas setelah timeout",
|
||||
"connected": "terhubung",
|
||||
"disconnected": "tidak terhubung",
|
||||
"hide-duration-left": "sembunyikan sisa durasi",
|
||||
"hide-github-button": "sembunyikan tombol link GitHub",
|
||||
"clear-activity-after-timeout": "Hapus aktivitas setelah timeout",
|
||||
"connected": "Terhubung",
|
||||
"disconnected": "Terputus",
|
||||
"hide-duration-left": "Sembunyikan sisa durasi",
|
||||
"hide-github-button": "Sembunyikan tombol link GitHub",
|
||||
"play-on-youtube-music": "Mainkan di YouTube Music",
|
||||
"set-inactivity-timeout": "Tetapkan batas waktu tidak aktif"
|
||||
},
|
||||
@ -600,6 +624,10 @@
|
||||
},
|
||||
"name": "Pemberitahuan"
|
||||
},
|
||||
"performance-improvement": {
|
||||
"description": "Tingkatkan kinerja dengan mengaktifkan skrip eksperimental",
|
||||
"name": "Peningkatan kinerja [Beta]"
|
||||
},
|
||||
"picture-in-picture": {
|
||||
"description": "Izinkan untuk memindahkan aplikasi ke mode gambar-dalam-gambar",
|
||||
"menu": {
|
||||
@ -831,7 +859,7 @@
|
||||
},
|
||||
"name": "Peralih Video",
|
||||
"templates": {
|
||||
"button": "Lagu"
|
||||
"button-song": "Lagu"
|
||||
}
|
||||
},
|
||||
"visualizer": {
|
||||
|
||||
@ -799,7 +799,7 @@
|
||||
},
|
||||
"name": "Myndbandsrofi",
|
||||
"templates": {
|
||||
"button": "Lag"
|
||||
"button-song": "Lag"
|
||||
}
|
||||
},
|
||||
"visualizer": {
|
||||
|
||||
@ -333,6 +333,30 @@
|
||||
"description": "Attiva la compressione audio (abbassa il volume delle parti più alte e alza quello delle parti più basse del segnale)",
|
||||
"name": "Compressore audio"
|
||||
},
|
||||
"auth-proxy-adapter": {
|
||||
"description": "Supporto per l'utilizzo di servizi proxy di autenticazione",
|
||||
"menu": {
|
||||
"disable": "Disattiva adattatore proxy",
|
||||
"enable": "Attiva adattatore proxy",
|
||||
"hostname": {
|
||||
"label": "Nome host"
|
||||
},
|
||||
"port": {
|
||||
"label": "Porta"
|
||||
}
|
||||
},
|
||||
"name": "Adattatore proxy di autenticazione",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "Inserire hostname del server proxy locale (richiede riavvio):",
|
||||
"title": "Nome host del proxy"
|
||||
},
|
||||
"port": {
|
||||
"label": "Inserire porta del server proxy locale (richiede riavvio):",
|
||||
"title": "Porta Proxy"
|
||||
}
|
||||
}
|
||||
},
|
||||
"blur-nav-bar": {
|
||||
"description": "Rende la barra di navigazione trasparente e sfuocata",
|
||||
"name": "Barra di navigazione trasparente"
|
||||
@ -357,6 +381,11 @@
|
||||
},
|
||||
"templates": {
|
||||
"title": "Apri il selettore dei sottotitoli"
|
||||
},
|
||||
"toast": {
|
||||
"caption-changed": "Sottotitoli cambiati in {{language}}",
|
||||
"caption-disabled": "Sottotitoli disattivati",
|
||||
"no-captions": "Nessun sottotitolo disponibile per questa canzone"
|
||||
}
|
||||
},
|
||||
"compact-sidebar": {
|
||||
@ -576,7 +605,15 @@
|
||||
},
|
||||
"navigation": {
|
||||
"description": "Frecce di navigazione Avanti/Indietro integrate direttamente nell'interfaccia, come nel tuo browser preferito",
|
||||
"name": "Navigazione"
|
||||
"name": "Navigazione",
|
||||
"templates": {
|
||||
"back": {
|
||||
"title": "Vai alla pagina precedente"
|
||||
},
|
||||
"forward": {
|
||||
"title": "Vai alla pagina successiva"
|
||||
}
|
||||
}
|
||||
},
|
||||
"no-google-login": {
|
||||
"description": "Rimuovi i pulsanti di accesso e i link di Google dall'interfaccia",
|
||||
@ -600,6 +637,10 @@
|
||||
},
|
||||
"name": "Notifiche"
|
||||
},
|
||||
"performance-improvement": {
|
||||
"description": "Migliora le prestazioni abilitando gli script sperimentali",
|
||||
"name": "Miglioramento prestazioni [Beta]"
|
||||
},
|
||||
"picture-in-picture": {
|
||||
"description": "Consente di far passare l'app alla modalità Picture-in-Picture",
|
||||
"menu": {
|
||||
@ -746,6 +787,7 @@
|
||||
"label": "Effetto linea",
|
||||
"submenu": {
|
||||
"fancy": {
|
||||
"label": "Fantasia",
|
||||
"tooltip": "Usa effetti grandi, simili a quelli di un'app sulla riga attuale"
|
||||
},
|
||||
"focus": {
|
||||
@ -830,7 +872,8 @@
|
||||
},
|
||||
"name": "Selettore Brano/Video",
|
||||
"templates": {
|
||||
"button": "Brano"
|
||||
"button-song": "Brano",
|
||||
"button-video": "Video"
|
||||
}
|
||||
},
|
||||
"visualizer": {
|
||||
|
||||
@ -333,6 +333,28 @@
|
||||
"description": "オーディオにコンプレッサーを適用します(信号での一番大きい部分の音量を下げ、小さい部分の音量を上げる)",
|
||||
"name": "オーディオコンプレッサー"
|
||||
},
|
||||
"auth-proxy-adapter": {
|
||||
"menu": {
|
||||
"disable": "プロキシアダプターを無効にする",
|
||||
"enable": "プロキシアダプターを有効にする",
|
||||
"hostname": {
|
||||
"label": "ホスト名"
|
||||
},
|
||||
"port": {
|
||||
"label": "ポート"
|
||||
}
|
||||
},
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "ローカルプロキシサーバのホスト名を入力します(再起動が必要です):",
|
||||
"title": "プロキシホスト名"
|
||||
},
|
||||
"port": {
|
||||
"label": "ローカルプロキシサーバのポートを入力します(再起動が必要です):",
|
||||
"title": "プロキシポート"
|
||||
}
|
||||
}
|
||||
},
|
||||
"blur-nav-bar": {
|
||||
"description": "ナビゲーションバーを透明かつぼやけにします",
|
||||
"name": "ナビゲーションバーの曇り効果"
|
||||
@ -600,6 +622,10 @@
|
||||
},
|
||||
"name": "通知"
|
||||
},
|
||||
"performance-improvement": {
|
||||
"description": "実験的スクリプトを有効にすることによってパフォーマンス改善します",
|
||||
"name": "パフォーマンス改善 [ベータ]"
|
||||
},
|
||||
"picture-in-picture": {
|
||||
"description": "アプリでピクチャ・イン・ピクチャを切り替えられるようになります",
|
||||
"menu": {
|
||||
@ -831,7 +857,7 @@
|
||||
},
|
||||
"name": "動画の切り替え",
|
||||
"templates": {
|
||||
"button": "曲"
|
||||
"button-song": "曲"
|
||||
}
|
||||
},
|
||||
"visualizer": {
|
||||
|
||||
@ -164,7 +164,7 @@
|
||||
"remove": "제거"
|
||||
},
|
||||
"remove-theme": "사용자 정의 테마를 제거하시겠습니까?",
|
||||
"remove-theme-message": "사용자 정의 테마가 제거됩니다. 계속하시겠습니까?"
|
||||
"remove-theme-message": "사용자 정의 테마를 제거하시겠습니까?"
|
||||
},
|
||||
"label": "테마",
|
||||
"submenu": {
|
||||
@ -333,6 +333,30 @@
|
||||
"description": "오디오에 컴프레서를 적용합니다 (신호에서 가장 시끄러운 부분의 음량을 낮추고 가장 조용한 부분의 음량을 높임)",
|
||||
"name": "오디오 컴프레서"
|
||||
},
|
||||
"auth-proxy-adapter": {
|
||||
"description": "인증 프록시 서비스 사용 지원",
|
||||
"menu": {
|
||||
"disable": "프록시 어댑터 차단",
|
||||
"enable": "프록시 어댑터 허용",
|
||||
"hostname": {
|
||||
"label": "호스트 명"
|
||||
},
|
||||
"port": {
|
||||
"label": "포트"
|
||||
}
|
||||
},
|
||||
"name": "권한 프록시 어댑터",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "로컬 프록시 서버의 호스트명 을 입력 해주세요 (재시동이 필요합니다):",
|
||||
"title": "프록시 호스트명"
|
||||
},
|
||||
"port": {
|
||||
"label": "로컬 프록시 서버의 포트를 입력 해주세요 (재시동이 필요합니다):",
|
||||
"title": "프록시 포트"
|
||||
}
|
||||
}
|
||||
},
|
||||
"blur-nav-bar": {
|
||||
"description": "탐색 바를 투명하고 흐릿하게 만듭니다",
|
||||
"name": "탐색 바 흐림 효과"
|
||||
@ -357,6 +381,11 @@
|
||||
},
|
||||
"templates": {
|
||||
"title": "자막 선택기 열기"
|
||||
},
|
||||
"toast": {
|
||||
"caption-changed": "자막 언어가 {{language}}(으)로 변경되었습니다",
|
||||
"caption-disabled": "자막이 비활성화 되었습니다",
|
||||
"no-captions": "이 곡에는 자막이 없습니다"
|
||||
}
|
||||
},
|
||||
"compact-sidebar": {
|
||||
@ -576,7 +605,15 @@
|
||||
},
|
||||
"navigation": {
|
||||
"description": "브라우저에서처럼, UI에 직접 통합된 앞으로/뒤로 탐색하는 화살표",
|
||||
"name": "탐색"
|
||||
"name": "탐색",
|
||||
"templates": {
|
||||
"back": {
|
||||
"title": "이전 페이지로 이동"
|
||||
},
|
||||
"forward": {
|
||||
"title": "다음 페이지로 이동"
|
||||
}
|
||||
}
|
||||
},
|
||||
"no-google-login": {
|
||||
"description": "UI에서 Google 로그인 버튼 및 링크 제거하기",
|
||||
@ -601,7 +638,7 @@
|
||||
"name": "알림"
|
||||
},
|
||||
"performance-improvement": {
|
||||
"description": "위험한 스크립트를 활성화하여 성능을 개선합니다",
|
||||
"description": "실험적인 스크립트를 활성화하여 성능을 개선합니다",
|
||||
"name": "성능 개선 [베타]"
|
||||
},
|
||||
"picture-in-picture": {
|
||||
@ -668,7 +705,12 @@
|
||||
}
|
||||
},
|
||||
"description": "영상 오버레이의 버튼으로 영상 품질을 변경할 수 있습니다",
|
||||
"name": "영상 품질 체인저"
|
||||
"name": "영상 품질 체인저",
|
||||
"renderer": {
|
||||
"quality-settings-button": {
|
||||
"label": "영상 품질 선택기 열기"
|
||||
}
|
||||
}
|
||||
},
|
||||
"scrobbler": {
|
||||
"description": "스크로블링 지원을 추가합니다 (예: last.fm, Listenbrainz)",
|
||||
@ -835,7 +877,8 @@
|
||||
},
|
||||
"name": "영상 전환",
|
||||
"templates": {
|
||||
"button": "노래"
|
||||
"button-song": "노래",
|
||||
"button-video": "영상"
|
||||
}
|
||||
},
|
||||
"visualizer": {
|
||||
|
||||
@ -618,7 +618,7 @@
|
||||
},
|
||||
"name": "Vaizdo įrašo perjungimas",
|
||||
"templates": {
|
||||
"button": "Daina"
|
||||
"button-song": "Daina"
|
||||
}
|
||||
},
|
||||
"visualizer": {
|
||||
|
||||
487
src/i18n/resources/lv.json
Normal file
487
src/i18n/resources/lv.json
Normal file
@ -0,0 +1,487 @@
|
||||
{
|
||||
"common": {
|
||||
"console": {
|
||||
"plugins": {
|
||||
"execute-failed": "Problēma ielādēt plaginu {{pluginName}}::{{contextName}}",
|
||||
"executed-at-ms": "Plagins {{pluginName}}::{{contextName}} ielādējās par{{ms}}ms",
|
||||
"initialize-failed": "Kļūda inicializējot plaginu \"{{pluginName}}\"",
|
||||
"load-all": "Ielādē visus plaginus",
|
||||
"load-failed": "Kļūda ielādējot plaginu \"{{pluginName}}\"",
|
||||
"loaded": "Plagins \"{{pluginName}}\" ielādēts",
|
||||
"unload-failed": "Kļūda izlādējot plaginu \"{{pluginName}}\"",
|
||||
"unloaded": "Plagins \"{{pluginName}}\" izlādēts"
|
||||
}
|
||||
}
|
||||
},
|
||||
"language": {
|
||||
"code": "lv",
|
||||
"local-name": "Latviešu",
|
||||
"name": "Latvian"
|
||||
},
|
||||
"main": {
|
||||
"console": {
|
||||
"did-finish-load": {
|
||||
"dev-tools": "Lejupielāde pabeigta. DevTools atvērts"
|
||||
},
|
||||
"i18n": {
|
||||
"loaded": "i18n ielādēts"
|
||||
},
|
||||
"second-instance": {
|
||||
"receive-command": "Saņemta komanda pāri protokolam: \"{{command}}\""
|
||||
},
|
||||
"theme": {
|
||||
"css-file-not-found": "CSS fails \"{{cssFile}}\" neeksistē, ignorējas"
|
||||
},
|
||||
"unresponsive": {
|
||||
"details": "Lietotne neatbild\n{{error}}"
|
||||
},
|
||||
"when-ready": {
|
||||
"clearing-cache-after-20s": "Iztīra lietotnes kešu"
|
||||
},
|
||||
"window": {
|
||||
"tried-to-render-offscreen": "Logs mēģināja atvērties ārpuss ekrāna barjeriem, loga izmērs={{windowSize}}, ekrāna izškirtspēja={{displaySize}}, pozīcija={{position}}"
|
||||
}
|
||||
},
|
||||
"dialog": {
|
||||
"hide-menu-enabled": {
|
||||
"detail": "Izvēlne ir noslēpta, izmantojiet 'Alt' lai to parādītu (vai 'Escape' ja izmanto lietotnes iekšējo izvēlni)",
|
||||
"message": "Izvēlnes noslēpšana ir ieslēgta",
|
||||
"title": "Izvēlnes noslēpšana ieslēgta"
|
||||
},
|
||||
"need-to-restart": {
|
||||
"buttons": {
|
||||
"later": "Vēlāk",
|
||||
"restart-now": "Restartēt Tagad"
|
||||
},
|
||||
"detail": "Restartējiet lietotni lai aktivizētu plaginu {{pluginName}}",
|
||||
"message": "{{pluginName}} pieprasa restartēšanu",
|
||||
"title": "Vajadzīga restartēšana"
|
||||
},
|
||||
"unresponsive": {
|
||||
"buttons": {
|
||||
"quit": "Iziet",
|
||||
"relaunch": "Restartēt",
|
||||
"wait": "Pagaidat"
|
||||
},
|
||||
"detail": "Atvainojamies par neērtībām! Lūdzu izvēlaties ko darīt:",
|
||||
"message": "Lietotne neatbild",
|
||||
"title": "Logs neatbild"
|
||||
},
|
||||
"update-available": {
|
||||
"buttons": {
|
||||
"disable": "Izslēgt atjauninājumus",
|
||||
"download": "Lejupielādēt",
|
||||
"ok": "OK"
|
||||
},
|
||||
"detail": "Jauna versija ir pieejama, un var tikt lejupielādēta šeit {{downloadLink}}",
|
||||
"message": "Pieejama jauna versija",
|
||||
"title": "Pieejams atjauninājums"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"about": "Par",
|
||||
"navigation": {
|
||||
"label": "Navigācija",
|
||||
"submenu": {
|
||||
"copy-current-url": "Kopēt pašreizējo URL",
|
||||
"go-back": "Atgriezties",
|
||||
"go-forward": "Uz priekšu",
|
||||
"quit": "Iziet",
|
||||
"restart": "Restartēt lietotni"
|
||||
}
|
||||
},
|
||||
"options": {
|
||||
"label": "Iestatījumi",
|
||||
"submenu": {
|
||||
"advanced-options": {
|
||||
"label": "Paplašināti iestatījumi",
|
||||
"submenu": {
|
||||
"auto-reset-app-cache": "Iztīrīt kešu kad lietotne palaižas",
|
||||
"disable-hardware-acceleration": "Atslēgt aparatūras paātrinājumu",
|
||||
"edit-config-json": "Labot config.json",
|
||||
"override-user-agent": "Pārrakstīt lietotāja aģenta informāciju",
|
||||
"restart-on-config-changes": "Restartēt kad mainās konfigurācija",
|
||||
"set-proxy": {
|
||||
"label": "Iestatīt proxy",
|
||||
"prompt": {
|
||||
"label": "Ievadiet Proxy adresi: (atstajiet tukšu lai izslēgtu)",
|
||||
"placeholder": "Piemērs: SOCKS5://127.0.0.1:9999",
|
||||
"title": "Iestatīt proxy"
|
||||
}
|
||||
},
|
||||
"toggle-dev-tools": "Ieslēgt DevTools"
|
||||
}
|
||||
},
|
||||
"always-on-top": "Vienmēr priekšā",
|
||||
"auto-update": "Automātiski atjauninājumi",
|
||||
"hide-menu": {
|
||||
"dialog": {
|
||||
"message": "Izvēlne tiks paslēpta kad palaidīsiet letotni atkal, izmantojiet [Alt] lai parādīt to (vai [`] ja izmantojiet lietotnes iekšējo izvēlni)",
|
||||
"title": "Izvēlnes paslepšana ieslēgta"
|
||||
},
|
||||
"label": "Paslēpt izvēlni"
|
||||
},
|
||||
"language": {
|
||||
"dialog": {
|
||||
"message": "Valoda tiks pamainīta pēc restartēšanas",
|
||||
"title": "Valoda pamainīta"
|
||||
},
|
||||
"label": "Valoda",
|
||||
"submenu": {
|
||||
"to-help-translate": "Gribat palīdzēt ar tulkošanu? Spiežat šeit"
|
||||
}
|
||||
},
|
||||
"resume-on-start": "Turpināt pēdējo dziesmu kad lietotne palaižas",
|
||||
"single-instance-lock": "Liegums palaists vairākas lietotnes",
|
||||
"start-at-login": "Palaist ieslēdzot datoru",
|
||||
"starting-page": {
|
||||
"label": "Sākuma lapa",
|
||||
"unset": "Nav iestatīts"
|
||||
},
|
||||
"tray": {
|
||||
"label": "Minimizēt uz teknīti",
|
||||
"submenu": {
|
||||
"disabled": "Izslēgts",
|
||||
"enabled-and-hide-app": "Teknīte ieslēgta, paslēpt lietotnes logu",
|
||||
"enabled-and-show-app": "Ielsēgts un rādīt lietotni",
|
||||
"play-pause-on-click": "Atskaņot/Pauzēt piespiežot"
|
||||
}
|
||||
},
|
||||
"visual-tweaks": {
|
||||
"label": "Vizuāli Iestatījumi",
|
||||
"submenu": {
|
||||
"like-buttons": {
|
||||
"default": "Noklusējums",
|
||||
"force-show": "Vienmēr rādīt",
|
||||
"hide": "Paslēpt",
|
||||
"label": "Like pogas"
|
||||
},
|
||||
"remove-upgrade-button": "Noslēpt YouTube Premium pogu",
|
||||
"theme": {
|
||||
"dialog": {
|
||||
"button": {
|
||||
"cancel": "Atcelt",
|
||||
"remove": "Noņemt"
|
||||
},
|
||||
"remove-theme": "Vai tiešām, gribat noņemt šo lietotāj tēmu?",
|
||||
"remove-theme-message": "Šis noņems lietotāja tēmu"
|
||||
},
|
||||
"label": "Tēma",
|
||||
"submenu": {
|
||||
"import-css-file": "Importēt CSS failu",
|
||||
"no-theme": "Bez tēmas"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"enabled": "Ieslēgts",
|
||||
"label": "Plagini",
|
||||
"new": "JAUNS"
|
||||
},
|
||||
"view": {
|
||||
"label": "Skats",
|
||||
"submenu": {
|
||||
"force-reload": "Piespiedu Restartēt",
|
||||
"reload": "Atsvaidzināt",
|
||||
"reset-zoom": "Noklusējuma izmērs",
|
||||
"toggle-fullscreen": "Pārslēgt pilnekrāna režīmu",
|
||||
"zoom-in": "Pietuvināt",
|
||||
"zoom-out": "Attālināt"
|
||||
}
|
||||
}
|
||||
},
|
||||
"tray": {
|
||||
"next": "Nākošais",
|
||||
"play-pause": "Atskaņot/Pauzēt",
|
||||
"previous": "Iepriekšējais",
|
||||
"quit": "Iziet",
|
||||
"restart": "Restartēt Lietotni",
|
||||
"show": "Rādīt logu",
|
||||
"tooltip": {
|
||||
"default": "YouTube Music",
|
||||
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"ad-speedup": {
|
||||
"description": "Ja reklāma atskaņojas, tad skaņa izlēdzas, un ātrums pārslēdzas uz 16x",
|
||||
"name": "Reklāmu paātrinājums"
|
||||
},
|
||||
"adblocker": {
|
||||
"description": "Bloķēt visas reklāmas un trekerus uzreiz pēc instalēšanas",
|
||||
"menu": {
|
||||
"blocker": "Bloķētājs"
|
||||
},
|
||||
"name": "Reklāmu bloķētājs"
|
||||
},
|
||||
"album-actions": {
|
||||
"description": "Pievieno Undislike, Dislike, Like, un Unlike pogas lai izdarītu to visām dziesmām Mūzikas sarakstā vai albumā",
|
||||
"name": "Darbības ar Albumu"
|
||||
},
|
||||
"album-color-theme": {
|
||||
"description": "Iestata dinamisku motīvu un efektus, pamatojoties uz albuma krāsu paleti",
|
||||
"menu": {
|
||||
"color-mix-ratio": {
|
||||
"label": "Krāsu attiecība",
|
||||
"submenu": {
|
||||
"percent": "{{ratio}}%"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Albuma krāsu tēma"
|
||||
},
|
||||
"ambient-mode": {
|
||||
"description": "Pielieto apgaismojuma efektu, kas maigā krāsā atstaro video attēlu uz ekrāna fona",
|
||||
"menu": {
|
||||
"blur-amount": {
|
||||
"label": "Izplūšanas itensitāte",
|
||||
"submenu": {
|
||||
"pixels": "{{blurAmount}} pikseļi"
|
||||
}
|
||||
},
|
||||
"buffer": {
|
||||
"label": "buferis",
|
||||
"submenu": {
|
||||
"buffer": "{{buffer}}"
|
||||
}
|
||||
},
|
||||
"opacity": {
|
||||
"label": "Caurspīdīgums",
|
||||
"submenu": {
|
||||
"percent": "{{opacity}}%"
|
||||
}
|
||||
},
|
||||
"quality": {
|
||||
"label": "Kvalitāte",
|
||||
"submenu": {
|
||||
"pixels": "{{quality}} pikseļi"
|
||||
}
|
||||
},
|
||||
"size": {
|
||||
"label": "Izmērs",
|
||||
"submenu": {
|
||||
"percent": "{{size}}%"
|
||||
}
|
||||
},
|
||||
"smoothness-transition": {
|
||||
"label": "Vienmērīga pāreja",
|
||||
"submenu": {
|
||||
"during": "Pa {{interpolationTime}} s"
|
||||
}
|
||||
},
|
||||
"use-fullscreen": {
|
||||
"label": "Izmantot pilnekrāna režīmu"
|
||||
}
|
||||
},
|
||||
"name": "Ambientais Režīms"
|
||||
},
|
||||
"amuse": {
|
||||
"description": "Pievieno YouTube Music atblastu priekš Amuse \"tagad spēlē\" no 6K Labs",
|
||||
"name": "Amuse",
|
||||
"response": {
|
||||
"query": "Amuse API serveris ir palaists. GET /query lai dabūtu dziesmas info."
|
||||
}
|
||||
},
|
||||
"api-server": {
|
||||
"description": "Pievieno API serveri lai kontrolētu atskaņotāju",
|
||||
"dialog": {
|
||||
"request": {
|
||||
"buttons": {
|
||||
"allow": "Atļaut",
|
||||
"deny": "Aizliegt"
|
||||
},
|
||||
"message": "Vai atļaut {{ID}} ({{origin}}) piekļūt pie API?",
|
||||
"title": "API autorizācijas pieprasījums"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"auth-strategy": {
|
||||
"label": "Autorizācijas veids",
|
||||
"submenu": {
|
||||
"auth-at-first": {
|
||||
"label": "Autorizēt pie pirmā pieprasījuma"
|
||||
},
|
||||
"none": {
|
||||
"label": "Bez autorizācijas"
|
||||
}
|
||||
}
|
||||
},
|
||||
"hostname": {
|
||||
"label": "Hosta nosaukums"
|
||||
},
|
||||
"port": {
|
||||
"label": "Ports"
|
||||
}
|
||||
},
|
||||
"name": "API Serveris [BETA]",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "Ievadiet hosta vārdu (piemēram 0.0.0.0) priekš API severa:",
|
||||
"title": "Hosta vārds"
|
||||
},
|
||||
"port": {
|
||||
"label": "Ievadiet portu priekš API servera:",
|
||||
"title": "Ports"
|
||||
}
|
||||
}
|
||||
},
|
||||
"audio-compressor": {
|
||||
"description": "Pievieno saspiešanu pie audio (samazina skaļāko audio daļu skaļumu un palielina mīkstāko daļu skaļumu)",
|
||||
"name": "Audio saspiedējs"
|
||||
},
|
||||
"auth-proxy-adapter": {
|
||||
"description": "Atbalsts priekš proxy servisu autentifikācijas",
|
||||
"menu": {
|
||||
"disable": "Izslēgt Proxy Adapteri",
|
||||
"enable": "Ieslēgt Proxy Adapteri",
|
||||
"hostname": {
|
||||
"label": "Hosta vārds"
|
||||
},
|
||||
"port": {
|
||||
"label": "Ports"
|
||||
}
|
||||
},
|
||||
"name": "Autorizācijas Proxy Adapteris",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "Ievadiet hosta vārdu priekš lokālā proxy servera (nepieciešama restartēšana):",
|
||||
"title": "Proxy hosta vārds"
|
||||
},
|
||||
"port": {
|
||||
"label": "Ievadiet portu priekš lokālā proxy servera (nepieciešams restartēt):",
|
||||
"title": "Proxy Ports"
|
||||
}
|
||||
}
|
||||
},
|
||||
"blur-nav-bar": {
|
||||
"description": "Taisa navigāzijas joslu caurspīdīgu un izplūdušu",
|
||||
"name": "Izplūdusi Navigācijas Josla"
|
||||
},
|
||||
"bypass-age-restrictions": {
|
||||
"description": "Apiet YouTube vecuma pārbaudi",
|
||||
"name": "Apiet Vecuma Ierobežojumus"
|
||||
},
|
||||
"captions-selector": {
|
||||
"description": "Subtitru izvēlne priekš YouTube Music audio ceļiem",
|
||||
"menu": {
|
||||
"autoload": "Automātiski izvēlēties pēdējo izmantotos subtitrus",
|
||||
"disable-captions": "Bez subtitriem pēc noklusējuma"
|
||||
},
|
||||
"name": "Subtitru Izvēlne",
|
||||
"prompt": {
|
||||
"selector": {
|
||||
"label": "Tekošā subtitru valoda: {{language}}",
|
||||
"none": "Neviens",
|
||||
"title": "Izvēlieties subtitru valodu"
|
||||
}
|
||||
},
|
||||
"templates": {
|
||||
"title": "Atvērt subtitru izvēlni"
|
||||
}
|
||||
},
|
||||
"compact-sidebar": {
|
||||
"description": "Vienmēr iestatīt malējo paneli kompaktajā režīmā",
|
||||
"name": "Kompakts malējais panelis"
|
||||
},
|
||||
"crossfade": {
|
||||
"description": "Maiga pāreja starp dziesmām",
|
||||
"menu": {
|
||||
"advanced": "Paplašināts"
|
||||
},
|
||||
"name": "Maiga pāreja [BETA]",
|
||||
"prompt": {
|
||||
"options": {
|
||||
"multi-input": {
|
||||
"fade-in-duration": "Ieplūšanas ilgums (ms)",
|
||||
"fade-out-duration": "Izplūšanas ilgums (ms)",
|
||||
"fade-scaling": {
|
||||
"label": "Pārejas stiprums",
|
||||
"linear": "Lineārs",
|
||||
"logarithmic": "Logaritmisks"
|
||||
},
|
||||
"seconds-before-end": "Maigas pārejas N sekundes pirms beigām"
|
||||
},
|
||||
"title": "Maigas pārejas iestatījumi"
|
||||
}
|
||||
}
|
||||
},
|
||||
"disable-autoplay": {
|
||||
"description": "Palaiž dziesmu nopauzētu",
|
||||
"menu": {
|
||||
"apply-once": "Iedarbojas tikai palaišanas brīdī"
|
||||
},
|
||||
"name": "Atspējot automātisku atskaņošanu"
|
||||
},
|
||||
"discord": {
|
||||
"backend": {
|
||||
"already-connected": "Mēģināja pieslēgties jau ar aktīvu savienojumu",
|
||||
"connected": "Pieslēgts pie Discord",
|
||||
"disconnected": "Atslēgts no Discord"
|
||||
},
|
||||
"description": "Parādiet saviem draugiem ko jūs klausaties ar Rich Presence",
|
||||
"menu": {
|
||||
"auto-reconnect": "Automātiska atkārtota pieslēgšanās",
|
||||
"clear-activity": "Attīrīt aktivitāti",
|
||||
"clear-activity-after-timeout": "Attīrīt aktivitāti pēc taimauta",
|
||||
"connected": "Pievienojies",
|
||||
"disconnected": "Atvienojies",
|
||||
"hide-duration-left": "Paslēpt cik palika laika",
|
||||
"hide-github-button": "Paslēpt GitHub saites pogu",
|
||||
"play-on-youtube-music": "Atskaņot uz YouTube Music",
|
||||
"set-inactivity-timeout": "Iestatīt neaktivitātes taimeru"
|
||||
},
|
||||
"name": "Discord Rich Presence",
|
||||
"prompt": {
|
||||
"set-inactivity-timeout": {
|
||||
"label": "Ievadiet neaktivitātes taimeru sekundēs:",
|
||||
"title": "Iestatīt neaktivitātes taimeru"
|
||||
}
|
||||
}
|
||||
},
|
||||
"downloader": {
|
||||
"backend": {
|
||||
"dialog": {
|
||||
"error": {
|
||||
"buttons": {
|
||||
"ok": "OK"
|
||||
},
|
||||
"message": "Atvainojamies, lejupielāde neizdevās…",
|
||||
"title": "Lejupielādes kļūda!"
|
||||
},
|
||||
"start-download-playlist": {
|
||||
"buttons": {
|
||||
"ok": "OK"
|
||||
},
|
||||
"detail": "({{playlistSize}}Dziesmas)",
|
||||
"message": "Lejupielādē atskaņošanas sarakstu {{playlistTitle}}",
|
||||
"title": "Lejupielāde sākta"
|
||||
}
|
||||
},
|
||||
"feedback": {
|
||||
"conversion-progress": "Konvertēšana: {{percent}}%",
|
||||
"converting": "Konvertēšana…",
|
||||
"done": "Pabeigts: {{filePath}}",
|
||||
"download-info": "Lejupielādē {{artist}} - {{title}}{{videoId}}",
|
||||
"download-progress": "Lejupielāde: {{percent}}%",
|
||||
"downloading": "Lejupielādē…",
|
||||
"downloading-counter": "Notiek lejupielāde {{current}}/{{total}}…",
|
||||
"downloading-playlist": "Atskaņošanas saraksta lejupielāde \"{{playlistTitle}}\" - {{playlistSize}} songs ({{playlistId}})",
|
||||
"error-while-downloading": "Kļūda lejuplādējot \"{{author}} - {{title}}\": {{error}}",
|
||||
"folder-already-exists": "Mape {{playlistFolder}} jau eksistē",
|
||||
"getting-playlist-info": "Tiek iegūta atskaņošanas saraksta informācija…",
|
||||
"loading": "Ielādē…",
|
||||
"playlist-has-only-one-song": "Sarakstā ir tikai viena dziesma, tā tiek lejupielādēta uzreiz",
|
||||
"playlist-id-not-found": "Neizdevās atrast atskaņošanas saraksta ID",
|
||||
"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}}",
|
||||
"preparing-file": "Faila sagatavošana…",
|
||||
"saving": "Saglabāšana…"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2,9 +2,13 @@
|
||||
"common": {
|
||||
"console": {
|
||||
"plugins": {
|
||||
"execute-failed": "{{pluginName}}::{{contextName}} പ്ലഗിൻ നടപ്പിലാക്കുന്നതിൽ പരാജയപ്പെട്ടു",
|
||||
"executed-at-ms": "{{pluginName}}::{{contextName}} പ്ലഗിൻ {{ms}}ms-ൽ നടപ്പിലാക്കി",
|
||||
"initialize-failed": "{{pluginName}}എന്ന പ്ലഗിൻ തുടങ്ങുന്നതിൽ പരാജയപെട്ടു",
|
||||
"load-all": "എല്ലാ പ്ലേഗിനും ലോഡ് ചെയ്യുന്നു",
|
||||
"load-failed": "\"{{pluginName}}\" പ്ലഗിൻ ലോഡ് ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു",
|
||||
"loaded": "{{pluginName}} എന്ന പ്ലഗിൻ ലോഡ് ചെയ്തു",
|
||||
"unload-failed": "\"{{pluginName}}\" പ്ലഗിൻ അൺലോഡ് ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു",
|
||||
"unloaded": "{{pluginName}} എന്ന പ്ലഗിൻ അൺലോഡ് ചെയ്തു"
|
||||
}
|
||||
}
|
||||
@ -50,7 +54,59 @@
|
||||
"restart-now": "ഇപ്പോൾ പുനരാരംഭിക്കുക"
|
||||
},
|
||||
"detail": "\"{{pluginName}}\" പ്രവർത്തിയിൽ ആകാൻ restart വേണ്ടിയിരിക്കുന്നു",
|
||||
"message": "\"{{pluginName}}\" restart ആവശ്യപെടുന്നു"
|
||||
"message": "\"{{pluginName}}\" restart ആവശ്യപെടുന്നു",
|
||||
"title": "പുനരാരംഭിക്കേണ്ടതുണ്ട്"
|
||||
},
|
||||
"unresponsive": {
|
||||
"buttons": {
|
||||
"relaunch": "പുനരാരംഭിക്കുക",
|
||||
"wait": "കാത്തിരിക്കൂ"
|
||||
},
|
||||
"detail": "അസൗകര്യത്തിൽ ഞങ്ങൾ ഖേദിക്കുന്നു! എന്തുചെയ്യണമെന്ന് ദയവായി തിരഞ്ഞെടുക്കുക:",
|
||||
"message": "ആപ്ലിക്കേഷൻ പ്രതികരിക്കുന്നില്ല",
|
||||
"title": "വിൻഡോ പ്രതികരിക്കുന്നില്ല"
|
||||
},
|
||||
"update-available": {
|
||||
"buttons": {
|
||||
"disable": "അപ്ഡേറ്റുകൾ പ്രവർത്തനരഹിതമാക്കുക",
|
||||
"download": "ഡൗൺലോഡ് ചെയ്യുക",
|
||||
"ok": "ശരി"
|
||||
},
|
||||
"detail": "ഒരു പുതിയ പതിപ്പ് ലഭ്യമാണ്, അത് {{downloadLink}} എന്ന വിലാസത്തിൽ നിന്ന് ഡൗൺലോഡ് ചെയ്യാം",
|
||||
"message": "ഒരു പുതിയ പതിപ്പ് ലഭ്യമാണ്",
|
||||
"title": "അപ്ഡേറ്റ് ലഭ്യമാണ്"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"navigation": {
|
||||
"label": "നാവിഗേഷൻ",
|
||||
"submenu": {
|
||||
"copy-current-url": "നിലവിലെ URL പകർത്തുക",
|
||||
"go-back": "മടങ്ങിപ്പോവുക",
|
||||
"go-forward": "മുന്നോട്ട് പോകുക",
|
||||
"quit": "പുറത്തുകടക്കുക",
|
||||
"restart": "ആപ്പ് പുനരാരംഭിക്കുക"
|
||||
}
|
||||
},
|
||||
"options": {
|
||||
"label": "ഓപ്ഷനുകൾ",
|
||||
"submenu": {
|
||||
"advanced-options": {
|
||||
"label": "വിപുലമായ ഓപ്ഷനുകൾ",
|
||||
"submenu": {
|
||||
"restart-on-config-changes": "കോൺഫിഗറേഷൻ മാറ്റങ്ങൾ വരുത്തുമ്പോൾ പുനരാരംഭിക്കുക"
|
||||
}
|
||||
},
|
||||
"hide-menu": {
|
||||
"dialog": {
|
||||
"message": "അടുത്ത ലോഞ്ചിൽ മെനു മറയ്ക്കപ്പെടും, അത് കാണിക്കാൻ [Alt] ഉപയോഗിക്കുക (അല്ലെങ്കിൽ ഇൻ-ആപ്പ്-മെനു ഉപയോഗിക്കുകയാണെങ്കിൽ ബാക്ക്ടിക്ക് [`])",
|
||||
"title": "മെനു മറയ്ക്കൽ സജീവമാക്കി"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"enabled": "പ്രവർത്തനക്ഷമമാക്കി"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -6,6 +6,7 @@
|
||||
"executed-at-ms": "Plugin {{pluginName}}::{{contextName}} dilaksanakan pada {{ms}}ms",
|
||||
"initialize-failed": "Gagal untuk memulakan plugin \"{{pluginName}}\"",
|
||||
"load-all": "Memuatkan semua plugin",
|
||||
"load-failed": "Gagal untuk memuatkan \"{{pluginName}}\"",
|
||||
"loaded": "Plugin \"{{pluginName}}\" dimuatkan",
|
||||
"unload-failed": "Gagal untuk memunggah plugin \"{{pluginName}}\"",
|
||||
"unloaded": "Plugin \"{{pluginName}}\" dipunggahkan"
|
||||
@ -31,19 +32,28 @@
|
||||
"theme": {
|
||||
"css-file-not-found": "Fail CSS \"{{cssFile}}\" tidak wujud, mengabaikan"
|
||||
},
|
||||
"unresponsive": {
|
||||
"details": "Ralat Tidak Bertindak Balas!\n{{error}}"
|
||||
},
|
||||
"when-ready": {
|
||||
"clearing-cache-after-20s": "Membersihkan cache aplikasi"
|
||||
},
|
||||
"window": {
|
||||
"tried-to-render-offscreen": "Tetingkap cuba dirender di luar skrin, windowSize={{windowSize}}, displaySize={{displaySize}}, position={{position}}"
|
||||
}
|
||||
},
|
||||
"dialog": {
|
||||
"hide-menu-enabled": {
|
||||
"detail": "Menu telah disembunyikan, guna 'Alt' untuk menunjukkannya (atau 'Escape' jika menggunakan In-App Menu)"
|
||||
"detail": "Menu telah disembunyikan, guna 'Alt' untuk menunjukkannya (atau 'Escape' jika menggunakan In-App Menu)",
|
||||
"message": "Sembunyikan Menu telah diaktifkan",
|
||||
"title": "Sembunyikan Menu diaktifkan"
|
||||
},
|
||||
"need-to-restart": {
|
||||
"buttons": {
|
||||
"later": "Nanti",
|
||||
"restart-now": "Restart Sekarang"
|
||||
},
|
||||
"detail": "Plugin {{pluginName}} perlu dimulakan semula untuk berkuatkuasa",
|
||||
"message": "\"{{pluginName}}\" perlu dimulakan semula",
|
||||
"title": "Mulakan Semula Diperlukan"
|
||||
},
|
||||
@ -59,10 +69,13 @@
|
||||
},
|
||||
"update-available": {
|
||||
"buttons": {
|
||||
"disable": "Lumpuhkan Kemas Kini",
|
||||
"download": "Muat Turun",
|
||||
"ok": "OK"
|
||||
},
|
||||
"detail": "Versi baharu kini tersedia dan boleh dimuat turun di {{downloadLink}}"
|
||||
"detail": "Versi baharu kini tersedia dan boleh dimuat turun di {{downloadLink}}",
|
||||
"message": "Versi baharu tersedia",
|
||||
"title": "Kemas Kini Tersedia"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
@ -73,7 +86,8 @@
|
||||
"copy-current-url": "Salin URL semasa",
|
||||
"go-back": "Belakang",
|
||||
"go-forward": "Depan",
|
||||
"quit": "Keluar"
|
||||
"quit": "Keluar",
|
||||
"restart": "Mula Semula Aplikasi"
|
||||
}
|
||||
},
|
||||
"options": {
|
||||
@ -82,20 +96,30 @@
|
||||
"advanced-options": {
|
||||
"label": "Tetapan Lanjutan",
|
||||
"submenu": {
|
||||
"auto-reset-app-cache": "Tetapkan semula cache aplikasi apabila aplikasi dimulakan",
|
||||
"disable-hardware-acceleration": "Lumpuhkan pecutan perkakasan",
|
||||
"edit-config-json": "Ubah suai config.json",
|
||||
"override-user-agent": "Gantikan Ejen Pengguna",
|
||||
"restart-on-config-changes": "Mulakan semula pada perubahan konfigurasi",
|
||||
"set-proxy": {
|
||||
"label": "Tetapkan proksi",
|
||||
"prompt": {
|
||||
"label": "Masukkan Alamat Proksi: (biarkan kosong untuk menyahdayakan)",
|
||||
"placeholder": "Contoh: SOCKS5://127.0.0.1:9999",
|
||||
"title": "Set proksi"
|
||||
}
|
||||
}
|
||||
},
|
||||
"toggle-dev-tools": "Togol DevTools"
|
||||
}
|
||||
},
|
||||
"always-on-top": "Sentiasa di atas",
|
||||
"auto-update": "Kemas Kini Automatik",
|
||||
"hide-menu": {
|
||||
"dialog": {
|
||||
"message": "Menu akan disembunyikan pada pelancaran seterusnya, gunakan [Alt] untuk menunjukkannya (atau backtick [`] jika menggunakan dalam aplikasi-menu)"
|
||||
}
|
||||
"message": "Menu akan disembunyikan pada pelancaran seterusnya, gunakan [Alt] untuk menunjukkannya (atau backtick [`] jika menggunakan dalam aplikasi-menu)",
|
||||
"title": "Sembunyikan Menu Diaktifkan"
|
||||
},
|
||||
"label": "Sembunyikan Menu"
|
||||
},
|
||||
"language": {
|
||||
"dialog": {
|
||||
@ -108,12 +132,18 @@
|
||||
}
|
||||
},
|
||||
"resume-on-start": "Mulakan semula lagu terakhir apabila aplikasi dimulakan",
|
||||
"single-instance-lock": "Kunci Kejadian Tunggal",
|
||||
"start-at-login": "Mulakan semasa log masuk",
|
||||
"starting-page": {
|
||||
"label": "Halaman Permulaan"
|
||||
"label": "Halaman Permulaan",
|
||||
"unset": "Nyahset"
|
||||
},
|
||||
"tray": {
|
||||
"label": "Dulang",
|
||||
"submenu": {
|
||||
"disabled": "Dilumpuhkan",
|
||||
"enabled-and-hide-app": "Didayakan dan sembunyikan aplikasi",
|
||||
"enabled-and-show-app": "Didayakan dan paparkan aplikasi",
|
||||
"play-pause-on-click": "Main / Hentikan pada klik"
|
||||
}
|
||||
},
|
||||
@ -122,20 +152,45 @@
|
||||
"submenu": {
|
||||
"like-buttons": {
|
||||
"default": "Lalai",
|
||||
"hide": "Sembunyi"
|
||||
"force-show": "Paksa pamer",
|
||||
"hide": "Sembunyi",
|
||||
"label": "Suka butang"
|
||||
},
|
||||
"remove-upgrade-button": "Buang butang naik taraf",
|
||||
"theme": {
|
||||
"dialog": {
|
||||
"button": {
|
||||
"cancel": "Batalkan",
|
||||
"remove": "Padam"
|
||||
}
|
||||
},
|
||||
"remove-theme": "Adakah anda pasti mahu mengalih keluar tema tersuai?",
|
||||
"remove-theme-message": "Ini akan membuang tema tersuai"
|
||||
},
|
||||
"label": "Tema"
|
||||
"label": "Tema",
|
||||
"submenu": {
|
||||
"import-css-file": "Import fail CSS tersuai",
|
||||
"no-theme": "Tiada tema"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"enabled": "Didayakan",
|
||||
"label": "Pemalam",
|
||||
"new": "BARU"
|
||||
},
|
||||
"view": {
|
||||
"label": "Pandangan",
|
||||
"submenu": {
|
||||
"force-reload": "Paksa Muat Semula",
|
||||
"reload": "Muat semula",
|
||||
"reset-zoom": "Saiz Sebenar",
|
||||
"toggle-fullscreen": "Togol Skrin Penuh",
|
||||
"zoom-in": "Zum Masuk",
|
||||
"zoom-out": "Zum Keluar"
|
||||
}
|
||||
}
|
||||
},
|
||||
"tray": {
|
||||
@ -143,23 +198,153 @@
|
||||
"play-pause": "Main / Jeda",
|
||||
"previous": "Sebelumnya",
|
||||
"quit": "Keluar",
|
||||
"restart": "Mulakan Semula Aplikasi"
|
||||
"restart": "Mulakan Semula Aplikasi",
|
||||
"show": "Papar tetingkap",
|
||||
"tooltip": {
|
||||
"default": "YouTube Muzik",
|
||||
"with-song-info": "YouTube Muzik : {{artist}} - {{title}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"ambient-mode": {
|
||||
"ad-speedup": {
|
||||
"description": "Jika iklan dimainkan, ia meredamkan audio dan menetapkan kelajuan main semula kepada 16x",
|
||||
"name": "Kelajuan Iklan"
|
||||
},
|
||||
"adblocker": {
|
||||
"description": "Sekat semua iklan dan penjejakan di luar kotak",
|
||||
"menu": {
|
||||
"blocker": "Penyekat"
|
||||
},
|
||||
"name": "Penyekat Iklan"
|
||||
},
|
||||
"album-actions": {
|
||||
"description": "Menambah butang Suka dan Tidak Suka pada semua lagu dalam senarai main atau album",
|
||||
"name": "Tindakan Album"
|
||||
},
|
||||
"album-color-theme": {
|
||||
"description": "Menggunakan tema dinamik dan kesan visual berdasarkan palet warna album",
|
||||
"menu": {
|
||||
"color-mix-ratio": {
|
||||
"label": "Nisbah campuran warna",
|
||||
"submenu": {
|
||||
"percent": "{{ratio}}%"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Tema Warna Album"
|
||||
},
|
||||
"ambient-mode": {
|
||||
"description": "Menggunakan kesan pencahayaan dengan menghantar warna lembut daripada video, ke latar belakang skrin anda",
|
||||
"menu": {
|
||||
"blur-amount": {
|
||||
"label": "Jumlah Kekaburan",
|
||||
"submenu": {
|
||||
"pixels": "{{blurAmount}}piksel"
|
||||
}
|
||||
},
|
||||
"opacity": {
|
||||
"label": "Kelegapan"
|
||||
},
|
||||
"quality": {
|
||||
"label": "Kualiti"
|
||||
"label": "Kualiti",
|
||||
"submenu": {
|
||||
"pixels": "{{kualiti}} piksel"
|
||||
}
|
||||
},
|
||||
"size": {
|
||||
"label": "Saiz"
|
||||
"label": "Saiz",
|
||||
"submenu": {
|
||||
"percent": "{{size}}%"
|
||||
}
|
||||
},
|
||||
"smoothness-transition": {
|
||||
"label": "Kelancaran transisi",
|
||||
"submenu": {
|
||||
"during": "Semasa {{masaInterpolasi}}s"
|
||||
}
|
||||
},
|
||||
"use-fullscreen": {
|
||||
"label": "Menggunakan skrin penuh"
|
||||
}
|
||||
},
|
||||
"name": "Mod Sekitaran"
|
||||
},
|
||||
"amuse": {
|
||||
"description": "Menambahkan sokongan YouTube Music untuk widget sedang dimain Amuse oleh 6K Labs"
|
||||
},
|
||||
"api-server": {
|
||||
"description": "Perlukan server API untuk mengawal pemain",
|
||||
"dialog": {
|
||||
"request": {
|
||||
"buttons": {
|
||||
"allow": "Benarkan",
|
||||
"deny": "Nafi"
|
||||
},
|
||||
"message": "Benarkan {{ID}} {{origin}} untuk akses API?",
|
||||
"title": "Permintaan pemberian kuasa kepada API"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"auth-strategy": {
|
||||
"label": "Strategi Pengesahan",
|
||||
"submenu": {
|
||||
"auth-at-first": {
|
||||
"label": "Pengesahan pada permintaan pertama"
|
||||
},
|
||||
"none": {
|
||||
"label": "Tiada pengesahan"
|
||||
}
|
||||
}
|
||||
},
|
||||
"hostname": {
|
||||
"label": "Nama perumah"
|
||||
},
|
||||
"port": {
|
||||
"label": "Port"
|
||||
}
|
||||
},
|
||||
"name": "Server API [Beta]",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "Masukkan nama perumah (seperti 0.0.0.0) untuk server API:",
|
||||
"title": "Nama perumah"
|
||||
},
|
||||
"port": {
|
||||
"label": "Masukkan port untuk API server:",
|
||||
"title": "Port"
|
||||
}
|
||||
}
|
||||
},
|
||||
"audio-compressor": {
|
||||
"description": "Laksanakan pemampatan untuk audio (mengurangkan kelantangan bagi bahagian signal yang kuat dan menaikkan kelantangan untuk bahagian yang lembut)",
|
||||
"name": "Pemampat Audio"
|
||||
},
|
||||
"auth-proxy-adapter": {
|
||||
"menu": {
|
||||
"hostname": {
|
||||
"label": "Nama perumah"
|
||||
}
|
||||
}
|
||||
},
|
||||
"blur-nav-bar": {
|
||||
"name": "Kaburkan Bar navigasi"
|
||||
},
|
||||
"bypass-age-restrictions": {
|
||||
"description": "Pintas verifikasi umur Youtube",
|
||||
"name": "Pintas Sekatan Umur"
|
||||
},
|
||||
"captions-selector": {
|
||||
"description": "Pemilih kapsyen untuk trek audio Youtube Music",
|
||||
"menu": {
|
||||
"autoload": "Pilih kapsyen terakhir diguna secara automatik",
|
||||
"disable-captions": "Tiada kapsyen secara lalai"
|
||||
},
|
||||
"name": "Pemilih kapsyen",
|
||||
"prompt": {
|
||||
"selector": {
|
||||
"label": "Bahasa kapsyen sekarang: {{bahasa}}",
|
||||
"none": "Tiada",
|
||||
"title": "Pilih bahasa kapsyen"
|
||||
}
|
||||
}
|
||||
@ -196,7 +381,7 @@
|
||||
}
|
||||
},
|
||||
"templates": {
|
||||
"button": "Lagu"
|
||||
"button-song": "Lagu"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -577,7 +577,7 @@
|
||||
},
|
||||
"name": "Videoveksling",
|
||||
"templates": {
|
||||
"button": "Spor"
|
||||
"button-song": "Spor"
|
||||
}
|
||||
},
|
||||
"visualizer": {
|
||||
|
||||
@ -333,6 +333,30 @@
|
||||
"description": "अडियोमा कम्प्रेसन लागू गर्नुहोस् (सङ्केतको सबैभन्दा चर्को भागहरूको भोल्युम कम गर्दछ र नरम भागहरूको भोल्युम बढाउँछ)",
|
||||
"name": "अडियो कम्प्रेसर"
|
||||
},
|
||||
"auth-proxy-adapter": {
|
||||
"description": "प्रमाणीकरण प्रोक्सी सेवाहरूको प्रयोगको लागि समर्थन",
|
||||
"menu": {
|
||||
"disable": "प्रोक्सी एडाप्टर बन्द गर्नुहोस्",
|
||||
"enable": "प्रोक्सी एडाप्टर खोल्नुहोस्",
|
||||
"hostname": {
|
||||
"label": "होस्टनाम"
|
||||
},
|
||||
"port": {
|
||||
"label": "पोर्ट"
|
||||
}
|
||||
},
|
||||
"name": "प्रमाणीकरण प्रोक्सी एडाप्टर",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "स्थानीय प्रोक्सी सर्भरको लागि होस्टनाम प्रविष्ट गर्नुहोस् (पुनःसुरु गर्न आवश्यक छ):",
|
||||
"title": "प्रोक्सी होस्टनाम"
|
||||
},
|
||||
"port": {
|
||||
"label": "स्थानीय प्रोक्सी सर्भरको लागि पोर्ट प्रविष्ट गर्नुहोस् (पुनःसुरु गर्न आवश्यक छ):",
|
||||
"title": "प्रोक्सी पोर्ट"
|
||||
}
|
||||
}
|
||||
},
|
||||
"blur-nav-bar": {
|
||||
"description": "नेभिगेसन बारलाई पारदर्शी र धुवाँलो बनाउँछ",
|
||||
"name": "ब्लर नेभिगेसन बार"
|
||||
@ -600,6 +624,10 @@
|
||||
},
|
||||
"name": "सूचनाहरू"
|
||||
},
|
||||
"performance-improvement": {
|
||||
"description": "प्रयोगात्मक स्क्रिप्टहरू सक्रिय गरेर कार्यसम्पादन सुधार गर्नुहोस्",
|
||||
"name": "कार्यसम्पादन सुधार [प्रयोगात्मक]"
|
||||
},
|
||||
"picture-in-picture": {
|
||||
"description": "एपलाई पिक्चर-इन-पिक्चर मोडमा परिवर्तन गर्न अनुमति दिन्छ",
|
||||
"menu": {
|
||||
@ -683,6 +711,7 @@
|
||||
"listenbrainz": {
|
||||
"token": "ListenBrainz प्रयोगकर्ता टोकन प्रविष्ट गर्नुहोस्"
|
||||
},
|
||||
"scrobble-alternative-title": "वैकल्पिक शीर्षकहरू प्रयोग गर्नुहोस्",
|
||||
"scrobble-other-media": "अन्य मिडियालाई स्क्रबल गर्नुहोस्"
|
||||
},
|
||||
"name": "स्क्रबबलर",
|
||||
@ -767,6 +796,10 @@
|
||||
"label": "गीतशब्दहरू पूर्ण रूपमा समक्रमित बनाउनुहोस्",
|
||||
"tooltip": "अर्को लाइनको प्रदर्शनलाई मिलिसेकेन्डमा गणना गर्नुहोस् (यसले प्रदर्शनमा हल्का प्रभाव पार्न सक्छ)"
|
||||
},
|
||||
"romanization": {
|
||||
"label": "रोमनकृत शब्दहरू",
|
||||
"tooltip": "यदि गीतका शब्दहरू फरक भाषामा छन् भने, ल्याटिन संस्करण प्रदर्शन गर्ने प्रयास गर्नुहोस्।"
|
||||
},
|
||||
"show-lyrics-even-if-inexact": {
|
||||
"label": "गीतशब्दहरू अपर्याप्त भए पनि देखाउनुहोस्",
|
||||
"tooltip": "यदि गीत फेला परेन भने, प्लगिनले फरक खोजी सोधपुछसँग पुन: प्रयास गर्छ।\nदोस्रो प्रयासको परिणाम ठ्याक्कै मिल्न नपनि सक्छ।"
|
||||
@ -799,6 +832,10 @@
|
||||
"description": "OBS को टुना प्लगइनसँग एकीकरण",
|
||||
"name": "टुना OBS"
|
||||
},
|
||||
"unobtrusive-player": {
|
||||
"description": "गीत बजाउँदा प्लेयरलाई पप अप हुनबाट रोक्छ",
|
||||
"name": "अवरोधरहित संगीत प्लेयर"
|
||||
},
|
||||
"video-toggle": {
|
||||
"description": "भिडियो/गीत मोड बीच स्विच गर्न बटन थप्दछ। वैकल्पिक रूपमा सम्पूर्ण भिडियो ट्याब हटाउन पनि सक्छ",
|
||||
"menu": {
|
||||
@ -822,7 +859,7 @@
|
||||
},
|
||||
"name": "भिडियो टगल",
|
||||
"templates": {
|
||||
"button": "गीत"
|
||||
"button-song": "गीत"
|
||||
}
|
||||
},
|
||||
"visualizer": {
|
||||
|
||||
@ -333,6 +333,30 @@
|
||||
"description": "Past compressie toe op audio (verlaagt het volume van de luidste delen van het signaal en verhoogt het volume van de zachtste delen)",
|
||||
"name": "Audiocompressor"
|
||||
},
|
||||
"auth-proxy-adapter": {
|
||||
"description": "Ondersteuning voor het gebruik van authenticatie proxy diensten",
|
||||
"menu": {
|
||||
"disable": "Proxy adapter uitschakelen",
|
||||
"enable": "Proxy adapter inschakelen",
|
||||
"hostname": {
|
||||
"label": "Hostnaam"
|
||||
},
|
||||
"port": {
|
||||
"label": "Poort"
|
||||
}
|
||||
},
|
||||
"name": "Auth proxy adapter",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "Hostname voor lokale proxy server (vereist herstart):",
|
||||
"title": "Proxy hostnaam"
|
||||
},
|
||||
"port": {
|
||||
"label": "Poort voor lokale proxy server (herstart vereist):",
|
||||
"title": "Proxy poort"
|
||||
}
|
||||
}
|
||||
},
|
||||
"blur-nav-bar": {
|
||||
"description": "Maakt de navigatiebalk transparant en wazig",
|
||||
"name": "Vervagen Navigatiebalk"
|
||||
@ -600,6 +624,10 @@
|
||||
},
|
||||
"name": "Meldingen"
|
||||
},
|
||||
"performance-improvement": {
|
||||
"description": "Verbeter prestaties door experimentale scripts aan te zetten",
|
||||
"name": "Prestatie-verbetering"
|
||||
},
|
||||
"picture-in-picture": {
|
||||
"description": "Laat de app toe om naar picture-in-picture modus om te schakelen",
|
||||
"menu": {
|
||||
@ -805,7 +833,7 @@
|
||||
"name": "Tuna OBS"
|
||||
},
|
||||
"unobtrusive-player": {
|
||||
"description": "Voorkomt dat de speler bij het afspelen van een nummer verschijnt",
|
||||
"description": "Voorkomt dat de speler omhoog springt tijdens het afspelen van een nummer",
|
||||
"name": "Minder opdringerige speler"
|
||||
},
|
||||
"video-toggle": {
|
||||
@ -831,7 +859,7 @@
|
||||
},
|
||||
"name": "Videoschakelaar",
|
||||
"templates": {
|
||||
"button": "Nummer"
|
||||
"button-song": "Nummer"
|
||||
}
|
||||
},
|
||||
"visualizer": {
|
||||
|
||||
@ -333,6 +333,30 @@
|
||||
"description": "Zastosuj kompresję do dźwięku (obniża głośność najgłośniejszych części sygnału i zwiększa głośność najcichszych części)",
|
||||
"name": "Kompresor dźwięku"
|
||||
},
|
||||
"auth-proxy-adapter": {
|
||||
"description": "Wparcie dla uwierzytalniających usług proxy",
|
||||
"menu": {
|
||||
"disable": "Wyłącz adapter proxy",
|
||||
"enable": "Włącz adapter proxy",
|
||||
"hostname": {
|
||||
"label": "Nazwa hosta"
|
||||
},
|
||||
"port": {
|
||||
"label": "Port"
|
||||
}
|
||||
},
|
||||
"name": "Uwierzytelnij adapter proxy",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "Wpisz nazwę hosta dla lokalnego serwera proxy (wymaga restaru):",
|
||||
"title": "Nazwa hosta proxy"
|
||||
},
|
||||
"port": {
|
||||
"label": "Wpisz port dla lokalnego serwera proxy (wymaga restartu):",
|
||||
"title": "Port proxy"
|
||||
}
|
||||
}
|
||||
},
|
||||
"blur-nav-bar": {
|
||||
"description": "Sprawia, że pasek nawigacji jest przezroczysty i rozmazany",
|
||||
"name": "Rozmycie paska nawigacji"
|
||||
@ -600,6 +624,10 @@
|
||||
},
|
||||
"name": "Powiadomienia"
|
||||
},
|
||||
"performance-improvement": {
|
||||
"description": "Popraw wydajność przez włączenie skryptów eksperymentalnych",
|
||||
"name": "Poprawienie wydajności [Beta]"
|
||||
},
|
||||
"picture-in-picture": {
|
||||
"description": "Umożliwia przełączenie aplikacji w tryb obrazu w obrazie",
|
||||
"menu": {
|
||||
@ -831,7 +859,7 @@
|
||||
},
|
||||
"name": "Przełącznik wideo",
|
||||
"templates": {
|
||||
"button": "Utwór"
|
||||
"button-song": "Utwór"
|
||||
}
|
||||
},
|
||||
"visualizer": {
|
||||
|
||||
@ -333,6 +333,30 @@
|
||||
"description": "Aplicar compressão ao áudio (reduz o volume das partes mais altas e aumenta o volume das partes mais baixas)",
|
||||
"name": "Compressor de áudio"
|
||||
},
|
||||
"auth-proxy-adapter": {
|
||||
"description": "Suporte para o uso de serviços de proxy de autenticação",
|
||||
"menu": {
|
||||
"disable": "Desativar adaptador proxy",
|
||||
"enable": "Ativar adaptador proxy",
|
||||
"hostname": {
|
||||
"label": "Nome do host"
|
||||
},
|
||||
"port": {
|
||||
"label": "Porta"
|
||||
}
|
||||
},
|
||||
"name": "Adaptador de proxy de autenticação",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "Entre o nome do host do servidor proxy local (necessário reiniciar):",
|
||||
"title": "Nome do host do proxy"
|
||||
},
|
||||
"port": {
|
||||
"label": "Entre a porta do servidor proxy local (necessário reiniciar):",
|
||||
"title": "Porta do proxy"
|
||||
}
|
||||
}
|
||||
},
|
||||
"blur-nav-bar": {
|
||||
"description": "Torna a barra de navegação transparente e desfocada",
|
||||
"name": "Desfocar barra de navegação"
|
||||
@ -600,6 +624,10 @@
|
||||
},
|
||||
"name": "Notificações"
|
||||
},
|
||||
"performance-improvement": {
|
||||
"description": "Melhore o desempenho habilitando scripts experimentais",
|
||||
"name": "Melhoria de desempenho [Beta]"
|
||||
},
|
||||
"picture-in-picture": {
|
||||
"description": "Permite alternar o aplicativo para o modo picture-in-picture",
|
||||
"menu": {
|
||||
@ -831,7 +859,7 @@
|
||||
},
|
||||
"name": "Alternar vídeo",
|
||||
"templates": {
|
||||
"button": "Música"
|
||||
"button-song": "Música"
|
||||
}
|
||||
},
|
||||
"visualizer": {
|
||||
|
||||
@ -333,6 +333,30 @@
|
||||
"description": "Aplicar compressão ao áudio (diminui o volume das partes mais altas do sinal e aumenta o volume das partes mais suaves)",
|
||||
"name": "Compressor de Áudio"
|
||||
},
|
||||
"auth-proxy-adapter": {
|
||||
"description": "Suporte para o uso de serviços de proxy de autenticação",
|
||||
"menu": {
|
||||
"disable": "Desativar adaptador proxy",
|
||||
"enable": "Ativar adaptador proxy",
|
||||
"hostname": {
|
||||
"label": "Nome do host"
|
||||
},
|
||||
"port": {
|
||||
"label": "Porta"
|
||||
}
|
||||
},
|
||||
"name": "Adaptador de proxy de autenticação",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "Digite o nome do host para o servidor proxy local (requer reinicialização):",
|
||||
"title": "Nome do host do proxy"
|
||||
},
|
||||
"port": {
|
||||
"label": "Digite a porta para o servidor proxy local (requer reinicialização):",
|
||||
"title": "Porta Proxy"
|
||||
}
|
||||
}
|
||||
},
|
||||
"blur-nav-bar": {
|
||||
"description": "Torna a barra de navegação transparente e desfocada",
|
||||
"name": "Barra de navegação desfocada"
|
||||
@ -600,6 +624,10 @@
|
||||
},
|
||||
"name": "Notificações"
|
||||
},
|
||||
"performance-improvement": {
|
||||
"description": "Melhore o desempenho habilitando scripts experimentais",
|
||||
"name": "Melhoria de desempenho [Beta]"
|
||||
},
|
||||
"picture-in-picture": {
|
||||
"description": "Permite mudar a aplicação para o modo picture-in-picture",
|
||||
"menu": {
|
||||
@ -831,7 +859,7 @@
|
||||
},
|
||||
"name": "Botão de Alternar Vídeo",
|
||||
"templates": {
|
||||
"button": "Música"
|
||||
"button-song": "Música"
|
||||
}
|
||||
},
|
||||
"visualizer": {
|
||||
|
||||
@ -333,8 +333,32 @@
|
||||
"description": "Aplică compresie pe audio (scade volumul părților cele mai zgomotoase și crește volumul părților mai puțin zgomotoase)",
|
||||
"name": "Compresor audio"
|
||||
},
|
||||
"auth-proxy-adapter": {
|
||||
"description": "Suport pentru utilizarea serviciilor proxy de autentificare",
|
||||
"menu": {
|
||||
"disable": "Dezactivează Adaptorul Proxy",
|
||||
"enable": "Activează Adaptorul Proxy",
|
||||
"hostname": {
|
||||
"label": "Nume host"
|
||||
},
|
||||
"port": {
|
||||
"label": "Port"
|
||||
}
|
||||
},
|
||||
"name": "Adaptor Proxy de Autentificare",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "Introduceți numele de gazdă pentru serverul proxy local (necesită repornire):",
|
||||
"title": "Nume host proxy"
|
||||
},
|
||||
"port": {
|
||||
"label": "Introduceți portul pentru serverul proxy local (necesită repornire):",
|
||||
"title": "Port Proxy"
|
||||
}
|
||||
}
|
||||
},
|
||||
"blur-nav-bar": {
|
||||
"description": "Face bara de navigare semi-transparentă",
|
||||
"description": "Face bara de navigare semi-transparentă și difuză",
|
||||
"name": "Estompează Bara de Navigație"
|
||||
},
|
||||
"bypass-age-restrictions": {
|
||||
@ -600,6 +624,10 @@
|
||||
},
|
||||
"name": "Notificări"
|
||||
},
|
||||
"performance-improvement": {
|
||||
"description": "Îmbunătățește performanța activând scripturile experimentale",
|
||||
"name": "Îmbunătățirea performanței [Beta]"
|
||||
},
|
||||
"picture-in-picture": {
|
||||
"description": "Permite să schimbi aplicația la modul picture-in-picture",
|
||||
"menu": {
|
||||
@ -683,6 +711,7 @@
|
||||
"listenbrainz": {
|
||||
"token": "Introdu token-ul de utilizator ListenBrainz"
|
||||
},
|
||||
"scrobble-alternative-title": "Folosește titluri alternative",
|
||||
"scrobble-other-media": "Scrobble alte surse media"
|
||||
},
|
||||
"name": "Scrobbler",
|
||||
@ -745,6 +774,7 @@
|
||||
"label": "Efect de linie",
|
||||
"submenu": {
|
||||
"fancy": {
|
||||
"label": "Elegant",
|
||||
"tooltip": "Folosește efecte largi pe linia curentă"
|
||||
},
|
||||
"focus": {
|
||||
@ -766,6 +796,10 @@
|
||||
"label": "Sincronizează versurile perfect",
|
||||
"tooltip": "Calculează afisarea următoarei linii până la milisecundă (poate afecta performanța)"
|
||||
},
|
||||
"romanization": {
|
||||
"label": "Transcrie versurile în alfabet latin",
|
||||
"tooltip": "Dacă versurile sunt într-o altă limbă, încearcă să afișezi o versiune în alfabet latin."
|
||||
},
|
||||
"show-lyrics-even-if-inexact": {
|
||||
"label": "Afișează versurile chiar dacă sunt inexacte",
|
||||
"tooltip": "Dacă melodia nu este găsită, plugin-ul încearcă din nou cu o căutare diferită.\nRezultatul acestei încercări poate să nu fie exact."
|
||||
@ -798,6 +832,10 @@
|
||||
"description": "Integrare cu plugin-ul OBS Tuna",
|
||||
"name": "Tuna OBS"
|
||||
},
|
||||
"unobtrusive-player": {
|
||||
"description": "Împiedică playerul să apară atunci când redați o melodie",
|
||||
"name": "Player discret"
|
||||
},
|
||||
"video-toggle": {
|
||||
"description": "Adaugă un buton ce schimbă între modurile Video/Melodie. De asemenea se poate elimina opțional toată fila video",
|
||||
"menu": {
|
||||
@ -821,7 +859,7 @@
|
||||
},
|
||||
"name": "Comutator video",
|
||||
"templates": {
|
||||
"button": "Melodie"
|
||||
"button-song": "Melodie"
|
||||
}
|
||||
},
|
||||
"visualizer": {
|
||||
|
||||
@ -333,6 +333,30 @@
|
||||
"description": "Применяет компрессию к аудио (уменьшает громкость самых громких частей сигнала и повышает громкость самых тихих частей)",
|
||||
"name": "Нормализация аудио"
|
||||
},
|
||||
"auth-proxy-adapter": {
|
||||
"description": "Поддержка использования сервисов аутентификационного прокси",
|
||||
"menu": {
|
||||
"disable": "Отключить адаптер прокси",
|
||||
"enable": "Включить адаптер прокси",
|
||||
"hostname": {
|
||||
"label": "Имя хоста"
|
||||
},
|
||||
"port": {
|
||||
"label": "Порт"
|
||||
}
|
||||
},
|
||||
"name": "Адаптер аутентификационного прокси",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "Введите имя хоста для локального прокси-сервера (требуется перезапуск):",
|
||||
"title": "Имя хоста прокси"
|
||||
},
|
||||
"port": {
|
||||
"label": "Введите порт для локального прокси-сервера (требуется перезапуск):",
|
||||
"title": "Порт прокси"
|
||||
}
|
||||
}
|
||||
},
|
||||
"blur-nav-bar": {
|
||||
"description": "Делает панель навигации прозрачной и размытой",
|
||||
"name": "Размытие панели навигации"
|
||||
@ -357,6 +381,11 @@
|
||||
},
|
||||
"templates": {
|
||||
"title": "Открыть выбор субтитров"
|
||||
},
|
||||
"toast": {
|
||||
"caption-changed": "Субтитры изменены на {{language}}",
|
||||
"caption-disabled": "Субтитры отключены",
|
||||
"no-captions": "Нет доступных субтитров для этой песни"
|
||||
}
|
||||
},
|
||||
"compact-sidebar": {
|
||||
@ -576,7 +605,15 @@
|
||||
},
|
||||
"navigation": {
|
||||
"description": "Стрелки навигации \"вперед/назад\" интегрированы в интерфейс, как в вашем любимом браузере",
|
||||
"name": "Навигация"
|
||||
"name": "Навигация",
|
||||
"templates": {
|
||||
"back": {
|
||||
"title": "Предыдущая страница"
|
||||
},
|
||||
"forward": {
|
||||
"title": "Следующая страница"
|
||||
}
|
||||
}
|
||||
},
|
||||
"no-google-login": {
|
||||
"description": "Убрать из интерфейса кнопки и ссылки для входа через Google",
|
||||
@ -600,6 +637,10 @@
|
||||
},
|
||||
"name": "Уведомления"
|
||||
},
|
||||
"performance-improvement": {
|
||||
"description": "Улучшает производительность с помощью включения экспериментальных скриптов",
|
||||
"name": "Улучшение производительности [Бета]"
|
||||
},
|
||||
"picture-in-picture": {
|
||||
"description": "Позволяет переключить приложение в режим «картинка в картинке»",
|
||||
"menu": {
|
||||
@ -664,7 +705,12 @@
|
||||
}
|
||||
},
|
||||
"description": "Позволяет изменять качество видео с помощью кнопки на оверлее видео",
|
||||
"name": "Изменение качества видео"
|
||||
"name": "Изменение качества видео",
|
||||
"renderer": {
|
||||
"quality-settings-button": {
|
||||
"label": "Открыть настройки качества плеера"
|
||||
}
|
||||
}
|
||||
},
|
||||
"scrobbler": {
|
||||
"description": "Добавляет поддержку скробблинга (last.fm, Listenbrainz)",
|
||||
@ -831,7 +877,8 @@
|
||||
},
|
||||
"name": "Переключатель видео",
|
||||
"templates": {
|
||||
"button": "Песня"
|
||||
"button-song": "Песня",
|
||||
"button-video": "Видео"
|
||||
}
|
||||
},
|
||||
"visualizer": {
|
||||
|
||||
@ -44,7 +44,7 @@
|
||||
},
|
||||
"dialog": {
|
||||
"hide-menu-enabled": {
|
||||
"detail": "මෙනුව සැගවී ඇත, නැවත පෙන්වීමට 'Alt' යතුර භාවිතා කරන්න. (හෝ In-App මෙනුවේ 'Escape')",
|
||||
"detail": "මෙනුව සැගවී ඇත, නැවත පෙන්වීමට 'Alt' භාවිතා කරන්න. (මෙනුවේ 'Escape')",
|
||||
"message": "මෙනුව සැගවීම සක්රීය කර ඇත",
|
||||
"title": "මෙනුව සැගවීම සක්රීයයි"
|
||||
},
|
||||
@ -98,11 +98,117 @@
|
||||
"submenu": {
|
||||
"auto-reset-app-cache": "යෙදුම් කෑච් යෙදුම ආරම්භයේදී යලි පිහිටුවන්න",
|
||||
"disable-hardware-acceleration": "දෘඩාංග භාවිත වේගවත් කිරීම් අක්රීය කරන්න",
|
||||
"edit-config-json": "config.json සකසන්න"
|
||||
"edit-config-json": "config.json සකසන්න",
|
||||
"override-user-agent": "User-Agent ව වෙනස් කරන්න",
|
||||
"restart-on-config-changes": "Config change එකක් වෙද්දී app එක auto restart වෙන්න",
|
||||
"set-proxy": {
|
||||
"label": "Proxy එක set කරන්න",
|
||||
"prompt": {
|
||||
"label": "Proxy ලිපිනය ඇතුළත් කරන්න: (නවතන්න නම් හිස්ව තබන්න)",
|
||||
"placeholder": "උදාහරණය: SOCKS5://127.0.0.1:9999",
|
||||
"title": "Proxy එක set කරන්න"
|
||||
}
|
||||
},
|
||||
"toggle-dev-tools": "DevTools On/Off කරන්න"
|
||||
}
|
||||
},
|
||||
"always-on-top": "Always on top කරන්න",
|
||||
"auto-update": "Auto Update කරන්න",
|
||||
"hide-menu": {
|
||||
"dialog": {
|
||||
"message": "Menu එක ඊළඟ වතාවට ආරම්භක වෙලාවේ හෝ hide වෙයි. දැක්වීමට [Alt] හෝ in-app menu එකේ නම් [`] key එක ඔබන්න",
|
||||
"title": "Menu hide කිරීම enable කරලා"
|
||||
},
|
||||
"label": "Menu hide කරන්න"
|
||||
},
|
||||
"language": {
|
||||
"dialog": {
|
||||
"message": "Restart කිරීමෙන් පසු භාෂාව වෙනස් වේ",
|
||||
"title": "Language change වුනා"
|
||||
},
|
||||
"label": "භාෂාව",
|
||||
"submenu": {
|
||||
"to-help-translate": "පරිවර්තනය කිරීමට උදව් කරන්න ඕනේද? මෙතන ක්ලික් කරන්න"
|
||||
}
|
||||
},
|
||||
"resume-on-start": "App එක start වෙද්දි අවසන් ගීතය නැවත ඇරඹෙන්න",
|
||||
"single-instance-lock": "Single Instance Lock සක්රීය කරන්න",
|
||||
"start-at-login": "ලොගින් වුන විට start කරන්න",
|
||||
"starting-page": {
|
||||
"label": "ආරම්භක පිටුව",
|
||||
"unset": "අවලංගු කරන්න"
|
||||
},
|
||||
"tray": {
|
||||
"label": "ට්රේ එක",
|
||||
"submenu": {
|
||||
"disabled": "Disable කරන ලදී",
|
||||
"enabled-and-hide-app": "ට්රේ එක enable කරලා, app window එක hide කරන්න",
|
||||
"enabled-and-show-app": "Enable කරලා app එක පෙන්වන්න",
|
||||
"play-pause-on-click": "Click කළ විට play/ pause වෙනවා"
|
||||
}
|
||||
},
|
||||
"visual-tweaks": {
|
||||
"label": "Visual tweaks කරන්න",
|
||||
"submenu": {
|
||||
"like-buttons": {
|
||||
"default": "මූලික",
|
||||
"force-show": "Force show කරන්න",
|
||||
"hide": "සඟවන්න",
|
||||
"label": "Like බොත්තම්"
|
||||
},
|
||||
"remove-upgrade-button": "Upgrade බොත්තම ඉවත් කරන්න",
|
||||
"theme": {
|
||||
"dialog": {
|
||||
"button": {
|
||||
"cancel": "අවලංගු කරන්න",
|
||||
"remove": "ඉවත් කරන්න"
|
||||
},
|
||||
"remove-theme": "ඔබට විශ්වාසද ඔබගේ custom theme එක ඉවත් කිරීමට අවශ්ය බව?",
|
||||
"remove-theme-message": "මෙය custom theme එක ඉවත් කරයි"
|
||||
},
|
||||
"label": "Theme",
|
||||
"submenu": {
|
||||
"import-css-file": "Custom CSS ගොනුව import කරන්න",
|
||||
"no-theme": "Theme එකක් නැහැ"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"enabled": "සක්රිය කරන්න",
|
||||
"label": "ප්ලගීන",
|
||||
"new": "නව"
|
||||
},
|
||||
"view": {
|
||||
"label": "බලන්න",
|
||||
"submenu": {
|
||||
"force-reload": "බලෙන් රීලෝඩ් කරන්න",
|
||||
"reload": "රීලෝඩ් කරන්න",
|
||||
"reset-zoom": "සැබෑ ප්රමාණය",
|
||||
"toggle-fullscreen": "සම්පූර්ණ තිරය ටොගල් කරන්න",
|
||||
"zoom-in": "විශාලනය කරන්න",
|
||||
"zoom-out": "කුඩා කරන්න"
|
||||
}
|
||||
}
|
||||
},
|
||||
"tray": {
|
||||
"next": "ඊළඟ",
|
||||
"play-pause": "වාදනය / විරාමය",
|
||||
"previous": "පෙර",
|
||||
"quit": "පිටවීම",
|
||||
"restart": "නැවත ආරම්භ කරන්න",
|
||||
"show": "තිරය පෙන්වන්න",
|
||||
"tooltip": {
|
||||
"default": "YouTube Music",
|
||||
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"adblocker": {
|
||||
"description": "සියලුම දැන්වීම් අවහිර කර කොටුවෙන් පිටත ලුහුබැඳීම"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,7 +1,892 @@
|
||||
{
|
||||
"common": {
|
||||
"console": {
|
||||
"plugins": {
|
||||
"execute-failed": "Neuspešno izvršavanje ekstenzije {{pluginName}}::{{contextName}}",
|
||||
"executed-at-ms": "Ekstenzija {{pluginName}}::{{contextName}} se izvršila za {{ms}}ms",
|
||||
"initialize-failed": "Greška pri učitavanju ekstenzije \"{{pluginName}}\"",
|
||||
"load-all": "Učitavanje svih ekstenzija",
|
||||
"load-failed": "Neuspešno učitavanje ekstenzije \"{{pluginName}}\"",
|
||||
"loaded": "Ekstenzija \"{{pluginName}}\" je učitana",
|
||||
"unload-failed": "Greška pri oslobađanju ekstenzije \"{{pluginName}}\"",
|
||||
"unloaded": "Ekstenzija \"{{pluginName}}\" je oslobođena"
|
||||
}
|
||||
}
|
||||
},
|
||||
"language": {
|
||||
"code": "sr",
|
||||
"local-name": "Српски",
|
||||
"name": "Serbian"
|
||||
},
|
||||
"main": {
|
||||
"console": {
|
||||
"did-finish-load": {
|
||||
"dev-tools": "Završeno učitavanje. DevTools alat je otvoren"
|
||||
},
|
||||
"i18n": {
|
||||
"loaded": "i18n su učitani"
|
||||
},
|
||||
"second-instance": {
|
||||
"receive-command": "Primljena je komanda kroz protokol: \"{{command}}\""
|
||||
},
|
||||
"theme": {
|
||||
"css-file-not-found": "CSS datoteka \"{{cssFile}}\" ne postoji, ignorišem"
|
||||
},
|
||||
"unresponsive": {
|
||||
"details": "Aplikacija se ne odaziva!\n{{error}}"
|
||||
},
|
||||
"when-ready": {
|
||||
"clearing-cache-after-20s": "Čišćenje keširanih podataka"
|
||||
},
|
||||
"window": {
|
||||
"tried-to-render-offscreen": "Prozor je pokušao da se učita van ekrana: windowSize={{windowSize}}, displaySize={{displaySize}}, position={{position}}"
|
||||
}
|
||||
},
|
||||
"dialog": {
|
||||
"hide-menu-enabled": {
|
||||
"detail": "Meni je sakriven, pritisnite 'Alt' da biste ga prikazali (ili 'Escape' ako koristite meni u aplikaciji)",
|
||||
"message": "Opcija sakrivanja menija je omogućena",
|
||||
"title": "Opcija sakrivanja menija je omogućena"
|
||||
},
|
||||
"need-to-restart": {
|
||||
"buttons": {
|
||||
"later": "Kasnije",
|
||||
"restart-now": "Ponovo pokreni odmah"
|
||||
},
|
||||
"detail": "Ekstenzija \"{{pluginName}}\" zahteva ponovno pokretanje aplikacije da bi se učitala",
|
||||
"message": "\"{{pluginName}}\" zahteva ponovno pokretanje",
|
||||
"title": "Ponovno pokretanje je neophodno"
|
||||
},
|
||||
"unresponsive": {
|
||||
"buttons": {
|
||||
"quit": "Izađi",
|
||||
"relaunch": "Pokreni ponovo",
|
||||
"wait": "Čekaj"
|
||||
},
|
||||
"detail": "Izvinjavamo se zbog neprijatnosti! Molimo odaberite sledeći korak:",
|
||||
"message": "Aplikacija ne odgovara ili je zamrznuta",
|
||||
"title": "Prozor ne odgovara ili je zamrznut"
|
||||
},
|
||||
"update-available": {
|
||||
"buttons": {
|
||||
"disable": "Onemogući ažuriranja",
|
||||
"download": "Preuzmi",
|
||||
"ok": "U redu"
|
||||
},
|
||||
"detail": "Nova verzija je dostupna za preuzimanje na {{downloadLink}}",
|
||||
"message": "Nova verzija je dostupna",
|
||||
"title": "Ažuriranje je dostupno"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"about": "O aplikaciji",
|
||||
"navigation": {
|
||||
"label": "Navigacija",
|
||||
"submenu": {
|
||||
"copy-current-url": "Kopiraj trenutnu adresu",
|
||||
"go-back": "Nazad",
|
||||
"go-forward": "Napred",
|
||||
"quit": "Izađi",
|
||||
"restart": "Ponovo pokreni aplikaciju"
|
||||
}
|
||||
},
|
||||
"options": {
|
||||
"label": "Opcije",
|
||||
"submenu": {
|
||||
"advanced-options": {
|
||||
"label": "Napredne opcije",
|
||||
"submenu": {
|
||||
"auto-reset-app-cache": "Očisti keširane podatke pri pokretanju aplikacije",
|
||||
"disable-hardware-acceleration": "Onemogući hardversko ubrzanje",
|
||||
"edit-config-json": "Izmeni config.json",
|
||||
"override-user-agent": "Prepiši User-Agent",
|
||||
"restart-on-config-changes": "Pokreni ponovo po promeni konfiguracije",
|
||||
"set-proxy": {
|
||||
"label": "Podesi proxy",
|
||||
"prompt": {
|
||||
"label": "Unesi Proxy adresu: (ostavi prazno da bi proxy bio onemogućen)",
|
||||
"placeholder": "Primer: SOCKS5://127.0.0.1:9999",
|
||||
"title": "Podesi proxy"
|
||||
}
|
||||
},
|
||||
"toggle-dev-tools": "Pokreni/napusti DevTools"
|
||||
}
|
||||
},
|
||||
"always-on-top": "Uvek na vrhu",
|
||||
"auto-update": "Automatsko ažuriranje",
|
||||
"hide-menu": {
|
||||
"dialog": {
|
||||
"message": "Meni će biti sakriven posle sledećeg pokretanje, upotrebite [Alt] da ga ponovo prikažete (ili backtick [`] ukoliko koristite meni u aplikaciji)",
|
||||
"title": "Sakrivanje menija je omogućeno"
|
||||
},
|
||||
"label": "Sakrij meni"
|
||||
},
|
||||
"language": {
|
||||
"dialog": {
|
||||
"message": "Jezik aplikacije će biti promenjen nakon sledećeg pokretanja aplikacije",
|
||||
"title": "Jezik je uspešno promenjen"
|
||||
},
|
||||
"label": "Jezik",
|
||||
"submenu": {
|
||||
"to-help-translate": "Želite da pomognete u prevođenju? Kliknite ovde"
|
||||
}
|
||||
},
|
||||
"resume-on-start": "Nastavi trenutnu numeru pri sledećem pokretanju",
|
||||
"single-instance-lock": "Jedna instanca aplikacije",
|
||||
"start-at-login": "Pokreni po prijavi u sistem",
|
||||
"starting-page": {
|
||||
"label": "Početna strana",
|
||||
"unset": "Poništi podešavanje"
|
||||
},
|
||||
"tray": {
|
||||
"label": "Lista",
|
||||
"submenu": {
|
||||
"disabled": "Onemogućeno",
|
||||
"enabled-and-hide-app": "Omogući sklanjanje aplikacije u sistemsku listu",
|
||||
"enabled-and-show-app": "Omogući i prikaži aplikaciju",
|
||||
"play-pause-on-click": "Pokreni/Pauziraj na klik"
|
||||
}
|
||||
},
|
||||
"visual-tweaks": {
|
||||
"label": "Vizuelna podešavanja",
|
||||
"submenu": {
|
||||
"like-buttons": {
|
||||
"default": "Podrazumevano",
|
||||
"force-show": "Prinudno prikaži",
|
||||
"hide": "Sakrij",
|
||||
"label": "'Sviđa mi se' dugmići"
|
||||
},
|
||||
"remove-upgrade-button": "Ukloni dugme za nadogradnju",
|
||||
"theme": {
|
||||
"dialog": {
|
||||
"button": {
|
||||
"cancel": "Otkaži",
|
||||
"remove": "Ukloni"
|
||||
},
|
||||
"remove-theme": "Da li ste sigurni da želite da uklonite prilagođenu temu?",
|
||||
"remove-theme-message": "Ova opcija će ukloniti prilagođenu temu"
|
||||
},
|
||||
"label": "Tema",
|
||||
"submenu": {
|
||||
"import-css-file": "Uvezi prilagođenu CSS datoteku (stil)",
|
||||
"no-theme": "Bez teme"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"enabled": "Omogućeno",
|
||||
"label": "Ekstenzije",
|
||||
"new": "NOVO"
|
||||
},
|
||||
"view": {
|
||||
"label": "Prikaz",
|
||||
"submenu": {
|
||||
"force-reload": "Prinudno osveži",
|
||||
"reload": "Osveži",
|
||||
"reset-zoom": "Realna veličina",
|
||||
"toggle-fullscreen": "Aktiviraj/deaktiviraj pun ekran",
|
||||
"zoom-in": "Uvećaj",
|
||||
"zoom-out": "Umanji"
|
||||
}
|
||||
}
|
||||
},
|
||||
"tray": {
|
||||
"next": "Sledeće",
|
||||
"play-pause": "Pokreni/Pauziraj",
|
||||
"previous": "Prethodno",
|
||||
"quit": "Izađi",
|
||||
"restart": "Ponovo pokreni aplikaciju",
|
||||
"show": "Prikaži prozor",
|
||||
"tooltip": {
|
||||
"default": "YouTube Muzika",
|
||||
"with-song-info": "YouTube Muzika: {{artist}} - {{title}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"ad-speedup": {
|
||||
"description": "Ukoliko dođe do prikaza reklame, zvuk se prigušuje i podešava se brzina na 16x",
|
||||
"name": "Ubrzanje reklama"
|
||||
},
|
||||
"adblocker": {
|
||||
"description": "Podrazumevano blokiranje svih reklama i praćenja",
|
||||
"menu": {
|
||||
"blocker": "Bloker"
|
||||
},
|
||||
"name": "Bloker reklama"
|
||||
},
|
||||
"album-actions": {
|
||||
"description": "Dodaje mogućnost primene opcija 'Sviđa mi se, ne sviđa mi se' kao i opciju njihovog poništenja na nivou plejliste ili albuma",
|
||||
"name": "Akcije albuma"
|
||||
},
|
||||
"album-color-theme": {
|
||||
"description": "Primenjuje dinamičku temu i vizuelne efekte na osnovu palete boja albuma",
|
||||
"menu": {
|
||||
"color-mix-ratio": {
|
||||
"label": "Odnos mešavine boja",
|
||||
"submenu": {
|
||||
"percent": "{{ratio}}%"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Paleta boja albuma"
|
||||
},
|
||||
"ambient-mode": {
|
||||
"description": "Primenjuje svetlosne efekte na pozadini ekrana upotrebom blagih boja iz video snimka",
|
||||
"menu": {
|
||||
"blur-amount": {
|
||||
"label": "Zamagljenje",
|
||||
"submenu": {
|
||||
"pixels": "{{blurAmount}} piksela"
|
||||
}
|
||||
},
|
||||
"buffer": {
|
||||
"label": "Bafer",
|
||||
"submenu": {
|
||||
"buffer": "{{buffer}}"
|
||||
}
|
||||
},
|
||||
"opacity": {
|
||||
"label": "Prozirnost",
|
||||
"submenu": {
|
||||
"percent": "{{opacity}}%"
|
||||
}
|
||||
},
|
||||
"quality": {
|
||||
"label": "Kvalitet",
|
||||
"submenu": {
|
||||
"pixels": "{{quality}} piksela"
|
||||
}
|
||||
},
|
||||
"size": {
|
||||
"label": "Veličina",
|
||||
"submenu": {
|
||||
"percent": "{{size}}%"
|
||||
}
|
||||
},
|
||||
"smoothness-transition": {
|
||||
"label": "Blag prelaz",
|
||||
"submenu": {
|
||||
"during": "U trajanju od {{interpolationTime}} s"
|
||||
}
|
||||
},
|
||||
"use-fullscreen": {
|
||||
"label": "Korišćenje punog ekrana"
|
||||
}
|
||||
},
|
||||
"name": "Ambijentalni režim"
|
||||
},
|
||||
"amuse": {
|
||||
"description": "Dodaje podršku za 'Amuse now' vidžet (6K Labs) u YouTube Muziku",
|
||||
"name": "Amuse",
|
||||
"response": {
|
||||
"query": "Amuse API server je pokrenut. Koristite GET /query da biste dobili informacije o numeri."
|
||||
}
|
||||
},
|
||||
"api-server": {
|
||||
"description": "Dodaje API server za kontrolu muzičkog plejera",
|
||||
"dialog": {
|
||||
"request": {
|
||||
"buttons": {
|
||||
"allow": "Dozvoli",
|
||||
"deny": "Odbij"
|
||||
},
|
||||
"message": "Dozvoli {{ID}} ({{origin}}) da pristupa API-ju?",
|
||||
"title": "Zahtev za autorizaciju na API"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"auth-strategy": {
|
||||
"label": "Strategija za autorizaciju",
|
||||
"submenu": {
|
||||
"auth-at-first": {
|
||||
"label": "Autorizuj na prvom zahtevu"
|
||||
},
|
||||
"none": {
|
||||
"label": "Bez autorizacije"
|
||||
}
|
||||
}
|
||||
},
|
||||
"hostname": {
|
||||
"label": "Ime host-a"
|
||||
},
|
||||
"port": {
|
||||
"label": "Port"
|
||||
}
|
||||
},
|
||||
"name": "API Server [Beta]",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "Unesite ime host-a (npr. 0.0.0.0) za API server:",
|
||||
"title": "Ime host-a"
|
||||
},
|
||||
"port": {
|
||||
"label": "Unesite port za API server:",
|
||||
"title": "Port"
|
||||
}
|
||||
}
|
||||
},
|
||||
"audio-compressor": {
|
||||
"description": "Primeni kompresiju audio trake (smanjuje jačinu zvuka na najglasnijim delovima signala, i povećava jačinu na najnižim)",
|
||||
"name": "Kompresor zvuka"
|
||||
},
|
||||
"auth-proxy-adapter": {
|
||||
"description": "Podrška za upotrebu proxy servisa za autentifikaciju",
|
||||
"menu": {
|
||||
"disable": "Onemogući Proxy adapter",
|
||||
"enable": "Omogući Proxy adapter",
|
||||
"hostname": {
|
||||
"label": "Ime host-a"
|
||||
},
|
||||
"port": {
|
||||
"label": "Port"
|
||||
}
|
||||
},
|
||||
"name": "Proxy adapter za autentifikaciju",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "Unesi ime host-a za lokalni proxy server (zahteva ponovno pokretanje):",
|
||||
"title": "Ime host-a za Proxy"
|
||||
},
|
||||
"port": {
|
||||
"label": "Unesi port za lokalni proxy server (zahteva ponovno pokretanje):",
|
||||
"title": "Proxy Port"
|
||||
}
|
||||
}
|
||||
},
|
||||
"blur-nav-bar": {
|
||||
"description": "Čini navigacioni meni prozirnim i zamućenim",
|
||||
"name": "Zamuti navigacioni meni"
|
||||
},
|
||||
"bypass-age-restrictions": {
|
||||
"description": "Preskoči starosnu verifikaciju za YouTube",
|
||||
"name": "Preskoči starosna ograničenja"
|
||||
},
|
||||
"captions-selector": {
|
||||
"description": "Odabir prevoda za numere/audio trake na YouTube Muzici",
|
||||
"menu": {
|
||||
"autoload": "Automatski odaberi prethodno odabrani prevod",
|
||||
"disable-captions": "Podrazumevano bez prevoda"
|
||||
},
|
||||
"name": "Odabir prevoda",
|
||||
"prompt": {
|
||||
"selector": {
|
||||
"label": "Trenutno odabrani jezik prevoda: {{language}}",
|
||||
"none": "Ništa",
|
||||
"title": "Odaberi jezik prevoda"
|
||||
}
|
||||
},
|
||||
"templates": {
|
||||
"title": "Otvori meni za izbor prevoda"
|
||||
},
|
||||
"toast": {
|
||||
"caption-changed": "Prevod promenjen u {{language}}",
|
||||
"caption-disabled": "Prevod onemogućen",
|
||||
"no-captions": "Za ovu pesmu nisu dostupni prevodi"
|
||||
}
|
||||
},
|
||||
"compact-sidebar": {
|
||||
"description": "Uvek koristi kompaktni meni sa strane",
|
||||
"name": "Kompaktni meni sa strane"
|
||||
},
|
||||
"crossfade": {
|
||||
"description": "Ublaženi prelaz između numera",
|
||||
"menu": {
|
||||
"advanced": "Napredno"
|
||||
},
|
||||
"name": "Ublaženi prelaz [Beta]",
|
||||
"prompt": {
|
||||
"options": {
|
||||
"multi-input": {
|
||||
"fade-in-duration": "Ulazno trajanje prelaza (ms)",
|
||||
"fade-out-duration": "Izlazno trajanje prelaza (ms)",
|
||||
"fade-scaling": {
|
||||
"label": "Skaliranje prelaza",
|
||||
"linear": "Linearno",
|
||||
"logarithmic": "Logaritamsko"
|
||||
},
|
||||
"seconds-before-end": "Prelaz N sekundi pre kraja"
|
||||
},
|
||||
"title": "Opcije prelaza"
|
||||
}
|
||||
}
|
||||
},
|
||||
"disable-autoplay": {
|
||||
"description": "Numere se pokreću u pauziranom režimu",
|
||||
"menu": {
|
||||
"apply-once": "Primenjuje se samo pri pokretanju"
|
||||
},
|
||||
"name": "Onemogući automatsko reprodukovanje"
|
||||
},
|
||||
"discord": {
|
||||
"backend": {
|
||||
"already-connected": "Pokušano je da se poveže sa aktivnom vezom",
|
||||
"connected": "Spojeno sa Discord-om",
|
||||
"disconnected": "Poništeno povezivanje sa Discord-om"
|
||||
},
|
||||
"description": "Prikaži prijateljima šta slušaš uz 'Rich Presence'",
|
||||
"menu": {
|
||||
"auto-reconnect": "Automatsko ponovno povezivanje",
|
||||
"clear-activity": "Očisti aktivnosti",
|
||||
"clear-activity-after-timeout": "Očisti aktivnosti nakon isteka vremena",
|
||||
"connected": "Povezano",
|
||||
"disconnected": "Nije povezano",
|
||||
"hide-duration-left": "Sakrij preostalo vreme",
|
||||
"hide-github-button": "Sakrij dugme sa GitHub linkom",
|
||||
"play-on-youtube-music": "Reprodukuj na YouTube Muzici",
|
||||
"set-inactivity-timeout": "Podesi tajmer za neaktivnost"
|
||||
},
|
||||
"name": "Discord Rich Presence",
|
||||
"prompt": {
|
||||
"set-inactivity-timeout": {
|
||||
"label": "Unesi vreme za tajmer neaktivnosti u sekundama:",
|
||||
"title": "Podesi tajmer neaktivnosti"
|
||||
}
|
||||
}
|
||||
},
|
||||
"downloader": {
|
||||
"backend": {
|
||||
"dialog": {
|
||||
"error": {
|
||||
"buttons": {
|
||||
"ok": "U redu"
|
||||
},
|
||||
"message": "Greška! Izvinjavamo se, preuzimanje nije uspelo…",
|
||||
"title": "Greška pri preuzimanju!"
|
||||
},
|
||||
"start-download-playlist": {
|
||||
"buttons": {
|
||||
"ok": "U redu"
|
||||
},
|
||||
"detail": "({{playlistSize}} numera)",
|
||||
"message": "Preuzimanje plejliste {{playlistTitle}}",
|
||||
"title": "Preuzimanje je započeto"
|
||||
}
|
||||
},
|
||||
"feedback": {
|
||||
"conversion-progress": "Konverzija: {{percent}}%",
|
||||
"converting": "Konvertuje se…",
|
||||
"done": "Završeno: {{filePath}}",
|
||||
"download-info": "Preuzima se {{artist}} - {{title}} [{{videoId}}",
|
||||
"download-progress": "Preuzimanje: {{percent}}%",
|
||||
"downloading": "Preuzimanje…",
|
||||
"downloading-counter": "Preuzimanje {{current}}/{{total}}…",
|
||||
"downloading-playlist": "Preuzimanje plejliste \"{{playlistTitle}}\" - {{playlistSize}} numera ({{playlistId}})",
|
||||
"error-while-downloading": "Greška pri preuzimanju \"{{author}} - {{title}}\": {{error}}",
|
||||
"folder-already-exists": "Direktorijum {{playlistFolder}} već postoji",
|
||||
"getting-playlist-info": "Preuzimanje informacija o plejlisti…",
|
||||
"loading": "Učitavanje…",
|
||||
"playlist-has-only-one-song": "Plejlista sadrži samo jednu numeru, preuzima se direktno",
|
||||
"playlist-id-not-found": "Nije pronađen ID plejliste",
|
||||
"playlist-is-empty": "Plejlista je prazna",
|
||||
"playlist-is-mix-or-private": "Greška pri preuzimanju informacija o plejlisti: proverite da li je možda skrivena ili \"Za tebe\" plejlista\n\n{{error}}",
|
||||
"preparing-file": "Pripremanje datoteke…",
|
||||
"saving": "Čuvanje…",
|
||||
"trying-to-get-playlist-id": "Pokušaj preuzimanja ID plejliste: {{playlistId}}",
|
||||
"video-id-not-found": "Video nije pronađen",
|
||||
"writing-id3": "Zapisivanje ID3 tagova…"
|
||||
}
|
||||
},
|
||||
"description": "Preuzimanje MP3 / izvornog zvuka direktno sa interfejsa",
|
||||
"menu": {
|
||||
"choose-download-folder": "Odaberite direktorijum za preuzimanja",
|
||||
"download-finish-settings": {
|
||||
"label": "Preuzmi na završetku",
|
||||
"prompt": {
|
||||
"last-percent": "Nakon x procenata",
|
||||
"last-seconds": "Poslednjih x sekundi",
|
||||
"title": "Podesite kad da se vrši preuzimanje"
|
||||
},
|
||||
"submenu": {
|
||||
"advanced": "Napredno",
|
||||
"enabled": "Omogućeno",
|
||||
"mode": "Vremenski režim",
|
||||
"percent": "Procenat(a)",
|
||||
"seconds": "Sekundi"
|
||||
}
|
||||
},
|
||||
"download-playlist": "Preuzmi plejlistu",
|
||||
"presets": "Predefinisana podešavanja",
|
||||
"skip-existing": "Preskoči postojeće datoteke"
|
||||
},
|
||||
"name": "Servis za preuzimanje",
|
||||
"renderer": {
|
||||
"can-not-update-progress": "Nemoguće ažuriranje trenutnog napretka"
|
||||
},
|
||||
"templates": {
|
||||
"button": "Preuzimanje"
|
||||
}
|
||||
},
|
||||
"equalizer": {
|
||||
"description": "Dodaje ekvilajzer u muzički plejer",
|
||||
"menu": {
|
||||
"presets": {
|
||||
"label": "Predefinisana podešavanja",
|
||||
"list": {
|
||||
"bass-booster": "Pojačivač basa"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Ekvilajzer"
|
||||
},
|
||||
"exponential-volume": {
|
||||
"description": "Postavlja slajder jačine kao eksponencijalan radi lakšeg izbora nižih jačina.",
|
||||
"name": "Eksponencijalna jačina"
|
||||
},
|
||||
"in-app-menu": {
|
||||
"description": "Daje izbornim trakama fensi, tamni ili izgled prema boji albuma",
|
||||
"menu": {
|
||||
"hide-dom-window-controls": "Sakrij kontrole DOM prozora"
|
||||
},
|
||||
"name": "Izborni menu unutar aplikacije"
|
||||
},
|
||||
"lumiastream": {
|
||||
"description": "Dodaje podršku za Lumia Stream",
|
||||
"name": "Lumia Stream [Beta]"
|
||||
},
|
||||
"lyrics-genius": {
|
||||
"description": "Dodaje podršku za tekstove za većinu pesama",
|
||||
"menu": {
|
||||
"romanized-lyrics": "Romanizovani tekstovi"
|
||||
},
|
||||
"name": "Genius tekstovi",
|
||||
"renderer": {
|
||||
"fetched-lyrics": "Dobavljen tekst pesme sa Genius-a"
|
||||
}
|
||||
},
|
||||
"music-together": {
|
||||
"description": "Podeli plejlistu sa drugima. Kada domaćin (host) pusti pesmu, svi ostali će čuti istu pesmu",
|
||||
"dialog": {
|
||||
"enter-host": "Unesi ID host-a"
|
||||
},
|
||||
"internal": {
|
||||
"save": "Sačuvaj",
|
||||
"track-source": "Izvor pesme",
|
||||
"unknown-user": "Nepoznat korisnik"
|
||||
},
|
||||
"menu": {
|
||||
"click-to-copy-id": "Kopiraj ID host-a",
|
||||
"close": "Zatvori 'Music Together'",
|
||||
"connected-users": "Spojeni korisnici",
|
||||
"disconnect": "Prekini vezu sa 'Music Together'",
|
||||
"empty-user": "Nema povezanih korisnika",
|
||||
"host": "'Music Together' domaćin (host)",
|
||||
"join": "Pridruži se 'Music Together'",
|
||||
"permission": {
|
||||
"all": "Dozvoli gostima da kontrolišu plejlistu i reprodukciju",
|
||||
"host-only": "Samo domaćin (host) može da kontroliše plejlistu i reprodukciju",
|
||||
"playlist": "Dozvoli gostima da kontrolišu plejlistu"
|
||||
},
|
||||
"set-permission": "Promeni dozvole za upravljanje",
|
||||
"status": {
|
||||
"disconnected": "Nije povezan",
|
||||
"guest": "Povezan kao gost",
|
||||
"host": "Povezan kao domaćin (host)"
|
||||
}
|
||||
},
|
||||
"name": "Music Together [Beta]",
|
||||
"toast": {
|
||||
"add-song-failed": "Dodavanje pesme nije uspelo",
|
||||
"closed": "'Music Together' je zatvorena",
|
||||
"disconnected": "Veza sa 'Music Together' je prekinuta",
|
||||
"host-failed": "Pokretanje 'Music Together' kao domaćin (host) nije uspelo",
|
||||
"id-copied": "ID domaćina (host) kopiran u privremenu memoriju",
|
||||
"id-copy-failed": "Kopiranje ID domaćina (host) u privremenu memoriju nije uspelo",
|
||||
"join-failed": "Povezivanje na 'Music Together' neuspešno",
|
||||
"joined": "Povezan na 'Music Together'",
|
||||
"permission-changed": "Dozvola 'Music Together' promenjena na \"{{permission}}\"",
|
||||
"remove-song-failed": "Uklanjanje pesme nije uspelo",
|
||||
"user-connected": "{{name}} se pridružio na 'Music Together'",
|
||||
"user-disconnected": "{{name}} je napustio 'Music Together'"
|
||||
}
|
||||
},
|
||||
"navigation": {
|
||||
"description": "Strelice za navigaciju napred/nazad su direktno integrisane u interfejs, kao i u tvom omiljenom pregledaču",
|
||||
"name": "Navigacija",
|
||||
"templates": {
|
||||
"back": {
|
||||
"title": "Vrati se na prethodnu stranicu"
|
||||
},
|
||||
"forward": {
|
||||
"title": "Idi na sledeću stranicu"
|
||||
}
|
||||
}
|
||||
},
|
||||
"no-google-login": {
|
||||
"description": "Ukloni Google dugmad i linkove za prijavu sa interfejsa",
|
||||
"name": "Bez Google prijave"
|
||||
},
|
||||
"notifications": {
|
||||
"description": "Prikaži obaveštenje kada numera krene sa reprodukcijom (interaktivna obaveštenja su dostupna na Windows-u)",
|
||||
"menu": {
|
||||
"interactive": "Interaktivna obaveštenja",
|
||||
"interactive-settings": {
|
||||
"label": "Podešavanja za interakciju",
|
||||
"submenu": {
|
||||
"hide-button-text": "Sakrij tekst dugmeta",
|
||||
"refresh-on-play-pause": "Osveži prilikom Pokreni/Pauziraj",
|
||||
"tray-controls": "Otvori/Zatvori klikom na sistemsku traku"
|
||||
}
|
||||
},
|
||||
"priority": "Prioritet obaveštenja",
|
||||
"toast-style": "Toast stil obaveštenja",
|
||||
"unpause-notification": "Prikaži obaveštenje prilikom nastavka reprodukcije"
|
||||
},
|
||||
"name": "Obaveštenja"
|
||||
},
|
||||
"performance-improvement": {
|
||||
"description": "Poboljšaj performanse omogućavanjem eksperimentalnih skripti",
|
||||
"name": "Poboljšaj performanse [Beta]"
|
||||
},
|
||||
"picture-in-picture": {
|
||||
"description": "Dozvoljava aplikaciji da se prebaci u režim slike-u-slici",
|
||||
"menu": {
|
||||
"always-on-top": "Uvek na vrhu",
|
||||
"hotkey": {
|
||||
"label": "Prečica",
|
||||
"prompt": {
|
||||
"keybind-options": {
|
||||
"hotkey": "Prečica"
|
||||
},
|
||||
"label": "Izaberi prečicu za prebacivanje u režim slike-u-slici",
|
||||
"title": "Prečica za režim slike-u-slici"
|
||||
}
|
||||
},
|
||||
"save-window-position": "Sačuvaj poziciju prozora",
|
||||
"save-window-size": "Sačuvaj veličinu prozora",
|
||||
"use-native-pip": "Koristi izvorni režim slike-u-slici za pregledače"
|
||||
},
|
||||
"name": "Slika-u-slici",
|
||||
"templates": {
|
||||
"button": "Slika-u-slici"
|
||||
}
|
||||
},
|
||||
"playback-speed": {
|
||||
"description": "Slušaj brzo, slušaj sporo! Dodaje slajder koji kontroliše brzinu pesme",
|
||||
"name": "Brzina reprodukcije",
|
||||
"templates": {
|
||||
"button": "Brzina"
|
||||
}
|
||||
},
|
||||
"precise-volume": {
|
||||
"description": "Precizno kontroliši jačinu zvuka korišćenjem točka na mišu/prečica, sa prilagođenim interfejsom i prilagodivim inkrementalnim koracima jačine",
|
||||
"menu": {
|
||||
"arrows-shortcuts": "Lokalne kontrole tastera sa strelicama",
|
||||
"custom-volume-steps": "Postavi prilagođene korake za promenu jačine",
|
||||
"global-shortcuts": "Globalne prečice"
|
||||
},
|
||||
"name": "Precizna jačina",
|
||||
"prompt": {
|
||||
"global-shortcuts": {
|
||||
"keybind-options": {
|
||||
"decrease": "Smanji jačinu",
|
||||
"increase": "Povećaj jačinu"
|
||||
},
|
||||
"label": "Izaberi globalne prečice na tastaturi za jačinu:",
|
||||
"title": "Globalne prečice na tastaturi za jačinu"
|
||||
},
|
||||
"volume-steps": {
|
||||
"label": "Izaberi korake za povećanje/smanjenje jačine",
|
||||
"title": "Koraci za promenu jačine"
|
||||
}
|
||||
}
|
||||
},
|
||||
"quality-changer": {
|
||||
"backend": {
|
||||
"dialog": {
|
||||
"quality-changer": {
|
||||
"detail": "Trenutni kvalitet: {{quality}}",
|
||||
"message": "Izaberi kvalitet videa:",
|
||||
"title": "Izaberi kvalitet videa"
|
||||
}
|
||||
}
|
||||
},
|
||||
"description": "Dozvoljava promenu kvaliteta videa pomoću dugmeta na video preklapanju",
|
||||
"name": "Promena kvaliteta videa",
|
||||
"renderer": {
|
||||
"quality-settings-button": {
|
||||
"label": "Otvori meni za promenu kvaliteta plejera"
|
||||
}
|
||||
}
|
||||
},
|
||||
"scrobbler": {
|
||||
"description": "Dodaj podršku za 'scrobbling' (poput last.fm, Listenbrainz)",
|
||||
"dialog": {
|
||||
"lastfm": {
|
||||
"auth-failed": {
|
||||
"message": "Autentifikacija sa Last.fm nije uspela.\nZatvori iskačući prozor do sledećeg ponovnog pokretanja.",
|
||||
"title": "Autentifikacija neuspešna"
|
||||
}
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"lastfm": {
|
||||
"api-settings": "Podešavanja za Last.fm API"
|
||||
},
|
||||
"listenbrainz": {
|
||||
"token": "Unesi korisnički token za ListenBrainz"
|
||||
},
|
||||
"scrobble-alternative-title": "Koristi alternativne naslove",
|
||||
"scrobble-other-media": "'Scrobble'-uj druge medije"
|
||||
},
|
||||
"name": "Scrobbler",
|
||||
"prompt": {
|
||||
"lastfm": {
|
||||
"api-key": "Last.fm API ključ",
|
||||
"api-secret": "Last.fm API tajna (secret)"
|
||||
},
|
||||
"listenbrainz": {
|
||||
"token": {
|
||||
"label": "Unesi svoj ListenBrainz korisnički token:",
|
||||
"title": "ListenBrainz token"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"shortcuts": {
|
||||
"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": {
|
||||
"override-media-keys": "Prepiši medija tastere",
|
||||
"set-keybinds": "Podesi globalne kontrole za numere"
|
||||
},
|
||||
"name": "Prečice (& MPRIS)",
|
||||
"prompt": {
|
||||
"keybind": {
|
||||
"keybind-options": {
|
||||
"next": "Sledeće",
|
||||
"play-pause": "Pusti / Pauziraj",
|
||||
"previous": "Prethodno"
|
||||
},
|
||||
"label": "Izaberi globalne prečice za upravljanje numerama:",
|
||||
"title": "Globalne prečice na tastaturi"
|
||||
}
|
||||
}
|
||||
},
|
||||
"skip-disliked-songs": {
|
||||
"description": "Preskače numere koje su označene sa 'Ne sviđa mi se'",
|
||||
"name": "Preskoči pesme označene sa 'Ne sviđa mi se'"
|
||||
},
|
||||
"skip-silences": {
|
||||
"description": "Automatski preskoči delove numera u kojima je tišina",
|
||||
"name": "Preskoči tišine"
|
||||
},
|
||||
"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",
|
||||
"name": "Blok sponzora"
|
||||
},
|
||||
"synced-lyrics": {
|
||||
"description": "Obezbeđuje sinhronizovane tekstove pesama, korišćenjem dobavljača poput LRClib.",
|
||||
"errors": {
|
||||
"fetch": "⚠️\tDošlo je do greške prilikom dobavljanja teksta pesme.\n\tMolimo vas da pokušate ponovo kasnije.",
|
||||
"not-found": "⚠️ Tekst za ovu pesmu nije pronađen."
|
||||
},
|
||||
"menu": {
|
||||
"default-text-string": {
|
||||
"label": "Podrazumevani karakteri između tekstova pesama",
|
||||
"tooltip": "Izaberi podrazumevane karaktere koji će biti korišćeni za razmake između tekstova pesama"
|
||||
},
|
||||
"line-effect": {
|
||||
"label": "Efekat linije",
|
||||
"submenu": {
|
||||
"fancy": {
|
||||
"label": "Fensi",
|
||||
"tooltip": "Koristi velike (kao iz aplikacije) efekte na trenutnu liniju"
|
||||
},
|
||||
"focus": {
|
||||
"label": "Fokus",
|
||||
"tooltip": "Učini samo trenutnu liniju belom"
|
||||
},
|
||||
"offset": {
|
||||
"label": "Pomeraj (offset)",
|
||||
"tooltip": "Pomeraj (offset) na trenutnoj liniji"
|
||||
},
|
||||
"scale": {
|
||||
"label": "Razmera",
|
||||
"tooltip": "Promeni razmeru trenutne linije"
|
||||
}
|
||||
},
|
||||
"tooltip": "Izaberi efekat koji će biti primenjen na trenutnoj liniji"
|
||||
},
|
||||
"precise-timing": {
|
||||
"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)"
|
||||
},
|
||||
"romanization": {
|
||||
"label": "Romanizuj tekstove pesama",
|
||||
"tooltip": "Ako je tekst pesme na drugom jeziku, pokušaj da ga prikažeš u latiničnoj varijanti."
|
||||
},
|
||||
"show-lyrics-even-if-inexact": {
|
||||
"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."
|
||||
},
|
||||
"show-time-codes": {
|
||||
"label": "Prikaži vremenske oznake",
|
||||
"tooltip": "Prikaži vremenske oznake pored teksta pesme"
|
||||
}
|
||||
},
|
||||
"name": "Sinhronizovani tekstovi pesama",
|
||||
"refetch-btn": {
|
||||
"fetching": "Dobavljanje...",
|
||||
"normal": "Ponovo dobavi tekst pesme"
|
||||
},
|
||||
"warnings": {
|
||||
"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",
|
||||
"instrumental": "⚠️ - Ovo je instrumentalna numera"
|
||||
}
|
||||
},
|
||||
"taskbar-mediacontrol": {
|
||||
"description": "Upravljaj reprodukcijom iz Windows trake sa zadacima",
|
||||
"name": "Upravljanje medijima iz trake sa zadacima"
|
||||
},
|
||||
"touchbar": {
|
||||
"description": "Dodaje 'TouchBar' vidžet za macOS korisnike",
|
||||
"name": "TouchBar"
|
||||
},
|
||||
"tuna-obs": {
|
||||
"description": "Integracija sa OBS-ovom ekstenzijom Tuna",
|
||||
"name": "Tuna OBS"
|
||||
},
|
||||
"unobtrusive-player": {
|
||||
"description": "Onemogućava plejeru da iskače kada reprodukuje numeru",
|
||||
"name": "Nenametljivi plejer"
|
||||
},
|
||||
"video-toggle": {
|
||||
"description": "Dodaje dugme za promenu između režima za video/numeru. Opciono, može da ukloni celu karticu sa videom",
|
||||
"menu": {
|
||||
"align": {
|
||||
"label": "Poravnanje",
|
||||
"submenu": {
|
||||
"left": "Levo",
|
||||
"middle": "Sredina",
|
||||
"right": "Desno"
|
||||
}
|
||||
},
|
||||
"force-hide": "Nasilno ukloni karticu sa videom",
|
||||
"mode": {
|
||||
"label": "Režim",
|
||||
"submenu": {
|
||||
"custom": "Prilagođeno prebacivanje",
|
||||
"disabled": "Onemogućeno",
|
||||
"native": "Izvorno prebacivanje"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Video prebacivanje",
|
||||
"templates": {
|
||||
"button-song": "Numera",
|
||||
"button-video": "Video"
|
||||
}
|
||||
},
|
||||
"visualizer": {
|
||||
"description": "Dodaje vizualizaciju u plejer",
|
||||
"menu": {
|
||||
"visualizer-type": "Tip vizualizacije"
|
||||
},
|
||||
"name": "Vizualizacija"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -222,7 +222,7 @@
|
||||
}
|
||||
},
|
||||
"templates": {
|
||||
"button": "Låt"
|
||||
"button-song": "Låt"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -333,6 +333,30 @@
|
||||
"description": "ஆடியோவுக்கு சுருக்கத்தைப் பயன்படுத்துங்கள் (சமிக்ஞையின் உரத்த பகுதிகளின் அளவைக் குறைத்து, மென்மையான பகுதிகளின் அளவை உயர்த்துகிறது)",
|
||||
"name": "ஆடியோ அமுக்கி"
|
||||
},
|
||||
"auth-proxy-adapter": {
|
||||
"description": "அங்கீகார ப்ராக்ஸி சேவைகளைப் பயன்படுத்துவதற்கான ஆதரவு",
|
||||
"menu": {
|
||||
"disable": "ப்ராக்ஸி அடாப்டரைத் துண்டிக்கவும்",
|
||||
"enable": "ப்ராக்ஸி அடாப்டரை இயக்கு",
|
||||
"hostname": {
|
||||
"label": "ஹோஸ்ட் பெயர்"
|
||||
},
|
||||
"port": {
|
||||
"label": "port"
|
||||
}
|
||||
},
|
||||
"name": "அங்கீகார பதிலாள் அடாப்டர்",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "ப்ராக்ஸி சர்வருக்கான ஹோஸ்ட் பெயரை உள்ளிடவும் (மறுதொடக்கம் தேவை):",
|
||||
"title": "ப்ராக்ஸி ஹோஸ்ட்பெயர்"
|
||||
},
|
||||
"port": {
|
||||
"label": "ப்ராக்ஸி சர்வருக்கான போர்ட்டை உள்ளிடவும் (மறுதொடக்கம் தேவை):",
|
||||
"title": "ப்ராக்ஸி போர்ட்"
|
||||
}
|
||||
}
|
||||
},
|
||||
"blur-nav-bar": {
|
||||
"description": "வழிசெலுத்தல் பட்டியை வெளிப்படையானதாகவும் மங்கலாகவும் ஆக்குகிறது",
|
||||
"name": "மங்கலான வழிசெலுத்தல் பட்டி"
|
||||
@ -600,6 +624,10 @@
|
||||
},
|
||||
"name": "அறிவிப்புகள்"
|
||||
},
|
||||
"performance-improvement": {
|
||||
"description": "சோதனை ஸ்கிரிப்ட்களை இயக்குவதன் மூலம் செயல்திறனை மேம்படுத்தும்",
|
||||
"name": "செயல்திறன் மேம்பாடு [பீட்டா]"
|
||||
},
|
||||
"picture-in-picture": {
|
||||
"description": "பயன்பாட்டை பட-பட பயன்முறைக்கு மாற்ற அனுமதிக்கிறது",
|
||||
"menu": {
|
||||
@ -683,6 +711,7 @@
|
||||
"listenbrainz": {
|
||||
"token": "WeskBrainz பயனர் கிள்ளாக்கை உள்ளிடவும்"
|
||||
},
|
||||
"scrobble-alternative-title": "மாற்று தலைப்புகளைப் பயன்படுத்தவும்",
|
||||
"scrobble-other-media": "மற்ற ஊடகங்களை வெல்லுங்கள்"
|
||||
},
|
||||
"name": "ச்க்ரோபிளர்",
|
||||
@ -767,6 +796,10 @@
|
||||
"label": "பாடல் வரிகளை சரியாக ஒத்திசைக்கவும்",
|
||||
"tooltip": "அடுத்த வரியின் காட்சியைக் கணக்கிடுங்கள் (செயல்திறனில் ஒரு சிறிய தாக்கத்தை ஏற்படுத்தும்)"
|
||||
},
|
||||
"romanization": {
|
||||
"label": "பாடல் வரிகள் ரோமானியமாக்குங்கள்",
|
||||
"tooltip": "பாடல் வரிகள் வேறு மொழியில் இருந்தால், லத்தீன் பதிப்பைக் காட்ட முயற்சிக்கவும்."
|
||||
},
|
||||
"show-lyrics-even-if-inexact": {
|
||||
"label": "துல்லியமாக இருந்தாலும் பாடல்களைக் காட்டு",
|
||||
"tooltip": "பாடல் காணப்படாவிட்டால், சொருகி மீண்டும் வேறு தேடல் வினவலுடன் முயற்சிக்கிறது.\n இரண்டாவது முயற்சியின் முடிவு துல்லியமாக இருக்காது."
|
||||
@ -799,6 +832,10 @@
|
||||
"description": "OBS இன் சொருகி டுனாவுடன் ஒருங்கிணைப்பு",
|
||||
"name": "டுனா குறிப்பு"
|
||||
},
|
||||
"unobtrusive-player": {
|
||||
"description": "பாடலைப் பாடும்போது பாப் அப் செய்வதைத் தடுக்கிறது",
|
||||
"name": "எளிதில் கேட்கக்கூடிய பாடல்"
|
||||
},
|
||||
"video-toggle": {
|
||||
"description": "வீடியோ/பாடல் பயன்முறைக்கு இடையில் மாற ஒரு பொத்தானைச் சேர்க்கிறது. முழு வீடியோ தாவலையும் விருப்பமாக அகற்றலாம்",
|
||||
"menu": {
|
||||
@ -822,7 +859,8 @@
|
||||
},
|
||||
"name": "வீடியோ மாற்று",
|
||||
"templates": {
|
||||
"button": "பாடல்"
|
||||
"button-song": "பாடல்",
|
||||
"button-video": "காணொளி"
|
||||
}
|
||||
},
|
||||
"visualizer": {
|
||||
|
||||
@ -333,6 +333,30 @@
|
||||
"description": "ใช้การบีบอัดเสียง (ลดระดับเสียงของส่วนที่ดังที่สุดของสัญญาณและเพิ่มระดับเสียงของส่วนที่เบาที่สุด)",
|
||||
"name": "เครื่องมือบีบอัดเสียง"
|
||||
},
|
||||
"auth-proxy-adapter": {
|
||||
"description": "รองรับการใช้พร็อกซีสำหรับการตรวจสอบสิทธิ์",
|
||||
"menu": {
|
||||
"disable": "เปิดใช้งาน ตัวเชื่อมต่อพร็อกซี",
|
||||
"enable": "ปิดใช้งาน ตัวเชื่อมต่อพร็อกซี",
|
||||
"hostname": {
|
||||
"label": "ชื่อโฮสต์"
|
||||
},
|
||||
"port": {
|
||||
"label": "พอร์ต"
|
||||
}
|
||||
},
|
||||
"name": "ตัวเชื่อมต่อสำหรับตรวจสอบสิทธิ์ผ่านพร็อกซี",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "ป้อนชื่อโฮสต์สำหรับพร็อกซีเซิร์ฟเวอร์ภายในเครื่อง (ต้องรีสตาร์ท):",
|
||||
"title": "ชื่อโฮสต์พร็อกซี"
|
||||
},
|
||||
"port": {
|
||||
"label": "ป้อนพอร์ตสำหรับพร็อกซีเซิร์ฟเวอร์ภายในเครื่อง (ต้องรีสตาร์ท):",
|
||||
"title": "พอร์ตพร็อกซี"
|
||||
}
|
||||
}
|
||||
},
|
||||
"blur-nav-bar": {
|
||||
"description": "ทำให้แถบนำทางโปร่งแสงและเบลอ",
|
||||
"name": "เบลอแถบนำทาง"
|
||||
@ -600,6 +624,10 @@
|
||||
},
|
||||
"name": "การแจ้งเตือน"
|
||||
},
|
||||
"performance-improvement": {
|
||||
"description": "ปรับปรุงประสิทธิภาพโดยเปิดใช้งานสคริปต์ทดลอง",
|
||||
"name": "ปรับปรุงประสิทธิภาพ [Beta]"
|
||||
},
|
||||
"picture-in-picture": {
|
||||
"description": "อนุญาตให้สลับแอปเป็นโหมดภาพในภาพ",
|
||||
"menu": {
|
||||
@ -831,7 +859,7 @@
|
||||
},
|
||||
"name": "ปุ่มวิดีโอ",
|
||||
"templates": {
|
||||
"button": "เพลง"
|
||||
"button-song": "เพลง"
|
||||
}
|
||||
},
|
||||
"visualizer": {
|
||||
|
||||
@ -36,7 +36,7 @@
|
||||
"details": "Yanıt verilmedi!\n{{error}}"
|
||||
},
|
||||
"when-ready": {
|
||||
"clearing-cache-after-20s": "Uygulama ön belleği temizleme"
|
||||
"clearing-cache-after-20s": "Uygulama ön belleği temizle"
|
||||
},
|
||||
"window": {
|
||||
"tried-to-render-offscreen": "Pencere ekranın dışında oluşturulmaya çalışıldı, windowSize={{windowSize}}, displaySize={{displaySize}}, position={{position}}"
|
||||
@ -209,7 +209,7 @@
|
||||
"plugins": {
|
||||
"ad-speedup": {
|
||||
"description": "Bir reklam oynatılırsa sesi kapatır ve oynatma hızını 16x olarak ayarlar",
|
||||
"name": "Hızlandırma"
|
||||
"name": "Reklam Hızlandırma"
|
||||
},
|
||||
"adblocker": {
|
||||
"description": "Tüm reklamları ve izleyicileri engelle",
|
||||
@ -287,7 +287,7 @@
|
||||
}
|
||||
},
|
||||
"api-server": {
|
||||
"description": "APİ ekle ve oynatıcıyı kontrol et",
|
||||
"description": "Oynatıcıyı kontrol etmek için bir API sunucusu ekle",
|
||||
"dialog": {
|
||||
"request": {
|
||||
"buttons": {
|
||||
@ -321,7 +321,7 @@
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "API sunucusu için hostname (örneğin 0.0.0.0) girin:",
|
||||
"title": "Hostname"
|
||||
"title": "Hostname(Ana bilgisayar adı)"
|
||||
},
|
||||
"port": {
|
||||
"label": "API sunucusu için port girin:",
|
||||
@ -333,6 +333,30 @@
|
||||
"description": "Ses sıkıştırma (dalganın en gürültülü bölümlerinin ses düzeyini azaltır ve daha yumuşak bölümlerin ses düzeyini artırır)",
|
||||
"name": "Ses Sıkıştırma"
|
||||
},
|
||||
"auth-proxy-adapter": {
|
||||
"description": "Kimlik doğrulama proxy hizmetlerinin kullanımına destek",
|
||||
"menu": {
|
||||
"disable": "Proxy Bağdaştırıcısını Devre Dışı Bırak",
|
||||
"enable": "Proxy Bağdaştırıcısını Etkinleştir",
|
||||
"hostname": {
|
||||
"label": "Ana makine adı"
|
||||
},
|
||||
"port": {
|
||||
"label": "Port"
|
||||
}
|
||||
},
|
||||
"name": "Ara Sunucu Doğrulama Bağdaştırıcısı",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "Yerel proxy sunucusu için ana makine adını girin (yeniden başlatma gerektirir):",
|
||||
"title": "Proxy Ana Makine Adı"
|
||||
},
|
||||
"port": {
|
||||
"label": "Yerel proxy sunucusu için bağlantı noktasını girin (yeniden başlatma gerektirir):",
|
||||
"title": "Proxy Bağlantı Noktası"
|
||||
}
|
||||
}
|
||||
},
|
||||
"blur-nav-bar": {
|
||||
"description": "Gezinme çubuğunu şeffaf ve bulanık yapar",
|
||||
"name": "Navigasyon barını bulanıklaştır"
|
||||
@ -357,6 +381,11 @@
|
||||
},
|
||||
"templates": {
|
||||
"title": "Altyazı seçiciyi aç"
|
||||
},
|
||||
"toast": {
|
||||
"caption-changed": "Başlık {{language}} olarak değiştirildi",
|
||||
"caption-disabled": "Altyazılar devre dışı",
|
||||
"no-captions": "Bu şarkı için altyazı mevcut değil"
|
||||
}
|
||||
},
|
||||
"compact-sidebar": {
|
||||
@ -576,7 +605,15 @@
|
||||
},
|
||||
"navigation": {
|
||||
"description": "Favori tarayıcınızdaki gibi doğrudan arayüze entegre edilmiş İleri/Geri gezinme okları",
|
||||
"name": "Navigasyon"
|
||||
"name": "Navigasyon",
|
||||
"templates": {
|
||||
"back": {
|
||||
"title": "Önceki sayfaya git"
|
||||
},
|
||||
"forward": {
|
||||
"title": "Sonraki sayfaya geç"
|
||||
}
|
||||
}
|
||||
},
|
||||
"no-google-login": {
|
||||
"description": "Google giriş düğmelerini ve bağlantılarını arayüzden kaldır",
|
||||
@ -600,6 +637,10 @@
|
||||
},
|
||||
"name": "Bildirimler"
|
||||
},
|
||||
"performance-improvement": {
|
||||
"description": "Deneysel komut dosyalarını etkinleştirerek performansı artırın",
|
||||
"name": "Performans iyileştirmesi [Beta]"
|
||||
},
|
||||
"picture-in-picture": {
|
||||
"description": "Uygulamayı resim-içinde-resim moduna geçirmeye izin verir",
|
||||
"menu": {
|
||||
@ -664,7 +705,12 @@
|
||||
}
|
||||
},
|
||||
"description": "Video katmanı üzerindeki bir düğme ile video kalitesinin değiştirilmesine izin verir",
|
||||
"name": "Video Kalitesi Değiştirici"
|
||||
"name": "Video Kalitesi Değiştirici",
|
||||
"renderer": {
|
||||
"quality-settings-button": {
|
||||
"label": "Açık oynatıcı kalite değiştirici"
|
||||
}
|
||||
}
|
||||
},
|
||||
"scrobbler": {
|
||||
"description": "Listeleme desteği ekler (lastfm, listenbrainz ve benzeri)",
|
||||
@ -831,7 +877,8 @@
|
||||
},
|
||||
"name": "Video Geçiş",
|
||||
"templates": {
|
||||
"button": "Şarkı"
|
||||
"button-song": "Şarkı",
|
||||
"button-video": "Video"
|
||||
}
|
||||
},
|
||||
"visualizer": {
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
"common": {
|
||||
"console": {
|
||||
"plugins": {
|
||||
"execute-failed": "Не вдалося запустити плагін {{pluginName}}::{{contextName}}",
|
||||
"execute-failed": "Не вдалося виконати плагін {{pluginName}}::{{contextName}}",
|
||||
"executed-at-ms": "Плагін {{pluginName}}::{{contextName}} запущено за {{ms}}ms",
|
||||
"initialize-failed": "Не вдалося ініціалізувати плагін \"{{pluginName}}\"",
|
||||
"load-all": "Завантаження всіх плагінів",
|
||||
@ -209,7 +209,7 @@
|
||||
"plugins": {
|
||||
"ad-speedup": {
|
||||
"description": "При програванні реклами звук вимикається і встановлюється швидкість відтворення 16х",
|
||||
"name": "Пришвидшення релками"
|
||||
"name": "Пришвидшення реклами"
|
||||
},
|
||||
"adblocker": {
|
||||
"description": "Блокувати всю рекламу та відстеження з коробки",
|
||||
@ -333,6 +333,30 @@
|
||||
"description": "Застосувати стиснення аудіо (зменшити гучність найгучніших фрагментів сигналу та збільшити гучність тихих фрагментів)",
|
||||
"name": "Аудіокомпресор"
|
||||
},
|
||||
"auth-proxy-adapter": {
|
||||
"description": "Підтримка використання проксі-сервісів з аутентифікацією",
|
||||
"menu": {
|
||||
"disable": "Вимкнути проксі-адаптер",
|
||||
"enable": "Ввімкнути проксі-адаптер",
|
||||
"hostname": {
|
||||
"label": "Ім'я хоста"
|
||||
},
|
||||
"port": {
|
||||
"label": "Порт"
|
||||
}
|
||||
},
|
||||
"name": "Адаптер проксі-авторизації",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "Введіть ім'я хоста для локального проксі сервера(вимагає перезапуск):",
|
||||
"title": "Назва проксі-хоста"
|
||||
},
|
||||
"port": {
|
||||
"label": "Введіть порт для локального проксі серверу (потрібен рестарт):",
|
||||
"title": "Порт проксі"
|
||||
}
|
||||
}
|
||||
},
|
||||
"blur-nav-bar": {
|
||||
"description": "Робить панель навігації прозорою та розмитою",
|
||||
"name": "Розмиття панелі навігації"
|
||||
@ -495,7 +519,7 @@
|
||||
"description": "Додає еквалайзер до програвача",
|
||||
"menu": {
|
||||
"presets": {
|
||||
"label": "Пресети",
|
||||
"label": "Шаблони",
|
||||
"list": {
|
||||
"bass-booster": "Підсилювач басів"
|
||||
}
|
||||
@ -600,6 +624,10 @@
|
||||
},
|
||||
"name": "Сповіщення"
|
||||
},
|
||||
"performance-improvement": {
|
||||
"description": "Поліпшіть продуктивність, ввімкнувши експериментальні сценарії",
|
||||
"name": "Поліпшення продуктивності [Бета]"
|
||||
},
|
||||
"picture-in-picture": {
|
||||
"description": "Дозволяє перемикати програму в режим «картинка в картинці»",
|
||||
"menu": {
|
||||
@ -831,7 +859,7 @@
|
||||
},
|
||||
"name": "Перемикач відео",
|
||||
"templates": {
|
||||
"button": "Пісня"
|
||||
"button-song": "Пісня"
|
||||
}
|
||||
},
|
||||
"visualizer": {
|
||||
|
||||
@ -280,6 +280,7 @@
|
||||
"name": "Chế độ Môi trường xung quanh"
|
||||
},
|
||||
"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.",
|
||||
"name": "Amuse",
|
||||
"response": {
|
||||
"query": "Máy chủ API của Amuse đang chạy. GET /query để lấy thông tin về bài hát."
|
||||
@ -332,9 +333,33 @@
|
||||
"description": "Áp dụng tính năng nén cho âm thanh (giảm âm lượng của phần to nhất của tín hiệu và tăng âm lượng của phần nhỏ nhất)",
|
||||
"name": "Bộ nén âm thanh"
|
||||
},
|
||||
"auth-proxy-adapter": {
|
||||
"description": "Ủng hộ cho mục đích duy trì dịch vụ xác minh proxy",
|
||||
"menu": {
|
||||
"disable": "Vô hiệu bộ chuyển đổi Proxy",
|
||||
"enable": "Kích hoạt bộ chuyển đổi Proxy",
|
||||
"hostname": {
|
||||
"label": "Tên máy chủ"
|
||||
},
|
||||
"port": {
|
||||
"label": "Cổng"
|
||||
}
|
||||
},
|
||||
"name": "Bộ chuyển đổi xác minh máy chủ Proxy",
|
||||
"prompt": {
|
||||
"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):",
|
||||
"title": "Tên máy chủ Proxy"
|
||||
},
|
||||
"port": {
|
||||
"label": "Nhập cổng của máy chủ proxy lận cận (bắt buộc khởi động lại ứng dụng):",
|
||||
"title": "Cổng máy chủ Proxy"
|
||||
}
|
||||
}
|
||||
},
|
||||
"blur-nav-bar": {
|
||||
"description": "Làm mờ và trong suốt thanh điều hướng",
|
||||
"name": "Thanh điều hướng mờ"
|
||||
"description": "Làm thanh điều hướng mờ và trong suốt",
|
||||
"name": "Làm mờ thanh điều hướng"
|
||||
},
|
||||
"bypass-age-restrictions": {
|
||||
"description": "Bỏ qua xác minh độ tuổi của YouTube",
|
||||
@ -491,6 +516,14 @@
|
||||
}
|
||||
},
|
||||
"equalizer": {
|
||||
"description": "Thêm bộ cân bằng âm thanh vào trình phát nhạc.",
|
||||
"menu": {
|
||||
"presets": {
|
||||
"list": {
|
||||
"bass-booster": "Bộ tăng âm trầm"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Cân bằng âm thanh"
|
||||
},
|
||||
"exponential-volume": {
|
||||
@ -590,6 +623,10 @@
|
||||
},
|
||||
"name": "Thông báo"
|
||||
},
|
||||
"performance-improvement": {
|
||||
"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]"
|
||||
},
|
||||
"picture-in-picture": {
|
||||
"description": "Cho phép chuyển ứng dụng sang chế độ ảnh trong ảnh",
|
||||
"menu": {
|
||||
@ -758,6 +795,7 @@
|
||||
"tooltip": "Tính toán chính xác đến mili giây thời gian hiển thị dòng tiếp theo (có thể có tác động nhỏ đến hiệu suất)"
|
||||
},
|
||||
"romanization": {
|
||||
"label": "Chuyển lời bài hát sang chữ Latin",
|
||||
"tooltip": "Nếu lời bài hát đang ở ngôn ngữ khác, thử hiển thị phiên bản bảng chữ cái La-tinh."
|
||||
},
|
||||
"show-lyrics-even-if-inexact": {
|
||||
@ -792,6 +830,10 @@
|
||||
"description": "Tích hợp với plugin Tuna của OBS",
|
||||
"name": "Tuna OBS"
|
||||
},
|
||||
"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.",
|
||||
"name": "Trình phát nhạc ẩn"
|
||||
},
|
||||
"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",
|
||||
"menu": {
|
||||
@ -815,7 +857,7 @@
|
||||
},
|
||||
"name": "Chuyển đổi video",
|
||||
"templates": {
|
||||
"button": "Bài hát"
|
||||
"button-song": "Bài hát"
|
||||
}
|
||||
},
|
||||
"visualizer": {
|
||||
|
||||
@ -333,6 +333,30 @@
|
||||
"description": "对音频应用压缩(压低响亮部分,提升柔和部分)",
|
||||
"name": "音频压缩器"
|
||||
},
|
||||
"auth-proxy-adapter": {
|
||||
"description": "支持使用需要身份验证的代理",
|
||||
"menu": {
|
||||
"disable": "禁用代理适配",
|
||||
"enable": "启用代理适配",
|
||||
"hostname": {
|
||||
"label": "主机名"
|
||||
},
|
||||
"port": {
|
||||
"label": "端口"
|
||||
}
|
||||
},
|
||||
"name": "认证代理适配",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "请输入本地代理服务器的主机名(需要重启):",
|
||||
"title": "代理主机名"
|
||||
},
|
||||
"port": {
|
||||
"label": "请输入本地代理服务器的端口号(需要重启):",
|
||||
"title": "代理端口"
|
||||
}
|
||||
}
|
||||
},
|
||||
"blur-nav-bar": {
|
||||
"description": "让导航栏透明及模糊",
|
||||
"name": "模糊导航栏"
|
||||
@ -357,6 +381,11 @@
|
||||
},
|
||||
"templates": {
|
||||
"title": "开启字幕选择器"
|
||||
},
|
||||
"toast": {
|
||||
"caption-changed": "字幕语言更改为 {{language}}",
|
||||
"caption-disabled": "停用了字幕",
|
||||
"no-captions": "这首歌没有字幕"
|
||||
}
|
||||
},
|
||||
"compact-sidebar": {
|
||||
@ -576,7 +605,15 @@
|
||||
},
|
||||
"navigation": {
|
||||
"description": "如同浏览器般,在应用界面内直接显示前进/后退导航按钮",
|
||||
"name": "导航"
|
||||
"name": "导航",
|
||||
"templates": {
|
||||
"back": {
|
||||
"title": "转到上一页"
|
||||
},
|
||||
"forward": {
|
||||
"title": "转到下一页"
|
||||
}
|
||||
}
|
||||
},
|
||||
"no-google-login": {
|
||||
"description": "从界面内移除 Google 登录按钮和链接",
|
||||
@ -600,6 +637,10 @@
|
||||
},
|
||||
"name": "通知"
|
||||
},
|
||||
"performance-improvement": {
|
||||
"description": "通过开启实验性脚本改进性能",
|
||||
"name": "性能改进 [公测]"
|
||||
},
|
||||
"picture-in-picture": {
|
||||
"description": "允许应用切换到画中画模式",
|
||||
"menu": {
|
||||
@ -664,7 +705,12 @@
|
||||
}
|
||||
},
|
||||
"description": "允许在视频上显示切换画质按钮",
|
||||
"name": "视频画质切换器"
|
||||
"name": "视频画质切换器",
|
||||
"renderer": {
|
||||
"quality-settings-button": {
|
||||
"label": "打开播放器音质更改程序"
|
||||
}
|
||||
}
|
||||
},
|
||||
"scrobbler": {
|
||||
"description": "添加歌曲追踪支持(如 Last.fm 和 Listenbrainz)",
|
||||
@ -831,7 +877,8 @@
|
||||
},
|
||||
"name": "视频切换开关",
|
||||
"templates": {
|
||||
"button": "歌曲"
|
||||
"button-song": "歌曲",
|
||||
"button-video": "视频"
|
||||
}
|
||||
},
|
||||
"visualizer": {
|
||||
|
||||
@ -333,6 +333,30 @@
|
||||
"description": "使用音效壓縮 (大聲部份的音量降低,柔和部份的音量提高)",
|
||||
"name": "音效壓縮器"
|
||||
},
|
||||
"auth-proxy-adapter": {
|
||||
"description": "支援使用 Proxy 驗證服務",
|
||||
"menu": {
|
||||
"disable": "中斷 Proxy 連線",
|
||||
"enable": "啟用 Proxy 連線",
|
||||
"hostname": {
|
||||
"label": "主機名稱"
|
||||
},
|
||||
"port": {
|
||||
"label": "連接埠"
|
||||
}
|
||||
},
|
||||
"name": "Proxy 連線驗證",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "本地 Proxy 伺服器主機名稱(需要重啟應用):",
|
||||
"title": "Proxy 主機名稱"
|
||||
},
|
||||
"port": {
|
||||
"label": "本地 Proxy 伺服器連接埠(需要重啟應用):",
|
||||
"title": "Proxy 連接埠"
|
||||
}
|
||||
}
|
||||
},
|
||||
"blur-nav-bar": {
|
||||
"description": "使導覽列透明及模糊",
|
||||
"name": "模糊導覽列"
|
||||
@ -357,6 +381,11 @@
|
||||
},
|
||||
"templates": {
|
||||
"title": "打開標題選擇器"
|
||||
},
|
||||
"toast": {
|
||||
"caption-changed": "字幕語言更改為{{language}}",
|
||||
"caption-disabled": "停用字幕",
|
||||
"no-captions": "此歌曲無標題"
|
||||
}
|
||||
},
|
||||
"compact-sidebar": {
|
||||
@ -576,7 +605,15 @@
|
||||
},
|
||||
"navigation": {
|
||||
"description": "允許應用程式上方顯示上一頁/下一頁按鈕",
|
||||
"name": "導覽列"
|
||||
"name": "導覽列",
|
||||
"templates": {
|
||||
"back": {
|
||||
"title": "回到上一頁"
|
||||
},
|
||||
"forward": {
|
||||
"title": "前往下一頁"
|
||||
}
|
||||
}
|
||||
},
|
||||
"no-google-login": {
|
||||
"description": "移除 Google 登入按鈕及連結",
|
||||
@ -600,6 +637,10 @@
|
||||
},
|
||||
"name": "歌曲播放通知"
|
||||
},
|
||||
"performance-improvement": {
|
||||
"description": "使用實驗性的腳本以優化效能",
|
||||
"name": "效能優化 [Beta]"
|
||||
},
|
||||
"picture-in-picture": {
|
||||
"description": "允許應用程式切換至子母畫面模式",
|
||||
"menu": {
|
||||
@ -664,7 +705,12 @@
|
||||
}
|
||||
},
|
||||
"description": "允許在影片內進行畫質更改",
|
||||
"name": "允許變更影片畫質"
|
||||
"name": "允許變更影片畫質",
|
||||
"renderer": {
|
||||
"quality-settings-button": {
|
||||
"label": "開啟畫質調整器"
|
||||
}
|
||||
}
|
||||
},
|
||||
"scrobbler": {
|
||||
"description": "額外新增 scrobbling 支援 (例如:last.fm, Listenbrainz)",
|
||||
@ -706,7 +752,7 @@
|
||||
"override-media-keys": "覆寫媒體快捷鍵",
|
||||
"set-keybinds": "設定全域歌曲控制"
|
||||
},
|
||||
"name": "Shortcuts (& MPRIS)",
|
||||
"name": "快捷鍵 (& MPRIS)",
|
||||
"prompt": {
|
||||
"keybind": {
|
||||
"keybind-options": {
|
||||
@ -831,7 +877,8 @@
|
||||
},
|
||||
"name": "歌曲/影片切換",
|
||||
"templates": {
|
||||
"button": "歌曲"
|
||||
"button-song": "歌曲",
|
||||
"button-video": "影片"
|
||||
}
|
||||
},
|
||||
"visualizer": {
|
||||
|
||||
71
src/index.ts
71
src/index.ts
@ -57,13 +57,15 @@ import { loadI18n, setLanguage, t } from '@/i18n';
|
||||
|
||||
import ErrorHtmlAsset from '@assets/error.html?asset';
|
||||
|
||||
import { defaultAuthProxyConfig } from '@/plugins/auth-proxy-adapter/config';
|
||||
|
||||
import type { PluginConfig } from '@/types/plugins';
|
||||
|
||||
if (!is.macOS()) {
|
||||
delete allPlugins['touchbar'];
|
||||
delete (await allPlugins())['touchbar'];
|
||||
}
|
||||
if (!is.windows()) {
|
||||
delete allPlugins['taskbar-mediacontrol'];
|
||||
delete (await allPlugins())['taskbar-mediacontrol'];
|
||||
}
|
||||
|
||||
// Catch errors and log them
|
||||
@ -72,9 +74,6 @@ unhandled({
|
||||
showDialog: false,
|
||||
});
|
||||
|
||||
// Disable Node options if the env var is set
|
||||
process.env.NODE_OPTIONS = '';
|
||||
|
||||
// Prevent window being garbage collected
|
||||
let mainWindow: Electron.BrowserWindow | null;
|
||||
autoUpdater.autoDownload = false;
|
||||
@ -112,6 +111,11 @@ protocol.registerSchemesAsPrivileged([
|
||||
{ scheme: 'mailto', privileges: { standard: true } },
|
||||
]);
|
||||
|
||||
// https://github.com/electron/electron/issues/46538#issuecomment-2808806722
|
||||
if (is.linux()) {
|
||||
app.commandLine.appendSwitch('gtk-version', '3');
|
||||
}
|
||||
|
||||
// Ozone platform hint: Required for Wayland support
|
||||
app.commandLine.appendSwitch('ozone-platform-hint', 'auto');
|
||||
// SharedArrayBuffer: Required for downloader (@ffmpeg/core-mt)
|
||||
@ -122,6 +126,8 @@ app.commandLine.appendSwitch(
|
||||
'enable-features',
|
||||
'OverlayScrollbar,SharedArrayBuffer,UseOzonePlatform,WaylandWindowDecorations',
|
||||
);
|
||||
// Disable Fluent Scrollbar (for OverlayScrollbar)
|
||||
app.commandLine.appendSwitch('disable-features', 'FluentScrollbar');
|
||||
if (config.get('options.disableHardwareAcceleration')) {
|
||||
if (is.dev()) {
|
||||
console.log('Disabling hardware acceleration');
|
||||
@ -135,13 +141,30 @@ if (is.linux()) {
|
||||
app.setName('com.github.th_ch.youtube_music');
|
||||
|
||||
// Stops chromium from launching its own MPRIS service
|
||||
if (config.plugins.isEnabled('shortcuts')) {
|
||||
if (await config.plugins.isEnabled('shortcuts')) {
|
||||
app.commandLine.appendSwitch('disable-features', 'MediaSessionService');
|
||||
}
|
||||
}
|
||||
|
||||
if (config.get('options.proxy')) {
|
||||
app.commandLine.appendSwitch('proxy-server', config.get('options.proxy'));
|
||||
const authProxyEnabled = await config.plugins.isEnabled('auth-proxy-adapter');
|
||||
|
||||
let proxyToUse = '';
|
||||
if (authProxyEnabled) {
|
||||
// Use proxy from Auth-Proxy-Adapter plugin
|
||||
const authProxyConfig = deepmerge(
|
||||
defaultAuthProxyConfig,
|
||||
config.get('plugins.auth-proxy-adapter') ?? {},
|
||||
) as typeof defaultAuthProxyConfig;
|
||||
|
||||
const { hostname, port } = authProxyConfig;
|
||||
proxyToUse = `socks5://${hostname}:${port}`;
|
||||
} else if (config.get('options.proxy')) {
|
||||
// Use global proxy settings
|
||||
proxyToUse = config.get('options.proxy');
|
||||
}
|
||||
console.log(LoggerPrefix, `Using proxy: ${proxyToUse}`);
|
||||
app.commandLine.appendSwitch('proxy-server', proxyToUse);
|
||||
}
|
||||
|
||||
// Adds debug features like hotkeys for triggering dev tools and reload
|
||||
@ -162,19 +185,23 @@ function onClosed() {
|
||||
mainWindow = null;
|
||||
}
|
||||
|
||||
ipcMain.handle('ytmd:get-main-plugin-names', () => Object.keys(mainPlugins));
|
||||
ipcMain.handle('ytmd:get-main-plugin-names', async () =>
|
||||
Object.keys(await mainPlugins()),
|
||||
);
|
||||
|
||||
const initHook = async (win: BrowserWindow) => {
|
||||
const allPluginStubs = await allPlugins();
|
||||
|
||||
const initHook = (win: BrowserWindow) => {
|
||||
ipcMain.handle(
|
||||
'ytmd:get-config',
|
||||
(_, id: string) =>
|
||||
deepmerge(
|
||||
allPlugins[id].config ?? { enabled: false },
|
||||
allPluginStubs[id].config ?? { enabled: false },
|
||||
config.get(`plugins.${id}`) ?? {},
|
||||
) as PluginConfig,
|
||||
);
|
||||
ipcMain.handle('ytmd:set-config', (_, name: string, obj: object) =>
|
||||
config.setPartial(`plugins.${name}`, obj, allPlugins[name].config),
|
||||
config.setPartial(`plugins.${name}`, obj, allPluginStubs[name].config),
|
||||
);
|
||||
|
||||
config.watch((newValue, oldValue) => {
|
||||
@ -193,7 +220,7 @@ const initHook = (win: BrowserWindow) => {
|
||||
if (!isEqual) {
|
||||
const oldConfig = oldPluginConfigList[id] as PluginConfig;
|
||||
const config = deepmerge(
|
||||
allPlugins[id].config ?? { enabled: false },
|
||||
allPluginStubs[id].config ?? { enabled: false },
|
||||
newPluginConfig ?? {},
|
||||
) as PluginConfig;
|
||||
|
||||
@ -208,7 +235,7 @@ const initHook = (win: BrowserWindow) => {
|
||||
forceUnloadMainPlugin(id, win);
|
||||
}
|
||||
|
||||
if (allPlugins[id]?.restartNeeded) {
|
||||
if (allPluginStubs[id]?.restartNeeded) {
|
||||
showNeedToRestartDialog(id);
|
||||
}
|
||||
}
|
||||
@ -229,8 +256,8 @@ const initHook = (win: BrowserWindow) => {
|
||||
});
|
||||
};
|
||||
|
||||
const showNeedToRestartDialog = (id: string) => {
|
||||
const plugin = allPlugins[id];
|
||||
const showNeedToRestartDialog = async (id: string) => {
|
||||
const plugin = (await allPlugins())[id];
|
||||
|
||||
const dialogOptions: Electron.MessageBoxOptions = {
|
||||
type: 'info',
|
||||
@ -304,7 +331,7 @@ async function createMainWindow() {
|
||||
const windowSize = config.get('window-size');
|
||||
const windowMaximized = config.get('window-maximized');
|
||||
const windowPosition: Electron.Point = config.get('window-position');
|
||||
const useInlineMenu = config.plugins.isEnabled('in-app-menu');
|
||||
const useInlineMenu = await config.plugins.isEnabled('in-app-menu');
|
||||
|
||||
const defaultTitleBarOverlayOptions: Electron.TitleBarOverlay = {
|
||||
color: '#00000000',
|
||||
@ -337,7 +364,7 @@ async function createMainWindow() {
|
||||
show: false,
|
||||
webPreferences: {
|
||||
contextIsolation: true,
|
||||
preload: path.join(__dirname, '..', 'preload', 'preload.js'),
|
||||
preload: path.join(__dirname, '..', 'preload', 'preload.cjs'),
|
||||
...(isTesting()
|
||||
? undefined
|
||||
: {
|
||||
@ -348,7 +375,7 @@ async function createMainWindow() {
|
||||
},
|
||||
...decorations,
|
||||
});
|
||||
initHook(win);
|
||||
await initHook(win);
|
||||
initTheme(win);
|
||||
|
||||
await loadAllMainPlugins(win);
|
||||
@ -593,12 +620,12 @@ app.on('activate', async () => {
|
||||
}
|
||||
});
|
||||
|
||||
const getDefaultLocale = (locale: string) =>
|
||||
Object.keys(languageResources).includes(locale) ? locale : null;
|
||||
const getDefaultLocale = async (locale: string) =>
|
||||
Object.keys(await languageResources()).includes(locale) ? locale : null;
|
||||
|
||||
app.whenReady().then(async () => {
|
||||
if (!config.get('options.language')) {
|
||||
const locale = getDefaultLocale(app.getLocale());
|
||||
const locale = await getDefaultLocale(app.getLocale());
|
||||
if (locale) {
|
||||
config.set('options.language', locale);
|
||||
}
|
||||
@ -739,7 +766,7 @@ app.whenReady().then(async () => {
|
||||
|
||||
const splited = decodeURIComponent(command).split(' ');
|
||||
|
||||
handleProtocol(splited.shift()!, splited);
|
||||
handleProtocol(splited.shift()!, ...splited);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@ -20,13 +20,17 @@ const createContext = (
|
||||
id: string,
|
||||
win: BrowserWindow,
|
||||
): BackendContext<PluginConfig> => ({
|
||||
getConfig: () =>
|
||||
getConfig: async () =>
|
||||
deepmerge(
|
||||
allPlugins[id].config ?? { enabled: false },
|
||||
(await allPlugins())[id].config ?? { enabled: false },
|
||||
config.get(`plugins.${id}`) ?? {},
|
||||
) as PluginConfig,
|
||||
setConfig: (newConfig) => {
|
||||
config.setPartial(`plugins.${id}`, newConfig, allPlugins[id].config);
|
||||
setConfig: async (newConfig) => {
|
||||
config.setPartial(
|
||||
`plugins.${id}`,
|
||||
newConfig,
|
||||
(await allPlugins())[id].config,
|
||||
);
|
||||
},
|
||||
|
||||
ipc: {
|
||||
@ -96,7 +100,7 @@ export const forceLoadMainPlugin = async (
|
||||
id: string,
|
||||
win: BrowserWindow,
|
||||
): Promise<void> => {
|
||||
const plugin = mainPlugins[id];
|
||||
const plugin = (await mainPlugins())[id];
|
||||
if (!plugin) return;
|
||||
|
||||
try {
|
||||
@ -133,7 +137,7 @@ export const loadAllMainPlugins = async (win: BrowserWindow) => {
|
||||
const pluginConfigs = config.plugins.getPlugins();
|
||||
const queue: Promise<void>[] = [];
|
||||
|
||||
for (const [plugin, pluginDef] of Object.entries(mainPlugins)) {
|
||||
for (const [plugin, pluginDef] of Object.entries(await mainPlugins())) {
|
||||
const config = deepmerge(pluginDef.config, pluginConfigs[plugin] ?? {});
|
||||
if (config.enabled) {
|
||||
queue.push(forceLoadMainPlugin(plugin, win));
|
||||
|
||||
@ -17,19 +17,23 @@ const createContext = (
|
||||
id: string,
|
||||
win: BrowserWindow,
|
||||
): MenuContext<PluginConfig> => ({
|
||||
getConfig: () =>
|
||||
getConfig: async () =>
|
||||
deepmerge(
|
||||
allPlugins[id].config ?? { enabled: false },
|
||||
(await allPlugins())[id].config ?? { enabled: false },
|
||||
config.get(`plugins.${id}`) ?? {},
|
||||
) as PluginConfig,
|
||||
setConfig: (newConfig) => {
|
||||
config.setPartial(`plugins.${id}`, newConfig, allPlugins[id].config);
|
||||
setConfig: async (newConfig) => {
|
||||
config.setPartial(
|
||||
`plugins.${id}`,
|
||||
newConfig,
|
||||
(await allPlugins())[id].config,
|
||||
);
|
||||
},
|
||||
window: win,
|
||||
refresh: async () => {
|
||||
await setApplicationMenu(win);
|
||||
|
||||
if (config.plugins.isEnabled('in-app-menu')) {
|
||||
if (await config.plugins.isEnabled('in-app-menu')) {
|
||||
win.webContents.send('refresh-in-app-menu');
|
||||
}
|
||||
},
|
||||
@ -37,7 +41,7 @@ const createContext = (
|
||||
|
||||
export const forceLoadMenuPlugin = async (id: string, win: BrowserWindow) => {
|
||||
try {
|
||||
const plugin = allPlugins[id];
|
||||
const plugin = (await allPlugins())[id];
|
||||
if (!plugin) return;
|
||||
|
||||
const menu = plugin.menu?.(createContext(id, win));
|
||||
@ -68,7 +72,7 @@ export const forceLoadMenuPlugin = async (id: string, win: BrowserWindow) => {
|
||||
export const loadAllMenuPlugins = async (win: BrowserWindow) => {
|
||||
const pluginConfigs = config.plugins.getPlugins();
|
||||
|
||||
for (const [pluginId, pluginDef] of Object.entries(allPlugins)) {
|
||||
for (const [pluginId, pluginDef] of Object.entries(await allPlugins())) {
|
||||
const config = deepmerge(
|
||||
pluginDef.config ?? { enabled: false },
|
||||
pluginConfigs[pluginId] ?? {},
|
||||
|
||||
@ -15,13 +15,17 @@ const loadedPluginMap: Record<
|
||||
PluginDef<unknown, unknown, unknown>
|
||||
> = {};
|
||||
const createContext = (id: string): PreloadContext<PluginConfig> => ({
|
||||
getConfig: () =>
|
||||
getConfig: async () =>
|
||||
deepmerge(
|
||||
allPlugins[id].config ?? { enabled: false },
|
||||
(await allPlugins())[id].config ?? { enabled: false },
|
||||
config.get(`plugins.${id}`) ?? {},
|
||||
) as PluginConfig,
|
||||
setConfig: (newConfig) => {
|
||||
config.setPartial(`plugins.${id}`, newConfig, allPlugins[id].config);
|
||||
setConfig: async (newConfig) => {
|
||||
config.setPartial(
|
||||
`plugins.${id}`,
|
||||
newConfig,
|
||||
(await allPlugins())[id].config,
|
||||
);
|
||||
},
|
||||
});
|
||||
|
||||
@ -48,7 +52,7 @@ export const forceUnloadPreloadPlugin = async (id: string) => {
|
||||
|
||||
export const forceLoadPreloadPlugin = async (id: string) => {
|
||||
try {
|
||||
const plugin = preloadPlugins[id];
|
||||
const plugin = (await preloadPlugins())[id];
|
||||
if (!plugin) return;
|
||||
|
||||
const hasStarted = await startPlugin(id, plugin, {
|
||||
@ -78,10 +82,10 @@ export const forceLoadPreloadPlugin = async (id: string) => {
|
||||
}
|
||||
};
|
||||
|
||||
export const loadAllPreloadPlugins = () => {
|
||||
export const loadAllPreloadPlugins = async () => {
|
||||
const pluginConfigs = config.plugins.getPlugins();
|
||||
|
||||
for (const [pluginId, pluginDef] of Object.entries(preloadPlugins)) {
|
||||
for (const [pluginId, pluginDef] of Object.entries(await preloadPlugins())) {
|
||||
const config = deepmerge(
|
||||
pluginDef.config ?? { enable: false },
|
||||
pluginConfigs[pluginId] ?? {},
|
||||
|
||||
@ -18,7 +18,7 @@ const loadedPluginMap: Record<
|
||||
export const createContext = <Config extends PluginConfig>(
|
||||
id: string,
|
||||
): RendererContext<Config> => ({
|
||||
getConfig: async () =>
|
||||
getConfig: () =>
|
||||
window.ipcRenderer.invoke('ytmd:get-config', id) as Promise<Config>,
|
||||
setConfig: async (newConfig) => {
|
||||
await window.ipcRenderer.invoke('ytmd:set-config', id, newConfig);
|
||||
@ -47,7 +47,7 @@ export const forceUnloadRendererPlugin = async (id: string) => {
|
||||
delete unregisterStyleMap[id];
|
||||
delete loadedPluginMap[id];
|
||||
|
||||
const plugin = rendererPlugins[id];
|
||||
const plugin = (await rendererPlugins())[id];
|
||||
if (!plugin) return;
|
||||
|
||||
const hasStopped = await stopPlugin(id, plugin, {
|
||||
@ -71,7 +71,7 @@ export const forceUnloadRendererPlugin = async (id: string) => {
|
||||
};
|
||||
|
||||
export const forceLoadRendererPlugin = async (id: string) => {
|
||||
const plugin = rendererPlugins[id];
|
||||
const plugin = (await rendererPlugins())[id];
|
||||
if (!plugin) return;
|
||||
|
||||
const hasEvaled = await startPlugin(id, plugin, {
|
||||
@ -117,7 +117,7 @@ export const forceLoadRendererPlugin = async (id: string) => {
|
||||
export const loadAllRendererPlugins = async () => {
|
||||
const pluginConfigs = window.mainConfig.plugins.getPlugins();
|
||||
|
||||
for (const [pluginId, pluginDef] of Object.entries(rendererPlugins)) {
|
||||
for (const [pluginId, pluginDef] of Object.entries(await rendererPlugins())) {
|
||||
const config = deepmerge(pluginDef.config, pluginConfigs[pluginId] ?? {});
|
||||
|
||||
if (config.enabled) {
|
||||
|
||||
81
src/menu.ts
81
src/menu.ts
@ -29,21 +29,21 @@ import packageJson from '../package.json';
|
||||
export type MenuTemplate = Electron.MenuItemConstructorOptions[];
|
||||
|
||||
// True only if in-app-menu was loaded on launch
|
||||
const inAppMenuActive = config.plugins.isEnabled('in-app-menu');
|
||||
const inAppMenuActive = await config.plugins.isEnabled('in-app-menu');
|
||||
|
||||
const pluginEnabledMenu = (
|
||||
const pluginEnabledMenu = async (
|
||||
plugin: string,
|
||||
label = '',
|
||||
description: string | undefined = undefined,
|
||||
isNew = false,
|
||||
hasSubmenu = false,
|
||||
refreshMenu: (() => void) | undefined = undefined,
|
||||
): Electron.MenuItemConstructorOptions => ({
|
||||
): Promise<Electron.MenuItemConstructorOptions> => ({
|
||||
label: label || plugin,
|
||||
sublabel: isNew ? t('main.menu.plugins.new') : undefined,
|
||||
toolTip: description,
|
||||
type: 'checkbox',
|
||||
checked: config.plugins.isEnabled(plugin),
|
||||
checked: await config.plugins.isEnabled(plugin),
|
||||
click(item: Electron.MenuItem) {
|
||||
if (item.checked) {
|
||||
config.plugins.enable(plugin);
|
||||
@ -71,19 +71,21 @@ export const mainMenuTemplate = async (
|
||||
const { navigationHistory } = win.webContents;
|
||||
await loadAllMenuPlugins(win);
|
||||
|
||||
const menuResult = Object.entries(getAllMenuTemplate()).map(
|
||||
([id, template]) => {
|
||||
const plugin = allPlugins[id];
|
||||
const allPluginsStubs = await allPlugins();
|
||||
|
||||
const menuResult = await Promise.all(
|
||||
Object.entries(getAllMenuTemplate()).map(async ([id, template]) => {
|
||||
const plugin = allPluginsStubs[id];
|
||||
const pluginLabel = plugin?.name?.() ?? id;
|
||||
const pluginDescription = plugin?.description?.() ?? undefined;
|
||||
const isNew = plugin?.addedVersion
|
||||
? satisfies(packageJson.version, plugin.addedVersion)
|
||||
: false;
|
||||
|
||||
if (!config.plugins.isEnabled(id)) {
|
||||
if (!(await config.plugins.isEnabled(id))) {
|
||||
return [
|
||||
id,
|
||||
pluginEnabledMenu(
|
||||
await pluginEnabledMenu(
|
||||
id,
|
||||
pluginLabel,
|
||||
pluginDescription,
|
||||
@ -101,7 +103,7 @@ export const mainMenuTemplate = async (
|
||||
sublabel: isNew ? t('main.menu.plugins.new') : undefined,
|
||||
toolTip: pluginDescription,
|
||||
submenu: [
|
||||
pluginEnabledMenu(
|
||||
await pluginEnabledMenu(
|
||||
id,
|
||||
t('main.menu.plugins.enabled'),
|
||||
undefined,
|
||||
@ -114,39 +116,42 @@ export const mainMenuTemplate = async (
|
||||
],
|
||||
} satisfies Electron.MenuItemConstructorOptions,
|
||||
] as const;
|
||||
},
|
||||
}),
|
||||
);
|
||||
|
||||
const availablePlugins = Object.keys(allPlugins);
|
||||
const pluginMenus = availablePlugins
|
||||
.sort((a, b) => {
|
||||
const aPluginLabel = allPlugins[a]?.name?.() ?? a;
|
||||
const bPluginLabel = allPlugins[b]?.name?.() ?? b;
|
||||
const availablePlugins = Object.keys(await allPlugins());
|
||||
const pluginMenus = await Promise.all(
|
||||
availablePlugins
|
||||
.sort((a, b) => {
|
||||
const aPluginLabel = allPluginsStubs[a]?.name?.() ?? a;
|
||||
const bPluginLabel = allPluginsStubs[b]?.name?.() ?? b;
|
||||
|
||||
return aPluginLabel.localeCompare(bPluginLabel);
|
||||
})
|
||||
.map((id) => {
|
||||
const predefinedTemplate = menuResult.find((it) => it[0] === id);
|
||||
if (predefinedTemplate) return predefinedTemplate[1];
|
||||
return aPluginLabel.localeCompare(bPluginLabel);
|
||||
})
|
||||
.map((id) => {
|
||||
const predefinedTemplate = menuResult.find((it) => it[0] === id);
|
||||
if (predefinedTemplate) return predefinedTemplate[1];
|
||||
|
||||
const plugin = allPlugins[id];
|
||||
const pluginLabel = plugin?.name?.() ?? id;
|
||||
const pluginDescription = plugin?.description?.() ?? undefined;
|
||||
const isNew = plugin?.addedVersion
|
||||
? satisfies(packageJson.version, plugin.addedVersion)
|
||||
: false;
|
||||
const plugin = allPluginsStubs[id];
|
||||
const pluginLabel = plugin?.name?.() ?? id;
|
||||
const pluginDescription = plugin?.description?.() ?? undefined;
|
||||
const isNew = plugin?.addedVersion
|
||||
? satisfies(packageJson.version, plugin.addedVersion)
|
||||
: false;
|
||||
|
||||
return pluginEnabledMenu(
|
||||
id,
|
||||
pluginLabel,
|
||||
pluginDescription,
|
||||
isNew,
|
||||
true,
|
||||
innerRefreshMenu,
|
||||
);
|
||||
});
|
||||
return pluginEnabledMenu(
|
||||
id,
|
||||
pluginLabel,
|
||||
pluginDescription,
|
||||
isNew,
|
||||
true,
|
||||
innerRefreshMenu,
|
||||
);
|
||||
}),
|
||||
);
|
||||
|
||||
const availableLanguages = Object.keys(languageResources);
|
||||
const langResources = await languageResources();
|
||||
const availableLanguages = Object.keys(langResources);
|
||||
|
||||
return [
|
||||
{
|
||||
@ -445,7 +450,7 @@ export const mainMenuTemplate = async (
|
||||
availableLanguages
|
||||
.map(
|
||||
(lang): Electron.MenuItemConstructorOptions => ({
|
||||
label: `${languageResources[lang].translation.language?.name ?? 'Unknown'} (${languageResources[lang].translation.language?.['local-name'] ?? 'Unknown'})`,
|
||||
label: `${langResources[lang].translation.language?.name ?? 'Unknown'} (${langResources[lang].translation.language?.['local-name'] ?? 'Unknown'})`,
|
||||
type: 'checkbox',
|
||||
checked: (config.get('options.language') ?? 'en') === lang,
|
||||
click() {
|
||||
|
||||
@ -76,7 +76,7 @@ export default createPlugin({
|
||||
async onPlayerApiReady(_, { getConfig }) {
|
||||
const config = await getConfig();
|
||||
if (config.blocker === blockers.AdSpeedup) {
|
||||
await loadAdSpeedup();
|
||||
loadAdSpeedup();
|
||||
}
|
||||
},
|
||||
},
|
||||
|
||||
@ -1,12 +1,17 @@
|
||||
import { render } from 'solid-js/web';
|
||||
|
||||
import { createSignal, Show } from 'solid-js';
|
||||
|
||||
import { t } from '@/i18n';
|
||||
import { createPlugin } from '@/utils';
|
||||
import { ElementFromHtml } from '@/plugins/utils/renderer';
|
||||
import { waitForElement } from '@/utils/wait-for-element';
|
||||
|
||||
import undislikeHTML from './templates/undislike.html?raw';
|
||||
import dislikeHTML from './templates/dislike.html?raw';
|
||||
import likeHTML from './templates/like.html?raw';
|
||||
import unlikeHTML from './templates/unlike.html?raw';
|
||||
import {
|
||||
DislikeButton,
|
||||
LikeButton,
|
||||
UnDislikeButton,
|
||||
UnLikeButton,
|
||||
} from './templates';
|
||||
|
||||
export default createPlugin<
|
||||
unknown,
|
||||
@ -52,19 +57,69 @@ export default createPlugin<
|
||||
}
|
||||
const continuations = await waitForElement<HTMLElement>('#continuations');
|
||||
this.waiting = false;
|
||||
//Gets the for buttons
|
||||
const buttons: Array<HTMLElement> = [
|
||||
ElementFromHtml(undislikeHTML),
|
||||
ElementFromHtml(dislikeHTML),
|
||||
ElementFromHtml(likeHTML),
|
||||
ElementFromHtml(unlikeHTML),
|
||||
];
|
||||
|
||||
const [showUnDislike, setShowUnDislike] = createSignal(true);
|
||||
const [showDislike, setShowDislike] = createSignal(true);
|
||||
const [showLike, setShowLike] = createSignal(true);
|
||||
const [showUnLike, setShowUnLike] = createSignal(true);
|
||||
|
||||
const DEFAULT_MASK_SIZE = '100% 50%';
|
||||
const [unDislikeMaskSize, setUnDislikeMaskSize] =
|
||||
createSignal(DEFAULT_MASK_SIZE);
|
||||
const [dislikeMaskSize, setDislikeMaskSize] =
|
||||
createSignal(DEFAULT_MASK_SIZE);
|
||||
const [likeMaskSize, setLikeMaskSize] = createSignal(DEFAULT_MASK_SIZE);
|
||||
const [unLikeMaskSize, setUnLikeMaskSize] =
|
||||
createSignal(DEFAULT_MASK_SIZE);
|
||||
|
||||
const buttonContainer = document.createElement('div');
|
||||
buttonContainer.style.display = 'flex';
|
||||
buttonContainer.style.flexDirection = 'row';
|
||||
|
||||
render(
|
||||
() => (
|
||||
<>
|
||||
<Show when={showUnDislike()}>
|
||||
<UnDislikeButton
|
||||
onClick={this.loadFullList}
|
||||
maskSize={unDislikeMaskSize()}
|
||||
/>
|
||||
</Show>
|
||||
<Show when={showDislike()}>
|
||||
<DislikeButton
|
||||
onClick={this.loadFullList}
|
||||
maskSize={dislikeMaskSize()}
|
||||
/>
|
||||
</Show>
|
||||
<Show when={showLike()}>
|
||||
<LikeButton
|
||||
onClick={this.loadFullList}
|
||||
maskSize={likeMaskSize()}
|
||||
/>
|
||||
</Show>
|
||||
<Show when={showUnLike()}>
|
||||
<UnLikeButton
|
||||
onClick={this.loadFullList}
|
||||
maskSize={unLikeMaskSize()}
|
||||
/>
|
||||
</Show>
|
||||
</>
|
||||
),
|
||||
buttonContainer,
|
||||
);
|
||||
|
||||
//Finds the playlist
|
||||
const playlist =
|
||||
document.querySelector('ytmusic-shelf-renderer') ??
|
||||
document.querySelector('ytmusic-playlist-shelf-renderer')!;
|
||||
document.querySelector('ytmusic-playlist-shelf-renderer') ??
|
||||
document.querySelector(':nth-last-child(1 of ytmusic-shelf-renderer)');
|
||||
|
||||
if (!playlist) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Adds an observer for every button, so it gets updated when one is clicked
|
||||
this.changeObserver?.disconnect();
|
||||
|
||||
this.changeObserver = new MutationObserver(() => {
|
||||
this.stop();
|
||||
this.start();
|
||||
@ -84,34 +139,57 @@ export default createPlugin<
|
||||
'#button-shape-dislike > button',
|
||||
).length;
|
||||
if (continuations.children.length == 0 && listsLength > 0) {
|
||||
const counts = [
|
||||
playlist?.querySelectorAll(
|
||||
'#button-shape-dislike[aria-pressed=true] > button',
|
||||
const counts = {
|
||||
dislike: playlist?.querySelectorAll(
|
||||
'#button-shape-dislike > button[aria-pressed=true]',
|
||||
).length,
|
||||
playlist?.querySelectorAll(
|
||||
'#button-shape-dislike[aria-pressed=false] > button',
|
||||
undislike: playlist?.querySelectorAll(
|
||||
'#button-shape-dislike > button[aria-pressed=false]',
|
||||
).length,
|
||||
playlist?.querySelectorAll(
|
||||
'#button-shape-like[aria-pressed=false] > button',
|
||||
unlike: playlist?.querySelectorAll(
|
||||
'#button-shape-like > button[aria-pressed=false]',
|
||||
).length,
|
||||
playlist?.querySelectorAll(
|
||||
'#button-shape-like[aria-pressed=true] > button',
|
||||
like: playlist?.querySelectorAll(
|
||||
'#button-shape-like > button[aria-pressed=true]',
|
||||
).length,
|
||||
];
|
||||
let i = 0;
|
||||
for (const count of counts) {
|
||||
if (count == 0) {
|
||||
buttons.splice(i, 1);
|
||||
i--;
|
||||
} else {
|
||||
(
|
||||
buttons[i].children[0].children[0] as HTMLElement
|
||||
).style.setProperty(
|
||||
'-webkit-mask-size',
|
||||
`100% ${100 - (count / listsLength) * 100}%`,
|
||||
);
|
||||
};
|
||||
for (const [name, size] of Object.entries(counts)) {
|
||||
switch (name) {
|
||||
case 'dislike':
|
||||
if (size > 0) {
|
||||
setShowDislike(true);
|
||||
setDislikeMaskSize(`100% ${100 - (size / listsLength) * 100}%`);
|
||||
} else {
|
||||
setShowDislike(false);
|
||||
}
|
||||
break;
|
||||
case 'undislike':
|
||||
if (size > 0) {
|
||||
setShowUnDislike(true);
|
||||
setUnDislikeMaskSize(
|
||||
`100% ${100 - (size / listsLength) * 100}%`,
|
||||
);
|
||||
} else {
|
||||
setShowUnDislike(false);
|
||||
}
|
||||
break;
|
||||
case 'like':
|
||||
if (size > 0) {
|
||||
setShowLike(true);
|
||||
setLikeMaskSize(`100% ${100 - (size / listsLength) * 100}%`);
|
||||
} else {
|
||||
setShowLike(false);
|
||||
}
|
||||
break;
|
||||
case 'unlike':
|
||||
if (size > 0) {
|
||||
setShowUnLike(true);
|
||||
setUnLikeMaskSize(`100% ${100 - (size / listsLength) * 100}%`);
|
||||
} else {
|
||||
setShowUnLike(false);
|
||||
}
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
const menuParent =
|
||||
@ -126,10 +204,7 @@ export default createPlugin<
|
||||
menu,
|
||||
menuParent.children[menuParent.children.length - 1],
|
||||
);
|
||||
for (const button of buttons) {
|
||||
menu.appendChild(button);
|
||||
button.addEventListener('click', this.loadFullList);
|
||||
}
|
||||
menu.appendChild(buttonContainer);
|
||||
}
|
||||
},
|
||||
loadFullList(event: MouseEvent) {
|
||||
@ -157,28 +232,28 @@ export default createPlugin<
|
||||
if (loader.children.length != 0) return;
|
||||
this.loadObserver?.disconnect();
|
||||
let playlistButtons: NodeListOf<HTMLElement> | undefined;
|
||||
const playlist = document.querySelector('ytmusic-shelf-renderer')
|
||||
? document.querySelector('ytmusic-shelf-renderer')
|
||||
: document.querySelector('ytmusic-playlist-shelf-renderer');
|
||||
const playlist =
|
||||
document.querySelector('ytmusic-playlist-shelf-renderer') ??
|
||||
document.querySelector(':nth-last-child(1 of ytmusic-shelf-renderer)');
|
||||
switch (id) {
|
||||
case 'allundislike':
|
||||
playlistButtons = playlist?.querySelectorAll(
|
||||
'#button-shape-dislike[aria-pressed=true] > button',
|
||||
'#button-shape-dislike > button[aria-pressed=true]',
|
||||
);
|
||||
break;
|
||||
case 'alldislike':
|
||||
playlistButtons = playlist?.querySelectorAll(
|
||||
'#button-shape-dislike[aria-pressed=false] > button',
|
||||
'#button-shape-dislike > button[aria-pressed=false]',
|
||||
);
|
||||
break;
|
||||
case 'alllike':
|
||||
playlistButtons = playlist?.querySelectorAll(
|
||||
'#button-shape-like[aria-pressed=false] > button',
|
||||
'#button-shape-like > button[aria-pressed=false]',
|
||||
);
|
||||
break;
|
||||
case 'allunlike':
|
||||
playlistButtons = playlist?.querySelectorAll(
|
||||
'#button-shape-like[aria-pressed=true] > button',
|
||||
'#button-shape-like > button[aria-pressed=true]',
|
||||
);
|
||||
break;
|
||||
default:
|
||||
99
src/plugins/album-actions/templates/dislike-button.tsx
Normal file
99
src/plugins/album-actions/templates/dislike-button.tsx
Normal file
@ -0,0 +1,99 @@
|
||||
export interface DislikeButtonProps {
|
||||
onClick?: (e: MouseEvent) => void;
|
||||
maskSize: string;
|
||||
}
|
||||
|
||||
export const DislikeButton = (props: DislikeButtonProps) => (
|
||||
<div class="style-scope">
|
||||
<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"
|
||||
onClick={(e) => props.onClick?.(e)}
|
||||
>
|
||||
<div
|
||||
class="yt-spec-button-shape-next__icon"
|
||||
style={{
|
||||
'color': 'var(--ytmusic-setting-item-toggle-active)',
|
||||
}}
|
||||
aria-hidden="true"
|
||||
>
|
||||
<div
|
||||
class="yt-spec-button-shape-next__icon"
|
||||
style={{
|
||||
'color': 'white',
|
||||
'mask': 'linear-gradient(grey, grey)',
|
||||
'-webkit-mask': 'linear-gradient(grey, grey)',
|
||||
'-webkit-mask-size': props.maskSize,
|
||||
'-webkit-mask-repeat': 'no-repeat',
|
||||
'z-index': 1,
|
||||
'position': 'absolute',
|
||||
}}
|
||||
aria-hidden="true"
|
||||
>
|
||||
<div style={{ 'width': '24px', 'height': '24px' }}>
|
||||
<svg
|
||||
viewBox="0 0 24 24"
|
||||
preserveAspectRatio="xMidYMid meet"
|
||||
class="style-scope yt-icon"
|
||||
style={{
|
||||
'pointer-events': 'none',
|
||||
'display': 'block',
|
||||
'width': '100%',
|
||||
'height': '100%',
|
||||
}}
|
||||
>
|
||||
<g class="style-scope yt-icon">
|
||||
<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"
|
||||
/>
|
||||
</g>
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
style={{
|
||||
width: '24px',
|
||||
height: '24px',
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
viewBox="0 0 24 24"
|
||||
preserveAspectRatio="xMidYMid meet"
|
||||
class="style-scope yt-icon"
|
||||
style={{
|
||||
'pointer-events': 'none',
|
||||
'display': 'block',
|
||||
'width': '100%',
|
||||
'height': '100%',
|
||||
}}
|
||||
>
|
||||
<g class="style-scope yt-icon">
|
||||
<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"
|
||||
/>
|
||||
</g>
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
<yt-touch-feedback-shape
|
||||
style={{
|
||||
'border-radius': 'inherit',
|
||||
}}
|
||||
>
|
||||
<div
|
||||
class="yt-spec-touch-feedback-shape yt-spec-touch-feedback-shape--touch-response"
|
||||
aria-hidden="true"
|
||||
>
|
||||
<div class="yt-spec-touch-feedback-shape__stroke" />
|
||||
<div class="yt-spec-touch-feedback-shape__fill" />
|
||||
</div>
|
||||
</yt-touch-feedback-shape>
|
||||
</button>
|
||||
</div>
|
||||
);
|
||||
@ -1,76 +0,0 @@
|
||||
<div class="style-scope">
|
||||
<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"
|
||||
>
|
||||
<div
|
||||
class="yt-spec-button-shape-next__icon"
|
||||
style="color: var(--ytmusic-setting-item-toggle-active)"
|
||||
aria-hidden="true"
|
||||
>
|
||||
<div
|
||||
class="yt-spec-button-shape-next__icon"
|
||||
style="
|
||||
color: white;
|
||||
-webkit-mask: linear-gradient(grey, grey);
|
||||
-webkit-mask-size: 100% 50%;
|
||||
-webkit-mask-repeat: no-repeat;
|
||||
z-index: 1;
|
||||
position: absolute;
|
||||
"
|
||||
aria-hidden="true"
|
||||
>
|
||||
<div style="width: 24px; height: 24px">
|
||||
<svg
|
||||
viewBox="0 0 24 24"
|
||||
preserveAspectRatio="xMidYMid meet"
|
||||
focusable="false"
|
||||
class="style-scope yt-icon"
|
||||
style="
|
||||
pointer-events: none;
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
"
|
||||
>
|
||||
<g class="style-scope yt-icon">
|
||||
<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"
|
||||
></path>
|
||||
</g>
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
<div style="width: 24px; height: 24px">
|
||||
<svg
|
||||
viewBox="0 0 24 24"
|
||||
preserveAspectRatio="xMidYMid meet"
|
||||
focusable="false"
|
||||
class="style-scope yt-icon"
|
||||
style="pointer-events: none; display: block; width: 100%; height: 100%"
|
||||
>
|
||||
<g class="style-scope yt-icon">
|
||||
<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"
|
||||
></path>
|
||||
</g>
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
<yt-touch-feedback-shape style="border-radius: inherit">
|
||||
<div
|
||||
class="yt-spec-touch-feedback-shape yt-spec-touch-feedback-shape--touch-response"
|
||||
aria-hidden="true"
|
||||
>
|
||||
<div class="yt-spec-touch-feedback-shape__stroke"></div>
|
||||
<div class="yt-spec-touch-feedback-shape__fill"></div>
|
||||
</div>
|
||||
</yt-touch-feedback-shape>
|
||||
</button>
|
||||
</div>
|
||||
4
src/plugins/album-actions/templates/index.ts
Normal file
4
src/plugins/album-actions/templates/index.ts
Normal file
@ -0,0 +1,4 @@
|
||||
export * from './like-button';
|
||||
export * from './dislike-button';
|
||||
export * from './undislike-button';
|
||||
export * from './unlike-button';
|
||||
90
src/plugins/album-actions/templates/like-button.tsx
Normal file
90
src/plugins/album-actions/templates/like-button.tsx
Normal file
@ -0,0 +1,90 @@
|
||||
export interface LikeButtonProps {
|
||||
onClick?: (e: MouseEvent) => void;
|
||||
maskSize: string;
|
||||
}
|
||||
|
||||
export const LikeButton = (props: LikeButtonProps) => (
|
||||
<div class="style-scope">
|
||||
<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"
|
||||
onClick={(e) => props.onClick?.(e)}
|
||||
>
|
||||
<div
|
||||
class="yt-spec-button-shape-next__icon"
|
||||
style={{
|
||||
'color': 'var(--ytmusic-setting-item-toggle-active)',
|
||||
}}
|
||||
aria-hidden="true"
|
||||
>
|
||||
<div
|
||||
class="yt-spec-button-shape-next__icon"
|
||||
style={{
|
||||
'color': 'white',
|
||||
'mask': 'linear-gradient(grey, grey)',
|
||||
'-webkit-mask': 'linear-gradient(grey, grey)',
|
||||
'-webkit-mask-size': props.maskSize,
|
||||
'-webkit-mask-repeat': 'no-repeat',
|
||||
'z-index': 1,
|
||||
'position': 'absolute',
|
||||
}}
|
||||
aria-hidden="true"
|
||||
>
|
||||
<div style={{ 'width': '24px', 'height': '24px' }}>
|
||||
<svg
|
||||
viewBox="0 0 24 24"
|
||||
preserveAspectRatio="xMidYMid meet"
|
||||
class="style-scope yt-icon"
|
||||
style={{
|
||||
'pointer-events': 'none',
|
||||
'display': 'block',
|
||||
'width': '100%',
|
||||
'height': '100%',
|
||||
}}
|
||||
>
|
||||
<g class="style-scope yt-icon">
|
||||
<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"
|
||||
/>
|
||||
</g>
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
<div style={{ 'width': '24px', 'height': '24px' }}>
|
||||
<svg
|
||||
viewBox="0 0 24 24"
|
||||
preserveAspectRatio="xMidYMid meet"
|
||||
class="style-scope yt-icon"
|
||||
style={{
|
||||
'pointer-events': 'none',
|
||||
'display': 'block',
|
||||
'width': '100%',
|
||||
'height': '100%',
|
||||
}}
|
||||
>
|
||||
<g class="style-scope yt-icon">
|
||||
<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"
|
||||
/>
|
||||
</g>
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
<yt-touch-feedback-shape style={{ 'border-radius': 'inherit' }}>
|
||||
<div
|
||||
class="yt-spec-touch-feedback-shape yt-spec-touch-feedback-shape--touch-response"
|
||||
aria-hidden="true"
|
||||
>
|
||||
<div class="yt-spec-touch-feedback-shape__stroke" />
|
||||
<div class="yt-spec-touch-feedback-shape__fill" />
|
||||
</div>
|
||||
</yt-touch-feedback-shape>
|
||||
</button>
|
||||
</div>
|
||||
);
|
||||
@ -1,76 +0,0 @@
|
||||
<div class="style-scope">
|
||||
<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"
|
||||
>
|
||||
<div
|
||||
class="yt-spec-button-shape-next__icon"
|
||||
style="color: var(--ytmusic-setting-item-toggle-active)"
|
||||
aria-hidden="true"
|
||||
>
|
||||
<div
|
||||
class="yt-spec-button-shape-next__icon"
|
||||
style="
|
||||
color: white;
|
||||
-webkit-mask: linear-gradient(grey, grey);
|
||||
-webkit-mask-size: 100% 50%;
|
||||
-webkit-mask-repeat: no-repeat;
|
||||
z-index: 1;
|
||||
position: absolute;
|
||||
"
|
||||
aria-hidden="true"
|
||||
>
|
||||
<div style="width: 24px; height: 24px">
|
||||
<svg
|
||||
viewBox="0 0 24 24"
|
||||
preserveAspectRatio="xMidYMid meet"
|
||||
focusable="false"
|
||||
class="style-scope yt-icon"
|
||||
style="
|
||||
pointer-events: none;
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
"
|
||||
>
|
||||
<g class="style-scope yt-icon">
|
||||
<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"
|
||||
></path>
|
||||
</g>
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
<div style="width: 24px; height: 24px">
|
||||
<svg
|
||||
viewBox="0 0 24 24"
|
||||
preserveAspectRatio="xMidYMid meet"
|
||||
focusable="false"
|
||||
class="style-scope yt-icon"
|
||||
style="pointer-events: none; display: block; width: 100%; height: 100%"
|
||||
>
|
||||
<g class="style-scope yt-icon">
|
||||
<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"
|
||||
></path>
|
||||
</g>
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
<yt-touch-feedback-shape style="border-radius: inherit">
|
||||
<div
|
||||
class="yt-spec-touch-feedback-shape yt-spec-touch-feedback-shape--touch-response"
|
||||
aria-hidden="true"
|
||||
>
|
||||
<div class="yt-spec-touch-feedback-shape__stroke"></div>
|
||||
<div class="yt-spec-touch-feedback-shape__fill"></div>
|
||||
</div>
|
||||
</yt-touch-feedback-shape>
|
||||
</button>
|
||||
</div>
|
||||
104
src/plugins/album-actions/templates/undislike-button.tsx
Normal file
104
src/plugins/album-actions/templates/undislike-button.tsx
Normal file
@ -0,0 +1,104 @@
|
||||
export interface UnDislikeButtonProps {
|
||||
onClick?: (e: MouseEvent) => void;
|
||||
maskSize: string;
|
||||
}
|
||||
|
||||
export const UnDislikeButton = (props: UnDislikeButtonProps) => (
|
||||
<div class="style-scope">
|
||||
<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"
|
||||
onClick={(e) => props.onClick?.(e)}
|
||||
>
|
||||
<div
|
||||
class="yt-spec-button-shape-next__icon"
|
||||
style={{
|
||||
color: 'var(--ytmusic-setting-item-toggle-active)',
|
||||
}}
|
||||
aria-hidden="true"
|
||||
>
|
||||
<div
|
||||
class="yt-spec-button-shape-next__icon"
|
||||
style={{
|
||||
'color': 'white',
|
||||
'mask': 'linear-gradient(grey, grey)',
|
||||
'-webkit-mask': 'linear-gradient(grey, grey)',
|
||||
'-webkit-mask-size': props.maskSize,
|
||||
'-webkit-mask-repeat': 'no-repeat',
|
||||
'z-index': 1,
|
||||
'position': 'absolute',
|
||||
}}
|
||||
aria-hidden="true"
|
||||
>
|
||||
<div
|
||||
style={{
|
||||
width: '24px',
|
||||
height: '24px',
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
viewBox="0 0 24 24"
|
||||
preserveAspectRatio="xMidYMid meet"
|
||||
class="style-scope yt-icon"
|
||||
style={{
|
||||
'pointer-events': 'none',
|
||||
'display': 'block',
|
||||
'width': '100%',
|
||||
'height': '100%',
|
||||
}}
|
||||
>
|
||||
<g class="style-scope yt-icon">
|
||||
<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"
|
||||
/>
|
||||
</g>
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
style={{
|
||||
width: '24px',
|
||||
height: '24px',
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
viewBox="0 0 24 24"
|
||||
preserveAspectRatio="xMidYMid meet"
|
||||
class="style-scope yt-icon"
|
||||
style={{
|
||||
'pointer-events': 'none',
|
||||
'display': 'block',
|
||||
'width': '100%',
|
||||
'height': '100%',
|
||||
}}
|
||||
>
|
||||
<g class="style-scope yt-icon">
|
||||
<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"
|
||||
/>
|
||||
</g>
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
<yt-touch-feedback-shape
|
||||
style={{
|
||||
'border-radius': 'inherit',
|
||||
}}
|
||||
>
|
||||
<div
|
||||
class="yt-spec-touch-feedback-shape yt-spec-touch-feedback-shape--touch-response"
|
||||
aria-hidden="true"
|
||||
>
|
||||
<div class="yt-spec-touch-feedback-shape__stroke" />
|
||||
<div class="yt-spec-touch-feedback-shape__fill" />
|
||||
</div>
|
||||
</yt-touch-feedback-shape>
|
||||
</button>
|
||||
</div>
|
||||
);
|
||||
@ -1,76 +0,0 @@
|
||||
<div class="style-scope">
|
||||
<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"
|
||||
>
|
||||
<div
|
||||
class="yt-spec-button-shape-next__icon"
|
||||
style="color: var(--ytmusic-setting-item-toggle-active)"
|
||||
aria-hidden="true"
|
||||
>
|
||||
<div
|
||||
class="yt-spec-button-shape-next__icon"
|
||||
style="
|
||||
color: white;
|
||||
-webkit-mask: linear-gradient(grey, grey);
|
||||
-webkit-mask-size: 100% 50%;
|
||||
-webkit-mask-repeat: no-repeat;
|
||||
z-index: 1;
|
||||
position: absolute;
|
||||
"
|
||||
aria-hidden="true"
|
||||
>
|
||||
<div style="width: 24px; height: 24px">
|
||||
<svg
|
||||
viewBox="0 0 24 24"
|
||||
preserveAspectRatio="xMidYMid meet"
|
||||
focusable="false"
|
||||
class="style-scope yt-icon"
|
||||
style="
|
||||
pointer-events: none;
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
"
|
||||
>
|
||||
<g class="style-scope yt-icon">
|
||||
<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"
|
||||
></path>
|
||||
</g>
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
<div style="width: 24px; height: 24px">
|
||||
<svg
|
||||
viewBox="0 0 24 24"
|
||||
preserveAspectRatio="xMidYMid meet"
|
||||
focusable="false"
|
||||
class="style-scope yt-icon"
|
||||
style="pointer-events: none; display: block; width: 100%; height: 100%"
|
||||
>
|
||||
<g class="style-scope yt-icon">
|
||||
<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"
|
||||
></path>
|
||||
</g>
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
<yt-touch-feedback-shape style="border-radius: inherit">
|
||||
<div
|
||||
class="yt-spec-touch-feedback-shape yt-spec-touch-feedback-shape--touch-response"
|
||||
aria-hidden="true"
|
||||
>
|
||||
<div class="yt-spec-touch-feedback-shape__stroke"></div>
|
||||
<div class="yt-spec-touch-feedback-shape__fill"></div>
|
||||
</div>
|
||||
</yt-touch-feedback-shape>
|
||||
</button>
|
||||
</div>
|
||||
104
src/plugins/album-actions/templates/unlike-button.tsx
Normal file
104
src/plugins/album-actions/templates/unlike-button.tsx
Normal file
@ -0,0 +1,104 @@
|
||||
export interface UnLikeButtonProps {
|
||||
onClick?: (e: MouseEvent) => void;
|
||||
maskSize: string;
|
||||
}
|
||||
|
||||
export const UnLikeButton = (props: UnLikeButtonProps) => (
|
||||
<div class="style-scope">
|
||||
<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"
|
||||
onClick={(e) => props.onClick?.(e)}
|
||||
>
|
||||
<div
|
||||
class="yt-spec-button-shape-next__icon"
|
||||
style={{
|
||||
'color': 'var(--ytmusic-setting-item-toggle-active)',
|
||||
}}
|
||||
aria-hidden="true"
|
||||
>
|
||||
<div
|
||||
class="yt-spec-button-shape-next__icon"
|
||||
style={{
|
||||
'color': 'white',
|
||||
'mask': 'linear-gradient(grey, grey)',
|
||||
'-webkit-mask': 'linear-gradient(grey, grey)',
|
||||
'-webkit-mask-size': props.maskSize,
|
||||
'-webkit-mask-repeat': 'no-repeat',
|
||||
'z-index': 1,
|
||||
'position': 'absolute',
|
||||
}}
|
||||
aria-hidden="true"
|
||||
>
|
||||
<div
|
||||
style={{
|
||||
width: '24px',
|
||||
height: '24px',
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
viewBox="0 0 24 24"
|
||||
preserveAspectRatio="xMidYMid meet"
|
||||
class="style-scope yt-icon"
|
||||
style={{
|
||||
'pointer-events': 'none',
|
||||
'display': 'block',
|
||||
'width': '100%',
|
||||
'height': '100%',
|
||||
}}
|
||||
>
|
||||
<g class="style-scope yt-icon">
|
||||
<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"
|
||||
/>
|
||||
</g>
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
style={{
|
||||
width: '24px',
|
||||
height: '24px',
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
viewBox="0 0 24 24"
|
||||
preserveAspectRatio="xMidYMid meet"
|
||||
class="style-scope yt-icon"
|
||||
style={{
|
||||
'pointer-events': 'none',
|
||||
'display': 'block',
|
||||
'width': '100%',
|
||||
'height': '100%',
|
||||
}}
|
||||
>
|
||||
<g class="style-scope yt-icon">
|
||||
<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"
|
||||
/>
|
||||
</g>
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
<yt-touch-feedback-shape
|
||||
style={{
|
||||
'border-radius': 'inherit',
|
||||
}}
|
||||
>
|
||||
<div
|
||||
class="yt-spec-touch-feedback-shape yt-spec-touch-feedback-shape--touch-response"
|
||||
aria-hidden="true"
|
||||
>
|
||||
<div class="yt-spec-touch-feedback-shape__stroke" />
|
||||
<div class="yt-spec-touch-feedback-shape__fill" />
|
||||
</div>
|
||||
</yt-touch-feedback-shape>
|
||||
</button>
|
||||
</div>
|
||||
);
|
||||
@ -1,76 +0,0 @@
|
||||
<div class="style-scope">
|
||||
<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"
|
||||
>
|
||||
<div
|
||||
class="yt-spec-button-shape-next__icon"
|
||||
style="color: var(--ytmusic-setting-item-toggle-active)"
|
||||
aria-hidden="true"
|
||||
>
|
||||
<div
|
||||
class="yt-spec-button-shape-next__icon"
|
||||
style="
|
||||
color: white;
|
||||
-webkit-mask: linear-gradient(grey, grey);
|
||||
-webkit-mask-size: 100% 50%;
|
||||
-webkit-mask-repeat: no-repeat;
|
||||
z-index: 1;
|
||||
position: absolute;
|
||||
"
|
||||
aria-hidden="true"
|
||||
>
|
||||
<div style="width: 24px; height: 24px">
|
||||
<svg
|
||||
viewBox="0 0 24 24"
|
||||
preserveAspectRatio="xMidYMid meet"
|
||||
focusable="false"
|
||||
class="style-scope yt-icon"
|
||||
style="
|
||||
pointer-events: none;
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
"
|
||||
>
|
||||
<g class="style-scope yt-icon">
|
||||
<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"
|
||||
></path>
|
||||
</g>
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
<div style="width: 24px; height: 24px">
|
||||
<svg
|
||||
viewBox="0 0 24 24"
|
||||
preserveAspectRatio="xMidYMid meet"
|
||||
focusable="false"
|
||||
class="style-scope yt-icon"
|
||||
style="pointer-events: none; display: block; width: 100%; height: 100%"
|
||||
>
|
||||
<g class="style-scope yt-icon">
|
||||
<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"
|
||||
></path>
|
||||
</g>
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
<yt-touch-feedback-shape style="border-radius: inherit">
|
||||
<div
|
||||
class="yt-spec-touch-feedback-shape yt-spec-touch-feedback-shape--touch-response"
|
||||
aria-hidden="true"
|
||||
>
|
||||
<div class="yt-spec-touch-feedback-shape__stroke"></div>
|
||||
<div class="yt-spec-touch-feedback-shape__fill"></div>
|
||||
</div>
|
||||
</yt-touch-feedback-shape>
|
||||
</button>
|
||||
</div>
|
||||
@ -19,7 +19,7 @@ export const backend = createBackend<BackendType, APIServerConfig>({
|
||||
async start(ctx) {
|
||||
const config = await ctx.getConfig();
|
||||
|
||||
await this.init(ctx);
|
||||
this.init(ctx);
|
||||
registerCallback((songInfo) => {
|
||||
this.songInfo = songInfo;
|
||||
});
|
||||
@ -60,8 +60,7 @@ export const backend = createBackend<BackendType, APIServerConfig>({
|
||||
},
|
||||
|
||||
// Custom
|
||||
async init(ctx) {
|
||||
const config = await ctx.getConfig();
|
||||
init(backendCtx) {
|
||||
this.app = new Hono();
|
||||
|
||||
this.app.use('*', cors());
|
||||
@ -74,6 +73,8 @@ export const backend = createBackend<BackendType, APIServerConfig>({
|
||||
|
||||
// middlewares
|
||||
this.app.use('/api/*', async (ctx, next) => {
|
||||
const config = await backendCtx.getConfig();
|
||||
|
||||
if (config.authStrategy !== AuthStrategy.NONE) {
|
||||
return await jwt({
|
||||
secret: config.secret,
|
||||
@ -83,6 +84,7 @@ export const backend = createBackend<BackendType, APIServerConfig>({
|
||||
});
|
||||
this.app.use('/api/*', async (ctx, next) => {
|
||||
const result = await JWTPayloadSchema.spa(await ctx.get('jwtPayload'));
|
||||
const config = await backendCtx.getConfig();
|
||||
|
||||
const isAuthorized =
|
||||
config.authStrategy === AuthStrategy.NONE ||
|
||||
@ -98,12 +100,12 @@ export const backend = createBackend<BackendType, APIServerConfig>({
|
||||
// routes
|
||||
registerControl(
|
||||
this.app,
|
||||
ctx,
|
||||
backendCtx,
|
||||
() => this.songInfo,
|
||||
() => this.currentRepeatMode,
|
||||
() => this.volume,
|
||||
);
|
||||
registerAuth(this.app, ctx);
|
||||
registerAuth(this.app, backendCtx);
|
||||
|
||||
// swagger
|
||||
this.app.openAPIRegistry.registerComponent(
|
||||
@ -120,6 +122,8 @@ export const backend = createBackend<BackendType, APIServerConfig>({
|
||||
info: {
|
||||
version: '1.0.0',
|
||||
title: 'Youtube Music API Server',
|
||||
description:
|
||||
'Note: You need to get an access token using the `/auth/{id}` endpoint first to call any API endpoints under `/api`.',
|
||||
},
|
||||
security: [
|
||||
{
|
||||
|
||||
@ -754,8 +754,8 @@ export const register = (
|
||||
return ctx.body(null);
|
||||
});
|
||||
app.openapi(routes.search, async (ctx) => {
|
||||
const { query } = ctx.req.valid('json');
|
||||
const response = await controller.search(query);
|
||||
const { query, params, continuation } = ctx.req.valid('json');
|
||||
const response = await controller.search(query, params, continuation);
|
||||
|
||||
ctx.status(200);
|
||||
return ctx.json(response as object);
|
||||
|
||||
@ -2,4 +2,6 @@ import { z } from '@hono/zod-openapi';
|
||||
|
||||
export const SearchSchema = z.object({
|
||||
query: z.string(),
|
||||
params: z.string().optional(),
|
||||
continuation: z.string().optional(),
|
||||
});
|
||||
|
||||
@ -15,7 +15,7 @@ export type BackendType = {
|
||||
currentRepeatMode?: RepeatMode;
|
||||
volume?: number;
|
||||
|
||||
init: (ctx: BackendContext<APIServerConfig>) => Promise<void>;
|
||||
init: (ctx: BackendContext<APIServerConfig>) => void;
|
||||
run: (hostname: string, port: number) => void;
|
||||
end: () => void;
|
||||
};
|
||||
|
||||
246
src/plugins/auth-proxy-adapter/backend/index.ts
Normal file
246
src/plugins/auth-proxy-adapter/backend/index.ts
Normal file
@ -0,0 +1,246 @@
|
||||
import net from 'net';
|
||||
|
||||
import { SocksClient, SocksClientOptions } from 'socks';
|
||||
|
||||
import is from 'electron-is';
|
||||
|
||||
import { createBackend, LoggerPrefix } from '@/utils';
|
||||
|
||||
import { BackendType } from './types';
|
||||
|
||||
import config from '@/config';
|
||||
|
||||
import { AuthProxyConfig, defaultAuthProxyConfig } from '../config';
|
||||
|
||||
import type { BackendContext } from '@/types/contexts';
|
||||
|
||||
// Parsing the upstream authentication SOCK proxy URL
|
||||
const parseSocksUrl = (socksUrl: string) => {
|
||||
// Format: socks5://username:password@your_server_ip:port
|
||||
|
||||
const url = new URL(socksUrl);
|
||||
return {
|
||||
host: url.hostname,
|
||||
port: parseInt(url.port, 10),
|
||||
type: url.protocol === 'socks5:' ? 5 : 4,
|
||||
username: url.username,
|
||||
password: url.password,
|
||||
};
|
||||
};
|
||||
|
||||
export const backend = createBackend<BackendType, AuthProxyConfig>({
|
||||
async start(ctx: BackendContext<AuthProxyConfig>) {
|
||||
const pluginConfig = await ctx.getConfig();
|
||||
this.startServer(pluginConfig);
|
||||
},
|
||||
stop() {
|
||||
this.stopServer();
|
||||
},
|
||||
onConfigChange(config: AuthProxyConfig) {
|
||||
if (
|
||||
this.oldConfig?.hostname === config.hostname &&
|
||||
this.oldConfig?.port === config.port
|
||||
) {
|
||||
this.oldConfig = config;
|
||||
return;
|
||||
}
|
||||
this.stopServer();
|
||||
this.startServer(config);
|
||||
|
||||
this.oldConfig = config;
|
||||
},
|
||||
|
||||
// Custom
|
||||
// Start proxy server - SOCKS5
|
||||
startServer(serverConfig: AuthProxyConfig) {
|
||||
if (this.server) {
|
||||
this.stopServer();
|
||||
}
|
||||
|
||||
const { port, hostname } = serverConfig;
|
||||
// Upstream proxy from system settings
|
||||
const upstreamProxyUrl = config.get('options.proxy');
|
||||
// Create SOCKS proxy server
|
||||
const socksServer = net.createServer((socket) => {
|
||||
socket.once('data', (chunk) => {
|
||||
if (chunk[0] === 0x05) {
|
||||
// SOCKS5
|
||||
this.handleSocks5(socket, chunk, upstreamProxyUrl);
|
||||
} else {
|
||||
socket.end();
|
||||
}
|
||||
});
|
||||
|
||||
socket.on('error', (err) => {
|
||||
console.error(LoggerPrefix, '[SOCKS] Socket error:', err.message);
|
||||
});
|
||||
});
|
||||
|
||||
// Listen for errors
|
||||
socksServer.on('error', (err) => {
|
||||
console.error(LoggerPrefix, '[SOCKS Server Error]', err.message);
|
||||
});
|
||||
|
||||
// Start server
|
||||
socksServer.listen(port, hostname, () => {
|
||||
console.log(LoggerPrefix, '===========================================');
|
||||
console.log(
|
||||
LoggerPrefix,
|
||||
`[Auth-Proxy-Adapter] Enable SOCKS proxy at socks5://${hostname}:${port}`,
|
||||
);
|
||||
console.log(
|
||||
LoggerPrefix,
|
||||
`[Auth-Proxy-Adapter] Using upstream proxy: ${upstreamProxyUrl}`,
|
||||
);
|
||||
console.log(LoggerPrefix, '===========================================');
|
||||
});
|
||||
|
||||
this.server = socksServer;
|
||||
},
|
||||
|
||||
// Handle SOCKS5 request
|
||||
handleSocks5(
|
||||
clientSocket: net.Socket,
|
||||
chunk: Buffer,
|
||||
upstreamProxyUrl: string,
|
||||
) {
|
||||
// Handshake phase
|
||||
const numMethods = chunk[1];
|
||||
const methods = chunk.subarray(2, 2 + numMethods);
|
||||
|
||||
// Check if client supports no authentication method (0x00)
|
||||
if (methods.includes(0x00)) {
|
||||
// Reply to client, choose no authentication method
|
||||
clientSocket.write(Buffer.from([0x05, 0x00]));
|
||||
|
||||
// Wait for client's connection request
|
||||
clientSocket.once('data', (data) => {
|
||||
this.processSocks5Request(clientSocket, data, upstreamProxyUrl);
|
||||
});
|
||||
} else {
|
||||
// Authentication methods not supported by the client
|
||||
clientSocket.write(Buffer.from([0x05, 0xff]));
|
||||
clientSocket.end();
|
||||
}
|
||||
},
|
||||
|
||||
// Handle SOCKS5 connection request
|
||||
processSocks5Request(
|
||||
clientSocket: net.Socket,
|
||||
data: Buffer,
|
||||
upstreamProxyUrl: string,
|
||||
) {
|
||||
// Parse target address and port
|
||||
let targetHost, targetPort;
|
||||
const cmd = data[1]; // Command: 0x01=CONNECT, 0x02=BIND, 0x03=UDP
|
||||
const atyp = data[3]; // Address type: 0x01=IPv4, 0x03=Domain, 0x04=IPv6
|
||||
|
||||
if (cmd !== 0x01) {
|
||||
// Currently only support CONNECT command
|
||||
clientSocket.write(
|
||||
Buffer.from([0x05, 0x07, 0x00, 0x01, 0, 0, 0, 0, 0, 0]),
|
||||
);
|
||||
clientSocket.end();
|
||||
return;
|
||||
}
|
||||
|
||||
if (atyp === 0x01) {
|
||||
// IPv4
|
||||
targetHost = `${data[4]}.${data[5]}.${data[6]}.${data[7]}`;
|
||||
targetPort = data.readUInt16BE(8);
|
||||
} else if (atyp === 0x03) {
|
||||
// Domain
|
||||
const hostLen = data[4];
|
||||
targetHost = data.subarray(5, 5 + hostLen).toString();
|
||||
targetPort = data.readUInt16BE(5 + hostLen);
|
||||
} else if (atyp === 0x04) {
|
||||
// IPv6
|
||||
const ipv6Buffer = data.subarray(4, 20);
|
||||
targetHost = Array.from(new Array(8), (_, i) =>
|
||||
ipv6Buffer.readUInt16BE(i * 2).toString(16),
|
||||
).join(':');
|
||||
targetPort = data.readUInt16BE(20);
|
||||
}
|
||||
if (is.dev()) {
|
||||
console.debug(
|
||||
LoggerPrefix,
|
||||
`[SOCKS5] Request to connect to ${targetHost}:${targetPort}`,
|
||||
);
|
||||
}
|
||||
|
||||
const socksProxy = parseSocksUrl(upstreamProxyUrl);
|
||||
|
||||
if (!socksProxy) {
|
||||
// Failed to parse proxy URL
|
||||
clientSocket.write(
|
||||
Buffer.from([0x05, 0x01, 0x00, 0x01, 0, 0, 0, 0, 0, 0]),
|
||||
);
|
||||
clientSocket.end();
|
||||
return;
|
||||
}
|
||||
|
||||
const options: SocksClientOptions = {
|
||||
proxy: {
|
||||
host: socksProxy.host,
|
||||
port: socksProxy.port,
|
||||
type: socksProxy.type as 4 | 5,
|
||||
userId: socksProxy.username,
|
||||
password: socksProxy.password,
|
||||
},
|
||||
command: 'connect',
|
||||
destination: {
|
||||
host: targetHost || defaultAuthProxyConfig.hostname,
|
||||
port: targetPort || defaultAuthProxyConfig.port,
|
||||
},
|
||||
};
|
||||
SocksClient.createConnection(options)
|
||||
.then((info) => {
|
||||
const { socket: proxySocket } = info;
|
||||
|
||||
// Connection successful, send success response to client
|
||||
const responseBuffer = Buffer.from([
|
||||
0x05, // VER: SOCKS5
|
||||
0x00, // REP: Success
|
||||
0x00, // RSV: Reserved field
|
||||
0x01, // ATYP: IPv4
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0, // BND.ADDR: 0.0.0.0 (Bound address, usually not important)
|
||||
0,
|
||||
0, // BND.PORT: 0 (Bound port, usually not important)
|
||||
]);
|
||||
clientSocket.write(responseBuffer);
|
||||
|
||||
// Establish bidirectional data stream
|
||||
proxySocket.pipe(clientSocket);
|
||||
clientSocket.pipe(proxySocket);
|
||||
|
||||
proxySocket.on('error', (error) => {
|
||||
console.error(LoggerPrefix, '[SOCKS5] Proxy socket error:', error);
|
||||
if (clientSocket.writable) clientSocket.end();
|
||||
});
|
||||
|
||||
clientSocket.on('error', (error) => {
|
||||
console.error(LoggerPrefix, '[SOCKS5] Client socket error:', error);
|
||||
if (proxySocket.writable) proxySocket.end();
|
||||
});
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error(LoggerPrefix, '[SOCKS5] Connection error:', error);
|
||||
// Send failure response to client
|
||||
clientSocket.write(
|
||||
Buffer.from([0x05, 0x05, 0x00, 0x01, 0, 0, 0, 0, 0, 0]),
|
||||
);
|
||||
clientSocket.end();
|
||||
});
|
||||
},
|
||||
|
||||
// Stop proxy server
|
||||
stopServer() {
|
||||
if (this.server) {
|
||||
this.server.close();
|
||||
this.server = undefined;
|
||||
}
|
||||
},
|
||||
});
|
||||
21
src/plugins/auth-proxy-adapter/backend/types.ts
Normal file
21
src/plugins/auth-proxy-adapter/backend/types.ts
Normal file
@ -0,0 +1,21 @@
|
||||
import net from 'net';
|
||||
|
||||
import type { AuthProxyConfig } from '../config';
|
||||
import type { Server } from 'http';
|
||||
|
||||
export type BackendType = {
|
||||
server?: Server | net.Server;
|
||||
oldConfig?: AuthProxyConfig;
|
||||
startServer: (serverConfig: AuthProxyConfig) => void;
|
||||
stopServer: () => void;
|
||||
handleSocks5: (
|
||||
clientSocket: net.Socket,
|
||||
chunk: Buffer,
|
||||
upstreamProxyUrl: string,
|
||||
) => void;
|
||||
processSocks5Request: (
|
||||
clientSocket: net.Socket,
|
||||
data: Buffer,
|
||||
upstreamProxyUrl: string,
|
||||
) => void;
|
||||
};
|
||||
11
src/plugins/auth-proxy-adapter/config.ts
Normal file
11
src/plugins/auth-proxy-adapter/config.ts
Normal file
@ -0,0 +1,11 @@
|
||||
export interface AuthProxyConfig {
|
||||
enabled: boolean;
|
||||
hostname: string;
|
||||
port: number;
|
||||
}
|
||||
|
||||
export const defaultAuthProxyConfig: AuthProxyConfig = {
|
||||
enabled: false,
|
||||
hostname: '127.0.0.1',
|
||||
port: 4545,
|
||||
};
|
||||
16
src/plugins/auth-proxy-adapter/index.ts
Normal file
16
src/plugins/auth-proxy-adapter/index.ts
Normal file
@ -0,0 +1,16 @@
|
||||
import { createPlugin } from '@/utils';
|
||||
import { t } from '@/i18n';
|
||||
|
||||
import { defaultAuthProxyConfig } from './config';
|
||||
import { onMenu } from './menu';
|
||||
import { backend } from './backend';
|
||||
|
||||
export default createPlugin({
|
||||
name: () => t('plugins.auth-proxy-adapter.name'),
|
||||
description: () => t('plugins.auth-proxy-adapter.description'),
|
||||
restartNeeded: true,
|
||||
config: defaultAuthProxyConfig,
|
||||
addedVersion: '3.10.X',
|
||||
menu: onMenu,
|
||||
backend,
|
||||
});
|
||||
68
src/plugins/auth-proxy-adapter/menu.ts
Normal file
68
src/plugins/auth-proxy-adapter/menu.ts
Normal file
@ -0,0 +1,68 @@
|
||||
import prompt from 'custom-electron-prompt';
|
||||
|
||||
import { t } from '@/i18n';
|
||||
import promptOptions from '@/providers/prompt-options';
|
||||
|
||||
import { type AuthProxyConfig, defaultAuthProxyConfig } from './config';
|
||||
|
||||
import type { MenuContext } from '@/types/contexts';
|
||||
import type { MenuTemplate } from '@/menu';
|
||||
|
||||
export const onMenu = async ({
|
||||
getConfig,
|
||||
setConfig,
|
||||
window,
|
||||
}: MenuContext<AuthProxyConfig>): Promise<MenuTemplate> => {
|
||||
await getConfig();
|
||||
return [
|
||||
{
|
||||
label: t('plugins.auth-proxy-adapter.menu.hostname.label'),
|
||||
type: 'normal',
|
||||
async click() {
|
||||
const config = await getConfig();
|
||||
|
||||
const newHostname =
|
||||
(await prompt(
|
||||
{
|
||||
title: t('plugins.auth-proxy-adapter.prompt.hostname.title'),
|
||||
label: t('plugins.auth-proxy-adapter.prompt.hostname.label'),
|
||||
value: config.hostname,
|
||||
type: 'input',
|
||||
width: 380,
|
||||
...promptOptions(),
|
||||
},
|
||||
window,
|
||||
)) ??
|
||||
config.hostname ??
|
||||
defaultAuthProxyConfig.hostname;
|
||||
|
||||
setConfig({ ...config, hostname: newHostname });
|
||||
},
|
||||
},
|
||||
{
|
||||
label: t('plugins.auth-proxy-adapter.menu.port.label'),
|
||||
type: 'normal',
|
||||
async click() {
|
||||
const config = await getConfig();
|
||||
|
||||
const newPort =
|
||||
(await prompt(
|
||||
{
|
||||
title: t('plugins.auth-proxy-adapter.prompt.port.title'),
|
||||
label: t('plugins.auth-proxy-adapter.prompt.port.label'),
|
||||
value: config.port,
|
||||
type: 'counter',
|
||||
counterOptions: { minimum: 0, maximum: 65535 },
|
||||
width: 380,
|
||||
...promptOptions(),
|
||||
},
|
||||
window,
|
||||
)) ??
|
||||
config.port ??
|
||||
defaultAuthProxyConfig.port;
|
||||
|
||||
setConfig({ ...config, port: newPort });
|
||||
},
|
||||
},
|
||||
];
|
||||
};
|
||||
@ -7,7 +7,7 @@ import { t } from '@/i18n';
|
||||
export default createBackend({
|
||||
start({ ipc: { handle }, window }) {
|
||||
handle(
|
||||
'captionsSelector',
|
||||
'ytmd:captions-selector',
|
||||
async (captionLabels: Record<string, string>, currentIndex: string) =>
|
||||
await prompt(
|
||||
{
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user