Compare commits
691 Commits
v3.4.0
...
refactor/m
| Author | SHA1 | Date | |
|---|---|---|---|
| 507a70015e | |||
| 86c77d141f | |||
| 754ca3caaa | |||
| 61ea104d7b | |||
| 573bdfae03 | |||
| cca493b7d5 | |||
| f47262d27b | |||
| 65bf9129ea | |||
| 87e9b9f7a8 | |||
| 07bc4f05fd | |||
| e3a6808087 | |||
| e9184e5d60 | |||
| a5b32d96f8 | |||
| 040db7539c | |||
| da646c1d53 | |||
| 5f5917f972 | |||
| eccb0d2f08 | |||
| 4cd9dd17df | |||
| 5de07b9a96 | |||
| 151f067beb | |||
| c68a7bd19f | |||
| b87e5e31df | |||
| 03229d61c8 | |||
| b6330eed18 | |||
| b254812ac2 | |||
| 7e243e2fbf | |||
| 307e52cc89 | |||
| f7b7ea916f | |||
| 3eccf8daca | |||
| aa48944212 | |||
| 4d51f1a412 | |||
| d3c9f76582 | |||
| d638a6cf28 | |||
| f93651b219 | |||
| cb8c6c69fe | |||
| 4e7266fb1b | |||
| 8de75ff3a5 | |||
| 3236c88eb2 | |||
| c9f0ad14c2 | |||
| 0a9199c92b | |||
| 3ffcff7d9c | |||
| ddf614d362 | |||
| 6f1a77bbb9 | |||
| 8595f9761e | |||
| cc442182fd | |||
| b827a05eea | |||
| 250abab8bc | |||
| 8e45518ccf | |||
| 7485e065ed | |||
| c1d88f91d4 | |||
| 124a2bd8d0 | |||
| f8f94f9665 | |||
| 5e98a82b23 | |||
| a5c20a66b3 | |||
| cc84116ad1 | |||
| a2e2031708 | |||
| 5001eabf23 | |||
| aac2974430 | |||
| f7f005bb3d | |||
| e1f6d5b7f2 | |||
| b6b607897e | |||
| 651ebb2b1a | |||
| 9fa24deed2 | |||
| c81022d373 | |||
| b726dc7580 | |||
| 471aa7d0a6 | |||
| f34d645ac3 | |||
| d2a11a560e | |||
| 9d185872db | |||
| d0ff71aa66 | |||
| bc8999585f | |||
| 1e1582e31f | |||
| 2c48a0f6f4 | |||
| 368b251e3f | |||
| 3339f997e3 | |||
| 76e8e7aa7a | |||
| 8c325b17f8 | |||
| 494bc0ccc7 | |||
| f14333d07a | |||
| 268ffe2d4c | |||
| 831eb63ace | |||
| 345f235117 | |||
| c6422d5d9c | |||
| f90384386c | |||
| 9213fdd4f7 | |||
| 787c8cdceb | |||
| ace48bc79b | |||
| e5a8b7431f | |||
| e37f22503b | |||
| e61757a7fc | |||
| fdc798ad87 | |||
| 6393e6348c | |||
| ce6e115783 | |||
| 68cbaabc0c | |||
| 9911bbf509 | |||
| 553c2c1096 | |||
| dde57e3eb0 | |||
| 935461f610 | |||
| b95da863c6 | |||
| 92316a999c | |||
| 0ec038342c | |||
| 4649c3bfaf | |||
| 8441af2483 | |||
| 63c4a9cfa7 | |||
| 4e8173360e | |||
| 4f37377d64 | |||
| 0e886c0890 | |||
| cb0719ecf4 | |||
| d24b31cf74 | |||
| 610073b982 | |||
| 493b65bb11 | |||
| e4e7ef3b52 | |||
| e1dc19e9eb | |||
| 4b9f92ed2d | |||
| 622beccd95 | |||
| 8678fca9c0 | |||
| 4dcb9b5995 | |||
| 718025445c | |||
| 845dac3c03 | |||
| a1ac3d1359 | |||
| c21dd08a40 | |||
| 8de27358d3 | |||
| c4910af494 | |||
| 67fc0a415c | |||
| 7d145cbca1 | |||
| a565d9fc0f | |||
| 71a9ed5d65 | |||
| fc16a325f7 | |||
| c52d96dcbd | |||
| d2c681a047 | |||
| 8e75df42bf | |||
| 85d1dc46d1 | |||
| 84f5e265f2 | |||
| 0d261a8e44 | |||
| 3c228ede48 | |||
| 8b971d2263 | |||
| 6b8fed3fc2 | |||
| f15c51f3d7 | |||
| fa3e146ef7 | |||
| 4baec1560c | |||
| 0e0230b995 | |||
| a33a03f512 | |||
| f8a53f0d61 | |||
| 748d77d1c0 | |||
| 725ad0d630 | |||
| bdbab17772 | |||
| 57d2fa372d | |||
| 80471b0ca4 | |||
| 22fdfe3342 | |||
| 5ecfa2a1f7 | |||
| b9beea810e | |||
| f0e77812e7 | |||
| 6d1237c2a2 | |||
| b43c92386e | |||
| 017476a81b | |||
| 9b047d9c54 | |||
| 31f009d3c4 | |||
| 8504f2c086 | |||
| 1d6251baea | |||
| 3ea13a2a22 | |||
| 1cc153084d | |||
| 1c468b4054 | |||
| 1bad46890a | |||
| 5829c8d0f7 | |||
| 85aceaaae4 | |||
| 24e593b22f | |||
| 3f8ca6002e | |||
| b62ccfe7b1 | |||
| 237dde9765 | |||
| 65f4339fd1 | |||
| 109e9f8166 | |||
| 9163b6f04b | |||
| 51da259c97 | |||
| 2bf67b941e | |||
| 533b96d1f6 | |||
| 5c9ded8779 | |||
| 6f389bb297 | |||
| 8a209404d4 | |||
| 6193fb487a | |||
| 9aa7f7a023 | |||
| 5bfaa9a791 | |||
| d210ec8227 | |||
| dec7c5e95c | |||
| 940d0beb84 | |||
| cf98754276 | |||
| d91d493dd1 | |||
| 7e1aea21db | |||
| 0179dfd311 | |||
| 98ea26bbff | |||
| 0d9daaad66 | |||
| fe319daec1 | |||
| 929c58671a | |||
| 4fb2350c2b | |||
| a401bfa809 | |||
| fdeed76f6f | |||
| 0ab113816a | |||
| 8a58b02c7b | |||
| 037b059b55 | |||
| bb0f9fb3d0 | |||
| d3c7848896 | |||
| ea50cb1e65 | |||
| 5070fd88b5 | |||
| 21177478cb | |||
| 26b8b38b89 | |||
| be04d66aa8 | |||
| a837987e70 | |||
| da99558163 | |||
| 3b50cbcb6e | |||
| 595c011bce | |||
| 458fe54063 | |||
| ae3a289005 | |||
| a49eea9246 | |||
| d675a175e9 | |||
| 6c510a71c2 | |||
| 5503d2cbb8 | |||
| ba4c7e1a0c | |||
| e19c458441 | |||
| ec5cf0cae8 | |||
| b3c4570f8c | |||
| 112b6d893b | |||
| 52236907e4 | |||
| d449529ea7 | |||
| 61c799f7d4 | |||
| 1a4ee13e47 | |||
| f91afb984a | |||
| f9892b0eae | |||
| 60c7885a3c | |||
| 63ca6aa533 | |||
| e77a8c04e8 | |||
| 0bfabf604c | |||
| 4343c599cf | |||
| c251554c31 | |||
| 95e519bdc9 | |||
| 79d38bfc8e | |||
| f5655b0ae6 | |||
| 12b4afc3ce | |||
| c104d47737 | |||
| 870cf6143c | |||
| 1baed0e913 | |||
| 02619c79bb | |||
| 0faad538f3 | |||
| e7de30c629 | |||
| c5d8333039 | |||
| 4da08e7c9b | |||
| 171387995a | |||
| aeac020c9a | |||
| 5c05ddeb29 | |||
| cbdd649365 | |||
| d2cf2ad71f | |||
| 7d33494097 | |||
| ca83edabf3 | |||
| f84e77e814 | |||
| 14f2120a32 | |||
| 1cbf14ee2a | |||
| b7cb167fc6 | |||
| 41b9f8b967 | |||
| 0b769ce287 | |||
| ad71ef8a68 | |||
| 048a994f32 | |||
| c2bd8ce188 | |||
| 62ce4e818c | |||
| 4ab8829a02 | |||
| 36b3e2cb0c | |||
| 9ba0614a7d | |||
| 81431ad196 | |||
| a8e8d5afd7 | |||
| f3d86743ee | |||
| 6306968193 | |||
| 7142a253d6 | |||
| 2a24588338 | |||
| 2abaf54ac8 | |||
| cc730ad55c | |||
| d8581c5d69 | |||
| 3208bf4a6d | |||
| 4109db1ad7 | |||
| 87a0ef5d54 | |||
| cdc40f0c53 | |||
| 7a3b8082a2 | |||
| 3e9039c97d | |||
| b9d1130468 | |||
| 605f0984e4 | |||
| 44de7d9e98 | |||
| 9926575744 | |||
| f16a99f6e4 | |||
| a23c64b5b8 | |||
| 0899f76548 | |||
| 515dcdc7e3 | |||
| b2c4bc425b | |||
| 363c3b3a67 | |||
| c2dde3d78f | |||
| eb515cfc61 | |||
| c208ca184f | |||
| c231fa7c44 | |||
| 9e1b8d43d0 | |||
| f50ece88df | |||
| eeb780d190 | |||
| cafdf654d3 | |||
| 2d665013e7 | |||
| 451a46e208 | |||
| 490b901c34 | |||
| b57b4a3454 | |||
| 60c61e32b1 | |||
| aa9052d449 | |||
| 67f3a38583 | |||
| a00ecc4729 | |||
| 56d63fca52 | |||
| 759f3ba317 | |||
| d8daf03f2c | |||
| a519c7c714 | |||
| 933d12fdd1 | |||
| 61fb733550 | |||
| 7f05e3168d | |||
| 3b7697a90d | |||
| 350b1467fe | |||
| 2f5d102f4d | |||
| 66e296df1a | |||
| 1e4cd699db | |||
| 516fbff3d7 | |||
| aab9358d67 | |||
| ae3939f857 | |||
| 79bafd1780 | |||
| 3f4f52a31f | |||
| c2b7b29716 | |||
| dab84b9cf9 | |||
| e5980158eb | |||
| 647d4c9d99 | |||
| 30feb6128b | |||
| 0cf6923540 | |||
| cce9f0b462 | |||
| c0805fb758 | |||
| 04e5844301 | |||
| f28e663133 | |||
| 2c84527c43 | |||
| 68511de727 | |||
| e7ca9f129f | |||
| 259da70e4f | |||
| 9409d75ac7 | |||
| 3ea923f56f | |||
| 6d6c8c94cf | |||
| 29098758a9 | |||
| fdbb35e221 | |||
| 6ddac62313 | |||
| ae4b494300 | |||
| 7d9eed88f4 | |||
| 4abf848f99 | |||
| cc0a6cfdce | |||
| a74d0dd0ca | |||
| 18f15d4cce | |||
| 80e20c6579 | |||
| 761026fd74 | |||
| 95b75f020c | |||
| 574e4baef8 | |||
| ec4871d5a8 | |||
| ccd6bf9c3f | |||
| 2975d4292c | |||
| ad9571550f | |||
| 980068217c | |||
| 18f69aea3f | |||
| add7cb9e48 | |||
| aa67a57971 | |||
| 74f22b4474 | |||
| 7ef4a23576 | |||
| 3c90a1f459 | |||
| 3793d36f36 | |||
| 179f4b29db | |||
| 34f106896c | |||
| 06b581f499 | |||
| 3ec126628c | |||
| 1d3bb60e0b | |||
| 2e3ced6006 | |||
| e8efca5a3e | |||
| 5161c356f9 | |||
| e917b30e64 | |||
| 2d847f9808 | |||
| 21755fffc7 | |||
| 5c9d3e3e67 | |||
| ea801f65ef | |||
| 27f4c0393e | |||
| 9bc42f836f | |||
| 11b11ed966 | |||
| 5f79b7e788 | |||
| 7d1d806797 | |||
| 836cedb0f3 | |||
| 70349e13cc | |||
| 6d16b74471 | |||
| c211780c33 | |||
| 2173ba0234 | |||
| 3a4cbc543b | |||
| 2fef7f0246 | |||
| 12d693921e | |||
| d1b4879f51 | |||
| f14939fcd2 | |||
| 4e66b0cedd | |||
| 11fe54d640 | |||
| 446529f738 | |||
| ac6e9deeb9 | |||
| 100873163f | |||
| e141e18bac | |||
| f4da0c2c95 | |||
| 7507bce3cc | |||
| 2b970fade8 | |||
| 35f0e43082 | |||
| ae4410a613 | |||
| 5534174016 | |||
| 15cf6c77c3 | |||
| 18a8fc462d | |||
| d3acb4945a | |||
| 32d3c58b44 | |||
| bd8c2eb390 | |||
| a81fa9c0d1 | |||
| 1d0f7d7a48 | |||
| b6687307df | |||
| 7e07a44f68 | |||
| 5ca66530ee | |||
| 95acbe2b65 | |||
| 534aeb163a | |||
| 6abcbee290 | |||
| 4457a043a4 | |||
| 410a052fea | |||
| e4287085a1 | |||
| b6cefef8fb | |||
| 9d7e2a06bc | |||
| d516fc2153 | |||
| 77bfe8e218 | |||
| 0fcbe38837 | |||
| b85a40f683 | |||
| 8020d61715 | |||
| cb1381bbb3 | |||
| f42f20f770 | |||
| 9fb1dbfde0 | |||
| 4f1ebab45d | |||
| 95644ea513 | |||
| 2fcddc8d2d | |||
| 6505a93645 | |||
| 11c25efd47 | |||
| a97bc8da5a | |||
| 782116b31b | |||
| 708d4b5480 | |||
| 9ba8913da7 | |||
| d07dae2542 | |||
| e7f213c4dc | |||
| 4cbf6c015b | |||
| 8acb93225b | |||
| 8153955ccf | |||
| 1de1cbac65 | |||
| 825aac1dab | |||
| d48aa7ad39 | |||
| 65ad09a02e | |||
| 08aae09446 | |||
| 88f54a389f | |||
| 4c23b1f970 | |||
| a979f1c8ea | |||
| ead448ed98 | |||
| fade340e80 | |||
| 8cc8160f70 | |||
| ee354ff678 | |||
| ca7ccc7b3e | |||
| f6b2766ec2 | |||
| 4a5f811485 | |||
| a092da7ba5 | |||
| b587a16419 | |||
| 4cf4f19ccc | |||
| 5b84c9efce | |||
| 98bbbfd851 | |||
| da2dbcacc4 | |||
| 7b6235694b | |||
| 4ad8e7b9dc | |||
| 51ecfff86b | |||
| 2c21a03201 | |||
| 4c2cb8dac9 | |||
| 9edcd2c32e | |||
| 0829fd2167 | |||
| 494e58296b | |||
| 151da2d786 | |||
| d7f5f28091 | |||
| 358fb3b084 | |||
| af79ba266d | |||
| 45f419f41a | |||
| 5189d6cfee | |||
| 102034b58c | |||
| 50d92bc004 | |||
| f2716e1dc8 | |||
| 9d436ed0a8 | |||
| 31d472e289 | |||
| 7f9a2b3011 | |||
| f54b346dce | |||
| dbff62bc5b | |||
| 87f43e3237 | |||
| 49cdcbdcc2 | |||
| bcff26c85b | |||
| bcfb33b4b1 | |||
| b172d8e509 | |||
| f10d146272 | |||
| 6105821a94 | |||
| 7c983df6f4 | |||
| cbbddefcf8 | |||
| 8d49c67fcb | |||
| c94b22b82c | |||
| cab3cb49f0 | |||
| e42084f008 | |||
| adca273ec3 | |||
| 91dceb3c22 | |||
| 216e76f4a1 | |||
| 178bfa483f | |||
| 10ecf5d2fe | |||
| 7099b81296 | |||
| 1f15376b00 | |||
| 02b7a39753 | |||
| 6edc84a8bd | |||
| 11a0d39064 | |||
| d5a5ed35b6 | |||
| dbb9e95b32 | |||
| d4c8a4320d | |||
| 68d4f38e41 | |||
| 2204784e89 | |||
| c3b995b0a8 | |||
| ed0a344077 | |||
| 199d912823 | |||
| 089eff3152 | |||
| 306ee8dba5 | |||
| a4992bafb2 | |||
| 5b004eedff | |||
| 2a66076d31 | |||
| f48e46d29c | |||
| 20296f5463 | |||
| fe4c89c349 | |||
| 3640527c8c | |||
| 3326582a16 | |||
| 5dcb9fe9ba | |||
| 336fa1e6fd | |||
| 3679a109d6 | |||
| 5290ed3de2 | |||
| fe5195714f | |||
| 8eb846262d | |||
| e9a1c2a91f | |||
| 2d1f78b383 | |||
| 1899064fd3 | |||
| e0280e5fe2 | |||
| d577e0fba6 | |||
| 37577c2f7f | |||
| c880f0a4eb | |||
| 4875955914 | |||
| 5b28c780bd | |||
| 4db2674b15 | |||
| a454a0163f | |||
| 61eb28e780 | |||
| e165e64952 | |||
| f380822e11 | |||
| 6b1995145a | |||
| 9317e99f43 | |||
| 66d05d8683 | |||
| 545a3a4bb6 | |||
| 04a6d16dbe | |||
| 3c36477b1e | |||
| c5c191492e | |||
| b12e2f607c | |||
| 1d77ad6de4 | |||
| 25bd26d7f3 | |||
| d11d0abe73 | |||
| 8a643c465d | |||
| 233673b8d8 | |||
| 5a448fab31 | |||
| 42e8262cda | |||
| f64769b1d3 | |||
| e12998761b | |||
| 2e20fa83b8 | |||
| 5149757af3 | |||
| 655741f108 | |||
| 4e58571ad0 | |||
| 1e4a615b47 | |||
| dedcf0c9ff | |||
| a84a7d236a | |||
| e56b4b21f0 | |||
| 361f9e42bd | |||
| 918736d2ca | |||
| 8f3d5b08ac | |||
| 4ca327d801 | |||
| 8d0aa057ad | |||
| b7ffee089b | |||
| d72b994f66 | |||
| e6dafdb068 | |||
| 14886dd4bd | |||
| c9f2f88bac | |||
| 1eabbc0bbe | |||
| 32a572b35a | |||
| 59a5679cbb | |||
| ac51f798c3 | |||
| 7599cc694a | |||
| 53595654b1 | |||
| 7656c41dbc | |||
| ff0c5b87c9 | |||
| 506c95740a | |||
| 575a42e28a | |||
| dcdc6a825f | |||
| 0a41bb1cd6 | |||
| 72a4736dc9 | |||
| f2b1e6b6bf | |||
| bc0e28ad6d | |||
| 8ebae91c02 | |||
| 954ad90733 | |||
| 5af0643788 | |||
| be633ac1f2 | |||
| 0d047c1fd5 | |||
| e8b1aca629 | |||
| 5b9bacf390 | |||
| ccd16f4a5f | |||
| 02e519dab3 | |||
| 473ea78f12 | |||
| e7f366b770 | |||
| 66816ac42d | |||
| 08b985f2ab | |||
| 747bde2136 | |||
| eabc28b39f | |||
| 3537dc19ee | |||
| 6afeb60557 | |||
| 71115dedee | |||
| 8750b54f76 | |||
| 482a1c5073 | |||
| c8d516c40b | |||
| c1ad168c32 | |||
| 5f5be5d02f | |||
| 61ef56dccc | |||
| a73b5acc75 | |||
| 877573532c | |||
| 7b033b5caf | |||
| 8924ec29d3 | |||
| 23e688aaf8 | |||
| 9b3cbe8e01 | |||
| 67a89e8ed4 | |||
| 464a2b94ea | |||
| 9357a15116 | |||
| ee820bb01c | |||
| 6b81735811 | |||
| 8ce91b143a | |||
| 116dbad9bc | |||
| 977af3d617 | |||
| 6da8defc73 | |||
| 0e93a963e1 | |||
| 1e98b2e75a | |||
| 6f5f13a840 | |||
| 822bcedadf | |||
| 2b6aea82c3 | |||
| 4f4efb407e | |||
| 6159e0e652 | |||
| 3957e06174 | |||
| c78f823b9b | |||
| 1be3bb360e | |||
| ba2afd2652 | |||
| 5e283c9ea5 | |||
| ddb1c56111 | |||
| ebd167f3f2 | |||
| 178a62b9d3 | |||
| f98a2cf766 | |||
| fdbe6f7331 | |||
| 57c2cdc91e | |||
| 0f5074f8ab | |||
| 661396226d | |||
| 36f27fe2e6 | |||
| adf1ce4bc7 | |||
| 43b4b8df5e | |||
| 4a8440c281 | |||
| 32fe9fcffe | |||
| a9896845da | |||
| a59aa07334 | |||
| e07d7395e7 | |||
| 9bb6f32ece | |||
| ccb19a0dc9 | |||
| 64fb6c2597 | |||
| 73c3e355fe | |||
| fc7a504643 | |||
| 764dc0f895 | |||
| 9f33f49ec4 | |||
| 87ae6d29bb | |||
| 093c8e3ca6 | |||
| fec26a010d | |||
| 5d8aaccc55 | |||
| cda03078a9 | |||
| 9c139b96f4 | |||
| 9b2816c156 | |||
| b1b8847134 | |||
| bf9e698288 | |||
| 28e8a1c5dd | |||
| 18e0b1b863 | |||
| 02e2fb6a83 | |||
| 91bee4880e | |||
| 7de7303ebb | |||
| 363d869cff | |||
| 2512af80af | |||
| 887979932c | |||
| eeaaf2f158 | |||
| e91e995b95 |
@ -1 +0,0 @@
|
||||
.eslintrc.js
|
||||
80
.eslintrc.js
@ -1,80 +0,0 @@
|
||||
module.exports = {
|
||||
extends: [
|
||||
'eslint:recommended',
|
||||
'plugin:import/recommended',
|
||||
'plugin:import/typescript',
|
||||
'plugin:@typescript-eslint/eslint-recommended',
|
||||
'plugin:@typescript-eslint/recommended',
|
||||
'plugin:@typescript-eslint/recommended-requiring-type-checking',
|
||||
],
|
||||
plugins: ['prettier', '@typescript-eslint', 'import'],
|
||||
parser: '@typescript-eslint/parser',
|
||||
parserOptions: {
|
||||
project: './tsconfig.json',
|
||||
tsconfigRootDir: __dirname,
|
||||
sourceType: 'module',
|
||||
ecmaVersion: 'latest'
|
||||
},
|
||||
rules: {
|
||||
'arrow-parens': ['error', 'always'],
|
||||
'object-curly-spacing': ['error', 'always'],
|
||||
'@typescript-eslint/no-floating-promises': 'off',
|
||||
'@typescript-eslint/no-misused-promises': ['off', { checksVoidReturn: false }],
|
||||
'@typescript-eslint/no-unused-vars': ['warn', { argsIgnorePattern: '^_' }],
|
||||
"@typescript-eslint/no-non-null-assertion": "off",
|
||||
'import/first': 'error',
|
||||
'import/newline-after-import': 'error',
|
||||
'import/no-default-export': 'off',
|
||||
'import/no-duplicates': 'error',
|
||||
'import/no-unresolved': ['error', { ignore: ['^virtual:', '\\?inline$', '\\?raw$', '\\?asset&asarUnpack'] }],
|
||||
'import/order': [
|
||||
'error',
|
||||
{
|
||||
'groups': ['builtin', 'external', ['internal', 'index', 'sibling'], 'parent', 'type'],
|
||||
'newlines-between': 'always-and-inside-groups',
|
||||
'alphabetize': {order: 'ignore', caseInsensitive: false}
|
||||
}
|
||||
],
|
||||
'import/prefer-default-export': 'off',
|
||||
'camelcase': ['error', {properties: 'never'}],
|
||||
'class-methods-use-this': 'off',
|
||||
'lines-around-comment': [
|
||||
'error',
|
||||
{
|
||||
beforeBlockComment: false,
|
||||
afterBlockComment: false,
|
||||
beforeLineComment: false,
|
||||
afterLineComment: false,
|
||||
},
|
||||
],
|
||||
'max-len': 'off',
|
||||
'no-mixed-operators': 'error',
|
||||
'no-multi-spaces': ['error', {ignoreEOLComments: true}],
|
||||
'no-tabs': 'error',
|
||||
'no-void': 'error',
|
||||
'no-empty': 'off',
|
||||
'prefer-promise-reject-errors': 'off',
|
||||
'quotes': ['error', 'single', {
|
||||
avoidEscape: true,
|
||||
allowTemplateLiterals: false,
|
||||
}],
|
||||
'quote-props': ['error', 'consistent'],
|
||||
'semi': ['error', 'always'],
|
||||
},
|
||||
env: {
|
||||
browser: true,
|
||||
node: true,
|
||||
es6: true,
|
||||
},
|
||||
ignorePatterns: ['dist', 'node_modules'],
|
||||
root: true,
|
||||
settings: {
|
||||
'import/parsers': {
|
||||
'@typescript-eslint/parser': ['.ts']
|
||||
},
|
||||
'import/resolver': {
|
||||
typescript: {},
|
||||
exports: {},
|
||||
},
|
||||
},
|
||||
};
|
||||
14
.github/workflows/build.yml
vendored
@ -21,9 +21,9 @@ jobs:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v2
|
||||
uses: pnpm/action-setup@v4
|
||||
with:
|
||||
version: 9
|
||||
version: 10
|
||||
run_install: false
|
||||
|
||||
- name: Setup NodeJS
|
||||
@ -62,6 +62,12 @@ jobs:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
sudo snap install snapcraft --classic
|
||||
sudo apt update
|
||||
sudo apt install -y flatpak flatpak-builder
|
||||
sudo flatpak remote-add --if-not-exists --system flathub https://flathub.org/repo/flathub.flatpakrepo
|
||||
sudo flatpak install -y flathub org.freedesktop.Platform/x86_64/24.08
|
||||
sudo flatpak install -y flathub org.freedesktop.Sdk/x86_64/24.08
|
||||
sudo flatpak install -y flathub org.electronjs.Electron2.BaseApp/x86_64/24.08
|
||||
pnpm release:linux
|
||||
|
||||
- name: Build and release on Windows
|
||||
@ -90,9 +96,9 @@ jobs:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v2
|
||||
uses: pnpm/action-setup@v4
|
||||
with:
|
||||
version: 9
|
||||
version: 10
|
||||
run_install: false
|
||||
|
||||
- name: Setup NodeJS
|
||||
|
||||
15
README.md
@ -4,7 +4,7 @@
|
||||
|
||||
[](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/.eslintrc.js)
|
||||
[](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)
|
||||
@ -12,7 +12,7 @@
|
||||
|
||||
</div>
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
<div align="center">
|
||||
@ -21,7 +21,7 @@
|
||||
</a>
|
||||
</div>
|
||||
|
||||
Read this in other languages: [🇰🇷](./docs/readme/README-ko.md), [🇮🇸](./docs/readme/README-is.md), [🇨🇱 🇪🇸](./docs/readme/README-es.md)
|
||||
Read this in other languages: [🇰🇷](./docs/readme/README-ko.md), [🇮🇸](./docs/readme/README-is.md), [🇨🇱 🇪🇸](./docs/readme/README-es.md), [🇷🇺](./docs/readme/README-ru.md), [🇭🇺](./docs/readme/README-hu.md)
|
||||
|
||||
**Electron wrapper around YouTube Music featuring:**
|
||||
|
||||
@ -67,7 +67,7 @@ Read this in other languages: [🇰🇷](./docs/readme/README-ko.md), [🇮🇸]
|
||||
## Available plugins:
|
||||
|
||||
- **Ad Blocker**: Block all ads and tracking out of the box
|
||||
|
||||
|
||||
- **Album Actions**: Adds Undislike, Dislike, Like, and Unlike buttons to apply this to all songs in a playlist or album
|
||||
|
||||
- **Album Color Theme**: Applies a dynamic theme and visual effects based on the album color palette
|
||||
@ -95,6 +95,8 @@ Read this in other languages: [🇰🇷](./docs/readme/README-ko.md), [🇮🇸]
|
||||
- **Downloader**: downloads
|
||||
MP3 [directly from the interface](https://user-images.githubusercontent.com/61631665/129977677-83a7d067-c192-45e1-98ae-b5a4927393be.png) [(youtube-dl)](https://github.com/ytdl-org/youtube-dl)
|
||||
|
||||
- **Equalizer**: add filters to boost or cut specific range of frequencies (e.g. bass booster)
|
||||
|
||||
- **Exponential Volume**: Makes the volume
|
||||
slider [exponential](https://greasyfork.org/en/scripts/397686-youtube-music-fix-volume-ratio/) so it's easier to
|
||||
select lower volumes
|
||||
@ -141,6 +143,8 @@ Read this in other languages: [🇰🇷](./docs/readme/README-ko.md), [🇮🇸]
|
||||
- [**SponsorBlock**](https://github.com/ajayyy/SponsorBlock): Automatically Skips non-music parts like intro/outro or
|
||||
parts of music videos where the song isn't playing
|
||||
|
||||
- **Synced Lyrics**: Provides synced lyrics to songs, using providers like [LRClib](https://lrclib.net).
|
||||
|
||||
- **Taskbar Media Control**: Control playback from
|
||||
your [Windows taskbar](https://user-images.githubusercontent.com/78568641/111916130-24a35e80-8a82-11eb-80c8-5021c1aa27f4.png)
|
||||
|
||||
@ -159,6 +163,7 @@ Read this in other languages: [🇰🇷](./docs/readme/README-ko.md), [🇮🇸]
|
||||
|
||||
- **Visualizer**: Different music visualizers
|
||||
|
||||
|
||||
## Translation
|
||||
|
||||
You can help with translation on [Hosted Weblate](https://hosted.weblate.org/projects/youtube-music/).
|
||||
@ -189,7 +194,7 @@ brew install th-ch/youtube-music/youtube-music
|
||||
If you install the app manually and get an error "is damaged and can’t be opened." when launching the app, run the following in the Terminal:
|
||||
|
||||
```bash
|
||||
xattr -cr /Applications/YouTube\ Music.app
|
||||
/usr/bin/xattr -cr /Applications/YouTube\ Music.app
|
||||
```
|
||||
|
||||
### Windows
|
||||
|
||||
|
Before Width: | Height: | Size: 250 B After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 192 B After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 265 B After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 269 B After Width: | Height: | Size: 13 KiB |
527
changelog.md
@ -2,8 +2,535 @@
|
||||
|
||||
All notable changes to this project will be documented in this file. Dates are displayed in UTC.
|
||||
|
||||
#### [v3.7.3](https://github.com/th-ch/youtube-music/compare/v3.7.2...v3.7.3)
|
||||
|
||||
- fix(downloader): use the upgrade button to check for premium status [`#2987`](https://github.com/th-ch/youtube-music/pull/2987)
|
||||
- chore(deps): update dependency electron-vite to v3 [`#2986`](https://github.com/th-ch/youtube-music/pull/2986)
|
||||
- chore(deps): update dependency @babel/runtime to v7.26.9 [`#2980`](https://github.com/th-ch/youtube-music/pull/2980)
|
||||
- fix(vite): set server.cors.origin [`#2981`](https://github.com/th-ch/youtube-music/pull/2981)
|
||||
- chore(deps-dev): bump esbuild from 0.24.2 to 0.25.0 [`#2973`](https://github.com/th-ch/youtube-music/pull/2973)
|
||||
- fix(deps): update dependency solid-transition-group to v0.3.0 [`#2949`](https://github.com/th-ch/youtube-music/pull/2949)
|
||||
- fix: remove disable-gpu-memory-buffer-video-frames flag [`#2963`](https://github.com/th-ch/youtube-music/pull/2963)
|
||||
- fix(deps): update dependency semver to v7.7.0 [`#2948`](https://github.com/th-ch/youtube-music/pull/2948)
|
||||
- chore(deps): update playwright monorepo to v1.50.1 [`#2943`](https://github.com/th-ch/youtube-music/pull/2943)
|
||||
- fix(deps): update dependency @hono/node-server to v1.13.8 [`#2944`](https://github.com/th-ch/youtube-music/pull/2944)
|
||||
- fix(deps): update dependency electron-store to v10.0.1 [`#2945`](https://github.com/th-ch/youtube-music/pull/2945)
|
||||
- chore(deps): update dependency rollup to v4.34.1 [`#2946`](https://github.com/th-ch/youtube-music/pull/2946)
|
||||
- chore(deps): update dependency typescript-eslint to v8.22.0 [`#2947`](https://github.com/th-ch/youtube-music/pull/2947)
|
||||
- fix(synced-lyrics): Fix reverse direction of synced lyrics for persian or other rtl languages [`#2940`](https://github.com/th-ch/youtube-music/pull/2940)
|
||||
- chore(deps): update dependency electron to v34.0.2 [`#2942`](https://github.com/th-ch/youtube-music/pull/2942)
|
||||
- chore(deps): update dependency discord-api-types to v0.37.119 [`#2941`](https://github.com/th-ch/youtube-music/pull/2941)
|
||||
- fix(deps): update dependency hono to v4.6.20 [`#2932`](https://github.com/th-ch/youtube-music/pull/2932)
|
||||
- chore(deps): update eslint monorepo to v9.19.0 [`#2935`](https://github.com/th-ch/youtube-music/pull/2935)
|
||||
- fix(deps): update dependency bgutils-js to v3.1.3 [`#2934`](https://github.com/th-ch/youtube-music/pull/2934)
|
||||
- fix(deps): update dependency i18next to v24.2.2 [`#2933`](https://github.com/th-ch/youtube-music/pull/2933)
|
||||
- fix(deps): update dependency happy-dom to v16.8.1 [`#2936`](https://github.com/th-ch/youtube-music/pull/2936)
|
||||
- chore(deps): update dependency @babel/runtime to v7.26.7 [`#2924`](https://github.com/th-ch/youtube-music/pull/2924)
|
||||
- chore(config): migrate renovate config [`#2925`](https://github.com/th-ch/youtube-music/pull/2925)
|
||||
- fix(deps): update dependency @ghostery/adblocker-electron-preload to v2.5.0 [`#2923`](https://github.com/th-ch/youtube-music/pull/2923)
|
||||
- fix(deps): update dependency @ghostery/adblocker-electron to v2.5.0 [`#2922`](https://github.com/th-ch/youtube-music/pull/2922)
|
||||
- chore(deps): update playwright monorepo to v1.50.0 [`#2921`](https://github.com/th-ch/youtube-music/pull/2921)
|
||||
- chore(deps): update dependency vite-plugin-inspect to v10.1.0 [`#2920`](https://github.com/th-ch/youtube-music/pull/2920)
|
||||
- chore(deps): update dependency rollup to v4.32.0 [`#2919`](https://github.com/th-ch/youtube-music/pull/2919)
|
||||
- fix(deps): update dependency hono to v4.6.18 [`#2918`](https://github.com/th-ch/youtube-music/pull/2918)
|
||||
- fix(deps): update dependency deepmerge-ts to v7.1.4 [`#2917`](https://github.com/th-ch/youtube-music/pull/2917)
|
||||
- chore(deps): update dependency vite to v6.0.11 [`#2894`](https://github.com/th-ch/youtube-music/pull/2894)
|
||||
- chore(deps): update dependency electron to v34.0.1 [`#2916`](https://github.com/th-ch/youtube-music/pull/2916)
|
||||
- chore(deps): update dependency electron-builder-squirrel-windows to v26.0.0-alpha.10 [`#2899`](https://github.com/th-ch/youtube-music/pull/2899)
|
||||
- chore(deps): update dependency electron-builder to v26.0.0-alpha.10 [`#2898`](https://github.com/th-ch/youtube-music/pull/2898)
|
||||
- chore(deps): update dependency typescript-eslint to v8.21.0 [`#2901`](https://github.com/th-ch/youtube-music/pull/2901)
|
||||
- chore(deps): update dependency discord-api-types to v0.37.117 [`#2895`](https://github.com/th-ch/youtube-music/pull/2895)
|
||||
- fix(deps): update dependency youtubei.js to v13 [`#2904`](https://github.com/th-ch/youtube-music/pull/2904)
|
||||
- chore(deps): update dependency vite to v6.0.9 [security] [`#2907`](https://github.com/th-ch/youtube-music/pull/2907)
|
||||
- fix(deps): update dependency happy-dom to v16.7.2 [`#2902`](https://github.com/th-ch/youtube-music/pull/2902)
|
||||
- fix(discord-plugin): handle album name padding if length < 2 [`#2903`](https://github.com/th-ch/youtube-music/pull/2903)
|
||||
- feat(navigation): added nav icon padding [`#2905`](https://github.com/th-ch/youtube-music/pull/2905)
|
||||
- chore(deps): update dependency rollup to v4.31.0 [`#2891`](https://github.com/th-ch/youtube-music/pull/2891)
|
||||
- chore(deps): update dependency eslint-plugin-prettier to v5.2.3 [`#2889`](https://github.com/th-ch/youtube-music/pull/2889)
|
||||
- chore(deps): update dependency vite-plugin-inspect to v10.0.7 [`#2882`](https://github.com/th-ch/youtube-music/pull/2882)
|
||||
- fix(deps): update dependency hono to v4.6.17 [`#2883`](https://github.com/th-ch/youtube-music/pull/2883)
|
||||
- fix: bump deps [`e9184e5`](https://github.com/th-ch/youtube-music/commit/e9184e5d60c2495473a7c3226ce9748ba89fceb3)
|
||||
- fix(deps): fix pnpm [`040db75`](https://github.com/th-ch/youtube-music/commit/040db7539ccd1ae40f2632fdf38168cdaa26f112)
|
||||
- chore(i18n): Translated using Weblate (Persian) [`9d18587`](https://github.com/th-ch/youtube-music/commit/9d185872dba5b56dabc691e56eafb13dc192b9cd)
|
||||
|
||||
#### [v3.7.2](https://github.com/th-ch/youtube-music/compare/v3.7.1...v3.7.2)
|
||||
|
||||
> 18 January 2025
|
||||
|
||||
- feat(api-server): add endpoint to get shuffle state [`#2792`](https://github.com/th-ch/youtube-music/pull/2792)
|
||||
- chore(deps): update dependency discord-api-types to v0.37.116 [`#2877`](https://github.com/th-ch/youtube-music/pull/2877)
|
||||
- chore(deps): update dependency eslint-plugin-prettier to v5.2.2 [`#2875`](https://github.com/th-ch/youtube-music/pull/2875)
|
||||
- chore(deps): update eslint monorepo to v9.18.0 [`#2858`](https://github.com/th-ch/youtube-music/pull/2858)
|
||||
- chore(deps): update dependency glob to v11.0.1 [`#2857`](https://github.com/th-ch/youtube-music/pull/2857)
|
||||
- chore(deps): update dependency electron-builder-squirrel-windows to v26.0.0-alpha.9 [`#2874`](https://github.com/th-ch/youtube-music/pull/2874)
|
||||
- chore(deps): update dependency electron to v34 [`#2867`](https://github.com/th-ch/youtube-music/pull/2867)
|
||||
- chore(deps): update dependency eslint-config-prettier to v10 [`#2866`](https://github.com/th-ch/youtube-music/pull/2866)
|
||||
- chore(deps): update dependency @stylistic/eslint-plugin-js to v2.13.0 [`#2864`](https://github.com/th-ch/youtube-music/pull/2864)
|
||||
- chore(deps): update dependency typescript-eslint to v8.20.0 [`#2865`](https://github.com/th-ch/youtube-music/pull/2865)
|
||||
- chore(deps): update dependency electron-builder to v26.0.0-alpha.9 [`#2869`](https://github.com/th-ch/youtube-music/pull/2869)
|
||||
- fix: fix build.linux.desktop.entry [`#2859`](https://github.com/th-ch/youtube-music/pull/2859)
|
||||
- feat(api-server): add endpoint to get volume state [`#2813`](https://github.com/th-ch/youtube-music/pull/2813)
|
||||
- chore(deps): update dependency vite-plugin-inspect to v10 [`#2856`](https://github.com/th-ch/youtube-music/pull/2856)
|
||||
- chore(deps): update dependency typescript to v5.7.3 [`#2855`](https://github.com/th-ch/youtube-music/pull/2855)
|
||||
- fix(deps): update dependency @floating-ui/dom to v1.6.13 [`#2846`](https://github.com/th-ch/youtube-music/pull/2846)
|
||||
- chore(deps): bump nanoid from 3.3.7 to 3.3.8 [`#2854`](https://github.com/th-ch/youtube-music/pull/2854)
|
||||
- chore(deps): update dependency electron to v33.3.1 [`#2841`](https://github.com/th-ch/youtube-music/pull/2841)
|
||||
- fix(deps): update dependency i18next to v24.2.1 [`#2840`](https://github.com/th-ch/youtube-music/pull/2840)
|
||||
- chore(deps): update dependency typescript-eslint to v8.19.1 [`#2836`](https://github.com/th-ch/youtube-music/pull/2836)
|
||||
- chore(deps): update dependency rollup to v4.30.1 [`#2833`](https://github.com/th-ch/youtube-music/pull/2833)
|
||||
- fix(deps): update dependency solid-js to v1.9.4 [`#2849`](https://github.com/th-ch/youtube-music/pull/2849)
|
||||
- fix(deps): update dependency fast-equals to v5.2.2 [`#2842`](https://github.com/th-ch/youtube-music/pull/2842)
|
||||
- chore: Update README.md [`#2845`](https://github.com/th-ch/youtube-music/pull/2845)
|
||||
- chore: Fixing the Content section in the README-ru.md file. [`#2847`](https://github.com/th-ch/youtube-music/pull/2847)
|
||||
- chore: Create youtube-music-hu.svg [`#2844`](https://github.com/th-ch/youtube-music/pull/2844)
|
||||
- chore: Create Transalated README-hu.md [`#2843`](https://github.com/th-ch/youtube-music/pull/2843)
|
||||
- chore(deps): update dependency vite to v6.0.7 [`#2819`](https://github.com/th-ch/youtube-music/pull/2819)
|
||||
- chore(deps): update dependency discord-api-types to v0.37.115 [`#2818`](https://github.com/th-ch/youtube-music/pull/2818)
|
||||
- fix(deps): update dependency hono to v4.6.16 [`#2829`](https://github.com/th-ch/youtube-music/pull/2829)
|
||||
- chore(deps): update dependency rollup to v4.29.2 [`#2832`](https://github.com/th-ch/youtube-music/pull/2832)
|
||||
- fix(deps): update dependency fast-equals to v5.2.0 [`#2822`](https://github.com/th-ch/youtube-music/pull/2822)
|
||||
- feat(api-server): add `insertPosition` for `addSongToQueue` [`#2808`](https://github.com/th-ch/youtube-music/pull/2808)
|
||||
- chore(deps): update dependency typescript-eslint to v8.19.0 [`#2812`](https://github.com/th-ch/youtube-music/pull/2812)
|
||||
- fix(deps): update dependency ts-morph to v25 [`#2810`](https://github.com/th-ch/youtube-music/pull/2810)
|
||||
- fix(renderer): update event handler from onVolumeTap to onVolumeClick [`#2791`](https://github.com/th-ch/youtube-music/pull/2791)
|
||||
- fix(deps): update dependency hono to v4.6.15 [`#2796`](https://github.com/th-ch/youtube-music/pull/2796)
|
||||
- chore(deps): update dependency bufferutil to v4.0.9 [`#2787`](https://github.com/th-ch/youtube-music/pull/2787)
|
||||
- feat: Refactor Menu Navigation and Update Media Control Icons [`#2783`](https://github.com/th-ch/youtube-music/pull/2783)
|
||||
- fix(synced-lyrics): Revert font-size behavior for non-fancy modes [`#2788`](https://github.com/th-ch/youtube-music/pull/2788)
|
||||
- fix(downloader): apply poToken [`#2863`](https://github.com/th-ch/youtube-music/issues/2863) [`#2780`](https://github.com/th-ch/youtube-music/issues/2780)
|
||||
- chore(deps): update dependency electron-builder to v26 [`67fc0a4`](https://github.com/th-ch/youtube-music/commit/67fc0a415cae231a11f2846aadf01edb04f5c677)
|
||||
- fix: fix lock file [`3339f99`](https://github.com/th-ch/youtube-music/commit/3339f997e3c2d4d2c32b3aee95c65d561f123fcb)
|
||||
- chore(i18n): Translated using Weblate (Romanian) [`845dac3`](https://github.com/th-ch/youtube-music/commit/845dac3c0393dadea8efdd03ba1f41b1b36e6191)
|
||||
|
||||
#### [v3.7.1](https://github.com/th-ch/youtube-music/compare/v3.7.0...v3.7.1)
|
||||
|
||||
> 27 December 2024
|
||||
|
||||
- fix(deps): update dependency node-html-parser to v7 [`#2776`](https://github.com/th-ch/youtube-music/pull/2776)
|
||||
- chore(deps): update dependency vite to v6.0.6 [`#2774`](https://github.com/th-ch/youtube-music/pull/2774)
|
||||
- feat(api-server): Add queue api [`#2767`](https://github.com/th-ch/youtube-music/pull/2767)
|
||||
- fix(downloader): fix #2234 [`#2234`](https://github.com/th-ch/youtube-music/issues/2234)
|
||||
- fix(downloader): fix #2769 [`#2769`](https://github.com/th-ch/youtube-music/issues/2769)
|
||||
- fix: fix #2645, fix #2741 [`#2645`](https://github.com/th-ch/youtube-music/issues/2645) [`#2741`](https://github.com/th-ch/youtube-music/issues/2741)
|
||||
- Update changelog for v3.7.0 [`1cc1530`](https://github.com/th-ch/youtube-music/commit/1cc153084d5f354ea928fcde50207f8f6b14ea4c)
|
||||
- fix: use networkManager.fetch instead of fetch [`80471b0`](https://github.com/th-ch/youtube-music/commit/80471b0ca4b3d3efc9e3db87d434290c9ebc79f6)
|
||||
- chore(i18n): Translated using Weblate (Hindi) [`6d1237c`](https://github.com/th-ch/youtube-music/commit/6d1237c2a2ad2408a738e00992ae5ed8a1e900da)
|
||||
|
||||
#### [v3.7.0](https://github.com/th-ch/youtube-music/compare/v3.6.2...v3.7.0)
|
||||
|
||||
> 25 December 2024
|
||||
|
||||
- feat(amuse): song query api (add amuse plugin) [`#2723`](https://github.com/th-ch/youtube-music/pull/2723)
|
||||
- feat(api-server): add absolute seek endpoint [`#2748`](https://github.com/th-ch/youtube-music/pull/2748)
|
||||
- feat(api-server): Add repeat mode and seek time API [`#2630`](https://github.com/th-ch/youtube-music/pull/2630)
|
||||
- feat(synced-lyrics): Better-Lyrics Styling for Synced-Lyrics [`#2554`](https://github.com/th-ch/youtube-music/pull/2554)
|
||||
- feat(synced-lyrics): multiple lyric sources [`#2383`](https://github.com/th-ch/youtube-music/pull/2383)
|
||||
- chore(deps): update dependency typescript-eslint to v8.18.2 [`#2763`](https://github.com/th-ch/youtube-music/pull/2763)
|
||||
- chore(deps): update dependency discord-api-types to v0.37.114 [`#2761`](https://github.com/th-ch/youtube-music/pull/2761)
|
||||
- chore(deps): update dependency discord-api-types to v0.37.113 [`#2759`](https://github.com/th-ch/youtube-music/pull/2759)
|
||||
- fix: Set correct window class for X11 and Wayland [`#2758`](https://github.com/th-ch/youtube-music/pull/2758)
|
||||
- feat: Specify flatpak runtime [`#2755`](https://github.com/th-ch/youtube-music/pull/2755)
|
||||
- chore(deps): update dependency rollup to v4.29.1 [`#2749`](https://github.com/th-ch/youtube-music/pull/2749)
|
||||
- chore(deps): update dependency esbuild to v0.24.2 [`#2742`](https://github.com/th-ch/youtube-music/pull/2742)
|
||||
- fix: Add Flatpak permissions needed for MPRIS and tray icon [`#2754`](https://github.com/th-ch/youtube-music/pull/2754)
|
||||
- chore(deps): update dependency vite-plugin-inspect to v0.10.6 [`#2756`](https://github.com/th-ch/youtube-music/pull/2756)
|
||||
- chore(deps): update dependency vite to v6.0.5 [`#2745`](https://github.com/th-ch/youtube-music/pull/2745)
|
||||
- fix(deps): update dependency i18next to v24.2.0 [`#2744`](https://github.com/th-ch/youtube-music/pull/2744)
|
||||
- chore(deps): update dependency vite-plugin-inspect to v0.10.4 [`#2743`](https://github.com/th-ch/youtube-music/pull/2743)
|
||||
- chore(deps): update dependency discord-api-types to v0.37.112 [`#2740`](https://github.com/th-ch/youtube-music/pull/2740)
|
||||
- fix(discord): Fix Album Art failing on Discord RPC [`#2666`](https://github.com/th-ch/youtube-music/pull/2666)
|
||||
- feat: Add equalizer plugin with presets (e.g. bass booster) [`#2575`](https://github.com/th-ch/youtube-music/pull/2575)
|
||||
- chore(deps): update dependency vite to v6.0.4 [`#2738`](https://github.com/th-ch/youtube-music/pull/2738)
|
||||
- fix: Fixed #1796 [`#2736`](https://github.com/th-ch/youtube-music/pull/2736)
|
||||
- chore(deps): update dependency electron-devtools-installer to v4 [`#2734`](https://github.com/th-ch/youtube-music/pull/2734)
|
||||
- Revert "chore(deps): update dependency electron-builder to v25" [`#2732`](https://github.com/th-ch/youtube-music/pull/2732)
|
||||
- chore(deps): update dependency electron-builder to v25 [`#2490`](https://github.com/th-ch/youtube-music/pull/2490)
|
||||
- fix(deps): update dependency i18next to v24.1.2 [`#2727`](https://github.com/th-ch/youtube-music/pull/2727)
|
||||
- chore(deps): update dependency electron-devtools-installer to v3.2.1 [`#2731`](https://github.com/th-ch/youtube-music/pull/2731)
|
||||
- chore(deps): update dependency typescript-eslint to v8.18.1 [`#2724`](https://github.com/th-ch/youtube-music/pull/2724)
|
||||
- fix: tab misalignment [`#2713`](https://github.com/th-ch/youtube-music/pull/2713)
|
||||
- fix(deps): update dependency @hono/zod-validator to v0.4.2 [`#2709`](https://github.com/th-ch/youtube-music/pull/2709)
|
||||
- chore(deps): update eslint monorepo to v9.17.0 [`#2712`](https://github.com/th-ch/youtube-music/pull/2712)
|
||||
- fix(deps): update dependency hono to v4.6.14 [`#2716`](https://github.com/th-ch/youtube-music/pull/2716)
|
||||
- fix: discord rich presence connection status [`#2714`](https://github.com/th-ch/youtube-music/pull/2714)
|
||||
- fix: Laggy scrolling behaviour in large playlists [`#2708`](https://github.com/th-ch/youtube-music/pull/2708)
|
||||
- fix(deps): update dependency youtubei.js to v12.2.0 [`#2705`](https://github.com/th-ch/youtube-music/pull/2705)
|
||||
- fix(deps): update dependency i18next to v24.1.0 [`#2698`](https://github.com/th-ch/youtube-music/pull/2698)
|
||||
- chore(deps): update dependency @stylistic/eslint-plugin-js to v2.12.1 [`#2697`](https://github.com/th-ch/youtube-music/pull/2697)
|
||||
- fix(deps): update dependency zod to v3.24.1 [`#2694`](https://github.com/th-ch/youtube-music/pull/2694)
|
||||
- fix(deps): update dependency youtubei.js to v12.1.0 [`#2695`](https://github.com/th-ch/youtube-music/pull/2695)
|
||||
- chore(deps): update dependency discord-api-types to v0.37.111 [`#2690`](https://github.com/th-ch/youtube-music/pull/2690)
|
||||
- chore(deps): update dependency typescript-eslint to v8.18.0 [`#2692`](https://github.com/th-ch/youtube-music/pull/2692)
|
||||
- chore(deps): update playwright monorepo to v1.49.1 [`#2693`](https://github.com/th-ch/youtube-music/pull/2693)
|
||||
- fix(deps): update dependency hono to v4.6.13 [`#2682`](https://github.com/th-ch/youtube-music/pull/2682)
|
||||
- chore(deps): update dependency rollup to v4.28.1 [`#2683`](https://github.com/th-ch/youtube-music/pull/2683)
|
||||
- fix(deps): update dependency conf to v13.1.0 [`#2686`](https://github.com/th-ch/youtube-music/pull/2686)
|
||||
- chore(deps): update dependency @stylistic/eslint-plugin-js to v2.12.0 [`#2689`](https://github.com/th-ch/youtube-music/pull/2689)
|
||||
- fix(deps): update dependency youtubei.js to v12 [`#2681`](https://github.com/th-ch/youtube-music/pull/2681)
|
||||
- chore(deps): update dependency vite to v6.0.3 [`#2680`](https://github.com/th-ch/youtube-music/pull/2680)
|
||||
- fix(album-actions): Fixed #2312 [`#2676`](https://github.com/th-ch/youtube-music/pull/2676)
|
||||
- chore(deps): update dependency eslint-import-resolver-typescript to v3.7.0 [`#2672`](https://github.com/th-ch/youtube-music/pull/2672)
|
||||
- chore(deps): update dependency node-gyp to v11 [`#2678`](https://github.com/th-ch/youtube-music/pull/2678)
|
||||
- fix(deps): update dependency i18next to v24.0.5 [`#2669`](https://github.com/th-ch/youtube-music/pull/2669)
|
||||
- fix(deps): update dependency i18next to v24.0.4 [`#2668`](https://github.com/th-ch/youtube-music/pull/2668)
|
||||
- chore(deps): update dependency vite to v6.0.2 [`#2662`](https://github.com/th-ch/youtube-music/pull/2662)
|
||||
- chore(deps): update dependency node-gyp to v10.3.1 [`#2665`](https://github.com/th-ch/youtube-music/pull/2665)
|
||||
- chore(deps): update dependency typescript-eslint to v8.17.0 [`#2664`](https://github.com/th-ch/youtube-music/pull/2664)
|
||||
- chore(deps): update dependency vite-plugin-inspect to v0.10.3 [`#2667`](https://github.com/th-ch/youtube-music/pull/2667)
|
||||
- chore(deps): update dependency rollup to v4.28.0 [`#2661`](https://github.com/th-ch/youtube-music/pull/2661)
|
||||
- chore(deps): update dependency discord-api-types to v0.37.110 [`#2653`](https://github.com/th-ch/youtube-music/pull/2653)
|
||||
- fix(deps): update dependency @hono/zod-openapi to v0.18.3 [`#2654`](https://github.com/th-ch/youtube-music/pull/2654)
|
||||
- chore(deps): update eslint monorepo to v9.16.0 [`#2656`](https://github.com/th-ch/youtube-music/pull/2656)
|
||||
- chore(deps): update dependency vite-plugin-inspect to v0.10.2 [`#2657`](https://github.com/th-ch/youtube-music/pull/2657)
|
||||
- fix(youtube-music.css): Fixed #2514 [`#2659`](https://github.com/th-ch/youtube-music/pull/2659)
|
||||
- fix: Fixed Skip Disliked Song not working [`#2651`](https://github.com/th-ch/youtube-music/pull/2651)
|
||||
- fix(deps): update dependency @hono/zod-openapi to v0.18.2 [`#2650`](https://github.com/th-ch/youtube-music/pull/2650)
|
||||
- chore(deps): update dependency vite-plugin-inspect to v0.10.1 [`#2652`](https://github.com/th-ch/youtube-music/pull/2652)
|
||||
- chore(deps): update dependency electron to v33.2.1 [`#2649`](https://github.com/th-ch/youtube-music/pull/2649)
|
||||
- chore(deps): update dependency vite-plugin-inspect to v0.10.0 [`#2646`](https://github.com/th-ch/youtube-music/pull/2646)
|
||||
- chore(deps): update dependency vite to v6 [`#2644`](https://github.com/th-ch/youtube-music/pull/2644)
|
||||
- fix(deps): update dependency @hono/swagger-ui to v0.5.0 [`#2643`](https://github.com/th-ch/youtube-music/pull/2643)
|
||||
- chore(deps): update dependency discord-api-types to v0.37.109 [`#2642`](https://github.com/th-ch/youtube-music/pull/2642)
|
||||
- chore(deps): update dependency vite-plugin-solid to v2.11.0 [`#2641`](https://github.com/th-ch/youtube-music/pull/2641)
|
||||
- fix(deps): update dependency hono to v4.6.12 [`#2636`](https://github.com/th-ch/youtube-music/pull/2636)
|
||||
- fix(deps): update dependency i18next to v24.0.2 [`#2637`](https://github.com/th-ch/youtube-music/pull/2637)
|
||||
- chore(deps): update dependency discord-api-types to v0.37.108 [`#2638`](https://github.com/th-ch/youtube-music/pull/2638)
|
||||
- chore(deps): update dependency typescript-eslint to v8.16.0 [`#2639`](https://github.com/th-ch/youtube-music/pull/2639)
|
||||
- chore(deps): update dependency rollup to v4.27.4 [`#2632`](https://github.com/th-ch/youtube-music/pull/2632)
|
||||
- fix(deps): update dependency i18next to v24 [`#2633`](https://github.com/th-ch/youtube-music/pull/2633)
|
||||
- chore(deps): update dependency typescript to v5.7.2 [`#2629`](https://github.com/th-ch/youtube-music/pull/2629)
|
||||
- chore(deps): update dependency discord-api-types to v0.37.107 [`#2627`](https://github.com/th-ch/youtube-music/pull/2627)
|
||||
- fix(deps): update dependency @hono/zod-openapi to v0.18.0 [`#2626`](https://github.com/th-ch/youtube-music/pull/2626)
|
||||
- fix(deps): update dependency i18next to v23.16.8 [`#2625`](https://github.com/th-ch/youtube-music/pull/2625)
|
||||
- chore(deps): update dependency vite-plugin-inspect to v0.8.8 [`#2623`](https://github.com/th-ch/youtube-music/pull/2623)
|
||||
- fix(deps): update dependency hono to v4.6.11 [`#2624`](https://github.com/th-ch/youtube-music/pull/2624)
|
||||
- chore(deps): update playwright monorepo to v1.49.0 [`#2617`](https://github.com/th-ch/youtube-music/pull/2617)
|
||||
- chore(deps): update dependency rollup to v4.27.3 [`#2610`](https://github.com/th-ch/youtube-music/pull/2610)
|
||||
- chore(deps): update dependency typescript-eslint to v8.15.0 [`#2611`](https://github.com/th-ch/youtube-music/pull/2611)
|
||||
- chore(deps): update dependency @stylistic/eslint-plugin-js to v2.11.0 [`#2618`](https://github.com/th-ch/youtube-music/pull/2618)
|
||||
- chore(deps): update dependency discord-api-types to v0.37.105 [`#2603`](https://github.com/th-ch/youtube-music/pull/2603)
|
||||
- chore(deps): update dependency rollup to v4.27.2 [`#2604`](https://github.com/th-ch/youtube-music/pull/2604)
|
||||
- chore(deps): update eslint monorepo to v9.15.0 [`#2607`](https://github.com/th-ch/youtube-music/pull/2607)
|
||||
- fix(deps): update dependency @hono/zod-openapi to v0.17.1 [`#2608`](https://github.com/th-ch/youtube-music/pull/2608)
|
||||
- fix(ambient-mode): fix ambient-mode overlapping other elements [`#2609`](https://github.com/th-ch/youtube-music/pull/2609)
|
||||
- fix: Allow media playback control (MPRIS) for flatpak [`#2606`](https://github.com/th-ch/youtube-music/pull/2606)
|
||||
- fix(deps): update dependency @hono/node-server to v1.13.7 [`#2598`](https://github.com/th-ch/youtube-music/pull/2598)
|
||||
- chore(deps): update dependency rollup to v4.26.0 [`#2600`](https://github.com/th-ch/youtube-music/pull/2600)
|
||||
- fix(deps): update dependency hono to v4.6.10 [`#2601`](https://github.com/th-ch/youtube-music/pull/2601)
|
||||
- fix(deps): update dependency @hono/node-server to v1.13.6 [`#2594`](https://github.com/th-ch/youtube-music/pull/2594)
|
||||
- chore(deps): update dependency vite to v5.4.11 [`#2595`](https://github.com/th-ch/youtube-music/pull/2595)
|
||||
- chore(deps): update dependency typescript-eslint to v8.14.0 [`#2596`](https://github.com/th-ch/youtube-music/pull/2596)
|
||||
- chore(deps): update dependency electron to v33.2.0 [`#2591`](https://github.com/th-ch/youtube-music/pull/2591)
|
||||
- fix(deps): update dependency @hono/zod-openapi to v0.17.0 [`#2592`](https://github.com/th-ch/youtube-music/pull/2592)
|
||||
- fix(deps): update dependency i18next to v23.16.5 [`#2589`](https://github.com/th-ch/youtube-music/pull/2589)
|
||||
- fix(deps): update dependency @hono/node-server to v1.13.5 [`#2578`](https://github.com/th-ch/youtube-music/pull/2578)
|
||||
- fix(deps): update dependency hono to v4.6.9 [`#2579`](https://github.com/th-ch/youtube-music/pull/2579)
|
||||
- chore(deps): update dependency discord-api-types to v0.37.104 [`#2588`](https://github.com/th-ch/youtube-music/pull/2588)
|
||||
- chore(deps): update dependency typescript-eslint to v8.13.0 [`#2581`](https://github.com/th-ch/youtube-music/pull/2581)
|
||||
- chore(deps): update dependency rollup to v4.25.0 [`#2580`](https://github.com/th-ch/youtube-music/pull/2580)
|
||||
- chore(docs): Update screenshot [`#2587`](https://github.com/th-ch/youtube-music/pull/2587)
|
||||
- chore(docs): Specify full path to xattr for macOS, fixes #2583 [`#2586`](https://github.com/th-ch/youtube-music/pull/2586)
|
||||
- fix: callback for time-changed event [`#2577`](https://github.com/th-ch/youtube-music/pull/2577)
|
||||
- chore(deps): update eslint monorepo to v9.14.0 [`#2573`](https://github.com/th-ch/youtube-music/pull/2573)
|
||||
- chore(deps): update dependency utf-8-validate to v6.0.5 [`#2572`](https://github.com/th-ch/youtube-music/pull/2572)
|
||||
- chore(deps): update dependency @stylistic/eslint-plugin-js to v2.10.1 [`#2571`](https://github.com/th-ch/youtube-music/pull/2571)
|
||||
- fix(deps): update dependency @hono/node-server to v1.13.4 [`#2570`](https://github.com/th-ch/youtube-music/pull/2570)
|
||||
- chore(deps): update dependency @stylistic/eslint-plugin-js to v2.10.0 [`#2569`](https://github.com/th-ch/youtube-music/pull/2569)
|
||||
- fix(deps): update dependency @floating-ui/dom to v1.6.12 [`#2568`](https://github.com/th-ch/youtube-music/pull/2568)
|
||||
- chore(deps): update dependency rollup to v4.24.3 [`#2565`](https://github.com/th-ch/youtube-music/pull/2565)
|
||||
- fix(deps): update dependency hono to v4.6.8 [`#2564`](https://github.com/th-ch/youtube-music/pull/2564)
|
||||
- chore(deps): update dependency typescript-eslint to v8.12.2 [`#2563`](https://github.com/th-ch/youtube-music/pull/2563)
|
||||
- chore(deps): update dependency typescript-eslint to v8.12.0 [`#2561`](https://github.com/th-ch/youtube-music/pull/2561)
|
||||
- fix(deps): update dependency youtubei.js to v11 [`#2562`](https://github.com/th-ch/youtube-music/pull/2562)
|
||||
- chore(deps): update dependency rollup to v4.24.2 [`#2559`](https://github.com/th-ch/youtube-music/pull/2559)
|
||||
- fix(deps): update dependency @hono/node-server to v1.13.3 [`#2560`](https://github.com/th-ch/youtube-music/pull/2560)
|
||||
- fix(deps): update dependency i18next to v23.16.4 [`#2550`](https://github.com/th-ch/youtube-music/pull/2550)
|
||||
- chore(deps): update playwright monorepo to v1.48.2 [`#2551`](https://github.com/th-ch/youtube-music/pull/2551)
|
||||
- fix(deps): update dependency hono to v4.6.7 [`#2552`](https://github.com/th-ch/youtube-music/pull/2552)
|
||||
- chore(deps): update dependency @babel/runtime to v7.26.0 [`#2548`](https://github.com/th-ch/youtube-music/pull/2548)
|
||||
- chore(deps): update dependency @types/color to v4 [`#2547`](https://github.com/th-ch/youtube-music/pull/2547)
|
||||
- fix(deps): update dependency i18next to v23.16.3 [`#2545`](https://github.com/th-ch/youtube-music/pull/2545)
|
||||
- fix(deps): update dependency solid-js to v1.9.3 [`#2541`](https://github.com/th-ch/youtube-music/pull/2541)
|
||||
- chore(deps): update dependency vite to v5.4.10 [`#2542`](https://github.com/th-ch/youtube-music/pull/2542)
|
||||
- chore(deps): update dependency electron to v33.0.2 [`#2537`](https://github.com/th-ch/youtube-music/pull/2537)
|
||||
- chore(deps): update dependency @babel/runtime to v7.25.9 [`#2538`](https://github.com/th-ch/youtube-music/pull/2538)
|
||||
- chore(deps): update dependency discord-api-types to v0.37.103 [`#2532`](https://github.com/th-ch/youtube-music/pull/2532)
|
||||
- chore(deps): update dependency typescript-eslint to v8.11.0 [`#2534`](https://github.com/th-ch/youtube-music/pull/2534)
|
||||
- fix(deps): update dependency hono to v4.6.6 [`#2536`](https://github.com/th-ch/youtube-music/pull/2536)
|
||||
- fix(tuna-obs): Added song url to tuna-obs plugin [`#2524`](https://github.com/th-ch/youtube-music/pull/2524)
|
||||
- fix(deps): update dependency i18next to v23.16.2 [`#2530`](https://github.com/th-ch/youtube-music/pull/2530)
|
||||
- fix(deps): update dependency i18next to v23.16.1 [`#2529`](https://github.com/th-ch/youtube-music/pull/2529)
|
||||
- chore(deps): update eslint monorepo to v9.13.0 [`#2528`](https://github.com/th-ch/youtube-music/pull/2528)
|
||||
- chore(deps): update dependency typescript-eslint to v8.10.0 [`#2527`](https://github.com/th-ch/youtube-music/pull/2527)
|
||||
- chore(deps): update playwright monorepo to v1.48.1 [`#2516`](https://github.com/th-ch/youtube-music/pull/2516)
|
||||
- chore(deps): update dependency electron to v33.0.1 [`#2523`](https://github.com/th-ch/youtube-music/pull/2523)
|
||||
- fix: disable gpu memory buffer video frames [`#2519`](https://github.com/th-ch/youtube-music/pull/2519)
|
||||
- fix: use HEAD instead of GET in songInfo.imageSrc validation step [`#2766`](https://github.com/th-ch/youtube-music/issues/2766)
|
||||
- fix: Fixed #1796 (#2736) [`#1796`](https://github.com/th-ch/youtube-music/issues/1796)
|
||||
- fix(album-actions): Fixed #2312 (#2676) [`#2312`](https://github.com/th-ch/youtube-music/issues/2312) [`#2312`](https://github.com/th-ch/youtube-music/issues/2312)
|
||||
- fix(youtube-music.css): Fixed #2514 (#2659) [`#2514`](https://github.com/th-ch/youtube-music/issues/2514)
|
||||
- chore(docs): Specify full path to xattr for macOS, fixes #2583 (#2586) [`#2583`](https://github.com/th-ch/youtube-music/issues/2583)
|
||||
- fix: fix pnpm-lock.yaml [`3208bf4`](https://github.com/th-ch/youtube-music/commit/3208bf4a6d47d824875b06bd031299694482f02d)
|
||||
- Revert "feat: use swc and lightningcss" [`3b50cbc`](https://github.com/th-ch/youtube-music/commit/3b50cbcb6e3163115d52f05075af5d6f25b80660)
|
||||
- feat: use swc and lightningcss [`ae3a289`](https://github.com/th-ch/youtube-music/commit/ae3a28900576ea388666747bc4794577e1d57e23)
|
||||
|
||||
#### [v3.6.2](https://github.com/th-ch/youtube-music/compare/v3.6.1...v3.6.2)
|
||||
|
||||
> 16 October 2024
|
||||
|
||||
- fix(deps): update dependency serve to v14.2.4 [`#2515`](https://github.com/th-ch/youtube-music/pull/2515)
|
||||
- fix(deps): update dependency hono to v4.6.5 [`#2509`](https://github.com/th-ch/youtube-music/pull/2509)
|
||||
- chore(deps): update dependency vite to v5.4.9 [`#2500`](https://github.com/th-ch/youtube-music/pull/2500)
|
||||
- fix(api-server): properly implement next api call [`#2505`](https://github.com/th-ch/youtube-music/pull/2505)
|
||||
- chore(deps): update dependency electron to v33 [`#2507`](https://github.com/th-ch/youtube-music/pull/2507)
|
||||
- chore(deps): update dependency typescript-eslint to v8.9.0 [`#2503`](https://github.com/th-ch/youtube-music/pull/2503)
|
||||
- chore(deps): update dependency discord-api-types to v0.37.102 [`#2501`](https://github.com/th-ch/youtube-music/pull/2501)
|
||||
- fix: trustedTypes issue [`#2339`](https://github.com/th-ch/youtube-music/issues/2339)
|
||||
- chore(i18n): Translated using Weblate (Icelandic) [`5f79b7e`](https://github.com/th-ch/youtube-music/commit/5f79b7e788c47b0a27a4967c9f3a9e20b483cd75)
|
||||
- chore(i18n): Translated using Weblate (Chinese (Traditional Han script)) [`12d6939`](https://github.com/th-ch/youtube-music/commit/12d693921e26a5c54015673a404e005d1a7175a4)
|
||||
- chore(i18n): Translated using Weblate (Ukrainian) [`836cedb`](https://github.com/th-ch/youtube-music/commit/836cedb0f317b74bf2fc3ec2d1aa865719f46ec0)
|
||||
|
||||
#### [v3.6.1](https://github.com/th-ch/youtube-music/compare/v3.6.0...v3.6.1)
|
||||
|
||||
> 14 October 2024
|
||||
|
||||
- fix(api-server): Various fixes and improvements [`#2496`](https://github.com/th-ch/youtube-music/pull/2496)
|
||||
- fix(deps): update dependency electron-debug to v4.1.0 [`#2499`](https://github.com/th-ch/youtube-music/pull/2499)
|
||||
- fix(renderer): fix force like buttons display logic [`#2493`](https://github.com/th-ch/youtube-music/pull/2493)
|
||||
- fix(deps): update dependency i18next to v23.16.0 [`#2492`](https://github.com/th-ch/youtube-music/pull/2492)
|
||||
- fix(downloader): fix #2371 [`#2371`](https://github.com/th-ch/youtube-music/issues/2371)
|
||||
- fix(ytm-bugs): incorrect video ratio [`#2459`](https://github.com/th-ch/youtube-music/issues/2459)
|
||||
- fix(api-server): fix init/authentication error [`#2497`](https://github.com/th-ch/youtube-music/issues/2497)
|
||||
- fix: RSS feed CORS issue [`#1620`](https://github.com/th-ch/youtube-music/issues/1620)
|
||||
- chore(flatpak-builder): Add more details when failing [`d3acb49`](https://github.com/th-ch/youtube-music/commit/d3acb4945a8dcde6598c53d8207bbf16eda8c739)
|
||||
- chore(i18n): Translated using Weblate (Filipino) [`e428708`](https://github.com/th-ch/youtube-music/commit/e4287085a11f30d141148ab0432cc684819fd0d0)
|
||||
- Bump version to 3.6.1 [`b668730`](https://github.com/th-ch/youtube-music/commit/b6687307dfe7ef765517019093c8db3c2ad14417)
|
||||
|
||||
#### [v3.6.0](https://github.com/th-ch/youtube-music/compare/v3.5.3...v3.6.0)
|
||||
|
||||
> 13 October 2024
|
||||
|
||||
- feat(api-server): remote control api [`#1909`](https://github.com/th-ch/youtube-music/pull/1909)
|
||||
- chore(deps): update playwright monorepo to v1.48.0 [`#2489`](https://github.com/th-ch/youtube-music/pull/2489)
|
||||
- fix(`synced-lyrics`): Fix 2 issues [`#2441`](https://github.com/th-ch/youtube-music/pull/2441)
|
||||
- chore(deps): update dependency typescript to v5.6.3 [`#2486`](https://github.com/th-ch/youtube-music/pull/2486)
|
||||
- chore(deps): update dependency electron to v32.2.0 [`#2487`](https://github.com/th-ch/youtube-music/pull/2487)
|
||||
- chore(deps): update dependency del-cli to v6 [`#2475`](https://github.com/th-ch/youtube-music/pull/2475)
|
||||
- chore(deps): update dependency typescript-eslint to v8.8.1 [`#2477`](https://github.com/th-ch/youtube-music/pull/2477)
|
||||
- fix(deps): update dependency solid-js to v1.9.2 [`#2480`](https://github.com/th-ch/youtube-music/pull/2480)
|
||||
- Revert "chore(deps): update dependency electron-builder to v25" [`#2488`](https://github.com/th-ch/youtube-music/pull/2488)
|
||||
- chore(deps): update dependency electron-builder to v25 [`#2406`](https://github.com/th-ch/youtube-music/pull/2406)
|
||||
- fix(deps): update dependency deepmerge-ts to v7.1.3 [`#2481`](https://github.com/th-ch/youtube-music/pull/2481)
|
||||
- fix(deps): update dependency ts-morph to v24 [`#2474`](https://github.com/th-ch/youtube-music/pull/2474)
|
||||
- fix(deps): update dependency i18next to v23.15.2 [`#2471`](https://github.com/th-ch/youtube-music/pull/2471)
|
||||
- chore(deps): update eslint monorepo to v9.12.0 [`#2470`](https://github.com/th-ch/youtube-music/pull/2470)
|
||||
- chore(deps): update dependency @stylistic/eslint-plugin-js to v2.9.0 [`#2469`](https://github.com/th-ch/youtube-music/pull/2469)
|
||||
- chore(deps): bump micromatch from 4.0.5 to 4.0.8 [`#2465`](https://github.com/th-ch/youtube-music/pull/2465)
|
||||
- chore(deps): bump braces from 3.0.2 to 3.0.3 [`#2466`](https://github.com/th-ch/youtube-music/pull/2466)
|
||||
- fix(deps): update dependency electron-updater to v6.3.9 [`#2468`](https://github.com/th-ch/youtube-music/pull/2468)
|
||||
- fix(deps): update dependency deepmerge-ts to v7.1.1 [`#2467`](https://github.com/th-ch/youtube-music/pull/2467)
|
||||
- chore(deps): update dependency typescript-eslint to v8.8.0 [`#2457`](https://github.com/th-ch/youtube-music/pull/2457)
|
||||
- chore(deps): update dependency @babel/runtime to v7.25.7 [`#2462`](https://github.com/th-ch/youtube-music/pull/2462)
|
||||
- chore(deps): update dependency rollup to v4.24.0 [`#2458`](https://github.com/th-ch/youtube-music/pull/2458)
|
||||
- chore(deps): update dependency eslint-plugin-import to v2.31.0 [`#2464`](https://github.com/th-ch/youtube-music/pull/2464)
|
||||
- chore(deps): update dependency rollup to v4.22.5 [`#2448`](https://github.com/th-ch/youtube-music/pull/2448)
|
||||
- chore(deps): update dependency typescript-eslint to v8.7.0 [`#2450`](https://github.com/th-ch/youtube-music/pull/2450)
|
||||
- fix(deps): update dependency solid-js to v1.9.1 [`#2451`](https://github.com/th-ch/youtube-music/pull/2451)
|
||||
- chore(deps): update dependency vite to v5.4.8 [`#2449`](https://github.com/th-ch/youtube-music/pull/2449)
|
||||
- chore(deps): update dependency discord-api-types to v0.37.101 [`#2440`](https://github.com/th-ch/youtube-music/pull/2440)
|
||||
- chore(deps): update dependency esbuild to v0.24.0 [`#2439`](https://github.com/th-ch/youtube-music/pull/2439)
|
||||
- chore(deps): update eslint monorepo to v9.11.1 [`#2442`](https://github.com/th-ch/youtube-music/pull/2442)
|
||||
- chore(deps): update dependency @types/howler to v2.2.12 [`#2443`](https://github.com/th-ch/youtube-music/pull/2443)
|
||||
- chore(deps): update dependency vite to v5.4.7 [`#2434`](https://github.com/th-ch/youtube-music/pull/2434)
|
||||
- chore(deps): update playwright monorepo to v1.47.2 [`#2436`](https://github.com/th-ch/youtube-music/pull/2436)
|
||||
- chore(deps): update eslint monorepo to v9.11.0 [`#2437`](https://github.com/th-ch/youtube-music/pull/2437)
|
||||
- fix(deps): update dependency youtubei.js to v10.5.0 [`#2431`](https://github.com/th-ch/youtube-music/pull/2431)
|
||||
- chore(deps): update dependency rollup to v4.22.4 [`#2430`](https://github.com/th-ch/youtube-music/pull/2430)
|
||||
- chore(deps): update dependency electron to v32.1.2 [`#2433`](https://github.com/th-ch/youtube-music/pull/2433)
|
||||
- feat: ESLint Flat Config (v9 support #2229) [`#2426`](https://github.com/th-ch/youtube-music/pull/2426)
|
||||
- fix(taskbar-mediacontrol): fix icon color [`#2485`](https://github.com/th-ch/youtube-music/issues/2485)
|
||||
- chore(eslint): apply eslint-plugin-prettier [`#2438`](https://github.com/th-ch/youtube-music/issues/2438)
|
||||
- fix: apply fix from eslint [`cb1381b`](https://github.com/th-ch/youtube-music/commit/cb1381bbb394e2bbb404f44817ef96411dabc8a9)
|
||||
- chore(i18n): Translated using Weblate (Portuguese (Brazil)) [`bcff26c`](https://github.com/th-ch/youtube-music/commit/bcff26c85b18258806f3960309776bc860c3a54e)
|
||||
- chore(i18n): Translated using Weblate (Persian) [`ead448e`](https://github.com/th-ch/youtube-music/commit/ead448ed98095339557903eb0f84c4a6d0f32058)
|
||||
|
||||
#### [v3.5.3](https://github.com/th-ch/youtube-music/compare/v3.5.2...v3.5.3)
|
||||
|
||||
> 17 September 2024
|
||||
|
||||
- fix: fix `trustedHTML` issue [`#2339`](https://github.com/th-ch/youtube-music/issues/2339)
|
||||
- chore(deps): update dependency rollup to v4.21.3 [`6edc84a`](https://github.com/th-ch/youtube-music/commit/6edc84a8bd6c7e009041117ba0d2004783eb3a47)
|
||||
- chore(deps): update typescript-eslint monorepo to v8.6.0 [`d4c8a43`](https://github.com/th-ch/youtube-music/commit/d4c8a4320d733f7bddc4dcd1de93644790e71d66)
|
||||
- chore(deps): update dependency eslint to v8.57.1 [`02b7a39`](https://github.com/th-ch/youtube-music/commit/02b7a39753528cfd8c0d107d6d2ec6ef78c5afe7)
|
||||
|
||||
#### [v3.5.2](https://github.com/th-ch/youtube-music/compare/v3.5.1...v3.5.2)
|
||||
|
||||
> 7 September 2024
|
||||
|
||||
- chore(deps): update typescript-eslint monorepo to v8.4.0 [`#2401`](https://github.com/th-ch/youtube-music/pull/2401)
|
||||
- chore(deps): update dependency @total-typescript/ts-reset to v0.6.1 [`#2396`](https://github.com/th-ch/youtube-music/pull/2396)
|
||||
- chore(deps): update dependency electron to v31.5.0 [`#2397`](https://github.com/th-ch/youtube-music/pull/2397)
|
||||
- chore(deps): update dependency eslint-import-resolver-typescript to v3.6.3 [`#2376`](https://github.com/th-ch/youtube-music/pull/2376)
|
||||
- chore(deps): update dependency discord-api-types to v0.37.100 [`#2394`](https://github.com/th-ch/youtube-music/pull/2394)
|
||||
- fix(deps): update dependency electron-updater to v6.3.4 [`#2395`](https://github.com/th-ch/youtube-music/pull/2395)
|
||||
- chore(deps): update dependency @babel/runtime to v7.25.6 [`#2388`](https://github.com/th-ch/youtube-music/pull/2388)
|
||||
- chore(deps): update dependency vite-plugin-inspect to v0.8.7 [`#2389`](https://github.com/th-ch/youtube-music/pull/2389)
|
||||
- chore(deps): update dependency discord-api-types to v0.37.99 [`#2374`](https://github.com/th-ch/youtube-music/pull/2374)
|
||||
- chore(deps): update dependency vite to v5.4.3 [`#2377`](https://github.com/th-ch/youtube-music/pull/2377)
|
||||
- fix: incorrect regex when splitting artistName [`#2378`](https://github.com/th-ch/youtube-music/pull/2378)
|
||||
- chore(deps): update dependency @babel/runtime to v7.25.4 [`#2373`](https://github.com/th-ch/youtube-music/pull/2373)
|
||||
- synced-lyrics: make the lyrics search more reliable [`#2343`](https://github.com/th-ch/youtube-music/pull/2343)
|
||||
- fix(deps): update dependency solid-js to v1.8.22 [`#2354`](https://github.com/th-ch/youtube-music/pull/2354)
|
||||
- chore(deps): update typescript-eslint monorepo to v8.3.0 [`#2350`](https://github.com/th-ch/youtube-music/pull/2350)
|
||||
- fix(deps): update dependency electron-debug to v4.0.1 [`#2349`](https://github.com/th-ch/youtube-music/pull/2349)
|
||||
- chore(deps): update dependency electron to v31.4.0 [`#2356`](https://github.com/th-ch/youtube-music/pull/2356)
|
||||
- fix: hide native-controls on linux when in-app-menu is used [`#2366`](https://github.com/th-ch/youtube-music/pull/2366)
|
||||
- fix: detect the upgrade btn using the icon [`#2364`](https://github.com/th-ch/youtube-music/pull/2364)
|
||||
- fix: exclude build-id files from rpm [`#2361`](https://github.com/th-ch/youtube-music/pull/2361)
|
||||
- fix(deps): update dependency i18next to v23.12.3 [`#2352`](https://github.com/th-ch/youtube-music/pull/2352)
|
||||
- fix(deps): update dependency @floating-ui/dom to v1.6.10 [`#2340`](https://github.com/th-ch/youtube-music/pull/2340)
|
||||
- fix(deps): update dependency electron-updater to v6.3.3 [`#2347`](https://github.com/th-ch/youtube-music/pull/2347)
|
||||
- fix(deps): update dependency solid-js to v1.8.20 [`#2345`](https://github.com/th-ch/youtube-music/pull/2345)
|
||||
- chore(deps): update dependency vite to v5.4.0 [`#2342`](https://github.com/th-ch/youtube-music/pull/2342)
|
||||
- chore(deps): update typescript-eslint monorepo to v8.0.1 [`#2335`](https://github.com/th-ch/youtube-music/pull/2335)
|
||||
- fix(deps): update dependency @floating-ui/dom to v1.6.9 [`#2337`](https://github.com/th-ch/youtube-music/pull/2337)
|
||||
- chore(deps): update playwright monorepo to v1.46.0 [`#2336`](https://github.com/th-ch/youtube-music/pull/2336)
|
||||
- chore(README): Translation README to Russian and adding Synced Lyrics to main README [`#2338`](https://github.com/th-ch/youtube-music/pull/2338)
|
||||
- chore(deps): update dependency rollup to v4.20.0 [`#2326`](https://github.com/th-ch/youtube-music/pull/2326)
|
||||
- fix(synced-lyric): fix timestamp [`#2323`](https://github.com/th-ch/youtube-music/issues/2323) [`#2379`](https://github.com/th-ch/youtube-music/issues/2379)
|
||||
- Revert "fix(MPRIS): Prevents player to start with invalid MPRIS interface (#1996)" [`#2225`](https://github.com/th-ch/youtube-music/issues/2225)
|
||||
- fix(adblocker/inplayer): fix Response.prototype.json [`#2310`](https://github.com/th-ch/youtube-music/issues/2310)
|
||||
- chore(deps): update dependency eslint-plugin-import to v2.30.0 [`f48e46d`](https://github.com/th-ch/youtube-music/commit/f48e46d29cf09c76c5172fd56d2d0f705616e4e3)
|
||||
- Revert "chore(deps): update dependency electron-builder to v25" [`089eff3`](https://github.com/th-ch/youtube-music/commit/089eff3152903c8b55ad3e5571b944062a647e27)
|
||||
- chore(deps): update dependency electron-builder to v25 [`fe4c89c`](https://github.com/th-ch/youtube-music/commit/fe4c89c349bb9f4f54d95c2018943095ccfdab0c)
|
||||
|
||||
#### [v3.5.1](https://github.com/th-ch/youtube-music/compare/v3.5.0...v3.5.1)
|
||||
|
||||
> 1 August 2024
|
||||
|
||||
- fix(deps): update dependency youtubei.js to v10.3.0 [`#2306`](https://github.com/th-ch/youtube-music/pull/2306)
|
||||
- fix: Window gets stuck offscreen in some instances [`#2303`](https://github.com/th-ch/youtube-music/pull/2303)
|
||||
- fix: Incorrect window size on multi-monitor scaled displays [`#2302`](https://github.com/th-ch/youtube-music/pull/2302)
|
||||
- chore(deps): update dependency rollup to v4.19.2 [`#2304`](https://github.com/th-ch/youtube-music/pull/2304)
|
||||
- chore(deps): update typescript-eslint monorepo to v8 (major) [`#2297`](https://github.com/th-ch/youtube-music/pull/2297)
|
||||
- fix(ambient-mode): fix ambient-mode not working for videos after restart [`#2294`](https://github.com/th-ch/youtube-music/pull/2294)
|
||||
- fix(deps): update dependency @xhayper/discord-rpc to v1.2.0 [`#2291`](https://github.com/th-ch/youtube-music/pull/2291)
|
||||
- fix(synced-lyrics): fix lyric load [`#2295`](https://github.com/th-ch/youtube-music/issues/2295)
|
||||
- fix(ambient-mode): fix ambient-mode not working for videos after restart (#2294) [`#1641`](https://github.com/th-ch/youtube-music/issues/1641)
|
||||
- fix(synced-lyrics): fix i18n [`8750b54`](https://github.com/th-ch/youtube-music/commit/8750b54f766c735ff039c6be454427f17d4737e2)
|
||||
- ts-fix: disambiguate ElectronStore typings [`8775735`](https://github.com/th-ch/youtube-music/commit/877573532c1b68af861a3fdc44d093f3097d36ab)
|
||||
- chore(i18n): Translated using Weblate (Hungarian) [`3537dc1`](https://github.com/th-ch/youtube-music/commit/3537dc19eecce7f7deb2478942f70d3c7b72148d)
|
||||
|
||||
#### [v3.5.0](https://github.com/th-ch/youtube-music/compare/v3.4.1...v3.5.0)
|
||||
|
||||
> 31 July 2024
|
||||
|
||||
- plugin: Synced Lyrics [`#2207`](https://github.com/th-ch/youtube-music/pull/2207)
|
||||
- chore(deps): update dependency electron to v31.3.1 [`#2290`](https://github.com/th-ch/youtube-music/pull/2290)
|
||||
- chore(deps): update typescript-eslint monorepo to v7.18.0 [`#2292`](https://github.com/th-ch/youtube-music/pull/2292)
|
||||
- fix(deps): update dependency youtubei.js to v10.2.0 [`#2285`](https://github.com/th-ch/youtube-music/pull/2285)
|
||||
- chore(deps): update dependency electron to v31.3.0 [`#2282`](https://github.com/th-ch/youtube-music/pull/2282)
|
||||
- chore(deps): update typescript-eslint monorepo to v7.17.0 [`#2283`](https://github.com/th-ch/youtube-music/pull/2283)
|
||||
- fix(deps): update dependency solid-js to v1.8.19 [`#2280`](https://github.com/th-ch/youtube-music/pull/2280)
|
||||
- fix(deps): update dependency @xhayper/discord-rpc to v1.1.4 [`#2279`](https://github.com/th-ch/youtube-music/pull/2279)
|
||||
- chore(deps): update dependency @babel/runtime to v7.25.0 [`#2281`](https://github.com/th-ch/youtube-music/pull/2281)
|
||||
- fix(deps): update dependency @floating-ui/dom to v1.6.8 [`#2278`](https://github.com/th-ch/youtube-music/pull/2278)
|
||||
- Fix: Incorrect window size on scaled displays [`#2258`](https://github.com/th-ch/youtube-music/pull/2258)
|
||||
- chore(deps): update dependency vite-plugin-resolve to v2.5.2 [`#2276`](https://github.com/th-ch/youtube-music/pull/2276)
|
||||
- chore(deps): update playwright monorepo to v1.45.3 [`#2277`](https://github.com/th-ch/youtube-music/pull/2277)
|
||||
- fix(deps): update dependency deepmerge-ts to v7.1.0 [`#2263`](https://github.com/th-ch/youtube-music/pull/2263)
|
||||
- chore(deps): update dependency typescript to v5.5.4 [`#2274`](https://github.com/th-ch/youtube-music/pull/2274)
|
||||
- chore(deps): update dependency vite to v5.3.5 [`#2275`](https://github.com/th-ch/youtube-music/pull/2275)
|
||||
- fix(deps): update dependency i18next to v23.12.2 [`#2260`](https://github.com/th-ch/youtube-music/pull/2260)
|
||||
- chore(deps): update dependency discord-api-types to v0.37.93 [`#2273`](https://github.com/th-ch/youtube-music/pull/2273)
|
||||
- chore(deps): update dependency rollup to v4.19.1 [`#2261`](https://github.com/th-ch/youtube-music/pull/2261)
|
||||
- fix(deps): update dependency custom-electron-prompt to v1.5.8 [`#2262`](https://github.com/th-ch/youtube-music/pull/2262)
|
||||
- feat(adblocker): add new option AdSpeedup [`#2235`](https://github.com/th-ch/youtube-music/pull/2235)
|
||||
- fix: disable multi-plane format for software video [`#2254`](https://github.com/th-ch/youtube-music/pull/2254)
|
||||
- chore(deps): update dependency eslint-plugin-prettier to v5.2.1 [`#2253`](https://github.com/th-ch/youtube-music/pull/2253)
|
||||
- chore(deps): update dependency vite to v5.3.4 [`#2243`](https://github.com/th-ch/youtube-music/pull/2243)
|
||||
- chore(deps): update typescript-eslint monorepo to v7.16.1 [`#2239`](https://github.com/th-ch/youtube-music/pull/2239)
|
||||
- chore(deps): update playwright monorepo to v1.45.2 [`#2244`](https://github.com/th-ch/youtube-music/pull/2244)
|
||||
- chore(deps): update dependency vite-plugin-inspect to v0.8.5 [`#2252`](https://github.com/th-ch/youtube-music/pull/2252)
|
||||
- fix(deps): update dependency semver to v7.6.3 [`#2250`](https://github.com/th-ch/youtube-music/pull/2250)
|
||||
- chore(deps): update dependency electron to v31.2.1 [`#2241`](https://github.com/th-ch/youtube-music/pull/2241)
|
||||
- chore(i18n): Translated using Weblate (Catalan) [`4a8440c`](https://github.com/th-ch/youtube-music/commit/4a8440c281c341977ab3687982cec8cbc5af6cf7)
|
||||
- Update changelog for v3.4.1 [`18e0b1b`](https://github.com/th-ch/youtube-music/commit/18e0b1b86341b13f1cbc713bfbd7b5d7a45ee392)
|
||||
- fix(synced-lyrics): fix type error [`9357a15`](https://github.com/th-ch/youtube-music/commit/9357a15116a8526d22ba6142c0a02f31688743f2)
|
||||
|
||||
#### [v3.4.1](https://github.com/th-ch/youtube-music/compare/v3.4.0...v3.4.1)
|
||||
|
||||
> 15 July 2024
|
||||
|
||||
- fix(mpris): fix mpris position [`#2225`](https://github.com/th-ch/youtube-music/issues/2225)
|
||||
- fix(deb): fix depends [`#1983`](https://github.com/th-ch/youtube-music/issues/1983)
|
||||
- fix: fix touchbar icon [`#2183`](https://github.com/th-ch/youtube-music/issues/2183)
|
||||
- fix: fix "Starting page" [`#1822`](https://github.com/th-ch/youtube-music/issues/1822)
|
||||
- fix: fix album actions [`#2202`](https://github.com/th-ch/youtube-music/issues/2202)
|
||||
- fix: fix playback slider [`#2045`](https://github.com/th-ch/youtube-music/issues/2045)
|
||||
- chore(i18n): Translated using Weblate (Spanish) [`91bee48`](https://github.com/th-ch/youtube-music/commit/91bee4880ed2c6fdd887814a2620877d89bea311)
|
||||
- Bump version to 3.4.1 [`02e2fb6`](https://github.com/th-ch/youtube-music/commit/02e2fb6a83844f439f760e72cdcb935b86000df2)
|
||||
|
||||
#### [v3.4.0](https://github.com/th-ch/youtube-music/compare/v3.3.12...v3.4.0)
|
||||
|
||||
> 14 July 2024
|
||||
|
||||
- fix(deps): update dependency i18next to v23.12.1 [`#2230`](https://github.com/th-ch/youtube-music/pull/2230)
|
||||
- feat(downloader): New option to download on finish [`#1964`](https://github.com/th-ch/youtube-music/pull/1964)
|
||||
- chore(deps): update typescript-eslint monorepo to v8.0.0-alpha.42 [`#2228`](https://github.com/th-ch/youtube-music/pull/2228)
|
||||
- chore(deps): update dependency eslint to v9.7.0 [`#2226`](https://github.com/th-ch/youtube-music/pull/2226)
|
||||
- chore(deps): update dependency @babel/runtime to v7.24.8 [`#2221`](https://github.com/th-ch/youtube-music/pull/2221)
|
||||
- chore(deps): update dependency node-gyp to v10.2.0 [`#2216`](https://github.com/th-ch/youtube-music/pull/2216)
|
||||
- chore(deps): update dependency ws to v8.18.0 [`#2217`](https://github.com/th-ch/youtube-music/pull/2217)
|
||||
- chore(deps): update dependency glob to v11 [`#2219`](https://github.com/th-ch/youtube-music/pull/2219)
|
||||
- chore(deps): update dependency esbuild to v0.23.0 [`#2215`](https://github.com/th-ch/youtube-music/pull/2215)
|
||||
- chore(deps): update dependency electron to v31.2.0 [`#2214`](https://github.com/th-ch/youtube-music/pull/2214)
|
||||
- fix(deps): update dependency youtubei.js to v10.1.0 [`#2218`](https://github.com/th-ch/youtube-music/pull/2218)
|
||||
- chore(deps): update playwright monorepo to v1.45.1 [`#2212`](https://github.com/th-ch/youtube-music/pull/2212)
|
||||
- chore(deps): update typescript-eslint monorepo to v8.0.0-alpha.41 [`#2213`](https://github.com/th-ch/youtube-music/pull/2213)
|
||||
- chore(deps): update dependency rollup to v4.18.1 [`#2210`](https://github.com/th-ch/youtube-music/pull/2210)
|
||||
- chore(deps): update dependency eslint to v9.6.0 [`#2192`](https://github.com/th-ch/youtube-music/pull/2192)
|
||||
- chore(deps): update dependency vite to v5.3.3 [`#2211`](https://github.com/th-ch/youtube-music/pull/2211)
|
||||
- chore(deps): update dependency glob to v10.4.5 [`#2205`](https://github.com/th-ch/youtube-music/pull/2205)
|
||||
- chore(deps): update dependency discord-api-types to v0.37.92 [`#2204`](https://github.com/th-ch/youtube-music/pull/2204)
|
||||
- fix(deps): update dependency solid-js to v1.8.18 [`#2189`](https://github.com/th-ch/youtube-music/pull/2189)
|
||||
- chore(deps): update dependency typescript to v5.5.3 [`#2206`](https://github.com/th-ch/youtube-music/pull/2206)
|
||||
- chore(deps): update dependency electron to v31.1.0 [`#2190`](https://github.com/th-ch/youtube-music/pull/2190)
|
||||
- chore(deps): update typescript-eslint monorepo to v8.0.0-alpha.40 [`#2193`](https://github.com/th-ch/youtube-music/pull/2193)
|
||||
- fix(deps): update dependency @floating-ui/dom to v1.6.7 [`#2196`](https://github.com/th-ch/youtube-music/pull/2196)
|
||||
- chore(deps): update dependency vite to v5.3.2 [`#2188`](https://github.com/th-ch/youtube-music/pull/2188)
|
||||
- chore(deps): update dependency discord-api-types to v0.37.91 [`#2187`](https://github.com/th-ch/youtube-music/pull/2187)
|
||||
- chore(deps): update typescript-eslint monorepo to v8.0.0-alpha.34 [`#2184`](https://github.com/th-ch/youtube-music/pull/2184)
|
||||
- fix(deps): update dependency @floating-ui/dom to v1.6.6 [`#2182`](https://github.com/th-ch/youtube-music/pull/2182)
|
||||
- chore(deps): update playwright monorepo to v1.45.0 [`#2181`](https://github.com/th-ch/youtube-music/pull/2181)
|
||||
- fix(deps): update dependency ts-morph to v23 [`#2180`](https://github.com/th-ch/youtube-music/pull/2180)
|
||||
- chore(deps): update dependency electron-vite to v2.3.0 [`#2178`](https://github.com/th-ch/youtube-music/pull/2178)
|
||||
- fix(deps): update dependency conf to v13.0.1 [`#2175`](https://github.com/th-ch/youtube-music/pull/2175)
|
||||
- chore(deps): update dependency glob to v10.4.2 [`#2168`](https://github.com/th-ch/youtube-music/pull/2168)
|
||||
- chore(deps): update dependency discord-api-types to v0.37.90 [`#2167`](https://github.com/th-ch/youtube-music/pull/2167)
|
||||
- chore(deps): update dependency typescript to v5.5.2 [`#2173`](https://github.com/th-ch/youtube-music/pull/2173)
|
||||
- chore(deps): update dependency electron to v31.0.2 [`#2170`](https://github.com/th-ch/youtube-music/pull/2170)
|
||||
- chore(deps): update dependency ws to v8.17.1 [`#2164`](https://github.com/th-ch/youtube-music/pull/2164)
|
||||
- chore(deps): update dependency eslint to v9.5.0 [`#2162`](https://github.com/th-ch/youtube-music/pull/2162)
|
||||
- fix(deps): update dependency youtubei.js to v10 [`#2136`](https://github.com/th-ch/youtube-music/pull/2136)
|
||||
- chore(deps): update dependency discord-api-types to v0.37.89 [`#2153`](https://github.com/th-ch/youtube-music/pull/2153)
|
||||
- chore(deps): update dependency vite to v5.3.1 [`#2154`](https://github.com/th-ch/youtube-music/pull/2154)
|
||||
- fix(deps): update dependency electron-store to v10 [`#2157`](https://github.com/th-ch/youtube-music/pull/2157)
|
||||
- fix(deps): update dependency conf to v13 [`#2156`](https://github.com/th-ch/youtube-music/pull/2156)
|
||||
- chore(deps): update dependency electron to v31.0.1 [`#2148`](https://github.com/th-ch/youtube-music/pull/2148)
|
||||
- chore(deps): update dependency discord-api-types to v0.37.88 [`#2138`](https://github.com/th-ch/youtube-music/pull/2138)
|
||||
- chore(deps): update typescript-eslint monorepo to v8.0.0-alpha.30 [`#2139`](https://github.com/th-ch/youtube-music/pull/2139)
|
||||
- chore(deps): update dependency electron to v31 [`#2141`](https://github.com/th-ch/youtube-music/pull/2141)
|
||||
- chore(deps): update dependency esbuild to v0.21.5 [`#2135`](https://github.com/th-ch/youtube-music/pull/2135)
|
||||
- chore(deps): update typescript-eslint monorepo to v8.0.0-alpha.29 [`#2132`](https://github.com/th-ch/youtube-music/pull/2132)
|
||||
- fix: rollback eslint version to v8 [`45931a2`](https://github.com/th-ch/youtube-music/commit/45931a25b08ab8a406f9e102486585311fd14bf9)
|
||||
- chore(i18n): Translated using Weblate (Filipino) [`8a20566`](https://github.com/th-ch/youtube-music/commit/8a20566e0f2736f72d46282188ada69df1d7076a)
|
||||
- chore(i18n): Translated using Weblate (Slovenian) [`40f0b9b`](https://github.com/th-ch/youtube-music/commit/40f0b9b852dcd9146e1c1e6c741b5baaf55ac079)
|
||||
|
||||
#### [v3.3.12](https://github.com/th-ch/youtube-music/compare/v3.3.11...v3.3.12)
|
||||
|
||||
> 8 June 2024
|
||||
|
||||
- hotfix: Revert "chore(deps): update dependencies `@cliqz/adblocker-electron`, `@cliqz/adblocker-electron-preload`" [`3c4abc1`](https://github.com/th-ch/youtube-music/commit/3c4abc14187e51f7e47c1ae71b3513f6d8c9912a)
|
||||
- Update changelog for v3.3.11 [`de22444`](https://github.com/th-ch/youtube-music/commit/de224444c2a6d9030aa22a3b263ceacbc4b41914)
|
||||
- Bump version to 3.3.12 [`89ed7d2`](https://github.com/th-ch/youtube-music/commit/89ed7d2345001fea59514944f4c1d56d2b7bd888)
|
||||
|
||||
|
Before Width: | Height: | Size: 227 KiB After Width: | Height: | Size: 721 KiB |
@ -12,7 +12,7 @@
|
||||
|
||||
</div>
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
<div align="center">
|
||||
@ -182,7 +182,7 @@ brew install th-ch/youtube-music/youtube-music
|
||||
Si instalas la aplicación manualmente y obtienes un error "está dañado y no se puede abrir" al iniciar la aplicación, ejecuta lo siguiente en la Terminal:
|
||||
|
||||
```bash
|
||||
xattr -cr /Applications/YouTube\ Music.app
|
||||
/usr/bin/xattr -cr /Applications/YouTube\ Music.app
|
||||
```
|
||||
|
||||
### Windows
|
||||
|
||||
@ -12,7 +12,7 @@
|
||||
|
||||
</div>
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
<div align="center">
|
||||
@ -66,7 +66,7 @@
|
||||
## Plugins disponibles :
|
||||
|
||||
- **Bloqueur de publicités** : Bloquez toutes les publicités et le suivi dès le départ
|
||||
|
||||
|
||||
- **Actions d'album** : Ajoute des boutons Je n'aime pas, Dislike, J'aime, et Unlike pour appliquer cela à toutes les chansons dans une playlist ou un album
|
||||
|
||||
- **Thème de couleur d'album** : Applique un thème dynamique et des effets visuels basés sur la palette de couleurs de l'album
|
||||
@ -185,7 +185,7 @@ brew install th-ch/youtube-music/youtube-music
|
||||
Si vous installez l'application manuellement et obtenez une erreur "est endommagé et ne peut pas être ouvert." lors du lancement de l'application, exécutez ce qui suit dans le Terminal :
|
||||
|
||||
```bash
|
||||
xattr -cr /Applications/YouTube\ Music.app
|
||||
/usr/bin/xattr -cr /Applications/YouTube\ Music.app
|
||||
```
|
||||
|
||||
### Windows
|
||||
@ -385,4 +385,4 @@ MIT © [th-ch](https://github.com/th-ch/youtube-music)
|
||||
|
||||
### Pourquoi le menu de l'application ne s'affiche-t-il pas ?
|
||||
|
||||
Si l'option `Masquer le menu` est activée - vous pouvez afficher le menu avec la touche <kbd>alt</kbd> (ou <kbd>\`</kbd> [backtick] si vous utilisez le plugin du menu intégré)
|
||||
Si l'option `Masquer le menu` est activée - vous pouvez afficher le menu avec la touche <kbd>alt</kbd> (ou <kbd>\`</kbd> [backtick] si vous utilisez le plugin du menu intégré)
|
||||
|
||||
374
docs/readme/README-hu.md
Normal file
@ -0,0 +1,374 @@
|
||||
<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-hu.svg" width="400" height="100" alt="YouTube Music SVG">
|
||||
</a>
|
||||
</div>
|
||||
|
||||
Olvasd el más nyelveken: [🏴 Angol](./blob/master/README.md), [🇰🇷 Korea](./docs/readme/README-ko.md), [🇮🇸 Izland](./docs/readme/README-is.md), [🇪🇸 Spanyol](./docs/readme/README-es.md), [🇷🇺 Orosz](./docs/readme/README-ru.md)
|
||||
|
||||
**Electron keretrendszerre épülő alkalmazás a YouTube Music számára, amely a következőket kínálja:**
|
||||
|
||||
- Natív megjelenés és élmény, amely az eredeti felület megtartására törekszik
|
||||
- Egyedi bővítmények keretrendszere: alakítsd át a YouTube Music-ot igényeid szerint (stílus, tartalom, funkciók), engedélyezd/tiltsd le a bővítményeket egy kattintással
|
||||
|
||||
## Bemutató kép
|
||||
|
||||
| Lejátszó ablak (album színtéma és környezeti fény) |
|
||||
|:---------------------------------------------------------------------------------------------------------:|
|
||||
||
|
||||
|
||||
## Tartalom
|
||||
|
||||
- [Funkciók](#Funkciók)
|
||||
- [Elérhető bővítmények](#Elérhető-bővítmények)
|
||||
- [Fordítás](#Fordítás)
|
||||
- [Letöltés](#Letöltés)
|
||||
- [Arch Linux](#arch-linux)
|
||||
- [MacOS](#macos)
|
||||
- [Windows](#windows)
|
||||
- [Hogyan telepítsük hálózati kapcsolat nélkül? (Windows alatt)](#Hogyan-telepítsd-hálózati-kapcsolat-nélkül-Windows)
|
||||
- [Témák](#Témák)
|
||||
- [Fejlesztés](#Fejlesztés)
|
||||
- [Saját bővítmények készítése](#Saját-bővítmények-készítése)
|
||||
- [Bővítmény létrehozása](#Bővítmény-létrehozása)
|
||||
- [Gyakori használati esetek](#Gyakori-használati-esetek)
|
||||
- [Build](#build)
|
||||
- [Gyártás előnézete](#Gyártás-előnézete)
|
||||
- [Tesztelés](#Tesztelés)
|
||||
- [Licenc](#Licenc)
|
||||
- [GYIK](#GYIK)
|
||||
|
||||
## Funkciók:
|
||||
|
||||
- **Automatikus megerősítés a lejátszás szüneteltetésekor** (Alapból engedélyezve): Kikapcsolja a ["Folytatja a nézést?"](https://i.imgur.com/z2mG0QN.png)
|
||||
felugró ablakot, amely bizonyos idő után leállítja a zenét.
|
||||
|
||||
- És még sok más ...
|
||||
|
||||
## Elérhető bővítmények:
|
||||
|
||||
- **Reklámblokkoló**: Blokkolja az összes hirdetést és nyomkövetőt.
|
||||
|
||||
- **Album műveletek**: Dislike, Undislike, Like, Unlike gombok hozzáadása, amivel ezt a lejátszási listán vagy albumban lévő összes dalra alkalmazza.
|
||||
|
||||
- **Album színtéma**: Dinamikus téma és vizuális effektek alkalmazása az album színpalettája alapján.
|
||||
|
||||
- **Ambient mód**: Fényhatás alkalmazása a videóból származó lágy színek vetítésével a képernyő hátterére.
|
||||
|
||||
- **Hangtömörítő**: Hang tömörítés alkalmazása. (csökkenti a jel legzajosabb részeinek hangerősségét, és emeli a legcsendesebb részek hangerősségét)
|
||||
|
||||
- **Navigációs sáv elmosása**: Átlátszóvá és elmosódottá teszi a navigációs sávot.
|
||||
|
||||
- **Korellenőrzés kihagyása**: A YouTube korellenőrzését kihagyja, ezáltal nem kel meg erősíteni a zene meghallgatása elött. (automatikusan megerősítve lesz)
|
||||
|
||||
- **Feliratválasztó**: Felirat választó a YouTube Music zenékhez.
|
||||
|
||||
- **Kompakt oldalsáv**: Mindig becsukva tartja a bal oldali sávot, ahol a Kezdőlap, Felfedezés, Könyvtár és egyebek láthatók. (amit bármikor ki lehet nyitni)
|
||||
|
||||
- **Áttünés**: Áttünést biztosít a dalok között, ami folytonossá teszi a zenehallgatást anélkül, hogy érezhető lenne a váltás.
|
||||
|
||||
- **Automatikus lejátszás letiltása**: Ez a funkció kikapcsolja az automatikus lejátszást, így a zenék nem indulnak el maguktól. Amikor egy album vagy egy dal lejátszása véget ér, a következő szám nem kezdődik el automatikusan. (a bővítmény használata során minden zenét manuálisan kell elindítani)
|
||||
|
||||
- **[Discord](https://discord.com/) Rich Presence**: Mutassa meg barátainak, hogy mit hallgat a [Rich Presence](https://i.imgur.com/nCeVQB2.png) segítségével. (Ehez a Discord-on is engedélyezve kel lennie a Tevékenységállapot megosztásának [DC Beállítások -> Tevékenyég-adatvédelem -> Megoszthatod az észlelt tevékenységeidet másokkal])
|
||||
|
||||
- **Letöltő**: MP3/forrás hanganyag letöltése [közvetlenül az interfészről](https://i.imgur.com/ghqBNVe.png). [(youtube-dl)](https://github.com/ytdl-org/youtube-dl)
|
||||
|
||||
- **Hangszínszabályzó**: Szűrőket ad hozzá, hogy erősítsd vagy csökkentsd bizonyos frekvenciatartományokat. (pl. basszuskiemelés)
|
||||
|
||||
- **Exponenciális hangerő**: A hangerő csúszka [exponenciálissá](https://greasyfork.org/en/scripts/397686-youtube-music-fix-volume-ratio/) tételével könnyebbé válik az alacsony hangerő kiválasztása.
|
||||
|
||||
- **Alkalmazáson belüli menü**: [A Menüsáv stílusos, sötét vagy album-színű megjelenítése](https://i.imgur.com/vWvO7Xt.png).
|
||||
|
||||
> (Lásd ezt a [bejegyzést](https://github.com/th-ch/youtube-music/issues/410#issuecomment-952060709), ha problémád van a menü elérésével, miután engedélyezted ezt a bővítményt és a "menü elrejtése" opciót.
|
||||
|
||||
- **Scrobbler**: Scrobbling támogatást biztosít [Last.fm](https://www.last.fm/) és [ListenBrainz](https://listenbrainz.org/) számára.
|
||||
|
||||
- **Lumia Stream**: [Lumia Stream](https://lumiastream.com/) támogatás hozzáadása.
|
||||
|
||||
- **Lyrics Genius**: Dalszöveg támogatást nyújt a legtöbb dalhoz.
|
||||
|
||||
- **Zene együtt**: Lehetővé teszi a lejátszási listák, dalok megosztását másokkal. Amikor a házigazda lejátszik egy dalt, mindenki ugyanazt a dalt fogja hallani.
|
||||
|
||||
- **Navigáció**: Következő/Vissza navigációs nyilak közvetlenül az interfészbe integrálva, mint a kedvenc böngésződben.
|
||||
|
||||
- **Nincs Google bejelentkezés**: A Bejelentkezés gomb eltávolítása az interfészről (Jobb fentről eltünik a bejelentkezés gomb.)
|
||||
|
||||
- **Értesítések**: Értesítés megjelenítése, amikor egy dal elindul. ([interaktív értesítések](https://user-images.githubusercontent.com/78568641/114102651-63ce0e00-98d0-11eb-9dfe-c5a02bb54f9c.png) elérhetők Windows-on)
|
||||
|
||||
- **Kép a képben**: Lehetővé teszi az alkalmazás kép a képben módra váltását.
|
||||
|
||||
- **Lejátszás sebessége**: Hallgassd gyorsan, hallgassd lassan! [Hozzáad egy csúszkát, amely szabályozza a dal sebességét](https://i.imgur.com/uaNOWOt.png)
|
||||
|
||||
- **Precíz hangerő**: A hangerő precíz szabályozása egérgörgővel/gyorsbillentyűkkel, egy egyedi HUD és testreszabható hangerő csuszka segítségével.
|
||||
|
||||
- **Gyorsbillentyűk (& MPRIS)**: Lehetővé teszi globális gyorsbillentyűk beállítását a lejátszáshoz (lejátszás/szünet/következő/előző), valamint a [média OSD](https://i.imgur.com/o13SpAE.png) kikapcsolását a médiagombok felülírásával. Bekapcsolja a Ctrl/CMD + F billentyűkombinációt a kereséshez, a Linux MPRIS támogatását a médiagombokhoz, és [egyedi gyorsbillentyűket](https://github.com/Araxeus/youtube-music/blob/1e591d6a3df98449bcda6e63baab249b28026148/providers/song-controls.js#L13-L50) a [haladó felhasználók](https://github.com/th-ch/youtube-music/issues/106#issuecomment-952156902) számára.
|
||||
|
||||
- **Nem kedvelt dal kihagyása**: Kihagyja a nem kedvelt dalokat.
|
||||
|
||||
- **Csend kihagyása**: Automatikusan átugorja a csendes szakaszokat.
|
||||
|
||||
- [**SzponzorBlokk**](https://github.com/ajayyy/SponsorBlock): Automatikusan átugorja a nem zenei részeket, például az intrókat/outrokat vagy a zenei videók azon részeit, ahol a dal nem szól.
|
||||
|
||||
- **Szinkronizált dalszövegek**: Szinkronizált dalszövegeket biztosít dalokhoz, [LRClib](https://lrclib.net)-hez hasonló szolgáltatókat használva.
|
||||
|
||||
- **Médiavezérlés a tálcán**: Lejátszás vezérlése a [Windows tálcáról](https://i.imgur.com/eolQfnA.png).
|
||||
|
||||
- **TouchBar**: Egyedi TouchBar elrendezés macOS-hoz.
|
||||
|
||||
- **Tuna OBS**: Integráció az [OBS](https://obsproject.com/) [Tuna](https://obsproject.com/forum/resources/tuna.843/) pluginjával.
|
||||
|
||||
- **Videóminőség modosító**: Lehetővé teszi a videó minőségének megváltoztatását egy [gombbal](https://i.imgur.com/UgpgtHL.png) a videó fedvényen.
|
||||
|
||||
- **Videó váltó**: Hozzáad egy [gombot](https://i.imgur.com/288QE1k.png) a Videó/Dal mód közötti váltáshoz. (opcionálisan teljesen eltávolíthatja a videó fület is)
|
||||
|
||||
- **Vizualizáció**: Különböző zenei vizualizációk.
|
||||
|
||||
|
||||
## Fordítás
|
||||
|
||||
Segíthetsz a fordításban a [Hosted Weblate](https://hosted.weblate.org/projects/youtube-music/) oldalán.
|
||||
|
||||
<a href="https://hosted.weblate.org/engage/youtube-music/">
|
||||
<img src="https://hosted.weblate.org/widget/youtube-music/i18n/multi-auto.svg" alt="Fordítás állapota" />
|
||||
<img src="https://hosted.weblate.org/widget/youtube-music/i18n/287x66-black.png" alt="Fordítás állapota" />
|
||||
<img src="https://hosted.weblate.org/widget/youtube-music/i18n/hu/287x66-white.png" alt="Fordítás állapota" />
|
||||
</a>
|
||||
|
||||
## Letöltés
|
||||
|
||||
A [legfrissebb kiadás](https://github.com/th-ch/youtube-music/releases/latest) megtekintésével gyorsan megtalálhatod a legújabb verziót.
|
||||
|
||||
### Arch Linux
|
||||
|
||||
Telepítsd a [`youtube-music-bin`](https://aur.archlinux.org/packages/youtube-music-bin) csomagot az AUR-ból. Az AUR telepítési útmutatóját megtalálod ezen a [wiki oldalon](https://wiki.archlinux.org/index.php/Arch_User_Repository#Installing_packages).
|
||||
|
||||
### macOS
|
||||
|
||||
Telepítheted az alkalmazást Homebrew segítségével (lásd a [cask definíciót](https://github.com/th-ch/homebrew-youtube-music)):
|
||||
|
||||
```bash
|
||||
brew install th-ch/youtube-music/youtube-music
|
||||
```
|
||||
|
||||
Ha manuálisan telepítetted az alkalmazást, és a következő hibát kapod indításkor: "sérült, és nem nyitható meg./is damaged and can’t be opened.", futtasd az alábbi parancsot a Terminálban:
|
||||
|
||||
```bash
|
||||
/usr/bin/xattr -cr /Applications/YouTube\ Music.app
|
||||
```
|
||||
|
||||
### Windows
|
||||
|
||||
A [Scoop csomagkezelő](https://scoop.sh) segítségével telepítheted a `youtube-music` csomagot az [`extras` tárolóból](https://github.com/ScoopInstaller/Extras).
|
||||
|
||||
```bash
|
||||
scoop bucket add extras
|
||||
scoop install extras/youtube-music
|
||||
```
|
||||
|
||||
Alternatívaként használhatod a [Winget](https://learn.microsoft.com/en-us/windows/package-manager/winget/) eszközt, a Windows 11 hivatalos CLI csomagkezelőjét, hogy telepítsd a `th-ch.YouTubeMusic` csomagot.
|
||||
|
||||
*Megjegyzés: A Microsoft Defender SmartScreen figyelmeztethet vagy blokkolhatja a telepítést, mivel az alkalmazás "ismeretlen kiadótól" származik. Ez a figyelmeztetés akkor is megjelenhet, ha manuálisan töltöd le és próbálod futtatni a GitHubról letöltött (.exe) fájlt. Ebben az esetben kattints a "További információ" gombra, majd válaszd a "Futtatás mindenképp" opciót a telepítés folytatásához.*
|
||||
|
||||
```bash
|
||||
winget install th-ch.YouTubeMusic
|
||||
```
|
||||
|
||||
#### Hogyan telepítsd hálózati kapcsolat nélkül? (Windows)
|
||||
|
||||
- Töltsd le a `*.nsis.7z` fájlt a [kiadás oldal](https://github.com/th-ch/youtube-music/releases/latest)ról, amely megfelel az eszközöd architektúrájának:
|
||||
- `x64` 64 bites Windows-hoz
|
||||
- `ia32` 32 bites Windows-hoz
|
||||
- `arm64` ARM64 Windows-hoz
|
||||
- Töltsd le a telepítőt a [kiadás oldal](https://github.com/th-ch/youtube-music/releases/latest)ról. (`*-Setup.exe`)
|
||||
- Helyezd mindkét fájlt **ugyanabba a könyvtárba**.
|
||||
- Futtasd a telepítőt.
|
||||
|
||||
## Témák
|
||||
|
||||
CSS fájlokat tölthetsz be az alkalmazás megjelenésének megváltoztatásához. (Beállítások > Kinézeti beállítások > Téma)
|
||||
|
||||
Néhány előre definiált téma elérhető itt: https://github.com/kerichdev/themes-for-ytmdesktop-player.
|
||||
|
||||
## Fejlesztés
|
||||
|
||||
```bash
|
||||
git clone https://github.com/th-ch/youtube-music
|
||||
cd youtube-music
|
||||
pnpm install --frozen-lockfile
|
||||
pnpm dev
|
||||
```
|
||||
|
||||
## Saját bővítmények készítése
|
||||
|
||||
A bővítmények segítségével a következőket teheted:
|
||||
|
||||
- Az alkalmazás manipulálása: Az Electron `BrowserWindow` objektuma átadásra kerül a bővítménykezelőnek.
|
||||
- Az interfész módosítása: HTML és CSS manipulációval megváltoztathatod az alkalmazás kinézetét.
|
||||
|
||||
### Bővítmény létrehozása
|
||||
|
||||
Hozz létre egy mappát a `src/plugins/YOUR-PLUGIN-NAME` útvonalon:
|
||||
|
||||
- `index.ts`: a bővítmény fő fájlja
|
||||
```typescript
|
||||
import style from './style.css?inline'; // import style as inline
|
||||
|
||||
import { createPlugin } from '@/utils';
|
||||
|
||||
export default createPlugin({
|
||||
name: 'Plugin Label',
|
||||
restartNeeded: true, // if value is true, ytmusic show restart dialog
|
||||
config: {
|
||||
enabled: false,
|
||||
}, // your custom config
|
||||
stylesheets: [style], // your custom style,
|
||||
menu: async ({ getConfig, setConfig }) => {
|
||||
// All *Config methods are wrapped Promise<T>
|
||||
const config = await getConfig();
|
||||
return [
|
||||
{
|
||||
label: 'menu',
|
||||
submenu: [1, 2, 3].map((value) => ({
|
||||
label: `value ${value}`,
|
||||
type: 'radio',
|
||||
checked: config.value === value,
|
||||
click() {
|
||||
setConfig({ value });
|
||||
},
|
||||
})),
|
||||
},
|
||||
];
|
||||
},
|
||||
backend: {
|
||||
start({ window, ipc }) {
|
||||
window.maximize();
|
||||
|
||||
// you can communicate with renderer plugin
|
||||
ipc.handle('some-event', () => {
|
||||
return 'hello';
|
||||
});
|
||||
},
|
||||
// it fired when config changed
|
||||
onConfigChange(newConfig) { /* ... */ },
|
||||
// it fired when plugin disabled
|
||||
stop(context) { /* ... */ },
|
||||
},
|
||||
renderer: {
|
||||
async start(context) {
|
||||
console.log(await context.ipc.invoke('some-event'));
|
||||
},
|
||||
// Only renderer available hook
|
||||
onPlayerApiReady(api: YoutubePlayer, context: RendererContext) {
|
||||
// set plugin config easily
|
||||
context.setConfig({ myConfig: api.getVolume() });
|
||||
},
|
||||
onConfigChange(newConfig) { /* ... */ },
|
||||
stop(_context) { /* ... */ },
|
||||
},
|
||||
preload: {
|
||||
async start({ getConfig }) {
|
||||
const config = await getConfig();
|
||||
},
|
||||
onConfigChange(newConfig) {},
|
||||
stop(_context) {},
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
### Gyakori használati esetek
|
||||
|
||||
- Egyedi CSS injektálása: hozz létre egy `style.css` fájlt ugyanabban a mappában, majd:
|
||||
|
||||
```typescript
|
||||
// index.ts
|
||||
import style from './style.css?inline'; // import style as inline
|
||||
|
||||
import { createPlugin } from '@/utils';
|
||||
|
||||
export default createPlugin({
|
||||
name: 'Plugin Label',
|
||||
restartNeeded: true, // if value is true, ytmusic will show a restart dialog
|
||||
config: {
|
||||
enabled: false,
|
||||
}, // your custom config
|
||||
stylesheets: [style], // your custom style
|
||||
renderer() {} // define renderer hook
|
||||
});
|
||||
```
|
||||
|
||||
- Ha módosítani szeretnéd a HTML-t:
|
||||
|
||||
```typescript
|
||||
import { createPlugin } from '@/utils';
|
||||
|
||||
export default createPlugin({
|
||||
name: 'Plugin Label',
|
||||
restartNeeded: true, // if value is true, ytmusic will show the restart dialog
|
||||
config: {
|
||||
enabled: false,
|
||||
}, // your custom config
|
||||
renderer() {
|
||||
// Remove the login button
|
||||
document.querySelector(".sign-in-link.ytmusic-nav-bar").remove();
|
||||
} // define renderer hook
|
||||
});
|
||||
```
|
||||
|
||||
- Az elülső és hátsó rész közötti kommunikáció: Az Electron ipcMain moduljának használatával valósítható meg. Lásd az `index.ts` fájlt és a `sponsorblock` bővítmény példáját.
|
||||
|
||||
## Build
|
||||
|
||||
1. Klónozd a repót
|
||||
2. Kövesd ezt az [útmutatót](https://pnpm.io/installation), hogy telepítsd a `pnpm` csomagkezelőt.
|
||||
3. Futtasd a következő parancsot `pnpm install --frozen-lockfile` a kellékek telepítéséhez.
|
||||
4. Építsd meg az alkalmazást az operációs rendszerednek megfelelő paranccsal: `pnpm build:OS`
|
||||
|
||||
- `pnpm dist:win` - Windows
|
||||
- `pnpm dist:linux` - Linux (amd64)
|
||||
- `pnpm dist:linux:deb-arm64` - Linux (arm64 Debiánhoz)
|
||||
- `pnpm dist:linux:rpm-arm64` - Linux (arm64 Fedorához)
|
||||
- `pnpm dist:mac` - macOS (amd64)
|
||||
- `pnpm dist:mac:arm64` - macOS (arm64)
|
||||
|
||||
Az alkalmazás építéséhez a [electron-builder](https://github.com/electron-userland/electron-builder) eszközt használáld, amely támogatja a macOS, Linux és Windows platformokat.
|
||||
|
||||
## Gyártás előnézete
|
||||
|
||||
```bash
|
||||
pnpm start
|
||||
```
|
||||
|
||||
## Tesztelés
|
||||
|
||||
```bash
|
||||
pnpm test
|
||||
```
|
||||
|
||||
A [Playwright](https://playwright.dev/) tesztelési keretrendszert használd az alkalmazás teszteléséhez.
|
||||
|
||||
## Licenc
|
||||
|
||||
MIT © [th-ch](https://github.com/th-ch/youtube-music)
|
||||
|
||||
## GYIK
|
||||
|
||||
### Miért nem jelenik meg az alkalmazás menüje?
|
||||
|
||||
Ha a `menü elrejtése` opció be van kapcsolva, a menüt az <kbd>alt</kbd> billentyűvel jelenítheted meg (vagy az <kbd>`</kbd> [fordított idézőjel] billentyűvel, ha az alkalmazáson belüli menü bővítményt használod).
|
||||
@ -12,7 +12,7 @@
|
||||
|
||||
</div>
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
<div align="center">
|
||||
@ -65,7 +65,7 @@
|
||||
## Tiltæk tengiforrit:
|
||||
|
||||
- **Auglýsingablokkari**: Lokaðu fyrir allar auglýsingar og rakningar úr kassanum
|
||||
|
||||
|
||||
- **Albúmsaðgerðir**: Bætir Ódíslika, Mislíkt, Líkt, og Ólíkt til að nota þetta á öll lög á spilunarlista eða albúm
|
||||
|
||||
- **Albúmslitaþema**: Beitir kraftmikið þema og sjónrænum áhrifum sem byggjast á litavali albúmsins
|
||||
@ -180,7 +180,7 @@ brew install th-ch/youtube-music/youtube-music
|
||||
Ef þú setur upp forritið handvirkt og færð villu "er skemmd og ekki er hægt að opna það," þegar þú ræsir forritið skaltu keyra eftirfarandi í flugstöðinni:
|
||||
|
||||
```bash
|
||||
xattr -cr /Applications/YouTube\ Music.app
|
||||
/usr/bin/xattr -cr /Applications/YouTube\ Music.app
|
||||
```
|
||||
|
||||
### Windows
|
||||
|
||||
@ -12,7 +12,7 @@
|
||||
|
||||
</div>
|
||||
|
||||

|
||||

|
||||
|
||||
<div align="center">
|
||||
<a href="https://github.com/th-ch/youtube-music/releases/latest">
|
||||
@ -147,7 +147,7 @@ brew install --cask https://raw.githubusercontent.com/th-ch/youtube-music/master
|
||||
(앱을 수동으로 설치하고) 앱을 실행할 때 `손상되었기 때문에 열 수 없습니다.`라는 오류가 발생하면 터미널에서 다음을 실행하세요:
|
||||
|
||||
```bash
|
||||
xattr -cr /Applications/YouTube\ Music.app
|
||||
/usr/bin/xattr -cr /Applications/YouTube\ Music.app
|
||||
```
|
||||
|
||||
### Windows
|
||||
|
||||
374
docs/readme/README-ru.md
Normal file
@ -0,0 +1,374 @@
|
||||
<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/.eslintrc.js)
|
||||
[](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>
|
||||
|
||||
|
||||
|
||||
**Клиент для YouTube Music основанный на Electron с поддержкой:**
|
||||
|
||||
- Нативный вид приложения, нацелен на сохранение оригинального интерфейса
|
||||
- Фреймворк для пользовательских плагинов: изменяйте YouTube Music под ваши нужды (внешний вид, контент, возможности), включайте/выключайте плагины в один клик
|
||||
|
||||
## Демо-изображение
|
||||
|
||||
| Экран плеера (цветовая тема альбома & режим Ambient) |
|
||||
|:---------------------------------------------------------------------------------------------------------:|
|
||||
||
|
||||
|
||||
## Содержание
|
||||
|
||||
- [Возможности](#Возможности)
|
||||
- [Доступные плагины](#Доступные-плагины)
|
||||
- [Перевод](#Перевод)
|
||||
- [Скачать](#Скачать)
|
||||
- [Arch Linux](#arch-linux)
|
||||
- [MacOS](#macos)
|
||||
- [Windows](#windows)
|
||||
- [Как установить без подключения к интернету? (в Windows)](#Установка-без-подключения-к-Интернету-в-Windows)
|
||||
- [Темы](#Темы)
|
||||
- [Для разработчиков](#Для-разработчиков)
|
||||
- [Создайте свои собственные плагины](#Создайте-свои-собственные-плагины)
|
||||
- [Создание плагина](#Создание-плагина)
|
||||
- [Примеры использования](#Примеры-использования)
|
||||
- [Сборка](#Сборка)
|
||||
- [Предварительный просмотр](#Предварительный-просмотр)
|
||||
- [Тестирование](#Тестирование)
|
||||
- [Лицензия](#Лицензия)
|
||||
- [Часто задаваемые вопросы](#Часто-задаваемые-вопросы)
|
||||
|
||||
## Возможности:
|
||||
|
||||
- **Авто-подтверждение при паузе** (Всегда включено): отключает всплывающие уведомление ["Продолжить просмотр?"](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**: Добавляет поддержку текстов для большинства песен
|
||||
|
||||
- **Music Together**: Делитесь плейлистом с другими. Когда ведущий воспроизводит трек, все остальные будут слушать этот же трек.
|
||||
|
||||
- **Навигация**: Кнопки Назад/Вперед интегрированы в интерфейс, как в вашем любимом браузере
|
||||
|
||||
- **Без входа в систему 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)
|
||||
|
||||
- **Точная громкость**: Точечно управляйте громкостью с помощью колеса мыши/горячих клавиш, с кастомным интерфейсом и настраиваемыми шагами громкости
|
||||
|
||||
- **Ярлыки (и MPRIS)**: Позволяет настроить глобальные горячие клавиши управления воспроизведением (плей/пауза/следующий/предыдущий) + отключает [отображение медиа на экране,](https://user-images.githubusercontent.com/84923831/128601225-afa38c1f-dea8-4209-9f72-0f84c1dd8b54.png) переопределяя клавиши управления + включает Ctrl/CMD + F для поиска + включает поддержку linux mpris для клавиш управления медиа + [настраиваемые сочетания клавиш](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**: Интеграция с [OBS](https://obsproject.com/) плагином [Tuna](https://obsproject.com/forum/resources/tuna.843/)
|
||||
|
||||
- **Изменение качества видео**: Позволяет менять качество видео [кнопкой](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) переключения режимов Трек/Видео. Также может удалять вкладку "Видео" полностью
|
||||
|
||||
- **Визуализатор**: Различные визуализаторы музыки
|
||||
|
||||
- **Synced Lyrics**:
|
||||
Предоставляет синхронизированные слова для песен из таких источников, как [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="translation status" />
|
||||
<img src="https://hosted.weblate.org/widget/youtube-music/i18n/287x66-black.png" alt="translation status 2" />
|
||||
</a>
|
||||
|
||||
## Скачать
|
||||
|
||||
Вы можете посмотреть [latest release,](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 definition](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`.
|
||||
|
||||
*К сведению: SmartScreen защитника Windows может блокировать установку, так как она от "неизвестного издателя". Это также применимо к методу ручной установки, когда вы пытаетесь запустить исполняемый файл(.exe) после загрузки здесь, на GitHub (тот же файл).*
|
||||
|
||||
```bash
|
||||
winget install th-ch.YouTubeMusic
|
||||
```
|
||||
|
||||
#### Установка без подключения к Интернету? (в Windows)
|
||||
|
||||
- Скачайте файл `*.nsis.7z` из _архетиктура вашего устройства_ на [release page](https://github.com/th-ch/youtube-music/releases/latest).
|
||||
- `x64` для 64-bit Windows
|
||||
- `ia32` для 32-bit Windows
|
||||
- `arm64` для ARM64 Windows
|
||||
- Скачайте установщик в release page. (`*-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/YOUR-PLUGIN-NAME`:
|
||||
|
||||
- `index.ts`: основной файл плагина
|
||||
```typescript
|
||||
import style from './style.css?inline'; // import style as inline
|
||||
|
||||
import { createPlugin } from '@/utils';
|
||||
|
||||
export default createPlugin({
|
||||
name: 'Plugin Label',
|
||||
restartNeeded: true, // if value is true, ytmusic show restart dialog
|
||||
config: {
|
||||
enabled: false,
|
||||
}, // your custom config
|
||||
stylesheets: [style], // your custom style,
|
||||
menu: async ({ getConfig, setConfig }) => {
|
||||
// All *Config methods are wrapped Promise<T>
|
||||
const config = await getConfig();
|
||||
return [
|
||||
{
|
||||
label: 'menu',
|
||||
submenu: [1, 2, 3].map((value) => ({
|
||||
label: `value ${value}`,
|
||||
type: 'radio',
|
||||
checked: config.value === value,
|
||||
click() {
|
||||
setConfig({ value });
|
||||
},
|
||||
})),
|
||||
},
|
||||
];
|
||||
},
|
||||
backend: {
|
||||
start({ window, ipc }) {
|
||||
window.maximize();
|
||||
|
||||
// you can communicate with renderer plugin
|
||||
ipc.handle('some-event', () => {
|
||||
return 'hello';
|
||||
});
|
||||
},
|
||||
// it fired when config changed
|
||||
onConfigChange(newConfig) { /* ... */ },
|
||||
// it fired when plugin disabled
|
||||
stop(context) { /* ... */ },
|
||||
},
|
||||
renderer: {
|
||||
async start(context) {
|
||||
console.log(await context.ipc.invoke('some-event'));
|
||||
},
|
||||
// Only renderer available hook
|
||||
onPlayerApiReady(api: YoutubePlayer, context: RendererContext) {
|
||||
// set plugin config easily
|
||||
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 style as inline
|
||||
|
||||
import { createPlugin } from '@/utils';
|
||||
|
||||
export default createPlugin({
|
||||
name: 'Plugin Label',
|
||||
restartNeeded: true, // if value is true, ytmusic will show a restart dialog
|
||||
config: {
|
||||
enabled: false,
|
||||
}, // your custom config
|
||||
stylesheets: [style], // your custom style
|
||||
renderer() {} // define renderer hook
|
||||
});
|
||||
```
|
||||
|
||||
- Если вы хотите изменить HTML:
|
||||
|
||||
```typescript
|
||||
import { createPlugin } from '@/utils';
|
||||
|
||||
export default createPlugin({
|
||||
name: 'Plugin Label',
|
||||
restartNeeded: true, // if value is true, ytmusic will show the restart dialog
|
||||
config: {
|
||||
enabled: false,
|
||||
}, // your custom config
|
||||
renderer() {
|
||||
// Remove the login button
|
||||
document.querySelector(".sign-in-link.ytmusic-nav-bar").remove();
|
||||
} // define renderer hook
|
||||
});
|
||||
```
|
||||
|
||||
- обмен между фронтом и бэком может быть выполнен с помощью модуля 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 for Debian)
|
||||
- `pnpm dist:linux:rpm-arm64` - Linux (arm64 for Fedora)
|
||||
- `pnpm dist:mac` - macOS (amd64)
|
||||
- `pnpm dist:mac:arm64` - macOS (arm64)
|
||||
|
||||
Сборка приложения для macOS, Linux, и Windows,
|
||||
используя [electron-builder](https://github.com/electron-userland/electron-builder).
|
||||
|
||||
## Предварительный просмотр
|
||||
|
||||
```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> [обратный апостроф], если используете плагин "Меню в приложении")
|
||||
@ -1,17 +1,17 @@
|
||||
import { resolve, dirname, join } 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 { pluginVirtualModuleGenerator } from './vite-plugins/plugin-importer.mjs';
|
||||
import pluginLoader from './vite-plugins/plugin-loader.mjs';
|
||||
|
||||
import type { UserConfig } from 'vite';
|
||||
import { i18nImporter } from './vite-plugins/i18n-importer.mjs';
|
||||
import solidPlugin from 'vite-plugin-solid';
|
||||
|
||||
const __dirname = dirname(fileURLToPath(import.meta.url));
|
||||
|
||||
@ -51,8 +51,12 @@ export default defineConfig({
|
||||
};
|
||||
|
||||
if (mode === 'development') {
|
||||
commonConfig.build!.sourcemap = 'inline';
|
||||
commonConfig.plugins?.push(
|
||||
Inspect({ build: true, outputDir: join(__dirname, '.vite-inspect/backend') }),
|
||||
Inspect({
|
||||
build: true,
|
||||
outputDir: join(__dirname, '.vite-inspect/backend'),
|
||||
}),
|
||||
);
|
||||
return commonConfig;
|
||||
}
|
||||
@ -95,8 +99,12 @@ export default defineConfig({
|
||||
};
|
||||
|
||||
if (mode === 'development') {
|
||||
commonConfig.build!.sourcemap = 'inline';
|
||||
commonConfig.plugins?.push(
|
||||
Inspect({ build: true, outputDir: join(__dirname, '.vite-inspect/preload') }),
|
||||
Inspect({
|
||||
build: true,
|
||||
outputDir: join(__dirname, '.vite-inspect/preload'),
|
||||
}),
|
||||
);
|
||||
return commonConfig;
|
||||
}
|
||||
@ -139,11 +147,20 @@ export default defineConfig({
|
||||
resolve: {
|
||||
alias: resolveAlias,
|
||||
},
|
||||
server: {
|
||||
cors: {
|
||||
origin: 'https://music.youtube.com',
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
if (mode === 'development') {
|
||||
commonConfig.build!.sourcemap = 'inline';
|
||||
commonConfig.plugins?.push(
|
||||
Inspect({ build: true, outputDir: join(__dirname, '.vite-inspect/renderer') }),
|
||||
Inspect({
|
||||
build: true,
|
||||
outputDir: join(__dirname, '.vite-inspect/renderer'),
|
||||
}),
|
||||
);
|
||||
return commonConfig;
|
||||
}
|
||||
|
||||
80
eslint.config.mjs
Normal file
@ -0,0 +1,80 @@
|
||||
//@ts-check
|
||||
|
||||
import eslint from '@eslint/js';
|
||||
import prettier from 'eslint-plugin-prettier/recommended';
|
||||
import stylistic from '@stylistic/eslint-plugin-js';
|
||||
import tsEslint from 'typescript-eslint';
|
||||
|
||||
import * as importPlugin from 'eslint-plugin-import';
|
||||
|
||||
export default tsEslint.config(
|
||||
eslint.configs.recommended,
|
||||
tsEslint.configs.eslintRecommended,
|
||||
...tsEslint.configs.recommendedTypeChecked,
|
||||
prettier,
|
||||
{ ignores: ['dist', 'node_modules', '*.config.*js', '*.test.*js'] },
|
||||
{
|
||||
plugins: {
|
||||
stylistic,
|
||||
importPlugin
|
||||
},
|
||||
languageOptions: {
|
||||
parser: tsEslint.parser,
|
||||
parserOptions: {
|
||||
project: true,
|
||||
sourceType: 'module',
|
||||
ecmaVersion: 'latest'
|
||||
}
|
||||
},
|
||||
rules: {
|
||||
'stylistic/arrow-parens': ['error', 'always'],
|
||||
'stylistic/object-curly-spacing': ['error', 'always'],
|
||||
'prettier/prettier': ['error', { singleQuote: true, semi: true, tabWidth: 2, trailingComma: 'all', quoteProps: 'preserve' }],
|
||||
'@typescript-eslint/no-floating-promises': 'off',
|
||||
'@typescript-eslint/no-misused-promises': ['off', { checksVoidReturn: false }],
|
||||
'@typescript-eslint/no-unused-vars': ['warn', { argsIgnorePattern: '^_' }],
|
||||
'@typescript-eslint/no-non-null-assertion': 'off',
|
||||
'importPlugin/first': 'error',
|
||||
'importPlugin/newline-after-import': 'off',
|
||||
'importPlugin/no-default-export': 'off',
|
||||
'importPlugin/no-duplicates': 'error',
|
||||
'importPlugin/no-unresolved': ['error', { ignore: ['^virtual:', '\\?inline$', '\\?raw$', '\\?asset&asarUnpack'] }],
|
||||
'importPlugin/order': ['error', {
|
||||
'groups': ['builtin', 'external', ['internal', 'index', 'sibling'], 'parent', 'type'],
|
||||
'newlines-between': 'always-and-inside-groups',
|
||||
'alphabetize': { order: 'ignore', caseInsensitive: false }
|
||||
}],
|
||||
'importPlugin/prefer-default-export': 'off',
|
||||
'camelcase': ['error', { properties: 'never' }],
|
||||
'class-methods-use-this': 'off',
|
||||
'stylistic/lines-around-comment': ['error', {
|
||||
beforeBlockComment: false,
|
||||
afterBlockComment: false,
|
||||
beforeLineComment: false,
|
||||
afterLineComment: false,
|
||||
}],
|
||||
'stylistic/max-len': 'off',
|
||||
'stylistic/no-mixed-operators': 'warn', // prettier does not support no-mixed-operators
|
||||
'stylistic/no-multi-spaces': ['error', { ignoreEOLComments: true }],
|
||||
'stylistic/no-tabs': 'error',
|
||||
'no-void': 'error',
|
||||
'no-empty': 'off',
|
||||
'prefer-promise-reject-errors': 'off',
|
||||
'stylistic/quotes': ['error', 'single', {
|
||||
avoidEscape: true,
|
||||
allowTemplateLiterals: false,
|
||||
}],
|
||||
'stylistic/quote-props': ['error', 'consistent'],
|
||||
'stylistic/semi': ['error', 'always'],
|
||||
},
|
||||
settings: {
|
||||
'import/parsers': {
|
||||
'@typescript-eslint/parser': ['.ts']
|
||||
},
|
||||
'import/resolver': {
|
||||
typescript: {},
|
||||
exports: {},
|
||||
},
|
||||
},
|
||||
},
|
||||
);
|
||||
248
package.json
@ -1,7 +1,8 @@
|
||||
{
|
||||
"name": "youtube-music",
|
||||
"desktopName": "com.github.th_ch.youtube_music",
|
||||
"productName": "YouTube Music",
|
||||
"version": "3.4.0",
|
||||
"version": "3.7.3",
|
||||
"description": "YouTube Music Desktop App - including custom plugins",
|
||||
"main": "./dist/main/index.js",
|
||||
"license": "MIT",
|
||||
@ -21,7 +22,7 @@
|
||||
"license",
|
||||
"!node_modules",
|
||||
"node_modules/custom-electron-prompt/**",
|
||||
"node_modules/@cliqz/adblocker-electron-preload/**",
|
||||
"node_modules/@ghostery/adblocker-electron-preload/**",
|
||||
"node_modules/@ffmpeg.wasm/core-mt/**",
|
||||
"!node_modules/**/*.map",
|
||||
"!node_modules/**/*.ts"
|
||||
@ -40,7 +41,8 @@
|
||||
]
|
||||
}
|
||||
],
|
||||
"icon": "assets/generated/icons/mac/icon.icns"
|
||||
"icon": "assets/generated/icons/mac/icon.icns",
|
||||
"compression": "maximum"
|
||||
},
|
||||
"win": {
|
||||
"icon": "assets/generated/icons/win/icon.ico",
|
||||
@ -61,7 +63,8 @@
|
||||
"arm64"
|
||||
]
|
||||
}
|
||||
]
|
||||
],
|
||||
"compression": "maximum"
|
||||
},
|
||||
"nsisWeb": {
|
||||
"runAfterFinish": false
|
||||
@ -69,17 +72,109 @@
|
||||
"linux": {
|
||||
"icon": "assets/generated/icons/png",
|
||||
"category": "AudioVideo",
|
||||
"desktop": {
|
||||
"entry": {
|
||||
"StartupWMClass": "com.github.th_ch.youtube_music"
|
||||
}
|
||||
},
|
||||
"target": [
|
||||
"AppImage",
|
||||
"snap",
|
||||
"freebsd",
|
||||
"deb",
|
||||
"rpm"
|
||||
{
|
||||
"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": {
|
||||
@ -102,7 +197,8 @@
|
||||
"vite:inspect": "pnpm clean && electron-vite build --mode development && pnpm exec serve .vite-inspect",
|
||||
"start": "electron-vite preview",
|
||||
"start:debug": "cross-env ELECTRON_ENABLE_LOGGING=1 pnpm start",
|
||||
"dev": "electron-vite dev --watch",
|
||||
"dev": "cross-env NODE_OPTIONS=--enable-source-maps electron-vite dev --watch",
|
||||
"dev:renderer": "cross-env NODE_OPTIONS=--enable-source-maps electron-vite dev",
|
||||
"dev:debug": "cross-env ELECTRON_ENABLE_LOGGING=1 pnpm dev",
|
||||
"clean": "del-cli dist && del-cli pack && del-cli .vite-inspect",
|
||||
"dist": "pnpm clean && pnpm build && pnpm electron-builder --win --mac --linux -p never",
|
||||
@ -121,108 +217,124 @@
|
||||
"typecheck": "tsc -p tsconfig.json --noEmit"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=18.0.0",
|
||||
"node": ">=18",
|
||||
"pnpm": ">=8"
|
||||
},
|
||||
"pnpm": {
|
||||
"overrides": {
|
||||
"usocket": "1.0.1",
|
||||
"node-gyp": "10.2.0",
|
||||
"vite": "6.1.0",
|
||||
"node-gyp": "11.1.0",
|
||||
"xml2js": "0.6.2",
|
||||
"node-fetch": "3.3.2",
|
||||
"@electron/universal": "2.0.1",
|
||||
"@babel/runtime": "7.24.8"
|
||||
"@babel/runtime": "7.26.9"
|
||||
},
|
||||
"patchedDependencies": {
|
||||
"vudio@2.1.1": "patches/vudio@2.1.1.patch",
|
||||
"@xhayper/discord-rpc@1.1.2": "patches/@xhayper__discord-rpc@1.1.2.patch",
|
||||
"app-builder-lib@24.13.3": "patches/app-builder-lib@24.13.3.patch"
|
||||
}
|
||||
"app-builder-lib@26.0.6": "patches/app-builder-lib@26.0.6.patch",
|
||||
"@malept/flatpak-bundler": "patches/@malept__flatpak-bundler.patch"
|
||||
},
|
||||
"neverBuiltDependencies": []
|
||||
},
|
||||
"dependencies": {
|
||||
"@cliqz/adblocker-electron": "1.27.1",
|
||||
"@cliqz/adblocker-electron-preload": "1.27.1",
|
||||
"@electron-toolkit/tsconfig": "1.0.1",
|
||||
"@electron/remote": "2.1.2",
|
||||
"@ffmpeg.wasm/core-mt": "0.12.0",
|
||||
"@ffmpeg.wasm/main": "0.12.0",
|
||||
"@floating-ui/dom": "1.6.7",
|
||||
"@floating-ui/dom": "1.6.13",
|
||||
"@foobar404/wave": "2.0.5",
|
||||
"@ghostery/adblocker-electron": "2.5.0",
|
||||
"@ghostery/adblocker-electron-preload": "2.5.0",
|
||||
"@hono/node-server": "1.13.8",
|
||||
"@hono/swagger-ui": "0.5.0",
|
||||
"@hono/zod-openapi": "0.18.4",
|
||||
"@hono/zod-validator": "0.4.3",
|
||||
"@jellybrick/dbus-next": "0.10.3",
|
||||
"@jellybrick/electron-better-web-request": "1.0.4",
|
||||
"@jellybrick/mpris-service": "2.1.4",
|
||||
"@xhayper/discord-rpc": "1.1.2",
|
||||
"@jellybrick/mpris-service": "2.1.5",
|
||||
"@jimp/plugin-color": "1.6.0",
|
||||
"@skyra/jaro-winkler": "1.1.1",
|
||||
"@xhayper/discord-rpc": "1.2.0",
|
||||
"async-mutex": "0.5.0",
|
||||
"bgutils-js": "3.1.3",
|
||||
"butterchurn": "3.0.0-beta.4",
|
||||
"butterchurn-presets": "3.0.0-beta.4",
|
||||
"color": "4.2.3",
|
||||
"conf": "13.0.1",
|
||||
"custom-electron-prompt": "1.5.7",
|
||||
"dbus-next": "0.10.2",
|
||||
"deepmerge-ts": "7.0.3",
|
||||
"electron-debug": "4.0.0",
|
||||
"color": "5.0.0",
|
||||
"conf": "13.1.0",
|
||||
"custom-electron-prompt": "1.5.8",
|
||||
"deepmerge-ts": "7.1.4",
|
||||
"electron-debug": "4.1.0",
|
||||
"electron-is": "3.0.0",
|
||||
"electron-localshortcut": "3.2.1",
|
||||
"electron-store": "10.0.0",
|
||||
"electron-store": "10.0.1",
|
||||
"electron-unhandled": "4.0.1",
|
||||
"electron-updater": "6.2.1",
|
||||
"electron-updater": "6.3.9",
|
||||
"fast-average-color": "9.4.0",
|
||||
"fast-equals": "5.0.1",
|
||||
"fast-equals": "5.2.2",
|
||||
"filenamify": "6.0.0",
|
||||
"happy-dom": "17.1.0",
|
||||
"hono": "4.7.1",
|
||||
"howler": "2.2.4",
|
||||
"html-to-text": "9.0.5",
|
||||
"i18next": "23.12.1",
|
||||
"i18next": "24.2.2",
|
||||
"jimp": "1.6.0",
|
||||
"keyboardevent-from-electron-accelerator": "2.0.0",
|
||||
"keyboardevents-areequal": "0.2.2",
|
||||
"node-html-parser": "6.1.13",
|
||||
"node-id3": "0.2.6",
|
||||
"node-html-parser": "7.0.1",
|
||||
"node-id3": "0.2.7",
|
||||
"peerjs": "1.5.4",
|
||||
"semver": "7.6.2",
|
||||
"serve": "14.2.3",
|
||||
"semver": "7.7.1",
|
||||
"serve": "14.2.4",
|
||||
"simple-youtube-age-restriction-bypass": "github:organization/Simple-YouTube-Age-Restriction-Bypass#v2.5.9",
|
||||
"solid-floating-ui": "0.3.1",
|
||||
"solid-js": "1.8.18",
|
||||
"solid-js": "1.9.4",
|
||||
"solid-styled-components": "0.28.5",
|
||||
"solid-transition-group": "0.2.3",
|
||||
"ts-morph": "23.0.0",
|
||||
"solid-transition-group": "0.3.0",
|
||||
"ts-morph": "25.0.1",
|
||||
"vudio": "2.1.1",
|
||||
"x11": "2.3.0",
|
||||
"youtubei.js": "10.1.0"
|
||||
"youtubei.js": "13.0.0",
|
||||
"zod": "3.24.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@playwright/test": "1.45.1",
|
||||
"@total-typescript/ts-reset": "0.5.1",
|
||||
"@types/color": "3.0.6",
|
||||
"@eslint/js": "9.20.0",
|
||||
"@playwright/test": "1.50.1",
|
||||
"@stylistic/eslint-plugin-js": "3.1.0",
|
||||
"@total-typescript/ts-reset": "0.6.1",
|
||||
"@types/electron-localshortcut": "3.1.3",
|
||||
"@types/howler": "2.2.11",
|
||||
"@types/eslint__js": "8.42.3",
|
||||
"@types/howler": "2.2.12",
|
||||
"@types/html-to-text": "9.0.4",
|
||||
"@types/semver": "7.5.8",
|
||||
"@typescript-eslint/eslint-plugin": "7.16.0",
|
||||
"@typescript-eslint/parser": "7.16.0",
|
||||
"bufferutil": "4.0.8",
|
||||
"@types/trusted-types": "2.0.7",
|
||||
"bufferutil": "4.0.9",
|
||||
"builtin-modules": "4.0.0",
|
||||
"cross-env": "7.0.3",
|
||||
"del-cli": "5.1.0",
|
||||
"discord-api-types": "0.37.92",
|
||||
"electron": "31.2.0",
|
||||
"electron-builder": "24.13.3",
|
||||
"electron-devtools-installer": "3.2.0",
|
||||
"electron-vite": "2.3.0",
|
||||
"esbuild": "0.23.0",
|
||||
"eslint": "8.57.0",
|
||||
"del-cli": "6.0.0",
|
||||
"discord-api-types": "0.37.119",
|
||||
"electron": "34.2.0",
|
||||
"electron-builder": "26.0.6",
|
||||
"electron-builder-squirrel-windows": "26.0.6",
|
||||
"electron-devtools-installer": "4.0.0",
|
||||
"electron-vite": "3.0.0",
|
||||
"esbuild": "0.25.0",
|
||||
"eslint": "9.20.1",
|
||||
"eslint-config-prettier": "10.0.1",
|
||||
"eslint-import-resolver-exports": "1.0.0-beta.5",
|
||||
"eslint-import-resolver-typescript": "3.6.1",
|
||||
"eslint-plugin-import": "2.29.1",
|
||||
"eslint-plugin-prettier": "5.1.3",
|
||||
"glob": "11.0.0",
|
||||
"node-gyp": "10.2.0",
|
||||
"playwright": "1.45.1",
|
||||
"rollup": "4.18.1",
|
||||
"typescript": "5.5.3",
|
||||
"utf-8-validate": "6.0.4",
|
||||
"vite": "5.3.3",
|
||||
"vite-plugin-inspect": "0.8.4",
|
||||
"vite-plugin-resolve": "2.5.1",
|
||||
"vite-plugin-solid": "2.10.2",
|
||||
"eslint-import-resolver-typescript": "3.8.0",
|
||||
"eslint-plugin-import": "2.31.0",
|
||||
"eslint-plugin-prettier": "5.2.3",
|
||||
"glob": "11.0.1",
|
||||
"node-gyp": "11.1.0",
|
||||
"playwright": "1.50.1",
|
||||
"rollup": "4.34.7",
|
||||
"typescript": "5.7.3",
|
||||
"typescript-eslint": "8.24.0",
|
||||
"utf-8-validate": "6.0.5",
|
||||
"vite": "6.1.0",
|
||||
"vite-plugin-inspect": "10.2.1",
|
||||
"vite-plugin-resolve": "2.5.2",
|
||||
"vite-plugin-solid": "2.11.1",
|
||||
"ws": "8.18.0"
|
||||
},
|
||||
"auto-changelog": {
|
||||
|
||||
29
patches/@malept__flatpak-bundler.patch
Normal file
@ -0,0 +1,29 @@
|
||||
diff --git a/index.js b/index.js
|
||||
index 5968fcf47b69094993b0f861c03f5560e4a6a9b7..0fe16d4f40612c0abfa57898909ce0083f56944c 100644
|
||||
--- a/index.js
|
||||
+++ b/index.js
|
||||
@@ -56,19 +56,23 @@ function getOptionsWithDefaults (options, manifest) {
|
||||
async function spawnWithLogging (options, command, args, allowFail) {
|
||||
return new Promise((resolve, reject) => {
|
||||
logger(`$ ${command} ${args.join(' ')}`)
|
||||
+ const output = []
|
||||
const child = childProcess.spawn(command, args, { cwd: options['working-dir'] })
|
||||
child.stdout.on('data', (data) => {
|
||||
+ output.push(data)
|
||||
logger(`1> ${data}`)
|
||||
})
|
||||
child.stderr.on('data', (data) => {
|
||||
+ output.push(data)
|
||||
logger(`2> ${data}`)
|
||||
})
|
||||
child.on('error', (error) => {
|
||||
+ logger(`error - ${error.message} ${error.stack}`)
|
||||
reject(error)
|
||||
})
|
||||
child.on('close', (code) => {
|
||||
if (!allowFail && code !== 0) {
|
||||
- reject(new Error(`${command} failed with status code ${code}`))
|
||||
+ reject(new Error(`${command} ${args.join(' ')} failed with status code ${code} ${output.join(' ')}`))
|
||||
}
|
||||
resolve(code === 0)
|
||||
})
|
||||
@ -1,17 +0,0 @@
|
||||
diff --git a/package.json b/package.json
|
||||
index 40db5dfbd8a4455ce2987d8115eca9882e1f9f14..414fc6986b9c0cc288908eb0107b90c4bfd916b2 100644
|
||||
--- a/package.json
|
||||
+++ b/package.json
|
||||
@@ -25,11 +25,7 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"axios": "^1.6.2",
|
||||
- "ws": "^8.15.1"
|
||||
- },
|
||||
- "optionalDependencies": {
|
||||
- "bufferutil": "^4.0.8",
|
||||
- "utf-8-validate": "^6.0.3"
|
||||
+ "ws": "^8.16.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^14.*",
|
||||
7119
pnpm-lock.yaml
generated
@ -1,8 +1,6 @@
|
||||
{
|
||||
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
|
||||
"extends": [
|
||||
"config:base"
|
||||
],
|
||||
"extends": ["config:recommended"],
|
||||
"labels": ["dependencies"],
|
||||
"postUpdateOptions": ["pnpmDedupe"]
|
||||
}
|
||||
|
||||
@ -1,9 +1,8 @@
|
||||
import Store from 'electron-store';
|
||||
import { deepmergeCustom } from 'deepmerge-ts';
|
||||
|
||||
import defaultConfig from './defaults';
|
||||
|
||||
import store from './store';
|
||||
import store, { IStore } from './store';
|
||||
import plugins from './plugins';
|
||||
|
||||
import { restart } from '@/providers/app-controls';
|
||||
@ -62,20 +61,19 @@ type Join<K, P> = K extends string | number
|
||||
type Paths<T, D extends number = 10> = [D] extends [never]
|
||||
? never
|
||||
: T extends object
|
||||
? {
|
||||
[K in keyof T]-?: K extends string | number
|
||||
? `${K}` | Join<K, Paths<T[K], Prev[D]>>
|
||||
: never;
|
||||
}[keyof T]
|
||||
: '';
|
||||
? {
|
||||
[K in keyof T]-?: K extends string | number
|
||||
? `${K}` | Join<K, Paths<T[K], Prev[D]>>
|
||||
: never;
|
||||
}[keyof T]
|
||||
: '';
|
||||
|
||||
type SplitKey<K> = K extends `${infer A}.${infer B}` ? [A, B] : [K, string];
|
||||
type PathValue<T, K extends string> = SplitKey<K> extends [
|
||||
infer A extends keyof T,
|
||||
infer B extends string,
|
||||
]
|
||||
? PathValue<T[A], B>
|
||||
: T;
|
||||
type PathValue<T, K extends string> =
|
||||
SplitKey<K> extends [infer A extends keyof T, infer B extends string]
|
||||
? PathValue<T[A], B>
|
||||
: T;
|
||||
|
||||
const get = <Key extends Paths<typeof defaultConfig>>(key: Key) =>
|
||||
store.get(key) as PathValue<typeof defaultConfig, typeof key>;
|
||||
|
||||
@ -86,7 +84,7 @@ export default {
|
||||
setPartial,
|
||||
setMenuOption,
|
||||
edit: () => store.openInEditor(),
|
||||
watch(cb: Parameters<Store['onDidAnyChange']>[0]) {
|
||||
watch(cb: Parameters<IStore['onDidAnyChange']>[0]) {
|
||||
store.onDidAnyChange(cb);
|
||||
},
|
||||
plugins,
|
||||
|
||||
@ -1,12 +1,14 @@
|
||||
import Store from 'electron-store';
|
||||
import Conf from 'conf';
|
||||
|
||||
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>>>;
|
||||
|
||||
const migrations = {
|
||||
'>=3.3.0'(store: Conf<Record<string, unknown>>) {
|
||||
'>=3.3.0'(store: IStore) {
|
||||
const lastfmConfig = store.get('plugins.lastfm') as {
|
||||
enabled?: boolean;
|
||||
token?: string;
|
||||
@ -16,21 +18,21 @@ const migrations = {
|
||||
secret?: string;
|
||||
};
|
||||
if (lastfmConfig) {
|
||||
let scrobblerConfig = store.get(
|
||||
'plugins.scrobbler',
|
||||
) as {
|
||||
enabled?: boolean;
|
||||
scrobblers?: {
|
||||
lastfm?: {
|
||||
let scrobblerConfig = store.get('plugins.scrobbler') as
|
||||
| {
|
||||
enabled?: boolean;
|
||||
token?: string;
|
||||
sessionKey?: string;
|
||||
apiRoot?: string;
|
||||
apiKey?: string;
|
||||
secret?: string;
|
||||
};
|
||||
};
|
||||
} | undefined;
|
||||
scrobblers?: {
|
||||
lastfm?: {
|
||||
enabled?: boolean;
|
||||
token?: string;
|
||||
sessionKey?: string;
|
||||
apiRoot?: string;
|
||||
apiKey?: string;
|
||||
secret?: string;
|
||||
};
|
||||
};
|
||||
}
|
||||
| undefined;
|
||||
|
||||
if (!scrobblerConfig) {
|
||||
scrobblerConfig = {
|
||||
@ -56,7 +58,7 @@ const migrations = {
|
||||
store.delete('plugins.lastfm');
|
||||
}
|
||||
},
|
||||
'>=3.0.0'(store: Conf<Record<string, unknown>>) {
|
||||
'>=3.0.0'(store: IStore) {
|
||||
const discordConfig = store.get('plugins.discord') as Record<
|
||||
string,
|
||||
unknown
|
||||
@ -78,14 +80,14 @@ const migrations = {
|
||||
}
|
||||
}
|
||||
},
|
||||
'>=2.1.3'(store: Conf<Record<string, unknown>>) {
|
||||
'>=2.1.3'(store: IStore) {
|
||||
const listenAlong = store.get('plugins.discord.listenAlong');
|
||||
if (listenAlong !== undefined) {
|
||||
store.set('plugins.discord.playOnYouTubeMusic', listenAlong);
|
||||
store.delete('plugins.discord.listenAlong');
|
||||
}
|
||||
},
|
||||
'>=2.1.0'(store: Conf<Record<string, unknown>>) {
|
||||
'>=2.1.0'(store: IStore) {
|
||||
const originalPreset = store.get('plugins.downloader.preset') as
|
||||
| string
|
||||
| undefined;
|
||||
@ -110,7 +112,7 @@ const migrations = {
|
||||
store.delete('plugins.downloader.ffmpegArgs');
|
||||
}
|
||||
},
|
||||
'>=1.20.0'(store: Conf<Record<string, unknown>>) {
|
||||
'>=1.20.0'(store: IStore) {
|
||||
store.delete('plugins.visualizer'); // default value is now in the plugin
|
||||
|
||||
if (store.get('plugins.notifications.toastStyle') === undefined) {
|
||||
@ -125,14 +127,14 @@ const migrations = {
|
||||
store.set('options.likeButtons', 'force');
|
||||
}
|
||||
},
|
||||
'>=1.17.0'(store: Conf<Record<string, unknown>>) {
|
||||
'>=1.17.0'(store: IStore) {
|
||||
store.delete('plugins.picture-in-picture'); // default value is now in the plugin
|
||||
|
||||
if (store.get('plugins.video-toggle.mode') === undefined) {
|
||||
store.set('plugins.video-toggle.mode', 'custom');
|
||||
}
|
||||
},
|
||||
'>=1.14.0'(store: Conf<Record<string, unknown>>) {
|
||||
'>=1.14.0'(store: IStore) {
|
||||
if (
|
||||
typeof store.get('plugins.precise-volume.globalShortcuts') !== 'object'
|
||||
) {
|
||||
@ -144,12 +146,12 @@ const migrations = {
|
||||
store.set('plugins.video-toggle.enabled', true);
|
||||
}
|
||||
},
|
||||
'>=1.13.0'(store: Conf<Record<string, unknown>>) {
|
||||
'>=1.13.0'(store: IStore) {
|
||||
if (store.get('plugins.discord.listenAlong') === undefined) {
|
||||
store.set('plugins.discord.listenAlong', true);
|
||||
}
|
||||
},
|
||||
'>=1.12.0'(store: Conf<Record<string, unknown>>) {
|
||||
'>=1.12.0'(store: IStore) {
|
||||
const options = store.get('plugins.shortcuts') as
|
||||
| Record<
|
||||
string,
|
||||
@ -187,12 +189,12 @@ const migrations = {
|
||||
}
|
||||
}
|
||||
},
|
||||
'>=1.11.0'(store: Conf<Record<string, unknown>>) {
|
||||
'>=1.11.0'(store: IStore) {
|
||||
if (store.get('options.resumeOnStart') === undefined) {
|
||||
store.set('options.resumeOnStart', true);
|
||||
}
|
||||
},
|
||||
'>=1.7.0'(store: Conf<Record<string, unknown>>) {
|
||||
'>=1.7.0'(store: IStore) {
|
||||
const enabledPlugins = store.get('plugins') as string[];
|
||||
if (!Array.isArray(enabledPlugins)) {
|
||||
console.warn('Plugins are not in array format, cannot migrate');
|
||||
@ -233,4 +235,4 @@ export default new Store({
|
||||
},
|
||||
clearInvalidConfig: false,
|
||||
migrations,
|
||||
});
|
||||
}) as Store & IStore;
|
||||
|
||||
38
src/custom-electron-prompt.d.ts
vendored
@ -64,29 +64,29 @@ declare module 'custom-electron-prompt' {
|
||||
export type PromptOptions<T extends string> = T extends 'input'
|
||||
? InputPromptOptions
|
||||
: T extends 'select'
|
||||
? SelectPromptOptions
|
||||
: T extends 'counter'
|
||||
? CounterPromptOptions
|
||||
: T extends 'keybind'
|
||||
? KeybindPromptOptions
|
||||
: T extends 'multiInput'
|
||||
? MultiInputPromptOptions
|
||||
: never;
|
||||
? SelectPromptOptions
|
||||
: T extends 'counter'
|
||||
? CounterPromptOptions
|
||||
: T extends 'keybind'
|
||||
? KeybindPromptOptions
|
||||
: T extends 'multiInput'
|
||||
? MultiInputPromptOptions
|
||||
: never;
|
||||
|
||||
type PromptResult<T extends string> = T extends 'input'
|
||||
? string
|
||||
: T extends 'select'
|
||||
? string
|
||||
: T extends 'counter'
|
||||
? number
|
||||
: T extends 'keybind'
|
||||
? {
|
||||
value: string;
|
||||
accelerator: string;
|
||||
}[]
|
||||
: T extends 'multiInput'
|
||||
? string[]
|
||||
: never;
|
||||
? string
|
||||
: T extends 'counter'
|
||||
? number
|
||||
: T extends 'keybind'
|
||||
? {
|
||||
value: string;
|
||||
accelerator: string;
|
||||
}[]
|
||||
: T extends 'multiInput'
|
||||
? string[]
|
||||
: never;
|
||||
|
||||
const prompt: <T extends Type>(
|
||||
options?: PromptOptions<T> & { type: T },
|
||||
|
||||
@ -14,9 +14,9 @@
|
||||
}
|
||||
},
|
||||
"language": {
|
||||
"code": "إنجليزي",
|
||||
"local-name": "الإنجليزي",
|
||||
"name": "الإنجليزية"
|
||||
"code": "ar",
|
||||
"local-name": "العربية",
|
||||
"name": "Arabic"
|
||||
},
|
||||
"main": {
|
||||
"console": {
|
||||
@ -194,7 +194,133 @@
|
||||
}
|
||||
},
|
||||
"tray": {
|
||||
"next": "التالي"
|
||||
"next": "التالي",
|
||||
"play-pause": "تشغيل/إيقاف",
|
||||
"previous": "السابق",
|
||||
"quit": "خروج",
|
||||
"restart": "إعادة تشغيل التطبيق",
|
||||
"show": "عرض النافدة",
|
||||
"tooltip": {
|
||||
"default": "يوتيوب اغاني",
|
||||
"with-song-info": "يوتيوب أغاني: {{الفنان}}-{{العنوان}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"ad-speedup": {
|
||||
"description": "إذا تم عرض إعلان, فإن الصوت سيتم كتمانه وسيتم وضع سرعة التشغيل الى 16x",
|
||||
"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": "الوضع المحيطي"
|
||||
},
|
||||
"api-server": {
|
||||
"description": "يضيف خادم للتحكم في المشغل",
|
||||
"dialog": {
|
||||
"request": {
|
||||
"buttons": {
|
||||
"allow": "سماح",
|
||||
"deny": "رفض"
|
||||
}
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"hostname": {
|
||||
"label": "اسم المضيف"
|
||||
}
|
||||
},
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"title": "اسم الخادم"
|
||||
}
|
||||
}
|
||||
},
|
||||
"blur-nav-bar": {
|
||||
"description": "يجعل شريط التنقل شفاف و ضبابي"
|
||||
},
|
||||
"bypass-age-restrictions": {
|
||||
"description": "تجاوز تَحَقّق اليوتيوب من السن",
|
||||
"name": "تجاوز التحقق من السن"
|
||||
},
|
||||
"downloader": {
|
||||
"backend": {
|
||||
"feedback": {
|
||||
"downloading-counter": "تنزيل {{current}}/{{total}}…",
|
||||
"error-while-downloading": "خطأ في تحميل \"{{author}} - {{title}}\": {{error}}",
|
||||
"loading": "جار التحميل…",
|
||||
"preparing-file": "يتم تجهيز الملف…",
|
||||
"saving": "يتم الحفظ…",
|
||||
"video-id-not-found": "لم يتم ايجاد الفيديو"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"choose-download-folder": "اختر مكان التحميل"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
813
src/i18n/resources/ca.json
Normal file
@ -0,0 +1,813 @@
|
||||
{
|
||||
"common": {
|
||||
"console": {
|
||||
"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}}»",
|
||||
"load-all": "Carregant totes les extensions",
|
||||
"load-failed": "Error al carregar l'extensió «{{pluginName}}»",
|
||||
"loaded": "L'extensió «{{pluginName}}» s'ha carregat",
|
||||
"unload-failed": "Error al deshabilitar l'extensió «{{pluginName}}»",
|
||||
"unloaded": "Extensió «{{pluginName}}» deshabilitada"
|
||||
}
|
||||
}
|
||||
},
|
||||
"language": {
|
||||
"code": "ca",
|
||||
"local-name": "Català",
|
||||
"name": "Catalan"
|
||||
},
|
||||
"main": {
|
||||
"console": {
|
||||
"did-finish-load": {
|
||||
"dev-tools": "Càrrega finalitzada. S'han obert les DevTools"
|
||||
},
|
||||
"i18n": {
|
||||
"loaded": "i18n carregat"
|
||||
},
|
||||
"second-instance": {
|
||||
"receive-command": "Comanda rebuda a través del protocol: «{{command}}»"
|
||||
},
|
||||
"theme": {
|
||||
"css-file-not-found": "L'arxiu CSS «{{cssFile}}» no existeix, s'ha ignorat"
|
||||
},
|
||||
"unresponsive": {
|
||||
"details": "Error sense resposta!\n{{error}}"
|
||||
},
|
||||
"when-ready": {
|
||||
"clearing-cache-after-20s": "Netejant la memòria cau de l'aplicació"
|
||||
},
|
||||
"window": {
|
||||
"tried-to-render-offscreen": "La finestra s'ha intentat mostrar fora de la pantalla, windowSize={{windowSize}}, displaySize={{displaySize}}, position={{position}}"
|
||||
}
|
||||
},
|
||||
"dialog": {
|
||||
"hide-menu-enabled": {
|
||||
"detail": "El menú es troba amagat, premi «Alt» per mostrar-lo (o «Escapament» si utilitza el menú integrat In-App)",
|
||||
"message": "S'ha habilitat l'amagament del menú",
|
||||
"title": "Amagament del menú habilitat"
|
||||
},
|
||||
"need-to-restart": {
|
||||
"buttons": {
|
||||
"later": "Més tard",
|
||||
"restart-now": "Reinicia ara"
|
||||
},
|
||||
"detail": "L'extensió «{{pluginName}}» requereix reiniciar l'aplicació per fer tenir efecte",
|
||||
"message": "\"{{pluginName}}\" necessita reiniciar-se",
|
||||
"title": "Es requereix reiniciar"
|
||||
},
|
||||
"unresponsive": {
|
||||
"buttons": {
|
||||
"quit": "Marxar",
|
||||
"relaunch": "Rellançar",
|
||||
"wait": "Espera"
|
||||
},
|
||||
"detail": "Ho sentim per les molèsties! si us plau, tria què fer:",
|
||||
"message": "L'aplicació ha deixat de respondre",
|
||||
"title": "La finestra ha deixat de respondre"
|
||||
},
|
||||
"update-available": {
|
||||
"buttons": {
|
||||
"disable": "Deshabilita les actualitzacions",
|
||||
"download": "Descarrega",
|
||||
"ok": "D'acord"
|
||||
},
|
||||
"detail": "Hi ha una nova versió disponible i pot ser descarregada a {{downloadLink}}",
|
||||
"message": "Hi ha una nova versió disponible",
|
||||
"title": "Actualització disponible"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"about": "Quant a",
|
||||
"navigation": {
|
||||
"label": "Navegació",
|
||||
"submenu": {
|
||||
"copy-current-url": "Copia l'URL actual",
|
||||
"go-back": "Ves enrere",
|
||||
"go-forward": "Ves endavant",
|
||||
"quit": "Surt",
|
||||
"restart": "Reinicia l'aplicació"
|
||||
}
|
||||
},
|
||||
"options": {
|
||||
"label": "Opcions",
|
||||
"submenu": {
|
||||
"advanced-options": {
|
||||
"label": "Opcions avançades",
|
||||
"submenu": {
|
||||
"auto-reset-app-cache": "Reinicialitza la memòria cau de l'aplicació quan es reiniciï",
|
||||
"disable-hardware-acceleration": "Deshabilita l'acceleració per hardware",
|
||||
"edit-config-json": "Edita el config.json",
|
||||
"override-user-agent": "Sobreescriu l'agent d'usuari (User-Agent)",
|
||||
"restart-on-config-changes": "Reinicia quan es canviï la configuració",
|
||||
"set-proxy": {
|
||||
"label": "Definir servidor intermediari (proxy)",
|
||||
"prompt": {
|
||||
"label": "Introduir l'adreça del servidor intermediari: (deixar en blanc per deshabilitar)",
|
||||
"placeholder": "Exemple: SOCKS5://127.0.0.1:9999",
|
||||
"title": "Definir servidor intermediari (proxy)"
|
||||
}
|
||||
},
|
||||
"toggle-dev-tools": "Commuta les DevTools"
|
||||
}
|
||||
},
|
||||
"always-on-top": "Mostra sempre per sobre",
|
||||
"auto-update": "Actualitza automàticament",
|
||||
"hide-menu": {
|
||||
"dialog": {
|
||||
"message": "El menú s'amagarà la següent vegada que s'iniciï l'aplicació, prem «Alt» per mostrar-lo (o accent obert « ` » si utilitza el menú integrat In-App)",
|
||||
"title": "Amagament del menú habilitat"
|
||||
},
|
||||
"label": "Amaga el menú"
|
||||
},
|
||||
"language": {
|
||||
"dialog": {
|
||||
"message": "L'idioma es canviarà un cop es reiniciï",
|
||||
"title": "Idioma canviat"
|
||||
},
|
||||
"label": "Idioma",
|
||||
"submenu": {
|
||||
"to-help-translate": "Vols ajudar a traduir? Clica aquí"
|
||||
}
|
||||
},
|
||||
"resume-on-start": "Reprèn l'última cançó quan s'inicia l'aplicació",
|
||||
"single-instance-lock": "Bloqueja en una única instància",
|
||||
"start-at-login": "Obre a l'iniciar sessió",
|
||||
"starting-page": {
|
||||
"label": "Pàgina d'inici",
|
||||
"unset": "Sense establir"
|
||||
},
|
||||
"tray": {
|
||||
"label": "Safata d'icones",
|
||||
"submenu": {
|
||||
"disabled": "Deshabilitat",
|
||||
"enabled-and-hide-app": "Mostra la icona i amaga l'aplicació",
|
||||
"enabled-and-show-app": "Mostra la icona i mostra l'aplicació",
|
||||
"play-pause-on-click": "Reprodueix / pausa en clicar"
|
||||
}
|
||||
},
|
||||
"visual-tweaks": {
|
||||
"label": "Opcions visuals",
|
||||
"submenu": {
|
||||
"like-buttons": {
|
||||
"default": "Per defecte",
|
||||
"force-show": "Força que es mostri",
|
||||
"hide": "Amaga",
|
||||
"label": "Botons de «m'agrada»"
|
||||
},
|
||||
"remove-upgrade-button": "Elimina el botó «Actualitza a Music Premium»",
|
||||
"theme": {
|
||||
"dialog": {
|
||||
"button": {
|
||||
"cancel": "Cancel·la",
|
||||
"remove": "Elimina"
|
||||
},
|
||||
"remove-theme": "De debó vols eliminar el tema personalitzat?",
|
||||
"remove-theme-message": "Això eliminarà el tema personalitzat"
|
||||
},
|
||||
"label": "Tema",
|
||||
"submenu": {
|
||||
"import-css-file": "Importa un arxiu CSS personalitzat",
|
||||
"no-theme": "Cap tema"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"enabled": "Habilitat",
|
||||
"label": "Extensions",
|
||||
"new": "NOU"
|
||||
},
|
||||
"view": {
|
||||
"label": "Veure",
|
||||
"submenu": {
|
||||
"force-reload": "Força la recàrrega",
|
||||
"reload": "Recarrega",
|
||||
"reset-zoom": "Mida real",
|
||||
"toggle-fullscreen": "Commuta la pantalla completa",
|
||||
"zoom-in": "Apropa el zoom",
|
||||
"zoom-out": "Allunya el zoom"
|
||||
}
|
||||
}
|
||||
},
|
||||
"tray": {
|
||||
"next": "Següent",
|
||||
"play-pause": "Reprodueix/Pausa",
|
||||
"previous": "Anterior",
|
||||
"quit": "Tanca",
|
||||
"restart": "Reinicia l'aplicació",
|
||||
"show": "Mostra la finestra",
|
||||
"tooltip": {
|
||||
"default": "YouTube Music",
|
||||
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"ad-speedup": {
|
||||
"description": "Si es reprodueix un anunci, silencia l'àudio i el reprodueix a la velocitat 16x",
|
||||
"name": "Accelera els anuncis"
|
||||
},
|
||||
"adblocker": {
|
||||
"description": "Bloqueja tots els anuncis i el seguiment",
|
||||
"menu": {
|
||||
"blocker": "Bloquejador"
|
||||
},
|
||||
"name": "Bloquejador d'anuncis"
|
||||
},
|
||||
"album-actions": {
|
||||
"description": "Afegeix botons de «no m'agrada / retirar el no m'agrada» i «m'agrada / retirar el m'agrada» per aplicar-ho a totes les cançons en una llista de reproducció o àlbum",
|
||||
"name": "Accions a l'àlbum"
|
||||
},
|
||||
"album-color-theme": {
|
||||
"description": "Aplica un tema dinàmic i efectes visuals basats en la paleta de colors de l'àlbum",
|
||||
"menu": {
|
||||
"color-mix-ratio": {
|
||||
"label": "Proporció de la barreja de colors",
|
||||
"submenu": {
|
||||
"percent": "{{ratio}}%"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Tema de color de l'àlbum"
|
||||
},
|
||||
"ambient-mode": {
|
||||
"description": "Aplica un efecte d'il·luminació que projecta colors difusos del vídeo al fons de la pantalla",
|
||||
"menu": {
|
||||
"blur-amount": {
|
||||
"label": "Quantitat de desenfocament",
|
||||
"submenu": {
|
||||
"pixels": "{{blurAmount}} píxels"
|
||||
}
|
||||
},
|
||||
"buffer": {
|
||||
"label": "Buffer",
|
||||
"submenu": {
|
||||
"buffer": "{{buffer}}"
|
||||
}
|
||||
},
|
||||
"opacity": {
|
||||
"label": "Opacitat",
|
||||
"submenu": {
|
||||
"percent": "{{opacity}}%"
|
||||
}
|
||||
},
|
||||
"quality": {
|
||||
"label": "Qualitat",
|
||||
"submenu": {
|
||||
"pixels": "{{quality}} píxels"
|
||||
}
|
||||
},
|
||||
"size": {
|
||||
"label": "Mida",
|
||||
"submenu": {
|
||||
"percent": "{{size}}%"
|
||||
}
|
||||
},
|
||||
"smoothness-transition": {
|
||||
"label": "Transició suau",
|
||||
"submenu": {
|
||||
"during": "Durant {{interpolationTime}} s"
|
||||
}
|
||||
},
|
||||
"use-fullscreen": {
|
||||
"label": "Utilitza en pantalla completa"
|
||||
}
|
||||
},
|
||||
"name": "Mode ambient"
|
||||
},
|
||||
"api-server": {
|
||||
"description": "Afegeix un servidor API per controlar el reproductor",
|
||||
"dialog": {
|
||||
"request": {
|
||||
"buttons": {
|
||||
"allow": "Permet",
|
||||
"deny": "Denegar"
|
||||
},
|
||||
"message": "Permetre que {{ID}} ({{origin}}) accedeixi a l'API?",
|
||||
"title": "Petició d'autorització API"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"auth-strategy": {
|
||||
"label": "Estratègia d'autorització",
|
||||
"submenu": {
|
||||
"auth-at-first": {
|
||||
"label": "Autoritza a la primera petició"
|
||||
},
|
||||
"none": {
|
||||
"label": "Sense autorització"
|
||||
}
|
||||
}
|
||||
},
|
||||
"hostname": {
|
||||
"label": "Nom del host"
|
||||
},
|
||||
"port": {
|
||||
"label": "Port"
|
||||
}
|
||||
},
|
||||
"name": "Servidor API [Beta]",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "Introdueix el nom del host (per exemple 0.0.0.0) pel servidor API:",
|
||||
"title": "Nom del host"
|
||||
},
|
||||
"port": {
|
||||
"label": "Introdueix el port pel servidor API:",
|
||||
"title": "Port"
|
||||
}
|
||||
}
|
||||
},
|
||||
"audio-compressor": {
|
||||
"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"
|
||||
},
|
||||
"blur-nav-bar": {
|
||||
"description": "Desenfoca i aplica transparència a la barra de navegació",
|
||||
"name": "Desenfoca la barra de navegació"
|
||||
},
|
||||
"bypass-age-restrictions": {
|
||||
"description": "Esquiva la verificació d'edat de YouTube",
|
||||
"name": "Esquiva les restriccions d'edat"
|
||||
},
|
||||
"captions-selector": {
|
||||
"description": "Selector de subtítols per les pistes d'àudio de YouTube Music",
|
||||
"menu": {
|
||||
"autoload": "Selecciona automàticament l'últim subtítol emprat",
|
||||
"disable-captions": "Sense subtítols per defecte"
|
||||
},
|
||||
"name": "Selector de subtítols",
|
||||
"prompt": {
|
||||
"selector": {
|
||||
"label": "Idioma actual dels subtítols: {{language}}",
|
||||
"none": "Cap",
|
||||
"title": "Selecciona l'idioma dels subtítols"
|
||||
}
|
||||
},
|
||||
"templates": {
|
||||
"title": "Obra el selector de subtítols"
|
||||
}
|
||||
},
|
||||
"compact-sidebar": {
|
||||
"description": "Sempre mostrar la barra lateral en mode compacte",
|
||||
"name": "Barra lateral compacta"
|
||||
},
|
||||
"crossfade": {
|
||||
"description": "Transició creuada (crossfade) entre cançons",
|
||||
"menu": {
|
||||
"advanced": "Avançat"
|
||||
},
|
||||
"name": "Transició creuada [Beta]",
|
||||
"prompt": {
|
||||
"options": {
|
||||
"multi-input": {
|
||||
"fade-in-duration": "Durada de la transició d'entrada (ms)",
|
||||
"fade-out-duration": "Durada de la transició de sortida (ms)",
|
||||
"fade-scaling": {
|
||||
"label": "Escala de la transició",
|
||||
"linear": "Linear",
|
||||
"logarithmic": "Logarítmica"
|
||||
},
|
||||
"seconds-before-end": "Transiciona N segons abans del final"
|
||||
},
|
||||
"title": "Opcions de transició creuada"
|
||||
}
|
||||
}
|
||||
},
|
||||
"disable-autoplay": {
|
||||
"description": "Fa que la cançó comenci en mode «pausat»",
|
||||
"menu": {
|
||||
"apply-once": "Tan sols s'aplica a l'inici"
|
||||
},
|
||||
"name": "Deshabilita la reproducció automàtica"
|
||||
},
|
||||
"discord": {
|
||||
"backend": {
|
||||
"already-connected": "S'ha intentat connectar amb una connexió activa",
|
||||
"connected": "Connectat a Discord",
|
||||
"disconnected": "Desconnectat de Discord"
|
||||
},
|
||||
"description": "Mostra als teus amics allò que escoltes a l'estat d'activitat",
|
||||
"menu": {
|
||||
"auto-reconnect": "Reconnecta automàticament",
|
||||
"clear-activity": "Esborra l'activitat",
|
||||
"clear-activity-after-timeout": "Esborra l'activitat al cap d'un temps",
|
||||
"connected": "Connectat",
|
||||
"disconnected": "Desconnectat",
|
||||
"hide-duration-left": "Amaga la durada restant",
|
||||
"hide-github-button": "Amaga el botó de l'enllaç a GitHub",
|
||||
"play-on-youtube-music": "Reprodueix a YouTube Music",
|
||||
"set-inactivity-timeout": "Estableix temps d'espera d'inactivitat"
|
||||
},
|
||||
"name": "Estat d'activitat de Discord",
|
||||
"prompt": {
|
||||
"set-inactivity-timeout": {
|
||||
"label": "Introdueix el temps d'espera d'inactivitat en segons:",
|
||||
"title": "Estableix el temps d'espera d'inactivitat"
|
||||
}
|
||||
}
|
||||
},
|
||||
"downloader": {
|
||||
"backend": {
|
||||
"dialog": {
|
||||
"error": {
|
||||
"buttons": {
|
||||
"ok": "D'acord"
|
||||
},
|
||||
"message": "Caram! Ho sentim, ha fallat la descàrrega…",
|
||||
"title": "Error a la descàrrega!"
|
||||
},
|
||||
"start-download-playlist": {
|
||||
"buttons": {
|
||||
"ok": "D'acord"
|
||||
},
|
||||
"detail": "({{playlistSize}} cançons)",
|
||||
"message": "Descarregant llista de reproducció {{playlistTitle}}",
|
||||
"title": "Descàrrega començada"
|
||||
}
|
||||
},
|
||||
"feedback": {
|
||||
"conversion-progress": "Conversió: {{percent}}%",
|
||||
"converting": "Convertint…",
|
||||
"done": "Fet: {{filePath}}",
|
||||
"download-info": "Descarregant {{artist}} - {{title}} [{{videoId}}",
|
||||
"download-progress": "Descàrrega: {{percent}}%",
|
||||
"downloading": "Descarregant…",
|
||||
"downloading-counter": "Descarregant {{current}}/{{total}}…",
|
||||
"downloading-playlist": "Descarregant la llista de reproducció «{{playlistTitle}}» - {{playlistSize}} cançons ({{playlistId}})",
|
||||
"error-while-downloading": "Error al descarregar «{{author}} - {{title}}»: {{error}}",
|
||||
"folder-already-exists": "La carpeta {{playlistFolder}} ja existeix",
|
||||
"getting-playlist-info": "Obtenint la informació de la llista de reproducció…",
|
||||
"loading": "Carregant…",
|
||||
"playlist-has-only-one-song": "La llista de reproducció té un sol element, descarregant-lo directament",
|
||||
"playlist-id-not-found": "No s'ha trobat cap ID de llista de reproducció",
|
||||
"playlist-is-empty": "La llista de reproducció és buida",
|
||||
"playlist-is-mix-or-private": "Error obtenint la informació de la llista de reproducció: assegura't que no és una llista de reproducció privada o de «Mixos per a tu»\n\n{{error}}",
|
||||
"preparing-file": "Preparant arxiu…",
|
||||
"saving": "Desant…",
|
||||
"trying-to-get-playlist-id": "Intentant obtenir l'ID de la llista de reproducció: {{playlistId}}",
|
||||
"video-id-not-found": "Vídeo no trobat",
|
||||
"writing-id3": "Escrivint les etiquetes ID3…"
|
||||
}
|
||||
},
|
||||
"description": "Descarrega el MP3 / àudio d'origen directament des de la interfície",
|
||||
"menu": {
|
||||
"choose-download-folder": "Tria la carpeta de descàrrega",
|
||||
"download-finish-settings": {
|
||||
"label": "Descarrega en finalitzar",
|
||||
"prompt": {
|
||||
"last-percent": "Desprès del x percent",
|
||||
"last-seconds": "Últims x segons",
|
||||
"title": "Configura quan descarregar"
|
||||
},
|
||||
"submenu": {
|
||||
"advanced": "Avançat",
|
||||
"enabled": "Habilitat",
|
||||
"mode": "Mode de temps",
|
||||
"percent": "Percentatge",
|
||||
"seconds": "Segons"
|
||||
}
|
||||
},
|
||||
"download-playlist": "Descarrega la llista de reproducció",
|
||||
"presets": "Configuracions predefinides",
|
||||
"skip-existing": "Omet els arxius existents"
|
||||
},
|
||||
"name": "Descàrregues",
|
||||
"renderer": {
|
||||
"can-not-update-progress": "No es pot actualitzar el progrés"
|
||||
},
|
||||
"templates": {
|
||||
"button": "Descarrega"
|
||||
}
|
||||
},
|
||||
"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"
|
||||
},
|
||||
"in-app-menu": {
|
||||
"description": "Fa que la barra de menú superior tingui un elegant aspecte fosc o basat en el color de l'àlbum",
|
||||
"menu": {
|
||||
"hide-dom-window-controls": "Amaga els controls de la finestra del DOM"
|
||||
},
|
||||
"name": "Menú integrat In-App"
|
||||
},
|
||||
"lumiastream": {
|
||||
"description": "Afegeix suport pel Lumia Stream",
|
||||
"name": "Lumia Stream [Beta]"
|
||||
},
|
||||
"lyrics-genius": {
|
||||
"description": "Afegeix suport per la lletra de la majoria de cançons",
|
||||
"menu": {
|
||||
"romanized-lyrics": "Lletra romanitzada"
|
||||
},
|
||||
"name": "Lletres de Genius",
|
||||
"renderer": {
|
||||
"fetched-lyrics": "S'ha buscat la lletra a Genius"
|
||||
}
|
||||
},
|
||||
"music-together": {
|
||||
"description": "Comparteix una llista de reproducció amb els demés. Quan l'amfitrió reprodueix una cançó, la resta també sentiran la mateixa",
|
||||
"dialog": {
|
||||
"enter-host": "Introdueix l'ID de l'amfitrió"
|
||||
},
|
||||
"internal": {
|
||||
"save": "Desa",
|
||||
"track-source": "Origen de la pista",
|
||||
"unknown-user": "Usuari desconegut"
|
||||
},
|
||||
"menu": {
|
||||
"click-to-copy-id": "Copia l'ID d'amfitrió",
|
||||
"close": "Tanca el Music Together",
|
||||
"connected-users": "Usuaris connectats",
|
||||
"disconnect": "Desconnecta el Music Together",
|
||||
"empty-user": "No hi ha usuaris connectats",
|
||||
"host": "Amfitrió de Music Together",
|
||||
"join": "Uneix-te a Music Together",
|
||||
"permission": {
|
||||
"all": "Permet que els convidats controlin la llista de reproducció i el reproductor",
|
||||
"host-only": "Tan sols l'amfitrió pot controlar la llista de reproducció i el reproductor",
|
||||
"playlist": "Permet que els convidats controlin la llista de reproducció"
|
||||
},
|
||||
"set-permission": "Canvia els permisos de control",
|
||||
"status": {
|
||||
"disconnected": "Desconnectat",
|
||||
"guest": "Connectat com a convidat",
|
||||
"host": "Connectat com amfitrió"
|
||||
}
|
||||
},
|
||||
"name": "Music Together [Beta]",
|
||||
"toast": {
|
||||
"add-song-failed": "Error al afegir la cançó",
|
||||
"closed": "Music Together tancat",
|
||||
"disconnected": "Music Together desconnectat",
|
||||
"host-failed": "No s'ha pogut començar el Music Together",
|
||||
"id-copied": "L'ID d'amfitrió s'ha copiat al porta-retalls",
|
||||
"id-copy-failed": "Error al copiar l'ID d'amfitrió al porta-retalls",
|
||||
"join-failed": "Error al unir-se al Music Together",
|
||||
"joined": "T'has unit al Music Together",
|
||||
"permission-changed": "Els permisos de Music Together han canviat a «{{permission}}»",
|
||||
"remove-song-failed": "Error al eliminar la cançó",
|
||||
"user-connected": "{{name}} s'ha unit al Music Together",
|
||||
"user-disconnected": "{{name}} s'ha desconnectat del Music Together"
|
||||
}
|
||||
},
|
||||
"navigation": {
|
||||
"description": "Fletxes de navegació Següent / Enrere integrades directament a la interfície, com al teu navegador preferit",
|
||||
"name": "Navegació"
|
||||
},
|
||||
"no-google-login": {
|
||||
"description": "Elimina els botons d'inici de sessió de Google de la interfície",
|
||||
"name": "Amaga l'inici de sessió de Google"
|
||||
},
|
||||
"notifications": {
|
||||
"description": "Mostra una notificació quan una cançó es comença a reproduir (les notificacions interactives estan disponibles a Windows)",
|
||||
"menu": {
|
||||
"interactive": "Notificacions interactives",
|
||||
"interactive-settings": {
|
||||
"label": "Configuració interactiva",
|
||||
"submenu": {
|
||||
"hide-button-text": "Amaga text del botó",
|
||||
"refresh-on-play-pause": "Recarrega al Reproduir/Pausar",
|
||||
"tray-controls": "Obra/Tanca en clicar a la safata"
|
||||
}
|
||||
},
|
||||
"priority": "Prioritat de les notificacions",
|
||||
"toast-style": "Estil dels missatges emergents",
|
||||
"unpause-notification": "Mostra notificació en reprendre la reproducció"
|
||||
},
|
||||
"name": "Notificacions"
|
||||
},
|
||||
"picture-in-picture": {
|
||||
"description": "Permet commutar el mode d'imatge en imatge (PiP)",
|
||||
"menu": {
|
||||
"always-on-top": "Mostra sempre a sobre",
|
||||
"hotkey": {
|
||||
"label": "Drecera del teclat",
|
||||
"prompt": {
|
||||
"keybind-options": {
|
||||
"hotkey": "Drecera del teclat"
|
||||
},
|
||||
"label": "Tria una drecera per commutar el mode d'imatge en imatge (PiP)",
|
||||
"title": "Drecera del mode imatge en imatge (PiP)"
|
||||
}
|
||||
},
|
||||
"save-window-position": "Desa la posició de la finestra",
|
||||
"save-window-size": "Desa la mida de la finestra",
|
||||
"use-native-pip": "Utilitza l'imatge en imatge (PiP) nativa del navegador"
|
||||
},
|
||||
"name": "Imatge en imatge (PiP)",
|
||||
"templates": {
|
||||
"button": "Imatge en imatge (PiP)"
|
||||
}
|
||||
},
|
||||
"playback-speed": {
|
||||
"description": "Escolta-ho ràpid, escolta-ho lent! Afegeix un control lliscant per canviar la velocitat de la cançó",
|
||||
"name": "Velocitat de la reproducció",
|
||||
"templates": {
|
||||
"button": "Velocitat"
|
||||
}
|
||||
},
|
||||
"precise-volume": {
|
||||
"description": "Controla el volum de manera precisa a través de la rodeta del ratolí / dreceres del teclat, amb una interfície personalitzada i passos de volum personalitzats",
|
||||
"menu": {
|
||||
"arrows-shortcuts": "Controls locals de tecles de fletxa",
|
||||
"custom-volume-steps": "Estableix passos de volum personalitzats",
|
||||
"global-shortcuts": "Dreceres de teclat globals"
|
||||
},
|
||||
"name": "Volum precís",
|
||||
"prompt": {
|
||||
"global-shortcuts": {
|
||||
"keybind-options": {
|
||||
"decrease": "Baixa el volum",
|
||||
"increase": "Puja el volum"
|
||||
},
|
||||
"label": "Tria les dreceres globals de volum:",
|
||||
"title": "Dreceres globals de volum"
|
||||
},
|
||||
"volume-steps": {
|
||||
"label": "Tria els passos d'augment o disminució del volum",
|
||||
"title": "Passos de volum"
|
||||
}
|
||||
}
|
||||
},
|
||||
"quality-changer": {
|
||||
"backend": {
|
||||
"dialog": {
|
||||
"quality-changer": {
|
||||
"detail": "Qualitat actual: {{quality}}",
|
||||
"message": "Tria la qualitat del vídeo:",
|
||||
"title": "Tria la qualitat del vídeo"
|
||||
}
|
||||
}
|
||||
},
|
||||
"description": "Permet canviar la qualitat del vídeo amb un botó que s'hi mostra a sobre",
|
||||
"name": "Botó de qualitat del vídeo"
|
||||
},
|
||||
"scrobbler": {
|
||||
"description": "Afegeix suport per scrobbling (Last.fm, ListenBrainz, etc.)",
|
||||
"dialog": {
|
||||
"lastfm": {
|
||||
"auth-failed": {
|
||||
"message": "Error al autenticar amb Last.fm\nAmaga la finestra emergent fins el següent reinici.",
|
||||
"title": "Error d'autenticació"
|
||||
}
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"lastfm": {
|
||||
"api-settings": "Configuració de l'API de Last.fm"
|
||||
},
|
||||
"listenbrainz": {
|
||||
"token": "Introduir token d'usuari de ListenBrainz"
|
||||
},
|
||||
"scrobble-other-media": "Scrobble amb altres mitjans"
|
||||
},
|
||||
"name": "Scrobbler",
|
||||
"prompt": {
|
||||
"lastfm": {
|
||||
"api-key": "Clau d'API de Last.fm",
|
||||
"api-secret": "Clau secreta de l'API de Last.fm"
|
||||
},
|
||||
"listenbrainz": {
|
||||
"token": {
|
||||
"label": "Introdueix el teu token de ListenBrainz:",
|
||||
"title": "Token de ListenBrainz"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"shortcuts": {
|
||||
"description": "Permet l'ús de dreceres globals del teclat per la reproducció (reproduir/pausar/següent/anterior) i desactivar l'OSD dels mitjans en sobreescriure les tecles de control multimèdia, habilita el Ctrl/CMD + F per buscar, habilita el suport MPRIS a Linux per tecles de control multimèdia, i dreceres de teclat personalitzades per usuaris avançats",
|
||||
"menu": {
|
||||
"override-media-keys": "Sobreescriu les tecles de control multimèdia",
|
||||
"set-keybinds": "Estableix controls globals de les cançons"
|
||||
},
|
||||
"name": "Dreceres i MPRIS",
|
||||
"prompt": {
|
||||
"keybind": {
|
||||
"keybind-options": {
|
||||
"next": "Següent",
|
||||
"play-pause": "Reproduir / Pausar",
|
||||
"previous": "Anterior"
|
||||
},
|
||||
"label": "Tria combinacions de tecles per controlar les cançons:",
|
||||
"title": "Dreceres globals"
|
||||
}
|
||||
}
|
||||
},
|
||||
"skip-disliked-songs": {
|
||||
"description": "Salta les cançons amb «no m'agrada»",
|
||||
"name": "Salta les cançons que no t'agraden"
|
||||
},
|
||||
"skip-silences": {
|
||||
"description": "Omet automàticament les seccions amb silenci a les cançons",
|
||||
"name": "Omet els silencis"
|
||||
},
|
||||
"sponsorblock": {
|
||||
"description": "Omet automàticament els segments dels vídeos que no son música, com la intro o el final",
|
||||
"name": "SponsorBlock"
|
||||
},
|
||||
"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çó."
|
||||
},
|
||||
"menu": {
|
||||
"default-text-string": {
|
||||
"label": "Caràcter per defecte entre lletres",
|
||||
"tooltip": "Tria el caràcter per defecte que es mostrarà a l'espai entre les lletres"
|
||||
},
|
||||
"line-effect": {
|
||||
"label": "Efecte de la línia",
|
||||
"submenu": {
|
||||
"focus": {
|
||||
"label": "Focus",
|
||||
"tooltip": "Mostra tan sols la línia actual en blanc"
|
||||
},
|
||||
"offset": {
|
||||
"label": "Desplaçament",
|
||||
"tooltip": "Desplaçament a la dreta de la línia actual"
|
||||
},
|
||||
"scale": {
|
||||
"label": "Escala",
|
||||
"tooltip": "Redimensiona la línia actual"
|
||||
}
|
||||
},
|
||||
"tooltip": "Tria l'efecte a aplicar a la línia actual"
|
||||
},
|
||||
"precise-timing": {
|
||||
"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)"
|
||||
},
|
||||
"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."
|
||||
},
|
||||
"show-time-codes": {
|
||||
"label": "Mostra els codis de temps",
|
||||
"tooltip": "Mostra els codis de temps al costat de la lletra"
|
||||
}
|
||||
},
|
||||
"name": "Lletres sincronitzades",
|
||||
"refetch-btn": {
|
||||
"fetching": "Obtenint...",
|
||||
"normal": "Tornar a obtenir la lletra"
|
||||
},
|
||||
"warnings": {
|
||||
"duration-mismatch": "⚠️ - La lletra podria no estar ben sincronitzada, la durada no és coincident.",
|
||||
"inexact": "⚠️ - La lletra d'aquesta cançó podria no ser exacta",
|
||||
"instrumental": "⚠️ - Aquesta cançó és instrumental"
|
||||
}
|
||||
},
|
||||
"taskbar-mediacontrol": {
|
||||
"description": "Controla la reproducció des de la barra de tasques del Windows",
|
||||
"name": "Control multimèdia a la barra de tasques"
|
||||
},
|
||||
"touchbar": {
|
||||
"description": "Afegeix un giny a la Touch Bar per usuaris de macOS",
|
||||
"name": "TouchBar"
|
||||
},
|
||||
"tuna-obs": {
|
||||
"description": "Integració amb l'extensió «Tuna» del OBS",
|
||||
"name": "Tuna OBS"
|
||||
},
|
||||
"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": {
|
||||
"align": {
|
||||
"label": "Alineament",
|
||||
"submenu": {
|
||||
"left": "Esquerra",
|
||||
"middle": "Mig",
|
||||
"right": "Dreta"
|
||||
}
|
||||
},
|
||||
"force-hide": "Força amagar la pestanya de vídeo",
|
||||
"mode": {
|
||||
"label": "Mode",
|
||||
"submenu": {
|
||||
"custom": "Commutador personalitzat",
|
||||
"disabled": "Deshabilitat",
|
||||
"native": "Commutador nadiu"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Botó de vídeo",
|
||||
"templates": {
|
||||
"button": "Cançó"
|
||||
}
|
||||
},
|
||||
"visualizer": {
|
||||
"description": "Afegeix un visualitzador al reproductor",
|
||||
"menu": {
|
||||
"visualizer-type": "Tipus de visualitzador"
|
||||
},
|
||||
"name": "Visualitzador"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -207,6 +207,10 @@
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"ad-speedup": {
|
||||
"description": "Pokud se přehraje reklama tak ztlumí zvuk a nastaví rychlost přehrávání na 16x",
|
||||
"name": "Zrychlovač Reklam"
|
||||
},
|
||||
"adblocker": {
|
||||
"description": "Blokuje všechny reklamy a sledování ihned od začátku",
|
||||
"menu": {
|
||||
@ -216,7 +220,7 @@
|
||||
},
|
||||
"album-actions": {
|
||||
"description": "Přidává Undislike, Dislike, Like, a Unlike tlačítka k aplikování tohoto ke všem písničkám v seznamu písniček nebo albumu",
|
||||
"name": "Album akce"
|
||||
"name": "Možnosti Albumu"
|
||||
},
|
||||
"album-color-theme": {
|
||||
"description": "Používá dynamický motiv a vizuální efekty na základě palety barev alba",
|
||||
@ -275,6 +279,49 @@
|
||||
},
|
||||
"name": "Ambientní režim"
|
||||
},
|
||||
"api-server": {
|
||||
"description": "Vlož API server abys mohl ovládat přehrávač",
|
||||
"dialog": {
|
||||
"request": {
|
||||
"buttons": {
|
||||
"allow": "Povolit",
|
||||
"deny": "Zakázat"
|
||||
},
|
||||
"message": "Povolit {{ID}} ({{origin}}) přístup k API?",
|
||||
"title": "dotaz na přihlášení k API"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"auth-strategy": {
|
||||
"label": "Možnosti přihlášení",
|
||||
"submenu": {
|
||||
"auth-at-first": {
|
||||
"label": "Ověřit při prvním dotazu"
|
||||
},
|
||||
"none": {
|
||||
"label": "Žádná autorizace"
|
||||
}
|
||||
}
|
||||
},
|
||||
"hostname": {
|
||||
"label": "Hostname"
|
||||
},
|
||||
"port": {
|
||||
"label": "Port"
|
||||
}
|
||||
},
|
||||
"name": "API server [Beta]",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "Zadej hostname API serveru (ve tvaru 0.0.0.0):",
|
||||
"title": "Hostname"
|
||||
},
|
||||
"port": {
|
||||
"label": "Zadej port API serveru:",
|
||||
"title": "Port"
|
||||
}
|
||||
}
|
||||
},
|
||||
"audio-compressor": {
|
||||
"description": "Apply compression k audiu (snižuje hlasitost nejhlasitěších částí signálu and zvyšuje hlasitost nejjemnějších částí)",
|
||||
"name": "Audio kompresor"
|
||||
@ -410,6 +457,21 @@
|
||||
"description": "Stahuje MP3 / source audio přímo z rozhraní",
|
||||
"menu": {
|
||||
"choose-download-folder": "Vybrat složku pro stahování",
|
||||
"download-finish-settings": {
|
||||
"label": "Stáhnout po dokončení",
|
||||
"prompt": {
|
||||
"last-percent": "Po x procentech",
|
||||
"last-seconds": "Posledních x vteřin",
|
||||
"title": "Nastavit kdy stahovat"
|
||||
},
|
||||
"submenu": {
|
||||
"advanced": "Pokoročile",
|
||||
"enabled": "Zapnuto",
|
||||
"mode": "Časový režim",
|
||||
"percent": "Procent",
|
||||
"seconds": "Sekundy"
|
||||
}
|
||||
},
|
||||
"download-playlist": "Stáhnout seznam písniček",
|
||||
"presets": "Předvolby",
|
||||
"skip-existing": "Přeskočit existující soubory"
|
||||
@ -607,11 +669,13 @@
|
||||
"name": "Scrobbler",
|
||||
"prompt": {
|
||||
"lastfm": {
|
||||
"api-key": "Last,fm API klíč"
|
||||
"api-key": "Last,fm API klíč",
|
||||
"api-secret": "Tajný klíč API Last.fm"
|
||||
},
|
||||
"listenbrainz": {
|
||||
"token": {
|
||||
"label": "Vložte svůj Listenbrainz user token:"
|
||||
"label": "Vložte svůj Listenbrainz user token:",
|
||||
"title": "ListenBrainz token"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -647,6 +711,22 @@
|
||||
"description": "Automaticky přeskakuje nehudební části jako intro/outro nebo části hudebních videí, kde nehraje písnčka",
|
||||
"name": "SponsorBlock"
|
||||
},
|
||||
"synced-lyrics": {
|
||||
"description": "Poskytuje synchronizaci textů do písní, pomocí poskytovatelů, jako je LRClib.",
|
||||
"errors": {
|
||||
"fetch": "Při hledání textu došlo k chybě. Prosím skuste to znovu později.",
|
||||
"not-found": "Žáden text nebyl pro túto skladbu nalezen."
|
||||
},
|
||||
"menu": {
|
||||
"default-text-string": {
|
||||
"label": "Výchozí znak mezi texty",
|
||||
"tooltip": "Vyberte výchozí znak pro mezeru mezi texty"
|
||||
},
|
||||
"line-effect": {
|
||||
"label": "Efekt řádku"
|
||||
}
|
||||
}
|
||||
},
|
||||
"taskbar-mediacontrol": {
|
||||
"description": "Ovládejte přehrávání z vašeho Windows hlavního panelu",
|
||||
"name": "Hlavní panel Media Control"
|
||||
|
||||
@ -207,6 +207,10 @@
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"ad-speedup": {
|
||||
"description": "Wenn eine Werbung spielt, stummt es das Audio und setzt die Wiedergabegeschwindigkeit auf 16x",
|
||||
"name": "Werbungsbeschleunigung"
|
||||
},
|
||||
"adblocker": {
|
||||
"description": "Blockiere jegliche Werbung und Tracker",
|
||||
"menu": {
|
||||
@ -275,6 +279,56 @@
|
||||
},
|
||||
"name": "Ambiente-Modus"
|
||||
},
|
||||
"amuse": {
|
||||
"description": "Fügt Unterstützung für das Amuse \"Spielt gerade\"-Widget von 6K Labs hinzu",
|
||||
"name": "Amuse",
|
||||
"response": {
|
||||
"query": "Amuse API-Server läuft. /query für Liedinformationen."
|
||||
}
|
||||
},
|
||||
"api-server": {
|
||||
"description": "Fügt einen API-Server hinzu, um die Wiedergabe zu steuern",
|
||||
"dialog": {
|
||||
"request": {
|
||||
"buttons": {
|
||||
"allow": "Erlauben",
|
||||
"deny": "Ablehnen"
|
||||
},
|
||||
"message": "{{ID}} ({{origin}}) den Zugriff zur API erlauben?",
|
||||
"title": "API-Autorisierungs-Anfrage"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"auth-strategy": {
|
||||
"label": "Autorisations-Methode",
|
||||
"submenu": {
|
||||
"auth-at-first": {
|
||||
"label": "Beim ersten Zugriff autorisieren"
|
||||
},
|
||||
"none": {
|
||||
"label": "Keine Autorisierung"
|
||||
}
|
||||
}
|
||||
},
|
||||
"hostname": {
|
||||
"label": "Hostname"
|
||||
},
|
||||
"port": {
|
||||
"label": "Port"
|
||||
}
|
||||
},
|
||||
"name": "API-Server [Beta]",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "Hostname des API-Servers vergeben (z. B. 0.0.0.0):",
|
||||
"title": "Hostname"
|
||||
},
|
||||
"port": {
|
||||
"label": "Port des API-Server:",
|
||||
"title": "Port"
|
||||
}
|
||||
}
|
||||
},
|
||||
"audio-compressor": {
|
||||
"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"
|
||||
@ -410,24 +464,24 @@
|
||||
"description": "Lädt MP3-/Original-Audio direkt von der Schnittstelle herunter",
|
||||
"menu": {
|
||||
"choose-download-folder": "Downloadordner wählen",
|
||||
"download-finish-settings": {
|
||||
"label": "Song am Ende runterladen",
|
||||
"prompt": {
|
||||
"last-percent": "Nach x Prozent",
|
||||
"last-seconds": "Letzten x Sekunden",
|
||||
"title": "Konfiguriere wann runtergeladen werden soll"
|
||||
},
|
||||
"submenu": {
|
||||
"advanced": "Erweitert",
|
||||
"enabled": "Aktiviert",
|
||||
"mode": "Zeitmodus",
|
||||
"percent": "Prozent",
|
||||
"seconds": "Sekunden"
|
||||
}
|
||||
},
|
||||
"download-playlist": "Wiedergabeliste herunterladen",
|
||||
"presets": "Voreinstellungen",
|
||||
"skip-existing": "Vorhandene Dateien überspringen",
|
||||
"download-finish-settings": {
|
||||
"label": "Song am Ende runterladen",
|
||||
"submenu": {
|
||||
"enabled": "Aktiviert",
|
||||
"mode": "Zeitmodus",
|
||||
"seconds": "Sekunden",
|
||||
"percent": "Prozent",
|
||||
"advanced": "Erweitert"
|
||||
},
|
||||
"prompt": {
|
||||
"title": "Konfiguriere wann runtergeladen werden soll",
|
||||
"last-seconds": "Letzten x Sekunden",
|
||||
"last-percent": "Nach x Prozent"
|
||||
}
|
||||
}
|
||||
"skip-existing": "Vorhandene Dateien überspringen"
|
||||
},
|
||||
"name": "Downloader",
|
||||
"renderer": {
|
||||
@ -437,6 +491,18 @@
|
||||
"button": "Herunterladen"
|
||||
}
|
||||
},
|
||||
"equalizer": {
|
||||
"description": "Fügt einen Equalizer zum Player hinzu",
|
||||
"menu": {
|
||||
"presets": {
|
||||
"label": "Vorgaben",
|
||||
"list": {
|
||||
"bass-booster": "Bass-Verstärker"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Equalizer"
|
||||
},
|
||||
"exponential-volume": {
|
||||
"description": "Macht den Lautstärkeregler exponentiell, damit es einfacher ist leise Lautstärken zu wählen.",
|
||||
"name": "Exponentielle Lautstärke"
|
||||
@ -664,6 +730,63 @@
|
||||
"description": "Überspringt automatisch nicht-musikalische Teile wie Intro/Outro oder Teile von Musikvideos, in denen der Song nicht gespielt wird",
|
||||
"name": "SponsorBlock"
|
||||
},
|
||||
"synced-lyrics": {
|
||||
"description": "Bietet synchronisierte Liedtexte zu Songs, verwendet Anbieter wie LRClib.",
|
||||
"errors": {
|
||||
"fetch": "⚠️ - \tBeim Abrufen des Liedtexts ist ein Fehler aufgetreten. \n\tBitte versuchen Sie es später nochmal.",
|
||||
"not-found": "⚠️ Kein Text für diesen Song gefunden."
|
||||
},
|
||||
"menu": {
|
||||
"default-text-string": {
|
||||
"label": "Standardzeichen zwischen Texten",
|
||||
"tooltip": "Standardzeichen für die Lücke zwischen Songtexten auswählen"
|
||||
},
|
||||
"line-effect": {
|
||||
"label": "Zeileneffekt",
|
||||
"submenu": {
|
||||
"fancy": {
|
||||
"label": "schick",
|
||||
"tooltip": "Verwende große, app-ähnliche Effekte in der aktuellen Zeile"
|
||||
},
|
||||
"focus": {
|
||||
"label": "Fokussieren",
|
||||
"tooltip": "Nur aktive Zeile weiß darstellen"
|
||||
},
|
||||
"offset": {
|
||||
"label": "Versatz",
|
||||
"tooltip": "Verschiebe die aktuelle Zeile nach rechts"
|
||||
},
|
||||
"scale": {
|
||||
"label": "Skalieren",
|
||||
"tooltip": "Aktuelle Zeile skalieren"
|
||||
}
|
||||
},
|
||||
"tooltip": "Effekt für aktive Zeile auswählen"
|
||||
},
|
||||
"precise-timing": {
|
||||
"label": "Den Songtext perfekt synchronisieren",
|
||||
"tooltip": "Auf die Millisekunde genau berechnen, wann die nächste Zeile angezeigt werden soll (Kann Einfluss auf die Leistung haben)"
|
||||
},
|
||||
"show-lyrics-even-if-inexact": {
|
||||
"label": "Zeige die Liedtexte, auch wenn sie ungenau sind.",
|
||||
"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": {
|
||||
"label": "Zeitkodierungen anzeigen",
|
||||
"tooltip": "Zeitkodierungen neben Songtext anzeigen"
|
||||
}
|
||||
},
|
||||
"name": "Synchronisierte Texte",
|
||||
"refetch-btn": {
|
||||
"fetching": "Hole Songtext...",
|
||||
"normal": "Songtext neu holen"
|
||||
},
|
||||
"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.",
|
||||
"instrumental": "⚠️ - Das ist ein instrumentales Lied"
|
||||
}
|
||||
},
|
||||
"taskbar-mediacontrol": {
|
||||
"description": "Wiedergabe aus der Windows Taskleiste kontrollieren",
|
||||
"name": "Mediensteuerung in der Taskleiste"
|
||||
|
||||
@ -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": "Φόρτωση όλων των πρόσθετων",
|
||||
@ -36,7 +36,7 @@
|
||||
"details": "Σφάλμα ανταπόκρισης!\n{{error}}"
|
||||
},
|
||||
"when-ready": {
|
||||
"clearing-cache-after-20s": "Εκκαθάριση της cache της εφαρμογής"
|
||||
"clearing-cache-after-20s": "Εκκαθάριση μνήμης cache εφαρμογής"
|
||||
},
|
||||
"window": {
|
||||
"tried-to-render-offscreen": "Το παράθυρο προσπάθησε να απεικονίσει εκτός οθόνης, windowSize={{windowSize}}, displaySize={{displaySize}}, position={{position}}"
|
||||
@ -45,23 +45,23 @@
|
||||
"dialog": {
|
||||
"hide-menu-enabled": {
|
||||
"detail": "Το μενού είναι κρυμμένο, χρησιμοποιήστε το 'Alt' για να το εμφανίσετε (ή το 'Escape' αν χρησιμοποιείτε το μενού εφαρμογής)",
|
||||
"message": "Απόκρυψη μενού είναι ενεργοποιημένο",
|
||||
"title": "Ενεργοποιήθηκε η Απόκρυψη του Μενού"
|
||||
"message": "Η απόκρυψη μενού είναι ενεργοποιημένη",
|
||||
"title": "Η απόκρυψη μενού ενεργοποιήθηκε"
|
||||
},
|
||||
"need-to-restart": {
|
||||
"buttons": {
|
||||
"later": "Αργότερα",
|
||||
"restart-now": "Επανεκκίνηση Τώρα"
|
||||
"restart-now": "Επανεκκίνηση τώρα"
|
||||
},
|
||||
"detail": "Το πρόσθετο \"{{pluginName}}\" απαιτεί επανεκκίνηση για να ισχύσει",
|
||||
"message": "Το \"{{pluginName}}\" χρειάζεται επανεκκίνηση",
|
||||
"title": "Απαιτείται Επανεκκίνηση"
|
||||
"title": "Απαιτείται επανεκκίνηση"
|
||||
},
|
||||
"unresponsive": {
|
||||
"buttons": {
|
||||
"quit": "Έξοδος",
|
||||
"relaunch": "Επανεκκίνηση",
|
||||
"wait": "Περίμενε"
|
||||
"wait": "Περιμένετε"
|
||||
},
|
||||
"detail": "Λυπούμαστε για την ταλαιπωρία! Παρακαλούμε επιλέξτε τι να κάνετε:",
|
||||
"message": "Η εφαρμογή δεν ανταποκρίνεται",
|
||||
@ -69,13 +69,13 @@
|
||||
},
|
||||
"update-available": {
|
||||
"buttons": {
|
||||
"disable": "Απενεργοποίηση Ενημερώσεων",
|
||||
"disable": "Απενεργοποίηση ενημερώσεων",
|
||||
"download": "Λήψη",
|
||||
"ok": "Εντάξει"
|
||||
"ok": "OK"
|
||||
},
|
||||
"detail": "Μια νέα έκδοση είναι διαθέσιμη και μπορεί να ληφθεί από τον σύνδεσμο {{downloadLink}}",
|
||||
"message": "Μια νέα έκδοση είναι διαθέσιμη",
|
||||
"title": "Υπάρχει Διαθέσιμη Ενημέρωση"
|
||||
"title": "Υπάρχει διαθέσιμη ενημέρωση"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
@ -87,7 +87,7 @@
|
||||
"go-back": "Πήγαινε πίσω",
|
||||
"go-forward": "Πήγαινε μπροστά",
|
||||
"quit": "Έξοδος",
|
||||
"restart": "Επανεκκίνηση Εφαρμογής"
|
||||
"restart": "Επανεκκίνηση εφαρμογής"
|
||||
}
|
||||
},
|
||||
"options": {
|
||||
@ -106,7 +106,7 @@
|
||||
"prompt": {
|
||||
"label": "Εισαγωγή διεύθυνσης διακομιστή μεσολάβησης (proxy): (αφήστε κενό για απενεργοποίηση)",
|
||||
"placeholder": "Παράδειγμα: SOCKS5://127.0.0.1:9999",
|
||||
"title": "Ορισμός διακομιστή μεσολάβησης (proxy)"
|
||||
"title": "Ορισμός μεσολάβησης"
|
||||
}
|
||||
},
|
||||
"toggle-dev-tools": "Εναλλαγή DevTools"
|
||||
@ -135,8 +135,8 @@
|
||||
"single-instance-lock": "Κλείδωμα Μοναδικής Εκδοχής",
|
||||
"start-at-login": "Έναρξη κατά την σύνδεση",
|
||||
"starting-page": {
|
||||
"label": "Σελίδα Έναρξης",
|
||||
"unset": "Κατάργηση Ορισμού"
|
||||
"label": "Σελίδα έναρξης",
|
||||
"unset": "Κατάργηση ορισμού"
|
||||
},
|
||||
"tray": {
|
||||
"label": "Δίσκος",
|
||||
@ -148,13 +148,27 @@
|
||||
}
|
||||
},
|
||||
"visual-tweaks": {
|
||||
"label": "Τροποποιήσεις Εμφάνισης",
|
||||
"submenu": {
|
||||
"like-buttons": {
|
||||
"default": "Default"
|
||||
"default": "Default",
|
||||
"force-show": "Αναγκαστική Εμφάνιση",
|
||||
"hide": "Απόκρυψη",
|
||||
"label": "Μου αρέσει"
|
||||
},
|
||||
"remove-upgrade-button": "Αφαίρεση κουμπιού αναβάθμισης",
|
||||
"theme": {
|
||||
"label": "Theme",
|
||||
"dialog": {
|
||||
"button": {
|
||||
"cancel": "Άκυρο",
|
||||
"remove": "Αφαίρεση"
|
||||
},
|
||||
"remove-theme": "Είστε βέβαιοι ότι θέλετε να αφαιρέσετε το προσαρμοσμένο θέμα;",
|
||||
"remove-theme-message": "Αυτό θα αφαιρέσει το προσαρμοσμένο θέμα"
|
||||
},
|
||||
"label": "Θέμα",
|
||||
"submenu": {
|
||||
"import-css-file": "Εισαγωγή προσαρμοσμένου αρχείου CSS",
|
||||
"no-theme": "No theme"
|
||||
}
|
||||
}
|
||||
@ -163,29 +177,68 @@
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"label": "Plugins"
|
||||
"enabled": "Ενεργοποιημένο",
|
||||
"label": "Πρόσθετα",
|
||||
"new": "ΝΕΟ"
|
||||
},
|
||||
"view": {
|
||||
"label": "View"
|
||||
"label": "Προβολή",
|
||||
"submenu": {
|
||||
"force-reload": "Αναγκαστική Eπαναφόρτωση",
|
||||
"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": {
|
||||
"ad-speedup": {
|
||||
"description": "Εαν παίξει διαφήμιση κάνει σίγαση του ήχου και θέτει την ταχύτητα αναπαραγωγής στο 16x",
|
||||
"name": "Γρήγορη Προώθηση Διαφημίσεων"
|
||||
},
|
||||
"adblocker": {
|
||||
"description": "Αποκλεισμός όλων των διαφημίσεων και tracker",
|
||||
"menu": {
|
||||
"blocker": "Μέθοδος αποκλεισμού"
|
||||
},
|
||||
"name": "Adblocker"
|
||||
"name": "Μπλοκάρισμα Διαφημίσεων"
|
||||
},
|
||||
"album-actions": {
|
||||
"description": "Προσθέτει κουμπιά Like/Unlike και Dislike/Undislike που δρουν συνολικά σε όλα τα κομμάτια μιας playlist ή ενός άλμπουμ",
|
||||
"name": "Ενέργειες σε Άλμπουμ"
|
||||
},
|
||||
"album-color-theme": {
|
||||
"description": "Εφαρμόζει ένα δυναμικό θέμα και εφέ με βάση τη χρωματική παλέτα του άλμπουμ",
|
||||
"menu": {
|
||||
"color-mix-ratio": {
|
||||
"label": "Αναλογία μίξης χρώματος",
|
||||
"submenu": {
|
||||
"percent": "{{ratio}}%"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Album Color Theme"
|
||||
},
|
||||
"ambient-mode": {
|
||||
"description": "Εφαρμόζει ένα εφέ φωτισμού ρίχνοντας απαλά χρώματα από το βίντεο, στο φόντο της οθόνης σας.",
|
||||
"menu": {
|
||||
"blur-amount": {
|
||||
"label": "Ένταση θαμπώματος",
|
||||
"submenu": {
|
||||
"pixels": "{{blurAmount}} pixels"
|
||||
}
|
||||
@ -197,25 +250,30 @@
|
||||
}
|
||||
},
|
||||
"opacity": {
|
||||
"label": "Ποσότητα αδιαφάνειας",
|
||||
"label": "Αδιαφάνεια",
|
||||
"submenu": {
|
||||
"percent": "{{opacity}}%"
|
||||
}
|
||||
},
|
||||
"quality": {
|
||||
"label": "Ποιότητα",
|
||||
"submenu": {
|
||||
"pixels": "{{quality}} pixels"
|
||||
}
|
||||
},
|
||||
"size": {
|
||||
"label": "Μέγεθος",
|
||||
"submenu": {
|
||||
"percent": "{{size}}%"
|
||||
}
|
||||
},
|
||||
"smoothness-transition": {
|
||||
"submenu": {
|
||||
"during": "Σε {{interpolationTime}} δεύτερα"
|
||||
"during": "Σε {{interpolationTime}} δευτερόλεπτα"
|
||||
}
|
||||
},
|
||||
"use-fullscreen": {
|
||||
"label": "Χρήση πλήρους οθόνης"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -257,11 +315,14 @@
|
||||
"description": "Κάνει τα τραγούδια να είναι αυτόματα σε παύση",
|
||||
"menu": {
|
||||
"apply-once": "Εφαρμόζεται μόνο στο πρώτο τραγούδι"
|
||||
}
|
||||
},
|
||||
"name": "Απενεργοποίηση αυτόματης αναπαραγωγής"
|
||||
},
|
||||
"discord": {
|
||||
"description": "Δείξτε στους φίλους σας τι ακούτε με το Rich Presence",
|
||||
"menu": {
|
||||
"auto-reconnect": "Αυτόματη επανασύνδεση",
|
||||
"clear-activity": "Εκκαθάριση δραστηριότητας",
|
||||
"hide-duration-left": "Απόκρυψη της διάρκειας που απομένει",
|
||||
"hide-github-button": "Απόκρυψη του συνδέσμου προς GitHub",
|
||||
"set-inactivity-timeout": "Ορισμός χρονικού ορίου αδράνειας"
|
||||
@ -280,34 +341,113 @@
|
||||
"buttons": {
|
||||
"ok": "OK"
|
||||
},
|
||||
"message": "Λήψη λίστας αναπαραγωγής {{playlistTitle}}",
|
||||
"title": "Λήψη ξεκίνησε"
|
||||
"detail": "{{playlistSize}} τραγούδια)",
|
||||
"message": "Λήψη της λίστας αναπαραγωγής {{playlistTitle}}",
|
||||
"title": "Η λήψη ξεκίνησε"
|
||||
}
|
||||
},
|
||||
"feedback": {
|
||||
"conversion-progress": "Μετατροπή: {{percent}}%",
|
||||
"download-progress": "Download: {{percent}}%",
|
||||
"preparing-file": "Προετοιμασία αρχείου…"
|
||||
"converting": "Μετατροπή…",
|
||||
"download-info": "Λήψη του {{artist}} - {{title}} [{{videoId}}",
|
||||
"download-progress": "Λήψη: {{percent}}%",
|
||||
"downloading": "Λήψη…",
|
||||
"downloading-counter": "Λήψη {{current}}/{{total}}…",
|
||||
"downloading-playlist": "Λήψη της λίστας αναπαραγωγής \"{{playlistTitle}}\" - {{playlistSize}} τραγούδια ({{playlistId}})",
|
||||
"folder-already-exists": "Ο φάκελος {{playlistFolder}} υπάρχει ήδη",
|
||||
"loading": "Φόρτωση…",
|
||||
"playlist-is-empty": "Η λίστα αναπραγωγής είναι άδεια",
|
||||
"preparing-file": "Προετοιμασία αρχείου…",
|
||||
"saving": "Αποθήκευση…",
|
||||
"video-id-not-found": "Το βίντεο δεν βρέθηκε"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"download-finish-settings": {
|
||||
"prompt": {
|
||||
"last-seconds": "Τελευταία x δευτερόλεπτα"
|
||||
},
|
||||
"submenu": {
|
||||
"percent": "Ποσοστό",
|
||||
"seconds": "Δευτερόλεπτα"
|
||||
}
|
||||
},
|
||||
"download-playlist": "Λήψη λίστας αναπαραγωγής",
|
||||
"skip-existing": "Παράλειψη υπάρχοντων αρχείων"
|
||||
},
|
||||
"templates": {
|
||||
"button": "Download"
|
||||
"button": "Λήψη"
|
||||
}
|
||||
},
|
||||
"music-together": {
|
||||
"internal": {
|
||||
"save": "Αποθήκευση",
|
||||
"unknown-user": "Άγνωστος χρήστης"
|
||||
},
|
||||
"menu": {
|
||||
"connected-users": "Συνδεδεμένοι χρήστες"
|
||||
},
|
||||
"toast": {
|
||||
"add-song-failed": "Απέτυχε η προσθήκη τραγουδιού",
|
||||
"remove-song-failed": "Απέτυχε η αφαίρεση τραγουδιού"
|
||||
}
|
||||
},
|
||||
"navigation": {
|
||||
"name": "Navigation"
|
||||
"name": "Πλοήγηση"
|
||||
},
|
||||
"no-google-login": {
|
||||
"name": "No Google Login"
|
||||
},
|
||||
"notifications": {
|
||||
"name": "Notifications"
|
||||
"name": "Ειδοποιήσεις"
|
||||
},
|
||||
"picture-in-picture": {
|
||||
"menu": {
|
||||
"always-on-top": "Πάντα σε πρώτο πλάνο",
|
||||
"hotkey": {
|
||||
"label": "Πλήκτρο πρόσβασης",
|
||||
"prompt": {
|
||||
"keybind-options": {
|
||||
"hotkey": "Πλήκτρο πρόσβασης"
|
||||
}
|
||||
}
|
||||
},
|
||||
"save-window-position": "Αποθήκευση θέσης παραθύρου",
|
||||
"save-window-size": "Αποθήκευση μεγέθους παραθύρου"
|
||||
}
|
||||
},
|
||||
"playback-speed": {
|
||||
"name": "Ταχύτητα αναπαραγωγής",
|
||||
"templates": {
|
||||
"button": "Ταχύτητα"
|
||||
}
|
||||
},
|
||||
"precise-volume": {
|
||||
"prompt": {
|
||||
"global-shortcuts": {
|
||||
"keybind-options": {
|
||||
"decrease": "Μείωση έντασης",
|
||||
"increase": "Αύξηση έντασης"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"quality-changer": {
|
||||
"backend": {
|
||||
"dialog": {
|
||||
"quality-changer": {
|
||||
"detail": "Τρέχουσα ποιότητα: {{quality}}"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"shortcuts": {
|
||||
"prompt": {
|
||||
"keybind": {
|
||||
"keybind-options": {
|
||||
"next": "Next"
|
||||
"next": "Επόμενο",
|
||||
"play-pause": "Αναπαραγωγή / Παύση",
|
||||
"previous": "Προηγούμενο"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -158,18 +158,18 @@
|
||||
},
|
||||
"remove-upgrade-button": "Remove upgrade button",
|
||||
"theme": {
|
||||
"dialog": {
|
||||
"button": {
|
||||
"cancel": "Cancel",
|
||||
"remove": "Remove"
|
||||
},
|
||||
"remove-theme": "Are you sure you want to remove the custom theme?",
|
||||
"remove-theme-message": "This will remove the custom theme"
|
||||
},
|
||||
"label": "Theme",
|
||||
"submenu": {
|
||||
"import-css-file": "Import custom CSS file",
|
||||
"no-theme": "No theme"
|
||||
},
|
||||
"dialog": {
|
||||
"remove-theme": "Are you sure you want to remove the custom theme?",
|
||||
"remove-theme-message": "This will remove the custom theme",
|
||||
"button": {
|
||||
"cancel": "Cancel",
|
||||
"remove": "Remove"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -207,6 +207,10 @@
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"ad-speedup": {
|
||||
"description": "If an ad play it mutes the audio and sets playback speed to 16x",
|
||||
"name": "Ad Speedup"
|
||||
},
|
||||
"adblocker": {
|
||||
"description": "Block all ads and tracking out of the box",
|
||||
"menu": {
|
||||
@ -220,7 +224,6 @@
|
||||
},
|
||||
"album-color-theme": {
|
||||
"description": "Applies a dynamic theme and visual effects based on the album color palette",
|
||||
"name": "Album Color Theme",
|
||||
"menu": {
|
||||
"color-mix-ratio": {
|
||||
"label": "Color mix ratio",
|
||||
@ -228,7 +231,8 @@
|
||||
"percent": "{{ratio}}%"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Album Color Theme"
|
||||
},
|
||||
"ambient-mode": {
|
||||
"description": "Applies a lighting effect by casting gentle colors from the video, into your screen’s background",
|
||||
@ -275,6 +279,56 @@
|
||||
},
|
||||
"name": "Ambient Mode"
|
||||
},
|
||||
"amuse": {
|
||||
"description": "Adds YouTube Music support for the Amuse now playing widget by 6K Labs",
|
||||
"name": "Amuse",
|
||||
"response": {
|
||||
"query": "Amuse API server is running. GET /query to get song info."
|
||||
}
|
||||
},
|
||||
"api-server": {
|
||||
"description": "Adds an API server to control the player",
|
||||
"dialog": {
|
||||
"request": {
|
||||
"buttons": {
|
||||
"allow": "Allow",
|
||||
"deny": "Deny"
|
||||
},
|
||||
"message": "Allow {{ID}} ({{origin}}) to access the API?",
|
||||
"title": "API authorization request"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"auth-strategy": {
|
||||
"label": "Authorization strategy",
|
||||
"submenu": {
|
||||
"auth-at-first": {
|
||||
"label": "Authorize at first request"
|
||||
},
|
||||
"none": {
|
||||
"label": "No authorization"
|
||||
}
|
||||
}
|
||||
},
|
||||
"hostname": {
|
||||
"label": "Hostname"
|
||||
},
|
||||
"port": {
|
||||
"label": "Port"
|
||||
}
|
||||
},
|
||||
"name": "API Server [Beta]",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "Enter the hostname (like 0.0.0.0) for the API server:",
|
||||
"title": "Hostname"
|
||||
},
|
||||
"port": {
|
||||
"label": "Enter the port for the API server:",
|
||||
"title": "Port"
|
||||
}
|
||||
}
|
||||
},
|
||||
"audio-compressor": {
|
||||
"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"
|
||||
@ -410,24 +464,24 @@
|
||||
"description": "Downloads MP3 / source audio directly from the interface",
|
||||
"menu": {
|
||||
"choose-download-folder": "Choose download folder",
|
||||
"download-finish-settings": {
|
||||
"label": "Download on finish",
|
||||
"prompt": {
|
||||
"last-percent": "After x percent",
|
||||
"last-seconds": "Last x seconds",
|
||||
"title": "Configure when to download"
|
||||
},
|
||||
"submenu": {
|
||||
"advanced": "Advanced",
|
||||
"enabled": "Enabled",
|
||||
"mode": "Time mode",
|
||||
"percent": "Percent",
|
||||
"seconds": "Seconds"
|
||||
}
|
||||
},
|
||||
"download-playlist": "Download playlist",
|
||||
"presets": "Presets",
|
||||
"skip-existing": "Skip existing files",
|
||||
"download-finish-settings": {
|
||||
"label": "Download on finish",
|
||||
"submenu": {
|
||||
"enabled": "Enabled",
|
||||
"mode": "Time mode",
|
||||
"seconds": "Seconds",
|
||||
"percent": "Percent",
|
||||
"advanced": "Advanced"
|
||||
},
|
||||
"prompt": {
|
||||
"title": "Configure when to download",
|
||||
"last-seconds": "Last x seconds",
|
||||
"last-percent": "After x percent"
|
||||
}
|
||||
}
|
||||
"skip-existing": "Skip existing files"
|
||||
},
|
||||
"name": "Downloader",
|
||||
"renderer": {
|
||||
@ -605,19 +659,19 @@
|
||||
"dialog": {
|
||||
"lastfm": {
|
||||
"auth-failed": {
|
||||
"title": "Authentication Failed",
|
||||
"message": "Failed to authenticate with Last.fm\nHide the popup until the next restart."
|
||||
"message": "Failed to authenticate with Last.fm\nHide the popup until the next restart.",
|
||||
"title": "Authentication Failed"
|
||||
}
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"scrobble-other-media": "Scrobble other media",
|
||||
"lastfm": {
|
||||
"api-settings": "Last.fm API Settings"
|
||||
},
|
||||
"listenbrainz": {
|
||||
"token": "Enter ListenBrainz user token"
|
||||
}
|
||||
},
|
||||
"scrobble-other-media": "Scrobble other media"
|
||||
},
|
||||
"name": "Scrobbler",
|
||||
"prompt": {
|
||||
@ -664,6 +718,63 @@
|
||||
"description": "Automatically Skips non-music parts like intro/outro or parts of music videos where the song isn't playing",
|
||||
"name": "SponsorBlock"
|
||||
},
|
||||
"synced-lyrics": {
|
||||
"description": "Provides synced lyrics to songs, using providers like LRClib.",
|
||||
"errors": {
|
||||
"fetch": "⚠️\tAn error occurred while fetching the lyrics.\n\tPlease try again later.",
|
||||
"not-found": "⚠️ No lyrics found for this song."
|
||||
},
|
||||
"menu": {
|
||||
"default-text-string": {
|
||||
"label": "Default character between lyrics",
|
||||
"tooltip": "Choose the default character to use for the gap between lyrics"
|
||||
},
|
||||
"line-effect": {
|
||||
"label": "Line effect",
|
||||
"submenu": {
|
||||
"fancy": {
|
||||
"label": "Fancy",
|
||||
"tooltip": "Use large, app-like effects on the current line"
|
||||
},
|
||||
"focus": {
|
||||
"label": "Focus",
|
||||
"tooltip": "Make only the current line white"
|
||||
},
|
||||
"offset": {
|
||||
"label": "Offset",
|
||||
"tooltip": "Offset on the right the current line"
|
||||
},
|
||||
"scale": {
|
||||
"label": "Scale",
|
||||
"tooltip": "Scale the current line"
|
||||
}
|
||||
},
|
||||
"tooltip": "Choose the effect to apply to the current line"
|
||||
},
|
||||
"precise-timing": {
|
||||
"label": "Make the lyrics perfectly synced",
|
||||
"tooltip": "Calculate to the milisecond the display of the next line (can have a small impact on performance)"
|
||||
},
|
||||
"show-lyrics-even-if-inexact": {
|
||||
"label": "Show lyrics even if inexact",
|
||||
"tooltip": "If the song is not found, the plugin tries again with a different search query.\nThe result from the second attempt may not be exact."
|
||||
},
|
||||
"show-time-codes": {
|
||||
"label": "Show time codes",
|
||||
"tooltip": "Show the time codes next to the lyrics"
|
||||
}
|
||||
},
|
||||
"name": "Synced Lyrics",
|
||||
"refetch-btn": {
|
||||
"fetching": "Fetching...",
|
||||
"normal": "Refetch lyrics"
|
||||
},
|
||||
"warnings": {
|
||||
"duration-mismatch": "⚠️ - The lyrics may be out of sync due to a duration mismatch.",
|
||||
"inexact": "⚠️ - The lyrics for this song may not be exact",
|
||||
"instrumental": "⚠️ - This is an instrumental song"
|
||||
}
|
||||
},
|
||||
"taskbar-mediacontrol": {
|
||||
"description": "Control playback from your Windows taskbar",
|
||||
"name": "Taskbar Media Control"
|
||||
@ -708,6 +819,18 @@
|
||||
"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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -207,6 +207,10 @@
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"ad-speedup": {
|
||||
"description": "Si se reproduce un anuncio, silencia el audio y fija la velocidad de reproducción en 16x",
|
||||
"name": "Aumento de la velocidad de anuncios"
|
||||
},
|
||||
"adblocker": {
|
||||
"description": "Bloquear todos los anuncios y el rastreo",
|
||||
"menu": {
|
||||
@ -275,6 +279,56 @@
|
||||
},
|
||||
"name": "Modo ambiente"
|
||||
},
|
||||
"amuse": {
|
||||
"description": "Agrega soporte de YouTube Music para el widget Amuse de reproduciendo ahora de 6K Labs",
|
||||
"name": "Amuse",
|
||||
"response": {
|
||||
"query": "El servidor API de Amuse se está ejecutando. Usa GET /query para obtener información de la canción."
|
||||
}
|
||||
},
|
||||
"api-server": {
|
||||
"description": "Añade un servidor API para controlar el reproductor",
|
||||
"dialog": {
|
||||
"request": {
|
||||
"buttons": {
|
||||
"allow": "Permitir",
|
||||
"deny": "Denegar"
|
||||
},
|
||||
"message": "¿Permitir {{ID}} ({{origin}}) acceder a la API?",
|
||||
"title": "Petición de autorización API"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"auth-strategy": {
|
||||
"label": "Estrategia de autorización",
|
||||
"submenu": {
|
||||
"auth-at-first": {
|
||||
"label": "Autorizar la primera solicitud"
|
||||
},
|
||||
"none": {
|
||||
"label": "Sin autorización"
|
||||
}
|
||||
}
|
||||
},
|
||||
"hostname": {
|
||||
"label": "Nombre del host"
|
||||
},
|
||||
"port": {
|
||||
"label": "Puerto"
|
||||
}
|
||||
},
|
||||
"name": "Servidor API [Beta]",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "Introduzca el nombre de host (como 0.0.0.0) para el servidor API:",
|
||||
"title": "Nombre de host"
|
||||
},
|
||||
"port": {
|
||||
"label": "Introduzca el puerto para el servidor API:",
|
||||
"title": "Puerto"
|
||||
}
|
||||
}
|
||||
},
|
||||
"audio-compressor": {
|
||||
"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"
|
||||
@ -410,6 +464,21 @@
|
||||
"description": "Descarga MP3 / audio fuente directamente desde la interfaz",
|
||||
"menu": {
|
||||
"choose-download-folder": "Elija la carpeta de descarga",
|
||||
"download-finish-settings": {
|
||||
"label": "Descargar al finalizar",
|
||||
"prompt": {
|
||||
"last-percent": "Después del x por ciento",
|
||||
"last-seconds": "Últimos x segundos",
|
||||
"title": "Configurar cuándo descargar"
|
||||
},
|
||||
"submenu": {
|
||||
"advanced": "Avanzado",
|
||||
"enabled": "Activado",
|
||||
"mode": "Modo de tiempo",
|
||||
"percent": "Porcentaje",
|
||||
"seconds": "Segundos"
|
||||
}
|
||||
},
|
||||
"download-playlist": "Descargar lista de reproducción",
|
||||
"presets": "Preajustes",
|
||||
"skip-existing": "Saltar archivos existentes"
|
||||
@ -422,6 +491,18 @@
|
||||
"button": "Descargar"
|
||||
}
|
||||
},
|
||||
"equalizer": {
|
||||
"description": "Añade un ecualizador al reproductor",
|
||||
"menu": {
|
||||
"presets": {
|
||||
"label": "Ajustes preestablecidos",
|
||||
"list": {
|
||||
"bass-booster": "Amplificador de graves"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Ecualizador"
|
||||
},
|
||||
"exponential-volume": {
|
||||
"description": "Hace que el control deslizante de volumen sea exponencial para que sea más fácil seleccionar volúmenes más bajos.",
|
||||
"name": "Volumen exponencial"
|
||||
@ -649,6 +730,63 @@
|
||||
"description": "Salta automáticamente las partes no musicales como la introducción/final o secciones de videos musicales donde la canción no está sonando",
|
||||
"name": "SponsorBlock"
|
||||
},
|
||||
"synced-lyrics": {
|
||||
"description": "Proporciona letras de canciones sincronizadas, utilizando proveedores como LRClib.",
|
||||
"errors": {
|
||||
"fetch": "⚠️ - Se ha producido un error al descargar la letra. Por favor, vuelve a intentarlo más tarde.",
|
||||
"not-found": "⚠️ - No se ha encontrado ninguna letra para esta canción."
|
||||
},
|
||||
"menu": {
|
||||
"default-text-string": {
|
||||
"label": "Carácter predeterminado entre letras",
|
||||
"tooltip": "Elige el carácter predeterminado que se utilizará para el espacio entre letras"
|
||||
},
|
||||
"line-effect": {
|
||||
"label": "Efecto de la línea",
|
||||
"submenu": {
|
||||
"fancy": {
|
||||
"label": "Elegante",
|
||||
"tooltip": "Usar efectos grandes, similares a los de una aplicación, en la línea actual"
|
||||
},
|
||||
"focus": {
|
||||
"label": "Enfoque",
|
||||
"tooltip": "Mostrar solo la línea actual en blanco"
|
||||
},
|
||||
"offset": {
|
||||
"label": "Desplazamiento",
|
||||
"tooltip": "Desplazamiento a la derecha de la línea actual"
|
||||
},
|
||||
"scale": {
|
||||
"label": "Escala",
|
||||
"tooltip": "Escala de la línea actual"
|
||||
}
|
||||
},
|
||||
"tooltip": "Elige el efecto que deseas aplicar a la línea actual"
|
||||
},
|
||||
"precise-timing": {
|
||||
"label": "Haz que la letra esté perfectamente sincronizada",
|
||||
"tooltip": "Calcular al milisegundo la visualización de la línea siguiente (puede tener un pequeño impacto en el rendimiento)"
|
||||
},
|
||||
"show-lyrics-even-if-inexact": {
|
||||
"label": "Mostrar la letra aunque sea inexacta",
|
||||
"tooltip": "Si no se encuentra la canción, el complemento vuelve a intentarlo con una búsqueda diferente.\nEl resultado del segundo intento puede no ser exacto."
|
||||
},
|
||||
"show-time-codes": {
|
||||
"label": "Visualización del código de tiempo",
|
||||
"tooltip": "Mostrar los códigos de tiempo junto a la letra"
|
||||
}
|
||||
},
|
||||
"name": "Letras sincronizadas",
|
||||
"refetch-btn": {
|
||||
"fetching": "Recuperando...",
|
||||
"normal": "Volver a buscar letras"
|
||||
},
|
||||
"warnings": {
|
||||
"duration-mismatch": "⚠️ - La letra puede estar desincronizada debido a un desajuste en la duración.",
|
||||
"inexact": "⚠️ - La letra de esta canción puede no ser exacta",
|
||||
"instrumental": "⚠️ - Se trata de una canción instrumental"
|
||||
}
|
||||
},
|
||||
"taskbar-mediacontrol": {
|
||||
"description": "Controla la reproducción desde la barra de tareas de Windows",
|
||||
"name": "Control de medios de la barra de tareas"
|
||||
|
||||
195
src/i18n/resources/et.json
Normal file
@ -0,0 +1,195 @@
|
||||
{
|
||||
"common": {
|
||||
"console": {
|
||||
"plugins": {
|
||||
"execute-failed": "{{pluginName}}::{{contextName}} lisamooduli käivitamine ei õnnestunud",
|
||||
"executed-at-ms": "{{pluginName}}::{{contextName}} lisamoodul käivitus {{ms}} millisekundiga",
|
||||
"initialize-failed": "„{{pluginName}}“ lisamooduli töö alustamine ei õnnestunud",
|
||||
"load-all": "Laadime kõiki lisamooduleid",
|
||||
"load-failed": "„{{pluginName}}“ lisamooduli laadimine ei õnnestunud",
|
||||
"loaded": "„{{pluginName}}“ lisamoodul on laaditud",
|
||||
"unload-failed": "„{{pluginName}}“ lisamooduli mälust eemaldamine ei õnnestunud",
|
||||
"unloaded": "„{{pluginName}}“ lisamoodul on mälust eemaldatud"
|
||||
}
|
||||
}
|
||||
},
|
||||
"language": {
|
||||
"code": "et",
|
||||
"local-name": "Eesti",
|
||||
"name": "Estonian"
|
||||
},
|
||||
"main": {
|
||||
"console": {
|
||||
"did-finish-load": {
|
||||
"dev-tools": "Laadimine lõppes, arendaja tarvikud on avatud"
|
||||
},
|
||||
"i18n": {
|
||||
"loaded": "i18n on laaditud"
|
||||
},
|
||||
"second-instance": {
|
||||
"receive-command": "„{{command}}“ käsk on vastu võetud"
|
||||
},
|
||||
"theme": {
|
||||
"css-file-not-found": "CSS faili „{{cssFile}}“ pole olemas, seega eirame eelistust"
|
||||
}
|
||||
},
|
||||
"dialog": {
|
||||
"hide-menu-enabled": {
|
||||
"detail": "Menüü on peidetud ja „Alt“ klahviga saad ta nähtavaks (rakenduse-siseses menüüs „Esc“ klahviga)",
|
||||
"message": "Menüü peitmine on sisselülitatud",
|
||||
"title": "Menüü peitmine on sisselülitatud"
|
||||
},
|
||||
"need-to-restart": {
|
||||
"buttons": {
|
||||
"later": "Hiljem",
|
||||
"restart-now": "Taaskäivita kohe"
|
||||
},
|
||||
"detail": "„{{pluginName}}“ lisamooduli sisselülitamine eeldab rakenduse taaskäivitamist",
|
||||
"message": "„{{pluginName}}“ lisamoodul eeldab rakenduse taaskäivitamist",
|
||||
"title": "Palun käivita rakendus uuesti"
|
||||
},
|
||||
"unresponsive": {
|
||||
"buttons": {
|
||||
"quit": "Välju",
|
||||
"relaunch": "Käivita uuesti",
|
||||
"wait": "Oota"
|
||||
}
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"navigation": {
|
||||
"label": "Liikumine",
|
||||
"submenu": {
|
||||
"copy-current-url": "Kopeeri esitamisel oleva pala URL",
|
||||
"go-back": "Mine tagasi",
|
||||
"go-forward": "Mine edasi",
|
||||
"quit": "Välju",
|
||||
"restart": "Käivita rakendus uuesti"
|
||||
}
|
||||
},
|
||||
"options": {
|
||||
"label": "Seadistused",
|
||||
"submenu": {
|
||||
"advanced-options": {
|
||||
"label": "Lisaseadistused",
|
||||
"submenu": {
|
||||
"auto-reset-app-cache": "Rakenduse käivitamisel lähtesta puhverdatud andmed",
|
||||
"disable-hardware-acceleration": "Lülita raudvaraline kiirendamine välja",
|
||||
"edit-config-json": "Muuda config.json faili"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"label": "Lisamoodulid",
|
||||
"new": "UUS"
|
||||
},
|
||||
"view": {
|
||||
"submenu": {
|
||||
"zoom-in": "Suumi sisse",
|
||||
"zoom-out": "Suumi välja"
|
||||
}
|
||||
}
|
||||
},
|
||||
"tray": {
|
||||
"next": "Edasi",
|
||||
"play-pause": "Esita/Peata esitus",
|
||||
"previous": "Eelmine",
|
||||
"quit": "Välju",
|
||||
"restart": "Käivita rakendus uuesti",
|
||||
"show": "Näita akent",
|
||||
"tooltip": {
|
||||
"default": "YouTube Music",
|
||||
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"ad-speedup": {
|
||||
"description": "Reklaami esitamisel summutatakse heli ja keritakse edasi 16-kordse kiirusega",
|
||||
"name": "Reklaamikiirendaja"
|
||||
},
|
||||
"adblocker": {
|
||||
"description": "Blokeeri kõik reklaamid ja jälitajad",
|
||||
"menu": {
|
||||
"blocker": "Blokeerijad"
|
||||
},
|
||||
"name": "Reklaamiblokeerija"
|
||||
},
|
||||
"ambient-mode": {
|
||||
"menu": {
|
||||
"opacity": {
|
||||
"submenu": {
|
||||
"percent": "{{opacity}}%"
|
||||
}
|
||||
},
|
||||
"quality": {
|
||||
"label": "Kvaliteet",
|
||||
"submenu": {
|
||||
"pixels": "{{quality}} pikslit"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"blur-nav-bar": {
|
||||
"description": "Muudab navigatsiooniriba läbipaistavaks ja hägusaks",
|
||||
"name": "Hägus navigatsiooniriba"
|
||||
},
|
||||
"lyrics-genius": {
|
||||
"description": "Lisa enamustele lugudele laulusõnad",
|
||||
"menu": {
|
||||
"romanized-lyrics": "Latiniseeritud laulusõnad"
|
||||
},
|
||||
"name": "Lyrics Genius",
|
||||
"renderer": {
|
||||
"fetched-lyrics": "Leidsime Geeniuse jaoks ühed laulusõnad"
|
||||
}
|
||||
},
|
||||
"navigation": {
|
||||
"name": "Liikumine"
|
||||
},
|
||||
"scrobbler": {
|
||||
"description": "Lisa kraasimise tugi (last.fm, Listenbrainz, jne)",
|
||||
"dialog": {
|
||||
"lastfm": {
|
||||
"auth-failed": {
|
||||
"message": "Last.fm'i autentimine ei õnnestunud\nPeida hüpikaken järgmise taaskäivituseni.",
|
||||
"title": "Autentimine ei õnnestunud"
|
||||
}
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"lastfm": {
|
||||
"api-settings": "Last.fm API seadistused"
|
||||
},
|
||||
"listenbrainz": {
|
||||
"token": "Sisesta ListenBrainz'i kasutaja tunnusluba"
|
||||
},
|
||||
"scrobble-other-media": "Kraasi muud meediat"
|
||||
},
|
||||
"name": "Kraasija",
|
||||
"prompt": {
|
||||
"lastfm": {
|
||||
"api-key": "Last.fm API võti",
|
||||
"api-secret": "Last.fm API saladus"
|
||||
},
|
||||
"listenbrainz": {
|
||||
"token": {
|
||||
"label": "Sisesta oma ListenBrainz'i tunnusluba:",
|
||||
"title": "ListenBrainz'i tunnusluba"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"synced-lyrics": {
|
||||
"menu": {
|
||||
"show-lyrics-even-if-inexact": {
|
||||
"tooltip": "Kui lugu ei leidu, siis lisamoodul üritab uut otsingut teistsuguse päringuga.\nTeise katse puhul tulemused ei pruugi olla väga täpsed."
|
||||
}
|
||||
}
|
||||
},
|
||||
"tuna-obs": {
|
||||
"description": "Lõimimine OBSi Tuna lisamooduliga"
|
||||
}
|
||||
}
|
||||
}
|
||||
836
src/i18n/resources/fa.json
Normal file
@ -0,0 +1,836 @@
|
||||
{
|
||||
"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": "fa",
|
||||
"local-name": "فارسی",
|
||||
"name": "Persian"
|
||||
},
|
||||
"main": {
|
||||
"console": {
|
||||
"did-finish-load": {
|
||||
"dev-tools": "بارگذاری کامل شد. DevTools باز شد"
|
||||
},
|
||||
"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}}، اندازه نمایشگر={{displaySize}}، موقعیت={{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": "کپی کردن لینک صفحه فعلی",
|
||||
"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": "User-Agent تغییر",
|
||||
"restart-on-config-changes": "راهاندازی مجدد در صورت تغییرات در پیکربندی",
|
||||
"set-proxy": {
|
||||
"label": "تنظیم پراکسی",
|
||||
"prompt": {
|
||||
"label": "آدرس پراکسی را وارد کنید: (برای غیرفعال کردن، خالی بگذارید)",
|
||||
"placeholder": "مثال: SOCKS5://127.0.0.1:9999",
|
||||
"title": "تنظیم پراکسی"
|
||||
}
|
||||
},
|
||||
"toggle-dev-tools": "DevTools باز کردن"
|
||||
}
|
||||
},
|
||||
"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": "اگر تبلیغ پخش شود، صدا را بیصدا کرده و سرعت پخش را به 16 برابر افزایش میدهد",
|
||||
"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": "حالا ویجت Amuse از YouTube Music هم پشتیبانی میکنه! (توسط 6K Labs)",
|
||||
"name": "Amuse",
|
||||
"response": {
|
||||
"query": "سرور Amuse فعال است. برای دریافت اطلاعات آهنگ، از آدرس /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": "وارد کنید (مثل 0.0.0.0): API نام میزبان را برای سرور",
|
||||
"title": "نام میزبان"
|
||||
},
|
||||
"port": {
|
||||
"label": "وارد کنید: API پورت را برای سرور",
|
||||
"title": "پورت"
|
||||
}
|
||||
}
|
||||
},
|
||||
"audio-compressor": {
|
||||
"description": "اعمال فشردهسازی به صدا (کاهش حجم بلندترین بخشهای سیگنال و افزایش حجم بخشهای نرمتر)",
|
||||
"name": "فشردهساز صدا"
|
||||
},
|
||||
"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": "مدت زمان ورود تدریجی (میلیثانیه)",
|
||||
"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": "پاک کردن فعالیت",
|
||||
"clear-activity-after-timeout": "حذف فعالیت پس از اتمام زمان تعیینشده",
|
||||
"connected": "اتصال برقرار شد",
|
||||
"disconnected": "اتصال قطع شد",
|
||||
"hide-duration-left": "مخفی کردن مدت زمان باقیمانده",
|
||||
"hide-github-button": "مخفی کردن دکمه لینک گیت هاب",
|
||||
"play-on-youtube-music": "پخش در یوتیوب موزیک",
|
||||
"set-inactivity-timeout": "تنظیم زمان عدم فعالیت"
|
||||
},
|
||||
"name": "Discord Rich Presence",
|
||||
"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": "Lumia Stream افزودن پشتیبانی از",
|
||||
"name": "Lumia Stream [بتا]"
|
||||
},
|
||||
"lyrics-genius": {
|
||||
"description": "افزودن متن ترانه پشتیبان برای اکثر ترانه ها",
|
||||
"menu": {
|
||||
"romanized-lyrics": "الفبای لاتین برای آهنگهایی با الفبای شرقی (فینگلیش)"
|
||||
},
|
||||
"name": "Genius متن آهنگ",
|
||||
"renderer": {
|
||||
"fetched-lyrics": "بازیابی شد Genius متن ترانه توسط"
|
||||
}
|
||||
},
|
||||
"music-together": {
|
||||
"description": "اشتراکگذاری فهرست پخش با دیگران. وقتی میزبان آهنگی را پخش میکند، همه بقیه همان آهنگ را میشنوند",
|
||||
"dialog": {
|
||||
"enter-host": "شناسه میزبان را وارد کنید"
|
||||
},
|
||||
"internal": {
|
||||
"save": "ذخیره",
|
||||
"track-source": "منبع آهنگ",
|
||||
"unknown-user": "کاربر ناشناس"
|
||||
},
|
||||
"menu": {
|
||||
"click-to-copy-id": "کپی کردن شناسه میزبان",
|
||||
"close": "بستن Music Together",
|
||||
"connected-users": "کاربران متصل",
|
||||
"disconnect": "قطع اتصال Music Together",
|
||||
"empty-user": "هیچ کاربر متصلی وجود ندارد",
|
||||
"host": "میزبان Music Together",
|
||||
"join": "پیوستن به Music Together",
|
||||
"permission": {
|
||||
"all": "اجازه دادن به مهمانان برای کنترل فهرست پخش و پخشکننده",
|
||||
"host-only": "فقط میزبان میتواند فهرست پخش و پخشکننده را کنترل کند",
|
||||
"playlist": "اجازه دادن به مهمانان برای کنترل فهرست پخش"
|
||||
},
|
||||
"set-permission": "تغییر مجوز کنترل",
|
||||
"status": {
|
||||
"disconnected": "قطع اتصال",
|
||||
"guest": "متصل به عنوان مهمان",
|
||||
"host": "متصل به عنوان میزبان"
|
||||
}
|
||||
},
|
||||
"name": "Music Together [بتا]",
|
||||
"toast": {
|
||||
"add-song-failed": "افزودن آهنگ با شکست مواجه شد",
|
||||
"closed": "بسته شد Music Together",
|
||||
"disconnected": "Music Together قطع اتصال",
|
||||
"host-failed": "با شکست مواجه شد Music Together میزبانی",
|
||||
"id-copied": "شناسه میزبان به کلیپبورد کپی شد",
|
||||
"id-copy-failed": "کپی شناسه میزبان به کلیپبورد با شکست مواجه شد",
|
||||
"join-failed": "با شکست مواجه شد Music Together پیوستن به",
|
||||
"joined": "پیوست Music Together به",
|
||||
"permission-changed": "مجوز Music Together به \"{{permission}}\" تغییر یافت",
|
||||
"remove-song-failed": "حذف آهنگ با شکست مواجه شد",
|
||||
"user-connected": "{{name}} به Music Together پیوست",
|
||||
"user-disconnected": "{{name}} Music Together را ترک کرد"
|
||||
}
|
||||
},
|
||||
"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": "Toast سبک",
|
||||
"unpause-notification": "نمایش اعلان هنگام از سرگیری پخش"
|
||||
},
|
||||
"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": "استفاده از حالت تصویر در تصویر اصلی مرورگر"
|
||||
},
|
||||
"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-other-media": "ردیابی رسانههای دیگر"
|
||||
},
|
||||
"name": "ابزار ثبتکنندهی آهنگ",
|
||||
"prompt": {
|
||||
"lastfm": {
|
||||
"api-key": "کلید Last.fm API",
|
||||
"api-secret": "API مخفی Last.fm"
|
||||
},
|
||||
"listenbrainz": {
|
||||
"token": {
|
||||
"label": "توکن کاربری ListenBrainz خود را وارد کنید:",
|
||||
"title": "توکن ListenBrainz"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"shortcuts": {
|
||||
"description": "امکان تنظیم میانبرهای سراسری برای کنترل (پخش/توقف/بعدی/قبلی) و خاموش کردن OSD رسانه با بازنویسی کلیدهای رسانهای، فعالسازی Ctrl/CMD + F برای جستجو، فعالسازی پشتیبانی 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": "⚠️هنگام بارگیری متن ترانه خطایی رخ داده است.\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": "محاسبه دقیق نمایش خط بعدی تا میلیثانیه (ممکن است تاثیر کمی بر عملکرد داشته باشد)"
|
||||
},
|
||||
"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": "کنترل پخش از نوار وظیفه ویندوز(taskbar)",
|
||||
"name": "کنترل رسانه از نوار وظیفه (taskbar)"
|
||||
},
|
||||
"touchbar": {
|
||||
"description": "افزودن ویجت TouchBar برای کاربران macOS",
|
||||
"name": "نوار لمسی"
|
||||
},
|
||||
"tuna-obs": {
|
||||
"description": "ادغام با پلاگین Tuna در OBS",
|
||||
"name": "Tuna OBS"
|
||||
},
|
||||
"video-toggle": {
|
||||
"description": "دکمهای اضافه میکند برای جابجایی بین حالت ویدیو/آهنگ. همچنین به صورت اختیاری میتواند تب ویدیو را حذف کند",
|
||||
"menu": {
|
||||
"align": {
|
||||
"label": "چینش",
|
||||
"submenu": {
|
||||
"left": "چپ",
|
||||
"middle": "میانه",
|
||||
"right": "راست"
|
||||
}
|
||||
},
|
||||
"force-hide": "حذف اجباری تب ویدیو",
|
||||
"mode": {
|
||||
"label": "حالت",
|
||||
"submenu": {
|
||||
"custom": "حالت شخصیسازی شده",
|
||||
"disabled": "غیرفعال",
|
||||
"native": "حالت پیشفرض"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "ویدیو به آهنگ",
|
||||
"templates": {
|
||||
"button": "ترانه"
|
||||
}
|
||||
},
|
||||
"visualizer": {
|
||||
"description": "اضافه کردن نمایشدهنده تصویری به پخشکننده",
|
||||
"menu": {
|
||||
"visualizer-type": "نوع نمایشدهنده تصویری"
|
||||
},
|
||||
"name": "نمایشدهنده تصویری"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -69,7 +69,7 @@
|
||||
},
|
||||
"update-available": {
|
||||
"buttons": {
|
||||
"disable": "Päivityksen pois päältä",
|
||||
"disable": "Poista päivitykset käytöstä",
|
||||
"download": "Lataa",
|
||||
"ok": "Selvä"
|
||||
},
|
||||
@ -215,8 +215,8 @@
|
||||
"name": "Mainos estäjä"
|
||||
},
|
||||
"album-actions": {
|
||||
"description": "Alapeukuta musiikki/videota, jotta voimme tarjota sinulle parhaimmat MIX:it",
|
||||
"name": "Albumin toiminnot"
|
||||
"description": "Lisää tykkäysnappulat, joilla voit lisätä tai poistaa tykkäyksiä kerralla kaikille soittolistan tai albumin kappaleille",
|
||||
"name": "Albumin Toiminnot"
|
||||
},
|
||||
"album-color-theme": {
|
||||
"description": "Käyttää dynaamista teemaa ja visuaalisia tehosteita albumin väripaletin perusteella",
|
||||
@ -228,7 +228,7 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Albumin värin teema"
|
||||
"name": "Albumin Värinen Teema"
|
||||
},
|
||||
"ambient-mode": {
|
||||
"description": "Antaa valaistustehosteen heittämällä videosta lempeitä värejä näytön taustalle",
|
||||
@ -236,11 +236,11 @@
|
||||
"blur-amount": {
|
||||
"label": "Sumennuksen voimakkuus",
|
||||
"submenu": {
|
||||
"pixels": "{{blurAmount}}pikseliä"
|
||||
"pixels": "{{blurAmount}} pikseliä"
|
||||
}
|
||||
},
|
||||
"buffer": {
|
||||
"label": "Puskuroi",
|
||||
"label": "Puskurointi",
|
||||
"submenu": {
|
||||
"buffer": "{{buffer}}"
|
||||
}
|
||||
@ -254,7 +254,7 @@
|
||||
"quality": {
|
||||
"label": "Laatu",
|
||||
"submenu": {
|
||||
"pixels": "{{quality}}pikseliä"
|
||||
"pixels": "{{quality}} pikseliä"
|
||||
}
|
||||
},
|
||||
"size": {
|
||||
@ -264,7 +264,10 @@
|
||||
}
|
||||
},
|
||||
"smoothness-transition": {
|
||||
"label": "sujuvuus siirtymässä"
|
||||
"label": "Siirtymän sujuvuus",
|
||||
"submenu": {
|
||||
"during": "Kesto {{interpolationTime}} s"
|
||||
}
|
||||
},
|
||||
"use-fullscreen": {
|
||||
"label": "Käytetään koko näytön tilaa"
|
||||
|
||||
@ -201,13 +201,22 @@
|
||||
"restart": "I-restart ang App",
|
||||
"show": "Ipakita ang window",
|
||||
"tooltip": {
|
||||
"default": "YouTube Music",
|
||||
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"ad-speedup": {
|
||||
"description": "Pag mag-play ng ad, I-mute ang audio at i-set ang bilis ng playback ng 16x",
|
||||
"name": "Pagbilis ng Ad"
|
||||
},
|
||||
"adblocker": {
|
||||
"description": "I-block ang lahat ng ad at tracking"
|
||||
"description": "I-block ang lahat ng ad at tracking",
|
||||
"menu": {
|
||||
"blocker": "Blocker"
|
||||
},
|
||||
"name": "Pag-block ng Ad"
|
||||
},
|
||||
"album-actions": {
|
||||
"description": "Idadagdag ang Undislike, Dislike, Like, at Unlike na button para ilapat ito sa lahat ng kanta sa isang playlist o album",
|
||||
@ -217,7 +226,10 @@
|
||||
"description": "Naglalapat ng dynamic na tema at visual effect batay sa color palette ng album",
|
||||
"menu": {
|
||||
"color-mix-ratio": {
|
||||
"label": "Ratio ng paghahalo ng kulay"
|
||||
"label": "Ratio ng paghahalo ng kulay",
|
||||
"submenu": {
|
||||
"percent": "{{ratio}}%"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Tema ng Kulay ng Album"
|
||||
@ -256,6 +268,7 @@
|
||||
}
|
||||
},
|
||||
"smoothness-transition": {
|
||||
"label": "Ayos ng Transisyon",
|
||||
"submenu": {
|
||||
"during": "Habang {{interpolationTime}} s"
|
||||
}
|
||||
@ -263,6 +276,56 @@
|
||||
"use-fullscreen": {
|
||||
"label": "Gumamit ng fullscreen"
|
||||
}
|
||||
},
|
||||
"name": "Ambient Mode"
|
||||
},
|
||||
"amuse": {
|
||||
"description": "Nagdaragdag ng suporta sa YouTube Music para sa Amuse now playing widget ng 6K Labs",
|
||||
"response": {
|
||||
"query": "Tumatakbo ang Amuse API server. Gamitin ang GET /query para makuha ang impo ng kanta."
|
||||
}
|
||||
},
|
||||
"api-server": {
|
||||
"description": "Nagdadagdag ng API Server upang kontrolin ang player",
|
||||
"dialog": {
|
||||
"request": {
|
||||
"buttons": {
|
||||
"allow": "Payagan",
|
||||
"deny": "Tanggihan"
|
||||
},
|
||||
"message": "Payagan ang {{ID}} ({{origin}}) upang ma-access ang API?",
|
||||
"title": "Awtorisasyon ng API request"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"auth-strategy": {
|
||||
"label": "Estratehiya ng awtorisasyon",
|
||||
"submenu": {
|
||||
"auth-at-first": {
|
||||
"label": "Mag-autorisa sa unang request"
|
||||
},
|
||||
"none": {
|
||||
"label": "Walang awtorisasyon"
|
||||
}
|
||||
}
|
||||
},
|
||||
"hostname": {
|
||||
"label": "Hostname"
|
||||
},
|
||||
"port": {
|
||||
"label": "Port"
|
||||
}
|
||||
},
|
||||
"name": "API Server [Beta]",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "Itala ang hostname (tulad ng 0.0.0.0) para sa API server:",
|
||||
"title": "Hostname"
|
||||
},
|
||||
"port": {
|
||||
"label": "Itala ang port para sa API server:",
|
||||
"title": "Port"
|
||||
}
|
||||
}
|
||||
},
|
||||
"audio-compressor": {
|
||||
@ -296,7 +359,8 @@
|
||||
}
|
||||
},
|
||||
"compact-sidebar": {
|
||||
"description": "Laging i-set ang sidebar sa compact mode"
|
||||
"description": "Laging i-set ang sidebar sa compact mode",
|
||||
"name": "Pinaliit na Sidebar"
|
||||
},
|
||||
"crossfade": {
|
||||
"description": "I-crossfade kada kanta",
|
||||
@ -350,7 +414,7 @@
|
||||
"backend": {
|
||||
"dialog": {
|
||||
"error": {
|
||||
"message": "Argh! Paumanhin, nabigo ang pag-download…",
|
||||
"message": "Kainis! Paumanhin, nabigo ang pag-download…",
|
||||
"title": "Nagkaroon ng error sa pag-download!"
|
||||
},
|
||||
"start-download-playlist": {
|
||||
@ -386,12 +450,36 @@
|
||||
"description": "Dina-download ang mga MP3 / source audio direkta mula sa interface",
|
||||
"menu": {
|
||||
"choose-download-folder": "Pumili ng download folder",
|
||||
"download-finish-settings": {
|
||||
"label": "Kung natapos ang download",
|
||||
"prompt": {
|
||||
"last-percent": "Tapos ng x na porsyento",
|
||||
"last-seconds": "Huling x na segundo",
|
||||
"title": "I-configure kung kailan magda-download"
|
||||
},
|
||||
"submenu": {
|
||||
"enabled": "Napagana na",
|
||||
"percent": "Porsyento",
|
||||
"seconds": "Segundo"
|
||||
}
|
||||
},
|
||||
"download-playlist": "Dina-download ang playlist",
|
||||
"presets": "Mga preset",
|
||||
"skip-existing": "Laktawan ang mga kasalukuyang file"
|
||||
},
|
||||
"renderer": {
|
||||
"can-not-update-progress": "Hindi ma-update ang progress"
|
||||
},
|
||||
"templates": {
|
||||
"button": "Mag-download"
|
||||
}
|
||||
},
|
||||
"equalizer": {
|
||||
"description": "Nagdaragdag ng equalizer sa player",
|
||||
"menu": {
|
||||
"presets": {
|
||||
"label": "Mga Preset"
|
||||
}
|
||||
}
|
||||
},
|
||||
"exponential-volume": {
|
||||
@ -404,7 +492,8 @@
|
||||
}
|
||||
},
|
||||
"lumiastream": {
|
||||
"description": "Nabibigay suporta sa Lumia Stream"
|
||||
"description": "Nabibigay suporta sa Lumia Stream",
|
||||
"name": "Lumia Stream [Beta]"
|
||||
},
|
||||
"lyrics-genius": {
|
||||
"description": "Nagdaragdag ng suporta sa lyrics para sa karamihan ng kanta",
|
||||
@ -427,6 +516,7 @@
|
||||
"connected-users": "Nakakonektang (mga) User",
|
||||
"disconnect": "Mag-diskonekta sa Music Together",
|
||||
"empty-user": "Walang naka-konektang user",
|
||||
"host": "Host ng Music Together",
|
||||
"join": "Sumali sa Music Together",
|
||||
"permission": {
|
||||
"all": "Payagan ang mga guest na kontrolin ang playlist at player",
|
||||
@ -460,20 +550,26 @@
|
||||
"name": "Nabigasyon"
|
||||
},
|
||||
"no-google-login": {
|
||||
"description": "Tanggalin ang mga Google login na button at mga link mula sa interface"
|
||||
"description": "Tanggalin ang mga Google login na button at mga link mula sa interface",
|
||||
"name": "Walang Google na Login"
|
||||
},
|
||||
"notifications": {
|
||||
"description": "Magpakita ng notification kapag nagsimulang tumugtog ang kanta (magagamit ang mga interactive na notification sa Windows)",
|
||||
"menu": {
|
||||
"interactive": "Interactive na Notification",
|
||||
"interactive-settings": {
|
||||
"label": "Mga Interactive na Setting",
|
||||
"submenu": {
|
||||
"hide-button-text": "Itago ang button na texto",
|
||||
"refresh-on-play-pause": "I-refresh sa Pag-play/Pag-pause",
|
||||
"tray-controls": "Buksan/Isara sa pag-click sa tray"
|
||||
}
|
||||
},
|
||||
"priority": "Prioridad ng Notification",
|
||||
"toast-style": "Estilo ng toast",
|
||||
"unpause-notification": "Ipakita ang notification sa pag-unpause"
|
||||
}
|
||||
},
|
||||
"name": "Mga Abiso"
|
||||
},
|
||||
"picture-in-picture": {
|
||||
"description": "Payagan ang pag-palit ng app sa picture-in-picture mode",
|
||||
@ -486,12 +582,13 @@
|
||||
}
|
||||
},
|
||||
"save-window-position": "I-save ang posisyon ng window",
|
||||
"save-window-size": "I-save ang laki ng windo",
|
||||
"save-window-size": "I-save ang laki ng window",
|
||||
"use-native-pip": "Gamitin ang browser native na PiP"
|
||||
}
|
||||
},
|
||||
"playback-speed": {
|
||||
"description": "Makinig na mabilisan, makinig na mabagalan! Nagdaragdag ito ng slider upang makontrol ang bilis ng kanta",
|
||||
"name": "Bilis ng Playback",
|
||||
"templates": {
|
||||
"button": "Bilis"
|
||||
}
|
||||
@ -553,7 +650,8 @@
|
||||
},
|
||||
"listenbrainz": {
|
||||
"token": {
|
||||
"label": "Ilagay ang ListenBrainz user token:"
|
||||
"label": "Ilagay ang ListenBrainz user token:",
|
||||
"title": "Token ng ListenBrainz"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -561,6 +659,7 @@
|
||||
"shortcuts": {
|
||||
"description": "Nagbibigay-daan sa pagtatakda ng mga global hotkey para sa playback (play/pause/susunod/nakaraan) at pag-off ng media OSD sa pamamagitan ng pag-override sa mga media key, pag-on sa Ctrl/CMD + F para maghanap, pag-on sa suporta ng Linux MPRIS para sa mga media key, at mga custom na hotkey para sa mga advanced na user",
|
||||
"menu": {
|
||||
"override-media-keys": "I-override ang mga Media Key",
|
||||
"set-keybinds": "I-set ang Global Song Control"
|
||||
},
|
||||
"name": "Mga shortcut (at MPRIS)",
|
||||
@ -568,6 +667,7 @@
|
||||
"keybind": {
|
||||
"keybind-options": {
|
||||
"next": "Susunod",
|
||||
"play-pause": "Mag-play / Mag-pause",
|
||||
"previous": "Nakaraan"
|
||||
},
|
||||
"label": "Pumili ng Global na Keybind para sa Songs Control:"
|
||||
@ -575,14 +675,69 @@
|
||||
}
|
||||
},
|
||||
"skip-disliked-songs": {
|
||||
"description": "Laktawan ang na-dislike na kanta"
|
||||
"description": "Laktawan ang na-dislike na kanta",
|
||||
"name": "I-skip ang mga Na-dislike na Kanta"
|
||||
},
|
||||
"skip-silences": {
|
||||
"description": "Automatikong laktawan ang mga tahimik na mga seksyon sa kanta"
|
||||
"description": "Automatikong laktawan ang mga tahimik na mga seksyon sa kanta",
|
||||
"name": "I-skip ang mga Katahimikan"
|
||||
},
|
||||
"sponsorblock": {
|
||||
"description": "Automatikong Laktawan ang di part ng kanta tulad ng intro/outro o part ng mga music video na ang kanta ay di nagple-play"
|
||||
},
|
||||
"synced-lyrics": {
|
||||
"description": "Nagbibigay ng naka-sync na lyrics sa mga kanta, gamit ang mga provider tulad ng LRClib.",
|
||||
"errors": {
|
||||
"fetch": "⚠️\t Nagkaroon ng error habang kinukuha ang lyrics.\n\t Subukang muli mamaya.",
|
||||
"not-found": "⚠️ Walang nakitang lyrics para sa kantang ito."
|
||||
},
|
||||
"menu": {
|
||||
"default-text-string": {
|
||||
"label": "Default na character sa pagitan ng lyrics",
|
||||
"tooltip": "Pumili ng default na character na gagamitin sa pagitan ng lyrics"
|
||||
},
|
||||
"line-effect": {
|
||||
"label": "Effect ng Linya",
|
||||
"submenu": {
|
||||
"fancy": {
|
||||
"label": "Magarbo",
|
||||
"tooltip": "Gumamit ng malaki, mala-app na effect sa kasalukuyang linya"
|
||||
},
|
||||
"focus": {
|
||||
"tooltip": "Gawing puti lamang ang kasalukuyang linya"
|
||||
},
|
||||
"offset": {
|
||||
"tooltip": "I-offset sa kanan ang kasalukuyang linya"
|
||||
},
|
||||
"scale": {
|
||||
"tooltip": "I-scale ang kasalukuyang linya"
|
||||
}
|
||||
},
|
||||
"tooltip": "Pumili ng effect na ilalapat sa kasalukuyang linya"
|
||||
},
|
||||
"precise-timing": {
|
||||
"label": "Gawing perpektong naka-sync ang lyrics",
|
||||
"tooltip": "Kalkulahin sa millisecond ang pagpapakita ng susunod na linya (maaaring magkaroon ng maliit na epekto sa performance)"
|
||||
},
|
||||
"show-lyrics-even-if-inexact": {
|
||||
"label": "Ipakita ang lyrics kahit di-eksakto",
|
||||
"tooltip": "Kung hindi matagpuan ang kanta, susubukan muli ng plugin gamit ang ibang query sa paghahanap.\nAng resulta mula sa pangalawang pagsubok ay maaaring hindi eksakto."
|
||||
},
|
||||
"show-time-codes": {
|
||||
"label": "Ipakita ang mga time code",
|
||||
"tooltip": "Ipakita ang mga time code kasunod sa lyrics"
|
||||
}
|
||||
},
|
||||
"refetch-btn": {
|
||||
"fetching": "Nag-fe-fetch...",
|
||||
"normal": "I-fetch muli ang lyrics"
|
||||
},
|
||||
"warnings": {
|
||||
"duration-mismatch": "⚠️ - Maaaring hindi naka-sync ang lyrics dahil sa hindi pagkakatugma ng duration.",
|
||||
"inexact": "⚠️ - Maaaring hindi eksakto ang lyrics para sa kantang ito",
|
||||
"instrumental": "⚠️ - Ito ay isang instrumental na kanta"
|
||||
}
|
||||
},
|
||||
"taskbar-mediacontrol": {
|
||||
"description": "Kontrolin ang pag-play mula sa iyong taskbar ng Windows"
|
||||
},
|
||||
@ -614,7 +769,10 @@
|
||||
}
|
||||
},
|
||||
"visualizer": {
|
||||
"description": "Idaragdag ng visualizer sa player"
|
||||
"description": "Idaragdag ng visualizer sa player",
|
||||
"menu": {
|
||||
"visualizer-type": "Uri ng Visualizer"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -105,7 +105,7 @@
|
||||
"label": "Définir un proxy",
|
||||
"prompt": {
|
||||
"label": "Entrez l'adresse proxy : (laissez vide pour désactiver)",
|
||||
"placeholder": "Exemple: SOCKS5://127.0.0.1:9999",
|
||||
"placeholder": "Exemple : SOCKS5://127.0.0.1:9999",
|
||||
"title": "Définir un proxy"
|
||||
}
|
||||
},
|
||||
@ -179,7 +179,7 @@
|
||||
"plugins": {
|
||||
"enabled": "Activé",
|
||||
"label": "Extensions",
|
||||
"new": "NOUVELLE"
|
||||
"new": "NOUVEAU"
|
||||
},
|
||||
"view": {
|
||||
"label": "Vue",
|
||||
@ -207,6 +207,10 @@
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"ad-speedup": {
|
||||
"description": "Si une publicité apparaît, le son est coupé et la vitesse de lecture est réglée sur 16x",
|
||||
"name": "Accélérer les publicités"
|
||||
},
|
||||
"adblocker": {
|
||||
"description": "Bloquer toutes les annonces et le suivi par défaut",
|
||||
"menu": {
|
||||
@ -275,6 +279,49 @@
|
||||
},
|
||||
"name": "Mode ambiant"
|
||||
},
|
||||
"api-server": {
|
||||
"description": "Ajouter un serveur API pour contrôler le lecteur",
|
||||
"dialog": {
|
||||
"request": {
|
||||
"buttons": {
|
||||
"allow": "Autoriser",
|
||||
"deny": "Interdire"
|
||||
},
|
||||
"message": "Autoriser {{ID}} ({{origin}}) à accéder à l'API ?",
|
||||
"title": "Requête d'autorisation d'API"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"auth-strategy": {
|
||||
"label": "Plan d'autorisation",
|
||||
"submenu": {
|
||||
"auth-at-first": {
|
||||
"label": "Autoriser à la première requête"
|
||||
},
|
||||
"none": {
|
||||
"label": "Pas d'autorisation"
|
||||
}
|
||||
}
|
||||
},
|
||||
"hostname": {
|
||||
"label": "Nom de l'hôte"
|
||||
},
|
||||
"port": {
|
||||
"label": "Port"
|
||||
}
|
||||
},
|
||||
"name": "Serveur API [Beta]",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "Entrer le nom de l'hôte (par exemple 0.0.0.0) pour le serveur API:",
|
||||
"title": "Nom d'hôte"
|
||||
},
|
||||
"port": {
|
||||
"label": "Entrez le port du serveur de l'API:",
|
||||
"title": "Port"
|
||||
}
|
||||
}
|
||||
},
|
||||
"audio-compressor": {
|
||||
"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"
|
||||
@ -410,6 +457,21 @@
|
||||
"description": "Télécharge les fichiers MP3/source audio directement depuis l'interface",
|
||||
"menu": {
|
||||
"choose-download-folder": "Choisissez le dossier de téléchargement",
|
||||
"download-finish-settings": {
|
||||
"label": "Télécharger une fois terminé",
|
||||
"prompt": {
|
||||
"last-percent": "Après x pour cent",
|
||||
"last-seconds": "Dernières x secondes",
|
||||
"title": "Configurer quand télécharger"
|
||||
},
|
||||
"submenu": {
|
||||
"advanced": "Avancé",
|
||||
"enabled": "Activé",
|
||||
"mode": "Mode de temps",
|
||||
"percent": "Pourcent",
|
||||
"seconds": "Secondes"
|
||||
}
|
||||
},
|
||||
"download-playlist": "Télécharger la liste de lecture",
|
||||
"presets": "Préconfigurations",
|
||||
"skip-existing": "Passer les fichiers existants"
|
||||
@ -422,6 +484,18 @@
|
||||
"button": "Télécharger"
|
||||
}
|
||||
},
|
||||
"equalizer": {
|
||||
"description": "Ajoute un égaliseur au lecteur",
|
||||
"menu": {
|
||||
"presets": {
|
||||
"label": "Préréglages",
|
||||
"list": {
|
||||
"bass-booster": "Amplificateur de basses"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Égaliseur"
|
||||
},
|
||||
"exponential-volume": {
|
||||
"description": "Rend le curseur de volume exponentiel afin qu'il soit plus facile de sélectionner des volumes plus faibles.",
|
||||
"name": "Volume exponentiel"
|
||||
@ -649,6 +723,59 @@
|
||||
"description": "Saute automatiquement les parties non musicales comme l'intro/outro ou les parties de clips vidéo où la chanson n'est pas lue",
|
||||
"name": "SponsorBlock"
|
||||
},
|
||||
"synced-lyrics": {
|
||||
"description": "Ajoute des paroles synchronisées aux chansons, grâce à LRClib par exemple.",
|
||||
"errors": {
|
||||
"fetch": "⚠️\tUne erreur s'est produite en allant chercher les paroles.\n\tMerci de réessayer plus tard.",
|
||||
"not-found": "⚠️ - Aucune paroles trouvées pour cette musique."
|
||||
},
|
||||
"menu": {
|
||||
"default-text-string": {
|
||||
"label": "Caractère par défaut entre les paroles",
|
||||
"tooltip": "Choisi le caractère par défaut à utiliser pour l'espace entre les paroles"
|
||||
},
|
||||
"line-effect": {
|
||||
"label": "Effet de ligne",
|
||||
"submenu": {
|
||||
"focus": {
|
||||
"label": "Focus",
|
||||
"tooltip": "Rend seulement la ligne actuelle blanche"
|
||||
},
|
||||
"offset": {
|
||||
"label": "Décalage",
|
||||
"tooltip": "Décale sur la droite la ligne actuelle"
|
||||
},
|
||||
"scale": {
|
||||
"label": "Grossissement",
|
||||
"tooltip": "Agrandis la ligne actuelle"
|
||||
}
|
||||
},
|
||||
"tooltip": "Choisi l'effet à appliquer sur la ligne actuelle"
|
||||
},
|
||||
"precise-timing": {
|
||||
"label": "Rend les paroles parfaitement synchronisées",
|
||||
"tooltip": "Calcul à la milliseconde près l'affichage de la ligne suivante (peut avoir un faible impact sur les performances)"
|
||||
},
|
||||
"show-lyrics-even-if-inexact": {
|
||||
"label": "Afficher les paroles même si inexactes",
|
||||
"tooltip": "Si la musique n'est pas trouvé, le plugin essaye à nouveau avec une différence requête.\nLe résultat du deuxième essais peut ne pas être exacte."
|
||||
},
|
||||
"show-time-codes": {
|
||||
"label": "Afficher les timecodes",
|
||||
"tooltip": "Affiche à côté de chaque paroles son timecode"
|
||||
}
|
||||
},
|
||||
"name": "Paroles Synchronisées",
|
||||
"refetch-btn": {
|
||||
"fetching": "Chargement...",
|
||||
"normal": "Rafraîchir les paroles"
|
||||
},
|
||||
"warnings": {
|
||||
"duration-mismatch": "⚠️ - Les paroles peuvent ne pas être synchronisées à cause d'une différence de durée.",
|
||||
"inexact": "⚠️ - Les paroles de cette chanson peuvent ne pas être exactes",
|
||||
"instrumental": "⚠️ - Cette musique n'a pas de paroles"
|
||||
}
|
||||
},
|
||||
"taskbar-mediacontrol": {
|
||||
"description": "Contrôlez la lecture depuis votre barre des tâches Windows",
|
||||
"name": "Contrôle multimédia de la barre des tâches"
|
||||
|
||||
@ -2,7 +2,14 @@
|
||||
"common": {
|
||||
"console": {
|
||||
"plugins": {
|
||||
"execute-failed": "נכשל ביצוע תוסף {{pluginName}}::{{contextName}}"
|
||||
"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}} הורד"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -10,5 +17,90 @@
|
||||
"code": "he",
|
||||
"local-name": "עברית",
|
||||
"name": "Hebrew"
|
||||
},
|
||||
"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}}, גודל מסך={{displaySize}}, מיקום={{position}}"
|
||||
}
|
||||
},
|
||||
"dialog": {
|
||||
"hide-menu-enabled": {
|
||||
"detail": "התפריט מוחבא, השתמש \"Alt\" על להציג אותו (או \"Esacpe\" אם משתמשים בתפריט בתוך האפליקציה)",
|
||||
"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": "יציאה"
|
||||
}
|
||||
},
|
||||
"options": {
|
||||
"label": "אפשרויות",
|
||||
"submenu": {
|
||||
"advanced-options": {
|
||||
"label": "אפשרויות מתקדמות",
|
||||
"submenu": {
|
||||
"auto-reset-app-cache": "אפס את מטמון האפליקציה כאשר האפליקציה מתחילה",
|
||||
"disable-hardware-acceleration": "השבת האצת החומרה"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
291
src/i18n/resources/hi.json
Normal file
@ -0,0 +1,291 @@
|
||||
{
|
||||
"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": "hi",
|
||||
"local-name": "हिंदी",
|
||||
"name": "Hindi"
|
||||
},
|
||||
"main": {
|
||||
"console": {
|
||||
"did-finish-load": {
|
||||
"dev-tools": "लोडिंग समाप्त हुई । डेवटूल्स खोले गए हैं"
|
||||
},
|
||||
"i18n": {
|
||||
"loaded": "i18n लोड हो गया है"
|
||||
},
|
||||
"second-instance": {
|
||||
"receive-command": "प्रोटोकॉल पर आदेश प्राप्त हुआ \"{{command}}\""
|
||||
},
|
||||
"theme": {
|
||||
"css-file-not-found": "सीएसएस फाइल \"{{cssFile}}\" मौजूद नही है, अनदेखा किया जा रहा है"
|
||||
},
|
||||
"unresponsive": {
|
||||
"details": "अनरेस्पॉन्सिव एरर\n{{error}}"
|
||||
},
|
||||
"when-ready": {
|
||||
"clearing-cache-after-20s": "एप कैश साफ़ किया जा रहा है"
|
||||
},
|
||||
"window": {
|
||||
"tried-to-render-offscreen": "विंडो ने ऑफस्क्रीन रेंडर करने का प्रयास किया, विंडो साइज={{windowSize}}, डिस्प्ले साइज={{displaySize}}, पोजिशन={{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": "मौजूदा यूआरएल कापी करें",
|
||||
"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": "कस्टम सीएसएस फाइल को आयात करें",
|
||||
"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": "यदि कोई विज्ञापन चलता है तो यह ऑडियो को म्यूट कर देता है और प्लेबैक गति 16x पर सेट कर देता है",
|
||||
"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": "चिकनाई संक्रमण"
|
||||
}
|
||||
}
|
||||
},
|
||||
"video-toggle": {
|
||||
"menu": {
|
||||
"align": {
|
||||
"submenu": {
|
||||
"left": "बाएं",
|
||||
"middle": "मध्य",
|
||||
"right": "दाहिने"
|
||||
}
|
||||
},
|
||||
"force-hide": "वीडियो टैब को बलपूर्वक हटाएं",
|
||||
"mode": {
|
||||
"label": "तरीका"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2,13 +2,13 @@
|
||||
"common": {
|
||||
"console": {
|
||||
"plugins": {
|
||||
"execute-failed": "Nem sikerült futtatni a plugint {{pluginName}}::{{contextName}}",
|
||||
"executed-at-ms": "Plugin {{pluginName}}::{{contextName}} a {{ms}}ms időpontban lefutott",
|
||||
"initialize-failed": "Nem sikerült inicializálni a \"{{pluginName}}\" plugint",
|
||||
"execute-failed": "Nem sikerült futtatni a bővítményt {{pluginName}}::{{contextName}}",
|
||||
"executed-at-ms": "A {{pluginName}}::{{contextName}} bővítmény végrehajtva {{ms}} ms alatt",
|
||||
"initialize-failed": "Nem sikerült inicializálni a \"{{pluginName}}\" bővítményt",
|
||||
"load-all": "Összes bővítmény betöltése",
|
||||
"load-failed": "Nem sikerült betölteni a \"{{pluginName}}\" plugint",
|
||||
"loaded": "\"{{pluginName}}\" nevű plugin betöltve",
|
||||
"unload-failed": "Nem sikerült a \"{{pluginName}}\" bővítményt letölteni",
|
||||
"load-failed": "Nem sikerült betölteni a \"{{pluginName}}\" bővítményt",
|
||||
"loaded": "\"{{pluginName}}\" bővítmény betöltve",
|
||||
"unload-failed": "Nem sikerült a \"{{pluginName}}\" bővítményt kikapcsolni",
|
||||
"unloaded": "A \"{{pluginName}}\" bővítmény kikapcsolva"
|
||||
}
|
||||
}
|
||||
@ -33,13 +33,13 @@
|
||||
"css-file-not-found": "CSS fájl \"{{cssFile}}\" nem létezik, figyelmen kívül hagyva"
|
||||
},
|
||||
"unresponsive": {
|
||||
"details": "Nem reagál hiba!\n{{error}}"
|
||||
"details": "Nem válaszol!\n{{error}}"
|
||||
},
|
||||
"when-ready": {
|
||||
"clearing-cache-after-20s": "Alkalmazás gyorsítótárának törlése"
|
||||
},
|
||||
"window": {
|
||||
"tried-to-render-offscreen": "Az ablak a képernyőn kívül próbált betölteni, windowSize={{windowSize}}, displaySize={{displaySize}}, position={{position}}"
|
||||
"tried-to-render-offscreen": "Az ablak a képernyőn kívül próbált betölteni, ablakMéret={{windowSize}}, kijelzőMéret={{displaySize}}, pozíció={{position}}"
|
||||
}
|
||||
},
|
||||
"dialog": {
|
||||
@ -53,8 +53,8 @@
|
||||
"later": "Később",
|
||||
"restart-now": "Újraindítás most"
|
||||
},
|
||||
"detail": "A \"{{pluginName}}\" plugin újraindítást igényel a bekapcsoláshoz",
|
||||
"message": "\"{{pluginName}}\" nevű plugin-t újra kell indítani",
|
||||
"detail": "A \"{{pluginName}}\" bővítmény bekapcsolása az alkalmazás újraindítását igényli",
|
||||
"message": "\"{{pluginName}}\" nevű bővítményt újra kell indítani",
|
||||
"title": "Újraindítás szükséges"
|
||||
},
|
||||
"unresponsive": {
|
||||
@ -73,7 +73,7 @@
|
||||
"download": "Letöltés",
|
||||
"ok": "OK"
|
||||
},
|
||||
"detail": "Az új verzió elérhető, és letölthető az alábbi linken {{downloadLink}}",
|
||||
"detail": "Új verzió elérhető, amely letölthető az alábbi linken {{downloadLink}}",
|
||||
"message": "Új verzió áll rendelkezésre",
|
||||
"title": "Frissítés elérhető"
|
||||
}
|
||||
@ -96,7 +96,7 @@
|
||||
"advanced-options": {
|
||||
"label": "Speciális beállítások",
|
||||
"submenu": {
|
||||
"auto-reset-app-cache": "Az alkalmazás gyorsítótárának törlése indításkor",
|
||||
"auto-reset-app-cache": "Alkalmazás gyorsítótárának törlése indításkor",
|
||||
"disable-hardware-acceleration": "Hardveres gyorsítás kikapcsolása",
|
||||
"edit-config-json": "config.json szerkesztése",
|
||||
"override-user-agent": "Kliens felülírása",
|
||||
@ -123,38 +123,38 @@
|
||||
},
|
||||
"language": {
|
||||
"dialog": {
|
||||
"message": "Az Újraindítást követően változik meg a nyelv",
|
||||
"title": "Megváltozott a nyelv"
|
||||
"message": "A nyelv az allkalmazás újraindítása után megváltozik",
|
||||
"title": "Nyelv megváltoztatva"
|
||||
},
|
||||
"label": "Nyelv",
|
||||
"submenu": {
|
||||
"to-help-translate": "Szeretne a fordításban segíteni? Kattintson ide"
|
||||
"to-help-translate": "Szeretnél segíteni a fordításban? Kattints ide"
|
||||
}
|
||||
},
|
||||
"resume-on-start": "Indításkor az utolsó zene folytatása",
|
||||
"single-instance-lock": "Csak egy példány engedélyezése",
|
||||
"resume-on-start": "Zene folytatása az alkalmazás indításakor",
|
||||
"single-instance-lock": "Csak egy példány",
|
||||
"start-at-login": "Futtatás rendszerindításkor",
|
||||
"starting-page": {
|
||||
"label": "Indítási hely",
|
||||
"label": "Induláskor",
|
||||
"unset": "Visszaállítás"
|
||||
},
|
||||
"tray": {
|
||||
"label": "Tálca",
|
||||
"label": "Tálca ikon",
|
||||
"submenu": {
|
||||
"disabled": "Letiltva",
|
||||
"enabled-and-hide-app": "Aktív és az alkalmazás elrejtve",
|
||||
"enabled-and-show-app": "Aktív és az alkalmazás megjelenítve",
|
||||
"enabled-and-hide-app": "Engedélyezve és alkalmazás elrejtése",
|
||||
"enabled-and-show-app": "Engedélyezve és alkalmazás megjelenítése",
|
||||
"play-pause-on-click": "Lejátszás/Szünet az ikonra kattintással"
|
||||
}
|
||||
},
|
||||
"visual-tweaks": {
|
||||
"label": "Kinézeti beállítások",
|
||||
"label": "Megjelenési beállítások",
|
||||
"submenu": {
|
||||
"like-buttons": {
|
||||
"default": "Alapértelmezett",
|
||||
"force-show": "Megjelenítés kényszerítése",
|
||||
"hide": "Elrejtése",
|
||||
"label": "Kedvelés gombok"
|
||||
"label": "Reakció gombok"
|
||||
},
|
||||
"remove-upgrade-button": "Előfizetés gombjának eltávolítása",
|
||||
"theme": {
|
||||
@ -163,8 +163,8 @@
|
||||
"cancel": "Mégse",
|
||||
"remove": "Eltávolít"
|
||||
},
|
||||
"remove-theme": "Biztos, hogy el akarja távolítani az egyéni témát?",
|
||||
"remove-theme-message": "Ez el fogja távolítani az egyéni témát"
|
||||
"remove-theme": "Biztos, hogy el szeretnéd távolítani az egyéni témát?",
|
||||
"remove-theme-message": "Ez eltávolítja az egyéni témát"
|
||||
},
|
||||
"label": "Téma",
|
||||
"submenu": {
|
||||
@ -186,10 +186,10 @@
|
||||
"submenu": {
|
||||
"force-reload": "Kényszerített újratöltés",
|
||||
"reload": "Újratöltés",
|
||||
"reset-zoom": "Valós méret",
|
||||
"reset-zoom": "Alapértelmezett méret visszaállítása",
|
||||
"toggle-fullscreen": "Teljes képernyő be/ki",
|
||||
"zoom-in": "Nagyítás",
|
||||
"zoom-out": "Kicsinyítés"
|
||||
"zoom-in": "Szöveg nagyítása",
|
||||
"zoom-out": "Szöveg kicsinyítése"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -207,22 +207,26 @@
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"ad-speedup": {
|
||||
"description": "Ha egy hirdetés elindul, elnémítja a hangot, és a lejátszási sebességet 16x-ra állítja",
|
||||
"name": "Hirdetésgyorsítás"
|
||||
},
|
||||
"adblocker": {
|
||||
"description": "Alapértelmezés szerint blokkolja az összes hirdetést és nyomkövetést",
|
||||
"description": "Alapértelmezetten minden hirdetés és nyomkövetés blokkolása",
|
||||
"menu": {
|
||||
"blocker": "Blokkoló"
|
||||
"blocker": "Blokkolási módszer"
|
||||
},
|
||||
"name": "Reklámblokkoló"
|
||||
},
|
||||
"album-actions": {
|
||||
"description": "Dislike, Undislike, Like, Unlike gombok hozzáadása, amivel ezt a lejátszási listán vagy albumon lévő összes dalra alkalmazza",
|
||||
"description": "Hozzáadja a Tetszik, Nem tetszik és ezek visszavonására szolgáló gombokat, hogy ezeket az összes dalra alkalmazhasd egy lejátszási listán vagy albumban",
|
||||
"name": "Album műveletek"
|
||||
},
|
||||
"album-color-theme": {
|
||||
"description": "Dinamikus téma és vizuális effektek alkalmazása az album színpalettája alapján",
|
||||
"description": "Dinamikus témát és vizuális effekteket alkalmaz az album színpalettája alapján",
|
||||
"menu": {
|
||||
"color-mix-ratio": {
|
||||
"label": "Szín keverés aránya",
|
||||
"label": "Színkeverés mértéke",
|
||||
"submenu": {
|
||||
"percent": "{{ratio}}%"
|
||||
}
|
||||
@ -231,12 +235,12 @@
|
||||
"name": "Album színtéma"
|
||||
},
|
||||
"ambient-mode": {
|
||||
"description": "Fényhatás alkalmazása a videóból származó lágy színek vetítésével a képernyő hátterére",
|
||||
"description": "Fényhatás effektust alkalmaz, amely a videóból származó lágy színeket vetíti a képernyő hátterére",
|
||||
"menu": {
|
||||
"blur-amount": {
|
||||
"label": "Elmosódás mértéke",
|
||||
"submenu": {
|
||||
"pixels": "{{blurAmount}} képpontok"
|
||||
"pixels": "{{blurAmount}} pixel"
|
||||
}
|
||||
},
|
||||
"buffer": {
|
||||
@ -254,7 +258,7 @@
|
||||
"quality": {
|
||||
"label": "Minőség",
|
||||
"submenu": {
|
||||
"pixels": "{{quality}} képpont"
|
||||
"pixels": "{{quality}} pixel"
|
||||
}
|
||||
},
|
||||
"size": {
|
||||
@ -266,14 +270,64 @@
|
||||
"smoothness-transition": {
|
||||
"label": "Sima átmenet",
|
||||
"submenu": {
|
||||
"during": "{{interpolationTime}}s alatt"
|
||||
"during": "{{interpolationTime}} másodperc alatt"
|
||||
}
|
||||
},
|
||||
"use-fullscreen": {
|
||||
"label": "Teljes képernyő használata"
|
||||
}
|
||||
},
|
||||
"name": "Természetes mód"
|
||||
"name": "Ambient mód"
|
||||
},
|
||||
"amuse": {
|
||||
"description": "Hozzáadja a YouTube Music támogatását az Amuse \"now playing\" widgethez a 6K Labs által",
|
||||
"name": "Amuse",
|
||||
"response": {
|
||||
"query": "Az Amuse API szerver fut. Használja a GET /query kérést a dalinformációk lekéréséhez."
|
||||
}
|
||||
},
|
||||
"api-server": {
|
||||
"description": "Hozzáad egy API szervert a lejátszó vezérléséhez",
|
||||
"dialog": {
|
||||
"request": {
|
||||
"buttons": {
|
||||
"allow": "Engedélyez",
|
||||
"deny": "Megtagad"
|
||||
},
|
||||
"message": "Engedélyezi, hogy {{ID}} ({{origin}}) hozzáférjen az API-hoz?",
|
||||
"title": "API-hozzáférési kérelem"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"auth-strategy": {
|
||||
"label": "Engedélyezési módszer",
|
||||
"submenu": {
|
||||
"auth-at-first": {
|
||||
"label": "Engedélyezés az első kérésnél"
|
||||
},
|
||||
"none": {
|
||||
"label": "Nincs engedélyezés"
|
||||
}
|
||||
}
|
||||
},
|
||||
"hostname": {
|
||||
"label": "Kiszolgáló név"
|
||||
},
|
||||
"port": {
|
||||
"label": "Port"
|
||||
}
|
||||
},
|
||||
"name": "API szerver [Béta]",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "Adja meg az API szerver kiszolgáló nevét (például 0.0.0.0):",
|
||||
"title": "Kiszolgáló neve"
|
||||
},
|
||||
"port": {
|
||||
"label": "Adja meg az API szerver portját:",
|
||||
"title": "Port"
|
||||
}
|
||||
}
|
||||
},
|
||||
"audio-compressor": {
|
||||
"description": "Hang tömörítés alkalmazása (csökkenti a jel legzajosabb részeinek hangerősségét, és emeli a legcsendesebb részek hangerősségét)",
|
||||
@ -321,7 +375,7 @@
|
||||
"fade-in-duration": "Áttünés időtartama (ms)",
|
||||
"fade-out-duration": "Fokozatos halkítás időtartama (ms)",
|
||||
"fade-scaling": {
|
||||
"label": "Áttünés értéke",
|
||||
"label": "Áttünés mértéke",
|
||||
"linear": "Lineáris",
|
||||
"logarithmic": "Logaritmikus"
|
||||
},
|
||||
@ -332,7 +386,7 @@
|
||||
}
|
||||
},
|
||||
"disable-autoplay": {
|
||||
"description": "A Zenék nem fognak maguktól elindulni, a bővítmény használata során kézileg kel indítani a zenéket",
|
||||
"description": "Ez a funkció kikapcsolja az automatikus lejátszást, így a zenék nem indulnak el maguktól. Amikor egy album vagy egy dal lejátszása véget ér, a következő szám nem kezdődik el automatikusan. A bővítmény használata során minden zenét manuálisan kell elindítani",
|
||||
"menu": {
|
||||
"apply-once": "Csak induláskor alkalmazza"
|
||||
},
|
||||
@ -352,7 +406,7 @@
|
||||
"connected": "Kapcsolódva",
|
||||
"disconnected": "Nincs Kapcsolódva",
|
||||
"hide-duration-left": "Hátralévő idő elrejtése",
|
||||
"hide-github-button": "GitHub link gombjának elrejtése",
|
||||
"hide-github-button": "GitHub url gombjának elrejtése",
|
||||
"play-on-youtube-music": "Lejátszás a YouTube Music-on",
|
||||
"set-inactivity-timeout": "Inaktivitási időkorlát beállítása"
|
||||
},
|
||||
@ -368,6 +422,9 @@
|
||||
"backend": {
|
||||
"dialog": {
|
||||
"error": {
|
||||
"buttons": {
|
||||
"ok": "Rendben"
|
||||
},
|
||||
"message": "Hoppá! Elnézést, a letöltés sikertelen volt…",
|
||||
"title": "A letöltés során hiba történt!"
|
||||
},
|
||||
@ -407,7 +464,23 @@
|
||||
"description": "MP3 / forrás hanganyag letöltése közvetlenül az interfészről",
|
||||
"menu": {
|
||||
"choose-download-folder": "Letöltési mappa kiválasztása",
|
||||
"download-finish-settings": {
|
||||
"label": "Letöltés befejezéskor",
|
||||
"prompt": {
|
||||
"last-percent": "x százalék után",
|
||||
"last-seconds": "Utolsó x másodperc",
|
||||
"title": "Letöltés idejének beállítása"
|
||||
},
|
||||
"submenu": {
|
||||
"advanced": "Speciális",
|
||||
"enabled": "Engedélyezve",
|
||||
"mode": "Időmód",
|
||||
"percent": "Százalék",
|
||||
"seconds": "Másodpercek"
|
||||
}
|
||||
},
|
||||
"download-playlist": "Lejátszási lista letöltése",
|
||||
"presets": "Sablonok",
|
||||
"skip-existing": "Meglévő fájlok kihagyása"
|
||||
},
|
||||
"name": "Letöltő",
|
||||
@ -418,6 +491,18 @@
|
||||
"button": "Letöltés"
|
||||
}
|
||||
},
|
||||
"equalizer": {
|
||||
"description": "Hangszínszabályzót ad hozzá a zenelejátszóhoz",
|
||||
"menu": {
|
||||
"presets": {
|
||||
"label": "Hangprofil",
|
||||
"list": {
|
||||
"bass-booster": "Basszuskiemelés"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Hangszínszabályzó"
|
||||
},
|
||||
"exponential-volume": {
|
||||
"description": "Az hangerő csúszka exponenciálissá tételével könnyebbé válik az alacsony hangerő kiválasztása.",
|
||||
"name": "Exponenciális hangerő"
|
||||
@ -466,6 +551,7 @@
|
||||
"host-only": "Csak a házigazda tudja vezérelni a lejátszási listát és a lejátszót",
|
||||
"playlist": "Engedélyezi a vendégeknek a lejátszási lista vezérlését"
|
||||
},
|
||||
"set-permission": "Vezérlési engedély módosítása",
|
||||
"status": {
|
||||
"disconnected": "Kapcsolat bontva",
|
||||
"guest": "Csatlakozva vendégként",
|
||||
@ -489,6 +575,7 @@
|
||||
}
|
||||
},
|
||||
"navigation": {
|
||||
"description": "Következő/Vissza navigációs nyilak közvetlenül az interfészbe integrálva, mint a kedvenc böngésződben",
|
||||
"name": "Navigáció"
|
||||
},
|
||||
"no-google-login": {
|
||||
@ -502,10 +589,14 @@
|
||||
"interactive-settings": {
|
||||
"label": "Interaktív beállítások",
|
||||
"submenu": {
|
||||
"hide-button-text": "Gombok szövegének elrejtése"
|
||||
"hide-button-text": "Gombok szövegének elrejtése",
|
||||
"refresh-on-play-pause": "Frissítés lejátszás/szünet megnyomásakor",
|
||||
"tray-controls": "Megnyitás/Bezárás tálca ikonra kattintva"
|
||||
}
|
||||
},
|
||||
"priority": "Értesítési prioritás"
|
||||
"priority": "Értesítési prioritás",
|
||||
"toast-style": "Értesítés stílusa",
|
||||
"unpause-notification": "Értesítés megjelenítése a lejátszás folytatásakor"
|
||||
},
|
||||
"name": "Értesítések"
|
||||
},
|
||||
@ -533,7 +624,7 @@
|
||||
}
|
||||
},
|
||||
"playback-speed": {
|
||||
"description": "Hallgass gyorsan, hallgass lassan! Hozzáad egy csúszkát, amely szabályozza a dal sebességét",
|
||||
"description": "Hallgassd gyorsan, hallgassd lassan! Hozzáad egy csúszkát, amely szabályozza a dal sebességét",
|
||||
"name": "Lejátszás sebessége",
|
||||
"templates": {
|
||||
"button": "Sebesség"
|
||||
@ -542,7 +633,9 @@
|
||||
"precise-volume": {
|
||||
"description": "A hangerő precíz szabályozása egérgörgővel/gyorsbillentyűkkel, egy egyedi HUD és testreszabható hangerő csuszka segítségével",
|
||||
"menu": {
|
||||
"global-shortcuts": "Globális gyorsbillentyűk"
|
||||
"arrows-shortcuts": "Helyi nyíl-billentyűkkel való vezérlés",
|
||||
"custom-volume-steps": "Egyedi hangerőléptetés beállítása",
|
||||
"global-shortcuts": "Globális Gyorsbillentyűk"
|
||||
},
|
||||
"name": "Precíz hangerő",
|
||||
"prompt": {
|
||||
@ -553,6 +646,10 @@
|
||||
},
|
||||
"label": "Válaszd ki a globális hangerő gyorsbillentyűket:",
|
||||
"title": "Globális hangerő gyorsbillentyűk"
|
||||
},
|
||||
"volume-steps": {
|
||||
"label": "Hangerő növelés/csökkentés léptékének kiválasztása",
|
||||
"title": "Hangerő lépték"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -566,7 +663,8 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"description": "Lehetővé teszi a videó minőségének megváltoztatását egy gombbal a videó fedvényen"
|
||||
"description": "Lehetővé teszi a videó minőségének megváltoztatását egy gombbal a videó fedvényen",
|
||||
"name": "Videóminőség modosító"
|
||||
},
|
||||
"scrobbler": {
|
||||
"description": "Scrobbling támogatás hozzáadása (pl. last.fm, ListenBrainz)",
|
||||
@ -584,8 +682,10 @@
|
||||
},
|
||||
"listenbrainz": {
|
||||
"token": "Add meg a ListenBrainz felhasználói tokenedet"
|
||||
}
|
||||
},
|
||||
"scrobble-other-media": "Más média scrobbelése"
|
||||
},
|
||||
"name": "Scrobbler",
|
||||
"prompt": {
|
||||
"lastfm": {
|
||||
"api-key": "Last.fm API kulcs",
|
||||
@ -613,6 +713,7 @@
|
||||
"play-pause": "Lejátszás / Szünet",
|
||||
"previous": "Előző"
|
||||
},
|
||||
"label": "Globális billentyűparancsok választása a dalok vezérléséhez:",
|
||||
"title": "Globális gyorsbillentyűk"
|
||||
}
|
||||
}
|
||||
@ -629,8 +730,66 @@
|
||||
"description": "Automatikusan kihagyja a nem zenés részeket, mint például az intro/outro vagy a zenei videók olyan részeit, ahol a zene nem szól",
|
||||
"name": "SzponzorBlokk"
|
||||
},
|
||||
"synced-lyrics": {
|
||||
"description": "Szinkronizált dalszövegeket biztosít dalokhoz, LRClib-hez hasonló szolgáltatókat használva.",
|
||||
"errors": {
|
||||
"fetch": "⚠️\tHiba történt a dalszöveg lekérése közben.\n\tKérjük, próbálja meg később újra.",
|
||||
"not-found": "⚠️ - Ehhez a dalhoz nem található dalszöveg."
|
||||
},
|
||||
"menu": {
|
||||
"default-text-string": {
|
||||
"label": "Alapértelmezett karakter a dalszövegek között",
|
||||
"tooltip": "Válassza ki az alapértelmezett karaktert, amelyet a dalszövegek közötti szünethez használni szeretne"
|
||||
},
|
||||
"line-effect": {
|
||||
"label": "Soreffekt",
|
||||
"submenu": {
|
||||
"fancy": {
|
||||
"label": "Díszes",
|
||||
"tooltip": "Használj nagy, alkalmazásszerű effektusokat az aktuális sorhoz"
|
||||
},
|
||||
"focus": {
|
||||
"label": "Fókuszált",
|
||||
"tooltip": "Az aktuális sor kijelőlése fehérrel"
|
||||
},
|
||||
"offset": {
|
||||
"label": "Eltolás",
|
||||
"tooltip": "Az aktuális sort jobbra tolja. (mintha tabulálnád)"
|
||||
},
|
||||
"scale": {
|
||||
"label": "Méretezett",
|
||||
"tooltip": "Az aktuális sort kissé nagyobbra méretezi, kiemelve azt a többi sor közül"
|
||||
}
|
||||
},
|
||||
"tooltip": "Válassza ki az aktuális sorra alkalmazandó effektust"
|
||||
},
|
||||
"precise-timing": {
|
||||
"label": "Dalszöveg tökéletes szinkronizálása",
|
||||
"tooltip": "Számítsa ki az aktuális sor megjelenítésének idejét ezredmásodperc pontossággal (ez kis mértékben befolyásolhatja a teljesítményt)"
|
||||
},
|
||||
"show-lyrics-even-if-inexact": {
|
||||
"label": "Pontatlan időzítésű dalszövegek megjelenítése",
|
||||
"tooltip": "Ha a dalt nem találja, a bővítmény újra próbálkozik egy másik keresési lekérdezéssel.\nAz eredmény a második próbálkozás után nem biztos, hogy pontos lesz."
|
||||
},
|
||||
"show-time-codes": {
|
||||
"label": "Időkódok megjelenítése",
|
||||
"tooltip": "Az időkódok megjelenítése a dalszövegek mellett"
|
||||
}
|
||||
},
|
||||
"name": "Szinkronizált dalszövegek",
|
||||
"refetch-btn": {
|
||||
"fetching": "Lekérés folyamatban...",
|
||||
"normal": "Dalszöveg újra lekérése"
|
||||
},
|
||||
"warnings": {
|
||||
"duration-mismatch": "⚠️ - A dalszövegek időzítése eltérhet a zene hossza miatt.",
|
||||
"inexact": "⚠️ - Ennek a zenének a dalszövege pontatlan lehet",
|
||||
"instrumental": "⚠️ - Ez egy hangszerekkel játszott zene"
|
||||
}
|
||||
},
|
||||
"taskbar-mediacontrol": {
|
||||
"description": "Lejátszás vezérlése a Windows tálcáról"
|
||||
"description": "Lejátszás vezérlése a Windows tálcáról",
|
||||
"name": "Médiavezérlés a tálcán"
|
||||
},
|
||||
"touchbar": {
|
||||
"description": "macOS felhasználók számára hozzáad egy widgetet a TouchBar-hoz",
|
||||
@ -667,6 +826,7 @@
|
||||
}
|
||||
},
|
||||
"visualizer": {
|
||||
"description": "Vizualizációt ad a lejátszóhoz",
|
||||
"menu": {
|
||||
"visualizer-type": "Vizualizáció típus"
|
||||
},
|
||||
|
||||
@ -202,11 +202,15 @@
|
||||
"show": "Tampilkan jendela",
|
||||
"tooltip": {
|
||||
"default": "YouTube Musik",
|
||||
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
|
||||
"with-song-info": "YouTube Musik: {{artist}} - {{title}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"ad-speedup": {
|
||||
"description": "Jika iklan diputar, audio akan dimatikan dan kecepatan pemutaran akan diatur ke 16x",
|
||||
"name": "Percepatan Iklan"
|
||||
},
|
||||
"adblocker": {
|
||||
"description": "Blokir semua iklan dan pelacakan di luar kotak",
|
||||
"menu": {
|
||||
@ -275,6 +279,56 @@
|
||||
},
|
||||
"name": "Mode ambient"
|
||||
},
|
||||
"amuse": {
|
||||
"description": "Menambahkan dukungan YouTube Music untuk widget Amuse yang sedang diputar oleh 6K Labs",
|
||||
"name": "Amuse",
|
||||
"response": {
|
||||
"query": "Server API Amuse sedang berjalan. GET /query untuk mendapatkan info lagu."
|
||||
}
|
||||
},
|
||||
"api-server": {
|
||||
"description": "Menambahkan server API untuk mengontrol pemutar",
|
||||
"dialog": {
|
||||
"request": {
|
||||
"buttons": {
|
||||
"allow": "Izinkan",
|
||||
"deny": "Menolak"
|
||||
},
|
||||
"message": "Izinkan {{ID}} ({{origin}}) untuk mengakses API?",
|
||||
"title": "Permintaan otorisasi API"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"auth-strategy": {
|
||||
"label": "Strategi otorisasi",
|
||||
"submenu": {
|
||||
"auth-at-first": {
|
||||
"label": "Otorisasi pada permintaan pertama"
|
||||
},
|
||||
"none": {
|
||||
"label": "Tidak ada otorisasi"
|
||||
}
|
||||
}
|
||||
},
|
||||
"hostname": {
|
||||
"label": "Nama host"
|
||||
},
|
||||
"port": {
|
||||
"label": "Port"
|
||||
}
|
||||
},
|
||||
"name": "API Server [Beta]",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "Masukkan nama host (seperti 0.0.0.0) untuk server API:",
|
||||
"title": "Nama host"
|
||||
},
|
||||
"port": {
|
||||
"label": "Masukkan port untuk server API:",
|
||||
"title": "Port"
|
||||
}
|
||||
}
|
||||
},
|
||||
"audio-compressor": {
|
||||
"description": "Menerapkan kompresi pada audio (mengurangi volume pada bagian paling keras dari sinyal dan meningkatkan volume pada bagian paling lembut)",
|
||||
"name": "Kompresi suara"
|
||||
@ -410,6 +464,21 @@
|
||||
"description": "Unduh MP3 / sumber suara secara langsung via antarmuka",
|
||||
"menu": {
|
||||
"choose-download-folder": "Pilih folder unduhan",
|
||||
"download-finish-settings": {
|
||||
"label": "Unduh setelah selesai",
|
||||
"prompt": {
|
||||
"last-percent": "x persen terakhir",
|
||||
"last-seconds": "x detik terakhir",
|
||||
"title": "Konfigurasikan kapan akan mengunduh"
|
||||
},
|
||||
"submenu": {
|
||||
"advanced": "Lanjutan",
|
||||
"enabled": "Diaktifkan",
|
||||
"mode": "Mode waktu",
|
||||
"percent": "Persen",
|
||||
"seconds": "Detik"
|
||||
}
|
||||
},
|
||||
"download-playlist": "Unduh daftar putar",
|
||||
"presets": "Prasetel",
|
||||
"skip-existing": "Lewati berkas yang sudah ada"
|
||||
@ -422,6 +491,18 @@
|
||||
"button": "Unduh"
|
||||
}
|
||||
},
|
||||
"equalizer": {
|
||||
"description": "Menambahkan equalizer ke pemutar",
|
||||
"menu": {
|
||||
"presets": {
|
||||
"label": "Prasetel",
|
||||
"list": {
|
||||
"bass-booster": "Penguat Bass"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Equalizer"
|
||||
},
|
||||
"exponential-volume": {
|
||||
"description": "Buat penggeser volume menjadi eksponen sehingga memudahkan memilih volume yang lebih rendah.",
|
||||
"name": "Volume Eksponen"
|
||||
@ -649,6 +730,63 @@
|
||||
"description": "Otomatis Melewati bagian yang bukan musik seperti intro/outro atau bagian dari video musik di mana lagu tidak dimainkan",
|
||||
"name": "SponsorBlock"
|
||||
},
|
||||
"synced-lyrics": {
|
||||
"description": "Menyediakan lirik lagu yang disinkronkan, menggunakan penyedia seperti LRClib.",
|
||||
"errors": {
|
||||
"fetch": "⚠️\tTerjadi kesalahan saat mengambil lirik.\n\tSilakan coba lagi nanti.",
|
||||
"not-found": "⚠️ Tidak ada lirik yang ditemukan untuk lagu ini."
|
||||
},
|
||||
"menu": {
|
||||
"default-text-string": {
|
||||
"label": "Karakter default antara lirik",
|
||||
"tooltip": "Pilih karakter default yang akan digunakan untuk celah antar lirik"
|
||||
},
|
||||
"line-effect": {
|
||||
"label": "Efek garis",
|
||||
"submenu": {
|
||||
"fancy": {
|
||||
"label": "Mewah",
|
||||
"tooltip": "Gunakan efek besar seperti aplikasi pada baris saat ini"
|
||||
},
|
||||
"focus": {
|
||||
"label": "Fokus",
|
||||
"tooltip": "Jadikan hanya baris saat ini berwarna putih"
|
||||
},
|
||||
"offset": {
|
||||
"label": "Offset",
|
||||
"tooltip": "Mengimbangi garis saat ini di sebelah kanan"
|
||||
},
|
||||
"scale": {
|
||||
"label": "Skala",
|
||||
"tooltip": "Skala garis saat ini"
|
||||
}
|
||||
},
|
||||
"tooltip": "Pilih efek yang akan diterapkan ke baris saat ini"
|
||||
},
|
||||
"precise-timing": {
|
||||
"label": "Buat liriknya tersinkronisasi dengan sempurna",
|
||||
"tooltip": "Hitung hingga milidetik tampilan baris berikutnya (dapat berdampak kecil pada kinerja)"
|
||||
},
|
||||
"show-lyrics-even-if-inexact": {
|
||||
"label": "Tampilkan lirik meskipun tidak tepat",
|
||||
"tooltip": "Jika lagu tidak ditemukan, plugin akan mencoba lagi dengan kueri pencarian yang berbeda.\nHasil dari percobaan kedua mungkin tidak tepat."
|
||||
},
|
||||
"show-time-codes": {
|
||||
"label": "Tampilkan kode waktu",
|
||||
"tooltip": "Tampilkan kode waktu di samping lirik"
|
||||
}
|
||||
},
|
||||
"name": "Lirik yang Disinkronkan",
|
||||
"refetch-btn": {
|
||||
"fetching": "Mengambil...",
|
||||
"normal": "Ambil ulang lirik"
|
||||
},
|
||||
"warnings": {
|
||||
"duration-mismatch": "⚠️ - Liriknya mungkin tidak sinkron karena ketidakcocokan durasi.",
|
||||
"inexact": "⚠️ - Lirik lagu ini mungkin tidak tepat",
|
||||
"instrumental": "⚠️ - Ini adalah lagu instrumental"
|
||||
}
|
||||
},
|
||||
"taskbar-mediacontrol": {
|
||||
"description": "Kendalikan pemutaran dari bilah alat Windows",
|
||||
"name": "Pengendali Media di Bilah Alat"
|
||||
|
||||
@ -158,6 +158,14 @@
|
||||
},
|
||||
"remove-upgrade-button": "Fjarlægja uppgræðartakkan",
|
||||
"theme": {
|
||||
"dialog": {
|
||||
"button": {
|
||||
"cancel": "Hætta við",
|
||||
"remove": "Fjarlægja"
|
||||
},
|
||||
"remove-theme": "Ertu viss um að þú viljir fjarlægja þetta sérsniðna þema?",
|
||||
"remove-theme-message": "Þetta mun fjarlægja sérsniðna þema"
|
||||
},
|
||||
"label": "Þema",
|
||||
"submenu": {
|
||||
"import-css-file": "Flytja inn sérsniðna CSS skrá",
|
||||
@ -199,6 +207,10 @@
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"ad-speedup": {
|
||||
"description": "Ef auglýsing spilar slökknar hún á hljóðinu og stillir spilunarhraðann á 16x",
|
||||
"name": "Auglýsingahraða"
|
||||
},
|
||||
"adblocker": {
|
||||
"description": "Lokaðu fyrir allar auglýsingar og rakningar úr kassanum",
|
||||
"menu": {
|
||||
@ -267,6 +279,49 @@
|
||||
},
|
||||
"name": "Umhverfishamur"
|
||||
},
|
||||
"api-server": {
|
||||
"description": "Bætir API netþjóni til að stjórna spilaranum",
|
||||
"dialog": {
|
||||
"request": {
|
||||
"buttons": {
|
||||
"allow": "Leyfa",
|
||||
"deny": "Óleyfa"
|
||||
},
|
||||
"message": "Leyfa {{ID}} ({{origin}}) að aðganga API-ið?",
|
||||
"title": "API heimildarbeiðni"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"auth-strategy": {
|
||||
"label": "Heimildarstefna",
|
||||
"submenu": {
|
||||
"auth-at-first": {
|
||||
"label": "Heimila á fyrst beiðni"
|
||||
},
|
||||
"none": {
|
||||
"label": "Nei heimild"
|
||||
}
|
||||
}
|
||||
},
|
||||
"hostname": {
|
||||
"label": "Hýsitölvunafn"
|
||||
},
|
||||
"port": {
|
||||
"label": "Tengi"
|
||||
}
|
||||
},
|
||||
"name": "API-Netþjónn [Beta]",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "Sláðu inn hýsitölvunafnið (eins og 0.0.0.0) fyrir API-netþjónninn:",
|
||||
"title": "Hýsitölvunafn"
|
||||
},
|
||||
"port": {
|
||||
"label": "Sláðu inn tengið fyrir API-netþjónninn:",
|
||||
"title": "Tengi"
|
||||
}
|
||||
}
|
||||
},
|
||||
"audio-compressor": {
|
||||
"description": "Notaðu þjöppun á hljóð (lækkar hljóðstyrk háværustu hluta merkis og hækkar hljóðstyrk í mýkstu hlutunum)",
|
||||
"name": "Hljóðþjöppu"
|
||||
@ -402,6 +457,21 @@
|
||||
"description": "Niðurhalar MP3 / upprunahljóði beint úr viðmótinu",
|
||||
"menu": {
|
||||
"choose-download-folder": "Veldu niðurhalsmöppu",
|
||||
"download-finish-settings": {
|
||||
"label": "Sækja þegar lokið",
|
||||
"prompt": {
|
||||
"last-percent": "Eftir x sekúndur",
|
||||
"last-seconds": "Síðustu x sekúndur",
|
||||
"title": "Stilla hvenær á að hlaða niður"
|
||||
},
|
||||
"submenu": {
|
||||
"advanced": "Ítarlegri",
|
||||
"enabled": "Virkt",
|
||||
"mode": "Tímastilling",
|
||||
"percent": "Hlutfall",
|
||||
"seconds": "Sekúndur"
|
||||
}
|
||||
},
|
||||
"download-playlist": "Sækja spilunarlista",
|
||||
"presets": "Forstillingar",
|
||||
"skip-existing": "Slepptu núverandi skrám"
|
||||
@ -641,6 +711,59 @@
|
||||
"description": "Sleppur sjálfkrafa hlutum sem ekki eru tónlist, eins og inngangur/lok eða hlutar af tónlistarmyndböndum þar sem lag er ekki að spila",
|
||||
"name": "Styrktarblokk"
|
||||
},
|
||||
"synced-lyrics": {
|
||||
"description": "Veitir samstillta texta við lög, með því að nota veitur eins og LRClib.",
|
||||
"errors": {
|
||||
"fetch": "⚠️ - Villa kom upp við að sækja textann. Vinsamlegast reyndu aftur síðar.",
|
||||
"not-found": "⚠️ - Enginn texti fannst við þetta lag."
|
||||
},
|
||||
"menu": {
|
||||
"default-text-string": {
|
||||
"label": "Sjálfgefið tákn á milli texta",
|
||||
"tooltip": "Veldu sjálfgefna tákn til að nota fyrir bilið á milli texta"
|
||||
},
|
||||
"line-effect": {
|
||||
"label": "Línuafleiðing",
|
||||
"submenu": {
|
||||
"focus": {
|
||||
"label": "Brennidepill",
|
||||
"tooltip": "Gerðu aðeins núverandi línu hvíta"
|
||||
},
|
||||
"offset": {
|
||||
"label": "Fararbyrjun",
|
||||
"tooltip": "Fararbyrjun á hægri af núverandi línan"
|
||||
},
|
||||
"scale": {
|
||||
"label": "Skali",
|
||||
"tooltip": "Skala núverandi línu"
|
||||
}
|
||||
},
|
||||
"tooltip": "Veldu áhrif til að nota á núverandi línu"
|
||||
},
|
||||
"precise-timing": {
|
||||
"label": "Gera textana fullkomlega samstillta",
|
||||
"tooltip": "Reikna upp á millisekúndu birtingu næstu línu (getur haft lítil áhrif á frammistöðu)"
|
||||
},
|
||||
"show-lyrics-even-if-inexact": {
|
||||
"label": "Sýna texta, jafnvel þótt hann sé ónákvæmur",
|
||||
"tooltip": "Ef lagið finnst ekki reynir tengiforritið aftur með annarri leitarfyrirspurn.\nNiðurstaðan úr annarri tilraun er kannski ekki nákvæm."
|
||||
},
|
||||
"show-time-codes": {
|
||||
"label": "Sýna tímikóðar",
|
||||
"tooltip": "Sýna tímakóðana við hliðina á textanum"
|
||||
}
|
||||
},
|
||||
"name": "Samstilltur texti",
|
||||
"refetch-btn": {
|
||||
"fetching": "Er að sækja",
|
||||
"normal": "Endursækja texta"
|
||||
},
|
||||
"warnings": {
|
||||
"duration-mismatch": "⚠️ - Textarnir gætu verið ekki samstilltir vegna tímalengdar.",
|
||||
"inexact": "⚠️ - Textinn við þetta lag er kannski ekki nákvæmur",
|
||||
"instrumental": "⚠️ - Þetta er hljóðfærilegt lag"
|
||||
}
|
||||
},
|
||||
"taskbar-mediacontrol": {
|
||||
"description": "Stjórnaðu spilun frá Windows verkefnastikunni þinni",
|
||||
"name": "Miðlunarstýringarverkefnastikunnar"
|
||||
|
||||
@ -207,6 +207,10 @@
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"ad-speedup": {
|
||||
"description": "Se viene riprodotto un annuncio, l'audio viene disattivato e viene impostata la velocità di riproduzione su 16x",
|
||||
"name": "Accelerazione ad"
|
||||
},
|
||||
"adblocker": {
|
||||
"description": "Blocca tutti gli annunci e i tracker",
|
||||
"menu": {
|
||||
@ -275,6 +279,56 @@
|
||||
},
|
||||
"name": "Modalità Ambiente"
|
||||
},
|
||||
"amuse": {
|
||||
"description": "Aggiunge il supporto a YouTube Music per il widget Amuse Now Playing di 6K Labs",
|
||||
"name": "Amuse",
|
||||
"response": {
|
||||
"query": "Il server API di Amuse è in funzione. GET /query per ottenere informazioni sui brani."
|
||||
}
|
||||
},
|
||||
"api-server": {
|
||||
"description": "Aggiunge un server API per controllare il player",
|
||||
"dialog": {
|
||||
"request": {
|
||||
"buttons": {
|
||||
"allow": "Permetti",
|
||||
"deny": "Nega"
|
||||
},
|
||||
"message": "Consentire a {{ID}} ({{origin}}) di accedere all'API?",
|
||||
"title": "Autorizzazione API richiesta"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"auth-strategy": {
|
||||
"label": "Metodo di autorizzazione",
|
||||
"submenu": {
|
||||
"auth-at-first": {
|
||||
"label": "Autorizza alla prima richiesta"
|
||||
},
|
||||
"none": {
|
||||
"label": "Nessuna autorizzazione"
|
||||
}
|
||||
}
|
||||
},
|
||||
"hostname": {
|
||||
"label": "Hostname"
|
||||
},
|
||||
"port": {
|
||||
"label": "Porta"
|
||||
}
|
||||
},
|
||||
"name": "API Server [Beta]",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "Inserisci il nome host (ad esempio 0.0.0.0) per il server API:",
|
||||
"title": "Hostname"
|
||||
},
|
||||
"port": {
|
||||
"label": "Inserisci la porta per il server API:",
|
||||
"title": "Porta"
|
||||
}
|
||||
}
|
||||
},
|
||||
"audio-compressor": {
|
||||
"description": "Attiva la compressione audio (abbassa il volume delle parti più alte e alza quello delle parti più basse del segnale)",
|
||||
"name": "Compressore audio"
|
||||
@ -410,6 +464,21 @@
|
||||
"description": "Download MP3 / sorgenti audio direttamente dall'interfaccia",
|
||||
"menu": {
|
||||
"choose-download-folder": "Scegli cartella download",
|
||||
"download-finish-settings": {
|
||||
"label": "Scarica al termine",
|
||||
"prompt": {
|
||||
"last-percent": "Dopo x percento",
|
||||
"last-seconds": "Ultimi x secondi",
|
||||
"title": "Configura quando scaricare"
|
||||
},
|
||||
"submenu": {
|
||||
"advanced": "Avanzato",
|
||||
"enabled": "Abilitato",
|
||||
"mode": "Modalità tempo",
|
||||
"percent": "Percentuale",
|
||||
"seconds": "Secondi"
|
||||
}
|
||||
},
|
||||
"download-playlist": "Scarica la playlist",
|
||||
"presets": "Preimpostazioni",
|
||||
"skip-existing": "Salta i file esistenti"
|
||||
@ -422,6 +491,18 @@
|
||||
"button": "Scarica"
|
||||
}
|
||||
},
|
||||
"equalizer": {
|
||||
"description": "Aggiunge un equalizzatore al player",
|
||||
"menu": {
|
||||
"presets": {
|
||||
"label": "Presets",
|
||||
"list": {
|
||||
"bass-booster": "Booster dei bassi"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Equalizzatore"
|
||||
},
|
||||
"exponential-volume": {
|
||||
"description": "Rende esponenziale il cursore del volume, in modo da facilitare la selezione di volumi più bassi.",
|
||||
"name": "Volume esponenziale"
|
||||
@ -649,6 +730,59 @@
|
||||
"description": "Salta automaticamente le parti non musicali, come l'intro/outro delle canzoni o le parti dei video musicali in cui non viene riprodotto il brano",
|
||||
"name": "Blocco sponsor"
|
||||
},
|
||||
"synced-lyrics": {
|
||||
"description": "Fornisce testi sincronizzati alle canzoni, utilizzando provider come LRClib.",
|
||||
"errors": {
|
||||
"fetch": "⚠️ - Si è verificato un errore nel recuperare il testo. Per favore riprova più tardi.",
|
||||
"not-found": "⚠️ - Nessun testo trovato per questa canzone."
|
||||
},
|
||||
"menu": {
|
||||
"default-text-string": {
|
||||
"label": "Carattere predefinito tra i testi",
|
||||
"tooltip": "Scegliere il carattere predefinito da utilizzare per l'intervallo tra i testi"
|
||||
},
|
||||
"line-effect": {
|
||||
"label": "Effetto linea",
|
||||
"submenu": {
|
||||
"focus": {
|
||||
"label": "Focus",
|
||||
"tooltip": "Rendi bianca solo la riga corrente"
|
||||
},
|
||||
"offset": {
|
||||
"label": "Offset",
|
||||
"tooltip": "Offset a destra della riga corrente"
|
||||
},
|
||||
"scale": {
|
||||
"label": "Ingrandimento",
|
||||
"tooltip": "Ingrandisci la linea corrente"
|
||||
}
|
||||
},
|
||||
"tooltip": "Scegli l'effetto da applicare alla linea corrente"
|
||||
},
|
||||
"precise-timing": {
|
||||
"label": "Rendi i testi perfettamente sincronizzati",
|
||||
"tooltip": "Calcola al millisecondo la visualizzazione della riga successiva (può avere un piccolo impatto sulle prestazioni)"
|
||||
},
|
||||
"show-lyrics-even-if-inexact": {
|
||||
"label": "Mostra le lyric anche se incorrette",
|
||||
"tooltip": "Se il brano non viene trovato, il plugin riprova con un'altra query di ricerca.\nIl risultato del secondo tentativo potrebbe non essere esatto."
|
||||
},
|
||||
"show-time-codes": {
|
||||
"label": "Mostra time code",
|
||||
"tooltip": "Mostra i codici temporali accanto ai testi"
|
||||
}
|
||||
},
|
||||
"name": "Testi sincronizzati",
|
||||
"refetch-btn": {
|
||||
"fetching": "Sto recuperando...",
|
||||
"normal": "Recupera i testi"
|
||||
},
|
||||
"warnings": {
|
||||
"duration-mismatch": "⚠️ - I testi potrebbero non essere sincronizzati a causa di una mancata corrispondenza della durata.",
|
||||
"inexact": "⚠️ - Il testo di questa canzone potrebbe essere inesatto",
|
||||
"instrumental": "⚠️ - Questo è un brano strumentale"
|
||||
}
|
||||
},
|
||||
"taskbar-mediacontrol": {
|
||||
"description": "Controlla riproduzione dalla taskbar di Windows",
|
||||
"name": "Controlli multimediali sulla taskbar"
|
||||
|
||||
@ -65,7 +65,7 @@
|
||||
},
|
||||
"detail": "ご不便をおかけして申し訳ございません! 何をするか選んでください:",
|
||||
"message": "アプリケーションは応答していません",
|
||||
"title": "ウィンドウが応答しません"
|
||||
"title": "ウィンドウが応答していません"
|
||||
},
|
||||
"update-available": {
|
||||
"buttons": {
|
||||
@ -207,6 +207,10 @@
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"ad-speedup": {
|
||||
"description": "広告が再生されると、自動的にミュートされ、再生速度が16倍に設定されます",
|
||||
"name": "広告のスピードを上げる"
|
||||
},
|
||||
"adblocker": {
|
||||
"description": "すべての広告とトラッカーをブロックj",
|
||||
"menu": {
|
||||
@ -275,6 +279,49 @@
|
||||
},
|
||||
"name": "アンビエント モード"
|
||||
},
|
||||
"api-server": {
|
||||
"description": "プレイヤーを制御するAPIサーバーを追加",
|
||||
"dialog": {
|
||||
"request": {
|
||||
"buttons": {
|
||||
"allow": "許可",
|
||||
"deny": "拒否"
|
||||
},
|
||||
"message": "{{ID}}が{{origin}}にアクセスすることを許可しますか?",
|
||||
"title": "API承認リクエスト"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"auth-strategy": {
|
||||
"label": "許可方法",
|
||||
"submenu": {
|
||||
"auth-at-first": {
|
||||
"label": "初回リクエスト時に承認"
|
||||
},
|
||||
"none": {
|
||||
"label": "不許可"
|
||||
}
|
||||
}
|
||||
},
|
||||
"hostname": {
|
||||
"label": "ホスト名"
|
||||
},
|
||||
"port": {
|
||||
"label": "ポート"
|
||||
}
|
||||
},
|
||||
"name": "APIサーバー(Beta)",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "APIサーバーのポート名(0.0.0.0など)を入力:",
|
||||
"title": "ホスト名"
|
||||
},
|
||||
"port": {
|
||||
"label": "APIサーバーのポートを入力:",
|
||||
"title": "ポート"
|
||||
}
|
||||
}
|
||||
},
|
||||
"audio-compressor": {
|
||||
"description": "オーディオにコンプレッサーを適用します(信号での一番大きい部分の音量を下げ、小さい部分の音量を上げる)",
|
||||
"name": "オーディオコンプレッサー"
|
||||
@ -410,6 +457,21 @@
|
||||
"description": "UIから直に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": "存在するファイルをスキップ"
|
||||
@ -422,6 +484,18 @@
|
||||
"button": "ダウンロード"
|
||||
}
|
||||
},
|
||||
"equalizer": {
|
||||
"description": "プレイヤーにイコライザーを追加",
|
||||
"menu": {
|
||||
"presets": {
|
||||
"label": "プリセット",
|
||||
"list": {
|
||||
"bass-booster": "ベースブースター"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "イコライザー"
|
||||
},
|
||||
"exponential-volume": {
|
||||
"description": "音量スライダを指数関数的にさせ、低い音量に設定しやすくなります。",
|
||||
"name": "指数音量"
|
||||
@ -649,6 +723,59 @@
|
||||
"description": "イントロ/アウトロなどの音楽以外の部分や、曲が再生されていないミュージック ビデオの部分を自動的にスキップします",
|
||||
"name": "SponsorBlock"
|
||||
},
|
||||
"synced-lyrics": {
|
||||
"description": "LRClibのようなプロバイダを使って、楽曲に同期した歌詞を使用する。",
|
||||
"errors": {
|
||||
"fetch": "⚠️ - 歌詞の取得中にエラーが発生しました。 後でもう一度お試しください。",
|
||||
"not-found": "⚠️ - この曲の歌詞は見つかりませんでした。"
|
||||
},
|
||||
"menu": {
|
||||
"default-text-string": {
|
||||
"label": "デフォルトの歌詞間の文字",
|
||||
"tooltip": "歌詞と歌詞の間に使用するデフォルトの文字を選択してください"
|
||||
},
|
||||
"line-effect": {
|
||||
"label": "歌詞表示のエフェクト",
|
||||
"submenu": {
|
||||
"focus": {
|
||||
"label": "フォーカス",
|
||||
"tooltip": "現在の行だけを白くする"
|
||||
},
|
||||
"offset": {
|
||||
"label": "オフセット",
|
||||
"tooltip": "オフセットを現在の行の右側にする"
|
||||
},
|
||||
"scale": {
|
||||
"label": "サイズ",
|
||||
"tooltip": "現在の行のサイズ変更をする"
|
||||
}
|
||||
},
|
||||
"tooltip": "現在の行に適用するエフェクトを選択"
|
||||
},
|
||||
"precise-timing": {
|
||||
"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": "Windowsタスクバーから再生をコントロール",
|
||||
"name": "タスクバーメディアコントロール"
|
||||
|
||||
274
src/i18n/resources/ka.json
Normal file
@ -0,0 +1,274 @@
|
||||
{
|
||||
"language": {
|
||||
"code": "ka",
|
||||
"local-name": "ქართული",
|
||||
"name": "Georgian"
|
||||
},
|
||||
"main": {
|
||||
"dialog": {
|
||||
"need-to-restart": {
|
||||
"buttons": {
|
||||
"later": "მოგვიანებით"
|
||||
}
|
||||
},
|
||||
"unresponsive": {
|
||||
"buttons": {
|
||||
"quit": "გასვლა",
|
||||
"relaunch": "თავიდან გაშვება",
|
||||
"wait": "მოცდა"
|
||||
}
|
||||
},
|
||||
"update-available": {
|
||||
"buttons": {
|
||||
"download": "გადმოწერა",
|
||||
"ok": "დიახ"
|
||||
}
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"about": "შესახებ",
|
||||
"navigation": {
|
||||
"label": "ნავიგაცია",
|
||||
"submenu": {
|
||||
"quit": "გასვლა"
|
||||
}
|
||||
},
|
||||
"options": {
|
||||
"label": "მორგება",
|
||||
"submenu": {
|
||||
"language": {
|
||||
"label": "ენა"
|
||||
},
|
||||
"starting-page": {
|
||||
"unset": "მოხსნა"
|
||||
},
|
||||
"tray": {
|
||||
"submenu": {
|
||||
"disabled": "გამორთულია"
|
||||
}
|
||||
},
|
||||
"visual-tweaks": {
|
||||
"submenu": {
|
||||
"like-buttons": {
|
||||
"default": "ნაგულისხმევი",
|
||||
"hide": "დამალვა"
|
||||
},
|
||||
"theme": {
|
||||
"dialog": {
|
||||
"button": {
|
||||
"cancel": "გაუქმება",
|
||||
"remove": "წაშლა"
|
||||
}
|
||||
},
|
||||
"label": "თემა"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"enabled": "ჩართულია",
|
||||
"label": "დამატებები",
|
||||
"new": "ახალი"
|
||||
},
|
||||
"view": {
|
||||
"label": "ხედი",
|
||||
"submenu": {
|
||||
"reload": "თავიდან ჩატვირთვა"
|
||||
}
|
||||
}
|
||||
},
|
||||
"tray": {
|
||||
"next": "შემდეგი",
|
||||
"play-pause": "დაკვრა/შეჩერება",
|
||||
"previous": "წინა",
|
||||
"quit": "გასვლა"
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"adblocker": {
|
||||
"menu": {
|
||||
"blocker": "დამბლოკავი"
|
||||
}
|
||||
},
|
||||
"album-color-theme": {
|
||||
"menu": {
|
||||
"color-mix-ratio": {
|
||||
"submenu": {
|
||||
"percent": "{{ratio}}%"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"ambient-mode": {
|
||||
"menu": {
|
||||
"buffer": {
|
||||
"label": "ბუფერი",
|
||||
"submenu": {
|
||||
"buffer": "{{buffer}}"
|
||||
}
|
||||
},
|
||||
"opacity": {
|
||||
"label": "გაუმჭვირვალობა",
|
||||
"submenu": {
|
||||
"percent": "{{opacity}}%"
|
||||
}
|
||||
},
|
||||
"quality": {
|
||||
"label": "ხარისხი"
|
||||
},
|
||||
"size": {
|
||||
"label": "ზომა",
|
||||
"submenu": {
|
||||
"percent": "{{size}}%"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"amuse": {
|
||||
"name": "Amuse"
|
||||
},
|
||||
"api-server": {
|
||||
"dialog": {
|
||||
"request": {
|
||||
"buttons": {
|
||||
"allow": "დაშვება",
|
||||
"deny": "აკრძალვა"
|
||||
}
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"hostname": {
|
||||
"label": "ჰოსტის სახელი"
|
||||
},
|
||||
"port": {
|
||||
"label": "პორტი"
|
||||
}
|
||||
},
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"title": "ჰოსტის სახელი"
|
||||
},
|
||||
"port": {
|
||||
"title": "პორტი"
|
||||
}
|
||||
}
|
||||
},
|
||||
"captions-selector": {
|
||||
"prompt": {
|
||||
"selector": {
|
||||
"none": "არცერთი"
|
||||
}
|
||||
}
|
||||
},
|
||||
"crossfade": {
|
||||
"menu": {
|
||||
"advanced": "დამატებით"
|
||||
},
|
||||
"prompt": {
|
||||
"options": {
|
||||
"multi-input": {
|
||||
"fade-scaling": {
|
||||
"linear": "წრფივი",
|
||||
"logarithmic": "ლოგარითმული"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"discord": {
|
||||
"menu": {
|
||||
"connected": "დაკავშირებული",
|
||||
"disconnected": "გათიშული"
|
||||
}
|
||||
},
|
||||
"downloader": {
|
||||
"backend": {
|
||||
"dialog": {
|
||||
"error": {
|
||||
"buttons": {
|
||||
"ok": "დიახ"
|
||||
}
|
||||
},
|
||||
"start-download-playlist": {
|
||||
"buttons": {
|
||||
"ok": "დიახ"
|
||||
}
|
||||
}
|
||||
},
|
||||
"feedback": {
|
||||
"converting": "გადაყვანა…",
|
||||
"downloading": "გადმოწერა…",
|
||||
"loading": "ჩატვირთვა…",
|
||||
"saving": "შენახვა…"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"download-finish-settings": {
|
||||
"submenu": {
|
||||
"advanced": "დამატებით",
|
||||
"enabled": "ჩართულია",
|
||||
"percent": "პროცენტი",
|
||||
"seconds": "წამი"
|
||||
}
|
||||
},
|
||||
"presets": "პრესეტი"
|
||||
},
|
||||
"name": "გადმომწერი",
|
||||
"templates": {
|
||||
"button": "გადმოწერა"
|
||||
}
|
||||
},
|
||||
"music-together": {
|
||||
"internal": {
|
||||
"save": "შენახვა"
|
||||
},
|
||||
"menu": {
|
||||
"status": {
|
||||
"disconnected": "გათიშული"
|
||||
}
|
||||
}
|
||||
},
|
||||
"navigation": {
|
||||
"name": "ნავიგაცია"
|
||||
},
|
||||
"notifications": {
|
||||
"name": "გაფრთხილებები"
|
||||
},
|
||||
"picture-in-picture": {
|
||||
"name": "სურათი სურათში",
|
||||
"templates": {
|
||||
"button": "სურათი სურათში"
|
||||
}
|
||||
},
|
||||
"playback-speed": {
|
||||
"templates": {
|
||||
"button": "სიჩქარე"
|
||||
}
|
||||
},
|
||||
"shortcuts": {
|
||||
"prompt": {
|
||||
"keybind": {
|
||||
"keybind-options": {
|
||||
"next": "შემდეგი",
|
||||
"previous": "წინა"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"sponsorblock": {
|
||||
"name": "სარეკლამო ბლოკი"
|
||||
},
|
||||
"synced-lyrics": {
|
||||
"menu": {
|
||||
"line-effect": {
|
||||
"submenu": {
|
||||
"focus": {
|
||||
"label": "ფოკუსი"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -207,6 +207,10 @@
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"ad-speedup": {
|
||||
"description": "광고가 재생될 때, 오디오가 음소거되고 재생 속도가 16배로 설정됩니다",
|
||||
"name": "광고 배속"
|
||||
},
|
||||
"adblocker": {
|
||||
"description": "모든 광고와 트래커를 즉시 차단합니다",
|
||||
"menu": {
|
||||
@ -275,6 +279,56 @@
|
||||
},
|
||||
"name": "앰비언트 모드"
|
||||
},
|
||||
"amuse": {
|
||||
"description": "6K Labs Amuse의 'now playing' 위젯에 YouTube Music 지원 추가",
|
||||
"name": "Amuse",
|
||||
"response": {
|
||||
"query": "Amuse API 서버가 실행 중입니다. GET /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": "오디오 컴프레서"
|
||||
@ -437,6 +491,18 @@
|
||||
"button": "다운로드"
|
||||
}
|
||||
},
|
||||
"equalizer": {
|
||||
"description": "플레이어에 이퀄라이저를 추가합니다",
|
||||
"menu": {
|
||||
"presets": {
|
||||
"label": "프리셋",
|
||||
"list": {
|
||||
"bass-booster": "베이스 부스터"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "이퀄라이저"
|
||||
},
|
||||
"exponential-volume": {
|
||||
"description": "음량 슬라이더를 지수적으로 만들어 더 낮은 음량을 쉽게 선택할 수 있도록 합니다.",
|
||||
"name": "지수 음량"
|
||||
@ -475,7 +541,7 @@
|
||||
"menu": {
|
||||
"click-to-copy-id": "호스트 아이디 복사",
|
||||
"close": "Music Together 닫기",
|
||||
"connected-users": "연결된 사용자",
|
||||
"connected-users": "연결된 사용자: {{count}}명",
|
||||
"disconnect": "Music Together 연결 끊기",
|
||||
"empty-user": "연결된 사용자 없음",
|
||||
"host": "Music Together 호스트",
|
||||
@ -664,6 +730,63 @@
|
||||
"description": "인트로/아웃트로와 같은 음악이 아닌 부분이나, 노래가 재생되지 않는 뮤직 비디오의 일부를 자동으로 건너뜁니다",
|
||||
"name": "SponsorBlock"
|
||||
},
|
||||
"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": "다음 줄의 표시를 밀리초 단위로 계산합니다 (성능에 약간의 영향을 미칠 수 있음)"
|
||||
},
|
||||
"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": "Windows 작업 표시줄에서 재생을 제어하세요",
|
||||
"name": "작업표시줄 미디어 컨트롤"
|
||||
|
||||
@ -5,6 +5,7 @@
|
||||
"execute-failed": "Pelaksaan plugin gagal {{pluginName}}::{{contextName}}",
|
||||
"executed-at-ms": "Plugin {{pluginName}}::{{contextName}} dilaksanakan pada {{ms}}ms",
|
||||
"initialize-failed": "Gagal untuk memulakan plugin \"{{pluginName}}\"",
|
||||
"load-all": "Memuatkan semua plugin",
|
||||
"loaded": "Plugin \"{{pluginName}}\" dimuatkan",
|
||||
"unload-failed": "Gagal untuk memunggah plugin \"{{pluginName}}\"",
|
||||
"unloaded": "Plugin \"{{pluginName}}\" dipunggahkan"
|
||||
@ -39,15 +40,22 @@
|
||||
"detail": "Menu telah disembunyikan, guna 'Alt' untuk menunjukkannya (atau 'Escape' jika menggunakan In-App Menu)"
|
||||
},
|
||||
"need-to-restart": {
|
||||
"buttons": {
|
||||
"later": "Nanti",
|
||||
"restart-now": "Restart Sekarang"
|
||||
},
|
||||
"message": "\"{{pluginName}}\" perlu dimulakan semula",
|
||||
"title": "Mulakan Semula Diperlukan"
|
||||
},
|
||||
"unresponsive": {
|
||||
"buttons": {
|
||||
"quit": "Berhenti",
|
||||
"relaunch": "Lancar Semula",
|
||||
"wait": "Tunggu"
|
||||
},
|
||||
"detail": "Kami memohon maaf atas kesulitan! sila pilih apa yang perlu dilakukan:"
|
||||
"detail": "Kami memohon maaf atas kesulitan! sila pilih apa yang perlu dilakukan:",
|
||||
"message": "Aplikasi Tidak Responsif",
|
||||
"title": "Window Tidak Responsif"
|
||||
},
|
||||
"update-available": {
|
||||
"buttons": {
|
||||
@ -58,16 +66,137 @@
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"about": "Mengenai",
|
||||
"navigation": {
|
||||
"label": "Navigasi",
|
||||
"submenu": {
|
||||
"copy-current-url": "Salin URL semasa",
|
||||
"go-back": "Pulang",
|
||||
"go-back": "Belakang",
|
||||
"go-forward": "Depan",
|
||||
"quit": "Keluar"
|
||||
}
|
||||
},
|
||||
"options": {
|
||||
"label": "Pilihan"
|
||||
"label": "Tetapan",
|
||||
"submenu": {
|
||||
"advanced-options": {
|
||||
"label": "Tetapan Lanjutan",
|
||||
"submenu": {
|
||||
"set-proxy": {
|
||||
"prompt": {
|
||||
"placeholder": "Contoh: SOCKS5://127.0.0.1:9999",
|
||||
"title": "Set proksi"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"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)"
|
||||
}
|
||||
},
|
||||
"language": {
|
||||
"dialog": {
|
||||
"message": "Bahasa akan ditukar selepas dimulakan semula",
|
||||
"title": "Bahasa Berubah"
|
||||
},
|
||||
"label": "Bahasa",
|
||||
"submenu": {
|
||||
"to-help-translate": "Ingin membantu menterjemah? Klik di sini"
|
||||
}
|
||||
},
|
||||
"resume-on-start": "Mulakan semula lagu terakhir apabila aplikasi dimulakan",
|
||||
"start-at-login": "Mulakan semasa log masuk",
|
||||
"starting-page": {
|
||||
"label": "Halaman Permulaan"
|
||||
},
|
||||
"tray": {
|
||||
"submenu": {
|
||||
"play-pause-on-click": "Main / Hentikan pada klik"
|
||||
}
|
||||
},
|
||||
"visual-tweaks": {
|
||||
"label": "Pembaikan Visual",
|
||||
"submenu": {
|
||||
"like-buttons": {
|
||||
"default": "Lalai",
|
||||
"hide": "Sembunyi"
|
||||
},
|
||||
"theme": {
|
||||
"dialog": {
|
||||
"button": {
|
||||
"cancel": "Batalkan",
|
||||
"remove": "Padam"
|
||||
}
|
||||
},
|
||||
"label": "Tema"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"tray": {
|
||||
"next": "Seterusnya",
|
||||
"play-pause": "Main / Jeda",
|
||||
"previous": "Sebelumnya",
|
||||
"quit": "Keluar",
|
||||
"restart": "Mulakan Semula Aplikasi"
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"ambient-mode": {
|
||||
"menu": {
|
||||
"quality": {
|
||||
"label": "Kualiti"
|
||||
},
|
||||
"size": {
|
||||
"label": "Saiz"
|
||||
}
|
||||
}
|
||||
},
|
||||
"captions-selector": {
|
||||
"prompt": {
|
||||
"selector": {
|
||||
"title": "Pilih bahasa kapsyen"
|
||||
}
|
||||
}
|
||||
},
|
||||
"synced-lyrics": {
|
||||
"menu": {
|
||||
"show-lyrics-even-if-inexact": {
|
||||
"label": "Tunjukkan lirik walaupun tidak tepat",
|
||||
"tooltip": "Jika lagu tidak ditemui, plugin cuba lagi dengan pertanyaan carian yang berbeza. \nHasil dari percubaan kedua mungkin tidak tepat."
|
||||
},
|
||||
"show-time-codes": {
|
||||
"tooltip": "Tunjukkan kod masa di sebelah lirik"
|
||||
}
|
||||
}
|
||||
},
|
||||
"taskbar-mediacontrol": {
|
||||
"description": "Kawalan main balik dari bar tugas Windows anda",
|
||||
"name": "Kawalan Media Bar Tugas"
|
||||
},
|
||||
"video-toggle": {
|
||||
"menu": {
|
||||
"align": {
|
||||
"submenu": {
|
||||
"left": "Kiri",
|
||||
"middle": "Tengah",
|
||||
"right": "Kanan"
|
||||
}
|
||||
},
|
||||
"force-hide": "Alih Keluar Tab Video",
|
||||
"mode": {
|
||||
"submenu": {
|
||||
"disabled": "Tidak Aktif"
|
||||
}
|
||||
}
|
||||
},
|
||||
"templates": {
|
||||
"button": "Lagu"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -33,7 +33,7 @@
|
||||
"css-file-not-found": "CSS-bestand \"{{cssFile}}\" bestaat niet, wordt genegeerd"
|
||||
},
|
||||
"unresponsive": {
|
||||
"details": "Onverantwoordelijkheidsfout!\n{{error}}"
|
||||
"details": "Niet-reagerende fout!\n{{error}}"
|
||||
},
|
||||
"when-ready": {
|
||||
"clearing-cache-after-20s": "App-cache wissen"
|
||||
@ -46,7 +46,7 @@
|
||||
"hide-menu-enabled": {
|
||||
"detail": "Menu is verborgen, gebruik 'Alt' om het weer te geven (of 'Escape' als u de In-App Menu gebruikt)",
|
||||
"message": "Menu verbergen is ingeschakeld",
|
||||
"title": "Menu Verbergen Ingeschakeld"
|
||||
"title": "Menu verbergen ingeschakeld"
|
||||
},
|
||||
"need-to-restart": {
|
||||
"buttons": {
|
||||
@ -65,7 +65,7 @@
|
||||
},
|
||||
"detail": "Het programma reageert niet! Kies wat u wilt doen:",
|
||||
"message": "De applicatie reageert niet",
|
||||
"title": "Venster Niet Reagerend"
|
||||
"title": "Venster reageert niet"
|
||||
},
|
||||
"update-available": {
|
||||
"buttons": {
|
||||
@ -158,6 +158,14 @@
|
||||
},
|
||||
"remove-upgrade-button": "Upgrade-knop verwijderen",
|
||||
"theme": {
|
||||
"dialog": {
|
||||
"button": {
|
||||
"cancel": "Annuleren",
|
||||
"remove": "Verwijderen"
|
||||
},
|
||||
"remove-theme": "Weet je zeker dat je het aangepaste thema wilt verwijderen?",
|
||||
"remove-theme-message": "Dit verwijderd het aangepaste thema"
|
||||
},
|
||||
"label": "Thema",
|
||||
"submenu": {
|
||||
"import-css-file": "Aangepast CSS-bestand importeren",
|
||||
@ -199,6 +207,10 @@
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"ad-speedup": {
|
||||
"description": "Wanneer een advertentie afspeelt, dempt het geluid en versnelt de playback naar 16x",
|
||||
"name": "Snellere advertenties"
|
||||
},
|
||||
"adblocker": {
|
||||
"description": "Blokkeer alle advertenties en tracking vanuit de doos",
|
||||
"menu": {
|
||||
@ -238,7 +250,7 @@
|
||||
}
|
||||
},
|
||||
"opacity": {
|
||||
"label": "Dekking",
|
||||
"label": "Transparantie",
|
||||
"submenu": {
|
||||
"percent": "{{opacity}}%"
|
||||
}
|
||||
@ -256,7 +268,7 @@
|
||||
}
|
||||
},
|
||||
"smoothness-transition": {
|
||||
"label": "Soepelheid overgang",
|
||||
"label": "Vloeiende overgang",
|
||||
"submenu": {
|
||||
"during": "Tijdens {{interpolationTime}} s"
|
||||
}
|
||||
@ -267,6 +279,56 @@
|
||||
},
|
||||
"name": "Omgevingsmodus"
|
||||
},
|
||||
"amuse": {
|
||||
"description": "Voegt YouTube Music ondersteuning toe voor de Amuse now playing widget van 6K Labs",
|
||||
"name": "Amuse",
|
||||
"response": {
|
||||
"query": "Amuse API server loopt. Gebruik /query voor nummer informatie."
|
||||
}
|
||||
},
|
||||
"api-server": {
|
||||
"description": "Voegt een API server toe om de speler te besturen",
|
||||
"dialog": {
|
||||
"request": {
|
||||
"buttons": {
|
||||
"allow": "Toestaan",
|
||||
"deny": "Weigeren"
|
||||
},
|
||||
"message": "Sta {{ID}} {{origin}} toegang toe tot de API?",
|
||||
"title": "API autorisatieverzoek"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"auth-strategy": {
|
||||
"label": "Autorisatie strategie",
|
||||
"submenu": {
|
||||
"auth-at-first": {
|
||||
"label": "Autoriseer bij eerste verzoek"
|
||||
},
|
||||
"none": {
|
||||
"label": "geen autorisatie"
|
||||
}
|
||||
}
|
||||
},
|
||||
"hostname": {
|
||||
"label": "Hostnaam"
|
||||
},
|
||||
"port": {
|
||||
"label": "Poort"
|
||||
}
|
||||
},
|
||||
"name": "API Server [Beta]",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "Voeg de hostnaam (bv. 0.0.0.0) voor de API server in:",
|
||||
"title": "Hostnaam"
|
||||
},
|
||||
"port": {
|
||||
"label": "Voeg de poort voor de API server in:",
|
||||
"title": "Poort"
|
||||
}
|
||||
}
|
||||
},
|
||||
"audio-compressor": {
|
||||
"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"
|
||||
@ -383,7 +445,7 @@
|
||||
"download-progress": "Downloaden: {{percent}}%",
|
||||
"downloading": "Aan het downloaden…",
|
||||
"downloading-counter": "{{current}}/{{total}} aan het downloaden…",
|
||||
"downloading-playlist": "Afspeellijst \"{{playlistTitle}}\" {{playlistId}} aan het downloaden ({{playlistSize}} liederen)",
|
||||
"downloading-playlist": "Afspeellijst \"{{playlistTitle}}\" {{playlistId}} aan het downloaden ({{playlistSize}} nummers)",
|
||||
"error-while-downloading": "Er is een fout opgetreden tijdens het downloaden van \"{{author}} - {{title}}\": {{error}}",
|
||||
"folder-already-exists": "De map \"{{playlistFolder}}\" bestaat al",
|
||||
"getting-playlist-info": "Afspeellijst informatie ophalen…",
|
||||
@ -402,6 +464,21 @@
|
||||
"description": "Download MP3 / bron-audio rechtstreeks vanuit de interface",
|
||||
"menu": {
|
||||
"choose-download-folder": "Kies de downloadmap",
|
||||
"download-finish-settings": {
|
||||
"label": "Downloaden bij voltooiing",
|
||||
"prompt": {
|
||||
"last-percent": "Na x procent",
|
||||
"last-seconds": "Laatste x seconden",
|
||||
"title": "Configureren wanneer te downloaden"
|
||||
},
|
||||
"submenu": {
|
||||
"advanced": "Geavanceerd",
|
||||
"enabled": "Ingeschakeld",
|
||||
"mode": "Tijd-modus",
|
||||
"percent": "Procent",
|
||||
"seconds": "Seconden"
|
||||
}
|
||||
},
|
||||
"download-playlist": "Afspeellijst downloaden",
|
||||
"presets": "Voorinstellingen",
|
||||
"skip-existing": "Bestaande bestanden overslaan"
|
||||
@ -414,6 +491,18 @@
|
||||
"button": "Download"
|
||||
}
|
||||
},
|
||||
"equalizer": {
|
||||
"description": "Voegt een equalizer toe aan de speler",
|
||||
"menu": {
|
||||
"presets": {
|
||||
"label": "Voorinstellingen",
|
||||
"list": {
|
||||
"bass-booster": "Basversterker"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Equalizer"
|
||||
},
|
||||
"exponential-volume": {
|
||||
"description": "Maakt de volumeschuif exponentieel zodat het gemakkelijker is om lagere volumes te selecteren.",
|
||||
"name": "Exponentieel Volume"
|
||||
@ -423,14 +512,14 @@
|
||||
"menu": {
|
||||
"hide-dom-window-controls": "Verberg DOM-vensterbedieningselementen"
|
||||
},
|
||||
"name": "In-App menu"
|
||||
"name": "In-App Menu"
|
||||
},
|
||||
"lumiastream": {
|
||||
"description": "Voegt ondersteuning voor Lumia Stream toe",
|
||||
"name": "Lumia Stream [Beta]"
|
||||
},
|
||||
"lyrics-genius": {
|
||||
"description": "Voegt tekstondersteuning toe voor de meeste nummers",
|
||||
"description": "Voegt songtekstondersteuning toe voor de meeste nummers",
|
||||
"menu": {
|
||||
"romanized-lyrics": "Geromaniseerde Teksten"
|
||||
},
|
||||
@ -500,15 +589,19 @@
|
||||
"interactive-settings": {
|
||||
"label": "Interactieve instellingen",
|
||||
"submenu": {
|
||||
"hide-button-text": "Verberg tekst op de knop",
|
||||
"refresh-on-play-pause": "Herlaad bij het afspelen/pauzeren"
|
||||
"hide-button-text": "Knoptekst verbergen",
|
||||
"refresh-on-play-pause": "Herlaad bij het afspelen/pauzeren",
|
||||
"tray-controls": "Open/Sluit op tray klik"
|
||||
}
|
||||
},
|
||||
"priority": "Meldingprioriteit",
|
||||
"toast-style": "Toast stijl",
|
||||
"unpause-notification": "Laat een notificatie zijn bij het depauzeren"
|
||||
},
|
||||
"name": "Meldingen"
|
||||
},
|
||||
"picture-in-picture": {
|
||||
"description": "Laat de app toe om naar picture-in-picture modus om te schakelen",
|
||||
"menu": {
|
||||
"always-on-top": "Altijd bovenaan",
|
||||
"hotkey": {
|
||||
@ -516,15 +609,227 @@
|
||||
"prompt": {
|
||||
"keybind-options": {
|
||||
"hotkey": "Sneltoets"
|
||||
}
|
||||
},
|
||||
"label": "Kies een sneltoets om tussen picture-in-picture te schakelen",
|
||||
"title": "Picture-in-picture sneltoets"
|
||||
}
|
||||
},
|
||||
"save-window-position": "Sla schermpositie op",
|
||||
"save-window-size": "Sla schermgrootte op"
|
||||
"save-window-size": "Sla schermgrootte op",
|
||||
"use-native-pip": "Gebruik browser ingebouwde PiP"
|
||||
},
|
||||
"name": "Picture-in-picture",
|
||||
"templates": {
|
||||
"button": "Picture-in-picture"
|
||||
}
|
||||
},
|
||||
"playback-speed": {
|
||||
"description": "Luister snel, luister langzaam! Voegt een schuifregelaar toe die de muzieksnelheid regelt",
|
||||
"name": "Afspeelsnelheid",
|
||||
"templates": {
|
||||
"button": "Snelheid"
|
||||
}
|
||||
},
|
||||
"precise-volume": {
|
||||
"description": "Regel het volume nauwkeurig met behulp van het muiswiel/sneltoetsen, met een aangepaste HUD en aanpasbare volumestappen",
|
||||
"menu": {
|
||||
"arrows-shortcuts": "Lokale Pijltjestoetsen bediening",
|
||||
"custom-volume-steps": "Stel aangepaste volumestappen in",
|
||||
"global-shortcuts": "Globale sneltoetsen"
|
||||
},
|
||||
"name": "Nauwkeurig volume",
|
||||
"prompt": {
|
||||
"global-shortcuts": {
|
||||
"keybind-options": {
|
||||
"decrease": "Volume verlagen",
|
||||
"increase": "Volume verhogen"
|
||||
},
|
||||
"label": "Kies Globale Volume toetsen:",
|
||||
"title": "Globale Volume toetsen"
|
||||
},
|
||||
"volume-steps": {
|
||||
"label": "Kies Stappen voor volumeverhoging/-verlaging",
|
||||
"title": "Volume Stappen"
|
||||
}
|
||||
}
|
||||
},
|
||||
"quality-changer": {
|
||||
"backend": {
|
||||
"dialog": {
|
||||
"quality-changer": {
|
||||
"detail": "Huidige kwaliteit: {{quality}}",
|
||||
"message": "Kies videokwaliteit:",
|
||||
"title": "Kies Videokwaliteit"
|
||||
}
|
||||
}
|
||||
},
|
||||
"description": "Maakt het mogelijk de videokwaliteit te wijzigen met een knop op de video-overlay",
|
||||
"name": "Videokwaliteitwisselaar"
|
||||
},
|
||||
"scrobbler": {
|
||||
"description": "Ondersteuning voor scrobbling toevoegen (etc. last.fm, Listenbrainz)",
|
||||
"dialog": {
|
||||
"lastfm": {
|
||||
"auth-failed": {
|
||||
"message": "Kan niet verifiëren bij Last.fm\nVerberg de pop-up tot de volgende herstart.",
|
||||
"title": "Authenticatie mislukt"
|
||||
}
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"lastfm": {
|
||||
"api-settings": "Last.fm API Instellingen"
|
||||
},
|
||||
"listenbrainz": {
|
||||
"token": "Voer het ListenBrainz-gebruikerstoken in"
|
||||
},
|
||||
"scrobble-other-media": "Scrobble andere media"
|
||||
},
|
||||
"name": "Scrobbler",
|
||||
"prompt": {
|
||||
"lastfm": {
|
||||
"api-key": "Last.fm API sleutel",
|
||||
"api-secret": "Last.fm API geheim"
|
||||
},
|
||||
"listenbrainz": {
|
||||
"token": {
|
||||
"label": "Voer uw ListenBrainz-gebruikerstoken in:",
|
||||
"title": "ListenBrainz token"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"shortcuts": {
|
||||
"description": "Maakt het mogelijk algemene sneltoetsen in te stellen voor afspelen (afspelen/pauzeren/volgende/vorige) en het uitschakelen van media-OSD door mediatoetsen te overschrijven, het inschakelen van Ctrl/CMD + F om te zoeken, het inschakelen van Linux MPRIS-ondersteuning voor mediatoetsen en aangepaste sneltoetsen voor gevorderde gebruikers",
|
||||
"menu": {
|
||||
"override-media-keys": "Media toetsen overschrijven",
|
||||
"set-keybinds": "Stel de algemene songbediening in"
|
||||
},
|
||||
"name": "Snelkoppelingen (& MPRIS)",
|
||||
"prompt": {
|
||||
"keybind": {
|
||||
"keybind-options": {
|
||||
"next": "Volgende",
|
||||
"play-pause": "Afspelen / Pauzeren",
|
||||
"previous": "Vorige"
|
||||
},
|
||||
"label": "Kies globale toetsen voor nummer bediening:",
|
||||
"title": "Globale toetsen"
|
||||
}
|
||||
}
|
||||
},
|
||||
"skip-disliked-songs": {
|
||||
"description": "Slaat disliked nummers over",
|
||||
"name": "Sla disliked nummers over"
|
||||
},
|
||||
"skip-silences": {
|
||||
"description": "Sla automatisch stiltesecties in nummers over",
|
||||
"name": "Stiltes overslaan"
|
||||
},
|
||||
"sponsorblock": {
|
||||
"description": "Slaat automatisch niet-muziekgedeelten over, zoals intro/outro of gedeelten van muziekvideo's waarin het nummer niet wordt afgespeeld",
|
||||
"name": "SponsorBlock"
|
||||
},
|
||||
"synced-lyrics": {
|
||||
"description": "Biedt gesynchroniseerde songteksten voor nummers, met behulp van providers zoals LRClib.",
|
||||
"errors": {
|
||||
"fetch": "⚠️\tEr is een fout opgetreden bij het ophalen van de songtekst.\n\tProbeer het later opnieuw.",
|
||||
"not-found": "⚠️ Er is geen songtekst gevonden voor dit nummer."
|
||||
},
|
||||
"menu": {
|
||||
"default-text-string": {
|
||||
"label": "Standaardteken tussen songteksten",
|
||||
"tooltip": "Kies het standaardteken dat u wilt gebruiken voor de opening tussen de songteksten"
|
||||
},
|
||||
"line-effect": {
|
||||
"label": "Lijneffect",
|
||||
"submenu": {
|
||||
"fancy": {
|
||||
"label": "Luxe",
|
||||
"tooltip": "Gebruik grote, app-achtige effecten op de huidige regel"
|
||||
},
|
||||
"focus": {
|
||||
"label": "Focus",
|
||||
"tooltip": "Maak alleen de huidige regel wit"
|
||||
},
|
||||
"offset": {
|
||||
"label": "Offset",
|
||||
"tooltip": "Offset aan de rechterkant van de huidige lijn"
|
||||
},
|
||||
"scale": {
|
||||
"label": "Schaal",
|
||||
"tooltip": "Schaal de huidige regel"
|
||||
}
|
||||
},
|
||||
"tooltip": "Kies het effect dat u op de huidige regel wilt toepassen"
|
||||
},
|
||||
"precise-timing": {
|
||||
"label": "Zorg ervoor dat de songteksten perfect gesynchroniseerd zijn",
|
||||
"tooltip": "Bereken tot op de milliseconde de weergave van de volgende regel (kan een kleine impact hebben op de prestaties)"
|
||||
},
|
||||
"show-lyrics-even-if-inexact": {
|
||||
"label": "Toon songteksten, zelfs als ze onnauwkeurig zijn",
|
||||
"tooltip": "Als het nummer niet wordt gevonden, probeert de plug-in het opnieuw met een andere zoekopdracht.\nHet resultaat van de tweede poging is mogelijk niet exact."
|
||||
},
|
||||
"show-time-codes": {
|
||||
"label": "Toon tijdcodes",
|
||||
"tooltip": "Toon de tijdcodes naast de songtekst"
|
||||
}
|
||||
},
|
||||
"name": "Gesynchroniseerde songteksten",
|
||||
"refetch-btn": {
|
||||
"fetching": "Ophalen...",
|
||||
"normal": "Songteksten opnieuw ophalen"
|
||||
},
|
||||
"warnings": {
|
||||
"duration-mismatch": "⚠️ - De songteksten zijn mogelijk niet synchroon vanwege een niet-overeenkomende duur.",
|
||||
"inexact": "⚠️ - De songtekst van dit nummer is mogelijk niet exact",
|
||||
"instrumental": "⚠️ - Dit is een instrumentaal nummer"
|
||||
}
|
||||
},
|
||||
"taskbar-mediacontrol": {
|
||||
"description": "Bedien het afspelen vanaf uw Windows-taakbalk",
|
||||
"name": "Taakbalk Mediabediening"
|
||||
},
|
||||
"touchbar": {
|
||||
"description": "Voegt een TouchBar-widget toe voor macOS-gebruikers",
|
||||
"name": "TouchBar"
|
||||
},
|
||||
"tuna-obs": {
|
||||
"description": "Integratie met OBS's plug-in Tuna",
|
||||
"name": "Tuna OBS"
|
||||
},
|
||||
"video-toggle": {
|
||||
"description": "Voegt een knop toe om te schakelen tussen de video-/nummermodus. kan optioneel ook het hele videotabblad verwijderen",
|
||||
"menu": {
|
||||
"align": {
|
||||
"label": "Uitlijning",
|
||||
"submenu": {
|
||||
"left": "Links",
|
||||
"middle": "Midden",
|
||||
"right": "Rechts"
|
||||
}
|
||||
},
|
||||
"force-hide": "Forceer het verwijderen van het videotabblad",
|
||||
"mode": {
|
||||
"label": "Modus",
|
||||
"submenu": {
|
||||
"custom": "Aangepaste schakelaar",
|
||||
"disabled": "Uitgeschakeld",
|
||||
"native": "Native schakelaar"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Videoschakelaar",
|
||||
"templates": {
|
||||
"button": "Nummer"
|
||||
}
|
||||
},
|
||||
"visualizer": {
|
||||
"description": "Voeg een visuele equalizer toe",
|
||||
"description": "Voegt een visualisator toe aan de speler",
|
||||
"menu": {
|
||||
"visualizer-type": "Visualisatietype"
|
||||
},
|
||||
"name": "Visualisator"
|
||||
}
|
||||
}
|
||||
|
||||
@ -207,6 +207,10 @@
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"ad-speedup": {
|
||||
"description": "Wycisza reklamę i przyśpiesza do 16x",
|
||||
"name": "Przyśpieszacz reklam"
|
||||
},
|
||||
"adblocker": {
|
||||
"description": "Blokuj wszystkie reklamy i śledzenie",
|
||||
"menu": {
|
||||
@ -275,6 +279,56 @@
|
||||
},
|
||||
"name": "Tryb otoczenia"
|
||||
},
|
||||
"amuse": {
|
||||
"description": "Wspiera integrację YouTube Music z widgetami Amuse (od 6K Labs)",
|
||||
"name": "Amuse",
|
||||
"response": {
|
||||
"query": "Serwer API Amuse działa. Użyj metody GET do /query, aby zdobyć informację o utworze."
|
||||
}
|
||||
},
|
||||
"api-server": {
|
||||
"description": "Pozwala na kontrolowanie YouTube Music poprzez podłączenie specjalnego serwera API",
|
||||
"dialog": {
|
||||
"request": {
|
||||
"buttons": {
|
||||
"allow": "Zezwól",
|
||||
"deny": "Odmów"
|
||||
},
|
||||
"message": "Zezwolić {{ID}} (pochodzenie: {{origin}}) na dostęp do API?",
|
||||
"title": "Prośba o autoryzację API"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"auth-strategy": {
|
||||
"label": "Strategia autoryzacji",
|
||||
"submenu": {
|
||||
"auth-at-first": {
|
||||
"label": "Autoryzuj przy pierwszej prośbie"
|
||||
},
|
||||
"none": {
|
||||
"label": "Nie autoryzuj"
|
||||
}
|
||||
}
|
||||
},
|
||||
"hostname": {
|
||||
"label": "Nazwa hosta (IP)"
|
||||
},
|
||||
"port": {
|
||||
"label": "Port"
|
||||
}
|
||||
},
|
||||
"name": "YouTube Music API",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "Wpisz nazwę hosta (IP, np. 0.0.0.0), który będzie użyty do serwera API:",
|
||||
"title": "Nazwa hosta"
|
||||
},
|
||||
"port": {
|
||||
"label": "Wpisz port, z którego będzie korzystać serwer API:",
|
||||
"title": "Port"
|
||||
}
|
||||
}
|
||||
},
|
||||
"audio-compressor": {
|
||||
"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"
|
||||
@ -410,6 +464,21 @@
|
||||
"description": "Pobiera MP3/ źródło audio bezpośrednio z interfejsu",
|
||||
"menu": {
|
||||
"choose-download-folder": "Wybierz folder pobierania",
|
||||
"download-finish-settings": {
|
||||
"label": "Pobierz po zakończeniu",
|
||||
"prompt": {
|
||||
"last-percent": "Po x procentach",
|
||||
"last-seconds": "Ostatnie x sekund",
|
||||
"title": "Konfiguruj, kiedy pobierać"
|
||||
},
|
||||
"submenu": {
|
||||
"advanced": "Zaawansowane",
|
||||
"enabled": "Włączone",
|
||||
"mode": "Tryb czasowy",
|
||||
"percent": "Procenty",
|
||||
"seconds": "Sekundy"
|
||||
}
|
||||
},
|
||||
"download-playlist": "Pobierz playlistę",
|
||||
"presets": "Predefiniowane ustawienia",
|
||||
"skip-existing": "Pomiń istniejące pliki"
|
||||
@ -422,6 +491,18 @@
|
||||
"button": "Pobierz"
|
||||
}
|
||||
},
|
||||
"equalizer": {
|
||||
"description": "Dodaje equalizer do odtwarzacza",
|
||||
"menu": {
|
||||
"presets": {
|
||||
"label": "Presety",
|
||||
"list": {
|
||||
"bass-booster": "Wzmacniacz basu"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Korektor"
|
||||
},
|
||||
"exponential-volume": {
|
||||
"description": "Sprawia, że suwak głośności jest proporcjonalna, dzięki czemu łatwiej jest wybrać niższą głośność.",
|
||||
"name": "Proporcjonalna głośność"
|
||||
@ -649,6 +730,63 @@
|
||||
"description": "Automatycznie pomija fragmenty niebędące muzyką, takie jak wstęp/zakończenie lub fragmenty teledysków, w których utwór nie jest odtwarzany",
|
||||
"name": "Pomiń nieistotne fragmenty"
|
||||
},
|
||||
"synced-lyrics": {
|
||||
"description": "Dodaje zsynchronizowane napisy do utworów używając między innymi LRClib.",
|
||||
"errors": {
|
||||
"fetch": "⚠️\tWystąpił błąd podczas pobierania tekstu utworu.\n\tSpróbuj ponownie później.",
|
||||
"not-found": "⚠️ Nie znaleziono napisów dla tego utworu."
|
||||
},
|
||||
"menu": {
|
||||
"default-text-string": {
|
||||
"label": "Standardowy znak luki",
|
||||
"tooltip": "Wybierz domyślny znak, który ma być wyświetlany jako pauza między słowami"
|
||||
},
|
||||
"line-effect": {
|
||||
"label": "Efekty linijki",
|
||||
"submenu": {
|
||||
"fancy": {
|
||||
"label": "Facy",
|
||||
"tooltip": "Użyj specjalnych efektów w stylu aplikacji na obecną linię"
|
||||
},
|
||||
"focus": {
|
||||
"label": "Fokus",
|
||||
"tooltip": "Spraw, aby tylko obecna linijka była biała"
|
||||
},
|
||||
"offset": {
|
||||
"label": "Przesunięcie",
|
||||
"tooltip": "Przesuń w prawo obecną linijkę"
|
||||
},
|
||||
"scale": {
|
||||
"label": "Skala",
|
||||
"tooltip": "Zmień skalę aktualnej linijki"
|
||||
}
|
||||
},
|
||||
"tooltip": "Wybierz efekt, by zastosować go do aktualnej linijki"
|
||||
},
|
||||
"precise-timing": {
|
||||
"label": "Zsynchronizuj tekst utworu do perfekcji",
|
||||
"tooltip": "Wylicz czas wyświetlania następnej linijki co do milisekundy (może mieć mały wpływ na wydajność systemu)"
|
||||
},
|
||||
"show-lyrics-even-if-inexact": {
|
||||
"label": "Pokaż teksty, mimo niezgodności",
|
||||
"tooltip": "Jeżeli nie znaleziono tekstu piosenki z bazy danych, wtyczka spróbuje ponownie przez wyszukanie przybliżonej frazy.\nNależy jednak pamiętać, że następne próby mogą nie być trafne co do oryginału."
|
||||
},
|
||||
"show-time-codes": {
|
||||
"label": "Pokaż znaczniki czasu",
|
||||
"tooltip": "Pokaż znaczniki czasu obok linijek"
|
||||
}
|
||||
},
|
||||
"name": "Napisy zsynchronizowane",
|
||||
"refetch-btn": {
|
||||
"fetching": "Pobieranie napisów...",
|
||||
"normal": "Odśwież napisy"
|
||||
},
|
||||
"warnings": {
|
||||
"duration-mismatch": "⚠️ - Napisy mogą nie być zsynchronizowane z powodu różnicy w czasie trwania utworu.",
|
||||
"inexact": "⚠️ - Tekst utworu może się różnić od oryginału",
|
||||
"instrumental": "⚠️ - To jest utwór instrumentalny"
|
||||
}
|
||||
},
|
||||
"taskbar-mediacontrol": {
|
||||
"description": "Steruj odtwarzaniem z paska zadań systemu Windows",
|
||||
"name": "Kontroler odtwarzania z paska zadań"
|
||||
|
||||
836
src/i18n/resources/pt-BR.json
Normal file
@ -0,0 +1,836 @@
|
||||
{
|
||||
"common": {
|
||||
"console": {
|
||||
"plugins": {
|
||||
"execute-failed": "Falha ao executar plugin {{pluginName}}::{{contextName}}",
|
||||
"executed-at-ms": "Plugin {{pluginName}}::{{contextName}} executado em {{ms}} ms",
|
||||
"initialize-failed": "Falha ao inicializar o plugin \"{{pluginName}}\"",
|
||||
"load-all": "Carregando todos os plugins",
|
||||
"load-failed": "Falha ao carregar o plugin \"{{pluginName}}\"",
|
||||
"loaded": "Plugin \"{{pluginName}}\" carregado",
|
||||
"unload-failed": "Falha ao descarregar o plugin \"{{pluginName}}\"",
|
||||
"unloaded": "Plugin \"{{pluginName}}\" descarregado"
|
||||
}
|
||||
}
|
||||
},
|
||||
"language": {
|
||||
"code": "pt-BR",
|
||||
"local-name": "Português (Brasil)",
|
||||
"name": "Portuguese (Brazil)"
|
||||
},
|
||||
"main": {
|
||||
"console": {
|
||||
"did-finish-load": {
|
||||
"dev-tools": "Carregamento concluído. DevTools aberto"
|
||||
},
|
||||
"i18n": {
|
||||
"loaded": "i18n carregado"
|
||||
},
|
||||
"second-instance": {
|
||||
"receive-command": "Comando recebido pelo protocolo: \"{{command}}\""
|
||||
},
|
||||
"theme": {
|
||||
"css-file-not-found": "Arquivo CSS \"{{cssFile}}\" não existe, ignorando"
|
||||
},
|
||||
"unresponsive": {
|
||||
"details": "Erro de falta de resposta!\n{{error}}"
|
||||
},
|
||||
"when-ready": {
|
||||
"clearing-cache-after-20s": "Limpando cache do aplicativo"
|
||||
},
|
||||
"window": {
|
||||
"tried-to-render-offscreen": "A janela tentou renderizar fora da tela, tamanho da janela={{windowSize}}, tamanho da tela={{displaySize}}, posição={{position}}"
|
||||
}
|
||||
},
|
||||
"dialog": {
|
||||
"hide-menu-enabled": {
|
||||
"detail": "O menu está oculto, use 'Alt' para mostrá-lo (ou 'Esc' ao usar o menu dentro do aplicativo)",
|
||||
"message": "Ocultar menu está ativado",
|
||||
"title": "Ocultar menu ativado"
|
||||
},
|
||||
"need-to-restart": {
|
||||
"buttons": {
|
||||
"later": "Depois",
|
||||
"restart-now": "Reiniciar agora"
|
||||
},
|
||||
"detail": "O plugin \"{{pluginName}}\" requer uma reinicialização para entrar em vigor",
|
||||
"message": "\"{{pluginName}}\" precisa reiniciar",
|
||||
"title": "Necessário reiniciar"
|
||||
},
|
||||
"unresponsive": {
|
||||
"buttons": {
|
||||
"quit": "Fechar",
|
||||
"relaunch": "Reiniciar",
|
||||
"wait": "Aguardar"
|
||||
},
|
||||
"detail": "Lamentamos o inconveniente! Por favor, escolha o que fazer:",
|
||||
"message": "O aplicativo não está respondendo",
|
||||
"title": "Janela não responde"
|
||||
},
|
||||
"update-available": {
|
||||
"buttons": {
|
||||
"disable": "Desativar atualizações",
|
||||
"download": "Baixar",
|
||||
"ok": "OK"
|
||||
},
|
||||
"detail": "Uma versão mais recente está disponível em {{downloadLink}}",
|
||||
"message": "Nova versão disponível",
|
||||
"title": "Atualização disponível"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"about": "Sobre",
|
||||
"navigation": {
|
||||
"label": "Navegação",
|
||||
"submenu": {
|
||||
"copy-current-url": "Copiar URL atual",
|
||||
"go-back": "Voltar",
|
||||
"go-forward": "Avançar",
|
||||
"quit": "Sair",
|
||||
"restart": "Reiniciar aplicativo"
|
||||
}
|
||||
},
|
||||
"options": {
|
||||
"label": "Opções",
|
||||
"submenu": {
|
||||
"advanced-options": {
|
||||
"label": "Opções avançadas",
|
||||
"submenu": {
|
||||
"auto-reset-app-cache": "Limpar cache ao iniciar aplicativo",
|
||||
"disable-hardware-acceleration": "Desativar aceleração de hardware",
|
||||
"edit-config-json": "Editar config.json",
|
||||
"override-user-agent": "Substituir User-Agent",
|
||||
"restart-on-config-changes": "Reiniciar ao alterar configurações",
|
||||
"set-proxy": {
|
||||
"label": "Definir proxy",
|
||||
"prompt": {
|
||||
"label": "Digite o endereço do proxy: (deixe em branco para desativar)",
|
||||
"placeholder": "Exemplo: SOCKS5://127.0.0.1:9999",
|
||||
"title": "Definir proxy"
|
||||
}
|
||||
},
|
||||
"toggle-dev-tools": "Alternar DevTools"
|
||||
}
|
||||
},
|
||||
"always-on-top": "Sempre no topo",
|
||||
"auto-update": "Atualização automática",
|
||||
"hide-menu": {
|
||||
"dialog": {
|
||||
"message": "O menu ficará oculto na próxima inicialização, use [Alt] para exibi-lo (ou a tecla de crase [`] se estiver usando o menu do aplicativo)",
|
||||
"title": "Ocultar menu ativado"
|
||||
},
|
||||
"label": "Ocultar menu"
|
||||
},
|
||||
"language": {
|
||||
"dialog": {
|
||||
"message": "O idioma será alterado depois de reiniciar",
|
||||
"title": "Idioma alterado"
|
||||
},
|
||||
"label": "Idioma",
|
||||
"submenu": {
|
||||
"to-help-translate": "Quer ajudar a traduzir? Clique aqui"
|
||||
}
|
||||
},
|
||||
"resume-on-start": "Continuar última música ao iniciar o aplicativo",
|
||||
"single-instance-lock": "Bloqueio de instância única",
|
||||
"start-at-login": "Iniciar com o sistema",
|
||||
"starting-page": {
|
||||
"label": "Página inicial",
|
||||
"unset": "Limpar"
|
||||
},
|
||||
"tray": {
|
||||
"label": "Área de Notificação",
|
||||
"submenu": {
|
||||
"disabled": "Desativado",
|
||||
"enabled-and-hide-app": "Ativado e aplicativo oculto",
|
||||
"enabled-and-show-app": "Ativado e mostrar aplicativo",
|
||||
"play-pause-on-click": "Reproduzir/Pausar ao clicar"
|
||||
}
|
||||
},
|
||||
"visual-tweaks": {
|
||||
"label": "Ajustes visuais",
|
||||
"submenu": {
|
||||
"like-buttons": {
|
||||
"default": "Padrão",
|
||||
"force-show": "Forçar exibir",
|
||||
"hide": "Ocultar",
|
||||
"label": "Botões de 'Curtir'"
|
||||
},
|
||||
"remove-upgrade-button": "Remover botão de atualização",
|
||||
"theme": {
|
||||
"dialog": {
|
||||
"button": {
|
||||
"cancel": "Cancelar",
|
||||
"remove": "Remover"
|
||||
},
|
||||
"remove-theme": "Deseja realmente remover o tema personalizado?",
|
||||
"remove-theme-message": "Isto removerá o tema personalizado"
|
||||
},
|
||||
"label": "Tema",
|
||||
"submenu": {
|
||||
"import-css-file": "Importar arquivo CSS personalizado",
|
||||
"no-theme": "Sem tema"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"enabled": "Ativado",
|
||||
"label": "Plugins",
|
||||
"new": "NOVO"
|
||||
},
|
||||
"view": {
|
||||
"label": "Visualização",
|
||||
"submenu": {
|
||||
"force-reload": "Forçar recarregar",
|
||||
"reload": "Recarregar",
|
||||
"reset-zoom": "Tamanho atual",
|
||||
"toggle-fullscreen": "Alternar tela cheia",
|
||||
"zoom-in": "Ampliar",
|
||||
"zoom-out": "Reduzir"
|
||||
}
|
||||
}
|
||||
},
|
||||
"tray": {
|
||||
"next": "Próximo",
|
||||
"play-pause": "Reproduzir/Pausar",
|
||||
"previous": "Anterior",
|
||||
"quit": "Sair",
|
||||
"restart": "Reiniciar aplicativo",
|
||||
"show": "Mostrar janela",
|
||||
"tooltip": {
|
||||
"default": "YouTube Music",
|
||||
"with-song-info": "YouTube Music: {{artist}} - {{title}}"
|
||||
}
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"ad-speedup": {
|
||||
"description": "Se um anúncio for reproduzido, ele silencia o áudio e define a velocidade de reprodução para 16x",
|
||||
"name": "Acelerador de Anúncios"
|
||||
},
|
||||
"adblocker": {
|
||||
"description": "Bloqueio de todos os anúncios e rastreamentos imediatamente",
|
||||
"menu": {
|
||||
"blocker": "Bloqueador"
|
||||
},
|
||||
"name": "Bloqueador de Anúncios"
|
||||
},
|
||||
"album-actions": {
|
||||
"description": "Adiciona botões Remover Não curtir, Não curtir, Curtir e Remover Curtir para aplicar em todas as músicas em uma lista ou álbum",
|
||||
"name": "Ações do álbum"
|
||||
},
|
||||
"album-color-theme": {
|
||||
"description": "Aplica um tema dinâmico e efeitos visuais com base na paleta de cores do álbum",
|
||||
"menu": {
|
||||
"color-mix-ratio": {
|
||||
"label": "Proporção de mistura de cores",
|
||||
"submenu": {
|
||||
"percent": "{{ratio}}%"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Tema da cor do álbum"
|
||||
},
|
||||
"ambient-mode": {
|
||||
"description": "Aplica um efeito de iluminação projetando cores suaves do vídeo no fundo da tela",
|
||||
"menu": {
|
||||
"blur-amount": {
|
||||
"label": "Quantidade de desfoque",
|
||||
"submenu": {
|
||||
"pixels": "{{blurAmount}} pixels"
|
||||
}
|
||||
},
|
||||
"buffer": {
|
||||
"label": "Buffer",
|
||||
"submenu": {
|
||||
"buffer": "{{buffer}}"
|
||||
}
|
||||
},
|
||||
"opacity": {
|
||||
"label": "Opacidade",
|
||||
"submenu": {
|
||||
"percent": "{{opacity}}%"
|
||||
}
|
||||
},
|
||||
"quality": {
|
||||
"label": "Qualidade",
|
||||
"submenu": {
|
||||
"pixels": "{{quality}} pixels"
|
||||
}
|
||||
},
|
||||
"size": {
|
||||
"label": "Tamanho",
|
||||
"submenu": {
|
||||
"percent": "{{size}}%"
|
||||
}
|
||||
},
|
||||
"smoothness-transition": {
|
||||
"label": "Transição suave",
|
||||
"submenu": {
|
||||
"during": "Durante {{interpolationTime}} s"
|
||||
}
|
||||
},
|
||||
"use-fullscreen": {
|
||||
"label": "Usando tela cheia"
|
||||
}
|
||||
},
|
||||
"name": "Modo ambiente"
|
||||
},
|
||||
"amuse": {
|
||||
"description": "Adiciona suporte ao YouTube Music ao widget 'Reproduzindo agora' do Amuse da 6K Labs",
|
||||
"name": "Amuse",
|
||||
"response": {
|
||||
"query": "Servidor API do Amuse em execução. GET /query para obter informações da música."
|
||||
}
|
||||
},
|
||||
"api-server": {
|
||||
"description": "Adiciona um servidor API para controlar o player",
|
||||
"dialog": {
|
||||
"request": {
|
||||
"buttons": {
|
||||
"allow": "Permitir",
|
||||
"deny": "Negar"
|
||||
},
|
||||
"message": "Permitir que {{ID}} {{origin}} acesse o API?",
|
||||
"title": "Pedido de autorização API"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"auth-strategy": {
|
||||
"label": "Estratégia de autorização",
|
||||
"submenu": {
|
||||
"auth-at-first": {
|
||||
"label": "Autorizar na primeira solicitação"
|
||||
},
|
||||
"none": {
|
||||
"label": "Não autorizar"
|
||||
}
|
||||
}
|
||||
},
|
||||
"hostname": {
|
||||
"label": "Nome do anfitrião"
|
||||
},
|
||||
"port": {
|
||||
"label": "Porta"
|
||||
}
|
||||
},
|
||||
"name": "Servidor API [Beta]",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "Entre o nome do host (como 0.0.0.0) para o servidor API:",
|
||||
"title": "Nome do anfitrião"
|
||||
},
|
||||
"port": {
|
||||
"label": "Entre a porta do servidor API:",
|
||||
"title": "Porta"
|
||||
}
|
||||
}
|
||||
},
|
||||
"audio-compressor": {
|
||||
"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"
|
||||
},
|
||||
"blur-nav-bar": {
|
||||
"description": "Torna a barra de navegação transparente e desfocada",
|
||||
"name": "Desfocar barra de navegação"
|
||||
},
|
||||
"bypass-age-restrictions": {
|
||||
"description": "Pular a verificação de idade do YouTube",
|
||||
"name": "Ignorar restrições de idade"
|
||||
},
|
||||
"captions-selector": {
|
||||
"description": "Seletor de legendas para faixas de áudio do YouTube Music",
|
||||
"menu": {
|
||||
"autoload": "Selecionar automaticamente a última legenda usada",
|
||||
"disable-captions": "Sem legendas por padrão"
|
||||
},
|
||||
"name": "Seletor de legendas",
|
||||
"prompt": {
|
||||
"selector": {
|
||||
"label": "Idioma atual da legenda: {{language}}",
|
||||
"none": "Nenhum",
|
||||
"title": "Selecionar idioma da legenda"
|
||||
}
|
||||
},
|
||||
"templates": {
|
||||
"title": "Abrir seletor de legendas"
|
||||
}
|
||||
},
|
||||
"compact-sidebar": {
|
||||
"description": "Sempre definir a barra lateral no modo compacto",
|
||||
"name": "Barra lateral compacta"
|
||||
},
|
||||
"crossfade": {
|
||||
"description": "Crossfade entre músicas",
|
||||
"menu": {
|
||||
"advanced": "Avançado"
|
||||
},
|
||||
"name": "Crossfade [Beta]",
|
||||
"prompt": {
|
||||
"options": {
|
||||
"multi-input": {
|
||||
"fade-in-duration": "Duração do fade (ms)",
|
||||
"fade-out-duration": "Duração do fade out (ms)",
|
||||
"fade-scaling": {
|
||||
"label": "Escala do fade",
|
||||
"linear": "Linear",
|
||||
"logarithmic": "Logarítmico"
|
||||
},
|
||||
"seconds-before-end": "Crossfade N segundos antes do fim"
|
||||
},
|
||||
"title": "Opções de crossfade"
|
||||
}
|
||||
}
|
||||
},
|
||||
"disable-autoplay": {
|
||||
"description": "Faz a música começar no modo \"pausado\"",
|
||||
"menu": {
|
||||
"apply-once": "Aplicar somente ao iniciar"
|
||||
},
|
||||
"name": "Desativar reprodução automática"
|
||||
},
|
||||
"discord": {
|
||||
"backend": {
|
||||
"already-connected": "Tentativa de conectar-se com conexão ativa",
|
||||
"connected": "Conectado no Discord",
|
||||
"disconnected": "Desconectado do Discord"
|
||||
},
|
||||
"description": "Mostre aos seus amigos o que você ouve com Rich Presence",
|
||||
"menu": {
|
||||
"auto-reconnect": "Reconexão automática",
|
||||
"clear-activity": "Limpar atividades",
|
||||
"clear-activity-after-timeout": "Limpar atividades após tempo limite",
|
||||
"connected": "Conectado",
|
||||
"disconnected": "Desconectado",
|
||||
"hide-duration-left": "Ocultar duração restante",
|
||||
"hide-github-button": "Ocultar botão do GitHub",
|
||||
"play-on-youtube-music": "Reproduzir no YouTube Music",
|
||||
"set-inactivity-timeout": "Definir tempo limite de inatividade"
|
||||
},
|
||||
"name": "Rich Presence do Discord",
|
||||
"prompt": {
|
||||
"set-inactivity-timeout": {
|
||||
"label": "Digite o tempo de inatividade em segundos:",
|
||||
"title": "Definir tempo limite de inatividade"
|
||||
}
|
||||
}
|
||||
},
|
||||
"downloader": {
|
||||
"backend": {
|
||||
"dialog": {
|
||||
"error": {
|
||||
"buttons": {
|
||||
"ok": "OK"
|
||||
},
|
||||
"message": "Ah! Desculpe, o download falhou…",
|
||||
"title": "Erro no download!"
|
||||
},
|
||||
"start-download-playlist": {
|
||||
"buttons": {
|
||||
"ok": "OK"
|
||||
},
|
||||
"detail": "({{playlistSize}} músicas)",
|
||||
"message": "Baixando lista de reprodução {{playlistTitle}}",
|
||||
"title": "Download iniciado"
|
||||
}
|
||||
},
|
||||
"feedback": {
|
||||
"conversion-progress": "Convertendo: {{percent}}%",
|
||||
"converting": "Convertendo…",
|
||||
"done": "Concluído: {{filePath}}",
|
||||
"download-info": "Baixando {{artist}} - {{title}} [{{videoId}}",
|
||||
"download-progress": "Download: {{percent}}%",
|
||||
"downloading": "Baixando…",
|
||||
"downloading-counter": "Baixando {{current}}/{{total}}…",
|
||||
"downloading-playlist": "Baixando lista de reprodução \"{{playlistTitle}}\" - {{playlistSize}} músicas ({{playlistId}})",
|
||||
"error-while-downloading": "Erro ao baixar \"{{author}} - {{title}}\": {{error}}",
|
||||
"folder-already-exists": "A pasta {{playlistFolder}} já existe",
|
||||
"getting-playlist-info": "Obtendo informações da playlist…",
|
||||
"loading": "Carregando…",
|
||||
"playlist-has-only-one-song": "Playlist possui apenas um item, baixando diretamente",
|
||||
"playlist-id-not-found": "Nenhum playlist ID encontrado",
|
||||
"playlist-is-empty": "Playlist está vazia",
|
||||
"playlist-is-mix-or-private": "Erro ao obter informações da playlist: verifique se não é uma playlist privada ou “”Mixada para você”\n\n{{error}}",
|
||||
"preparing-file": "Preparando arquivo…",
|
||||
"saving": "Salvando…",
|
||||
"trying-to-get-playlist-id": "Tentando obter playlist ID: {{playlistId}}",
|
||||
"video-id-not-found": "Vídeo não encontrado",
|
||||
"writing-id3": "Salvando tags ID3…"
|
||||
}
|
||||
},
|
||||
"description": "Faça download do MP3 / fonte de áudio diretamente da interface",
|
||||
"menu": {
|
||||
"choose-download-folder": "Escolha a pasta de download",
|
||||
"download-finish-settings": {
|
||||
"label": "Baixar ao finalizar",
|
||||
"prompt": {
|
||||
"last-percent": "Após x %",
|
||||
"last-seconds": "Últimos x segundos",
|
||||
"title": "Configurar quando baixar"
|
||||
},
|
||||
"submenu": {
|
||||
"advanced": "Avançado",
|
||||
"enabled": "Ativado",
|
||||
"mode": "Modo de tempo",
|
||||
"percent": "Porcento",
|
||||
"seconds": "Segundos"
|
||||
}
|
||||
},
|
||||
"download-playlist": "Baixar playlist",
|
||||
"presets": "Predefinições",
|
||||
"skip-existing": "Pular arquivos existentes"
|
||||
},
|
||||
"name": "Downloader",
|
||||
"renderer": {
|
||||
"can-not-update-progress": "Não é possível atualizar o progresso"
|
||||
},
|
||||
"templates": {
|
||||
"button": "Baixar"
|
||||
}
|
||||
},
|
||||
"equalizer": {
|
||||
"description": "Adiciona um equalizador ao player",
|
||||
"menu": {
|
||||
"presets": {
|
||||
"label": "Predefinições",
|
||||
"list": {
|
||||
"bass-booster": "Reforço de graves"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Equalizador"
|
||||
},
|
||||
"exponential-volume": {
|
||||
"description": "Torna o controle deslizante de volume exponencial para que seja mais fácil selecionar volumes mais baixos.",
|
||||
"name": "Volume Exponencial"
|
||||
},
|
||||
"in-app-menu": {
|
||||
"description": "Dá às barras de menu uma aparência elegante, escura ou com a cor do álbum",
|
||||
"menu": {
|
||||
"hide-dom-window-controls": "Ocultar controles da janela DOM"
|
||||
},
|
||||
"name": "Menu no aplicativo"
|
||||
},
|
||||
"lumiastream": {
|
||||
"description": "Adiciona suporte ao Lumia Stream",
|
||||
"name": "Lumia Stream [Beta]"
|
||||
},
|
||||
"lyrics-genius": {
|
||||
"description": "Adiciona suporte a letras para a maioria das músicas",
|
||||
"menu": {
|
||||
"romanized-lyrics": "Letras Romanizadas"
|
||||
},
|
||||
"name": "Letras Genius",
|
||||
"renderer": {
|
||||
"fetched-lyrics": "Letras buscadas por Genius"
|
||||
}
|
||||
},
|
||||
"music-together": {
|
||||
"description": "Compartilhe uma playlist com outras pessoas. Quando o anfitrião toca uma música, todos os outros ouvirão",
|
||||
"dialog": {
|
||||
"enter-host": "Insira o ID do host"
|
||||
},
|
||||
"internal": {
|
||||
"save": "Salvar",
|
||||
"track-source": "Fonte da Faixa",
|
||||
"unknown-user": "Usuário Desconhecido"
|
||||
},
|
||||
"menu": {
|
||||
"click-to-copy-id": "Copiar ID do host",
|
||||
"close": "Fechar Music Together",
|
||||
"connected-users": "Usuários Conectados",
|
||||
"disconnect": "Desconectar Music Together",
|
||||
"empty-user": "Nenhum usuário conectado",
|
||||
"host": "Anfitrião do Music Together",
|
||||
"join": "Entrar no Music Together",
|
||||
"permission": {
|
||||
"all": "Permitir que os convidados controlem a lista de reprodução e o player",
|
||||
"host-only": "Somente o host pode controlar a lista de reprodução e o player",
|
||||
"playlist": "Permitir que os convidados controlem a lista de reprodução"
|
||||
},
|
||||
"set-permission": "Mudar Permissões de Controle",
|
||||
"status": {
|
||||
"disconnected": "Desconectado",
|
||||
"guest": "Conectado como convidado",
|
||||
"host": "Conectado como Anfitrião"
|
||||
}
|
||||
},
|
||||
"name": "Music Together [Beta]",
|
||||
"toast": {
|
||||
"add-song-failed": "Falha ao adicionar música",
|
||||
"closed": "Music Together fechado",
|
||||
"disconnected": "Music Together desconectado",
|
||||
"host-failed": "Falha ao hospedar o Music Together",
|
||||
"id-copied": "ID do anfitrião copiado para a área de transferência",
|
||||
"id-copy-failed": "Falha ao copiar o ID do anfitrião para a área de transferência",
|
||||
"join-failed": "Falha ao ingressar no Music Together",
|
||||
"joined": "Entrou no Music Together",
|
||||
"permission-changed": "A permissão do Music Together foi alterada para \"{{permission}}\"",
|
||||
"remove-song-failed": "Falha ao remover música",
|
||||
"user-connected": "{{name}} juntou-se ao Music Together",
|
||||
"user-disconnected": "{{name}} saiu do Music Together"
|
||||
}
|
||||
},
|
||||
"navigation": {
|
||||
"description": "Setas de navegação para avançar/retornar diretamente integradas na interface, como no seu navegador favorito",
|
||||
"name": "Navegação"
|
||||
},
|
||||
"no-google-login": {
|
||||
"description": "Remova os botões e links de login do Google da interface",
|
||||
"name": "Sem login do Google"
|
||||
},
|
||||
"notifications": {
|
||||
"description": "Exibir uma notificação quando uma música começar a tocar (notificações interativas estão disponíveis no Windows)",
|
||||
"menu": {
|
||||
"interactive": "Notificações interativas",
|
||||
"interactive-settings": {
|
||||
"label": "Configurações interativas",
|
||||
"submenu": {
|
||||
"hide-button-text": "Ocultar texto do botão",
|
||||
"refresh-on-play-pause": "Atualizar ao Reproduzir/Pausar",
|
||||
"tray-controls": "Abrir/Fechar ao clicar na área de notificação"
|
||||
}
|
||||
},
|
||||
"priority": "Prioridade da notificação",
|
||||
"toast-style": "Estilo de alerta",
|
||||
"unpause-notification": "Mostrar notificação ao despausar"
|
||||
},
|
||||
"name": "Notificações"
|
||||
},
|
||||
"picture-in-picture": {
|
||||
"description": "Permite alternar o aplicativo para o modo picture-in-picture",
|
||||
"menu": {
|
||||
"always-on-top": "Sempre no topo",
|
||||
"hotkey": {
|
||||
"label": "Tecla de atalho",
|
||||
"prompt": {
|
||||
"keybind-options": {
|
||||
"hotkey": "Tecla de atalho"
|
||||
},
|
||||
"label": "Escolha uma tecla de atalho para alternar entre picture-in-picture",
|
||||
"title": "Atalho do picture-in-picture"
|
||||
}
|
||||
},
|
||||
"save-window-position": "Salvar posição da janela",
|
||||
"save-window-size": "Salvar tamanho da janela",
|
||||
"use-native-pip": "Usar PiP nativo do navegador"
|
||||
},
|
||||
"name": "Picture-in-picture",
|
||||
"templates": {
|
||||
"button": "Picture-in-picture"
|
||||
}
|
||||
},
|
||||
"playback-speed": {
|
||||
"description": "Ouça rápido, ouça devagar! Adiciona um controle deslizante que controla a velocidade da música",
|
||||
"name": "Velocidade de reprodução",
|
||||
"templates": {
|
||||
"button": "Velocidade"
|
||||
}
|
||||
},
|
||||
"precise-volume": {
|
||||
"description": "Controle o volume com precisão usando a roda do mouse/teclas de atalho, com um HUD personalizado e etapas de volume personalizáveis",
|
||||
"menu": {
|
||||
"arrows-shortcuts": "Controles de teclas de seta locais",
|
||||
"custom-volume-steps": "Definir etapas de volume personalizadas",
|
||||
"global-shortcuts": "Teclas de atalho globais"
|
||||
},
|
||||
"name": "Volume preciso",
|
||||
"prompt": {
|
||||
"global-shortcuts": {
|
||||
"keybind-options": {
|
||||
"decrease": "Diminuir volume",
|
||||
"increase": "Aumentar volume"
|
||||
},
|
||||
"label": "Selecione as teclas de atalho global do volume:",
|
||||
"title": "Teclas de atalho global de volume"
|
||||
},
|
||||
"volume-steps": {
|
||||
"label": "Escolha as etapas de aumento/diminuição do volume",
|
||||
"title": "Fases de volume"
|
||||
}
|
||||
}
|
||||
},
|
||||
"quality-changer": {
|
||||
"backend": {
|
||||
"dialog": {
|
||||
"quality-changer": {
|
||||
"detail": "Qualidade atual: {{quality}}",
|
||||
"message": "Escolher qualidade do vídeo:",
|
||||
"title": "Escolher qualidade do vídeo"
|
||||
}
|
||||
}
|
||||
},
|
||||
"description": "Permite alterar a qualidade do vídeo com um botão na sobreposição de vídeo",
|
||||
"name": "Alterador de qualidade do vídeo"
|
||||
},
|
||||
"scrobbler": {
|
||||
"description": "Adicionar suporte para scrobbling (last.fm, Listenbrainz, etc.)",
|
||||
"dialog": {
|
||||
"lastfm": {
|
||||
"auth-failed": {
|
||||
"message": "Falha ao autenticar com Last.fm\nOcultar o pop-up até a próxima reinicialização.",
|
||||
"title": "Falha na autenticação"
|
||||
}
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"lastfm": {
|
||||
"api-settings": "Configurações da API do Last.fm"
|
||||
},
|
||||
"listenbrainz": {
|
||||
"token": "Insira o token de usuário ListenBrainz"
|
||||
},
|
||||
"scrobble-other-media": "Scrobble outras mídias"
|
||||
},
|
||||
"name": "Scrobbler",
|
||||
"prompt": {
|
||||
"lastfm": {
|
||||
"api-key": "Chave de API do Last.fm",
|
||||
"api-secret": "Chave secreta da API do Last.fm"
|
||||
},
|
||||
"listenbrainz": {
|
||||
"token": {
|
||||
"label": "Insira seu token de usuário do ListenBrainz:",
|
||||
"title": "ListenBrainz token"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"shortcuts": {
|
||||
"description": "Permite definir teclas de atalho globais para reprodução (reproduzir/pausar/próximo/anterior) e desativar o OSD de mídia substituindo as teclas de mídia, ativando Ctrl/CMD + F para pesquisar, ativando o suporte Linux MPRIS para teclas de mídia e teclas de atalho personalizadas para usuários avançados",
|
||||
"menu": {
|
||||
"override-media-keys": "Substituir chaves de multimédia",
|
||||
"set-keybinds": "Definir controles globais de música"
|
||||
},
|
||||
"name": "Atalhos (& MPRIS)",
|
||||
"prompt": {
|
||||
"keybind": {
|
||||
"keybind-options": {
|
||||
"next": "Próximo",
|
||||
"play-pause": "Reproduzir / Pausar",
|
||||
"previous": "Anterior"
|
||||
},
|
||||
"label": "Escolha atalhos de teclado globais para controle de músicas:",
|
||||
"title": "Atalhos de teclado global"
|
||||
}
|
||||
}
|
||||
},
|
||||
"skip-disliked-songs": {
|
||||
"description": "Ignora músicas marcadas com \"não gostei\"",
|
||||
"name": "Pular músicas marcadas com \"não gostei\""
|
||||
},
|
||||
"skip-silences": {
|
||||
"description": "Pular automaticamente seções de silêncio em músicas",
|
||||
"name": "Pular silêncios"
|
||||
},
|
||||
"sponsorblock": {
|
||||
"description": "Pula automaticamente partes não musicais, como introdução/finalização ou partes de videoclipes onde a música não está tocando",
|
||||
"name": "SponsorBlock [Bloquear patrocínios]"
|
||||
},
|
||||
"synced-lyrics": {
|
||||
"description": "Fornece letras sincronizadas para músicas, usando provedores como LRClib.",
|
||||
"errors": {
|
||||
"fetch": "⚠️\tOcorreu um erro ao buscar a letra.\n\tTente novamente mais tarde.",
|
||||
"not-found": "⚠️ Nenhuma letra encontrada para esta música."
|
||||
},
|
||||
"menu": {
|
||||
"default-text-string": {
|
||||
"label": "Caractere padrão entre letras",
|
||||
"tooltip": "Escolha o caractere padrão a ser usado para o intervalo entre as letras"
|
||||
},
|
||||
"line-effect": {
|
||||
"label": "Efeito de linha",
|
||||
"submenu": {
|
||||
"fancy": {
|
||||
"label": "Fancy",
|
||||
"tooltip": "Use efeitos grandes, semelhantes a aplicativos, na linha atual"
|
||||
},
|
||||
"focus": {
|
||||
"label": "Foco",
|
||||
"tooltip": "Deixe apenas a linha atual branca"
|
||||
},
|
||||
"offset": {
|
||||
"label": "Deslocar",
|
||||
"tooltip": "Deslocamento à direita da linha atual"
|
||||
},
|
||||
"scale": {
|
||||
"label": "Aumentar",
|
||||
"tooltip": "Aumentar a linha atual"
|
||||
}
|
||||
},
|
||||
"tooltip": "Escolha o efeito a ser aplicado à linha atual"
|
||||
},
|
||||
"precise-timing": {
|
||||
"label": "Deixa as letras perfeitamente sincronizadas",
|
||||
"tooltip": "Calcular até o milissegundo a exibição da próxima linha (pode ter um pequeno impacto no desempenho)"
|
||||
},
|
||||
"show-lyrics-even-if-inexact": {
|
||||
"label": "Mostrar letras mesmo que não sejam exatas",
|
||||
"tooltip": "Se a música não for encontrada, o plugin tenta novamente com uma consulta de pesquisa diferente.\nO resultado da segunda tentativa pode não ser exato."
|
||||
},
|
||||
"show-time-codes": {
|
||||
"label": "Mostrar códigos de tempo",
|
||||
"tooltip": "Mostrar os códigos de tempo ao lado das letras"
|
||||
}
|
||||
},
|
||||
"name": "Letras sincronizadas",
|
||||
"refetch-btn": {
|
||||
"fetching": "Buscando...",
|
||||
"normal": "Buscar letras novamente"
|
||||
},
|
||||
"warnings": {
|
||||
"duration-mismatch": "⚠️ - A letra pode estar dessincronizada devido a uma incompatibilidade de duração.",
|
||||
"inexact": "⚠️ - A letra desta música pode não ser exata",
|
||||
"instrumental": "⚠️ - Esta é uma música instrumental"
|
||||
}
|
||||
},
|
||||
"taskbar-mediacontrol": {
|
||||
"description": "Controle a reprodução na barra de tarefas do Windows",
|
||||
"name": "Controle de mídia da barra de tarefas"
|
||||
},
|
||||
"touchbar": {
|
||||
"description": "Adiciona um widget TouchBar para usuários do macOS",
|
||||
"name": "TouchBar"
|
||||
},
|
||||
"tuna-obs": {
|
||||
"description": "Integração com o plugin Tuna do OBS",
|
||||
"name": "Tuna OBS"
|
||||
},
|
||||
"video-toggle": {
|
||||
"description": "Adiciona um botão para alternar entre o modo Vídeo/Música. Também é possível remover opcionalmente toda a aba de vídeo",
|
||||
"menu": {
|
||||
"align": {
|
||||
"label": "Alinhamento",
|
||||
"submenu": {
|
||||
"left": "Esquerda",
|
||||
"middle": "Meio",
|
||||
"right": "Direita"
|
||||
}
|
||||
},
|
||||
"force-hide": "Forçar remoção da aba de vídeo",
|
||||
"mode": {
|
||||
"label": "Modo",
|
||||
"submenu": {
|
||||
"custom": "Alternância personalizada",
|
||||
"disabled": "Desativado",
|
||||
"native": "Alternância nativa"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Alternar vídeo",
|
||||
"templates": {
|
||||
"button": "Música"
|
||||
}
|
||||
},
|
||||
"visualizer": {
|
||||
"description": "Adiciona um visualizador ao player",
|
||||
"menu": {
|
||||
"visualizer-type": "Tipo de visualizador"
|
||||
},
|
||||
"name": "Visualizador"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -207,6 +207,10 @@
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"ad-speedup": {
|
||||
"description": "Se um anúncio for reproduzido, ele será silenciado o áudio e será definido a velocidade de reprodução para 16x",
|
||||
"name": "Acelerar os anúncios"
|
||||
},
|
||||
"adblocker": {
|
||||
"description": "Bloquear todos os anúncios e rastreamento automaticamente",
|
||||
"menu": {
|
||||
@ -222,9 +226,9 @@
|
||||
"description": "Aplica um tema dinâmico e efeitos visuais com base na paleta de cores do álbum",
|
||||
"menu": {
|
||||
"color-mix-ratio": {
|
||||
"label": "Rácio de mistura das cores",
|
||||
"label": "Relação de mistura de cores",
|
||||
"submenu": {
|
||||
"percent": "Proporção"
|
||||
"percent": "{{ratio}}%"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -275,6 +279,37 @@
|
||||
},
|
||||
"name": "Modo Ambiente"
|
||||
},
|
||||
"api-server": {
|
||||
"dialog": {
|
||||
"request": {
|
||||
"buttons": {
|
||||
"allow": "Permitir",
|
||||
"deny": "Negar"
|
||||
}
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"auth-strategy": {
|
||||
"label": "Estratégia de Autorização",
|
||||
"submenu": {
|
||||
"auth-at-first": {
|
||||
"label": "Autorizar ao primeiro pedido"
|
||||
},
|
||||
"none": {
|
||||
"label": "Sem autorização"
|
||||
}
|
||||
}
|
||||
},
|
||||
"port": {
|
||||
"label": "Porta"
|
||||
}
|
||||
},
|
||||
"prompt": {
|
||||
"port": {
|
||||
"title": "Porta"
|
||||
}
|
||||
}
|
||||
},
|
||||
"audio-compressor": {
|
||||
"description": "Aplicar compressão ao áudio (diminui o volume das partes mais altas do sinal e aumenta o volume das partes mais suaves)",
|
||||
"name": "Compressor de áudio"
|
||||
@ -410,6 +445,21 @@
|
||||
"description": "Baixa MP3 / fonte de áudio diretamente da interface",
|
||||
"menu": {
|
||||
"choose-download-folder": "Escolha a pasta de download",
|
||||
"download-finish-settings": {
|
||||
"label": "Baixar ao terminar",
|
||||
"prompt": {
|
||||
"last-percent": "Depois de x por cento",
|
||||
"last-seconds": "Últimos x segundos",
|
||||
"title": "Configurar quando baixar"
|
||||
},
|
||||
"submenu": {
|
||||
"advanced": "Avançado",
|
||||
"enabled": "Ativado",
|
||||
"mode": "Modo de tempo",
|
||||
"percent": "Porcentagem",
|
||||
"seconds": "Segundos"
|
||||
}
|
||||
},
|
||||
"download-playlist": "Baixar lista de reprodução",
|
||||
"presets": "Predefinições",
|
||||
"skip-existing": "Ignorar arquivos existentes"
|
||||
@ -482,15 +532,15 @@
|
||||
"add-song-failed": "Falha ao adicionar canção",
|
||||
"closed": "Música Juntos encerrado",
|
||||
"disconnected": "Música Juntos foi desconectado",
|
||||
"host-failed": "Falha ao hospedar o Música Juntos",
|
||||
"host-failed": "Falha ao hospedar o Music Together",
|
||||
"id-copied": "ID de anfitrião copiado para a área de transferência",
|
||||
"id-copy-failed": "Falha ao copiar o ID de anfitrião para a área de transferência",
|
||||
"join-failed": "Falha ao entrar em Música Juntos",
|
||||
"joined": "Entrou em Música Juntos",
|
||||
"permission-changed": "A permissão do Música Juntos foi alterada para \"{{permission}}\"",
|
||||
"join-failed": "Falha ao entrar em Music Together",
|
||||
"joined": "Entrou em Music Together",
|
||||
"permission-changed": "A permissão do Music Together foi alterada para \"{{permission}}\"",
|
||||
"remove-song-failed": "Falha ao remover música",
|
||||
"user-connected": "{{name}} entrou em Música Juntos",
|
||||
"user-disconnected": "{{name}} saiu do Música Juntos"
|
||||
"user-connected": "{{name}} entrou em Music Together",
|
||||
"user-disconnected": "{{name}} saiu do Music Together"
|
||||
}
|
||||
},
|
||||
"navigation": {
|
||||
@ -649,6 +699,59 @@
|
||||
"description": "Ignora automaticamente partes não musicais, como introdução/final ou partes de videoclipes onde a música não está tocando",
|
||||
"name": "SponsorBlock (bloqueador de patrocínios)"
|
||||
},
|
||||
"synced-lyrics": {
|
||||
"description": "Fornece letras sincronizadas de músicas, utilizando fornecedores como o LRClib.",
|
||||
"errors": {
|
||||
"fetch": "⚠️ - Ocorreu um erro ao obter as letras da música. Por favor, tenta novamente mais tarde.",
|
||||
"not-found": "⚠️ - Não foram encontradas letras para esta música."
|
||||
},
|
||||
"menu": {
|
||||
"default-text-string": {
|
||||
"label": "Caractere padrão entre as letras",
|
||||
"tooltip": "Escolha o caractere padrão para usar no espaço entre as letras"
|
||||
},
|
||||
"line-effect": {
|
||||
"label": "Efeito de linha",
|
||||
"submenu": {
|
||||
"focus": {
|
||||
"label": "Foco",
|
||||
"tooltip": "Deixe apenas a linha atual branca"
|
||||
},
|
||||
"offset": {
|
||||
"label": "Deslocamento",
|
||||
"tooltip": "Desloque a linha atual para a direita"
|
||||
},
|
||||
"scale": {
|
||||
"label": "Escala",
|
||||
"tooltip": "Escalar a linha atual"
|
||||
}
|
||||
},
|
||||
"tooltip": "Escolha o efeito a ser aplicado à linha atual"
|
||||
},
|
||||
"precise-timing": {
|
||||
"label": "Sincronize perfeitamente as letras",
|
||||
"tooltip": "Calcule até o milissegundo a exibição da próxima linha (pode ter um pequeno impacto no desempenho)"
|
||||
},
|
||||
"show-lyrics-even-if-inexact": {
|
||||
"label": "Mostrar letras mesmo que imprecisas",
|
||||
"tooltip": "Se a música não for encontrada, o plugin tenta novamente com uma consulta de pesquisa diferente.\nO resultado da segunda tentativa pode não ser exato."
|
||||
},
|
||||
"show-time-codes": {
|
||||
"label": "Mostrar códigos de tempo",
|
||||
"tooltip": "Mostrar os códigos de tempo ao lado das letras"
|
||||
}
|
||||
},
|
||||
"name": "Letras Sincronizadas",
|
||||
"refetch-btn": {
|
||||
"fetching": "Buscando...",
|
||||
"normal": "Buscar as letras novamente"
|
||||
},
|
||||
"warnings": {
|
||||
"duration-mismatch": "⚠️ - As letras da música pode estar dessincronizada devido a um erro de duração.",
|
||||
"inexact": "⚠️ - As letras desta música podem não ser exactas.",
|
||||
"instrumental": "⚠️ - Esta é uma música instrumental."
|
||||
}
|
||||
},
|
||||
"taskbar-mediacontrol": {
|
||||
"description": "Controle a reprodução na barra de tarefas do Windows",
|
||||
"name": "Controle de mídia da barra de tarefas"
|
||||
|
||||
@ -207,6 +207,10 @@
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"ad-speedup": {
|
||||
"description": "Reclamele au sunetul dezactivat si viteza de redare este x16",
|
||||
"name": "Accelerare reclame"
|
||||
},
|
||||
"adblocker": {
|
||||
"description": "Blocheaza toate reclamele si trackers",
|
||||
"menu": {
|
||||
@ -264,103 +268,153 @@
|
||||
}
|
||||
},
|
||||
"smoothness-transition": {
|
||||
"label": "Fluenta tranzitiei",
|
||||
"label": "Fluiditatea tranzitiei",
|
||||
"submenu": {
|
||||
"during": "In timpul {{interpolationTime}} s"
|
||||
}
|
||||
},
|
||||
"use-fullscreen": {
|
||||
"label": "Foloseste fullscreen"
|
||||
"label": "Ecran Plin în utilizare"
|
||||
}
|
||||
},
|
||||
"name": "Mod ambiental"
|
||||
},
|
||||
"amuse": {
|
||||
"description": "Adauga suport Youtube Music pentru Amuse se redă acum widget de 6K Labs",
|
||||
"name": "Amuse",
|
||||
"response": {
|
||||
"query": "Server-ul API-ului Amuse rulează. GET /query pentru a obține informații despre melodie."
|
||||
}
|
||||
},
|
||||
"api-server": {
|
||||
"description": "Adaugă un server API pentru a controla player-ul",
|
||||
"dialog": {
|
||||
"request": {
|
||||
"buttons": {
|
||||
"allow": "Permite",
|
||||
"deny": "Respinge"
|
||||
},
|
||||
"message": "Permite {{ID}} {{origin}} să acceseze API-ul?",
|
||||
"title": "Cerere autorizare API"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"auth-strategy": {
|
||||
"label": "Strategie de autorizare",
|
||||
"submenu": {
|
||||
"auth-at-first": {
|
||||
"label": "Autorizare la prima cerere"
|
||||
},
|
||||
"none": {
|
||||
"label": "Fără autorizare"
|
||||
}
|
||||
}
|
||||
},
|
||||
"hostname": {
|
||||
"label": "Nume host"
|
||||
},
|
||||
"port": {
|
||||
"label": "Port"
|
||||
}
|
||||
},
|
||||
"name": "Server API [Beta]",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "Introduceți nume host (0.0.0.0 de ex.) pentru server-ul API:",
|
||||
"title": "Nume host"
|
||||
},
|
||||
"port": {
|
||||
"label": "Introduceți port-ul pentru server-ul API:",
|
||||
"title": "Port"
|
||||
}
|
||||
}
|
||||
},
|
||||
"audio-compressor": {
|
||||
"description": "Aplica compresie pe audio (scade volumul partilor cele mai sonore si creste volumul partilor mai putin sonore)",
|
||||
"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"
|
||||
},
|
||||
"blur-nav-bar": {
|
||||
"description": "Fa bara de navigare semi-transparenta",
|
||||
"name": "Bara de naviagtie semi-transparenta"
|
||||
"description": "Face bara de navigare semi-transparentă",
|
||||
"name": "Estompează Bara de Navigație"
|
||||
},
|
||||
"bypass-age-restrictions": {
|
||||
"description": "Treci peste verificarea de varsta a YouTube-ului",
|
||||
"name": "Ignora restrictiile de varsta"
|
||||
"description": "Treci peste verificarea de vârstă a YouTube-ului",
|
||||
"name": "Ignoră restricțiile de vârstă"
|
||||
},
|
||||
"captions-selector": {
|
||||
"description": "Selector de subtitrari pentru piesele audio de pe YouTube Music",
|
||||
"description": "Selector de subtitrări pentru piesele audio de pe YouTube Music",
|
||||
"menu": {
|
||||
"autoload": "Selecteaza automat ultima subtitrare folosita",
|
||||
"disable-captions": "Fara subtitrari by default"
|
||||
"autoload": "Selectează automat ultima subtitrare folosită",
|
||||
"disable-captions": "Fără subtitrări în mod implicit"
|
||||
},
|
||||
"name": "Selector de subtitrari",
|
||||
"name": "Selector de subtitrări",
|
||||
"prompt": {
|
||||
"selector": {
|
||||
"label": "Limba curenta a subtitrarilor: {{language}}",
|
||||
"label": "Limba curentă a subtitrărilor: {{language}}",
|
||||
"none": "Niciuna",
|
||||
"title": "Alege limba subtitrarilor"
|
||||
"title": "Alege limba subtitrărilor"
|
||||
}
|
||||
},
|
||||
"templates": {
|
||||
"title": "Deschide selectorul de subtitrari"
|
||||
"title": "Deschide selectorul de subtitrări"
|
||||
}
|
||||
},
|
||||
"compact-sidebar": {
|
||||
"description": "Pastreaza bara laterala mereu in modul compact",
|
||||
"name": "Bara laterala compacta"
|
||||
"description": "Păstrează bara laterală mereu în modul compact",
|
||||
"name": "Bara Laterală Compactă"
|
||||
},
|
||||
"crossfade": {
|
||||
"description": "Tranzitioneaza intre cantece",
|
||||
"description": "Tranziționează între melodii",
|
||||
"menu": {
|
||||
"advanced": "Avansat"
|
||||
},
|
||||
"name": "Tranzitie [Beta]",
|
||||
"name": "Tranziție [Beta]",
|
||||
"prompt": {
|
||||
"options": {
|
||||
"multi-input": {
|
||||
"fade-in-duration": "Durata tranzitie de inceput (ms)",
|
||||
"fade-out-duration": "Durata tranzitie de sfarsit (ms)",
|
||||
"fade-in-duration": "Durată tranziție de început (ms)",
|
||||
"fade-out-duration": "Durată tranziției de sfârșit (ms)",
|
||||
"fade-scaling": {
|
||||
"label": "Scala tranzitiei",
|
||||
"linear": "Linear",
|
||||
"label": "Scalare de estompare",
|
||||
"linear": "Liniar",
|
||||
"logarithmic": "Logaritmic"
|
||||
},
|
||||
"seconds-before-end": "Tranzitie N secunde inainte de final"
|
||||
"seconds-before-end": "Tranziție N secunde înainte de final"
|
||||
},
|
||||
"title": "Optiuni de tranzitie"
|
||||
"title": "Opțiuni de tranziție"
|
||||
}
|
||||
}
|
||||
},
|
||||
"disable-autoplay": {
|
||||
"description": "Fa cantecul sa inceapa in modul \"pauza\"",
|
||||
"description": "Face cântecul să înceapă în modul \"pauză\"",
|
||||
"menu": {
|
||||
"apply-once": "Se aplica doar la pornirea aplicatiei"
|
||||
"apply-once": "Se aplică doar la pornirea aplicației"
|
||||
},
|
||||
"name": "Dezactiveaza redarea automata"
|
||||
"name": "Dezactivează redarea automată"
|
||||
},
|
||||
"discord": {
|
||||
"backend": {
|
||||
"already-connected": "S-a incercat conectarea cu o conexiune activa",
|
||||
"already-connected": "S-a încercat conectarea cu o conexiune activă",
|
||||
"connected": "Conectat la Discord",
|
||||
"disconnected": "Deconectat de la Discord"
|
||||
},
|
||||
"description": "Arata-le prietenilor ce asculti cu Rich Presence",
|
||||
"description": "Arată-le prietenilor ce asculți cu Rich Presence",
|
||||
"menu": {
|
||||
"auto-reconnect": "Reconectare automata",
|
||||
"clear-activity": "Sterge activitatea",
|
||||
"clear-activity-after-timeout": "Sterge activitatea dupa timeout",
|
||||
"auto-reconnect": "Reconectare automată",
|
||||
"clear-activity": "Șterge activitatea",
|
||||
"clear-activity-after-timeout": "Șterge activitatea după timeout",
|
||||
"connected": "Conectat",
|
||||
"disconnected": "Deconectat",
|
||||
"hide-duration-left": "Ascunde timpul ramas",
|
||||
"hide-duration-left": "Ascunde timpul rămas",
|
||||
"hide-github-button": "Ascunde butonul cu link-ul GitHub",
|
||||
"play-on-youtube-music": "Reda pe YouTube Music",
|
||||
"set-inactivity-timeout": "Seteaza intervalul de inactivitate"
|
||||
"play-on-youtube-music": "Redă pe YouTube Music",
|
||||
"set-inactivity-timeout": "Setează intervalul de inactivitate"
|
||||
},
|
||||
"name": "Discord Rich Presence",
|
||||
"prompt": {
|
||||
"set-inactivity-timeout": {
|
||||
"label": "Introduceti perioada de inactivitate dorita in secunde:",
|
||||
"title": "Seteaza timpul de inactivitate"
|
||||
"label": "Introduceți perioada de inactivitate dorită în secunde:",
|
||||
"title": "Setează timpul de inactivitate"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -371,74 +425,101 @@
|
||||
"buttons": {
|
||||
"ok": "OK"
|
||||
},
|
||||
"message": "Argh! Scuze, descarcarea a esuat…",
|
||||
"title": "Eroare la descarcare!"
|
||||
"message": "Ah! Scuze, descărcarea a eșuat…",
|
||||
"title": "Eroare la descărcare!"
|
||||
},
|
||||
"start-download-playlist": {
|
||||
"buttons": {
|
||||
"ok": "OK"
|
||||
},
|
||||
"detail": "({{playlistSize}} cantece)",
|
||||
"detail": "({{playlistSize}} melodii)",
|
||||
"message": "Se descarca Playlist-ul {{playlistTitle}}",
|
||||
"title": "Descarcarea a inceput"
|
||||
"title": "Descărcarea a început"
|
||||
}
|
||||
},
|
||||
"feedback": {
|
||||
"conversion-progress": "Conversie: {{percent}}%",
|
||||
"converting": "Se converteste…",
|
||||
"done": "Descarcat: {{filePath}}",
|
||||
"download-info": "Se descarca {{artist}} -{{title}} [{{videoId}}",
|
||||
"download-progress": "Se descarca: {{percent}}%",
|
||||
"downloading": "Se descarca…",
|
||||
"downloading-counter": "Se descarca {{current}}/{{total}}…",
|
||||
"downloading-playlist": "Se descarca playlist-ul \"{{playlistTitle}}\" - {{playlistSize}} piese ({{playlistId}})",
|
||||
"error-while-downloading": "Eroare la descarcarea piesei \"{{author}} - {{title}}\":{{error}}",
|
||||
"folder-already-exists": "Folderul {{playlistFolder}} exista deja",
|
||||
"getting-playlist-info": "Se aduna informatiile despre playlist…",
|
||||
"loading": "Se incarca…",
|
||||
"playlist-has-only-one-song": "Playlist-ul are doar un element, acesta va fi descarcat direct",
|
||||
"playlist-id-not-found": "Niciun ID al playlist-ului nu a fost gasit",
|
||||
"playlist-is-empty": "Playlist-ul este gol",
|
||||
"playlist-is-mix-or-private": "Eroare la colectarea informatiilor despre playlist: asigurati-va ca nu este privat sau un playlist \"Mixed for you\"\n\n{{error}}",
|
||||
"preparing-file": "Se pregateste fisierul…",
|
||||
"saving": "Se salveaza…",
|
||||
"trying-to-get-playlist-id": "Se incearca obtinerea ID-ului playlist-ului: {{playlistId}}",
|
||||
"video-id-not-found": "Video-ul nu a fost gasit",
|
||||
"converting": "Se convertește…",
|
||||
"done": "Descărcat: {{filePath}}",
|
||||
"download-info": "Se descarcă {{artist}} -{{title}} [{{videoId}}",
|
||||
"download-progress": "Se descarcă: {{percent}}%",
|
||||
"downloading": "Se descarcă…",
|
||||
"downloading-counter": "Se descarcă {{current}}/{{total}}…",
|
||||
"downloading-playlist": "Se descarcă lista de redare \"{{playlistTitle}}\" - {{playlistSize}} piese ({{playlistId}})",
|
||||
"error-while-downloading": "Eroare la descarcareă piesei \"{{author}} - {{title}}\":{{error}}",
|
||||
"folder-already-exists": "Dosarul {{playlistFolder}} există deja",
|
||||
"getting-playlist-info": "Se adună informațiile despre lista de redare…",
|
||||
"loading": "Se incarcă…",
|
||||
"playlist-has-only-one-song": "Lista de redare are doar un element, acesta va fi descărcat direct",
|
||||
"playlist-id-not-found": "Niciun ID al listei de redare nu a fost gasit",
|
||||
"playlist-is-empty": "Lista de redare este goală",
|
||||
"playlist-is-mix-or-private": "Eroare la colectarea informațiilor despre lista de redare: asigurați-vă că nu este privat sau o listă de redare \"Mixed for you\"\n\n{{error}}",
|
||||
"preparing-file": "Se pregătește fișierul…",
|
||||
"saving": "Se salvează…",
|
||||
"trying-to-get-playlist-id": "Se încearcă obținerea ID-ului listei de redare: {{playlistId}}",
|
||||
"video-id-not-found": "Videoclipul nu a fost găsit",
|
||||
"writing-id3": "Se scriu tag-urile ID3…"
|
||||
}
|
||||
},
|
||||
"description": "Descarca MP3 / sursa audio direct din interfata",
|
||||
"description": "Descarcă MP3 / sursa audio direct din interfață",
|
||||
"menu": {
|
||||
"choose-download-folder": "Alege folderul de descarcari",
|
||||
"download-playlist": "Descarca playlist-ul",
|
||||
"presets": "Setari implicite",
|
||||
"skip-existing": "Treci peste fisierele existente"
|
||||
"choose-download-folder": "Alege folderul de descărcări",
|
||||
"download-finish-settings": {
|
||||
"label": "Descărcare la finalizare",
|
||||
"prompt": {
|
||||
"last-percent": "După x la sută",
|
||||
"last-seconds": "Ultimele x secunde",
|
||||
"title": "Configurează când să se descarce"
|
||||
},
|
||||
"submenu": {
|
||||
"advanced": "Avansat",
|
||||
"enabled": "Activat",
|
||||
"mode": "Mod timp",
|
||||
"percent": "Procentaj",
|
||||
"seconds": "Secunde"
|
||||
}
|
||||
},
|
||||
"download-playlist": "Descarcă lista de redare",
|
||||
"presets": "Setări implicite",
|
||||
"skip-existing": "Treci peste fișierele existente"
|
||||
},
|
||||
"name": "Downloader",
|
||||
"name": "Descărcător",
|
||||
"renderer": {
|
||||
"can-not-update-progress": "Nu se poate actualiza progresul"
|
||||
},
|
||||
"templates": {
|
||||
"button": "Descarca"
|
||||
"button": "Descarcă"
|
||||
}
|
||||
},
|
||||
"equalizer": {
|
||||
"description": "Adauă un egalizator la player",
|
||||
"menu": {
|
||||
"presets": {
|
||||
"label": "Setări implicite",
|
||||
"list": {
|
||||
"bass-booster": "Amplificator de bas"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Egalizator"
|
||||
},
|
||||
"exponential-volume": {
|
||||
"description": "Fa slider-ul de volum exponential pentru a fi mai usor de selectat volumuri reduse.",
|
||||
"name": "Volum exponential"
|
||||
"description": "Face glisorul de volum exponențial pentru a fi mai ușor de selectat volume reduse.",
|
||||
"name": "Volum exponențial"
|
||||
},
|
||||
"in-app-menu": {
|
||||
"description": "Ofera barelor de meniu un aspect extravagant, intunecat sau de culoarea albumului",
|
||||
"description": "Oferă barelor de meniu un aspect extravagant, întunecat sau de culoarea albumului",
|
||||
"menu": {
|
||||
"hide-dom-window-controls": "Ascunde controalele ferestrei DOM"
|
||||
},
|
||||
"name": "Meniul aplicatiei"
|
||||
"name": "Meniul aplicației"
|
||||
},
|
||||
"lumiastream": {
|
||||
"description": "Adauga asistenta pentru Lumia Stream",
|
||||
"description": "Adaugă asistenta pentru Lumia Stream",
|
||||
"name": "Lumia Stream [Beta]"
|
||||
},
|
||||
"lyrics-genius": {
|
||||
"description": "Adauga versuri pentru majoritatea cantecelor",
|
||||
"description": "Adaugă versuri pentru majoritatea cântecelor",
|
||||
"menu": {
|
||||
"romanized-lyrics": "Versuri romantizate"
|
||||
},
|
||||
@ -448,29 +529,29 @@
|
||||
}
|
||||
},
|
||||
"music-together": {
|
||||
"description": "Impartaseste playlist-ul cu altii. Cand gazda va pune o piesa, toti ceilalti vor auzi acelasi cantec",
|
||||
"description": "Împărtășește lista de redare cu alții. Când gazda va pune o piesă, toți ceilalți vor auzi aceeași melodie",
|
||||
"dialog": {
|
||||
"enter-host": "Introdu ID-ul host-ului"
|
||||
},
|
||||
"internal": {
|
||||
"save": "Salveaza",
|
||||
"save": "Salvează",
|
||||
"track-source": "Sursa piesei",
|
||||
"unknown-user": "Utilizator necunoscut"
|
||||
},
|
||||
"menu": {
|
||||
"click-to-copy-id": "Copiaza ID-ul host-ului",
|
||||
"close": "Inchide Music Together",
|
||||
"connected-users": "Utilizatori conectati",
|
||||
"disconnect": "Deconecteaza Music Together",
|
||||
"click-to-copy-id": "Copiază ID-ul host-ului",
|
||||
"close": "Închide Music Together",
|
||||
"connected-users": "Utilizatori conecțati",
|
||||
"disconnect": "Deconectează Music Together",
|
||||
"empty-user": "Niciun utilizator conectat",
|
||||
"host": "Gazda Music Together",
|
||||
"join": "Alatura-te Music Together",
|
||||
"join": "Alătura-te Music Together",
|
||||
"permission": {
|
||||
"all": "Permite invitatilor sa controleze playlist-ul si player-ul",
|
||||
"host-only": "Doar gazda poate controla playlist-ul si player-ul",
|
||||
"playlist": "Permite invitatilor controlul asupra playlist-ului"
|
||||
"all": "Permite invitaților să controleze lista de redare si player-ul",
|
||||
"host-only": "Doar gazda poate controla lista de redare și player-ul",
|
||||
"playlist": "Permite invitaților controlul asupra listei de redare"
|
||||
},
|
||||
"set-permission": "Schimba controlul permisiunilor",
|
||||
"set-permission": "Schimbă controlul permisiunilor",
|
||||
"status": {
|
||||
"disconnected": "Deconectat",
|
||||
"guest": "Conectat ca invitat",
|
||||
@ -479,63 +560,63 @@
|
||||
},
|
||||
"name": "Music Together [Beta]",
|
||||
"toast": {
|
||||
"add-song-failed": "Adaugarea piesei a esuat",
|
||||
"closed": "Music Together inchis",
|
||||
"add-song-failed": "Adăugarea piesei a eșuat",
|
||||
"closed": "Music Together închis",
|
||||
"disconnected": "Music Together deconectat",
|
||||
"host-failed": "Nu s-a reusit gazduirea Music Together",
|
||||
"id-copied": "ID-ul host-ului a fost copiat in clipboard",
|
||||
"id-copy-failed": "Eroare la copierea ID-ului host-ului in clipboard",
|
||||
"join-failed": "Nu s-a reusit alaturarea la Music Together",
|
||||
"joined": "V-ati alaturat Music Together",
|
||||
"host-failed": "Nu s-a reușit găzduirea Music Together",
|
||||
"id-copied": "ID-ul host-ului a fost copiat în clipboard",
|
||||
"id-copy-failed": "Eroare la copierea ID-ului host-ului în clipboard",
|
||||
"join-failed": "Nu s-a reușit alăturarea la Music Together",
|
||||
"joined": "V-ați alăturat Music Together",
|
||||
"permission-changed": "Permisiunile Music Together s-au schimbat la \"{{permission}}\"",
|
||||
"remove-song-failed": "Eroare la indepartarea cantecului",
|
||||
"user-connected": "{{name}} s-a alaturat la Music Together",
|
||||
"user-disconnected": "{{name}} a parasit Music Together"
|
||||
"remove-song-failed": "Eroare la îndepărtarea melodiei",
|
||||
"user-connected": "{{name}} s-a alăturat la Music Together",
|
||||
"user-disconnected": "{{name}} a părăsit Music Together"
|
||||
}
|
||||
},
|
||||
"navigation": {
|
||||
"description": "Sagetile pentru Urmatorul/Anteriorul integrate direct in interfata, ca in browser-ul tau preferat",
|
||||
"name": "Navigatie"
|
||||
"description": "Săgețile pentru Următorul/Anteriorul integrate direct în interfață, ca în browser-ul tău preferat",
|
||||
"name": "Navigație"
|
||||
},
|
||||
"no-google-login": {
|
||||
"description": "Elimina butonul de autentificare Google si link-urile din interfata",
|
||||
"description": "Elimină butonul de autentificare Google și link-urile din interfață",
|
||||
"name": "Nicio autentificare Google"
|
||||
},
|
||||
"notifications": {
|
||||
"description": "Afiseaza o notificare cand incepe sa cante o piesa (notificarile interactive sunt disponibile pe Windows)",
|
||||
"description": "Afișează o notificare când începe să cânte o piesă (notificările interactive sunt disponibile pe Windows)",
|
||||
"menu": {
|
||||
"interactive": "Notificari interactive",
|
||||
"interactive": "Notificări interactive",
|
||||
"interactive-settings": {
|
||||
"label": "Setari interactive",
|
||||
"label": "Setări interactive",
|
||||
"submenu": {
|
||||
"hide-button-text": "Ascunde textul butoanelor",
|
||||
"refresh-on-play-pause": "Reimprospateaza la Reda/Pauza",
|
||||
"tray-controls": "Deschide/Inchide la apasarea icnoitei pentru meniul Tray"
|
||||
"refresh-on-play-pause": "Reîmprospătează la Redă/Pauză",
|
||||
"tray-controls": "Deschide/Închide la apăsarea iconiței pentru meniul Tray"
|
||||
}
|
||||
},
|
||||
"priority": "Prioritatea notificarilor",
|
||||
"toast-style": "Stilul notificarilor",
|
||||
"unpause-notification": "Arata notificarile la pauza"
|
||||
"priority": "Prioritatea notificărilor",
|
||||
"toast-style": "Stilul notificărilor",
|
||||
"unpause-notification": "Arată notificările la pauză"
|
||||
},
|
||||
"name": "Notificari"
|
||||
"name": "Notificări"
|
||||
},
|
||||
"picture-in-picture": {
|
||||
"description": "Permite sa schimbi aplicatie la modul picture-in-picture",
|
||||
"description": "Permite să schimbi aplicația la modul picture-in-picture",
|
||||
"menu": {
|
||||
"always-on-top": "Mereu deasupra",
|
||||
"hotkey": {
|
||||
"label": "Scurtaturi pe tastatura",
|
||||
"label": "Scurtături pe tastatură",
|
||||
"prompt": {
|
||||
"keybind-options": {
|
||||
"hotkey": "Scurtaturi din taste"
|
||||
"hotkey": "Scurtături din taste"
|
||||
},
|
||||
"label": "Scurtaturi din taste pentru picture-in-picture",
|
||||
"title": "Scurtatura Picture-in-picture"
|
||||
"label": "Alege tasta pentru picture-in-picture",
|
||||
"title": "Scurtătura Picture-in-picture"
|
||||
}
|
||||
},
|
||||
"save-window-position": "Salveaza pozitia ferestrei",
|
||||
"save-window-size": "Salveaza marimea ferestrei",
|
||||
"use-native-pip": "Foloseste PiP-ul nativ pentru broswer"
|
||||
"save-window-position": "Salvează poziția ferestrei",
|
||||
"save-window-size": "Salvează mărimea ferestrei",
|
||||
"use-native-pip": "Folosește PiP-ul nativ pentru broswer"
|
||||
},
|
||||
"name": "Picture-in-picture",
|
||||
"templates": {
|
||||
@ -543,31 +624,31 @@
|
||||
}
|
||||
},
|
||||
"playback-speed": {
|
||||
"description": "Asculta rapid, asculta lent! Adauga un slider pentru viteza de redare a cantecului",
|
||||
"description": "Ascultă rapid, ascultă lent! Adaugă un slider pentru viteza de redare a melodiei",
|
||||
"name": "Viteza de redare",
|
||||
"templates": {
|
||||
"button": "Viteza"
|
||||
"button": "Viteză"
|
||||
}
|
||||
},
|
||||
"precise-volume": {
|
||||
"description": "Controleaza volumul precis folosind rotita mouse-ului/scurtaturi din tastatura, cu un HUD personalizat si incremente de volum personalizate",
|
||||
"description": "Controlează volumul precis folosind rotița mouse-ului/scurtăturii din tastatură, cu un HUD personalizat și incremente de volum personalizate",
|
||||
"menu": {
|
||||
"arrows-shortcuts": "Control cu tastele sageti locale",
|
||||
"custom-volume-steps": "Seteaza incrementele de volum",
|
||||
"global-shortcuts": "Scurtaturi de tastatura globale"
|
||||
"arrows-shortcuts": "Control cu tastele-săgeți locale",
|
||||
"custom-volume-steps": "Setează incrementele de volum",
|
||||
"global-shortcuts": "Scurtături de tastatură globale"
|
||||
},
|
||||
"name": "Volum precis",
|
||||
"prompt": {
|
||||
"global-shortcuts": {
|
||||
"keybind-options": {
|
||||
"decrease": "Redu volumul audio",
|
||||
"increase": "Creste volumul audio"
|
||||
"increase": "Crește volumul audio"
|
||||
},
|
||||
"label": "Alege combinatiile de taste globale pentru volumul audio:",
|
||||
"title": "Combinatii globale de taste pentru volum"
|
||||
"label": "Alege combinațiile de taste globale pentru volumul audio:",
|
||||
"title": "Combinații globale de taste pentru volum"
|
||||
},
|
||||
"volume-steps": {
|
||||
"label": "Alege pasii de increment pentru volum audio",
|
||||
"label": "Alege pașii de increment pentru volum audio",
|
||||
"title": "Incremente de volum"
|
||||
}
|
||||
}
|
||||
@ -576,28 +657,28 @@
|
||||
"backend": {
|
||||
"dialog": {
|
||||
"quality-changer": {
|
||||
"detail": "Calitate actuala: {{quality}}",
|
||||
"message": "Alegeti calitatea video:",
|
||||
"title": "Alegeti calitatea video"
|
||||
"detail": "Calitate actuală: {{quality}}",
|
||||
"message": "Alegeți calitatea video:",
|
||||
"title": "Alegeți calitatea video"
|
||||
}
|
||||
}
|
||||
},
|
||||
"description": "Permite schimbarea calitatii video cu un buton prezent peste video",
|
||||
"name": "Modificator de calitate video"
|
||||
"description": "Permite schimbarea calității video cu un buton prezent peste video",
|
||||
"name": "Schimbător de calitate video"
|
||||
},
|
||||
"scrobbler": {
|
||||
"description": "Adauga asistenta pentru scrobbling (etc. last.fm, Listenbrainz)",
|
||||
"description": "Adaugă asistenta pentru scrobbling (etc. last.fm, Listenbrainz)",
|
||||
"dialog": {
|
||||
"lastfm": {
|
||||
"auth-failed": {
|
||||
"message": "Autentificarea cu Last.fm a esuat\nAscunde acest pop-up pana la urmatoarea repornire.",
|
||||
"title": "Autentificare Esuata"
|
||||
"message": "Autentificarea cu Last.fm a eșuat\nAscunde acest pop-up până la următoarea repornire.",
|
||||
"title": "Autentificare Eșuată"
|
||||
}
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"lastfm": {
|
||||
"api-settings": "Setari pentru API-ul Last.fm"
|
||||
"api-settings": "Setări pentru API-ul Last.fm"
|
||||
},
|
||||
"listenbrainz": {
|
||||
"token": "Introdu token-ul de utilizator ListenBrainz"
|
||||
@ -612,49 +693,105 @@
|
||||
},
|
||||
"listenbrainz": {
|
||||
"token": {
|
||||
"label": "Introdu token-ul tau de utilizator ListenBrainz:",
|
||||
"label": "Introdu token-ul tău de utilizator ListenBrainz:",
|
||||
"title": "Token-ul ListenBrainz"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"shortcuts": {
|
||||
"description": "Permite setari globale pentru scurtaturi pe tastatura pentru playback (reda/pauza/urmatorul/anteriorul), pentru oprirea media OSD prin suprascriera tastelor media, pentru folosirea combinatiei Ctrl/CMD + F pentru a cauta, pentru asistenta Linux MPRIS pentru taste media si pentru scurtaturi perosnalizate pentru utilizatori avansati",
|
||||
"description": "Permite setari globale pentru scurtături pe tastatură pentru redare (redă/pauză/următorul/anteriorul) și pentru oprirea media OSD prin suprascriera tastelor media, pentru folosirea combinației Ctrl/CMD + F pentru a căuta, pentru pornirea asistenței Linux MPRIS pentru taste media și pentru scurtături personalizate pentru utilizatori avansați",
|
||||
"menu": {
|
||||
"override-media-keys": "Suprascrie tastele media",
|
||||
"set-keybinds": "Seteaza scurtaturile globale pentru cantece"
|
||||
"set-keybinds": "Setează scurtăturile globale pentru melodii"
|
||||
},
|
||||
"name": "Scurtaturi (& MPRIS)",
|
||||
"name": "Scurtături (& MPRIS)",
|
||||
"prompt": {
|
||||
"keybind": {
|
||||
"keybind-options": {
|
||||
"next": "Urmatorul",
|
||||
"play-pause": "Reda / Pauza",
|
||||
"next": "Următorul",
|
||||
"play-pause": "Redă / Pauză",
|
||||
"previous": "Anteriorul"
|
||||
},
|
||||
"label": "Alege combinatia de taste globala pentru controlul cantecelor:",
|
||||
"title": "Scurtaturi pe tastatura globale"
|
||||
"label": "Alege combinația de taste globală pentru controlul melodiilor:",
|
||||
"title": "Scurtături pe tastatură globale"
|
||||
}
|
||||
}
|
||||
},
|
||||
"skip-disliked-songs": {
|
||||
"description": "Sari peste cantecele disliked",
|
||||
"name": "Treci peste cantecele disliked"
|
||||
"description": "Sari peste melodiile neplăcute",
|
||||
"name": "Treci peste melodiile neplăcute"
|
||||
},
|
||||
"skip-silences": {
|
||||
"description": "Treci automat peste sectiunile de liniste din cantece",
|
||||
"name": "Treci peste liniste"
|
||||
"description": "Treci automat peste secțiunile de liniște din melodii",
|
||||
"name": "Treci peste liniște"
|
||||
},
|
||||
"sponsorblock": {
|
||||
"description": "Treci automat peste partile non-muzicale precum intro/outro sau parti din video-ul catecului, cand nu se aude cantecul",
|
||||
"description": "Treci automat peste părțile non-muzicale precum intro/outro sau părți din video-ul melodiei, când nu se aude melodia",
|
||||
"name": "SponsorBlock"
|
||||
},
|
||||
"synced-lyrics": {
|
||||
"description": "Furnizează versuri sincronizate melodiilor, folosind furnizori precum LRClib.",
|
||||
"errors": {
|
||||
"fetch": "⚠️ - A apărut o eroare în timpul încărcării versurilor. \nTe rog încearcă din nou mai târziu.",
|
||||
"not-found": "⚠️ Nu au fost găsite versuri pentru această melodie."
|
||||
},
|
||||
"menu": {
|
||||
"default-text-string": {
|
||||
"label": "Caracter implicit între versuri",
|
||||
"tooltip": "Alege caracterul implicit folosit pentru spațiul dintre versuri"
|
||||
},
|
||||
"line-effect": {
|
||||
"label": "Efect de linie",
|
||||
"submenu": {
|
||||
"fancy": {
|
||||
"tooltip": "Folosește efecte largi pe linia curentă"
|
||||
},
|
||||
"focus": {
|
||||
"label": "Focalizare",
|
||||
"tooltip": "Doar linia curentă este albă"
|
||||
},
|
||||
"offset": {
|
||||
"label": "Deplasare",
|
||||
"tooltip": "Deplasare la dreapta pentru linia curentă"
|
||||
},
|
||||
"scale": {
|
||||
"label": "Mărime",
|
||||
"tooltip": "Schimbă dimensiunea liniei curente"
|
||||
}
|
||||
},
|
||||
"tooltip": "Alege efectul aplicat liniei curente"
|
||||
},
|
||||
"precise-timing": {
|
||||
"label": "Sincronizează versurile perfect",
|
||||
"tooltip": "Calculează afisarea următoarei linii până la milisecundă (poate afecta performanța)"
|
||||
},
|
||||
"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."
|
||||
},
|
||||
"show-time-codes": {
|
||||
"label": "Afișează codurile de timp",
|
||||
"tooltip": "Afișează codurile de timp lângă versuri"
|
||||
}
|
||||
},
|
||||
"name": "Versuri Sincronizate",
|
||||
"refetch-btn": {
|
||||
"fetching": "Încărcare...",
|
||||
"normal": "Reîncărcare versuri"
|
||||
},
|
||||
"warnings": {
|
||||
"duration-mismatch": "⚠️ - Versurile pot fi desincronizate din cauza unei nepotriviri de durație.",
|
||||
"inexact": "⚠️ - Versurile pentru această melodie pot fi inexacte",
|
||||
"instrumental": "⚠️ - Această melodie este instrumentală"
|
||||
}
|
||||
},
|
||||
"taskbar-mediacontrol": {
|
||||
"description": "Controleaza redarea din Bara de Activitati Windows",
|
||||
"description": "Controlează redarea din Bara de Activități Windows",
|
||||
"name": "Control media in Bara de Activitate"
|
||||
},
|
||||
"touchbar": {
|
||||
"description": "Adauga un widget TouchBar pentru utilizatorii macOS",
|
||||
"description": "Adaugă un widget TouchBar pentru utilizatorii macOS",
|
||||
"name": "TouchBar"
|
||||
},
|
||||
"tuna-obs": {
|
||||
@ -662,17 +799,17 @@
|
||||
"name": "Tuna OBS"
|
||||
},
|
||||
"video-toggle": {
|
||||
"description": "Adauga un buton ce schimba intre modurile Video/Cantec. se poate optional elimia complet optiunea video",
|
||||
"description": "Adaugă un buton ce schimbă între modurile Video/Melodie. De asemenea se poate elimina opțional toată fila video",
|
||||
"menu": {
|
||||
"align": {
|
||||
"label": "Aliniere",
|
||||
"submenu": {
|
||||
"left": "Stanga",
|
||||
"left": "Stânga",
|
||||
"middle": "Mijloc",
|
||||
"right": "Dreapta"
|
||||
}
|
||||
},
|
||||
"force-hide": "Forteaza eliminarea tab-ului video",
|
||||
"force-hide": "Forțează eliminarea filei video",
|
||||
"mode": {
|
||||
"label": "Mod",
|
||||
"submenu": {
|
||||
@ -684,15 +821,15 @@
|
||||
},
|
||||
"name": "Comutator video",
|
||||
"templates": {
|
||||
"button": "Cantec"
|
||||
"button": "Melodie"
|
||||
}
|
||||
},
|
||||
"visualizer": {
|
||||
"description": "Adauga un visualizer la player",
|
||||
"description": "Adaugă un vizualizator la player",
|
||||
"menu": {
|
||||
"visualizer-type": "Tip de visualizer"
|
||||
"visualizer-type": "Tip de vizualizator"
|
||||
},
|
||||
"name": "Visualizer"
|
||||
"name": "Vizualizator"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -207,6 +207,10 @@
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"ad-speedup": {
|
||||
"description": "Если воспроизводится реклама, аудио заглушается и скорость воспроизведения устанавливается на 16х",
|
||||
"name": "Ускоренная перемотка"
|
||||
},
|
||||
"adblocker": {
|
||||
"description": "Блокируйте всю рекламу и трекинг сразу после установки",
|
||||
"menu": {
|
||||
@ -275,9 +279,59 @@
|
||||
},
|
||||
"name": "Режим Ambient"
|
||||
},
|
||||
"amuse": {
|
||||
"description": "Добавляет поддержку виджета Amuse „сейчас играет“ от 6K Labs",
|
||||
"name": "Amuse",
|
||||
"response": {
|
||||
"query": "Сервер Amuse API запущен. GET /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": "Введите имя хоста (на подобии 0.0.0.0) для API сервера:",
|
||||
"title": "Имя хоста"
|
||||
},
|
||||
"port": {
|
||||
"label": "Введите порт для API сервера:",
|
||||
"title": "Порт"
|
||||
}
|
||||
}
|
||||
},
|
||||
"audio-compressor": {
|
||||
"description": "Применяет компрессию к аудио (уменьшает громкость самых громких частей сигнала и повышает громкость самых тихих частей)",
|
||||
"name": "Аудио компрессор"
|
||||
"name": "Нормализация аудио"
|
||||
},
|
||||
"blur-nav-bar": {
|
||||
"description": "Делает панель навигации прозрачной и размытой",
|
||||
@ -410,6 +464,21 @@
|
||||
"description": "Скачивать MP3 / исходное аудио напрямую из интерфейса",
|
||||
"menu": {
|
||||
"choose-download-folder": "Выберите папку для загрузок",
|
||||
"download-finish-settings": {
|
||||
"label": "Скачать по завершению",
|
||||
"prompt": {
|
||||
"last-percent": "После х процентов",
|
||||
"last-seconds": "Осталось x сек",
|
||||
"title": "Условия скачивания"
|
||||
},
|
||||
"submenu": {
|
||||
"advanced": "Расширенные настройки",
|
||||
"enabled": "Включено",
|
||||
"mode": "Режим по времени",
|
||||
"percent": "Процент",
|
||||
"seconds": "Секунды"
|
||||
}
|
||||
},
|
||||
"download-playlist": "Скачать плейлист",
|
||||
"presets": "Пресеты",
|
||||
"skip-existing": "Пропускать уже существующие файлы"
|
||||
@ -422,6 +491,18 @@
|
||||
"button": "Скачать"
|
||||
}
|
||||
},
|
||||
"equalizer": {
|
||||
"description": "Добавляет эквалайзер к плееру",
|
||||
"menu": {
|
||||
"presets": {
|
||||
"label": "Предустановки",
|
||||
"list": {
|
||||
"bass-booster": "Усилитель баса"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Эквалайзер"
|
||||
},
|
||||
"exponential-volume": {
|
||||
"description": "Делает слайдер громкости расширенным чтобы было легче понижать громкость.",
|
||||
"name": "Расширенная громкость"
|
||||
@ -590,7 +671,7 @@
|
||||
"dialog": {
|
||||
"lastfm": {
|
||||
"auth-failed": {
|
||||
"message": "Не удалось войти с помощью Last.fm\nСкрыть сообщение до следующего запуска",
|
||||
"message": "Не удалось войти с помощью Last.fm\nСкрыть сообщение до следующего запуска.",
|
||||
"title": "Ошибка аунтефикации"
|
||||
}
|
||||
}
|
||||
@ -649,6 +730,63 @@
|
||||
"description": "Автоматически пропускает не музыкальные фрагменты, например интро/аутро или фрагменты музыкальных клипов, в которых песня не звучит (тишина)",
|
||||
"name": "SponsorBlock"
|
||||
},
|
||||
"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": "До миллисекунды рассчитывает отображение следующей строки(может оказать небольшое влияние на производительность)"
|
||||
},
|
||||
"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": "Управляйте воспроизведением с панели задач Windows",
|
||||
"name": "Управление мультимедиа на панели задач"
|
||||
@ -692,7 +830,7 @@
|
||||
"menu": {
|
||||
"visualizer-type": "Вид визуализации"
|
||||
},
|
||||
"name": "Визуалайзер"
|
||||
"name": "Визуализатор"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -7,14 +7,98 @@
|
||||
"initialize-failed": "\"{{pluginName}}\" ප්ලගිනය ආරම්භ කිරීමට අසමත් විය",
|
||||
"load-all": "සියලුම ප්ලගින පූරණය කරමින්",
|
||||
"load-failed": "\"{{pluginName}}\" ප්ලගිනය පූරණය කිරීමට අසමත් විය",
|
||||
"loaded": "ප්ලගිනය \"{{pluginName}}\" පූරණය කරන ලදී"
|
||||
"loaded": "ප්ලගිනය \"{{pluginName}}\" පූරණය කරන ලදී",
|
||||
"unload-failed": "ප්ලගින් \"{{pluginName}}\" ගලවන්න අසාර්ථක වුන",
|
||||
"unloaded": "ප්ලගින් \"{{pluginName}}\" ගැලෙව්වා"
|
||||
}
|
||||
}
|
||||
},
|
||||
"language": {
|
||||
"code": "si",
|
||||
"local-name": "සිංහල",
|
||||
"name": "Sinhala"
|
||||
},
|
||||
"main": {
|
||||
"console": {
|
||||
"did-finish-load": {
|
||||
"dev-tools": "පූරණය සම්පුර්නි. ඩෙව්ටූල්ස් ඇරිලා"
|
||||
},
|
||||
"i18n": {
|
||||
"loaded": "i18n පූරණය කර ඇත"
|
||||
},
|
||||
"second-instance": {
|
||||
"receive-command": "ප්රෝටෝකාල් හරහා විධානය ලැබුණි: \"{{command}}\""
|
||||
},
|
||||
"theme": {
|
||||
"css-file-not-found": "සීඑස්එස් ගොනුව \"{{cssFile}}\" නොපවතී, නොසලකා හැරීම"
|
||||
},
|
||||
"unresponsive": {
|
||||
"details": "ප්රතිචාර නොදක්වන දෝෂයක් {{error}}"
|
||||
},
|
||||
"when-ready": {
|
||||
"clearing-cache-after-20s": "යෙදුම් කෑශ් නිදහස් කරමින්"
|
||||
}
|
||||
},
|
||||
"dialog": {
|
||||
"hide-menu-enabled": {
|
||||
"detail": "මෙනුව සැගවී ඇත, 'Alt' යතුර නැවත පෙන්වීමට භාවිතා කරන්න. (හෝ In-App මෙනුවේ '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": "යොමුව පිටපත් කරගන්න",
|
||||
"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 සකසන්න"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
"console": {
|
||||
"plugins": {
|
||||
"execute-failed": "Napaka pri inicilizaciji dodatka {{pluginName}}::{{contextName}}",
|
||||
"executed-at-ms": "Dodatek {{pluginName}}::{{contextName}} izvešen pri {{ms}}ms",
|
||||
"executed-at-ms": "Dodatek {{pluginName}}::{{contextName}} izvršen pri {{ms}}ms",
|
||||
"initialize-failed": "Napaka pri inicilizaciji dodatka \"{{pluginName}}\"",
|
||||
"load-all": "Nalaganje dodatkov",
|
||||
"load-failed": "Napaka pri nalaganju dodatka \"{{pluginName}}\"",
|
||||
@ -36,7 +36,7 @@
|
||||
"details": "Neodzivna napaka!\n{{error}}"
|
||||
},
|
||||
"when-ready": {
|
||||
"clearing-cache-after-20s": "Čiščenje predpolnilnika"
|
||||
"clearing-cache-after-20s": "Čiščenje predpomnilnika"
|
||||
},
|
||||
"window": {
|
||||
"tried-to-render-offscreen": "Okno se je poskusilo prikazati izven ekrana, windowSize={{windowSize}}, displaySize={{displaySize}}, position={{position}}"
|
||||
@ -46,13 +46,14 @@
|
||||
"hide-menu-enabled": {
|
||||
"detail": "Meni je skrit, pritisni 'Alt' za odpiranje (ali 'Escape' če uporabljaš In-App Meni)",
|
||||
"message": "Skriti meni je prižgan",
|
||||
"title": "Skrij meni uklopljen"
|
||||
"title": "Skrij meni vklopljen"
|
||||
},
|
||||
"need-to-restart": {
|
||||
"buttons": {
|
||||
"later": "Kasneje",
|
||||
"restart-now": "Ponovno zaženi zdaj"
|
||||
},
|
||||
"detail": "\"{{pluginName}}\" dodatek potrebuje ponovni zagon za začetek",
|
||||
"detail": "\"{{pluginName}}\" dodatek potrebuje ponovni zagon",
|
||||
"message": "\"{{pluginName}}\" je potrebno ponovno zagnati",
|
||||
"title": "Potreben je ponovni zagon"
|
||||
},
|
||||
@ -62,7 +63,7 @@
|
||||
"relaunch": "Ponovno zaženi",
|
||||
"wait": "Počakaj"
|
||||
},
|
||||
"detail": "Opravičujemo se za neprijetnost! Prosim odločite se kaj narediti:",
|
||||
"detail": "Opravičujemo se za nevšečnost! Prosim odločite se kaj narediti:",
|
||||
"message": "Aplikacija se ne odziva",
|
||||
"title": "Okno se ne odziva"
|
||||
},
|
||||
@ -82,7 +83,7 @@
|
||||
"navigation": {
|
||||
"label": "Navigacija",
|
||||
"submenu": {
|
||||
"copy-current-url": "Kopiraj trenuten URL",
|
||||
"copy-current-url": "Kopiraj trenutni URL",
|
||||
"go-back": "Nazaj",
|
||||
"go-forward": "Naprej",
|
||||
"quit": "Izhod",
|
||||
@ -95,7 +96,7 @@
|
||||
"advanced-options": {
|
||||
"label": "Dodatne nastavitve",
|
||||
"submenu": {
|
||||
"auto-reset-app-cache": "Resetiraj predpolnilnik aplikacije ob zagonu",
|
||||
"auto-reset-app-cache": "Resetiraj predpomnilnik aplikacije ob zagonu",
|
||||
"disable-hardware-acceleration": "Izklopi strojno pospeševanje",
|
||||
"edit-config-json": "Spremeni config.json",
|
||||
"override-user-agent": "Prepiši User-Agent",
|
||||
@ -103,7 +104,7 @@
|
||||
"set-proxy": {
|
||||
"label": "Nastavi proxy",
|
||||
"prompt": {
|
||||
"label": "Napiši naslov Proxy: (pusti prazno, da izklopiš)",
|
||||
"label": "Napiši Proxy naslov: (pusti prazno, da izklopiš)",
|
||||
"placeholder": "Primer: SOCKS5://127.0.0.1:9999",
|
||||
"title": "Nastavi Proxy"
|
||||
}
|
||||
@ -115,7 +116,7 @@
|
||||
"auto-update": "Avtomatsko posodobi",
|
||||
"hide-menu": {
|
||||
"dialog": {
|
||||
"message": "Meni se bo skrit pri naslednjem zagonu, uporabi [Alt] da se prikaže (ali [`] v in-app-menu)",
|
||||
"message": "Meni se bo skrit pri naslednjem zagonu, uporabi [Alt] da se prikaže (ali [`] v meniju aplikacije)",
|
||||
"title": "Skrij meni vklopljen"
|
||||
},
|
||||
"label": "Skrij meni"
|
||||
@ -127,12 +128,12 @@
|
||||
},
|
||||
"label": "Jezik",
|
||||
"submenu": {
|
||||
"to-help-translate": "Želiš pomagati prevediti? Klikni tukaj"
|
||||
"to-help-translate": "Želiš pomagati pri prevajanju? Klikni tukaj"
|
||||
}
|
||||
},
|
||||
"resume-on-start": "Predvajaj zadnjo pesem, ko se aplikacija prižge",
|
||||
"resume-on-start": "Predvajaj zadnjo pesem, ko se aplikacija zažene",
|
||||
"single-instance-lock": "Zaklep ene instance",
|
||||
"start-at-login": "Prižgi pri zagonu",
|
||||
"start-at-login": "Zaženi pri zagonu",
|
||||
"starting-page": {
|
||||
"label": "Začetna stran",
|
||||
"unset": "Ni nastavljeno"
|
||||
@ -153,7 +154,7 @@
|
||||
"default": "Privzeto",
|
||||
"force-show": "Prisilno pokaži",
|
||||
"hide": "Skrij",
|
||||
"label": "Gumb všeč mi je"
|
||||
"label": "Gumbi za všečkanje"
|
||||
},
|
||||
"remove-upgrade-button": "Odstrani gumb za nadgradnjo",
|
||||
"theme": {
|
||||
@ -162,8 +163,8 @@
|
||||
"cancel": "Prekliči",
|
||||
"remove": "Odstrani"
|
||||
},
|
||||
"remove-theme": "Ali želite odstraniti poljubno temo?",
|
||||
"remove-theme-message": "Poljubna tema bo odtranjena"
|
||||
"remove-theme": "Ali želite odstraniti temo po meri?",
|
||||
"remove-theme-message": "Tema po meri bo odstranjena"
|
||||
},
|
||||
"label": "Tema",
|
||||
"submenu": {
|
||||
@ -206,12 +207,16 @@
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"ad-speedup": {
|
||||
"description": "Če se predvaja oglas se zvok utišja. Prav tako se hitrost predvajanja nastavi na 16 krat",
|
||||
"name": "Pospeševanje oglasov"
|
||||
},
|
||||
"adblocker": {
|
||||
"description": "Izklopi vse oglase od začetka",
|
||||
"description": "Izklopi vse oglase in sledenje",
|
||||
"menu": {
|
||||
"blocker": "Blocker"
|
||||
"blocker": "Blokator"
|
||||
},
|
||||
"name": "Ad Blocker"
|
||||
"name": "Blokator reklam"
|
||||
},
|
||||
"album-actions": {
|
||||
"description": "Doda Undislike, Dislike, Like, in Unlike gumbe vsem glasbam v seznamu predvajanja ali albumu",
|
||||
@ -221,31 +226,31 @@
|
||||
"description": "Doda dinamično temo in vizualne efekte glede na barve albuma",
|
||||
"menu": {
|
||||
"color-mix-ratio": {
|
||||
"label": "Raznerje barv",
|
||||
"label": "Razmerje barv",
|
||||
"submenu": {
|
||||
"percent": "{{ratio}}%"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Tema Brav Albuma"
|
||||
"name": "Barvna tema Albuma"
|
||||
},
|
||||
"ambient-mode": {
|
||||
"description": "Doda bravn efekt iz video posnetka na ozadje",
|
||||
"description": "Doda barvni učinek iz video posnetka na ozadje",
|
||||
"menu": {
|
||||
"blur-amount": {
|
||||
"label": "količina zameglitve",
|
||||
"label": "Stopnja zameglitve",
|
||||
"submenu": {
|
||||
"pixels": "{{blurAmount}} pikslov"
|
||||
}
|
||||
},
|
||||
"buffer": {
|
||||
"label": "Medpolnilnik",
|
||||
"label": "Medpomnilnik",
|
||||
"submenu": {
|
||||
"buffer": "{{buffer}}"
|
||||
}
|
||||
},
|
||||
"opacity": {
|
||||
"label": "Nepreglednost",
|
||||
"label": "Prozornost",
|
||||
"submenu": {
|
||||
"percent": "{{opacity}}%"
|
||||
}
|
||||
@ -269,11 +274,54 @@
|
||||
}
|
||||
},
|
||||
"use-fullscreen": {
|
||||
"label": "Uporablja cel zaslon"
|
||||
"label": "Uporablja celoten zaslon"
|
||||
}
|
||||
},
|
||||
"name": "Ambienten način"
|
||||
},
|
||||
"api-server": {
|
||||
"description": "Doda API strežnik za nadzor predvajalnika",
|
||||
"dialog": {
|
||||
"request": {
|
||||
"buttons": {
|
||||
"allow": "Dovoli",
|
||||
"deny": "Zavrni"
|
||||
},
|
||||
"message": "Dovolite {{ID}} ({{origin}}) da dostopa do API-ja?",
|
||||
"title": "Prošnja za avtomatizacijo API-ja"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"auth-strategy": {
|
||||
"label": "Strategija avtorizacije",
|
||||
"submenu": {
|
||||
"auth-at-first": {
|
||||
"label": "Avtorizacija ob prvem zahtevku"
|
||||
},
|
||||
"none": {
|
||||
"label": "Ni avtorizacije"
|
||||
}
|
||||
}
|
||||
},
|
||||
"hostname": {
|
||||
"label": "Hostname"
|
||||
},
|
||||
"port": {
|
||||
"label": "Port"
|
||||
}
|
||||
},
|
||||
"name": "API strežnik [Beta]",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "Vnesite hostname (npr. 0.0.0.0) za API strežnik:",
|
||||
"title": "Hostname"
|
||||
},
|
||||
"port": {
|
||||
"label": "Vnesite port za API strežnik:",
|
||||
"title": "Port"
|
||||
}
|
||||
}
|
||||
},
|
||||
"audio-compressor": {
|
||||
"description": "Doda kompresijo zvoka (izenači ravni zvoka, zniža glasnost najglasnejših delov in zviša najtišje)",
|
||||
"name": "Kompresija zvoka"
|
||||
@ -289,7 +337,7 @@
|
||||
"captions-selector": {
|
||||
"description": "Izberi podnapise za YouTube Music zvočne posnetke",
|
||||
"menu": {
|
||||
"autoload": "Avtomatsko uporabi zanje izbrane podnapise",
|
||||
"autoload": "Avtomatsko uporabi zadnje izbrane podnapise",
|
||||
"disable-captions": "Avtomatsko brez podnapisov"
|
||||
},
|
||||
"name": "Izberi podnapise",
|
||||
@ -301,7 +349,7 @@
|
||||
}
|
||||
},
|
||||
"templates": {
|
||||
"title": "Odpri izbir podnapisov"
|
||||
"title": "Odpri izbiro podnapisov"
|
||||
}
|
||||
},
|
||||
"compact-sidebar": {
|
||||
@ -320,15 +368,186 @@
|
||||
"fade-in-duration": "Čas zbledenja (v pesem) (ms)",
|
||||
"fade-out-duration": "Čas zbledenja (izven pesemi) (ms)",
|
||||
"fade-scaling": {
|
||||
"label": "Fade scaling",
|
||||
"label": "Zbledi skaliranje",
|
||||
"linear": "Linearno",
|
||||
"logarithmic": "Logaritmično"
|
||||
},
|
||||
"seconds-before-end": "Crossfade N seconds before end"
|
||||
"seconds-before-end": "Bledenje (crossfade) N sekund pred koncem"
|
||||
},
|
||||
"title": "Možnosti zbledenja"
|
||||
}
|
||||
}
|
||||
},
|
||||
"disable-autoplay": {
|
||||
"description": "Začne pesem v zaustavljenem načinu",
|
||||
"menu": {
|
||||
"apply-once": "Uporabi samo ob zagonu"
|
||||
},
|
||||
"name": "Onemogoči samodejno predvajanje"
|
||||
},
|
||||
"discord": {
|
||||
"backend": {
|
||||
"already-connected": "Poizkus povezave z aktivno povezavo",
|
||||
"connected": "Povezan na Discord",
|
||||
"disconnected": "Povezava z Discord-om prekinjena"
|
||||
},
|
||||
"description": "Pokaži svojim prijateljem kaj poslušaš z bogato prisotnostjo (Rich Presence)",
|
||||
"menu": {
|
||||
"auto-reconnect": "Samodejna unovična povezava",
|
||||
"clear-activity": "Počisti dejavnost",
|
||||
"clear-activity-after-timeout": "Počisti dejavnost po časovni omejitvi",
|
||||
"connected": "Povezan",
|
||||
"disconnected": "Prekinjena povezava",
|
||||
"hide-duration-left": "Skrij preostali čas",
|
||||
"hide-github-button": "Skrij povezavo do GitHub-a",
|
||||
"play-on-youtube-music": "Predvajaj v YouTube Music",
|
||||
"set-inactivity-timeout": "Nastavite časovno omejitev neaktivnosti"
|
||||
},
|
||||
"name": "Discord bogata prisotnost (Rich Presence)",
|
||||
"prompt": {
|
||||
"set-inactivity-timeout": {
|
||||
"label": "Vnesite časovno omejitev neaktivnosti v sekundah:",
|
||||
"title": "Nastavite časovno omejitev nedejavnosti"
|
||||
}
|
||||
}
|
||||
},
|
||||
"downloader": {
|
||||
"backend": {
|
||||
"dialog": {
|
||||
"error": {
|
||||
"buttons": {
|
||||
"ok": "OK"
|
||||
},
|
||||
"message": "Uff! Se opravičujemo, prenos neuspešen…",
|
||||
"title": "Napaka v prenosu!"
|
||||
},
|
||||
"start-download-playlist": {
|
||||
"buttons": {
|
||||
"ok": "OK"
|
||||
},
|
||||
"detail": "({{playlistSize}} pesmi)",
|
||||
"message": "Prenašanje seznama {{playlistTitle}}",
|
||||
"title": "Prenos se je začel"
|
||||
}
|
||||
},
|
||||
"feedback": {
|
||||
"conversion-progress": "Konverzija: {{percent}}%",
|
||||
"converting": "Pretvarjanje…",
|
||||
"done": "Končano: {{filePath}}",
|
||||
"download-info": "Prenašanje {{artist}} - {{title}} [{{videoId}}",
|
||||
"download-progress": "Prenos: {{percent}}%",
|
||||
"downloading": "Prenašanje…",
|
||||
"downloading-counter": "Prenašanje {{current}}/{{total}}…",
|
||||
"downloading-playlist": "Prenašanje seznama \"{{playlistTitle}}\" - {{playlistSize}} pesmi ({{playlistId}})",
|
||||
"error-while-downloading": "Napaka pri prenosu \"{{author}} - {{title}}\": {{error}}",
|
||||
"folder-already-exists": "Ta mapa {{playlistFolder}} že obstaja",
|
||||
"getting-playlist-info": "Pridobivam informacije o seznamu…",
|
||||
"loading": "Nalaganje…",
|
||||
"playlist-has-only-one-song": "Ta seznam ima samo eno pesem, uporabljam direkten prenos",
|
||||
"playlist-id-not-found": "ID seznama ni najden",
|
||||
"playlist-is-empty": "Seznam je prazen",
|
||||
"playlist-is-mix-or-private": "Napaka v pridobivanju informacij o seznamu: poskrbite da seznam ni zaseben ali \"Mixed for you\" seznam\n\n{{error}}",
|
||||
"preparing-file": "Pripravljanje datoteke…",
|
||||
"saving": "Shranjujem…",
|
||||
"trying-to-get-playlist-id": "Poizkušam pridobiti ID seznama: {{playlistId}}",
|
||||
"video-id-not-found": "Videoposnetek ni najden",
|
||||
"writing-id3": "Zapisujem ID3 oznake…"
|
||||
}
|
||||
},
|
||||
"description": "Prenese MP3 / izviren zvok direktno iz vmesnika",
|
||||
"menu": {
|
||||
"choose-download-folder": "Izberite mapo s prenosi",
|
||||
"download-finish-settings": {
|
||||
"label": "Prenesi ob koncu",
|
||||
"prompt": {
|
||||
"last-percent": "Po x odstotkov",
|
||||
"last-seconds": "Zadnjih x sekund",
|
||||
"title": "Nastavite čas prenosa"
|
||||
},
|
||||
"submenu": {
|
||||
"advanced": "Napredno",
|
||||
"enabled": "Omogočen",
|
||||
"mode": "Časovni način",
|
||||
"percent": "Odstotek",
|
||||
"seconds": "Sekunde"
|
||||
}
|
||||
},
|
||||
"download-playlist": "Prenesi seznam",
|
||||
"presets": "Prednastavitve",
|
||||
"skip-existing": "Preskoči obstoječe datoteke"
|
||||
},
|
||||
"name": "Prenaševalec",
|
||||
"renderer": {
|
||||
"can-not-update-progress": "Nemorem osvežiti napredka"
|
||||
},
|
||||
"templates": {
|
||||
"button": "Prenos"
|
||||
}
|
||||
},
|
||||
"exponential-volume": {
|
||||
"description": "Drsnik za glasnost naredi eksponenten, da bo lažje izbrati nižje glasnosti.",
|
||||
"name": "Eksponentna glasnost"
|
||||
},
|
||||
"in-app-menu": {
|
||||
"description": "Menijem doda eleganten videz v temnih barvah ali barvah albuma",
|
||||
"menu": {
|
||||
"hide-dom-window-controls": "Skrije DOM gumbe za okno"
|
||||
},
|
||||
"name": "Meni v aplikaciji"
|
||||
},
|
||||
"lumiastream": {
|
||||
"description": "Doda podporo za Lumia pretočno predvajanje",
|
||||
"name": "Lumina pretočno predavanje [Beta]"
|
||||
},
|
||||
"lyrics-genius": {
|
||||
"description": "Doda podporo besedil za večino pesmi",
|
||||
"menu": {
|
||||
"romanized-lyrics": "Romanizerana besedila"
|
||||
},
|
||||
"name": "Besedila Genius",
|
||||
"renderer": {
|
||||
"fetched-lyrics": "Prestregel besedila za Genius"
|
||||
}
|
||||
},
|
||||
"music-together": {
|
||||
"description": "Delite seznam predvajanja z drugimi. Ko gostitelj predvaja skladbo, bodo vsi ostali slišali isto skladbo",
|
||||
"dialog": {
|
||||
"enter-host": "Vnesite Host ID"
|
||||
},
|
||||
"internal": {
|
||||
"save": "Shrani",
|
||||
"track-source": "Vir pesmi",
|
||||
"unknown-user": "Neznan uporabnik"
|
||||
},
|
||||
"menu": {
|
||||
"click-to-copy-id": "Kopiraj Host ID",
|
||||
"close": "Zapri Glasba Skupaj",
|
||||
"connected-users": "Povezani uporabniki",
|
||||
"disconnect": "Prekini povezavo z Pesmi Skupaj",
|
||||
"empty-user": "Ni povezanih uporabnikov",
|
||||
"host": "Gkasba Skupaj gostitelj",
|
||||
"join": "Pridruži se Glasba Skupaj",
|
||||
"permission": {
|
||||
"all": "Dovoli da gosti nadzorujejo seznam predvajanja in predvajalnik",
|
||||
"host-only": "Samo gostitelj lahko spreminja seznam predvajanja in predvajalnik",
|
||||
"playlist": "Dovoli da gostje nadzorujejo predvajalnik"
|
||||
},
|
||||
"set-permission": "Spremeni dovoljenje nadzora",
|
||||
"status": {
|
||||
"disconnected": "Odklopljen",
|
||||
"guest": "Povezan kot Gost",
|
||||
"host": "Povezan kot Gostitelj"
|
||||
}
|
||||
},
|
||||
"name": "Gkasba Skupaj [Beta]",
|
||||
"toast": {
|
||||
"add-song-failed": "Skladba ni bila dodana",
|
||||
"closed": "Glasba Skupaj zaprto",
|
||||
"disconnected": "Gkasba Skupaj odklopljena",
|
||||
"host-failed": "Gkasba Skupaj nisem mogel gostiti",
|
||||
"id-copied": "Host ID je kopiran v odložišče",
|
||||
"id-copy-failed": "Host ID ni bilo mogoče kopirati"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -207,6 +207,10 @@
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"ad-speedup": {
|
||||
"description": "หากมีการเล่นโฆษณา เสียงจะถูกปิดและตั้งค่าความเร็วในการเล่นเป็น 16x",
|
||||
"name": "เพิ่มความเร็วโฆษณา"
|
||||
},
|
||||
"adblocker": {
|
||||
"description": "บล็อกโฆษณาและการติดตามทั้งหมดอย่างอัตโนมัติ",
|
||||
"menu": {
|
||||
@ -275,6 +279,18 @@
|
||||
},
|
||||
"name": "โหมดสภาพแวดล้อม"
|
||||
},
|
||||
"api-server": {
|
||||
"description": "เพิ่มเซิร์ฟเวอร์ API เพื่อควบคุมการเล่น",
|
||||
"dialog": {
|
||||
"request": {
|
||||
"buttons": {
|
||||
"allow": "อนุญาต",
|
||||
"deny": "ปฏิเสธ"
|
||||
},
|
||||
"message": "อนุญาตให้ {{ID}} ({{origin}}) เข้าถึง API หรือไม่?"
|
||||
}
|
||||
}
|
||||
},
|
||||
"audio-compressor": {
|
||||
"description": "ใช้การบีบอัดเสียง (ลดระดับเสียงของส่วนที่ดังที่สุดของสัญญาณและเพิ่มระดับเสียงของส่วนที่เบาที่สุด)",
|
||||
"name": "เครื่องมือบีบอัดเสียง"
|
||||
|
||||
@ -207,6 +207,10 @@
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"ad-speedup": {
|
||||
"description": "Bir reklam oynatılırsa sesi kapatır ve oynatma hızını 16x olarak ayarlar",
|
||||
"name": "Hızlandırma"
|
||||
},
|
||||
"adblocker": {
|
||||
"description": "Tüm reklamları ve izleyicileri engelle",
|
||||
"menu": {
|
||||
@ -275,6 +279,56 @@
|
||||
},
|
||||
"name": "Ambiyans Modu"
|
||||
},
|
||||
"amuse": {
|
||||
"description": "6K Labs'ın Amuse oynatma widget'ı için YouTube Music desteği ekler",
|
||||
"name": "Amuse",
|
||||
"response": {
|
||||
"query": "Amuse API sunucusu çalışıyor. Şarkı bilgilerini almak için GET /query kullanabilirsiniz."
|
||||
}
|
||||
},
|
||||
"api-server": {
|
||||
"description": "APİ ekle ve oynatıcıyı kontrol et",
|
||||
"dialog": {
|
||||
"request": {
|
||||
"buttons": {
|
||||
"allow": "İzin ver",
|
||||
"deny": "Reddet"
|
||||
},
|
||||
"message": "{{ID}} ({{origin}}) 'nın APIye erişmesine izin verilsin mi?",
|
||||
"title": "APİ yetkilendirme isteği"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"auth-strategy": {
|
||||
"label": "Yetkilendirme stratejisi",
|
||||
"submenu": {
|
||||
"auth-at-first": {
|
||||
"label": "İlk istekte yetkilendir"
|
||||
},
|
||||
"none": {
|
||||
"label": "Yetkilendirme Yok"
|
||||
}
|
||||
}
|
||||
},
|
||||
"hostname": {
|
||||
"label": "Ana bilgisayar adı"
|
||||
},
|
||||
"port": {
|
||||
"label": "Port"
|
||||
}
|
||||
},
|
||||
"name": "API sunucusu [Beta]",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "API sunucusu için hostname (örneğin 0.0.0.0) girin:",
|
||||
"title": "Hostname"
|
||||
},
|
||||
"port": {
|
||||
"label": "API sunucusu için port girin:",
|
||||
"title": "Bağlantı Noktası"
|
||||
}
|
||||
}
|
||||
},
|
||||
"audio-compressor": {
|
||||
"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"
|
||||
@ -410,6 +464,21 @@
|
||||
"description": "MP3 / kaynak sesini doğrudan arayüzden indir",
|
||||
"menu": {
|
||||
"choose-download-folder": "İndirme klasörünü seç",
|
||||
"download-finish-settings": {
|
||||
"label": "Bittiğinde indir",
|
||||
"prompt": {
|
||||
"last-percent": "Yüzde x'ten sonra",
|
||||
"last-seconds": "Son x saniyede",
|
||||
"title": "Ne zaman indirileceğini ayarla"
|
||||
},
|
||||
"submenu": {
|
||||
"advanced": "Gelişmiş",
|
||||
"enabled": "Etkin",
|
||||
"mode": "Zaman türü",
|
||||
"percent": "Yüzde",
|
||||
"seconds": "Saniye"
|
||||
}
|
||||
},
|
||||
"download-playlist": "Oynatma listesini indir",
|
||||
"presets": "Hazır Ayarlar",
|
||||
"skip-existing": "Mevcut dosyaları atla"
|
||||
@ -422,6 +491,18 @@
|
||||
"button": "İndir"
|
||||
}
|
||||
},
|
||||
"equalizer": {
|
||||
"description": "Oynatıcıya ekolayzer desteği ekler",
|
||||
"menu": {
|
||||
"presets": {
|
||||
"label": "Ön Ayarlar",
|
||||
"list": {
|
||||
"bass-booster": "Bass güçlendirici"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Ekolayzer"
|
||||
},
|
||||
"exponential-volume": {
|
||||
"description": "Ses seviyesi kaydırıcısını üstel hale getirir, böylece daha düşük ses seviyelerini seçmek daha kolay olur.",
|
||||
"name": "Üstel Ses Seviyesi"
|
||||
@ -649,6 +730,63 @@
|
||||
"description": "Giriş/Çıkış gibi müzik olmayan kısımları veya müzik videolarında şarkının çalmadığı kısımları otomatik olarak atlar",
|
||||
"name": "SponsorBlock"
|
||||
},
|
||||
"synced-lyrics": {
|
||||
"description": "LRClib gibi sağlayıcıları kullanarak şarkılara senkronize şarkı sözleri sağlar.",
|
||||
"errors": {
|
||||
"fetch": "⚠️ \tŞarkı sözleri alınırken bir hata oluştu.\n\tLütfen daha sonra tekrar deneyin.",
|
||||
"not-found": "⚠️ Bu şarkı için şarkı sözleri bulunamadı."
|
||||
},
|
||||
"menu": {
|
||||
"default-text-string": {
|
||||
"label": "Şarkı sözleri arasında varsayılan karakter",
|
||||
"tooltip": "Şarkı sözleri arasındaki boşluk için kullanılacak varsayılan karakteri seçin"
|
||||
},
|
||||
"line-effect": {
|
||||
"label": "Çizgi etkisi",
|
||||
"submenu": {
|
||||
"fancy": {
|
||||
"label": "Süslü",
|
||||
"tooltip": "Mevcut satırda büyük, uygulama benzeri efektler kullan"
|
||||
},
|
||||
"focus": {
|
||||
"label": "odak",
|
||||
"tooltip": "Yalnızca geçerli satırı beyaz yapın"
|
||||
},
|
||||
"offset": {
|
||||
"label": "telafi etmek,ofset",
|
||||
"tooltip": "Geçerli satırın sağındaki ofset"
|
||||
},
|
||||
"scale": {
|
||||
"label": "ölçek",
|
||||
"tooltip": "Geçerli satırı ölçeklendirir"
|
||||
}
|
||||
},
|
||||
"tooltip": "Geçerli satıra uygulanacak efekti seçin"
|
||||
},
|
||||
"precise-timing": {
|
||||
"label": "Şarkı sözlerini mükemmel şekilde senkronize edin",
|
||||
"tooltip": "Bir sonraki satırın görüntülenmesini milisaniyesine kadar hesaplayın (performans üzerinde küçük bir etkisi olabilir)"
|
||||
},
|
||||
"show-lyrics-even-if-inexact": {
|
||||
"label": "Kesin olmasa bile şarkı sözlerini gösterin",
|
||||
"tooltip": "Şarkı bulunamazsa, eklenti farklı bir arama sorgusuyla tekrar dener. \nİkinci denemenin sonucu tam olmayabilir."
|
||||
},
|
||||
"show-time-codes": {
|
||||
"label": "Zaman kodlarını göster",
|
||||
"tooltip": "Şarkı sözlerinin yanında zaman kodlarını gösterin"
|
||||
}
|
||||
},
|
||||
"name": "Senkronize Şarkı Sözleri",
|
||||
"refetch-btn": {
|
||||
"fetching": "Getiriliyor...",
|
||||
"normal": "Refetch şarkı sözleri"
|
||||
},
|
||||
"warnings": {
|
||||
"duration-mismatch": "⚠️ - Süre uyuşmazlığı nedeniyle şarkı sözleri senkronize olmayabilir.",
|
||||
"inexact": "⚠️ - Bu şarkının sözleri tam olmayabilir",
|
||||
"instrumental": "⚠️ - Bu enstrümantal bir şarkıdır"
|
||||
}
|
||||
},
|
||||
"taskbar-mediacontrol": {
|
||||
"description": "Windows görev çubuğu üzerinden oynatmayı kontrol edebilmenize olanak sağlar",
|
||||
"name": "Görev Çubuğu Medya Kontrolü"
|
||||
|
||||
@ -207,6 +207,10 @@
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"ad-speedup": {
|
||||
"description": "При програванні реклами звук вимикається і встановлюється швидкість відтворення 16х",
|
||||
"name": "Пришвидшення релками"
|
||||
},
|
||||
"adblocker": {
|
||||
"description": "Блокувати всю рекламу та відстеження з коробки",
|
||||
"menu": {
|
||||
@ -275,6 +279,56 @@
|
||||
},
|
||||
"name": "Режим навколишнього середовища"
|
||||
},
|
||||
"amuse": {
|
||||
"description": "Додає підтримку YouTube Music для віджета Amuse now playing від 6K Labs",
|
||||
"name": "Amuse",
|
||||
"response": {
|
||||
"query": "Сервер Amuse API запущено. Запит GET /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": "Введіть ім'я хоста (наприклад 0.0.0.0) для API серверу:",
|
||||
"title": "Ім'я хоста"
|
||||
},
|
||||
"port": {
|
||||
"label": "Введіть порт API серверу:",
|
||||
"title": "Порт"
|
||||
}
|
||||
}
|
||||
},
|
||||
"audio-compressor": {
|
||||
"description": "Застосувати стиснення аудіо (зменшити гучність найгучніших фрагментів сигналу та збільшити гучність тихих фрагментів)",
|
||||
"name": "Аудіокомпресор"
|
||||
@ -410,6 +464,21 @@
|
||||
"description": "Завантажує MP3 / джерело аудіо безпосередньо з інтерфейсу",
|
||||
"menu": {
|
||||
"choose-download-folder": "Оберіть папку для завантаження",
|
||||
"download-finish-settings": {
|
||||
"label": "Скачати по завершенню",
|
||||
"prompt": {
|
||||
"last-percent": "Після Х відсотків",
|
||||
"last-seconds": "Останні Х секунд",
|
||||
"title": "Налаштувати коли завантажувати"
|
||||
},
|
||||
"submenu": {
|
||||
"advanced": "Розширені",
|
||||
"enabled": "Увімкнено",
|
||||
"mode": "Режим часу",
|
||||
"percent": "Відсоток",
|
||||
"seconds": "Секунди"
|
||||
}
|
||||
},
|
||||
"download-playlist": "Завантажити плейлист",
|
||||
"presets": "Попередні налаштування",
|
||||
"skip-existing": "Пропустити наявні файли"
|
||||
@ -422,6 +491,18 @@
|
||||
"button": "Завантажити"
|
||||
}
|
||||
},
|
||||
"equalizer": {
|
||||
"description": "Додає еквалайзер до програвача",
|
||||
"menu": {
|
||||
"presets": {
|
||||
"label": "Пресети",
|
||||
"list": {
|
||||
"bass-booster": "Підсилювач басів"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "Еквалайзер"
|
||||
},
|
||||
"exponential-volume": {
|
||||
"description": "Робить регулятор гучності експоненціальним, що полегшує вибір тихих рівнів гучності.",
|
||||
"name": "Експоненціальна гучність"
|
||||
@ -649,6 +730,63 @@
|
||||
"description": "Автоматично пропускати немузичні частини, такі як вступ/закінчення або частини музичних відеороликів, де не відтворюється музика",
|
||||
"name": "SponsorBlock"
|
||||
},
|
||||
"synced-lyrics": {
|
||||
"description": "Додає синхронізовані тексти до пісень використовуючи провайдери, такі як LRClib.",
|
||||
"errors": {
|
||||
"fetch": "⚠️ - При завантаженні слів пісні сталась помилка. Спробуйте пізніше.",
|
||||
"not-found": "⚠️ До цієї пісні текст не знайдено."
|
||||
},
|
||||
"menu": {
|
||||
"default-text-string": {
|
||||
"label": "Символ за замовчуванням між текстами пісень",
|
||||
"tooltip": "Виберіть символ за замовчуванням, який буде використовуватися для проміжку між текстами пісень"
|
||||
},
|
||||
"line-effect": {
|
||||
"label": "Лінійний ефект",
|
||||
"submenu": {
|
||||
"fancy": {
|
||||
"label": "Fancy",
|
||||
"tooltip": "Використовуйте великі, додаткоподібні ефекти на поточному рядку"
|
||||
},
|
||||
"focus": {
|
||||
"label": "Зосереджитись",
|
||||
"tooltip": "Зробити білим лише поточний рядок"
|
||||
},
|
||||
"offset": {
|
||||
"label": "Офсет",
|
||||
"tooltip": "Офсет з права від нинішньої лінії"
|
||||
},
|
||||
"scale": {
|
||||
"label": "Масштабувати",
|
||||
"tooltip": "Масштабуваты поточну лінію"
|
||||
}
|
||||
},
|
||||
"tooltip": "Виберіть ефект, який потрібно застосувати до поточної лінії"
|
||||
},
|
||||
"precise-timing": {
|
||||
"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": "Керування відтворенням з панелі завдань Windows",
|
||||
"name": "Керування медіа на панелі завдань"
|
||||
|
||||
134
src/i18n/resources/ur.json
Normal file
@ -0,0 +1,134 @@
|
||||
{
|
||||
"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}}\" کو لوڈ نہیں کیا گیا"
|
||||
}
|
||||
}
|
||||
},
|
||||
"language": {
|
||||
"code": "ur",
|
||||
"local-name": "اردو",
|
||||
"name": "Urdu"
|
||||
},
|
||||
"main": {
|
||||
"console": {
|
||||
"did-finish-load": {
|
||||
"dev-tools": "لوڈنگ مکمل ہو گئی۔ DevTools کھل گیا"
|
||||
},
|
||||
"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": "DevTools ٹوگل کریں"
|
||||
}
|
||||
},
|
||||
"always-on-top": "ہمیشہ اوپر",
|
||||
"auto-update": "خودکار اپ ڈیٹ",
|
||||
"hide-menu": {
|
||||
"dialog": {
|
||||
"message": "اگلے لانچ پر مینو کو چھپایا جائے گا، اسے دکھانے کے لیے [Alt] استعمال کریں (یا in-app-menu استعمال کرنے پر بیک ٹک [`] کریں)",
|
||||
"title": "پوشیدہ مینو کو فعال کر دیا گیا"
|
||||
},
|
||||
"label": "مینو کو چھپائیں"
|
||||
},
|
||||
"language": {
|
||||
"dialog": {
|
||||
"message": "دوبارہ شروع کرنے کے بعد زبان بدل دی جائے گی",
|
||||
"title": "زبان بدل گئی ہے"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2,7 +2,7 @@
|
||||
"common": {
|
||||
"console": {
|
||||
"plugins": {
|
||||
"execute-failed": "Lỗi khi bắt đầu phần mở rộng {{pluginName}}::{{contextName}}",
|
||||
"execute-failed": "Lỗi thực thi plugin {{pluginName}}::{{contextName}}",
|
||||
"executed-at-ms": "Phần mở rộng {{pluginName}}::{{contextName}} đã bắt đầu trong {{ms}}ms",
|
||||
"initialize-failed": "Lỗi khi khởi động phần mở rộng \"{{pluginName}}\"",
|
||||
"load-all": "Đang tải tất cả phần mở rộng",
|
||||
@ -207,6 +207,10 @@
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"ad-speedup": {
|
||||
"description": "Nếu một quảng cáo được phát thì sẽ bị tắt tiếng và tăng tốc độ phát lên 16x",
|
||||
"name": "Tăng tốc quảng cáo"
|
||||
},
|
||||
"adblocker": {
|
||||
"description": "Chặn toàn bộ quảng cáo và trình theo dõi",
|
||||
"menu": {
|
||||
@ -275,6 +279,55 @@
|
||||
},
|
||||
"name": "Chế độ Môi trường xung quanh"
|
||||
},
|
||||
"amuse": {
|
||||
"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."
|
||||
}
|
||||
},
|
||||
"api-server": {
|
||||
"description": "Thêm máy chủ API để điều khiển trình phát",
|
||||
"dialog": {
|
||||
"request": {
|
||||
"buttons": {
|
||||
"allow": "Cho phép",
|
||||
"deny": "Từ chối"
|
||||
},
|
||||
"message": "Cho phép {{ID}} ({{origin}}) truy cập API?",
|
||||
"title": "Yêu cầu cho phép API"
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
"auth-strategy": {
|
||||
"label": "Chiến thuật xác thực",
|
||||
"submenu": {
|
||||
"auth-at-first": {
|
||||
"label": "Xác thực ngay yêu cầu đầu tiên"
|
||||
},
|
||||
"none": {
|
||||
"label": "Không xác thực"
|
||||
}
|
||||
}
|
||||
},
|
||||
"hostname": {
|
||||
"label": "Tên máy chủ"
|
||||
},
|
||||
"port": {
|
||||
"label": "Cổng"
|
||||
}
|
||||
},
|
||||
"name": "Máy chủ API [Beta]",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "Điền tên máy chủ (như 0.0.0.0) cho máy chủ API:",
|
||||
"title": "Tên máy chủ"
|
||||
},
|
||||
"port": {
|
||||
"label": "Nhập cổng cho máy chủ API:",
|
||||
"title": "Cổng"
|
||||
}
|
||||
}
|
||||
},
|
||||
"audio-compressor": {
|
||||
"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"
|
||||
@ -410,6 +463,21 @@
|
||||
"description": "Tải xuống MP3 / âm thanh nguồn trực tiếp từ giao diện",
|
||||
"menu": {
|
||||
"choose-download-folder": "Chọn thư mục tải xuống",
|
||||
"download-finish-settings": {
|
||||
"label": "Tải xuống khi hoàn tất",
|
||||
"prompt": {
|
||||
"last-percent": "Sau x phần trăm",
|
||||
"last-seconds": "x giây cuối",
|
||||
"title": "Định cấu hình thời điểm tải xuống"
|
||||
},
|
||||
"submenu": {
|
||||
"advanced": "Nâng cao",
|
||||
"enabled": "Đã kích hoạt",
|
||||
"mode": "Chế độ thời gian",
|
||||
"percent": "Phần trăm",
|
||||
"seconds": "Giây"
|
||||
}
|
||||
},
|
||||
"download-playlist": "Tải danh sách phát",
|
||||
"presets": "Cài đặt sẵn",
|
||||
"skip-existing": "Bỏ qua các tập tin hiện có"
|
||||
@ -649,6 +717,59 @@
|
||||
"description": "Tự động bỏ qua các phần không phải âm nhạc như phần giới thiệu/kết thúc hoặc các phần của video nhạc mà bài hát không được phát",
|
||||
"name": "SponsorBlock"
|
||||
},
|
||||
"synced-lyrics": {
|
||||
"description": "Cung cấp lời bài hát được đồng bộ hoá với các bài hát, sử dụng những nhà cung cấp như LRClib.",
|
||||
"errors": {
|
||||
"fetch": "⚠️ - Đã xảy ra lỗi khi tìm lời bài hát, Vui lòng thử lại sau.",
|
||||
"not-found": "⚠️ - Không tìm thấy lời cho bài hát này."
|
||||
},
|
||||
"menu": {
|
||||
"default-text-string": {
|
||||
"label": "Kí tự mặc định giữa các lời bài hát",
|
||||
"tooltip": "Chọn kí tự mặc định cho khoảng trống giữa các lời bài hát"
|
||||
},
|
||||
"line-effect": {
|
||||
"label": "Kiểu đường thẳng",
|
||||
"submenu": {
|
||||
"focus": {
|
||||
"label": "Tập trung",
|
||||
"tooltip": "Chỉ làm cho dòng hiện tại có màu trắng"
|
||||
},
|
||||
"offset": {
|
||||
"label": "Độ lệch",
|
||||
"tooltip": "Độ lệch bên phải của dòng hiện tại"
|
||||
},
|
||||
"scale": {
|
||||
"label": "Tỉ lệ",
|
||||
"tooltip": "Áp dụng tỉ lệ cho dòng hiện tại"
|
||||
}
|
||||
},
|
||||
"tooltip": "Chọn kiểu để áp dụng cho dòng hiện tại"
|
||||
},
|
||||
"precise-timing": {
|
||||
"label": "Làm cho lời bài hát được đồng bộ hoàn hảo",
|
||||
"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)"
|
||||
},
|
||||
"show-lyrics-even-if-inexact": {
|
||||
"label": "Hiển thị lời bài hát ngay cả khi không chính xác",
|
||||
"tooltip": "Nếu không tìm thấy bài hát, plugin sẽ thử lại bằng truy vấn tìm kiếm khác.\nKết quả từ lần thử thứ hai có thể không chính xác."
|
||||
},
|
||||
"show-time-codes": {
|
||||
"label": "Hiện mốc thời gian",
|
||||
"tooltip": "Hiện mốc thời gian bên cạnh lời bài hát"
|
||||
}
|
||||
},
|
||||
"name": "Lời bài hát được đồng bộ hoá",
|
||||
"refetch-btn": {
|
||||
"fetching": "Đang tìm nạp...",
|
||||
"normal": "Tải lại lời bài hát"
|
||||
},
|
||||
"warnings": {
|
||||
"duration-mismatch": "⚠️ - Lời bài hát có thể không đồng bộ do thời lượng không khớp.",
|
||||
"inexact": "⚠️ - Lời bài hát này có thể không chính xác",
|
||||
"instrumental": "⚠️ - Đây là một bài hát trình diễn bằng nhạc khí"
|
||||
}
|
||||
},
|
||||
"taskbar-mediacontrol": {
|
||||
"description": "Kiểm soát phát lại từ thanh tác vụ Windows của bạn",
|
||||
"name": "Kiểm soát phương tiện trên thanh tác vụ"
|
||||
|
||||
@ -39,7 +39,7 @@
|
||||
"clearing-cache-after-20s": "正在清理应用缓存"
|
||||
},
|
||||
"window": {
|
||||
"tried-to-render-offscreen": "窗口试图于屏幕外绘制, windowSize={{windowSize}}, displaySize={{displaySize}}, position={{position}}"
|
||||
"tried-to-render-offscreen": "窗口试图于屏幕外绘制,窗口大小={{windowSize}},显示尺寸={{displaySize}},位置={{position}}"
|
||||
}
|
||||
},
|
||||
"dialog": {
|
||||
@ -207,6 +207,10 @@
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"ad-speedup": {
|
||||
"description": "使用静音以及 16 倍速播放跳过广告片段",
|
||||
"name": "广告加速跳过"
|
||||
},
|
||||
"adblocker": {
|
||||
"description": "屏蔽所有广告与跟踪器",
|
||||
"menu": {
|
||||
@ -275,6 +279,56 @@
|
||||
},
|
||||
"name": "沉浸模式"
|
||||
},
|
||||
"amuse": {
|
||||
"description": "为 6K Labs 的 Amuse 正在播放小部件添加 YouTube Music 支持",
|
||||
"name": "Amuse",
|
||||
"response": {
|
||||
"query": "Amuse 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": "音频压缩器"
|
||||
@ -410,6 +464,21 @@
|
||||
"description": "在界面内直接下载 MP3 / 源音频",
|
||||
"menu": {
|
||||
"choose-download-folder": "选择下载文件夹",
|
||||
"download-finish-settings": {
|
||||
"label": "边播边下",
|
||||
"prompt": {
|
||||
"last-percent": "播放超过指定百分比时开始下载",
|
||||
"last-seconds": "歌曲剩余指定秒数时开始下载",
|
||||
"title": "配置在何时开始下载"
|
||||
},
|
||||
"submenu": {
|
||||
"advanced": "高级",
|
||||
"enabled": "已启用",
|
||||
"mode": "激活时机",
|
||||
"percent": "按播放百分比",
|
||||
"seconds": "按播放秒数"
|
||||
}
|
||||
},
|
||||
"download-playlist": "下载播放列表",
|
||||
"presets": "预设",
|
||||
"skip-existing": "跳过已存在的文件"
|
||||
@ -422,6 +491,18 @@
|
||||
"button": "下载"
|
||||
}
|
||||
},
|
||||
"equalizer": {
|
||||
"description": "为播放器添加均衡器",
|
||||
"menu": {
|
||||
"presets": {
|
||||
"label": "预设",
|
||||
"list": {
|
||||
"bass-booster": "低音增强器"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "均衡器"
|
||||
},
|
||||
"exponential-volume": {
|
||||
"description": "让音量滑块指数化以便选择更低的音量。",
|
||||
"name": "指数化音量"
|
||||
@ -440,11 +521,11 @@
|
||||
"lyrics-genius": {
|
||||
"description": "为大多数歌曲添加歌词支持",
|
||||
"menu": {
|
||||
"romanized-lyrics": "罗马化字幕"
|
||||
"romanized-lyrics": "罗马化歌词"
|
||||
},
|
||||
"name": "Genius 歌词",
|
||||
"renderer": {
|
||||
"fetched-lyrics": "已从 Genius 获取字幕"
|
||||
"fetched-lyrics": "已从 Genius 获取歌词"
|
||||
}
|
||||
},
|
||||
"music-together": {
|
||||
@ -459,12 +540,12 @@
|
||||
},
|
||||
"menu": {
|
||||
"click-to-copy-id": "复制发起者 ID",
|
||||
"close": "关闭 Music Together",
|
||||
"close": "关闭一起听",
|
||||
"connected-users": "已连接用户",
|
||||
"disconnect": "断开 Music Together 连接",
|
||||
"disconnect": "断开一起听连接",
|
||||
"empty-user": "没有已连接的用户",
|
||||
"host": "Music Together 发起者",
|
||||
"join": "加入 Music Together",
|
||||
"host": "一起听发起者",
|
||||
"join": "加入一起听",
|
||||
"permission": {
|
||||
"all": "允许来宾控制播放列表与播放器",
|
||||
"host-only": "仅发起人可以控制播放列表与播放器",
|
||||
@ -477,20 +558,20 @@
|
||||
"host": "已作为发起人连接"
|
||||
}
|
||||
},
|
||||
"name": "Music Together [测试]",
|
||||
"name": "一起听 [测试]",
|
||||
"toast": {
|
||||
"add-song-failed": "添加歌曲失败",
|
||||
"closed": "Music Together 已关闭",
|
||||
"disconnected": "Music Together 已断开连接",
|
||||
"host-failed": "发起 Music Together 失败",
|
||||
"closed": "一起听已关闭",
|
||||
"disconnected": "一起听已断开连接",
|
||||
"host-failed": "发起一起听失败",
|
||||
"id-copied": "已将发起者 ID 复制到剪切板",
|
||||
"id-copy-failed": "复制发起者 ID 到剪贴板时失败",
|
||||
"join-failed": "加入 Music Together 失败",
|
||||
"joined": "已加入 Music Together",
|
||||
"permission-changed": "Music Together 权限已改为 \"{{permission}}\"",
|
||||
"join-failed": "加入一起听失败",
|
||||
"joined": "已加入一起听",
|
||||
"permission-changed": "一起听权限已改为 \"{{permission}}\"",
|
||||
"remove-song-failed": "移除歌曲失败",
|
||||
"user-connected": "{{name}} 加入了 Music Together",
|
||||
"user-disconnected": "{{name}} 离开了 Music Together"
|
||||
"user-connected": "{{name}} 加入了一起听",
|
||||
"user-disconnected": "{{name}} 离开了一起听"
|
||||
}
|
||||
},
|
||||
"navigation": {
|
||||
@ -612,7 +693,7 @@
|
||||
},
|
||||
"listenbrainz": {
|
||||
"token": {
|
||||
"label": "输入您的v ListenBrainz 用户令牌:",
|
||||
"label": "输入您的 ListenBrainz 用户令牌:",
|
||||
"title": "ListenBrainz 令牌"
|
||||
}
|
||||
}
|
||||
@ -649,6 +730,59 @@
|
||||
"description": "自动跳过非音乐部分,如 MV 的介绍/结语以及歌曲未开始的部分",
|
||||
"name": "SponsorBlock"
|
||||
},
|
||||
"synced-lyrics": {
|
||||
"description": "透过 LRClib 等服务提供滚动歌词显示。",
|
||||
"errors": {
|
||||
"fetch": "⚠️ - 获取歌词时发生错误。请稍后再试。",
|
||||
"not-found": "⚠️ - 未找到此歌曲的歌词。"
|
||||
},
|
||||
"menu": {
|
||||
"default-text-string": {
|
||||
"label": "默认的歌词行间字符",
|
||||
"tooltip": "选择在歌词间隙期间默认显示的字符"
|
||||
},
|
||||
"line-effect": {
|
||||
"label": "歌词行特效",
|
||||
"submenu": {
|
||||
"focus": {
|
||||
"label": "高亮",
|
||||
"tooltip": "仅将当前歌词行显示为白色"
|
||||
},
|
||||
"offset": {
|
||||
"label": "偏移",
|
||||
"tooltip": "将当前歌词行向右偏移"
|
||||
},
|
||||
"scale": {
|
||||
"label": "放大",
|
||||
"tooltip": "放大当前歌词行"
|
||||
}
|
||||
},
|
||||
"tooltip": "选择当前歌词行应用的特效"
|
||||
},
|
||||
"precise-timing": {
|
||||
"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": "从 Windows 任务栏控制音乐回放",
|
||||
"name": "任务栏媒体控件"
|
||||
|
||||
@ -96,11 +96,11 @@
|
||||
"advanced-options": {
|
||||
"label": "進階選項",
|
||||
"submenu": {
|
||||
"auto-reset-app-cache": "當程式啟動時重設應用程式快取",
|
||||
"auto-reset-app-cache": "啟動時重設應用快取",
|
||||
"disable-hardware-acceleration": "關閉硬體加速",
|
||||
"edit-config-json": "編輯 config.json",
|
||||
"override-user-agent": "覆寫使用者代理",
|
||||
"restart-on-config-changes": "在設定檔更動時自動重啟應用程式",
|
||||
"restart-on-config-changes": "設定變更時自動重啟應用",
|
||||
"set-proxy": {
|
||||
"label": "設定代理伺服器",
|
||||
"prompt": {
|
||||
@ -123,7 +123,7 @@
|
||||
},
|
||||
"language": {
|
||||
"dialog": {
|
||||
"message": "語言會在下一次重啟應用程式時變更",
|
||||
"message": "語言會在重啟應用後變更",
|
||||
"title": "語言已變更"
|
||||
},
|
||||
"label": "語言",
|
||||
@ -131,7 +131,7 @@
|
||||
"to-help-translate": "想協助翻譯?按一下這裡"
|
||||
}
|
||||
},
|
||||
"resume-on-start": "應用啟動時繼續上次播放的歌曲",
|
||||
"resume-on-start": "應用開啟時繼續播放上次的歌曲",
|
||||
"single-instance-lock": "單實例模式",
|
||||
"start-at-login": "開機時啟動",
|
||||
"starting-page": {
|
||||
@ -142,8 +142,8 @@
|
||||
"label": "系統匣",
|
||||
"submenu": {
|
||||
"disabled": "已停用",
|
||||
"enabled-and-hide-app": "啟用並最小化應用程式",
|
||||
"enabled-and-show-app": "啟用但持續顯示應用程式",
|
||||
"enabled-and-hide-app": "啟用並最小化應用",
|
||||
"enabled-and-show-app": "啟用並顯示應用",
|
||||
"play-pause-on-click": "點擊時播放/暫停"
|
||||
}
|
||||
},
|
||||
@ -207,6 +207,10 @@
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"ad-speedup": {
|
||||
"description": "使用 16 倍速播放及靜音來跳過廣告片段",
|
||||
"name": "加速略過"
|
||||
},
|
||||
"adblocker": {
|
||||
"description": "阻擋所有廣告",
|
||||
"menu": {
|
||||
@ -219,7 +223,7 @@
|
||||
"name": "進階專輯操作"
|
||||
},
|
||||
"album-color-theme": {
|
||||
"description": "依歌曲色調自動更改應用程式主題",
|
||||
"description": "根據專輯封面色調更改應用程式主題顏色",
|
||||
"menu": {
|
||||
"color-mix-ratio": {
|
||||
"label": "顏色混合程度",
|
||||
@ -275,6 +279,56 @@
|
||||
},
|
||||
"name": "微光效果"
|
||||
},
|
||||
"amuse": {
|
||||
"description": "加入支援 6K Labs 的 Amuse OBS 外掛以取得 Youtube Music 現正播放資訊",
|
||||
"name": "Amuse",
|
||||
"response": {
|
||||
"query": "Amuse 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 伺服器 [Beta]",
|
||||
"prompt": {
|
||||
"hostname": {
|
||||
"label": "輸入 API 伺服器的主機名稱 例 (0.0.0.0):",
|
||||
"title": "主機名稱"
|
||||
},
|
||||
"port": {
|
||||
"label": "輸入 API 伺服器接口:",
|
||||
"title": "接口"
|
||||
}
|
||||
}
|
||||
},
|
||||
"audio-compressor": {
|
||||
"description": "使用音效壓縮 (大聲部份的音量降低, 柔和部份的音量提高)",
|
||||
"name": "音效壓縮器"
|
||||
@ -296,7 +350,7 @@
|
||||
"name": "標題選擇器",
|
||||
"prompt": {
|
||||
"selector": {
|
||||
"label": "目前標題語言: {{language}}",
|
||||
"label": "目前標題語言:{{language}}",
|
||||
"none": "無",
|
||||
"title": "選擇標題語言"
|
||||
}
|
||||
@ -341,10 +395,10 @@
|
||||
"discord": {
|
||||
"backend": {
|
||||
"already-connected": "已嘗試可用連接",
|
||||
"connected": "已連接至Discord",
|
||||
"disconnected": "與Discord斷開連接"
|
||||
"connected": "已連接至 Discord",
|
||||
"disconnected": "與 Discord 斷開連接"
|
||||
},
|
||||
"description": "使用Discord狀態與你的好友分享你正在收聽的音樂",
|
||||
"description": "使用 Discord 狀態與你的好友分享你正在收聽的音樂",
|
||||
"menu": {
|
||||
"auto-reconnect": "自動重新連接",
|
||||
"clear-activity": "清除狀態",
|
||||
@ -352,14 +406,14 @@
|
||||
"connected": "已連接",
|
||||
"disconnected": "已斷開連接",
|
||||
"hide-duration-left": "隱藏音樂剩餘時間狀態",
|
||||
"hide-github-button": "隱藏Github頁面按鈕",
|
||||
"play-on-youtube-music": "顯示Play on YouTube Music按鈕",
|
||||
"hide-github-button": "隱藏 Github 頁面按鈕",
|
||||
"play-on-youtube-music": "顯示 Play on YouTube Music 按鈕",
|
||||
"set-inactivity-timeout": "設定閒置狀態時長"
|
||||
},
|
||||
"name": "Discord狀態",
|
||||
"name": "Discord 狀態",
|
||||
"prompt": {
|
||||
"set-inactivity-timeout": {
|
||||
"label": "設定多少秒後清除狀態:",
|
||||
"label": "設定多少秒後清除狀態:",
|
||||
"title": "設定閒置狀態時長"
|
||||
}
|
||||
}
|
||||
@ -384,11 +438,11 @@
|
||||
}
|
||||
},
|
||||
"feedback": {
|
||||
"conversion-progress": "轉檔進度: {{percent}}%",
|
||||
"conversion-progress": "轉檔進度:{{percent}}%",
|
||||
"converting": "轉檔中…",
|
||||
"done": "完成下載: {{filePath}}",
|
||||
"done": "完成下載:{{filePath}}",
|
||||
"download-info": "正在下載 {{artist}} - {{title}} [{{videoId}}",
|
||||
"download-progress": "下載進度: {{percent}}%",
|
||||
"download-progress": "下載進度:{{percent}}%",
|
||||
"downloading": "下載中…",
|
||||
"downloading-counter": "正在下載第 {{current}}/{{total}}…",
|
||||
"downloading-playlist": "正在下載播放清單 \"{{playlistTitle}}\" - 共 {{playlistSize}} 首歌 ({{playlistId}})",
|
||||
@ -399,17 +453,32 @@
|
||||
"playlist-has-only-one-song": "播放清單內只有一首歌曲, 將直接下載",
|
||||
"playlist-id-not-found": "沒有找到播放清單 ID",
|
||||
"playlist-is-empty": "播放清單是空的",
|
||||
"playlist-is-mix-or-private": "獲取播放清單資訊時發生錯誤: 請確認非私人播放清單或是\"為你推薦的合輯\"\n\n{{error}}",
|
||||
"playlist-is-mix-or-private": "獲取播放清單資訊時發生錯誤:請確認非私人播放清單或是\"為你推薦的合輯\"\n\n{{error}}",
|
||||
"preparing-file": "正在準備檔案…",
|
||||
"saving": "儲存中…",
|
||||
"trying-to-get-playlist-id": "正在嘗試獲取播放清單 ID: {{playlistId}}",
|
||||
"trying-to-get-playlist-id": "正在嘗試獲取播放清單 ID:{{playlistId}}",
|
||||
"video-id-not-found": "未能找到該影片",
|
||||
"writing-id3": "正在寫入 ID3 標籤…"
|
||||
}
|
||||
},
|
||||
"description": "在應用程式內下載 MP3/原始音樂檔",
|
||||
"description": "開啟應用程式內下載 MP3/原始音檔功能",
|
||||
"menu": {
|
||||
"choose-download-folder": "選擇下載位置",
|
||||
"download-finish-settings": {
|
||||
"label": "智慧下載",
|
||||
"prompt": {
|
||||
"last-percent": "歌曲剩餘多少 % 時下載",
|
||||
"last-seconds": "歌曲剩餘多少秒時下載",
|
||||
"title": "智慧下載進階設定"
|
||||
},
|
||||
"submenu": {
|
||||
"advanced": "進階",
|
||||
"enabled": "啟用",
|
||||
"mode": "判斷方式",
|
||||
"percent": "百分比",
|
||||
"seconds": "秒數"
|
||||
}
|
||||
},
|
||||
"download-playlist": "下載播放清單",
|
||||
"presets": "預設格式",
|
||||
"skip-existing": "跳過已存在的檔案"
|
||||
@ -422,6 +491,18 @@
|
||||
"button": "下載"
|
||||
}
|
||||
},
|
||||
"equalizer": {
|
||||
"description": "為播放器加入等化器",
|
||||
"menu": {
|
||||
"presets": {
|
||||
"label": "預設格式",
|
||||
"list": {
|
||||
"bass-booster": "低音增強器"
|
||||
}
|
||||
}
|
||||
},
|
||||
"name": "等化器"
|
||||
},
|
||||
"exponential-volume": {
|
||||
"description": "使音量滑桿指數化,以便更容易選擇較低的音量。",
|
||||
"name": "指數化音量調整"
|
||||
@ -444,7 +525,7 @@
|
||||
},
|
||||
"name": "第三方字幕",
|
||||
"renderer": {
|
||||
"fetched-lyrics": "為Genius獲取字幕"
|
||||
"fetched-lyrics": "為 Genius 獲取字幕"
|
||||
}
|
||||
},
|
||||
"music-together": {
|
||||
@ -494,12 +575,12 @@
|
||||
}
|
||||
},
|
||||
"navigation": {
|
||||
"description": "將上一頁/下一頁按鈕新增至應用程式上方, 就像你最熟悉的瀏覽器",
|
||||
"description": "允許應用程式上方顯示上一頁/下一頁按鈕",
|
||||
"name": "導覽列"
|
||||
},
|
||||
"no-google-login": {
|
||||
"description": "移除Google登入按鈕及連結",
|
||||
"name": "停用Google登入"
|
||||
"description": "移除 Google 登入按鈕及連結",
|
||||
"name": "停用 Google 登入"
|
||||
},
|
||||
"notifications": {
|
||||
"description": "在歌曲播放時發送一個系統通知 (可互動通知僅限Windows)",
|
||||
@ -563,7 +644,7 @@
|
||||
"decrease": "降低音量",
|
||||
"increase": "增加音量"
|
||||
},
|
||||
"label": "選擇全域音量控制快捷鍵:",
|
||||
"label": "選擇全域音量控制快捷鍵:",
|
||||
"title": "全域音量控制快捷鍵"
|
||||
},
|
||||
"volume-steps": {
|
||||
@ -576,8 +657,8 @@
|
||||
"backend": {
|
||||
"dialog": {
|
||||
"quality-changer": {
|
||||
"detail": "目前畫質: {{quality}}",
|
||||
"message": "選擇影片畫質:",
|
||||
"detail": "目前畫質:{{quality}}",
|
||||
"message": "選擇影片畫質:",
|
||||
"title": "選擇影片畫質"
|
||||
}
|
||||
}
|
||||
@ -632,7 +713,7 @@
|
||||
"play-pause": "播放/暫停",
|
||||
"previous": "上一首"
|
||||
},
|
||||
"label": "選擇全域音樂控制快捷鍵:",
|
||||
"label": "選擇全域音樂控制快捷鍵:",
|
||||
"title": "全域快捷鍵"
|
||||
}
|
||||
}
|
||||
@ -649,8 +730,65 @@
|
||||
"description": "自動跳過贊助片段",
|
||||
"name": "贊助阻擋"
|
||||
},
|
||||
"synced-lyrics": {
|
||||
"description": "使用 LRClib 等管道提供歌詞同步顯示。",
|
||||
"errors": {
|
||||
"fetch": "⚠️\t擷取歌詞時發生錯誤\n請稍後再試。",
|
||||
"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": "更精確的計算下一行歌詞的顯示(將會降低些許效能)"
|
||||
},
|
||||
"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": "透過工作列應用程式圖式控制媒體播放",
|
||||
"description": "允許工作列應用程式預覽介面顯示媒體控制相關按鈕",
|
||||
"name": "工作列媒體控制"
|
||||
},
|
||||
"touchbar": {
|
||||
|
||||
140
src/index.ts
@ -11,6 +11,8 @@ import {
|
||||
shell,
|
||||
dialog,
|
||||
ipcMain,
|
||||
protocol,
|
||||
type BrowserWindowConstructorOptions,
|
||||
} from 'electron';
|
||||
import enhanceWebRequest, {
|
||||
BetterSession,
|
||||
@ -82,6 +84,34 @@ if (!gotTheLock) {
|
||||
app.exit();
|
||||
}
|
||||
|
||||
protocol.registerSchemesAsPrivileged([
|
||||
{
|
||||
scheme: 'http',
|
||||
privileges: {
|
||||
standard: true,
|
||||
bypassCSP: true,
|
||||
allowServiceWorkers: true,
|
||||
supportFetchAPI: true,
|
||||
corsEnabled: true,
|
||||
stream: true,
|
||||
codeCache: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
scheme: 'https',
|
||||
privileges: {
|
||||
standard: true,
|
||||
bypassCSP: true,
|
||||
allowServiceWorkers: true,
|
||||
supportFetchAPI: true,
|
||||
corsEnabled: true,
|
||||
stream: true,
|
||||
codeCache: true,
|
||||
},
|
||||
},
|
||||
{ scheme: 'mailto', privileges: { standard: true } },
|
||||
]);
|
||||
|
||||
// Ozone platform hint: Required for Wayland support
|
||||
app.commandLine.appendSwitch('ozone-platform-hint', 'auto');
|
||||
// SharedArrayBuffer: Required for downloader (@ffmpeg/core-mt)
|
||||
@ -100,9 +130,14 @@ if (config.get('options.disableHardwareAcceleration')) {
|
||||
app.disableHardwareAcceleration();
|
||||
}
|
||||
|
||||
if (is.linux() && config.plugins.isEnabled('shortcuts')) {
|
||||
if (is.linux()) {
|
||||
// Overrides WM_CLASS for X11 to correspond to icon filename
|
||||
app.setName('com.github.th_ch.youtube_music');
|
||||
|
||||
// Stops chromium from launching its own MPRIS service
|
||||
app.commandLine.appendSwitch('disable-features', 'MediaSessionService');
|
||||
if (config.plugins.isEnabled('shortcuts')) {
|
||||
app.commandLine.appendSwitch('disable-features', 'MediaSessionService');
|
||||
}
|
||||
}
|
||||
|
||||
if (config.get('options.proxy')) {
|
||||
@ -277,6 +312,23 @@ async function createMainWindow() {
|
||||
height: 32,
|
||||
};
|
||||
|
||||
const decorations: Partial<BrowserWindowConstructorOptions> = {
|
||||
frame: !is.macOS() && !useInlineMenu,
|
||||
titleBarOverlay: defaultTitleBarOverlayOptions,
|
||||
titleBarStyle: useInlineMenu
|
||||
? 'hidden'
|
||||
: is.macOS()
|
||||
? 'hiddenInset'
|
||||
: 'default',
|
||||
autoHideMenuBar: config.get('options.hideMenu'),
|
||||
};
|
||||
|
||||
// Note: on linux, for some weird reason, having these extra properties with 'frame: false' does not work
|
||||
if (is.linux() && useInlineMenu) {
|
||||
delete decorations.titleBarOverlay;
|
||||
delete decorations.titleBarStyle;
|
||||
}
|
||||
|
||||
const win = new BrowserWindow({
|
||||
icon,
|
||||
width: windowSize.width,
|
||||
@ -294,14 +346,7 @@ async function createMainWindow() {
|
||||
sandbox: false,
|
||||
}),
|
||||
},
|
||||
frame: !is.macOS() && !useInlineMenu,
|
||||
titleBarOverlay: defaultTitleBarOverlayOptions,
|
||||
titleBarStyle: useInlineMenu
|
||||
? 'hidden'
|
||||
: is.macOS()
|
||||
? 'hiddenInset'
|
||||
: 'default',
|
||||
autoHideMenuBar: config.get('options.hideMenu'),
|
||||
...decorations,
|
||||
});
|
||||
initHook(win);
|
||||
initTheme(win);
|
||||
@ -312,28 +357,31 @@ async function createMainWindow() {
|
||||
const { x: windowX, y: windowY } = windowPosition;
|
||||
const winSize = win.getSize();
|
||||
const display = screen.getDisplayNearestPoint(windowPosition);
|
||||
const scaleFactor = is.windows() ? display.scaleFactor: 1;
|
||||
const primaryDisplay = screen.getPrimaryDisplay();
|
||||
|
||||
const scaledWidth = Math.floor(windowSize.width / scaleFactor);
|
||||
const scaledHeight = Math.floor(windowSize.height / scaleFactor);
|
||||
const scaleFactor = is.windows()
|
||||
? primaryDisplay.scaleFactor / display.scaleFactor
|
||||
: 1;
|
||||
const scaledWidth = Math.floor(windowSize.width * scaleFactor);
|
||||
const scaledHeight = Math.floor(windowSize.height * scaleFactor);
|
||||
|
||||
const scaledX = windowX;
|
||||
const scaledY = windowY;
|
||||
|
||||
if (
|
||||
scaledX + scaledWidth < display.bounds.x - 8 ||
|
||||
scaledX - scaledWidth > display.bounds.x + display.bounds.width ||
|
||||
scaledY < display.bounds.y - 8 ||
|
||||
scaledY > display.bounds.y + display.bounds.height
|
||||
scaledX + scaledWidth / 2 < display.bounds.x - 8 || // Left
|
||||
scaledX + scaledWidth / 2 > display.bounds.x + display.bounds.width || // Right
|
||||
scaledY < display.bounds.y - 8 || // Top
|
||||
scaledY + scaledHeight / 2 > display.bounds.y + display.bounds.height // Bottom
|
||||
) {
|
||||
// Window is offscreen
|
||||
if (is.dev()) {
|
||||
console.warn(
|
||||
LoggerPrefix,
|
||||
t('main.console.window.tried-to-render-offscreen', {
|
||||
winSize: String(winSize),
|
||||
displaySize: String(display.bounds),
|
||||
windowPosition: String(windowPosition),
|
||||
windowSize: String(winSize),
|
||||
displaySize: JSON.stringify(display.bounds),
|
||||
position: JSON.stringify(windowPosition),
|
||||
}),
|
||||
);
|
||||
}
|
||||
@ -421,7 +469,7 @@ async function createMainWindow() {
|
||||
...defaultTitleBarOverlayOptions,
|
||||
height: Math.floor(
|
||||
defaultTitleBarOverlayOptions.height! *
|
||||
win.webContents.getZoomFactor(),
|
||||
win.webContents.getZoomFactor(),
|
||||
),
|
||||
});
|
||||
}
|
||||
@ -434,7 +482,7 @@ async function createMainWindow() {
|
||||
event.preventDefault();
|
||||
|
||||
win.webContents.loadURL(
|
||||
'https://accounts.google.com/ServiceLogin?ltmpl=music&service=youtube&continue=https%3A%2F%2Fwww.youtube.com%2Fsignin%3Faction_handle_signin%3Dtrue%26next%3Dhttps%253A%252F%252Fmusic.youtube.com%252F'
|
||||
'https://accounts.google.com/ServiceLogin?ltmpl=music&service=youtube&continue=https%3A%2F%2Fwww.youtube.com%2Fsignin%3Faction_handle_signin%3Dtrue%26next%3Dhttps%253A%252F%252Fmusic.youtube.com%252F',
|
||||
);
|
||||
}
|
||||
});
|
||||
@ -449,17 +497,18 @@ app.once('browser-window-created', (_event, win) => {
|
||||
// User agents are from https://developers.whatismybrowser.com/useragents/explore/
|
||||
const originalUserAgent = win.webContents.userAgent;
|
||||
const userAgents = {
|
||||
mac: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 12.1; rv:95.0) Gecko/20100101 Firefox/95.0',
|
||||
mac: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.6723.152 Safari/537.36',
|
||||
windows:
|
||||
'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0',
|
||||
linux: 'Mozilla/5.0 (Linux x86_64; rv:95.0) Gecko/20100101 Firefox/95.0',
|
||||
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.6723.152 Safari/537.36',
|
||||
linux:
|
||||
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.6723.152 Safari/537.36',
|
||||
};
|
||||
|
||||
const updatedUserAgent = is.macOS()
|
||||
? userAgents.mac
|
||||
: is.windows()
|
||||
? userAgents.windows
|
||||
: userAgents.linux;
|
||||
? userAgents.windows
|
||||
: userAgents.linux;
|
||||
|
||||
win.webContents.userAgent = updatedUserAgent;
|
||||
app.userAgentFallback = updatedUserAgent;
|
||||
@ -508,7 +557,11 @@ app.once('browser-window-created', (_event, win) => {
|
||||
console.log(log);
|
||||
}
|
||||
|
||||
if (errorCode !== -3) {
|
||||
if (
|
||||
errorCode !== -3 &&
|
||||
// Workaround for #2435
|
||||
!new URL(validatedURL).hostname.includes('doubleclick.net')
|
||||
) {
|
||||
// -3 is a false positive
|
||||
win.webContents.send('log', log);
|
||||
win.webContents.loadFile(ErrorHtmlAsset);
|
||||
@ -597,6 +650,7 @@ app.whenReady().then(async () => {
|
||||
shortcutDetails.target !== appLocation ||
|
||||
shortcutDetails.appUserModelId !== appID
|
||||
) {
|
||||
// eslint-disable-next-line @typescript-eslint/only-throw-error
|
||||
throw 'needUpdate';
|
||||
}
|
||||
} catch (error) {
|
||||
@ -620,7 +674,9 @@ app.whenReady().then(async () => {
|
||||
// In dev mode, get string from process.env.VITE_DEV_SERVER_URL, else use fs.readFileSync
|
||||
if (is.dev() && process.env.ELECTRON_RENDERER_URL) {
|
||||
// HACK: to make vite work with electron renderer (supports hot reload)
|
||||
event.returnValue = [null, `
|
||||
event.returnValue = [
|
||||
null,
|
||||
`
|
||||
console.log('${LoggerPrefix}', 'Loading vite from dev server');
|
||||
(async () => {
|
||||
await new Promise((resolve) => {
|
||||
@ -641,7 +697,8 @@ app.whenReady().then(async () => {
|
||||
document.body.appendChild(rendererScript);
|
||||
})();
|
||||
0
|
||||
`];
|
||||
`,
|
||||
];
|
||||
} else {
|
||||
const rendererPath = path.join(__dirname, '..', 'renderer');
|
||||
const indexHTML = parse(
|
||||
@ -653,7 +710,10 @@ app.whenReady().then(async () => {
|
||||
scriptSrc.getAttribute('src')!,
|
||||
);
|
||||
const scriptString = fs.readFileSync(scriptPath, 'utf-8');
|
||||
event.returnValue = [url.pathToFileURL(scriptPath).toString(), scriptString + ';0'];
|
||||
event.returnValue = [
|
||||
url.pathToFileURL(scriptPath).toString(),
|
||||
scriptString + ';0',
|
||||
];
|
||||
}
|
||||
});
|
||||
|
||||
@ -837,9 +897,21 @@ function removeContentSecurityPolicy(
|
||||
betterSession.webRequest.onHeadersReceived((details, callback) => {
|
||||
details.responseHeaders ??= {};
|
||||
|
||||
// Remove the content security policy
|
||||
delete details.responseHeaders['content-security-policy-report-only'];
|
||||
delete details.responseHeaders['content-security-policy'];
|
||||
// prettier-ignore
|
||||
if (new URL(details.url).protocol === 'https:') {
|
||||
// Remove the content security policy
|
||||
delete details.responseHeaders['content-security-policy-report-only'];
|
||||
delete details.responseHeaders['Content-Security-Policy-Report-Only'];
|
||||
delete details.responseHeaders['content-security-policy'];
|
||||
delete details.responseHeaders['Content-Security-Policy'];
|
||||
|
||||
if (
|
||||
!details.responseHeaders['access-control-allow-origin'] &&
|
||||
!details.responseHeaders['Access-Control-Allow-Origin']
|
||||
) {
|
||||
details.responseHeaders['access-control-allow-origin'] = ['https://music.youtube.com'];
|
||||
}
|
||||
}
|
||||
|
||||
callback({ cancel: false, responseHeaders: details.responseHeaders });
|
||||
});
|
||||
|
||||
@ -34,11 +34,12 @@ const createContext = (
|
||||
win.webContents.send(event, ...args);
|
||||
},
|
||||
handle: (event: string, listener: CallableFunction) => {
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-return,@typescript-eslint/no-unsafe-call
|
||||
ipcMain.handle(event, (_, ...args: unknown[]) => listener(...args));
|
||||
},
|
||||
on: (event: string, listener: CallableFunction) => {
|
||||
ipcMain.on(event, (_, ...args: unknown[]) => {
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-call
|
||||
listener(...args);
|
||||
});
|
||||
},
|
||||
@ -75,11 +76,11 @@ export const forceUnloadMainPlugin = async (
|
||||
);
|
||||
return;
|
||||
} else {
|
||||
console.log(
|
||||
LoggerPrefix,
|
||||
t('common.console.plugins.unload-failed', { pluginName: id }),
|
||||
);
|
||||
return Promise.reject();
|
||||
const message = t('common.console.plugins.unload-failed', {
|
||||
pluginName: id,
|
||||
});
|
||||
console.log(LoggerPrefix, message);
|
||||
return Promise.reject(new Error(message));
|
||||
}
|
||||
} catch (err) {
|
||||
console.error(
|
||||
@ -87,7 +88,7 @@ export const forceUnloadMainPlugin = async (
|
||||
t('common.console.plugins.unload-failed', { pluginName: id }),
|
||||
);
|
||||
console.trace(err);
|
||||
return Promise.reject(err);
|
||||
return Promise.reject(err as Error);
|
||||
}
|
||||
};
|
||||
|
||||
@ -111,11 +112,11 @@ export const forceLoadMainPlugin = async (
|
||||
) {
|
||||
loadedPluginMap[id] = plugin;
|
||||
} else {
|
||||
console.log(
|
||||
LoggerPrefix,
|
||||
t('common.console.plugins.load-failed', { pluginName: id }),
|
||||
);
|
||||
return Promise.reject();
|
||||
const message = t('common.console.plugins.load-failed', {
|
||||
pluginName: id,
|
||||
});
|
||||
console.log(LoggerPrefix, message);
|
||||
return Promise.reject(new Error(message));
|
||||
}
|
||||
} catch (err) {
|
||||
console.error(
|
||||
@ -123,7 +124,7 @@ export const forceLoadMainPlugin = async (
|
||||
t('common.console.plugins.initialize-failed', { pluginName: id }),
|
||||
);
|
||||
console.trace(err);
|
||||
return Promise.reject(err);
|
||||
return Promise.reject(err as Error);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@ -18,7 +18,8 @@ const loadedPluginMap: Record<
|
||||
export const createContext = <Config extends PluginConfig>(
|
||||
id: string,
|
||||
): RendererContext<Config> => ({
|
||||
getConfig: async () => window.ipcRenderer.invoke('ytmd:get-config', id),
|
||||
getConfig: async () =>
|
||||
window.ipcRenderer.invoke('ytmd:get-config', id) as Promise<Config>,
|
||||
setConfig: async (newConfig) => {
|
||||
await window.ipcRenderer.invoke('ytmd:set-config', id, newConfig);
|
||||
},
|
||||
@ -30,6 +31,7 @@ export const createContext = <Config extends PluginConfig>(
|
||||
window.ipcRenderer.invoke(event, ...args),
|
||||
on: (event: string, listener: CallableFunction) => {
|
||||
window.ipcRenderer.on(event, (_, ...args: unknown[]) => {
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-call
|
||||
listener(...args);
|
||||
});
|
||||
},
|
||||
|
||||
167
src/menu.ts
@ -1,5 +1,13 @@
|
||||
import is from 'electron-is';
|
||||
import { app, BrowserWindow, clipboard, dialog, Menu, MenuItem, shell, } from 'electron';
|
||||
import {
|
||||
app,
|
||||
BrowserWindow,
|
||||
clipboard,
|
||||
dialog,
|
||||
Menu,
|
||||
MenuItem,
|
||||
shell,
|
||||
} from 'electron';
|
||||
import prompt from 'custom-electron-prompt';
|
||||
import { satisfies } from 'semver';
|
||||
|
||||
@ -60,7 +68,7 @@ export const mainMenuTemplate = async (
|
||||
win: BrowserWindow,
|
||||
): Promise<MenuTemplate> => {
|
||||
const innerRefreshMenu = () => refreshMenu(win);
|
||||
|
||||
const { navigationHistory } = win.webContents;
|
||||
await loadAllMenuPlugins(win);
|
||||
|
||||
const menuResult = Object.entries(getAllMenuTemplate()).map(
|
||||
@ -68,12 +76,21 @@ export const mainMenuTemplate = async (
|
||||
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 isNew = plugin?.addedVersion
|
||||
? satisfies(packageJson.version, plugin.addedVersion)
|
||||
: false;
|
||||
|
||||
if (!config.plugins.isEnabled(id)) {
|
||||
return [
|
||||
id,
|
||||
pluginEnabledMenu(id, pluginLabel, pluginDescription, isNew, true, innerRefreshMenu),
|
||||
pluginEnabledMenu(
|
||||
id,
|
||||
pluginLabel,
|
||||
pluginDescription,
|
||||
isNew,
|
||||
true,
|
||||
innerRefreshMenu,
|
||||
),
|
||||
] as const;
|
||||
}
|
||||
|
||||
@ -115,9 +132,18 @@ export const mainMenuTemplate = async (
|
||||
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 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);
|
||||
@ -229,12 +255,12 @@ export const mainMenuTemplate = async (
|
||||
submenu: [
|
||||
...((config.get('options.themes')?.length ?? 0) === 0
|
||||
? [
|
||||
{
|
||||
label: t(
|
||||
'main.menu.options.submenu.visual-tweaks.submenu.theme.submenu.no-theme',
|
||||
),
|
||||
}
|
||||
]
|
||||
{
|
||||
label: t(
|
||||
'main.menu.options.submenu.visual-tweaks.submenu.theme.submenu.no-theme',
|
||||
),
|
||||
},
|
||||
]
|
||||
: []),
|
||||
...(config.get('options.themes')?.map((theme: string) => ({
|
||||
type: 'normal' as const,
|
||||
@ -251,16 +277,25 @@ export const mainMenuTemplate = async (
|
||||
{ theme },
|
||||
),
|
||||
buttons: [
|
||||
t('main.menu.options.submenu.visual-tweaks.submenu.theme.dialog.button.cancel'),
|
||||
t('main.menu.options.submenu.visual-tweaks.submenu.theme.dialog.button.remove'),
|
||||
t(
|
||||
'main.menu.options.submenu.visual-tweaks.submenu.theme.dialog.button.cancel',
|
||||
),
|
||||
t(
|
||||
'main.menu.options.submenu.visual-tweaks.submenu.theme.dialog.button.remove',
|
||||
),
|
||||
],
|
||||
});
|
||||
|
||||
if (response === 1) {
|
||||
config.set('options.themes', config.get('options.themes')?.filter((t) => t !== theme) ?? []);
|
||||
config.set(
|
||||
'options.themes',
|
||||
config
|
||||
.get('options.themes')
|
||||
?.filter((t) => t !== theme) ?? [],
|
||||
);
|
||||
innerRefreshMenu();
|
||||
}
|
||||
}
|
||||
},
|
||||
})) ?? []),
|
||||
{ type: 'separator' },
|
||||
{
|
||||
@ -306,40 +341,40 @@ export const mainMenuTemplate = async (
|
||||
},
|
||||
...((is.windows() || is.linux()
|
||||
? [
|
||||
{
|
||||
label: t('main.menu.options.submenu.hide-menu.label'),
|
||||
type: 'checkbox',
|
||||
checked: config.get('options.hideMenu'),
|
||||
click(item) {
|
||||
config.setMenuOption('options.hideMenu', item.checked);
|
||||
if (item.checked && !config.get('options.hideMenuWarned')) {
|
||||
dialog.showMessageBox(win, {
|
||||
type: 'info',
|
||||
title: t(
|
||||
'main.menu.options.submenu.hide-menu.dialog.title',
|
||||
),
|
||||
message: t(
|
||||
'main.menu.options.submenu.hide-menu.dialog.message',
|
||||
),
|
||||
});
|
||||
}
|
||||
{
|
||||
label: t('main.menu.options.submenu.hide-menu.label'),
|
||||
type: 'checkbox',
|
||||
checked: config.get('options.hideMenu'),
|
||||
click(item) {
|
||||
config.setMenuOption('options.hideMenu', item.checked);
|
||||
if (item.checked && !config.get('options.hideMenuWarned')) {
|
||||
dialog.showMessageBox(win, {
|
||||
type: 'info',
|
||||
title: t(
|
||||
'main.menu.options.submenu.hide-menu.dialog.title',
|
||||
),
|
||||
message: t(
|
||||
'main.menu.options.submenu.hide-menu.dialog.message',
|
||||
),
|
||||
});
|
||||
}
|
||||
},
|
||||
},
|
||||
},
|
||||
]
|
||||
]
|
||||
: []) satisfies Electron.MenuItemConstructorOptions[]),
|
||||
...((is.windows() || is.macOS()
|
||||
? // Only works on Win/Mac
|
||||
// https://www.electronjs.org/docs/api/app#appsetloginitemsettingssettings-macos-windows
|
||||
[
|
||||
{
|
||||
label: t('main.menu.options.submenu.start-at-login'),
|
||||
type: 'checkbox',
|
||||
checked: config.get('options.startAtLogin'),
|
||||
click(item) {
|
||||
config.setMenuOption('options.startAtLogin', item.checked);
|
||||
[
|
||||
{
|
||||
label: t('main.menu.options.submenu.start-at-login'),
|
||||
type: 'checkbox',
|
||||
checked: config.get('options.startAtLogin'),
|
||||
click(item) {
|
||||
config.setMenuOption('options.startAtLogin', item.checked);
|
||||
},
|
||||
},
|
||||
},
|
||||
]
|
||||
]
|
||||
: []) satisfies Electron.MenuItemConstructorOptions[]),
|
||||
{
|
||||
label: t('main.menu.options.submenu.tray.label'),
|
||||
@ -493,25 +528,25 @@ export const mainMenuTemplate = async (
|
||||
{ type: 'separator' },
|
||||
is.macOS()
|
||||
? {
|
||||
label: t(
|
||||
'main.menu.options.submenu.advanced-options.submenu.toggle-dev-tools',
|
||||
),
|
||||
// Cannot use "toggleDevTools" role in macOS
|
||||
click() {
|
||||
const { webContents } = win;
|
||||
if (webContents.isDevToolsOpened()) {
|
||||
webContents.closeDevTools();
|
||||
} else {
|
||||
webContents.openDevTools();
|
||||
}
|
||||
},
|
||||
}
|
||||
label: t(
|
||||
'main.menu.options.submenu.advanced-options.submenu.toggle-dev-tools',
|
||||
),
|
||||
// Cannot use "toggleDevTools" role in macOS
|
||||
click() {
|
||||
const { webContents } = win;
|
||||
if (webContents.isDevToolsOpened()) {
|
||||
webContents.closeDevTools();
|
||||
} else {
|
||||
webContents.openDevTools();
|
||||
}
|
||||
},
|
||||
}
|
||||
: {
|
||||
label: t(
|
||||
'main.menu.options.submenu.advanced-options.submenu.toggle-dev-tools',
|
||||
),
|
||||
role: 'toggleDevTools',
|
||||
},
|
||||
label: t(
|
||||
'main.menu.options.submenu.advanced-options.submenu.toggle-dev-tools',
|
||||
),
|
||||
role: 'toggleDevTools',
|
||||
},
|
||||
{
|
||||
label: t(
|
||||
'main.menu.options.submenu.advanced-options.submenu.edit-config-json',
|
||||
@ -575,16 +610,16 @@ export const mainMenuTemplate = async (
|
||||
{
|
||||
label: t('main.menu.navigation.submenu.go-back'),
|
||||
click() {
|
||||
if (win.webContents.canGoBack()) {
|
||||
win.webContents.goBack();
|
||||
if (navigationHistory.canGoBack()) {
|
||||
navigationHistory.goBack();
|
||||
}
|
||||
},
|
||||
},
|
||||
{
|
||||
label: t('main.menu.navigation.submenu.go-forward'),
|
||||
click() {
|
||||
if (win.webContents.canGoForward()) {
|
||||
win.webContents.goForward();
|
||||
if (navigationHistory.canGoForward()) {
|
||||
navigationHistory.goForward();
|
||||
}
|
||||
},
|
||||
},
|
||||
|
||||
58
src/plugins/adblocker/adSpeedup.ts
Normal file
@ -0,0 +1,58 @@
|
||||
function skipAd(target: Element) {
|
||||
const skipButton = target.querySelector<HTMLButtonElement>(
|
||||
'button.ytp-ad-skip-button-modern',
|
||||
);
|
||||
if (skipButton) {
|
||||
skipButton.click();
|
||||
}
|
||||
}
|
||||
|
||||
function speedUpAndMute(player: Element, isAdShowing: boolean) {
|
||||
const video = player.querySelector<HTMLVideoElement>('video');
|
||||
if (!video) return;
|
||||
if (isAdShowing) {
|
||||
video.playbackRate = 16;
|
||||
video.muted = true;
|
||||
} else if (!isAdShowing) {
|
||||
video.playbackRate = 1;
|
||||
video.muted = false;
|
||||
}
|
||||
}
|
||||
|
||||
export const loadAdSpeedup = () => {
|
||||
const player = document.querySelector<HTMLVideoElement>('#movie_player');
|
||||
if (!player) return;
|
||||
|
||||
new MutationObserver((mutations) => {
|
||||
for (const mutation of mutations) {
|
||||
if (
|
||||
mutation.type === 'attributes' &&
|
||||
mutation.attributeName === 'class'
|
||||
) {
|
||||
const target = mutation.target as HTMLElement;
|
||||
|
||||
const isAdShowing =
|
||||
target.classList.contains('ad-showing') ||
|
||||
target.classList.contains('ad-interrupting');
|
||||
speedUpAndMute(target, isAdShowing);
|
||||
}
|
||||
if (
|
||||
mutation.type === 'childList' &&
|
||||
mutation.addedNodes.length &&
|
||||
mutation.target instanceof HTMLElement
|
||||
) {
|
||||
skipAd(mutation.target);
|
||||
}
|
||||
}
|
||||
}).observe(player, {
|
||||
attributes: true,
|
||||
childList: true,
|
||||
subtree: true,
|
||||
});
|
||||
|
||||
const isAdShowing =
|
||||
player.classList.contains('ad-showing') ||
|
||||
player.classList.contains('ad-interrupting');
|
||||
speedUpAndMute(player, isAdShowing);
|
||||
skipAd(player);
|
||||
};
|
||||
@ -2,7 +2,7 @@
|
||||
import path from 'node:path';
|
||||
import fs, { promises } from 'node:fs';
|
||||
|
||||
import { ElectronBlocker } from '@cliqz/adblocker-electron';
|
||||
import { ElectronBlocker } from '@ghostery/adblocker-electron';
|
||||
import { app, net } from 'electron';
|
||||
|
||||
const SOURCES = [
|
||||
@ -55,6 +55,7 @@ export const loadAdBlockerEngine = async (
|
||||
(url: string) => net.fetch(url),
|
||||
lists,
|
||||
{
|
||||
enableCompression: true,
|
||||
// When generating the engine for caching, do not load network filters
|
||||
// So that enhancing the session works as expected
|
||||
// Allowing to define multiple webRequest listeners
|
||||
@ -66,7 +67,7 @@ export const loadAdBlockerEngine = async (
|
||||
blocker.enableBlockingInSession(session);
|
||||
}
|
||||
} catch (error) {
|
||||
console.log('Error loading adBlocker engine', error);
|
||||
console.error('Error loading adBlocker engine', error);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@ -8,8 +8,8 @@ import {
|
||||
unloadAdBlockerEngine,
|
||||
} from './blocker';
|
||||
|
||||
import injectCliqzPreload from './injectors/inject-cliqz-preload';
|
||||
import { inject, isInjected } from './injectors/inject';
|
||||
import { loadAdSpeedup } from './adSpeedup';
|
||||
|
||||
import { t } from '@/i18n';
|
||||
|
||||
@ -72,6 +72,14 @@ export default createPlugin({
|
||||
},
|
||||
];
|
||||
},
|
||||
renderer: {
|
||||
async onPlayerApiReady(_, { getConfig }) {
|
||||
const config = await getConfig();
|
||||
if (config.blocker === blockers.AdSpeedup) {
|
||||
await loadAdSpeedup();
|
||||
}
|
||||
},
|
||||
},
|
||||
backend: {
|
||||
mainWindow: null as BrowserWindow | null,
|
||||
async start({ getConfig, window }) {
|
||||
@ -109,22 +117,29 @@ export default createPlugin({
|
||||
},
|
||||
},
|
||||
preload: {
|
||||
script: 'window.JSON.parse = window._proxyJsonParse; window._proxyJsonParse = undefined; window.Response.prototype.json = window._proxyResponseJson; window._proxyResponseJson = undefined; 0',
|
||||
// see #1478
|
||||
script: `const _prunerFn = window._pruner;
|
||||
window._pruner = undefined;
|
||||
JSON.parse = new Proxy(JSON.parse, {
|
||||
apply() {
|
||||
return _prunerFn(Reflect.apply(...arguments));
|
||||
},
|
||||
});
|
||||
Response.prototype.json = new Proxy(Response.prototype.json, {
|
||||
apply() {
|
||||
return Reflect.apply(...arguments).then((o) => _prunerFn(o));
|
||||
},
|
||||
}); 0`,
|
||||
async start({ getConfig }) {
|
||||
const config = await getConfig();
|
||||
|
||||
if (config.blocker === blockers.WithBlocklists) {
|
||||
// Preload adblocker to inject scripts/styles
|
||||
await injectCliqzPreload();
|
||||
} else if (config.blocker === blockers.InPlayer && !isInjected()) {
|
||||
if (config.blocker === blockers.InPlayer && !isInjected()) {
|
||||
inject(contextBridge);
|
||||
await webFrame.executeJavaScript(this.script);
|
||||
}
|
||||
},
|
||||
async onConfigChange(newConfig) {
|
||||
if (newConfig.blocker === blockers.WithBlocklists) {
|
||||
await injectCliqzPreload();
|
||||
} else if (newConfig.blocker === blockers.InPlayer && !isInjected()) {
|
||||
if (newConfig.blocker === blockers.InPlayer && !isInjected()) {
|
||||
inject(contextBridge);
|
||||
await webFrame.executeJavaScript(this.script);
|
||||
}
|
||||
|
||||
@ -1,3 +1,3 @@
|
||||
export default async () => {
|
||||
await import('@cliqz/adblocker-electron-preload');
|
||||
await import('@ghostery/adblocker-electron-preload');
|
||||
};
|
||||
|
||||
@ -37,19 +37,9 @@ export const inject = (contextBridge) => {
|
||||
|
||||
//
|
||||
return o;
|
||||
};
|
||||
}
|
||||
|
||||
contextBridge.exposeInMainWorld('_proxyJsonParse', new Proxy(JSON.parse, {
|
||||
apply() {
|
||||
return pruner(Reflect.apply(...arguments));
|
||||
},
|
||||
}));
|
||||
|
||||
contextBridge.exposeInMainWorld('_proxyResponseJson', new Proxy(Response.prototype.json, {
|
||||
apply() {
|
||||
return Reflect.apply(...arguments).then((o) => pruner(o));
|
||||
},
|
||||
}));
|
||||
contextBridge.exposeInMainWorld('_pruner', pruner);
|
||||
}
|
||||
|
||||
const chains = [
|
||||
|
||||
@ -1,4 +1,5 @@
|
||||
export const blockers = {
|
||||
WithBlocklists: 'With blocklists',
|
||||
InPlayer: 'In player',
|
||||
AdSpeedup: 'Ad speedup',
|
||||
} as const;
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
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';
|
||||
@ -16,7 +17,6 @@ export default createPlugin<
|
||||
changeObserver?: MutationObserver;
|
||||
waiting: boolean;
|
||||
onPageChange(): void;
|
||||
waitForElem(selector: string): Promise<HTMLElement>;
|
||||
loadFullList: (event: MouseEvent) => void;
|
||||
applyToList(id: string, loader: HTMLElement): void;
|
||||
start(): void;
|
||||
@ -50,7 +50,7 @@ export default createPlugin<
|
||||
} else {
|
||||
this.waiting = true;
|
||||
}
|
||||
const continuations = await this.waitForElem('#continuations');
|
||||
const continuations = await waitForElement<HTMLElement>('#continuations');
|
||||
this.waiting = false;
|
||||
//Gets the for buttons
|
||||
const buttons: Array<HTMLElement> = [
|
||||
@ -104,16 +104,28 @@ export default createPlugin<
|
||||
buttons.splice(i, 1);
|
||||
i--;
|
||||
} else {
|
||||
(buttons[i].children[0].children[0] as HTMLElement).style.setProperty(
|
||||
(
|
||||
buttons[i].children[0].children[0] as HTMLElement
|
||||
).style.setProperty(
|
||||
'-webkit-mask-size',
|
||||
`100% ${100 - ((count / listsLength) * 100)}%`,
|
||||
`100% ${100 - (count / listsLength) * 100}%`,
|
||||
);
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
const menu = document.querySelector('.detail-page-menu');
|
||||
if (menu && !document.querySelector('.like-menu')) {
|
||||
const menuParent =
|
||||
document.querySelector('#action-buttons')?.parentElement;
|
||||
if (menuParent && !document.querySelector('.like-menu')) {
|
||||
const menu = document.createElement('div');
|
||||
menu.id = 'ytmd-album-action-buttons';
|
||||
menu.className =
|
||||
'action-buttons style-scope ytmusic-responsive-header-renderer';
|
||||
|
||||
menuParent.insertBefore(
|
||||
menu,
|
||||
menuParent.children[menuParent.children.length - 1],
|
||||
);
|
||||
for (const button of buttons) {
|
||||
menu.appendChild(button);
|
||||
button.addEventListener('click', this.loadFullList);
|
||||
@ -121,9 +133,11 @@ export default createPlugin<
|
||||
}
|
||||
},
|
||||
loadFullList(event: MouseEvent) {
|
||||
if (event.currentTarget instanceof Element) {
|
||||
if (event.target instanceof Element) {
|
||||
event.stopPropagation();
|
||||
const id = event.currentTarget.id;
|
||||
const button = event.target.closest('button') as HTMLElement;
|
||||
if (!button?.id) return;
|
||||
const id = button.id;
|
||||
const loader = document.getElementById('continuations')!;
|
||||
this.loadObserver = new MutationObserver(() => {
|
||||
this.applyToList(id, loader);
|
||||
@ -178,16 +192,5 @@ export default createPlugin<
|
||||
button.remove();
|
||||
}
|
||||
},
|
||||
waitForElem(selector: string) {
|
||||
return new Promise((resolve) => {
|
||||
const interval = setInterval(() => {
|
||||
const elem = document.querySelector<HTMLElement>(selector);
|
||||
if (!elem) return;
|
||||
|
||||
clearInterval(interval);
|
||||
resolve(elem);
|
||||
});
|
||||
});
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
@ -1,40 +1,58 @@
|
||||
<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="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: white;
|
||||
-webkit-mask: linear-gradient(grey, grey);
|
||||
-webkit-mask-size: 100% 50%;
|
||||
-webkit-mask-repeat: no-repeat;
|
||||
z-index: 1;
|
||||
position: absolute;
|
||||
"
|
||||
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%;
|
||||
"
|
||||
style="pointer-events: none; display: block; width: 100%; height: 100%"
|
||||
>
|
||||
<g class="style-scope yt-icon">
|
||||
<path
|
||||
@ -45,30 +63,14 @@
|
||||
</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%"
|
||||
<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"
|
||||
>
|
||||
<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 class="yt-spec-touch-feedback-shape__stroke"></div>
|
||||
<div class="yt-spec-touch-feedback-shape__fill"></div>
|
||||
</div>
|
||||
</yt-touch-feedback-shape>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
@ -1,40 +1,58 @@
|
||||
<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="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: white;
|
||||
-webkit-mask: linear-gradient(grey, grey);
|
||||
-webkit-mask-size: 100% 50%;
|
||||
-webkit-mask-repeat: no-repeat;
|
||||
z-index: 1;
|
||||
position: absolute;
|
||||
"
|
||||
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%;
|
||||
"
|
||||
style="pointer-events: none; display: block; width: 100%; height: 100%"
|
||||
>
|
||||
<g class="style-scope yt-icon">
|
||||
<path
|
||||
@ -45,30 +63,14 @@
|
||||
</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%"
|
||||
<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"
|
||||
>
|
||||
<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 class="yt-spec-touch-feedback-shape__stroke"></div>
|
||||
<div class="yt-spec-touch-feedback-shape__fill"></div>
|
||||
</div>
|
||||
</yt-touch-feedback-shape>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
@ -1,40 +1,58 @@
|
||||
<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="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: white;
|
||||
-webkit-mask: linear-gradient(grey, grey);
|
||||
-webkit-mask-size: 100% 50%;
|
||||
-webkit-mask-repeat: no-repeat;
|
||||
z-index: 1;
|
||||
position: absolute;
|
||||
"
|
||||
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%;
|
||||
"
|
||||
style="pointer-events: none; display: block; width: 100%; height: 100%"
|
||||
>
|
||||
<g class="style-scope yt-icon">
|
||||
<path
|
||||
@ -45,30 +63,14 @@
|
||||
</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%"
|
||||
<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"
|
||||
>
|
||||
<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 class="yt-spec-touch-feedback-shape__stroke"></div>
|
||||
<div class="yt-spec-touch-feedback-shape__fill"></div>
|
||||
</div>
|
||||
</yt-touch-feedback-shape>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
@ -1,40 +1,58 @@
|
||||
<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="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: white;
|
||||
-webkit-mask: linear-gradient(grey, grey);
|
||||
-webkit-mask-size: 100% 50%;
|
||||
-webkit-mask-repeat: no-repeat;
|
||||
z-index: 1;
|
||||
position: absolute;
|
||||
"
|
||||
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%;
|
||||
"
|
||||
style="pointer-events: none; display: block; width: 100%; height: 100%"
|
||||
>
|
||||
<g class="style-scope yt-icon">
|
||||
<path
|
||||
@ -45,30 +63,14 @@
|
||||
</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%"
|
||||
<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"
|
||||
>
|
||||
<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 class="yt-spec-touch-feedback-shape__stroke"></div>
|
||||
<div class="yt-spec-touch-feedback-shape__fill"></div>
|
||||
</div>
|
||||
</yt-touch-feedback-shape>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
import { FastAverageColor } from 'fast-average-color';
|
||||
import Color from 'color';
|
||||
import Color, { ColorInstance } from 'color';
|
||||
|
||||
import style from './style.css?inline';
|
||||
|
||||
@ -14,8 +14,8 @@ export default createPlugin<
|
||||
unknown,
|
||||
unknown,
|
||||
{
|
||||
color?: Color;
|
||||
darkColor?: Color;
|
||||
color?: ColorInstance;
|
||||
darkColor?: ColorInstance;
|
||||
|
||||
playerPage: HTMLElement | null;
|
||||
navBarBackground: HTMLElement | null;
|
||||
@ -25,7 +25,12 @@ export default createPlugin<
|
||||
sidebarSmall: HTMLElement | null;
|
||||
ytmusicAppLayout: HTMLElement | null;
|
||||
|
||||
getMixedColor(color: string, key: string, alpha?: number, ratioMultiply?: number): string;
|
||||
getMixedColor(
|
||||
color: string,
|
||||
key: string,
|
||||
alpha?: number,
|
||||
ratioMultiply?: number,
|
||||
): string;
|
||||
updateColor(): void;
|
||||
},
|
||||
{
|
||||
@ -91,7 +96,10 @@ export default createPlugin<
|
||||
this.ytmusicAppLayout = document.querySelector<HTMLElement>('#layout');
|
||||
|
||||
const config = await getConfig();
|
||||
document.documentElement.style.setProperty(RATIO_KEY, `${~~(config.ratio * 100)}%`);
|
||||
document.documentElement.style.setProperty(
|
||||
RATIO_KEY,
|
||||
`${~~(config.ratio * 100)}%`,
|
||||
);
|
||||
},
|
||||
onPlayerApiReady(playerApi) {
|
||||
const fastAverageColor = new FastAverageColor();
|
||||
@ -100,10 +108,12 @@ export default createPlugin<
|
||||
if (event.detail.name !== 'dataloaded') return;
|
||||
|
||||
const playerResponse = playerApi.getPlayerResponse();
|
||||
const thumbnail = playerResponse?.videoDetails?.thumbnail?.thumbnails?.at(0);
|
||||
const thumbnail =
|
||||
playerResponse?.videoDetails?.thumbnail?.thumbnails?.at(0);
|
||||
if (!thumbnail) return;
|
||||
|
||||
const albumColor = await fastAverageColor.getColorAsync(thumbnail.url)
|
||||
const albumColor = await fastAverageColor
|
||||
.getColorAsync(thumbnail.url)
|
||||
.catch((err) => {
|
||||
console.error(err);
|
||||
return null;
|
||||
@ -120,8 +130,14 @@ export default createPlugin<
|
||||
this.darkColor = this.darkColor?.darken(0.05);
|
||||
}
|
||||
|
||||
document.documentElement.style.setProperty(COLOR_KEY, `${~~this.color.red()}, ${~~this.color.green()}, ${~~this.color.blue()}`);
|
||||
document.documentElement.style.setProperty(DARK_COLOR_KEY, `${~~this.darkColor.red()}, ${~~this.darkColor.green()}, ${~~this.darkColor.blue()}`);
|
||||
document.documentElement.style.setProperty(
|
||||
COLOR_KEY,
|
||||
`${~~this.color.red()}, ${~~this.color.green()}, ${~~this.color.blue()}`,
|
||||
);
|
||||
document.documentElement.style.setProperty(
|
||||
DARK_COLOR_KEY,
|
||||
`${~~this.darkColor.red()}, ${~~this.darkColor.green()}, ${~~this.darkColor.blue()}`,
|
||||
);
|
||||
} else {
|
||||
document.documentElement.style.setProperty(COLOR_KEY, '0, 0, 0');
|
||||
document.documentElement.style.setProperty(DARK_COLOR_KEY, '0, 0, 0');
|
||||
@ -131,7 +147,10 @@ export default createPlugin<
|
||||
});
|
||||
},
|
||||
onConfigChange(config) {
|
||||
document.documentElement.style.setProperty(RATIO_KEY, `${~~(config.ratio * 100)}%`);
|
||||
document.documentElement.style.setProperty(
|
||||
RATIO_KEY,
|
||||
`${~~(config.ratio * 100)}%`,
|
||||
);
|
||||
},
|
||||
getMixedColor(color: string, key: string, alpha = 1, ratioMultiply) {
|
||||
const keyColor = `rgba(var(${key}), ${alpha})`;
|
||||
@ -181,11 +200,23 @@ export default createPlugin<
|
||||
'--yt-spec-black-1-alpha-95': 'rgba(40,40,40,0.95)',
|
||||
};
|
||||
Object.entries(variableMap).map(([variable, color]) => {
|
||||
document.documentElement.style.setProperty(variable, this.getMixedColor(color, COLOR_KEY), 'important');
|
||||
document.documentElement.style.setProperty(
|
||||
variable,
|
||||
this.getMixedColor(color, COLOR_KEY),
|
||||
'important',
|
||||
);
|
||||
});
|
||||
|
||||
document.body.style.setProperty('background', this.getMixedColor('#030303', COLOR_KEY), 'important');
|
||||
document.documentElement.style.setProperty('--ytmusic-background', this.getMixedColor('#030303', DARK_COLOR_KEY), 'important');
|
||||
document.body.style.setProperty(
|
||||
'background',
|
||||
this.getMixedColor('#030303', COLOR_KEY),
|
||||
'important',
|
||||
);
|
||||
document.documentElement.style.setProperty(
|
||||
'--ytmusic-background',
|
||||
this.getMixedColor('#030303', DARK_COLOR_KEY),
|
||||
'important',
|
||||
);
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
@ -4,6 +4,7 @@ import { t } from '@/i18n';
|
||||
import { createPlugin } from '@/utils';
|
||||
import { menu } from './menu';
|
||||
import { AmbientModePluginConfig } from './types';
|
||||
import { waitForElement } from '@/utils/wait-for-element';
|
||||
|
||||
const defaultConfig: AmbientModePluginConfig = {
|
||||
enabled: false,
|
||||
@ -36,7 +37,7 @@ export default createPlugin({
|
||||
unregister: null as (() => void) | null,
|
||||
update: null as (() => void) | null,
|
||||
interval: null as NodeJS.Timeout | null,
|
||||
lastMediaType: null as "video" | "image" | null,
|
||||
lastMediaType: null as 'video' | 'image' | null,
|
||||
lastVideoSource: null as string | null,
|
||||
lastImageSource: null as string | null,
|
||||
|
||||
@ -52,9 +53,16 @@ export default createPlugin({
|
||||
|
||||
const songImage = document.querySelector<HTMLImageElement>('#song-image');
|
||||
const songVideo = document.querySelector<HTMLDivElement>('#song-video');
|
||||
const image = songImage?.querySelector<HTMLImageElement>('yt-img-shadow > img');
|
||||
const video = songVideo?.querySelector<HTMLVideoElement>('.html5-video-container > video');
|
||||
const videoWrapper = document.querySelector('#song-video > .player-wrapper');
|
||||
const image = songImage?.querySelector<HTMLImageElement>(
|
||||
'yt-img-shadow > img',
|
||||
);
|
||||
const video = await waitForElement<HTMLVideoElement>(
|
||||
'.html5-video-container > video',
|
||||
);
|
||||
|
||||
const videoWrapper = document.querySelector(
|
||||
'#song-video > .player-wrapper',
|
||||
);
|
||||
|
||||
const injectBlurImage = () => {
|
||||
if (!songImage || !image) return null;
|
||||
@ -93,7 +101,9 @@ export default createPlugin({
|
||||
const blurCanvas = document.createElement('canvas');
|
||||
blurCanvas.classList.add('html5-blur-canvas');
|
||||
|
||||
const context = blurCanvas.getContext('2d', { willReadFrequently: true });
|
||||
const context = blurCanvas.getContext('2d', {
|
||||
willReadFrequently: true,
|
||||
});
|
||||
|
||||
/* effect */
|
||||
let lastEffectWorkId: number | null = null;
|
||||
@ -107,14 +117,18 @@ export default createPlugin({
|
||||
if (!context) return;
|
||||
|
||||
const width = this.qualityRatio;
|
||||
let height = Math.max(Math.floor((blurCanvas.height / blurCanvas.width) * width), 1,);
|
||||
let height = Math.max(
|
||||
Math.floor((blurCanvas.height / blurCanvas.width) * width),
|
||||
1,
|
||||
);
|
||||
if (!Number.isFinite(height)) height = width;
|
||||
if (!height) return;
|
||||
|
||||
context.globalAlpha = 1;
|
||||
if (lastImageData) {
|
||||
const frameOffset = (1 / this.buffer) * (1000 / this.interpolationTime);
|
||||
context.globalAlpha = 1 - (frameOffset * 2); // because of alpha value must be < 1
|
||||
const frameOffset =
|
||||
(1 / this.buffer) * (1000 / this.interpolationTime);
|
||||
context.globalAlpha = 1 - frameOffset * 2; // because of alpha value must be < 1
|
||||
context.putImageData(lastImageData, 0, 0);
|
||||
context.globalAlpha = frameOffset;
|
||||
}
|
||||
@ -135,7 +149,9 @@ export default createPlugin({
|
||||
if (newWidth === 0 || newHeight === 0) return;
|
||||
|
||||
blurCanvas.width = this.qualityRatio;
|
||||
blurCanvas.height = Math.floor((newHeight / newWidth) * this.qualityRatio);
|
||||
blurCanvas.height = Math.floor(
|
||||
(newHeight / newWidth) * this.qualityRatio,
|
||||
);
|
||||
|
||||
if (this.isFullscreen) blurCanvas.classList.add('fullscreen');
|
||||
else blurCanvas.classList.remove('fullscreen');
|
||||
@ -149,7 +165,10 @@ export default createPlugin({
|
||||
|
||||
/* hooking */
|
||||
let canvasInterval: NodeJS.Timeout | null = null;
|
||||
canvasInterval = setInterval(onSync, Math.max(1, Math.ceil(1000 / this.buffer)));
|
||||
canvasInterval = setInterval(
|
||||
onSync,
|
||||
Math.max(1, Math.ceil(1000 / this.buffer)),
|
||||
);
|
||||
|
||||
const onPause = () => {
|
||||
if (canvasInterval) clearInterval(canvasInterval);
|
||||
@ -157,7 +176,10 @@ export default createPlugin({
|
||||
};
|
||||
const onPlay = () => {
|
||||
if (canvasInterval) clearInterval(canvasInterval);
|
||||
canvasInterval = setInterval(onSync, Math.max(1, Math.ceil(1000 / this.buffer)));
|
||||
canvasInterval = setInterval(
|
||||
onSync,
|
||||
Math.max(1, Math.ceil(1000 / this.buffer)),
|
||||
);
|
||||
};
|
||||
songVideo.addEventListener('pause', onPause);
|
||||
songVideo.addEventListener('play', onPlay);
|
||||
@ -179,12 +201,12 @@ export default createPlugin({
|
||||
const isVideoMode = () => {
|
||||
const songVideo = document.querySelector<HTMLDivElement>('#song-video');
|
||||
if (!songVideo) {
|
||||
this.lastMediaType = "image";
|
||||
this.lastMediaType = 'image';
|
||||
return false;
|
||||
}
|
||||
|
||||
const isVideo = getComputedStyle(songVideo).display !== 'none';
|
||||
this.lastMediaType = isVideo ? "video" : "image";
|
||||
this.lastMediaType = isVideo ? 'video' : 'image';
|
||||
return isVideo;
|
||||
};
|
||||
|
||||
@ -196,16 +218,25 @@ export default createPlugin({
|
||||
if (isPageOpen) {
|
||||
const isVideo = isVideoMode();
|
||||
if (!force) {
|
||||
if (this.lastMediaType === "video" && this.lastVideoSource === video?.src) return false;
|
||||
if (this.lastMediaType === "image" && this.lastImageSource === image?.src) return false;
|
||||
if (
|
||||
this.lastMediaType === 'video' &&
|
||||
this.lastVideoSource === video?.src
|
||||
)
|
||||
return false;
|
||||
if (
|
||||
this.lastMediaType === 'image' &&
|
||||
this.lastImageSource === image?.src
|
||||
)
|
||||
return false;
|
||||
}
|
||||
this.unregister?.();
|
||||
this.unregister = (isVideo ? injectBlurVideo() : injectBlurImage()) ?? null;
|
||||
this.unregister =
|
||||
(isVideo ? injectBlurVideo() : injectBlurImage()) ?? null;
|
||||
} else {
|
||||
this.unregister?.();
|
||||
this.unregister = null;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/* needed for switching between different views (e.g. miniplayer) */
|
||||
const observer = new MutationObserver((mutationsList) => {
|
||||
|
||||
@ -1,14 +1,24 @@
|
||||
import { t } from "@/i18n";
|
||||
import { MenuContext } from "@/types/contexts";
|
||||
import { MenuItemConstructorOptions } from "electron";
|
||||
import { AmbientModePluginConfig } from "./types";
|
||||
import { MenuItemConstructorOptions } from 'electron';
|
||||
|
||||
import { t } from '@/i18n';
|
||||
import { MenuContext } from '@/types/contexts';
|
||||
import { AmbientModePluginConfig } from './types';
|
||||
|
||||
export interface menuParameters {
|
||||
getConfig: () => AmbientModePluginConfig | Promise<AmbientModePluginConfig>;
|
||||
setConfig: (conf: Partial<Omit<AmbientModePluginConfig, "enabled">>) => void | Promise<void>;
|
||||
setConfig: (
|
||||
conf: Partial<Omit<AmbientModePluginConfig, 'enabled'>>,
|
||||
) => void | Promise<void>;
|
||||
}
|
||||
|
||||
export const menu: (ctx: MenuContext<AmbientModePluginConfig>) => MenuItemConstructorOptions[] | Promise<MenuItemConstructorOptions[]> = async ({ getConfig, setConfig }: menuParameters) => {
|
||||
export const menu: (
|
||||
ctx: MenuContext<AmbientModePluginConfig>,
|
||||
) =>
|
||||
| MenuItemConstructorOptions[]
|
||||
| Promise<MenuItemConstructorOptions[]> = async ({
|
||||
getConfig,
|
||||
setConfig,
|
||||
}: menuParameters) => {
|
||||
const interpolationTimeList = [0, 500, 1000, 1500, 2000, 3000, 4000, 5000];
|
||||
const qualityList = [10, 25, 50, 100, 200, 500, 1000];
|
||||
const sizeList = [100, 110, 125, 150, 175, 200, 300];
|
||||
@ -107,4 +117,4 @@ export const menu: (ctx: MenuContext<AmbientModePluginConfig>) => MenuItemConstr
|
||||
},
|
||||
},
|
||||
];
|
||||
}
|
||||
};
|
||||
|
||||
@ -34,3 +34,12 @@
|
||||
margin: 0 auto !important;
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
/* Fix ambient mode overlapping other elements #2520 */
|
||||
.song-button.ytmusic-av-toggle, .video-button.ytmusic-av-toggle {
|
||||
z-index: 1;
|
||||
background-color: transparent;
|
||||
}
|
||||
#side-panel.side-panel.ytmusic-player-page {
|
||||
z-index: 0;
|
||||
}
|
||||
|
||||
@ -7,4 +7,4 @@ export type AmbientModePluginConfig = {
|
||||
size: number;
|
||||
opacity: number;
|
||||
fullscreen: boolean;
|
||||
};
|
||||
};
|
||||
|
||||
71
src/plugins/amuse/backend.ts
Normal file
@ -0,0 +1,71 @@
|
||||
import { t } from 'i18next';
|
||||
|
||||
import { type Context, Hono } from 'hono';
|
||||
import { cors } from 'hono/cors';
|
||||
import { serve } from '@hono/node-server';
|
||||
|
||||
import registerCallback, { type SongInfo } from '@/providers/song-info';
|
||||
import { createBackend } from '@/utils';
|
||||
|
||||
import type { AmuseSongInfo } from './types';
|
||||
|
||||
const amusePort = 9863;
|
||||
|
||||
const formatSongInfo = (info: SongInfo) => {
|
||||
const formattedSongInfo: AmuseSongInfo = {
|
||||
player: {
|
||||
hasSong: !!(info.artist && info.title),
|
||||
isPaused: info.isPaused ?? false,
|
||||
seekbarCurrentPosition: info.elapsedSeconds ?? 0,
|
||||
},
|
||||
track: {
|
||||
duration: info.songDuration,
|
||||
title: info.title,
|
||||
author: info.artist,
|
||||
cover: info.imageSrc ?? '',
|
||||
url: info.url ?? '',
|
||||
id: info.videoId,
|
||||
isAdvertisement: false,
|
||||
},
|
||||
};
|
||||
return formattedSongInfo;
|
||||
};
|
||||
|
||||
export default createBackend({
|
||||
currentSongInfo: {} as SongInfo,
|
||||
app: null as Hono | null,
|
||||
server: null as ReturnType<typeof serve> | null,
|
||||
start() {
|
||||
registerCallback((songInfo) => {
|
||||
this.currentSongInfo = songInfo;
|
||||
});
|
||||
|
||||
this.app = new Hono();
|
||||
this.app.use('*', cors());
|
||||
this.app.get('/', (ctx) =>
|
||||
ctx.body(t('plugins.amuse.response.query'), 200),
|
||||
);
|
||||
|
||||
const queryAndApiHandler = (ctx: Context) => {
|
||||
return ctx.json(formatSongInfo(this.currentSongInfo), 200);
|
||||
};
|
||||
|
||||
this.app.get('/query', queryAndApiHandler);
|
||||
this.app.get('/api', queryAndApiHandler);
|
||||
|
||||
try {
|
||||
this.server = serve({
|
||||
fetch: this.app.fetch.bind(this.app),
|
||||
port: amusePort,
|
||||
});
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
}
|
||||
},
|
||||
|
||||
stop() {
|
||||
if (this.server) {
|
||||
this.server?.close();
|
||||
}
|
||||
},
|
||||
});
|
||||
20
src/plugins/amuse/index.ts
Normal file
@ -0,0 +1,20 @@
|
||||
import { createPlugin } from '@/utils';
|
||||
import backend from './backend';
|
||||
import { t } from '@/i18n';
|
||||
|
||||
export interface MusicWidgetConfig {
|
||||
enabled: boolean;
|
||||
}
|
||||
|
||||
export const defaultConfig: MusicWidgetConfig = {
|
||||
enabled: false,
|
||||
};
|
||||
|
||||
export default createPlugin({
|
||||
name: () => t('plugins.amuse.name'),
|
||||
description: () => t('plugins.amuse.description'),
|
||||
addedVersion: '3.7.X',
|
||||
restartNeeded: true,
|
||||
config: defaultConfig,
|
||||
backend,
|
||||
});
|
||||
20
src/plugins/amuse/types.ts
Normal file
@ -0,0 +1,20 @@
|
||||
export interface PlayerInfo {
|
||||
hasSong: boolean;
|
||||
isPaused: boolean;
|
||||
seekbarCurrentPosition: number;
|
||||
}
|
||||
|
||||
export interface TrackInfo {
|
||||
author: string;
|
||||
title: string;
|
||||
cover: string;
|
||||
duration: number;
|
||||
url: string;
|
||||
id: string;
|
||||
isAdvertisement: boolean;
|
||||
}
|
||||
|
||||
export interface AmuseSongInfo {
|
||||
player: PlayerInfo;
|
||||
track: TrackInfo;
|
||||
}
|
||||
1
src/plugins/api-server/backend/index.ts
Normal file
@ -0,0 +1 @@
|
||||
export * from './main';
|
||||
150
src/plugins/api-server/backend/main.ts
Normal file
@ -0,0 +1,150 @@
|
||||
import { jwt } from 'hono/jwt';
|
||||
import { OpenAPIHono as Hono } from '@hono/zod-openapi';
|
||||
import { cors } from 'hono/cors';
|
||||
import { swaggerUI } from '@hono/swagger-ui';
|
||||
import { serve } from '@hono/node-server';
|
||||
|
||||
import registerCallback from '@/providers/song-info';
|
||||
import { createBackend } from '@/utils';
|
||||
|
||||
import { JWTPayloadSchema } from './scheme';
|
||||
import { registerAuth, registerControl } from './routes';
|
||||
|
||||
import { type APIServerConfig, AuthStrategy } from '../config';
|
||||
|
||||
import type { BackendType } from './types';
|
||||
import type { RepeatMode } from '@/types/datahost-get-state';
|
||||
|
||||
export const backend = createBackend<BackendType, APIServerConfig>({
|
||||
async start(ctx) {
|
||||
const config = await ctx.getConfig();
|
||||
|
||||
await this.init(ctx);
|
||||
registerCallback((songInfo) => {
|
||||
this.songInfo = songInfo;
|
||||
});
|
||||
|
||||
ctx.ipc.on('ytmd:player-api-loaded', () => {
|
||||
ctx.ipc.send('ytmd:setup-time-changed-listener');
|
||||
ctx.ipc.send('ytmd:setup-repeat-changed-listener');
|
||||
ctx.ipc.send('ytmd:setup-volume-changed-listener');
|
||||
});
|
||||
|
||||
ctx.ipc.on(
|
||||
'ytmd:repeat-changed',
|
||||
(mode: RepeatMode) => (this.currentRepeatMode = mode),
|
||||
);
|
||||
|
||||
ctx.ipc.on(
|
||||
'ytmd:volume-changed',
|
||||
(newVolume: number) => (this.volume = newVolume),
|
||||
);
|
||||
|
||||
this.run(config.hostname, config.port);
|
||||
},
|
||||
stop() {
|
||||
this.end();
|
||||
},
|
||||
onConfigChange(config) {
|
||||
if (
|
||||
this.oldConfig?.hostname === config.hostname &&
|
||||
this.oldConfig?.port === config.port
|
||||
) {
|
||||
this.oldConfig = config;
|
||||
return;
|
||||
}
|
||||
|
||||
this.end();
|
||||
this.run(config.hostname, config.port);
|
||||
this.oldConfig = config;
|
||||
},
|
||||
|
||||
// Custom
|
||||
async init(ctx) {
|
||||
const config = await ctx.getConfig();
|
||||
this.app = new Hono();
|
||||
|
||||
this.app.use('*', cors());
|
||||
|
||||
// for web remote control
|
||||
this.app.use('*', async (ctx, next) => {
|
||||
ctx.header('Access-Control-Request-Private-Network', 'true');
|
||||
await next();
|
||||
});
|
||||
|
||||
// middlewares
|
||||
this.app.use('/api/*', async (ctx, next) => {
|
||||
if (config.authStrategy !== AuthStrategy.NONE) {
|
||||
return await jwt({
|
||||
secret: config.secret,
|
||||
})(ctx, next);
|
||||
}
|
||||
await next();
|
||||
});
|
||||
this.app.use('/api/*', async (ctx, next) => {
|
||||
const result = await JWTPayloadSchema.spa(await ctx.get('jwtPayload'));
|
||||
|
||||
const isAuthorized =
|
||||
config.authStrategy === AuthStrategy.NONE ||
|
||||
(result.success && config.authorizedClients.includes(result.data.id));
|
||||
if (!isAuthorized) {
|
||||
ctx.status(401);
|
||||
return ctx.body('Unauthorized');
|
||||
}
|
||||
|
||||
return await next();
|
||||
});
|
||||
|
||||
// routes
|
||||
registerControl(
|
||||
this.app,
|
||||
ctx,
|
||||
() => this.songInfo,
|
||||
() => this.currentRepeatMode,
|
||||
() => this.volume,
|
||||
);
|
||||
registerAuth(this.app, ctx);
|
||||
|
||||
// swagger
|
||||
this.app.openAPIRegistry.registerComponent(
|
||||
'securitySchemes',
|
||||
'bearerAuth',
|
||||
{
|
||||
type: 'http',
|
||||
scheme: 'bearer',
|
||||
bearerFormat: 'JWT',
|
||||
},
|
||||
);
|
||||
this.app.doc('/doc', {
|
||||
openapi: '3.1.0',
|
||||
info: {
|
||||
version: '1.0.0',
|
||||
title: 'Youtube Music API Server',
|
||||
},
|
||||
security: [
|
||||
{
|
||||
bearerAuth: [],
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
this.app.get('/swagger', swaggerUI({ url: '/doc' }));
|
||||
},
|
||||
run(hostname, port) {
|
||||
if (!this.app) return;
|
||||
|
||||
try {
|
||||
this.server = serve({
|
||||
fetch: this.app.fetch.bind(this.app),
|
||||
port,
|
||||
hostname,
|
||||
});
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
}
|
||||
},
|
||||
end() {
|
||||
this.server?.close();
|
||||
this.server = undefined;
|
||||
},
|
||||
});
|
||||
95
src/plugins/api-server/backend/routes/auth.ts
Normal file
@ -0,0 +1,95 @@
|
||||
import { createRoute, z } from '@hono/zod-openapi';
|
||||
import { dialog } from 'electron';
|
||||
import { sign } from 'hono/jwt';
|
||||
|
||||
import { getConnInfo } from '@hono/node-server/conninfo';
|
||||
|
||||
import { t } from '@/i18n';
|
||||
|
||||
import { type APIServerConfig, AuthStrategy } from '../../config';
|
||||
|
||||
import type { JWTPayload } from '../scheme';
|
||||
import type { HonoApp } from '../types';
|
||||
import type { BackendContext } from '@/types/contexts';
|
||||
|
||||
const routes = {
|
||||
request: createRoute({
|
||||
method: 'post',
|
||||
path: '/auth/{id}',
|
||||
summary: '',
|
||||
description: '',
|
||||
security: [],
|
||||
request: {
|
||||
params: z.object({
|
||||
id: z.string(),
|
||||
}),
|
||||
},
|
||||
responses: {
|
||||
200: {
|
||||
description: 'Success',
|
||||
content: {
|
||||
'application/json': {
|
||||
schema: z.object({
|
||||
accessToken: z.string(),
|
||||
}),
|
||||
},
|
||||
},
|
||||
},
|
||||
403: {
|
||||
description: 'Forbidden',
|
||||
},
|
||||
},
|
||||
}),
|
||||
};
|
||||
|
||||
export const register = (
|
||||
app: HonoApp,
|
||||
{ getConfig, setConfig }: BackendContext<APIServerConfig>,
|
||||
) => {
|
||||
app.openapi(routes.request, async (ctx) => {
|
||||
const config = await getConfig();
|
||||
const { id } = ctx.req.param();
|
||||
|
||||
if (config.authorizedClients.includes(id)) {
|
||||
// SKIP CHECK
|
||||
} else if (config.authStrategy === AuthStrategy.AUTH_AT_FIRST) {
|
||||
const result = await dialog.showMessageBox({
|
||||
title: t('plugins.api-server.dialog.request.title'),
|
||||
message: t('plugins.api-server.dialog.request.message', {
|
||||
origin: getConnInfo(ctx).remote.address,
|
||||
ID: id,
|
||||
}),
|
||||
buttons: [
|
||||
t('plugins.api-server.dialog.request.buttons.allow'),
|
||||
t('plugins.api-server.dialog.request.buttons.deny'),
|
||||
],
|
||||
defaultId: 1,
|
||||
cancelId: 1,
|
||||
});
|
||||
|
||||
if (result.response === 1) {
|
||||
ctx.status(403);
|
||||
return ctx.body(null);
|
||||
}
|
||||
} else if (config.authStrategy === AuthStrategy.NONE) {
|
||||
// SKIP CHECK
|
||||
}
|
||||
|
||||
setConfig({
|
||||
authorizedClients: [...config.authorizedClients, id],
|
||||
});
|
||||
|
||||
const token = await sign(
|
||||
{
|
||||
id,
|
||||
iat: ~~(Date.now() / 1000),
|
||||
} satisfies JWTPayload,
|
||||
config.secret,
|
||||
);
|
||||
|
||||
ctx.status(200);
|
||||
return ctx.json({
|
||||
accessToken: token,
|
||||
});
|
||||
});
|
||||
};
|
||||
763
src/plugins/api-server/backend/routes/control.ts
Normal file
@ -0,0 +1,763 @@
|
||||
import { createRoute, z } from '@hono/zod-openapi';
|
||||
|
||||
import { ipcMain } from 'electron';
|
||||
|
||||
import getSongControls from '@/providers/song-controls';
|
||||
|
||||
import {
|
||||
AddSongToQueueSchema,
|
||||
GoBackSchema,
|
||||
GoForwardScheme,
|
||||
MoveSongInQueueSchema,
|
||||
QueueParamsSchema,
|
||||
SearchSchema,
|
||||
SeekSchema,
|
||||
SetFullscreenSchema,
|
||||
SetQueueIndexSchema,
|
||||
SetVolumeSchema,
|
||||
SongInfoSchema,
|
||||
SwitchRepeatSchema,
|
||||
type ResponseSongInfo,
|
||||
} from '../scheme';
|
||||
|
||||
import type { RepeatMode } from '@/types/datahost-get-state';
|
||||
import type { SongInfo } from '@/providers/song-info';
|
||||
import type { BackendContext } from '@/types/contexts';
|
||||
import type { APIServerConfig } from '../../config';
|
||||
import type { HonoApp } from '../types';
|
||||
import type { QueueResponse } from '@/types/youtube-music-desktop-internal';
|
||||
import type { Context } from 'hono';
|
||||
|
||||
const API_VERSION = 'v1';
|
||||
|
||||
const routes = {
|
||||
previous: createRoute({
|
||||
method: 'post',
|
||||
path: `/api/${API_VERSION}/previous`,
|
||||
summary: 'play previous song',
|
||||
description: 'Plays the previous song in the queue',
|
||||
responses: {
|
||||
204: {
|
||||
description: 'Success',
|
||||
},
|
||||
},
|
||||
}),
|
||||
next: createRoute({
|
||||
method: 'post',
|
||||
path: `/api/${API_VERSION}/next`,
|
||||
summary: 'play next song',
|
||||
description: 'Plays the next song in the queue',
|
||||
responses: {
|
||||
204: {
|
||||
description: 'Success',
|
||||
},
|
||||
},
|
||||
}),
|
||||
play: createRoute({
|
||||
method: 'post',
|
||||
path: `/api/${API_VERSION}/play`,
|
||||
summary: 'Play',
|
||||
description: 'Change the state of the player to play',
|
||||
responses: {
|
||||
204: {
|
||||
description: 'Success',
|
||||
},
|
||||
},
|
||||
}),
|
||||
pause: createRoute({
|
||||
method: 'post',
|
||||
path: `/api/${API_VERSION}/pause`,
|
||||
summary: 'Pause',
|
||||
description: 'Change the state of the player to pause',
|
||||
responses: {
|
||||
204: {
|
||||
description: 'Success',
|
||||
},
|
||||
},
|
||||
}),
|
||||
togglePlay: createRoute({
|
||||
method: 'post',
|
||||
path: `/api/${API_VERSION}/toggle-play`,
|
||||
summary: 'Toggle play/pause',
|
||||
description:
|
||||
'Change the state of the player to play if paused, or pause if playing',
|
||||
responses: {
|
||||
204: {
|
||||
description: 'Success',
|
||||
},
|
||||
},
|
||||
}),
|
||||
like: createRoute({
|
||||
method: 'post',
|
||||
path: `/api/${API_VERSION}/like`,
|
||||
summary: 'like song',
|
||||
description: 'Set the current song as liked',
|
||||
responses: {
|
||||
204: {
|
||||
description: 'Success',
|
||||
},
|
||||
},
|
||||
}),
|
||||
dislike: createRoute({
|
||||
method: 'post',
|
||||
path: `/api/${API_VERSION}/dislike`,
|
||||
summary: 'dislike song',
|
||||
description: 'Set the current song as disliked',
|
||||
responses: {
|
||||
204: {
|
||||
description: 'Success',
|
||||
},
|
||||
},
|
||||
}),
|
||||
seekTo: createRoute({
|
||||
method: 'post',
|
||||
path: `/api/${API_VERSION}/seek-to`,
|
||||
summary: 'seek',
|
||||
description: 'Seek to a specific time in the current song',
|
||||
request: {
|
||||
body: {
|
||||
description: 'seconds to seek to',
|
||||
content: {
|
||||
'application/json': {
|
||||
schema: SeekSchema,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
responses: {
|
||||
204: {
|
||||
description: 'Success',
|
||||
},
|
||||
},
|
||||
}),
|
||||
goBack: createRoute({
|
||||
method: 'post',
|
||||
path: `/api/${API_VERSION}/go-back`,
|
||||
summary: 'go back',
|
||||
description: 'Move the current song back by a number of seconds',
|
||||
request: {
|
||||
body: {
|
||||
description: 'seconds to go back',
|
||||
content: {
|
||||
'application/json': {
|
||||
schema: GoBackSchema,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
responses: {
|
||||
204: {
|
||||
description: 'Success',
|
||||
},
|
||||
},
|
||||
}),
|
||||
|
||||
goForward: createRoute({
|
||||
method: 'post',
|
||||
path: `/api/${API_VERSION}/go-forward`,
|
||||
summary: 'go forward',
|
||||
description: 'Move the current song forward by a number of seconds',
|
||||
request: {
|
||||
body: {
|
||||
description: 'seconds to go forward',
|
||||
content: {
|
||||
'application/json': {
|
||||
schema: GoForwardScheme,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
responses: {
|
||||
204: {
|
||||
description: 'Success',
|
||||
},
|
||||
},
|
||||
}),
|
||||
getShuffleState: createRoute({
|
||||
method: 'get',
|
||||
path: `/api/${API_VERSION}/shuffle`,
|
||||
summary: 'get shuffle state',
|
||||
description: 'Get the current shuffle state',
|
||||
responses: {
|
||||
200: {
|
||||
description: 'Success',
|
||||
content: {
|
||||
'application/json': {
|
||||
schema: z.object({
|
||||
state: z.boolean().nullable(),
|
||||
}),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}),
|
||||
shuffle: createRoute({
|
||||
method: 'post',
|
||||
path: `/api/${API_VERSION}/shuffle`,
|
||||
summary: 'shuffle',
|
||||
description: 'Shuffle the queue',
|
||||
responses: {
|
||||
204: {
|
||||
description: 'Success',
|
||||
},
|
||||
},
|
||||
}),
|
||||
repeatMode: createRoute({
|
||||
method: 'get',
|
||||
path: `/api/${API_VERSION}/repeat-mode`,
|
||||
summary: 'get current repeat mode',
|
||||
description: 'Get the current repeat mode (NONE, ALL, ONE)',
|
||||
responses: {
|
||||
200: {
|
||||
description: 'Success',
|
||||
content: {
|
||||
'application/json': {
|
||||
schema: z.object({
|
||||
mode: z.enum(['ONE', 'NONE', 'ALL']).nullable(),
|
||||
}),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}),
|
||||
switchRepeat: createRoute({
|
||||
method: 'post',
|
||||
path: `/api/${API_VERSION}/switch-repeat`,
|
||||
summary: 'switch repeat',
|
||||
description: 'Switch the repeat mode',
|
||||
request: {
|
||||
body: {
|
||||
description: 'number of times to click the repeat button',
|
||||
content: {
|
||||
'application/json': {
|
||||
schema: SwitchRepeatSchema,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
responses: {
|
||||
204: {
|
||||
description: 'Success',
|
||||
},
|
||||
},
|
||||
}),
|
||||
setVolume: createRoute({
|
||||
method: 'post',
|
||||
path: `/api/${API_VERSION}/volume`,
|
||||
summary: 'set volume',
|
||||
description: 'Set the volume of the player',
|
||||
request: {
|
||||
body: {
|
||||
description: 'volume to set',
|
||||
content: {
|
||||
'application/json': {
|
||||
schema: SetVolumeSchema,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
responses: {
|
||||
204: {
|
||||
description: 'Success',
|
||||
},
|
||||
},
|
||||
}),
|
||||
getVolumeState: createRoute({
|
||||
method: 'get',
|
||||
path: `/api/${API_VERSION}/volume`,
|
||||
summary: 'get volume state',
|
||||
description: 'Get the current volume state of the player',
|
||||
responses: {
|
||||
200: {
|
||||
description: 'Success',
|
||||
content: {
|
||||
'application/json': {
|
||||
schema: z.object({
|
||||
state: z.number(),
|
||||
}),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}),
|
||||
setFullscreen: createRoute({
|
||||
method: 'post',
|
||||
path: `/api/${API_VERSION}/fullscreen`,
|
||||
summary: 'set fullscreen',
|
||||
description: 'Set the fullscreen state of the player',
|
||||
request: {
|
||||
body: {
|
||||
description: 'fullscreen state',
|
||||
content: {
|
||||
'application/json': {
|
||||
schema: SetFullscreenSchema,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
responses: {
|
||||
204: {
|
||||
description: 'Success',
|
||||
},
|
||||
},
|
||||
}),
|
||||
toggleMute: createRoute({
|
||||
method: 'post',
|
||||
path: `/api/${API_VERSION}/toggle-mute`,
|
||||
summary: 'toggle mute',
|
||||
description: 'Toggle the mute state of the player',
|
||||
responses: {
|
||||
204: {
|
||||
description: 'Success',
|
||||
},
|
||||
},
|
||||
}),
|
||||
|
||||
getFullscreenState: createRoute({
|
||||
method: 'get',
|
||||
path: `/api/${API_VERSION}/fullscreen`,
|
||||
summary: 'get fullscreen state',
|
||||
description: 'Get the current fullscreen state',
|
||||
responses: {
|
||||
200: {
|
||||
description: 'Success',
|
||||
content: {
|
||||
'application/json': {
|
||||
schema: z.object({
|
||||
state: z.boolean(),
|
||||
}),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}),
|
||||
oldQueueInfo: createRoute({
|
||||
deprecated: true,
|
||||
method: 'get',
|
||||
path: `/api/${API_VERSION}/queue-info`,
|
||||
summary: 'get current queue info',
|
||||
description: 'Get the current queue info',
|
||||
responses: {
|
||||
200: {
|
||||
description: 'Success',
|
||||
content: {
|
||||
'application/json': {
|
||||
schema: z.object({}),
|
||||
},
|
||||
},
|
||||
},
|
||||
204: {
|
||||
description: 'No queue info',
|
||||
},
|
||||
},
|
||||
}),
|
||||
oldSongInfo: createRoute({
|
||||
deprecated: true,
|
||||
method: 'get',
|
||||
path: `/api/${API_VERSION}/song-info`,
|
||||
summary: 'get current song info',
|
||||
description: 'Get the current song info',
|
||||
responses: {
|
||||
200: {
|
||||
description: 'Success',
|
||||
content: {
|
||||
'application/json': {
|
||||
schema: SongInfoSchema,
|
||||
},
|
||||
},
|
||||
},
|
||||
204: {
|
||||
description: 'No song info',
|
||||
},
|
||||
},
|
||||
}),
|
||||
songInfo: createRoute({
|
||||
method: 'get',
|
||||
path: `/api/${API_VERSION}/song`,
|
||||
summary: 'get current song info',
|
||||
description: 'Get the current song info',
|
||||
responses: {
|
||||
200: {
|
||||
description: 'Success',
|
||||
content: {
|
||||
'application/json': {
|
||||
schema: SongInfoSchema,
|
||||
},
|
||||
},
|
||||
},
|
||||
204: {
|
||||
description: 'No song info',
|
||||
},
|
||||
},
|
||||
}),
|
||||
queueInfo: createRoute({
|
||||
method: 'get',
|
||||
path: `/api/${API_VERSION}/queue`,
|
||||
summary: 'get current queue info',
|
||||
description: 'Get the current queue info',
|
||||
responses: {
|
||||
200: {
|
||||
description: 'Success',
|
||||
content: {
|
||||
'application/json': {
|
||||
schema: z.object({}),
|
||||
},
|
||||
},
|
||||
},
|
||||
204: {
|
||||
description: 'No queue info',
|
||||
},
|
||||
},
|
||||
}),
|
||||
addSongToQueue: createRoute({
|
||||
method: 'post',
|
||||
path: `/api/${API_VERSION}/queue`,
|
||||
summary: 'add song to queue',
|
||||
description: 'Add a song to the queue',
|
||||
request: {
|
||||
body: {
|
||||
description: 'video id of the song to add',
|
||||
content: {
|
||||
'application/json': {
|
||||
schema: AddSongToQueueSchema,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
responses: {
|
||||
204: {
|
||||
description: 'Success',
|
||||
},
|
||||
},
|
||||
}),
|
||||
moveSongInQueue: createRoute({
|
||||
method: 'patch',
|
||||
path: `/api/${API_VERSION}/queue/{index}`,
|
||||
summary: 'move song in queue',
|
||||
description: 'Move a song in the queue',
|
||||
request: {
|
||||
params: QueueParamsSchema,
|
||||
body: {
|
||||
description: 'index to move the song to',
|
||||
content: {
|
||||
'application/json': {
|
||||
schema: MoveSongInQueueSchema,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
responses: {
|
||||
204: {
|
||||
description: 'Success',
|
||||
},
|
||||
},
|
||||
}),
|
||||
removeSongFromQueue: createRoute({
|
||||
method: 'delete',
|
||||
path: `/api/${API_VERSION}/queue/{index}`,
|
||||
summary: 'remove song from queue',
|
||||
description: 'Remove a song from the queue',
|
||||
request: {
|
||||
params: QueueParamsSchema,
|
||||
},
|
||||
responses: {
|
||||
204: {
|
||||
description: 'Success',
|
||||
},
|
||||
},
|
||||
}),
|
||||
setQueueIndex: createRoute({
|
||||
method: 'patch',
|
||||
path: `/api/${API_VERSION}/queue`,
|
||||
summary: 'set queue index',
|
||||
description: 'Set the current index of the queue',
|
||||
request: {
|
||||
body: {
|
||||
description: 'index to move the song to',
|
||||
content: {
|
||||
'application/json': {
|
||||
schema: SetQueueIndexSchema,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
responses: {
|
||||
204: {
|
||||
description: 'Success',
|
||||
},
|
||||
},
|
||||
}),
|
||||
clearQueue: createRoute({
|
||||
method: 'delete',
|
||||
path: `/api/${API_VERSION}/queue`,
|
||||
summary: 'clear queue',
|
||||
description: 'Clear the queue',
|
||||
responses: {
|
||||
204: {
|
||||
description: 'Success',
|
||||
},
|
||||
},
|
||||
}),
|
||||
search: createRoute({
|
||||
method: 'post',
|
||||
path: `/api/${API_VERSION}/search`,
|
||||
summary: 'search for a song',
|
||||
description: 'search for a song',
|
||||
request: {
|
||||
body: {
|
||||
description: 'search query',
|
||||
content: {
|
||||
'application/json': {
|
||||
schema: SearchSchema,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
responses: {
|
||||
200: {
|
||||
description: 'Success',
|
||||
content: {
|
||||
'application/json': {
|
||||
schema: z.object({}),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}),
|
||||
};
|
||||
|
||||
export const register = (
|
||||
app: HonoApp,
|
||||
{ window }: BackendContext<APIServerConfig>,
|
||||
songInfoGetter: () => SongInfo | undefined,
|
||||
repeatModeGetter: () => RepeatMode | undefined,
|
||||
volumeGetter: () => number | undefined,
|
||||
) => {
|
||||
const controller = getSongControls(window);
|
||||
|
||||
app.openapi(routes.previous, (ctx) => {
|
||||
controller.previous();
|
||||
|
||||
ctx.status(204);
|
||||
return ctx.body(null);
|
||||
});
|
||||
app.openapi(routes.next, (ctx) => {
|
||||
controller.next();
|
||||
|
||||
ctx.status(204);
|
||||
return ctx.body(null);
|
||||
});
|
||||
app.openapi(routes.play, (ctx) => {
|
||||
controller.play();
|
||||
|
||||
ctx.status(204);
|
||||
return ctx.body(null);
|
||||
});
|
||||
app.openapi(routes.pause, (ctx) => {
|
||||
controller.pause();
|
||||
|
||||
ctx.status(204);
|
||||
return ctx.body(null);
|
||||
});
|
||||
app.openapi(routes.togglePlay, (ctx) => {
|
||||
controller.playPause();
|
||||
|
||||
ctx.status(204);
|
||||
return ctx.body(null);
|
||||
});
|
||||
app.openapi(routes.like, (ctx) => {
|
||||
controller.like();
|
||||
|
||||
ctx.status(204);
|
||||
return ctx.body(null);
|
||||
});
|
||||
app.openapi(routes.dislike, (ctx) => {
|
||||
controller.dislike();
|
||||
|
||||
ctx.status(204);
|
||||
return ctx.body(null);
|
||||
});
|
||||
app.openapi(routes.seekTo, (ctx) => {
|
||||
const { seconds } = ctx.req.valid('json');
|
||||
controller.seekTo(seconds);
|
||||
|
||||
ctx.status(204);
|
||||
return ctx.body(null);
|
||||
});
|
||||
app.openapi(routes.goBack, (ctx) => {
|
||||
const { seconds } = ctx.req.valid('json');
|
||||
controller.goBack(seconds);
|
||||
|
||||
ctx.status(204);
|
||||
return ctx.body(null);
|
||||
});
|
||||
app.openapi(routes.goForward, (ctx) => {
|
||||
const { seconds } = ctx.req.valid('json');
|
||||
controller.goForward(seconds);
|
||||
|
||||
ctx.status(204);
|
||||
return ctx.body(null);
|
||||
});
|
||||
|
||||
app.openapi(routes.getShuffleState, async (ctx) => {
|
||||
const stateResponsePromise = new Promise<boolean>((resolve) => {
|
||||
ipcMain.once(
|
||||
'ytmd:get-shuffle-response',
|
||||
(_, isShuffled: boolean | undefined) => {
|
||||
return resolve(!!isShuffled);
|
||||
},
|
||||
);
|
||||
|
||||
controller.requestShuffleInformation();
|
||||
});
|
||||
|
||||
const isShuffled = await stateResponsePromise;
|
||||
|
||||
ctx.status(200);
|
||||
return ctx.json({ state: isShuffled });
|
||||
});
|
||||
|
||||
app.openapi(routes.shuffle, (ctx) => {
|
||||
controller.shuffle();
|
||||
|
||||
ctx.status(204);
|
||||
return ctx.body(null);
|
||||
});
|
||||
|
||||
app.openapi(routes.repeatMode, (ctx) => {
|
||||
ctx.status(200);
|
||||
return ctx.json({ mode: repeatModeGetter() ?? null });
|
||||
});
|
||||
app.openapi(routes.switchRepeat, (ctx) => {
|
||||
const { iteration } = ctx.req.valid('json');
|
||||
controller.switchRepeat(iteration);
|
||||
|
||||
ctx.status(204);
|
||||
return ctx.body(null);
|
||||
});
|
||||
app.openapi(routes.setVolume, (ctx) => {
|
||||
const { volume } = ctx.req.valid('json');
|
||||
controller.setVolume(volume);
|
||||
|
||||
ctx.status(204);
|
||||
return ctx.body(null);
|
||||
});
|
||||
app.openapi(routes.getVolumeState, (ctx) => {
|
||||
ctx.status(200);
|
||||
return ctx.json({ state: volumeGetter() ?? 0 });
|
||||
});
|
||||
app.openapi(routes.setFullscreen, (ctx) => {
|
||||
const { state } = ctx.req.valid('json');
|
||||
controller.setFullscreen(state);
|
||||
|
||||
ctx.status(204);
|
||||
return ctx.body(null);
|
||||
});
|
||||
app.openapi(routes.toggleMute, (ctx) => {
|
||||
controller.muteUnmute();
|
||||
|
||||
ctx.status(204);
|
||||
return ctx.body(null);
|
||||
});
|
||||
|
||||
app.openapi(routes.getFullscreenState, async (ctx) => {
|
||||
const stateResponsePromise = new Promise<boolean>((resolve) => {
|
||||
ipcMain.once(
|
||||
'ytmd:set-fullscreen',
|
||||
(_, isFullscreen: boolean | undefined) => {
|
||||
return resolve(!!isFullscreen);
|
||||
},
|
||||
);
|
||||
|
||||
controller.requestFullscreenInformation();
|
||||
});
|
||||
|
||||
const fullscreen = await stateResponsePromise;
|
||||
|
||||
ctx.status(200);
|
||||
return ctx.json({ state: fullscreen });
|
||||
});
|
||||
|
||||
const songInfo = (ctx: Context) => {
|
||||
const info = songInfoGetter();
|
||||
|
||||
if (!info) {
|
||||
ctx.status(204);
|
||||
return ctx.body(null);
|
||||
}
|
||||
|
||||
const body = { ...info };
|
||||
delete body.image;
|
||||
|
||||
ctx.status(200);
|
||||
return ctx.json(body satisfies ResponseSongInfo);
|
||||
};
|
||||
app.openapi(routes.oldSongInfo, songInfo);
|
||||
app.openapi(routes.songInfo, songInfo);
|
||||
|
||||
// Queue
|
||||
const queueInfo = async (ctx: Context) => {
|
||||
const queueResponsePromise = new Promise<QueueResponse>((resolve) => {
|
||||
ipcMain.once('ytmd:get-queue-response', (_, queue: QueueResponse) => {
|
||||
return resolve(queue);
|
||||
});
|
||||
|
||||
controller.requestQueueInformation();
|
||||
});
|
||||
|
||||
const info = await queueResponsePromise;
|
||||
|
||||
if (!info) {
|
||||
ctx.status(204);
|
||||
return ctx.body(null);
|
||||
}
|
||||
|
||||
ctx.status(200);
|
||||
return ctx.json(info);
|
||||
};
|
||||
app.openapi(routes.oldQueueInfo, queueInfo);
|
||||
app.openapi(routes.queueInfo, queueInfo);
|
||||
|
||||
app.openapi(routes.addSongToQueue, (ctx) => {
|
||||
const { videoId, insertPosition } = ctx.req.valid('json');
|
||||
controller.addSongToQueue(videoId, { queueInsertPosition: insertPosition });
|
||||
|
||||
ctx.status(204);
|
||||
return ctx.body(null);
|
||||
});
|
||||
app.openapi(routes.moveSongInQueue, (ctx) => {
|
||||
const index = Number(ctx.req.param('index'));
|
||||
const { toIndex } = ctx.req.valid('json');
|
||||
controller.moveSongInQueue(index, toIndex);
|
||||
|
||||
ctx.status(204);
|
||||
return ctx.body(null);
|
||||
});
|
||||
app.openapi(routes.removeSongFromQueue, (ctx) => {
|
||||
const index = Number(ctx.req.param('index'));
|
||||
controller.removeSongFromQueue(index);
|
||||
|
||||
ctx.status(204);
|
||||
return ctx.body(null);
|
||||
});
|
||||
app.openapi(routes.setQueueIndex, (ctx) => {
|
||||
const { index } = ctx.req.valid('json');
|
||||
controller.setQueueIndex(index);
|
||||
|
||||
ctx.status(204);
|
||||
return ctx.body(null);
|
||||
});
|
||||
app.openapi(routes.clearQueue, (ctx) => {
|
||||
controller.clearQueue();
|
||||
|
||||
ctx.status(204);
|
||||
return ctx.body(null);
|
||||
});
|
||||
app.openapi(routes.search, async (ctx) => {
|
||||
const { query } = ctx.req.valid('json');
|
||||
const response = await controller.search(query);
|
||||
|
||||
ctx.status(200);
|
||||
return ctx.json(response as object);
|
||||
});
|
||||
};
|
||||
2
src/plugins/api-server/backend/routes/index.ts
Normal file
@ -0,0 +1,2 @@
|
||||
export { register as registerControl } from './control';
|
||||
export { register as registerAuth } from './auth';
|
||||
7
src/plugins/api-server/backend/scheme/auth.ts
Normal file
@ -0,0 +1,7 @@
|
||||
import { z } from '@hono/zod-openapi';
|
||||
|
||||
export type JWTPayload = z.infer<typeof JWTPayloadSchema>;
|
||||
export const JWTPayloadSchema = z.object({
|
||||
id: z.string(),
|
||||
iat: z.number(),
|
||||
});
|
||||
5
src/plugins/api-server/backend/scheme/go-back.ts
Normal file
@ -0,0 +1,5 @@
|
||||
import { z } from '@hono/zod-openapi';
|
||||
|
||||
export const GoBackSchema = z.object({
|
||||
seconds: z.number(),
|
||||
});
|
||||
5
src/plugins/api-server/backend/scheme/go-forward.ts
Normal file
@ -0,0 +1,5 @@
|
||||
import { z } from '@hono/zod-openapi';
|
||||
|
||||
export const GoForwardScheme = z.object({
|
||||
seconds: z.number(),
|
||||
});
|
||||
10
src/plugins/api-server/backend/scheme/index.ts
Normal file
@ -0,0 +1,10 @@
|
||||
export * from './auth';
|
||||
export * from './song-info';
|
||||
export * from './seek';
|
||||
export * from './go-back';
|
||||
export * from './go-forward';
|
||||
export * from './switch-repeat';
|
||||
export * from './set-volume';
|
||||
export * from './set-fullscreen';
|
||||
export * from './queue';
|
||||
export * from './search';
|
||||
19
src/plugins/api-server/backend/scheme/queue.ts
Normal file
@ -0,0 +1,19 @@
|
||||
import { z } from '@hono/zod-openapi';
|
||||
|
||||
export const QueueParamsSchema = z.object({
|
||||
index: z.coerce.number().int().nonnegative(),
|
||||
});
|
||||
|
||||
export const AddSongToQueueSchema = z.object({
|
||||
videoId: z.string(),
|
||||
insertPosition: z
|
||||
.enum(['INSERT_AT_END', 'INSERT_AFTER_CURRENT_VIDEO'])
|
||||
.optional()
|
||||
.default('INSERT_AT_END'),
|
||||
});
|
||||
export const MoveSongInQueueSchema = z.object({
|
||||
toIndex: z.number(),
|
||||
});
|
||||
export const SetQueueIndexSchema = z.object({
|
||||
index: z.number().int().nonnegative(),
|
||||
});
|
||||
5
src/plugins/api-server/backend/scheme/search.ts
Normal file
@ -0,0 +1,5 @@
|
||||
import { z } from '@hono/zod-openapi';
|
||||
|
||||
export const SearchSchema = z.object({
|
||||
query: z.string(),
|
||||
});
|
||||
5
src/plugins/api-server/backend/scheme/seek.ts
Normal file
@ -0,0 +1,5 @@
|
||||
import { z } from '@hono/zod-openapi';
|
||||
|
||||
export const SeekSchema = z.object({
|
||||
seconds: z.number(),
|
||||
});
|
||||
5
src/plugins/api-server/backend/scheme/set-fullscreen.ts
Normal file
@ -0,0 +1,5 @@
|
||||
import { z } from '@hono/zod-openapi';
|
||||
|
||||
export const SetFullscreenSchema = z.object({
|
||||
state: z.boolean(),
|
||||
});
|
||||