mirror of
https://github.com/jeffvli/feishin.git
synced 2026-05-07 04:20:12 +02:00
Compare commits
770 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b16e57710b | |||
| 931e96b9d1 | |||
| c27b86d2b2 | |||
| b3cf73836d | |||
| 1b15c73db0 | |||
| 4e53030e8d | |||
| 22b798812e | |||
| 1f7d510110 | |||
| 44fae06143 | |||
| 1e24e12a55 | |||
| 358bdec2b6 | |||
| 1b8661d566 | |||
| 68476deb98 | |||
| c88c6cf55e | |||
| f332d547a3 | |||
| 5803ac04d1 | |||
| 58becc5c8e | |||
| 309b49b46e | |||
| 40e7eda882 | |||
| 1081829aa4 | |||
| 5a411417b0 | |||
| 8472a4013e | |||
| 14bb135116 | |||
| 9583c3343b | |||
| d28b90afa6 | |||
| 479b93410f | |||
| 3496e1c938 | |||
| be44906b49 | |||
| 31488ce973 | |||
| 0b0696a42b | |||
| 6d51f66641 | |||
| 9ec8ec806d | |||
| 1baae08dc7 | |||
| b987324899 | |||
| f07393c82a | |||
| 3636384508 | |||
| fc847631d3 | |||
| 1d9f462959 | |||
| 369b956c66 | |||
| 5f14ccf70d | |||
| f9679f3bda | |||
| 9f8d9a5b28 | |||
| 912aea8174 | |||
| 9ae4be9336 | |||
| 1686e7ad0b | |||
| bf6047da17 | |||
| c3b4a9edf8 | |||
| 0340cc8a85 | |||
| 3f7a402ce8 | |||
| 20c585aa1c | |||
| 0248997a75 | |||
| aaaeea1fa5 | |||
| 22504e9e84 | |||
| 5fb2ae839f | |||
| 15b00910f3 | |||
| 6cce72a22a | |||
| d48fe81d7f | |||
| f0d0f826fb | |||
| 4d12a4d6cb | |||
| f14d1f3c5c | |||
| cc466cb0f4 | |||
| 20941c0405 | |||
| d52c067dc7 | |||
| fccbf83c12 | |||
| 7817059a9e | |||
| d3a986e93c | |||
| 6733047942 | |||
| 452803fc72 | |||
| 4e4a0464d6 | |||
| 4ff317eac9 | |||
| 306167fee3 | |||
| 1cbb3e56bc | |||
| 7c24f7cba4 | |||
| 1b278cb33a | |||
| f1a75d8e81 | |||
| 4a48598260 | |||
| 6df270ba34 | |||
| eb0ccec0bc | |||
| 8caf898172 | |||
| 508013958f | |||
| c448352ec8 | |||
| e344adfeed | |||
| bca4a14f2e | |||
| f4be797f16 | |||
| 2feef206fb | |||
| eea36f720a | |||
| 76350ed5af | |||
| 4f38e16857 | |||
| 8a3edb71df | |||
| 55e35e9b24 | |||
| 6abdbd2f3e | |||
| 1d46cd5ff9 | |||
| d68165dab5 | |||
| dad80adb8b | |||
| 4134af0340 | |||
| 29a43ca185 | |||
| e452f86170 | |||
| ec765dca6a | |||
| 64a3752b54 | |||
| 24069d285f | |||
| 77fe886da4 | |||
| ef16e1403d | |||
| ff6dda7b06 | |||
| 479aa2e22d | |||
| ab8c3ad0ec | |||
| dc03a432fe | |||
| 751ad55d02 | |||
| 78dc89303d | |||
| 4328d8860e | |||
| 58a36b3bba | |||
| 618e5d8da8 | |||
| be6ec49cfa | |||
| 65ecdc7666 | |||
| da42fd78d2 | |||
| c36735575f | |||
| 854222d2fa | |||
| cd0a8d0fec | |||
| ed6376d99b | |||
| a6a51946f1 | |||
| 6e5acfa9da | |||
| 2c7fda63d3 | |||
| cf72016575 | |||
| 6368137815 | |||
| ea122f5a4f | |||
| bb7d561d0f | |||
| 6dea9196a4 | |||
| 4a28e7230a | |||
| b00305cc86 | |||
| 40fb5ba916 | |||
| 2cf0027419 | |||
| c81bd93d04 | |||
| 229f9e984e | |||
| e1e0670350 | |||
| 20debb099d | |||
| 99f9cc5968 | |||
| 53b4a2ee8a | |||
| 0b59a54f04 | |||
| f85ce9703f | |||
| cf3fd53bc1 | |||
| 871923a977 | |||
| c21f7df7b2 | |||
| c83f27ce14 | |||
| 53499e2579 | |||
| cbbf2db087 | |||
| dd60634a40 | |||
| 54932fee86 | |||
| 878e0007d9 | |||
| 2260c0c02b | |||
| dd3285544e | |||
| f3c674fb20 | |||
| 6e0ae3ba92 | |||
| c76cad9727 | |||
| 3c29004e28 | |||
| b08050d9ff | |||
| 908d5dde0f | |||
| 0540b224ec | |||
| d0a2583edb | |||
| 97ca234015 | |||
| b07395c12b | |||
| d8a10c8841 | |||
| e112d0acbf | |||
| 8ca0a207d4 | |||
| 4950ce1aed | |||
| 471d35dd70 | |||
| f5af1c314c | |||
| 1aac1a6361 | |||
| 003e71d974 | |||
| 94b2668384 | |||
| 039e553aa0 | |||
| 755a09ceec | |||
| 60c94c2299 | |||
| 59e01f90e8 | |||
| 59065d24bc | |||
| 2271c211cb | |||
| 7394d639e2 | |||
| 352a8e71e6 | |||
| 377a3ea8ab | |||
| 35b869ee7b | |||
| 618d27ffc1 | |||
| 24b9bf210c | |||
| 76770de7d8 | |||
| 7ff74b8d5e | |||
| 7423b71a65 | |||
| a44ad66d46 | |||
| 5ab0eba23e | |||
| 08fc307516 | |||
| e5adc0caa9 | |||
| 7f0bdf20fc | |||
| deb89ef87d | |||
| 9751e22db4 | |||
| 6128470a47 | |||
| ea79885ef5 | |||
| 84fd6e482d | |||
| 904f05ff61 | |||
| e78ec7688a | |||
| f43de7f23c | |||
| 07532ca55a | |||
| 040a805f5f | |||
| 33af5e625b | |||
| bdedcb883d | |||
| e842a75722 | |||
| d28054cc7f | |||
| 41f8c34f6e | |||
| 4b4df28641 | |||
| 8b141d652c | |||
| 92ed8e20c9 | |||
| 746ab8c2d9 | |||
| 69341f4492 | |||
| 56130d8503 | |||
| 4407c8d424 | |||
| 58bb8e716e | |||
| 0becfd4b59 | |||
| c94029012f | |||
| 2d9176cd21 | |||
| e28dad3f84 | |||
| 60d3eec8f7 | |||
| 62f9d064d9 | |||
| 196b9be65b | |||
| 587ce68018 | |||
| 1ec6176b77 | |||
| a5f28e49eb | |||
| 0b7d4bfb6a | |||
| 2492456b93 | |||
| 1c22c9506e | |||
| 49bb42a298 | |||
| e00aeb2b67 | |||
| b219c900ca | |||
| 5eacb4e3cb | |||
| a86d44a29e | |||
| b7a0b7f997 | |||
| cd2d531c54 | |||
| 19c8980784 | |||
| a2e5f86eac | |||
| d8c93cadce | |||
| 35f87c8552 | |||
| 4f7b0983ec | |||
| 055d9ac5c1 | |||
| 039d008223 | |||
| 2b8db9cfc1 | |||
| caa9448200 | |||
| 176a95a946 | |||
| 6f5dd4881a | |||
| ce6aaa709f | |||
| 217a4d65fd | |||
| b88671161a | |||
| dde48335cd | |||
| 8611f08f54 | |||
| cd18e683bf | |||
| 286441c1b1 | |||
| 5456c2c2b8 | |||
| 5cd4fc227e | |||
| 737d672918 | |||
| a6ac4c8f67 | |||
| c9217827ab | |||
| 0ff8fad071 | |||
| f3cb15eae2 | |||
| 5b34b287e2 | |||
| dc461a253f | |||
| 958416af4c | |||
| 1dd8eec4a5 | |||
| b263db5483 | |||
| 528f60c5f3 | |||
| 007b0166ab | |||
| d3fb2374ff | |||
| 676c091d28 | |||
| 58b7572a8b | |||
| fc77c32a0e | |||
| b5bdea1845 | |||
| 8eb591bd08 | |||
| 88be98f703 | |||
| df6b6d514d | |||
| b6d902e425 | |||
| d922d8b034 | |||
| f4db8fdb84 | |||
| 81ca6937bc | |||
| c382e01f64 | |||
| fb80b66310 | |||
| 63e3b97bca | |||
| fb584b35a9 | |||
| bdc372636b | |||
| 2c5671cf38 | |||
| bd12fbecac | |||
| c1d88ada91 | |||
| d6a3e1d90b | |||
| 789c7f3d81 | |||
| f3c785d0fa | |||
| 062c1c2b61 | |||
| eb078d62cd | |||
| c429ac9223 | |||
| bd26967ff2 | |||
| 620b810191 | |||
| 64866c59bd | |||
| 0afbe4c0a2 | |||
| 6782cd0dcc | |||
| 8f585a5be9 | |||
| ac0c396712 | |||
| b989a66991 | |||
| 2814b623e7 | |||
| 7d29a692ef | |||
| 3f9eb446f7 | |||
| d8f7b49ab6 | |||
| 35e70a3eff | |||
| ef9c16e940 | |||
| 0b39c35132 | |||
| 9f5b4e5410 | |||
| dbf840b185 | |||
| e0f0524eb9 | |||
| 8598313d12 | |||
| c84dd648ea | |||
| 01885c1a9b | |||
| 5121f57171 | |||
| 3d7ee10328 | |||
| 4db47b4d37 | |||
| 786a693526 | |||
| 1faef6a1a7 | |||
| 1598642389 | |||
| 8c4a7f4f91 | |||
| 5878f89339 | |||
| 4acbb1820d | |||
| 01f5745629 | |||
| 73dd781a88 | |||
| d777be6251 | |||
| 6689e84f67 | |||
| ad533a1d9c | |||
| b691891e62 | |||
| 53fa265af9 | |||
| 55f6a382d4 | |||
| 9c30acdd56 | |||
| b29d3e7f78 | |||
| c1330d92b2 | |||
| bea55d48a8 | |||
| ae41fe99bb | |||
| e3751229b6 | |||
| 87c9963354 | |||
| b7fb7c7f94 | |||
| b8ceb174b3 | |||
| 48f085b0ac | |||
| dfc0639f95 | |||
| 80ffd1a925 | |||
| c87bb65023 | |||
| 5ae21bd224 | |||
| 12d293a74c | |||
| 62f4bb0d7b | |||
| 9f11061433 | |||
| aba64b10d0 | |||
| c20e30e387 | |||
| c4b4300845 | |||
| f1e5ed41bc | |||
| 9b79502022 | |||
| 636c227a83 | |||
| e8a94a0b1c | |||
| fa93dfd771 | |||
| 8629994eb6 | |||
| c54423a667 | |||
| d28fc9f630 | |||
| bd2b39fdfb | |||
| 2912cd72ef | |||
| 9d31d952b7 | |||
| 8f692b6f4d | |||
| 7562c619d2 | |||
| 6b91ee4a25 | |||
| 9e689468f9 | |||
| 1cda4363ef | |||
| b6941df7a7 | |||
| 608b322f9e | |||
| daee582e92 | |||
| 6525a8a725 | |||
| ee1896c345 | |||
| ec625c2c65 | |||
| 52e4423cf1 | |||
| a9f7e808cb | |||
| 9c26187b45 | |||
| 90afa11f20 | |||
| 6463ea937b | |||
| ac682428e6 | |||
| 48917547b2 | |||
| 74554d9725 | |||
| 0d42a6ea49 | |||
| faadff0211 | |||
| 91715ebf7d | |||
| 1808f160b4 | |||
| e10a92a5c2 | |||
| 930165d006 | |||
| 249eaf89f8 | |||
| bf1cddae9d | |||
| 9db2e51d2d | |||
| 26c02e03c5 | |||
| 1cf587bc8f | |||
| 91ce2cd8a1 | |||
| 4f61e82068 | |||
| 1e6673fabd | |||
| 02951c92af | |||
| 05f8fb3114 | |||
| 169da10c1b | |||
| 5a79fee77e | |||
| 7ef80f14b0 | |||
| 36cc37e39f | |||
| d4e7c6bd18 | |||
| 90f79b4ae7 | |||
| cf74625bfc | |||
| f068d6e4b8 | |||
| e1aa8d74f3 | |||
| b0d86ee5c9 | |||
| 89e27ec6ff | |||
| 39c714a137 | |||
| a8fb7ff11e | |||
| 9b95f47a91 | |||
| 2267e9bc9d | |||
| 089311c673 | |||
| 773f349b66 | |||
| 3980c8ea97 | |||
| 257a5ceef0 | |||
| fb022891fe | |||
| 5d9906b8f2 | |||
| 6f7cb468b2 | |||
| 076693e969 | |||
| 781d8055b5 | |||
| 960bb5c660 | |||
| 42bb2bf66f | |||
| f03d88cd8c | |||
| 58f6535ba6 | |||
| 9a59ce3613 | |||
| 6f37e13611 | |||
| 3c494f1c72 | |||
| ec0e7256cb | |||
| 262203b62d | |||
| 41bdc1a7b7 | |||
| d35e73792f | |||
| 4a3604b1a8 | |||
| b9611589ba | |||
| 12c517f0ff | |||
| 01884ab656 | |||
| 0ba830d5d7 | |||
| b08a0d178c | |||
| 9afa64b537 | |||
| be8bc74ab5 | |||
| 2f4e228fa1 | |||
| 35ee7e4606 | |||
| b265f2817b | |||
| 48af447838 | |||
| 397df0c9c6 | |||
| 68759a2613 | |||
| c376293f2f | |||
| e84a4b20bc | |||
| 14e9f6ac41 | |||
| 0115ecb59b | |||
| 1555b827ee | |||
| 41c2a7da69 | |||
| 592376316f | |||
| c6d7dc0b32 | |||
| 571aacbaa0 | |||
| ef194424e3 | |||
| 233c24cea6 | |||
| b48b0b0d11 | |||
| 65fe42d30c | |||
| 90ae7130f6 | |||
| d866dd211a | |||
| 81446561e0 | |||
| 4ef7213cf5 | |||
| b639d7bfab | |||
| 35e0af5164 | |||
| 86cca7fca5 | |||
| 132ebb6b52 | |||
| e23906582a | |||
| e57232f89c | |||
| f0978365d4 | |||
| ae65922253 | |||
| ca58551b94 | |||
| be0ebac362 | |||
| 8eb8290fc4 | |||
| fac1d3fb62 | |||
| 93fbe1f49a | |||
| 59f17a4faa | |||
| d9e41720c8 | |||
| 8452780602 | |||
| 96b5b660fb | |||
| 610138c05c | |||
| 6a619240fa | |||
| b65c972da1 | |||
| 8ec4551b46 | |||
| 21f4a78dd7 | |||
| 61d7e7c390 | |||
| 993841ddbf | |||
| 98b8409592 | |||
| d3480a86c3 | |||
| 3a63ee4b95 | |||
| 876376d65f | |||
| 215abf615d | |||
| afad2843c6 | |||
| 958ab1f31f | |||
| 0ca325aac2 | |||
| 12b66e5fa0 | |||
| 7e78478fbe | |||
| f783a6360e | |||
| 8eb6c6a213 | |||
| ea5f0268cb | |||
| 427272f8c8 | |||
| 40d09404b3 | |||
| f3ee198833 | |||
| 5416d6e596 | |||
| a0639cbd27 | |||
| 790961f29a | |||
| 18027d4292 | |||
| a8b3944c66 | |||
| a00385e78f | |||
| 5e628d96c7 | |||
| ad34d8553e | |||
| a89b6640a9 | |||
| b3b810c62c | |||
| ecef9bea5e | |||
| c7214fc7ce | |||
| 84bcfb6eb9 | |||
| 0ca7a0efc9 | |||
| cb76436a2a | |||
| 88a951e2e7 | |||
| 6f1b78c2d6 | |||
| 107074b240 | |||
| 6e8ca7e035 | |||
| 3c99a662e8 | |||
| fc8110ca79 | |||
| 715f800788 | |||
| 244aee45cd | |||
| c96f5b207d | |||
| 0e8b2aed72 | |||
| f2accd63fd | |||
| c024e975fb | |||
| a3f725b0ef | |||
| f137f487aa | |||
| 8e59514524 | |||
| 7bcfe30a8e | |||
| 8cddbef701 | |||
| 31492fa9ef | |||
| e3946a9413 | |||
| 28c12496f1 | |||
| f8c2ff735b | |||
| 22e4974191 | |||
| 6eecc3c0fd | |||
| b628b684ae | |||
| 4c49e403ab | |||
| 730683fe25 | |||
| 96b4f8dd89 | |||
| f82889e5ec | |||
| 8d8826a9b7 | |||
| 660c9744bf | |||
| 8221af9a8f | |||
| 93f2573847 | |||
| 03d97c6b1e | |||
| 0b86cb51d3 | |||
| ee54b8219b | |||
| 25b593aadd | |||
| 5253e32b67 | |||
| b0b558c90a | |||
| f11a53c1a4 | |||
| e2a05f4204 | |||
| fcc010eb54 | |||
| 1b41a5a674 | |||
| 74aa88e082 | |||
| fbac33ceba | |||
| 42ba5a531c | |||
| 257e1e2cd9 | |||
| 3025e84c58 | |||
| 4a111d9cf2 | |||
| e6bd8deb0c | |||
| 6b0c57998b | |||
| 6587e9cac8 | |||
| 2e3c69e61c | |||
| 4a8cd63046 | |||
| 549b53b4a4 | |||
| f33d13f574 | |||
| 4da51a16c9 | |||
| 8d138ff974 | |||
| 9373937436 | |||
| 46bbe6b95f | |||
| 56c229a5e0 | |||
| 9d44f0fc08 | |||
| 903d1479a4 | |||
| 7299bcefb2 | |||
| 6b7c69e90a | |||
| 4601838afe | |||
| f7dd634f67 | |||
| eb50c69a35 | |||
| b93ad40571 | |||
| 748db032c7 | |||
| 80931d1b19 | |||
| 93377dcc4f | |||
| 528bef01f0 | |||
| da95a644c8 | |||
| f5a04980a4 | |||
| 93055b3bf1 | |||
| e68847f50a | |||
| 43fe1a235e | |||
| 62c372d0c7 | |||
| 279842b894 | |||
| 6125901023 | |||
| 004c9a8d06 | |||
| f746114041 | |||
| 9f4861a78a | |||
| 32b984a18b | |||
| 8a8542ddb1 | |||
| b41a1a8b15 | |||
| 9923c021fa | |||
| 8c929d0dc3 | |||
| fb1e33fad5 | |||
| c4677a63f6 | |||
| 10fca2dc12 | |||
| 0b383b758e | |||
| ccb6f2c8b0 | |||
| a44071fedd | |||
| b527d579fd | |||
| 5b2977e5e8 | |||
| b347b794b9 | |||
| ad81790c90 | |||
| 906ffee8bc | |||
| 284db988c9 | |||
| 271be93a96 | |||
| 121b036aaf | |||
| 028ccfb1cd | |||
| 37b0407188 | |||
| 616fd45734 | |||
| a537642990 | |||
| 9c6abcb32c | |||
| af69a58418 | |||
| ebebdc1e03 | |||
| 7d185f6563 | |||
| 88741a8616 | |||
| 94edda1856 | |||
| 886786d428 | |||
| e4ca0164fa | |||
| 08db18359a | |||
| f2beeef0e9 | |||
| 6daba77bae | |||
| fd893224b3 | |||
| 8815246221 | |||
| 5e353649a4 | |||
| 4ca7b4221c | |||
| 6c61ea898f | |||
| 0b786b025f | |||
| e106fb324f | |||
| 3edc6bab04 | |||
| 0113ef2582 | |||
| 493b81875a | |||
| ed8e5e69ba | |||
| d27a656568 | |||
| 582739a091 | |||
| fb930f1197 | |||
| 849aa97e63 | |||
| bc5abe3ec1 | |||
| 46cd783fa3 | |||
| a93173f55a | |||
| bd04168209 | |||
| 76ffdb6627 | |||
| f674260df3 | |||
| e9315886b7 | |||
| 4741dd0d77 | |||
| 7a1c4f5082 | |||
| abf339bb58 | |||
| bb8f67c4c1 | |||
| e416c2a3b6 | |||
| 5af4344168 | |||
| 55e958b5da | |||
| 2a231ed7af | |||
| a26f7feb31 | |||
| 90e267d9c7 | |||
| 1ab09c5488 | |||
| eadbf3ad7b | |||
| 42bcc4190c | |||
| 3c44db377b | |||
| ba64f4c467 | |||
| 596bf3a378 | |||
| 91e6119afa | |||
| b053538f94 | |||
| 0c14427bdb | |||
| 110a1a63f0 | |||
| d57b4b4b68 | |||
| 4191edb88c | |||
| b38930a277 | |||
| ea865f44b1 | |||
| 0768ce80a7 | |||
| c960cc44b7 | |||
| a84276579b | |||
| b30fadd149 | |||
| aa89c5e80e | |||
| 38ed083693 | |||
| 961d1838c0 | |||
| 67deb3e3d8 | |||
| 79384fa4ed | |||
| bb2f8461ed | |||
| 168153b211 | |||
| c5e8472746 | |||
| a9e0689619 | |||
| 69acbc9a28 | |||
| 58484b87f4 | |||
| 6858485e41 | |||
| ebd97c253b | |||
| 2c834cd3a8 | |||
| dff6d27c23 | |||
| 3aed97c139 | |||
| 8fe93b4b2e | |||
| c634a07c5d | |||
| 0235a569a0 | |||
| cbe1c878e7 | |||
| 4afb893ce5 | |||
| 645697367d | |||
| 683bb0222c | |||
| ce0c07ebdb | |||
| 785f0ef77f | |||
| 7bfdbb5d92 | |||
| abdb2fee85 | |||
| d1bcd2b2fb | |||
| 297d6f0d2e | |||
| 78ac5af178 | |||
| 9cd8807a75 | |||
| 620cca9ce3 | |||
| 89688455e0 | |||
| 5259f2401b | |||
| c36f0a055d | |||
| ef87a8c2a7 | |||
| 5da68d4243 | |||
| dc95a3c66b | |||
| 087ea44737 | |||
| cb2597d2c8 | |||
| 0d03b66fe5 | |||
| ba531505af | |||
| 595eba152a | |||
| ebd2f07447 | |||
| 5d6503c1f4 | |||
| d03a3a11eb | |||
| 04b4d92f69 | |||
| ec69cc22f9 | |||
| 19a88fea86 | |||
| 729538d885 | |||
| 9f86a8179f | |||
| 3976f5e5bf | |||
| 90d3fb219d | |||
| cabd69772e | |||
| 9339c08777 | |||
| f5e047c7f5 | |||
| f79f9cc79e | |||
| c3fcb7487c | |||
| 15c6ef382a | |||
| 14086ebc9c | |||
| 2257e439a4 | |||
| 6824a5db7a | |||
| c0110eff82 | |||
| 2c17458fdf | |||
| c1345802aa | |||
| 197497df05 | |||
| 7bebe286d5 | |||
| 24394fa858 | |||
| f7c6088cca | |||
| 65eca32de3 | |||
| ae167e63fd | |||
| ab17ba8add | |||
| 2854a91700 | |||
| 6bc778fa53 | |||
| 44fcc33825 | |||
| e0e967385f | |||
| 8900d8126c | |||
| 65b045df03 | |||
| 918842e3a5 | |||
| a3573d4f9a | |||
| 46fdacad81 | |||
| 67b8c7f1c0 | |||
| 43f28317f6 | |||
| f61cf8c331 | |||
| 340344b791 | |||
| ba1a2d5495 | |||
| a177061f18 | |||
| d806ade84c | |||
| 854b76702b |
+4
-7
@@ -1,12 +1,9 @@
|
||||
root = true
|
||||
|
||||
[*]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
|
||||
[*.md]
|
||||
trim_trailing_whitespace = false
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
{
|
||||
"rules": {
|
||||
"no-console": "off",
|
||||
"global-require": "off",
|
||||
"import/no-dynamic-require": "off"
|
||||
}
|
||||
}
|
||||
@@ -1,64 +0,0 @@
|
||||
/**
|
||||
* Base webpack config used across other specific configs
|
||||
*/
|
||||
|
||||
import webpack from 'webpack';
|
||||
import { dependencies as externals } from '../../release/app/package.json';
|
||||
import webpackPaths from './webpack.paths';
|
||||
import { TsconfigPathsPlugin } from 'tsconfig-paths-webpack-plugin';
|
||||
|
||||
const createStyledComponentsTransformer = require('typescript-plugin-styled-components').default;
|
||||
|
||||
const styledComponentsTransformer = createStyledComponentsTransformer();
|
||||
|
||||
const configuration: webpack.Configuration = {
|
||||
externals: [...Object.keys(externals || {})],
|
||||
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
exclude: /node_modules/,
|
||||
test: /\.[jt]sx?$/,
|
||||
use: {
|
||||
loader: 'ts-loader',
|
||||
options: {
|
||||
// Remove this line to enable type checking in webpack builds
|
||||
transpileOnly: true,
|
||||
getCustomTransformers: () => ({ before: [styledComponentsTransformer] }),
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
output: {
|
||||
// https://github.com/webpack/webpack/issues/1114
|
||||
library: {
|
||||
type: 'commonjs2',
|
||||
},
|
||||
|
||||
path: webpackPaths.srcPath,
|
||||
},
|
||||
|
||||
plugins: [
|
||||
new webpack.EnvironmentPlugin({
|
||||
NODE_ENV: 'production',
|
||||
}),
|
||||
],
|
||||
|
||||
/**
|
||||
* Determine the array of extensions that should be used to resolve modules.
|
||||
*/
|
||||
resolve: {
|
||||
extensions: ['.js', '.jsx', '.json', '.ts', '.tsx'],
|
||||
fallback: {
|
||||
child_process: false,
|
||||
},
|
||||
plugins: [new TsconfigPathsPlugin({ baseUrl: webpackPaths.srcPath })],
|
||||
modules: [webpackPaths.srcPath, 'node_modules'],
|
||||
},
|
||||
|
||||
stats: 'errors-only',
|
||||
};
|
||||
|
||||
export default configuration;
|
||||
@@ -1,3 +0,0 @@
|
||||
/* eslint import/no-unresolved: off, import/no-self-import: off */
|
||||
|
||||
module.exports = require('./webpack.config.renderer.dev').default;
|
||||
@@ -1,84 +0,0 @@
|
||||
/**
|
||||
* Webpack config for production electron main process
|
||||
*/
|
||||
|
||||
import path from 'path';
|
||||
|
||||
import TerserPlugin from 'terser-webpack-plugin';
|
||||
import webpack from 'webpack';
|
||||
import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer';
|
||||
import { merge } from 'webpack-merge';
|
||||
|
||||
import checkNodeEnv from '../scripts/check-node-env';
|
||||
import deleteSourceMaps from '../scripts/delete-source-maps';
|
||||
import baseConfig from './webpack.config.base';
|
||||
import webpackPaths from './webpack.paths';
|
||||
|
||||
checkNodeEnv('production');
|
||||
deleteSourceMaps();
|
||||
|
||||
const devtoolsConfig =
|
||||
process.env.DEBUG_PROD === 'true'
|
||||
? {
|
||||
devtool: 'source-map',
|
||||
}
|
||||
: {};
|
||||
|
||||
const configuration: webpack.Configuration = {
|
||||
...devtoolsConfig,
|
||||
|
||||
mode: 'production',
|
||||
|
||||
target: 'electron-main',
|
||||
|
||||
entry: {
|
||||
main: path.join(webpackPaths.srcMainPath, 'main.ts'),
|
||||
preload: path.join(webpackPaths.srcMainPath, 'preload.ts'),
|
||||
},
|
||||
|
||||
output: {
|
||||
path: webpackPaths.distMainPath,
|
||||
filename: '[name].js',
|
||||
},
|
||||
|
||||
optimization: {
|
||||
minimizer: [
|
||||
new TerserPlugin({
|
||||
parallel: true,
|
||||
}),
|
||||
],
|
||||
},
|
||||
|
||||
plugins: [
|
||||
new BundleAnalyzerPlugin({
|
||||
analyzerMode: process.env.ANALYZE === 'true' ? 'server' : 'disabled',
|
||||
}),
|
||||
|
||||
/**
|
||||
* Create global constants which can be configured at compile time.
|
||||
*
|
||||
* Useful for allowing different behaviour between development builds and
|
||||
* release builds
|
||||
*
|
||||
* NODE_ENV should be production so that modules do not perform certain
|
||||
* development checks
|
||||
*/
|
||||
new webpack.EnvironmentPlugin({
|
||||
NODE_ENV: 'production',
|
||||
DEBUG_PROD: false,
|
||||
START_MINIMIZED: false,
|
||||
}),
|
||||
],
|
||||
|
||||
/**
|
||||
* Disables webpack processing of __dirname and __filename.
|
||||
* If you run the bundle in node.js it falls back to these values of node.js.
|
||||
* https://github.com/webpack/webpack/issues/2010
|
||||
*/
|
||||
node: {
|
||||
__dirname: false,
|
||||
__filename: false,
|
||||
},
|
||||
};
|
||||
|
||||
export default merge(baseConfig, configuration);
|
||||
@@ -1,70 +0,0 @@
|
||||
import path from 'path';
|
||||
|
||||
import webpack from 'webpack';
|
||||
import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer';
|
||||
import { merge } from 'webpack-merge';
|
||||
|
||||
import checkNodeEnv from '../scripts/check-node-env';
|
||||
import baseConfig from './webpack.config.base';
|
||||
import webpackPaths from './webpack.paths';
|
||||
|
||||
// When an ESLint server is running, we can't set the NODE_ENV so we'll check if it's
|
||||
// at the dev webpack config is not accidentally run in a production environment
|
||||
if (process.env.NODE_ENV === 'production') {
|
||||
checkNodeEnv('development');
|
||||
}
|
||||
|
||||
const configuration: webpack.Configuration = {
|
||||
devtool: 'inline-source-map',
|
||||
|
||||
mode: 'development',
|
||||
|
||||
target: 'electron-preload',
|
||||
|
||||
entry: path.join(webpackPaths.srcMainPath, 'preload.ts'),
|
||||
|
||||
output: {
|
||||
path: webpackPaths.dllPath,
|
||||
filename: 'preload.js',
|
||||
},
|
||||
|
||||
plugins: [
|
||||
new BundleAnalyzerPlugin({
|
||||
analyzerMode: process.env.ANALYZE === 'true' ? 'server' : 'disabled',
|
||||
}),
|
||||
|
||||
/**
|
||||
* Create global constants which can be configured at compile time.
|
||||
*
|
||||
* Useful for allowing different behaviour between development builds and
|
||||
* release builds
|
||||
*
|
||||
* NODE_ENV should be production so that modules do not perform certain
|
||||
* development checks
|
||||
*
|
||||
* By default, use 'development' as NODE_ENV. This can be overriden with
|
||||
* 'staging', for example, by changing the ENV variables in the npm scripts
|
||||
*/
|
||||
new webpack.EnvironmentPlugin({
|
||||
NODE_ENV: 'development',
|
||||
}),
|
||||
|
||||
new webpack.LoaderOptionsPlugin({
|
||||
debug: true,
|
||||
}),
|
||||
],
|
||||
|
||||
/**
|
||||
* Disables webpack processing of __dirname and __filename.
|
||||
* If you run the bundle in node.js it falls back to these values of node.js.
|
||||
* https://github.com/webpack/webpack/issues/2010
|
||||
*/
|
||||
node: {
|
||||
__dirname: false,
|
||||
__filename: false,
|
||||
},
|
||||
|
||||
watch: true,
|
||||
};
|
||||
|
||||
export default merge(baseConfig, configuration);
|
||||
@@ -1,127 +0,0 @@
|
||||
import 'webpack-dev-server';
|
||||
import path from 'path';
|
||||
|
||||
import HtmlWebpackPlugin from 'html-webpack-plugin';
|
||||
import webpack from 'webpack';
|
||||
import { merge } from 'webpack-merge';
|
||||
|
||||
import checkNodeEnv from '../scripts/check-node-env';
|
||||
import baseConfig from './webpack.config.base';
|
||||
import webpackPaths from './webpack.paths';
|
||||
|
||||
const { version } = require('../../package.json');
|
||||
|
||||
// When an ESLint server is running, we can't set the NODE_ENV so we'll check if it's
|
||||
// at the dev webpack config is not accidentally run in a production environment
|
||||
if (process.env.NODE_ENV === 'production') {
|
||||
checkNodeEnv('development');
|
||||
}
|
||||
|
||||
const configuration: webpack.Configuration = {
|
||||
devtool: 'inline-source-map',
|
||||
|
||||
mode: 'development',
|
||||
|
||||
target: ['web'],
|
||||
|
||||
entry: {
|
||||
remote: path.join(webpackPaths.srcRemotePath, 'index.tsx'),
|
||||
worker: path.join(webpackPaths.srcRemotePath, 'service-worker.ts'),
|
||||
},
|
||||
|
||||
output: {
|
||||
path: webpackPaths.dllPath,
|
||||
publicPath: '/',
|
||||
filename: '[name].js',
|
||||
library: {
|
||||
type: 'umd',
|
||||
},
|
||||
},
|
||||
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: /\.s?css$/,
|
||||
use: [
|
||||
'style-loader',
|
||||
{
|
||||
loader: 'css-loader',
|
||||
options: {
|
||||
modules: true,
|
||||
sourceMap: true,
|
||||
importLoaders: 1,
|
||||
},
|
||||
},
|
||||
'sass-loader',
|
||||
],
|
||||
include: /\.module\.s?(c|a)ss$/,
|
||||
},
|
||||
{
|
||||
test: /\.s?css$/,
|
||||
use: ['style-loader', 'css-loader', 'sass-loader'],
|
||||
exclude: /\.module\.s?(c|a)ss$/,
|
||||
},
|
||||
// Fonts
|
||||
{
|
||||
test: /\.(woff|woff2|eot|ttf|otf)$/i,
|
||||
type: 'asset/resource',
|
||||
},
|
||||
// Images
|
||||
{
|
||||
test: /\.(png|svg|jpg|jpeg|gif)$/i,
|
||||
type: 'asset/resource',
|
||||
},
|
||||
],
|
||||
},
|
||||
plugins: [
|
||||
new webpack.NoEmitOnErrorsPlugin(),
|
||||
|
||||
/**
|
||||
* Create global constants which can be configured at compile time.
|
||||
*
|
||||
* Useful for allowing different behaviour between development builds and
|
||||
* release builds
|
||||
*
|
||||
* NODE_ENV should be production so that modules do not perform certain
|
||||
* development checks
|
||||
*
|
||||
* By default, use 'development' as NODE_ENV. This can be overriden with
|
||||
* 'staging', for example, by changing the ENV variables in the npm scripts
|
||||
*/
|
||||
new webpack.EnvironmentPlugin({
|
||||
NODE_ENV: 'development',
|
||||
}),
|
||||
|
||||
new webpack.LoaderOptionsPlugin({
|
||||
debug: true,
|
||||
}),
|
||||
|
||||
new HtmlWebpackPlugin({
|
||||
filename: path.join('index.html'),
|
||||
template: path.join(webpackPaths.srcRemotePath, 'index.ejs'),
|
||||
favicon: path.join(webpackPaths.assetsPath, 'icons', 'favicon.ico'),
|
||||
minify: {
|
||||
collapseWhitespace: true,
|
||||
removeAttributeQuotes: true,
|
||||
removeComments: true,
|
||||
},
|
||||
isBrowser: true,
|
||||
env: process.env.NODE_ENV,
|
||||
isDevelopment: process.env.NODE_ENV !== 'production',
|
||||
nodeModules: webpackPaths.appNodeModulesPath,
|
||||
templateParameters: {
|
||||
version,
|
||||
prod: false,
|
||||
},
|
||||
}),
|
||||
],
|
||||
|
||||
node: {
|
||||
__dirname: false,
|
||||
__filename: false,
|
||||
},
|
||||
|
||||
watch: true,
|
||||
};
|
||||
|
||||
export default merge(baseConfig, configuration);
|
||||
@@ -1,142 +0,0 @@
|
||||
/**
|
||||
* Build config for electron renderer process
|
||||
*/
|
||||
|
||||
import path from 'path';
|
||||
|
||||
import CssMinimizerPlugin from 'css-minimizer-webpack-plugin';
|
||||
import HtmlWebpackPlugin from 'html-webpack-plugin';
|
||||
import MiniCssExtractPlugin from 'mini-css-extract-plugin';
|
||||
import TerserPlugin from 'terser-webpack-plugin';
|
||||
import webpack from 'webpack';
|
||||
import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer';
|
||||
import { merge } from 'webpack-merge';
|
||||
|
||||
import checkNodeEnv from '../scripts/check-node-env';
|
||||
import deleteSourceMaps from '../scripts/delete-source-maps';
|
||||
import baseConfig from './webpack.config.base';
|
||||
import webpackPaths from './webpack.paths';
|
||||
|
||||
const { version } = require('../../package.json');
|
||||
|
||||
checkNodeEnv('production');
|
||||
deleteSourceMaps();
|
||||
|
||||
const devtoolsConfig =
|
||||
process.env.DEBUG_PROD === 'true'
|
||||
? {
|
||||
devtool: 'source-map',
|
||||
}
|
||||
: {};
|
||||
|
||||
const configuration: webpack.Configuration = {
|
||||
...devtoolsConfig,
|
||||
|
||||
mode: 'production',
|
||||
|
||||
target: ['web'],
|
||||
|
||||
entry: {
|
||||
remote: path.join(webpackPaths.srcRemotePath, 'index.tsx'),
|
||||
worker: path.join(webpackPaths.srcRemotePath, 'service-worker.ts'),
|
||||
},
|
||||
|
||||
output: {
|
||||
path: webpackPaths.distRemotePath,
|
||||
publicPath: './',
|
||||
filename: '[name].js',
|
||||
library: {
|
||||
type: 'umd',
|
||||
},
|
||||
},
|
||||
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: /\.s?(a|c)ss$/,
|
||||
use: [
|
||||
MiniCssExtractPlugin.loader,
|
||||
{
|
||||
loader: 'css-loader',
|
||||
options: {
|
||||
modules: true,
|
||||
sourceMap: true,
|
||||
importLoaders: 1,
|
||||
},
|
||||
},
|
||||
'sass-loader',
|
||||
],
|
||||
include: /\.module\.s?(c|a)ss$/,
|
||||
},
|
||||
{
|
||||
test: /\.s?(a|c)ss$/,
|
||||
use: [MiniCssExtractPlugin.loader, 'css-loader', 'sass-loader'],
|
||||
exclude: /\.module\.s?(c|a)ss$/,
|
||||
},
|
||||
// Fonts
|
||||
{
|
||||
test: /\.(woff|woff2|eot|ttf|otf)$/i,
|
||||
type: 'asset/resource',
|
||||
},
|
||||
// Images
|
||||
{
|
||||
test: /\.(png|svg|jpg|jpeg|gif)$/i,
|
||||
type: 'asset/resource',
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
optimization: {
|
||||
minimize: true,
|
||||
minimizer: [
|
||||
new TerserPlugin({
|
||||
parallel: true,
|
||||
}),
|
||||
new CssMinimizerPlugin(),
|
||||
],
|
||||
},
|
||||
|
||||
plugins: [
|
||||
/**
|
||||
* Create global constants which can be configured at compile time.
|
||||
*
|
||||
* Useful for allowing different behaviour between development builds and
|
||||
* release builds
|
||||
*
|
||||
* NODE_ENV should be production so that modules do not perform certain
|
||||
* development checks
|
||||
*/
|
||||
new webpack.EnvironmentPlugin({
|
||||
NODE_ENV: 'production',
|
||||
DEBUG_PROD: false,
|
||||
}),
|
||||
|
||||
new MiniCssExtractPlugin({
|
||||
filename: 'remote.css',
|
||||
}),
|
||||
|
||||
new BundleAnalyzerPlugin({
|
||||
analyzerMode: process.env.ANALYZE === 'true' ? 'server' : 'disabled',
|
||||
}),
|
||||
|
||||
new HtmlWebpackPlugin({
|
||||
filename: 'index.html',
|
||||
template: path.join(webpackPaths.srcRemotePath, 'index.ejs'),
|
||||
favicon: path.join(webpackPaths.assetsPath, 'icons', 'favicon.ico'),
|
||||
minify: {
|
||||
collapseWhitespace: true,
|
||||
removeAttributeQuotes: true,
|
||||
removeComments: true,
|
||||
},
|
||||
isBrowser: true,
|
||||
env: process.env.NODE_ENV,
|
||||
isDevelopment: process.env.NODE_ENV !== 'production',
|
||||
templateParameters: {
|
||||
version,
|
||||
prod: true,
|
||||
},
|
||||
}),
|
||||
],
|
||||
};
|
||||
|
||||
export default merge(baseConfig, configuration);
|
||||
@@ -1,79 +0,0 @@
|
||||
/**
|
||||
* Builds the DLL for development electron renderer process
|
||||
*/
|
||||
|
||||
import path from 'path';
|
||||
|
||||
import webpack from 'webpack';
|
||||
import { merge } from 'webpack-merge';
|
||||
|
||||
import { dependencies } from '../../package.json';
|
||||
import checkNodeEnv from '../scripts/check-node-env';
|
||||
import baseConfig from './webpack.config.base';
|
||||
import webpackPaths from './webpack.paths';
|
||||
|
||||
checkNodeEnv('development');
|
||||
|
||||
const dist = webpackPaths.dllPath;
|
||||
|
||||
const configuration: webpack.Configuration = {
|
||||
context: webpackPaths.rootPath,
|
||||
|
||||
devtool: 'eval',
|
||||
|
||||
mode: 'development',
|
||||
|
||||
target: 'electron-renderer',
|
||||
|
||||
externals: ['fsevents', 'crypto-browserify'],
|
||||
|
||||
/**
|
||||
* Use `module` from `webpack.config.renderer.dev.js`
|
||||
*/
|
||||
module: require('./webpack.config.renderer.dev').default.module,
|
||||
|
||||
entry: {
|
||||
renderer: Object.keys(dependencies || {}),
|
||||
},
|
||||
|
||||
output: {
|
||||
path: dist,
|
||||
filename: '[name].dev.dll.js',
|
||||
library: {
|
||||
name: 'renderer',
|
||||
type: 'var',
|
||||
},
|
||||
},
|
||||
|
||||
plugins: [
|
||||
new webpack.DllPlugin({
|
||||
path: path.join(dist, '[name].json'),
|
||||
name: '[name]',
|
||||
}),
|
||||
|
||||
/**
|
||||
* Create global constants which can be configured at compile time.
|
||||
*
|
||||
* Useful for allowing different behaviour between development builds and
|
||||
* release builds
|
||||
*
|
||||
* NODE_ENV should be production so that modules do not perform certain
|
||||
* development checks
|
||||
*/
|
||||
new webpack.EnvironmentPlugin({
|
||||
NODE_ENV: 'development',
|
||||
}),
|
||||
|
||||
new webpack.LoaderOptionsPlugin({
|
||||
debug: true,
|
||||
options: {
|
||||
context: webpackPaths.srcPath,
|
||||
output: {
|
||||
path: webpackPaths.dllPath,
|
||||
},
|
||||
},
|
||||
}),
|
||||
],
|
||||
};
|
||||
|
||||
export default merge(baseConfig, configuration);
|
||||
@@ -1,201 +0,0 @@
|
||||
import 'webpack-dev-server';
|
||||
import { execSync, spawn } from 'child_process';
|
||||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
|
||||
import ReactRefreshWebpackPlugin from '@pmmmwh/react-refresh-webpack-plugin';
|
||||
import chalk from 'chalk';
|
||||
import HtmlWebpackPlugin from 'html-webpack-plugin';
|
||||
import webpack from 'webpack';
|
||||
import { merge } from 'webpack-merge';
|
||||
|
||||
import checkNodeEnv from '../scripts/check-node-env';
|
||||
import baseConfig from './webpack.config.base';
|
||||
import webpackPaths from './webpack.paths';
|
||||
|
||||
// When an ESLint server is running, we can't set the NODE_ENV so we'll check if it's
|
||||
// at the dev webpack config is not accidentally run in a production environment
|
||||
if (process.env.NODE_ENV === 'production') {
|
||||
checkNodeEnv('development');
|
||||
}
|
||||
|
||||
const port = process.env.PORT || 4343;
|
||||
const manifest = path.resolve(webpackPaths.dllPath, 'renderer.json');
|
||||
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
||||
const requiredByDLLConfig = module.parent!.filename.includes('webpack.config.renderer.dev.dll');
|
||||
|
||||
/**
|
||||
* Warn if the DLL is not built
|
||||
*/
|
||||
if (!requiredByDLLConfig && !(fs.existsSync(webpackPaths.dllPath) && fs.existsSync(manifest))) {
|
||||
console.log(
|
||||
chalk.black.bgYellow.bold(
|
||||
'The DLL files are missing. Sit back while we build them for you with "npm run build-dll"',
|
||||
),
|
||||
);
|
||||
execSync('npm run postinstall');
|
||||
}
|
||||
|
||||
const configuration: webpack.Configuration = {
|
||||
devtool: 'inline-source-map',
|
||||
|
||||
mode: 'development',
|
||||
|
||||
target: ['web', 'electron-renderer'],
|
||||
|
||||
entry: [
|
||||
`webpack-dev-server/client?http://localhost:${port}/dist`,
|
||||
'webpack/hot/only-dev-server',
|
||||
path.join(webpackPaths.srcRendererPath, 'index.tsx'),
|
||||
],
|
||||
|
||||
output: {
|
||||
path: webpackPaths.distRendererPath,
|
||||
publicPath: '/',
|
||||
filename: 'renderer.dev.js',
|
||||
library: {
|
||||
type: 'umd',
|
||||
},
|
||||
},
|
||||
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: /\.s?css$/,
|
||||
use: [
|
||||
'style-loader',
|
||||
{
|
||||
loader: 'css-loader',
|
||||
options: {
|
||||
modules: {
|
||||
localIdentName: '[name]__[local]--[hash:base64:5]',
|
||||
exportLocalsConvention: 'camelCaseOnly',
|
||||
},
|
||||
sourceMap: true,
|
||||
importLoaders: 1,
|
||||
},
|
||||
},
|
||||
'sass-loader',
|
||||
],
|
||||
include: /\.module\.s?(c|a)ss$/,
|
||||
},
|
||||
{
|
||||
test: /\.s?css$/,
|
||||
use: ['style-loader', 'css-loader', 'sass-loader'],
|
||||
exclude: /\.module\.s?(c|a)ss$/,
|
||||
},
|
||||
// Fonts
|
||||
{
|
||||
test: /\.(woff|woff2|eot|ttf|otf)$/i,
|
||||
type: 'asset/resource',
|
||||
},
|
||||
// Images
|
||||
{
|
||||
test: /\.(png|svg|jpg|jpeg|gif)$/i,
|
||||
type: 'asset/resource',
|
||||
},
|
||||
],
|
||||
},
|
||||
plugins: [
|
||||
...(requiredByDLLConfig
|
||||
? []
|
||||
: [
|
||||
new webpack.DllReferencePlugin({
|
||||
context: webpackPaths.dllPath,
|
||||
manifest: require(manifest),
|
||||
sourceType: 'var',
|
||||
}),
|
||||
]),
|
||||
|
||||
new webpack.NoEmitOnErrorsPlugin(),
|
||||
|
||||
/**
|
||||
* Create global constants which can be configured at compile time.
|
||||
*
|
||||
* Useful for allowing different behaviour between development builds and
|
||||
* release builds
|
||||
*
|
||||
* NODE_ENV should be production so that modules do not perform certain
|
||||
* development checks
|
||||
*
|
||||
* By default, use 'development' as NODE_ENV. This can be overriden with
|
||||
* 'staging', for example, by changing the ENV variables in the npm scripts
|
||||
*/
|
||||
new webpack.EnvironmentPlugin({
|
||||
NODE_ENV: 'development',
|
||||
}),
|
||||
|
||||
new webpack.LoaderOptionsPlugin({
|
||||
debug: true,
|
||||
}),
|
||||
|
||||
new ReactRefreshWebpackPlugin(),
|
||||
|
||||
new HtmlWebpackPlugin({
|
||||
filename: path.join('index.html'),
|
||||
template: path.join(webpackPaths.srcRendererPath, 'index.ejs'),
|
||||
minify: {
|
||||
collapseWhitespace: true,
|
||||
removeAttributeQuotes: true,
|
||||
removeComments: true,
|
||||
},
|
||||
isBrowser: false,
|
||||
env: process.env.NODE_ENV,
|
||||
isDevelopment: process.env.NODE_ENV !== 'production',
|
||||
nodeModules: webpackPaths.appNodeModulesPath,
|
||||
templateParameters: {
|
||||
web: false,
|
||||
},
|
||||
}),
|
||||
],
|
||||
|
||||
node: {
|
||||
__dirname: false,
|
||||
__filename: false,
|
||||
},
|
||||
|
||||
devServer: {
|
||||
port,
|
||||
compress: true,
|
||||
hot: true,
|
||||
headers: { 'Access-Control-Allow-Origin': '*' },
|
||||
static: {
|
||||
publicPath: '/',
|
||||
},
|
||||
historyApiFallback: {
|
||||
verbose: true,
|
||||
},
|
||||
setupMiddlewares(middlewares) {
|
||||
console.log('Starting preload.js builder...');
|
||||
const preloadProcess = spawn('npm', ['run', 'start:preload'], {
|
||||
shell: true,
|
||||
stdio: 'inherit',
|
||||
})
|
||||
.on('close', (code: number) => process.exit(code!))
|
||||
.on('error', (spawnError) => console.error(spawnError));
|
||||
|
||||
console.log('Starting remote.js builder...');
|
||||
const remoteProcess = spawn('npm', ['run', 'start:remote'], {
|
||||
shell: true,
|
||||
stdio: 'inherit',
|
||||
})
|
||||
.on('close', (code: number) => process.exit(code!))
|
||||
.on('error', (spawnError) => console.error(spawnError));
|
||||
|
||||
console.log('Starting Main Process...');
|
||||
spawn('npm', ['run', 'start:main'], {
|
||||
shell: true,
|
||||
stdio: 'inherit',
|
||||
})
|
||||
.on('close', (code: number) => {
|
||||
preloadProcess.kill();
|
||||
remoteProcess.kill();
|
||||
process.exit(code!);
|
||||
})
|
||||
.on('error', (spawnError) => console.error(spawnError));
|
||||
return middlewares;
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default merge(baseConfig, configuration);
|
||||
@@ -1,137 +0,0 @@
|
||||
/**
|
||||
* Build config for electron renderer process
|
||||
*/
|
||||
|
||||
import path from 'path';
|
||||
|
||||
import CssMinimizerPlugin from 'css-minimizer-webpack-plugin';
|
||||
import HtmlWebpackPlugin from 'html-webpack-plugin';
|
||||
import MiniCssExtractPlugin from 'mini-css-extract-plugin';
|
||||
import TerserPlugin from 'terser-webpack-plugin';
|
||||
import webpack from 'webpack';
|
||||
import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer';
|
||||
import { merge } from 'webpack-merge';
|
||||
|
||||
import checkNodeEnv from '../scripts/check-node-env';
|
||||
import deleteSourceMaps from '../scripts/delete-source-maps';
|
||||
import baseConfig from './webpack.config.base';
|
||||
import webpackPaths from './webpack.paths';
|
||||
|
||||
checkNodeEnv('production');
|
||||
deleteSourceMaps();
|
||||
|
||||
const devtoolsConfig =
|
||||
process.env.DEBUG_PROD === 'true'
|
||||
? {
|
||||
devtool: 'source-map',
|
||||
}
|
||||
: {};
|
||||
|
||||
const configuration: webpack.Configuration = {
|
||||
...devtoolsConfig,
|
||||
|
||||
mode: 'production',
|
||||
|
||||
target: ['web', 'electron-renderer'],
|
||||
|
||||
entry: [path.join(webpackPaths.srcRendererPath, 'index.tsx')],
|
||||
|
||||
output: {
|
||||
path: webpackPaths.distRendererPath,
|
||||
publicPath: './',
|
||||
filename: 'renderer.js',
|
||||
library: {
|
||||
type: 'umd',
|
||||
},
|
||||
},
|
||||
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: /\.s?(a|c)ss$/,
|
||||
use: [
|
||||
MiniCssExtractPlugin.loader,
|
||||
{
|
||||
loader: 'css-loader',
|
||||
options: {
|
||||
modules: {
|
||||
localIdentName: '[name]__[local]--[hash:base64:5]',
|
||||
exportLocalsConvention: 'camelCaseOnly',
|
||||
},
|
||||
sourceMap: true,
|
||||
importLoaders: 1,
|
||||
},
|
||||
},
|
||||
'sass-loader',
|
||||
],
|
||||
include: /\.module\.s?(c|a)ss$/,
|
||||
},
|
||||
{
|
||||
test: /\.s?(a|c)ss$/,
|
||||
use: [MiniCssExtractPlugin.loader, 'css-loader', 'sass-loader'],
|
||||
exclude: /\.module\.s?(c|a)ss$/,
|
||||
},
|
||||
// Fonts
|
||||
{
|
||||
test: /\.(woff|woff2|eot|ttf|otf)$/i,
|
||||
type: 'asset/resource',
|
||||
},
|
||||
// Images
|
||||
{
|
||||
test: /\.(png|svg|jpg|jpeg|gif)$/i,
|
||||
type: 'asset/resource',
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
optimization: {
|
||||
minimize: true,
|
||||
minimizer: [
|
||||
new TerserPlugin({
|
||||
parallel: true,
|
||||
}),
|
||||
new CssMinimizerPlugin(),
|
||||
],
|
||||
},
|
||||
|
||||
plugins: [
|
||||
/**
|
||||
* Create global constants which can be configured at compile time.
|
||||
*
|
||||
* Useful for allowing different behaviour between development builds and
|
||||
* release builds
|
||||
*
|
||||
* NODE_ENV should be production so that modules do not perform certain
|
||||
* development checks
|
||||
*/
|
||||
new webpack.EnvironmentPlugin({
|
||||
NODE_ENV: 'production',
|
||||
DEBUG_PROD: false,
|
||||
}),
|
||||
|
||||
new MiniCssExtractPlugin({
|
||||
filename: 'style.css',
|
||||
}),
|
||||
|
||||
new BundleAnalyzerPlugin({
|
||||
analyzerMode: process.env.ANALYZE === 'true' ? 'server' : 'disabled',
|
||||
}),
|
||||
|
||||
new HtmlWebpackPlugin({
|
||||
filename: 'index.html',
|
||||
template: path.join(webpackPaths.srcRendererPath, 'index.ejs'),
|
||||
minify: {
|
||||
collapseWhitespace: true,
|
||||
removeAttributeQuotes: true,
|
||||
removeComments: true,
|
||||
},
|
||||
isBrowser: false,
|
||||
isDevelopment: process.env.NODE_ENV !== 'production',
|
||||
templateParameters: {
|
||||
web: false,
|
||||
},
|
||||
}),
|
||||
],
|
||||
};
|
||||
|
||||
export default merge(baseConfig, configuration);
|
||||
@@ -1,147 +0,0 @@
|
||||
import 'webpack-dev-server';
|
||||
import path from 'path';
|
||||
|
||||
import ReactRefreshWebpackPlugin from '@pmmmwh/react-refresh-webpack-plugin';
|
||||
import HtmlWebpackPlugin from 'html-webpack-plugin';
|
||||
import webpack from 'webpack';
|
||||
import { merge } from 'webpack-merge';
|
||||
|
||||
import checkNodeEnv from '../scripts/check-node-env';
|
||||
import baseConfig from './webpack.config.base';
|
||||
import webpackPaths from './webpack.paths';
|
||||
|
||||
// When an ESLint server is running, we can't set the NODE_ENV so we'll check if it's
|
||||
// at the dev webpack config is not accidentally run in a production environment
|
||||
if (process.env.NODE_ENV === 'production') {
|
||||
checkNodeEnv('development');
|
||||
}
|
||||
|
||||
const port = process.env.PORT || 4343;
|
||||
|
||||
const configuration: webpack.Configuration = {
|
||||
devtool: 'inline-source-map',
|
||||
|
||||
mode: 'development',
|
||||
|
||||
target: ['web', 'electron-renderer'],
|
||||
|
||||
entry: [
|
||||
`webpack-dev-server/client?http://localhost:${port}/dist`,
|
||||
'webpack/hot/only-dev-server',
|
||||
path.join(webpackPaths.srcRendererPath, 'index.tsx'),
|
||||
],
|
||||
|
||||
output: {
|
||||
path: webpackPaths.distRendererPath,
|
||||
publicPath: '/',
|
||||
filename: 'renderer.dev.js',
|
||||
library: {
|
||||
type: 'umd',
|
||||
},
|
||||
},
|
||||
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: /\.s?css$/,
|
||||
use: [
|
||||
'style-loader',
|
||||
{
|
||||
loader: 'css-loader',
|
||||
options: {
|
||||
modules: {
|
||||
localIdentName: '[name]__[local]--[hash:base64:5]',
|
||||
exportLocalsConvention: 'camelCaseOnly',
|
||||
},
|
||||
sourceMap: true,
|
||||
importLoaders: 1,
|
||||
},
|
||||
},
|
||||
'sass-loader',
|
||||
],
|
||||
include: /\.module\.s?(c|a)ss$/,
|
||||
},
|
||||
{
|
||||
test: /\.s?css$/,
|
||||
use: ['style-loader', 'css-loader', 'sass-loader'],
|
||||
exclude: /\.module\.s?(c|a)ss$/,
|
||||
},
|
||||
// Fonts
|
||||
{
|
||||
test: /\.(woff|woff2|eot|ttf|otf)$/i,
|
||||
type: 'asset/resource',
|
||||
},
|
||||
// Images
|
||||
{
|
||||
test: /\.(png|svg|jpg|jpeg|gif)$/i,
|
||||
type: 'asset/resource',
|
||||
},
|
||||
],
|
||||
},
|
||||
plugins: [
|
||||
new webpack.NoEmitOnErrorsPlugin(),
|
||||
|
||||
/**
|
||||
* Create global constants which can be configured at compile time.
|
||||
*
|
||||
* Useful for allowing different behaviour between development builds and
|
||||
* release builds
|
||||
*
|
||||
* NODE_ENV should be production so that modules do not perform certain
|
||||
* development checks
|
||||
*
|
||||
* By default, use 'development' as NODE_ENV. This can be overriden with
|
||||
* 'staging', for example, by changing the ENV variables in the npm scripts
|
||||
*/
|
||||
new webpack.EnvironmentPlugin({
|
||||
NODE_ENV: 'development',
|
||||
}),
|
||||
|
||||
new webpack.LoaderOptionsPlugin({
|
||||
debug: true,
|
||||
}),
|
||||
|
||||
new ReactRefreshWebpackPlugin(),
|
||||
|
||||
new HtmlWebpackPlugin({
|
||||
filename: path.join('index.html'),
|
||||
template: path.join(webpackPaths.srcRendererPath, 'index.ejs'),
|
||||
favicon: path.join(webpackPaths.assetsPath, 'icons', 'favicon.ico'),
|
||||
minify: {
|
||||
collapseWhitespace: true,
|
||||
removeAttributeQuotes: true,
|
||||
removeComments: true,
|
||||
},
|
||||
isBrowser: false,
|
||||
env: process.env.NODE_ENV,
|
||||
isDevelopment: process.env.NODE_ENV !== 'production',
|
||||
nodeModules: webpackPaths.appNodeModulesPath,
|
||||
templateParameters: {
|
||||
web: false, // with hot reload, we don't have NGINX injecting variables
|
||||
},
|
||||
}),
|
||||
],
|
||||
|
||||
node: {
|
||||
__dirname: false,
|
||||
__filename: false,
|
||||
},
|
||||
|
||||
devServer: {
|
||||
port,
|
||||
compress: true,
|
||||
hot: true,
|
||||
headers: { 'Access-Control-Allow-Origin': '*' },
|
||||
static: {
|
||||
publicPath: '/',
|
||||
},
|
||||
historyApiFallback: {
|
||||
verbose: true,
|
||||
},
|
||||
setupMiddlewares(middlewares) {
|
||||
return middlewares;
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default merge(baseConfig, configuration);
|
||||
@@ -1,138 +0,0 @@
|
||||
/**
|
||||
* Build config for electron renderer process
|
||||
*/
|
||||
|
||||
import path from 'path';
|
||||
|
||||
import CssMinimizerPlugin from 'css-minimizer-webpack-plugin';
|
||||
import HtmlWebpackPlugin from 'html-webpack-plugin';
|
||||
import MiniCssExtractPlugin from 'mini-css-extract-plugin';
|
||||
import TerserPlugin from 'terser-webpack-plugin';
|
||||
import webpack from 'webpack';
|
||||
import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer';
|
||||
import { merge } from 'webpack-merge';
|
||||
|
||||
import checkNodeEnv from '../scripts/check-node-env';
|
||||
import deleteSourceMaps from '../scripts/delete-source-maps';
|
||||
import baseConfig from './webpack.config.base';
|
||||
import webpackPaths from './webpack.paths';
|
||||
|
||||
checkNodeEnv('production');
|
||||
deleteSourceMaps();
|
||||
|
||||
const devtoolsConfig =
|
||||
process.env.DEBUG_PROD === 'true'
|
||||
? {
|
||||
devtool: 'source-map',
|
||||
}
|
||||
: {};
|
||||
|
||||
const configuration: webpack.Configuration = {
|
||||
...devtoolsConfig,
|
||||
|
||||
mode: 'production',
|
||||
|
||||
target: ['web'],
|
||||
|
||||
entry: [path.join(webpackPaths.srcRendererPath, 'index.tsx')],
|
||||
|
||||
output: {
|
||||
path: webpackPaths.distWebPath,
|
||||
publicPath: 'auto',
|
||||
filename: 'renderer.js',
|
||||
library: {
|
||||
type: 'umd',
|
||||
},
|
||||
},
|
||||
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: /\.s?(a|c)ss$/,
|
||||
use: [
|
||||
MiniCssExtractPlugin.loader,
|
||||
{
|
||||
loader: 'css-loader',
|
||||
options: {
|
||||
modules: {
|
||||
localIdentName: '[name]__[local]--[hash:base64:5]',
|
||||
exportLocalsConvention: 'camelCaseOnly',
|
||||
},
|
||||
sourceMap: true,
|
||||
importLoaders: 1,
|
||||
},
|
||||
},
|
||||
'sass-loader',
|
||||
],
|
||||
include: /\.module\.s?(c|a)ss$/,
|
||||
},
|
||||
{
|
||||
test: /\.s?(a|c)ss$/,
|
||||
use: [MiniCssExtractPlugin.loader, 'css-loader', 'sass-loader'],
|
||||
exclude: /\.module\.s?(c|a)ss$/,
|
||||
},
|
||||
// Fonts
|
||||
{
|
||||
test: /\.(woff|woff2|eot|ttf|otf)$/i,
|
||||
type: 'asset/resource',
|
||||
},
|
||||
// Images
|
||||
{
|
||||
test: /\.(png|svg|jpg|jpeg|gif)$/i,
|
||||
type: 'asset/resource',
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
optimization: {
|
||||
minimize: true,
|
||||
minimizer: [
|
||||
new TerserPlugin({
|
||||
parallel: true,
|
||||
}),
|
||||
new CssMinimizerPlugin(),
|
||||
],
|
||||
},
|
||||
|
||||
plugins: [
|
||||
/**
|
||||
* Create global constants which can be configured at compile time.
|
||||
*
|
||||
* Useful for allowing different behaviour between development builds and
|
||||
* release builds
|
||||
*
|
||||
* NODE_ENV should be production so that modules do not perform certain
|
||||
* development checks
|
||||
*/
|
||||
new webpack.EnvironmentPlugin({
|
||||
NODE_ENV: 'production',
|
||||
DEBUG_PROD: false,
|
||||
}),
|
||||
|
||||
new MiniCssExtractPlugin({
|
||||
filename: 'style.css',
|
||||
}),
|
||||
|
||||
new BundleAnalyzerPlugin({
|
||||
analyzerMode: process.env.ANALYZE === 'true' ? 'server' : 'disabled',
|
||||
}),
|
||||
|
||||
new HtmlWebpackPlugin({
|
||||
filename: 'index.html',
|
||||
template: path.join(webpackPaths.srcRendererPath, 'index.ejs'),
|
||||
favicon: path.join(webpackPaths.assetsPath, 'icons', 'favicon.ico'),
|
||||
minify: {
|
||||
collapseWhitespace: true,
|
||||
removeAttributeQuotes: true,
|
||||
removeComments: true,
|
||||
},
|
||||
isBrowser: false,
|
||||
isDevelopment: process.env.NODE_ENV !== 'production',
|
||||
templateParameters: {
|
||||
web: true,
|
||||
},
|
||||
}),
|
||||
],
|
||||
};
|
||||
|
||||
export default merge(baseConfig, configuration);
|
||||
@@ -1,46 +0,0 @@
|
||||
const path = require('path');
|
||||
|
||||
const rootPath = path.join(__dirname, '../..');
|
||||
|
||||
const dllPath = path.join(__dirname, '../dll');
|
||||
|
||||
const srcPath = path.join(rootPath, 'src');
|
||||
const assetsPath = path.join(rootPath, 'assets');
|
||||
const srcMainPath = path.join(srcPath, 'main');
|
||||
const srcRemotePath = path.join(srcPath, 'remote');
|
||||
const srcRendererPath = path.join(srcPath, 'renderer');
|
||||
|
||||
const releasePath = path.join(rootPath, 'release');
|
||||
const appPath = path.join(releasePath, 'app');
|
||||
const appPackagePath = path.join(appPath, 'package.json');
|
||||
const appNodeModulesPath = path.join(appPath, 'node_modules');
|
||||
const srcNodeModulesPath = path.join(srcPath, 'node_modules');
|
||||
|
||||
const distPath = path.join(appPath, 'dist');
|
||||
const distMainPath = path.join(distPath, 'main');
|
||||
const distRemotePath = path.join(distPath, 'remote');
|
||||
const distRendererPath = path.join(distPath, 'renderer');
|
||||
const distWebPath = path.join(distPath, 'web');
|
||||
|
||||
const buildPath = path.join(releasePath, 'build');
|
||||
|
||||
export default {
|
||||
assetsPath,
|
||||
rootPath,
|
||||
dllPath,
|
||||
srcPath,
|
||||
srcMainPath,
|
||||
srcRemotePath,
|
||||
srcRendererPath,
|
||||
releasePath,
|
||||
appPath,
|
||||
appPackagePath,
|
||||
appNodeModulesPath,
|
||||
srcNodeModulesPath,
|
||||
distPath,
|
||||
distMainPath,
|
||||
distRemotePath,
|
||||
distRendererPath,
|
||||
distWebPath,
|
||||
buildPath,
|
||||
};
|
||||
@@ -1 +0,0 @@
|
||||
export default 'test-file-stub';
|
||||
@@ -1,8 +0,0 @@
|
||||
{
|
||||
"rules": {
|
||||
"no-console": "off",
|
||||
"global-require": "off",
|
||||
"import/no-dynamic-require": "off",
|
||||
"import/no-extraneous-dependencies": "off"
|
||||
}
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
// Check if the renderer and main bundles are built
|
||||
import path from 'path';
|
||||
import chalk from 'chalk';
|
||||
import fs from 'fs';
|
||||
import webpackPaths from '../configs/webpack.paths';
|
||||
|
||||
const mainPath = path.join(webpackPaths.distMainPath, 'main.js');
|
||||
const remotePath = path.join(webpackPaths.distMainPath, 'remote.js');
|
||||
const rendererPath = path.join(webpackPaths.distRendererPath, 'renderer.js');
|
||||
|
||||
if (!fs.existsSync(mainPath)) {
|
||||
throw new Error(
|
||||
chalk.whiteBright.bgRed.bold(
|
||||
'The main process is not built yet. Build it by running "npm run build:main"',
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
if (!fs.existsSync(remotePath)) {
|
||||
throw new Error(
|
||||
chalk.whiteBright.bgRed.bold(
|
||||
'The remote process is not built yet. Build it by running "npm run build:remote"',
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
if (!fs.existsSync(rendererPath)) {
|
||||
throw new Error(
|
||||
chalk.whiteBright.bgRed.bold(
|
||||
'The renderer process is not built yet. Build it by running "npm run build:renderer"',
|
||||
),
|
||||
);
|
||||
}
|
||||
@@ -1,54 +0,0 @@
|
||||
import fs from 'fs';
|
||||
import chalk from 'chalk';
|
||||
import { execSync } from 'child_process';
|
||||
import { dependencies } from '../../package.json';
|
||||
|
||||
if (dependencies) {
|
||||
const dependenciesKeys = Object.keys(dependencies);
|
||||
const nativeDeps = fs
|
||||
.readdirSync('node_modules')
|
||||
.filter((folder) => fs.existsSync(`node_modules/${folder}/binding.gyp`));
|
||||
if (nativeDeps.length === 0) {
|
||||
process.exit(0);
|
||||
}
|
||||
try {
|
||||
// Find the reason for why the dependency is installed. If it is installed
|
||||
// because of a devDependency then that is okay. Warn when it is installed
|
||||
// because of a dependency
|
||||
const { dependencies: dependenciesObject } = JSON.parse(
|
||||
execSync(`npm ls ${nativeDeps.join(' ')} --json`).toString()
|
||||
);
|
||||
const rootDependencies = Object.keys(dependenciesObject);
|
||||
const filteredRootDependencies = rootDependencies.filter((rootDependency) =>
|
||||
dependenciesKeys.includes(rootDependency)
|
||||
);
|
||||
if (filteredRootDependencies.length > 0) {
|
||||
const plural = filteredRootDependencies.length > 1;
|
||||
console.log(`
|
||||
${chalk.whiteBright.bgYellow.bold(
|
||||
'Webpack does not work with native dependencies.'
|
||||
)}
|
||||
${chalk.bold(filteredRootDependencies.join(', '))} ${
|
||||
plural ? 'are native dependencies' : 'is a native dependency'
|
||||
} and should be installed inside of the "./release/app" folder.
|
||||
First, uninstall the packages from "./package.json":
|
||||
${chalk.whiteBright.bgGreen.bold('npm uninstall your-package')}
|
||||
${chalk.bold(
|
||||
'Then, instead of installing the package to the root "./package.json":'
|
||||
)}
|
||||
${chalk.whiteBright.bgRed.bold('npm install your-package')}
|
||||
${chalk.bold('Install the package to "./release/app/package.json"')}
|
||||
${chalk.whiteBright.bgGreen.bold(
|
||||
'cd ./release/app && npm install your-package'
|
||||
)}
|
||||
Read more about native dependencies at:
|
||||
${chalk.bold(
|
||||
'https://electron-react-boilerplate.js.org/docs/adding-dependencies/#module-structure'
|
||||
)}
|
||||
`);
|
||||
process.exit(1);
|
||||
}
|
||||
} catch (e) {
|
||||
console.log('Native dependencies could not be checked');
|
||||
}
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
import chalk from 'chalk';
|
||||
|
||||
export default function checkNodeEnv(expectedEnv) {
|
||||
if (!expectedEnv) {
|
||||
throw new Error('"expectedEnv" not set');
|
||||
}
|
||||
|
||||
if (process.env.NODE_ENV !== expectedEnv) {
|
||||
console.log(
|
||||
chalk.whiteBright.bgRed.bold(
|
||||
`"process.env.NODE_ENV" must be "${expectedEnv}" to use this webpack config`
|
||||
)
|
||||
);
|
||||
process.exit(2);
|
||||
}
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
import chalk from 'chalk';
|
||||
import detectPort from 'detect-port';
|
||||
|
||||
const port = process.env.PORT || '4343';
|
||||
|
||||
detectPort(port, (err, availablePort) => {
|
||||
if (port !== String(availablePort)) {
|
||||
throw new Error(
|
||||
chalk.whiteBright.bgRed.bold(
|
||||
`Port "${port}" on "localhost" is already in use. Please use another port. ex: PORT=4343 npm start`
|
||||
)
|
||||
);
|
||||
} else {
|
||||
process.exit(0);
|
||||
}
|
||||
});
|
||||
@@ -1,17 +0,0 @@
|
||||
import rimraf from 'rimraf';
|
||||
import process from 'process';
|
||||
import webpackPaths from '../configs/webpack.paths';
|
||||
|
||||
const args = process.argv.slice(2);
|
||||
const commandMap = {
|
||||
dist: webpackPaths.distPath,
|
||||
release: webpackPaths.releasePath,
|
||||
dll: webpackPaths.dllPath,
|
||||
};
|
||||
|
||||
args.forEach((x) => {
|
||||
const pathToRemove = commandMap[x];
|
||||
if (pathToRemove !== undefined) {
|
||||
rimraf.sync(pathToRemove);
|
||||
}
|
||||
});
|
||||
@@ -1,9 +0,0 @@
|
||||
import path from 'path';
|
||||
import rimraf from 'rimraf';
|
||||
import webpackPaths from '../configs/webpack.paths';
|
||||
|
||||
export default function deleteSourceMaps() {
|
||||
rimraf.sync(path.join(webpackPaths.distMainPath, '*.js.map'));
|
||||
rimraf.sync(path.join(webpackPaths.distRemotePath, '*.js.map'));
|
||||
rimraf.sync(path.join(webpackPaths.distRendererPath, '*.js.map'));
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
import { execSync } from 'child_process';
|
||||
import fs from 'fs';
|
||||
import { dependencies } from '../../release/app/package.json';
|
||||
import webpackPaths from '../configs/webpack.paths';
|
||||
|
||||
if (
|
||||
Object.keys(dependencies || {}).length > 0 &&
|
||||
fs.existsSync(webpackPaths.appNodeModulesPath)
|
||||
) {
|
||||
const electronRebuildCmd =
|
||||
'../../node_modules/.bin/electron-rebuild --force --types prod,dev,optional --module-dir .';
|
||||
const cmd =
|
||||
process.platform === 'win32'
|
||||
? electronRebuildCmd.replace(/\//g, '\\')
|
||||
: electronRebuildCmd;
|
||||
execSync(cmd, {
|
||||
cwd: webpackPaths.appPath,
|
||||
stdio: 'inherit',
|
||||
});
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
import fs from 'fs';
|
||||
import webpackPaths from '../configs/webpack.paths';
|
||||
|
||||
const { srcNodeModulesPath } = webpackPaths;
|
||||
const { appNodeModulesPath } = webpackPaths;
|
||||
|
||||
if (!fs.existsSync(srcNodeModulesPath) && fs.existsSync(appNodeModulesPath)) {
|
||||
fs.symlinkSync(appNodeModulesPath, srcNodeModulesPath, 'junction');
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
const { notarize } = require('electron-notarize');
|
||||
const { build } = require('../../package.json');
|
||||
|
||||
exports.default = async function notarizeMacos(context) {
|
||||
const { electronPlatformName, appOutDir } = context;
|
||||
if (electronPlatformName !== 'darwin') {
|
||||
return;
|
||||
}
|
||||
|
||||
if (process.env.CI !== 'true') {
|
||||
console.warn('Skipping notarizing step. Packaging is not running in CI');
|
||||
return;
|
||||
}
|
||||
|
||||
if (!('APPLE_ID' in process.env && 'APPLE_ID_PASS' in process.env)) {
|
||||
console.warn(
|
||||
'Skipping notarizing step. APPLE_ID and APPLE_ID_PASS env variables must be set'
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
const appName = context.packager.appInfo.productFilename;
|
||||
|
||||
await notarize({
|
||||
appBundleId: build.appId,
|
||||
appPath: `${appOutDir}/${appName}.app`,
|
||||
appleId: process.env.APPLE_ID,
|
||||
appleIdPassword: process.env.APPLE_ID_PASS,
|
||||
});
|
||||
};
|
||||
@@ -1,34 +0,0 @@
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
|
||||
# Runtime data
|
||||
pids
|
||||
*.pid
|
||||
*.seed
|
||||
|
||||
# Coverage directory used by tools like istanbul
|
||||
coverage
|
||||
.eslintcache
|
||||
|
||||
# Dependency directory
|
||||
# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
|
||||
node_modules
|
||||
|
||||
# OSX
|
||||
.DS_Store
|
||||
|
||||
src/i18n
|
||||
release/app/dist
|
||||
release/build
|
||||
.erb/dll
|
||||
|
||||
.idea
|
||||
npm-debug.log.*
|
||||
*.css.d.ts
|
||||
*.sass.d.ts
|
||||
*.scss.d.ts
|
||||
|
||||
# eslint ignores hidden directories by default:
|
||||
# https://github.com/eslint/eslint/issues/8429
|
||||
!.erb
|
||||
@@ -1,97 +0,0 @@
|
||||
module.exports = {
|
||||
extends: ['erb', 'plugin:typescript-sort-keys/recommended'],
|
||||
ignorePatterns: ['.erb/*', 'server'],
|
||||
parser: '@typescript-eslint/parser',
|
||||
parserOptions: {
|
||||
createDefaultProgram: true,
|
||||
ecmaVersion: 12,
|
||||
parser: '@typescript-eslint/parser',
|
||||
project: './tsconfig.json',
|
||||
sourceType: 'module',
|
||||
tsconfigRootDir: './',
|
||||
},
|
||||
plugins: ['@typescript-eslint', 'import', 'sort-keys-fix'],
|
||||
rules: {
|
||||
'@typescript-eslint/naming-convention': 'off',
|
||||
'@typescript-eslint/no-explicit-any': 'off',
|
||||
'@typescript-eslint/no-non-null-assertion': 'off',
|
||||
'@typescript-eslint/no-shadow': ['off'],
|
||||
'@typescript-eslint/no-unused-vars': ['error'],
|
||||
'@typescript-eslint/no-use-before-define': ['error'],
|
||||
'default-case': 'off',
|
||||
'import/extensions': 'off',
|
||||
'import/no-absolute-path': 'off',
|
||||
// A temporary hack related to IDE not resolving correct package.json
|
||||
'import/no-extraneous-dependencies': 'off',
|
||||
'import/no-unresolved': 'error',
|
||||
'import/order': [
|
||||
'error',
|
||||
{
|
||||
alphabetize: {
|
||||
caseInsensitive: true,
|
||||
order: 'asc',
|
||||
},
|
||||
groups: ['builtin', 'external', 'internal', ['parent', 'sibling']],
|
||||
'newlines-between': 'never',
|
||||
pathGroups: [
|
||||
{
|
||||
group: 'external',
|
||||
pattern: 'react',
|
||||
position: 'before',
|
||||
},
|
||||
],
|
||||
pathGroupsExcludedImportTypes: ['react'],
|
||||
},
|
||||
],
|
||||
'import/prefer-default-export': 'off',
|
||||
'jsx-a11y/click-events-have-key-events': 'off',
|
||||
'jsx-a11y/interactive-supports-focus': 'off',
|
||||
'jsx-a11y/media-has-caption': 'off',
|
||||
'no-await-in-loop': 'off',
|
||||
'no-console': 'off',
|
||||
'no-nested-ternary': 'off',
|
||||
'no-restricted-syntax': 'off',
|
||||
'no-shadow': 'off',
|
||||
'no-underscore-dangle': 'off',
|
||||
'no-unused-vars': 'off',
|
||||
'no-use-before-define': 'off',
|
||||
'prefer-destructuring': 'off',
|
||||
'react/function-component-definition': 'off',
|
||||
'react/jsx-filename-extension': [2, { extensions: ['.js', '.jsx', '.ts', '.tsx'] }],
|
||||
'react/jsx-no-useless-fragment': 'off',
|
||||
'react/jsx-props-no-spreading': 'off',
|
||||
'react/jsx-sort-props': [
|
||||
'error',
|
||||
{
|
||||
callbacksLast: true,
|
||||
ignoreCase: false,
|
||||
noSortAlphabetically: false,
|
||||
reservedFirst: true,
|
||||
shorthandFirst: true,
|
||||
shorthandLast: false,
|
||||
},
|
||||
],
|
||||
'react/no-array-index-key': 'off',
|
||||
'react/react-in-jsx-scope': 'off',
|
||||
'react/require-default-props': 'off',
|
||||
'sort-keys-fix/sort-keys-fix': 'warn',
|
||||
},
|
||||
settings: {
|
||||
'import/parsers': {
|
||||
'@typescript-eslint/parser': ['.ts', '.tsx'],
|
||||
},
|
||||
'import/resolver': {
|
||||
// See https://github.com/benmosher/eslint-plugin-import/issues/1396#issuecomment-575727774 for line below
|
||||
node: {
|
||||
extensions: ['.js', '.jsx', '.ts', '.tsx'],
|
||||
},
|
||||
typescript: {
|
||||
alwaysTryTypes: true,
|
||||
project: './tsconfig.json',
|
||||
},
|
||||
webpack: {
|
||||
config: require.resolve('./.erb/configs/webpack.config.eslint.ts'),
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,33 @@
|
||||
name: Feature request
|
||||
description: Request a feature to be added to Feishin
|
||||
title: '[Feature]: '
|
||||
labels: ['enhancement']
|
||||
body:
|
||||
- type: checkboxes
|
||||
id: check-duplicate
|
||||
attributes:
|
||||
label: I have already checked through the existing feature requests and found no duplicates
|
||||
options:
|
||||
- label: 'Yes'
|
||||
required: true
|
||||
|
||||
- type: dropdown
|
||||
id: server-specific
|
||||
attributes:
|
||||
label: Is this a server-specific feature?
|
||||
options:
|
||||
- Not server-specific
|
||||
- OpenSubsonic
|
||||
- Jellyfin
|
||||
- Navidrome
|
||||
default: 0
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: solution
|
||||
attributes:
|
||||
label: What do you want to be added?
|
||||
placeholder: I would like to see [...]
|
||||
validations:
|
||||
required: true
|
||||
@@ -0,0 +1,74 @@
|
||||
name: Bug report
|
||||
description: You're having technical issues.
|
||||
title: '[Bug]: '
|
||||
labels: ['bug']
|
||||
body:
|
||||
- type: checkboxes
|
||||
id: check-duplicate
|
||||
attributes:
|
||||
label: I have already checked through the existing bug reports and found no duplicates
|
||||
options:
|
||||
- label: 'Yes'
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
id: version
|
||||
attributes:
|
||||
label: App Version
|
||||
description: What version of the app are you running?
|
||||
placeholder: ex. 1.0.0
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
id: server-version
|
||||
attributes:
|
||||
label: Music Server and Version
|
||||
description: What music server are you using?
|
||||
placeholder: ex. Navidrome v0.55.0, LMS v3.67.0, Jellyfin v10.10.7, etc.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: dropdown
|
||||
id: environments
|
||||
attributes:
|
||||
label: What local environments are you seeing the problem on?
|
||||
multiple: true
|
||||
options:
|
||||
- Desktop Windows
|
||||
- Desktop macOS
|
||||
- Desktop Linux
|
||||
- Web Firefox
|
||||
- Web Chrome
|
||||
- Web Safari
|
||||
- Web Microsoft Edge
|
||||
- Other (please specify in the next field)
|
||||
|
||||
- type: textarea
|
||||
id: what-happened
|
||||
attributes:
|
||||
label: What happened?
|
||||
description: Also tell us, what did you expect to happen?
|
||||
placeholder: Include screenshots and error logs if possible. The browser devtools can be opened using CTRL + SHIFT + I (Windows/Linux) or CMD + SHIFT + I (macOS).
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: reproduction
|
||||
attributes:
|
||||
label: Steps to reproduce
|
||||
description: How can we reproduce this issue? Are there any specific settings that are enabled that could be the cause?
|
||||
placeholder: |
|
||||
1. Go to '...'
|
||||
2. Click on '....'
|
||||
3. Scroll down to '....'
|
||||
4. See error
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: logs
|
||||
attributes:
|
||||
label: Relevant log output
|
||||
description: Please copy and paste any relevant log output. This will be automatically formatted into code.
|
||||
render: shell
|
||||
@@ -1,45 +0,0 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: You're having technical issues. 🐞
|
||||
labels: 'bug'
|
||||
---
|
||||
|
||||
## Expected Behavior
|
||||
|
||||
<!--- What should have happened? -->
|
||||
|
||||
## Current Behavior
|
||||
|
||||
<!--- What went wrong? -->
|
||||
<!-- Add screenshots to help explain your problem -->
|
||||
<!-- (Open the browser dev tools in the menu or using CTRL + SHIFT + I) -->
|
||||
|
||||
## Steps to Reproduce
|
||||
|
||||
<!-- Add relevant code and/or a live example -->
|
||||
<!-- Add stack traces -->
|
||||
|
||||
1.
|
||||
|
||||
2.
|
||||
|
||||
3.
|
||||
|
||||
4.
|
||||
|
||||
## Possible Solution (Not obligatory)
|
||||
|
||||
<!--- Suggest a reason for the bug or how to fix it. -->
|
||||
|
||||
## Context
|
||||
|
||||
<!--- How has this issue affected you? What are you trying to accomplish? -->
|
||||
|
||||
## Your Environment
|
||||
|
||||
<!--- Include as many relevant details about the environment you experienced the bug in -->
|
||||
|
||||
- Application version (e.g. v0.1.0) :
|
||||
- Operating System and version (e.g. Windows 10) :
|
||||
- Server and version (e.g. Navidrome v0.48.0) :
|
||||
- Node version (if developing locally) :
|
||||
@@ -1,9 +0,0 @@
|
||||
---
|
||||
name: Question
|
||||
about: Ask a question.❓
|
||||
labels: 'question'
|
||||
---
|
||||
|
||||
<!-- Question issues will be closed. -->
|
||||
<!-- Ask questions in the discussions tab: Please use discussions https://github.com/jeffvli/feishin/discussions -->
|
||||
<!-- Or join the Discord/Matrix servers: https://discord.gg/FVKpcMDy5f https://matrix.to/#/#sonixd:matrix.org -->
|
||||
@@ -1,11 +0,0 @@
|
||||
---
|
||||
name: Feature request
|
||||
about: Request a feature to be added to Feishin 🎉
|
||||
labels: 'enhancement'
|
||||
---
|
||||
|
||||
## What do you want to be added?
|
||||
|
||||
## Additional context
|
||||
|
||||
<!-- Is this a server-specific feature? (e.g. Jellyfin only). -->
|
||||
@@ -0,0 +1,11 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: Questions or help
|
||||
url: https://github.com/jeffvli/feishin/discussions
|
||||
about: Ask questions or get help in the discussions section
|
||||
- name: Discord Community
|
||||
url: https://discord.gg/FVKpcMDy5f
|
||||
about: The discord/matrix servers are bridged so you can join whichever you prefer
|
||||
- name: Matrix Community
|
||||
url: https://matrix.to/#/#sonixd:matrix.org
|
||||
about: The discord/matrix servers are bridged so you can join whichever you prefer
|
||||
@@ -0,0 +1,332 @@
|
||||
name: Publish Beta (Manual)
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
version:
|
||||
description: 'Semantic version number (e.g., 1.0.0) - beta suffix will be added automatically'
|
||||
required: false
|
||||
type: string
|
||||
|
||||
jobs:
|
||||
prepare:
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
version: ${{ steps.version.outputs.version }}
|
||||
steps:
|
||||
- name: Checkout git repo
|
||||
uses: actions/checkout@v1
|
||||
|
||||
- name: Install Node and PNPM
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
with:
|
||||
version: 9
|
||||
|
||||
- name: Install dependencies
|
||||
run: pnpm install
|
||||
|
||||
- name: Validate and set version with beta suffix
|
||||
id: version
|
||||
shell: pwsh
|
||||
run: |
|
||||
$inputVersion = "${{ github.event.inputs.version }}"
|
||||
Write-Host "Input version: $inputVersion"
|
||||
|
||||
if ($inputVersion -eq "" -or $inputVersion -eq "null") {
|
||||
# No input version provided, auto-increment patch version
|
||||
Write-Host "No version provided, auto-incrementing patch version..."
|
||||
|
||||
# Get current version from package.json
|
||||
$currentVersion = (Get-Content package.json | ConvertFrom-Json).version
|
||||
Write-Host "Current version: $currentVersion"
|
||||
|
||||
# Remove any existing suffix (like -beta) to get clean semantic version
|
||||
$cleanVersion = $currentVersion -replace '-.*$', ''
|
||||
|
||||
# Extract major, minor, patch components
|
||||
$versionParts = $cleanVersion.Split('.')
|
||||
if ($versionParts.Length -ne 3) {
|
||||
Write-Error "Current version format is invalid: $cleanVersion"
|
||||
exit 1
|
||||
}
|
||||
|
||||
$major = [int]$versionParts[0]
|
||||
$minor = [int]$versionParts[1]
|
||||
$patch = [int]$versionParts[2]
|
||||
|
||||
# Increment patch version
|
||||
$newPatch = $patch + 1
|
||||
$inputVersion = "$major.$minor.$newPatch"
|
||||
Write-Host "Auto-generated version: $inputVersion"
|
||||
} else {
|
||||
# Validate semantic version format (major.minor.patch)
|
||||
$versionPattern = '^\d+\.\d+\.\d+$'
|
||||
if ($inputVersion -notmatch $versionPattern) {
|
||||
Write-Error "Invalid version format. Expected semantic version (e.g., 1.0.0), got: $inputVersion"
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
|
||||
# Add beta suffix
|
||||
$versionWithBeta = "$inputVersion-beta"
|
||||
Write-Host "Setting version to: $versionWithBeta"
|
||||
|
||||
# Update package.json
|
||||
$packageJson = Get-Content package.json | ConvertFrom-Json
|
||||
$packageJson.version = $versionWithBeta
|
||||
$packageJson | ConvertTo-Json -Depth 10 | Set-Content package.json
|
||||
|
||||
Write-Host "Updated package.json version to: $versionWithBeta"
|
||||
|
||||
# Set output for other jobs
|
||||
echo "version=$versionWithBeta" >> $env:GITHUB_OUTPUT
|
||||
|
||||
- name: Delete existing releases and tags
|
||||
shell: pwsh
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
# Get the version that was set in the previous step
|
||||
$versionWithBeta = "${{ steps.version.outputs.version }}"
|
||||
Write-Host "Checking for existing releases with tag: $versionWithBeta"
|
||||
|
||||
# Find and delete any releases with isPrerelease "true"
|
||||
Write-Host "Deleting existing prereleases..."
|
||||
Write-Host "Searching for releases with isPrerelease 'true'..."
|
||||
|
||||
$betaReleases = gh release list --limit 100 --json tagName,isPrerelease,name | ConvertFrom-Json | Where-Object { $_.isPrerelease -eq $true }
|
||||
|
||||
if ($betaReleases) {
|
||||
Write-Host "Found $($betaReleases.Count) release(s) with isPrerelease 'true':"
|
||||
foreach ($release in $betaReleases) {
|
||||
Write-Host " - Tag: $($release.tagName), Title: $($release.name)"
|
||||
gh release delete $release.tagName --yes --cleanup-tag
|
||||
Write-Host " Deleted release with tag: $($release.tagName)"
|
||||
}
|
||||
} else {
|
||||
Write-Host "No releases found with isPrerelease 'true'"
|
||||
}
|
||||
|
||||
publish:
|
||||
needs: prepare
|
||||
runs-on: ${{ matrix.os }}
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
os: [windows-latest, macos-latest, ubuntu-latest]
|
||||
|
||||
steps:
|
||||
- name: Checkout git repo
|
||||
uses: actions/checkout@v1
|
||||
|
||||
- name: Install Node and PNPM
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
with:
|
||||
version: 9
|
||||
|
||||
- name: Install dependencies
|
||||
run: pnpm install
|
||||
|
||||
- name: Set version from prepare job
|
||||
shell: pwsh
|
||||
run: |
|
||||
$versionWithBeta = "${{ needs.prepare.outputs.version }}"
|
||||
Write-Host "Setting version from prepare job: $versionWithBeta"
|
||||
|
||||
# Update package.json with the version from prepare job
|
||||
$packageJson = Get-Content package.json | ConvertFrom-Json
|
||||
$packageJson.version = $versionWithBeta
|
||||
$packageJson | ConvertTo-Json -Depth 10 | Set-Content package.json
|
||||
|
||||
Write-Host "Updated package.json version to: $versionWithBeta"
|
||||
|
||||
- name: Build and Publish releases (Windows)
|
||||
if: matrix.os == 'windows-latest'
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
uses: nick-invision/retry@v2.8.2
|
||||
with:
|
||||
timeout_minutes: 30
|
||||
max_attempts: 3
|
||||
retry_on: error
|
||||
command: |
|
||||
pnpm run publish:win:beta
|
||||
on_retry_command: pnpm cache delete
|
||||
|
||||
- name: Build and Publish releases (macOS)
|
||||
if: matrix.os == 'macos-latest'
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
uses: nick-invision/retry@v2.8.2
|
||||
with:
|
||||
timeout_minutes: 30
|
||||
max_attempts: 3
|
||||
retry_on: error
|
||||
command: |
|
||||
pnpm run publish:mac:beta
|
||||
on_retry_command: pnpm cache delete
|
||||
|
||||
- name: Build and Publish releases (Linux)
|
||||
if: matrix.os == 'ubuntu-latest'
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
uses: nick-invision/retry@v2.8.2
|
||||
with:
|
||||
timeout_minutes: 30
|
||||
max_attempts: 3
|
||||
retry_on: error
|
||||
command: |
|
||||
pnpm run publish:linux:beta
|
||||
on_retry_command: pnpm cache delete
|
||||
|
||||
- name: Build and Publish releases (Linux ARM64)
|
||||
if: matrix.os == 'ubuntu-latest'
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
uses: nick-invision/retry@v2.8.2
|
||||
with:
|
||||
timeout_minutes: 30
|
||||
max_attempts: 3
|
||||
retry_on: error
|
||||
command: |
|
||||
pnpm run publish:linux-arm64:beta
|
||||
on_retry_command: pnpm cache delete
|
||||
|
||||
edit-release:
|
||||
needs: [prepare, publish]
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout git repo
|
||||
uses: actions/checkout@v1
|
||||
|
||||
- name: Edit release with commits and title
|
||||
shell: pwsh
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
# Get the version from the prepare job
|
||||
$versionWithBeta = "${{ needs.prepare.outputs.version }}"
|
||||
$tagVersion = "v" + $versionWithBeta
|
||||
Write-Host "Editing release for tag: $tagVersion"
|
||||
|
||||
# Check if release exists
|
||||
$releaseExists = gh release view $tagVersion 2>$null
|
||||
if ($LASTEXITCODE -eq 0) {
|
||||
Write-Host "Found release with tag $tagVersion"
|
||||
|
||||
# Get current release notes
|
||||
|
||||
# Find the latest non-prerelease tag
|
||||
Write-Host "Finding latest non-prerelease tag..."
|
||||
$latestNonPrerelease = gh release list --limit 100 --json tagName,isPrerelease | ConvertFrom-Json | Where-Object { $_.isPrerelease -eq $false -and $_.tagName -ne $tagVersion } | Select-Object -First 1
|
||||
|
||||
if ($latestNonPrerelease) {
|
||||
$latestTag = $latestNonPrerelease.tagName
|
||||
Write-Host "Latest non-prerelease tag: $latestTag"
|
||||
|
||||
# Get commits between latest non-prerelease and current HEAD
|
||||
Write-Host "Getting commits between $latestTag and HEAD..."
|
||||
|
||||
# Use proper git range syntax and handle PowerShell string interpolation
|
||||
$gitRange = "$latestTag..HEAD"
|
||||
Write-Host "Git range: $gitRange"
|
||||
|
||||
# Get commits using proper git command with datetime
|
||||
$commits = git log --oneline --pretty=format:"%ad|%s|%h" --date=short $gitRange
|
||||
|
||||
# Check if commits exist
|
||||
if ($commits -and $commits.Trim() -ne "") {
|
||||
Write-Host "Found commits:"
|
||||
Write-Host $commits
|
||||
|
||||
# Group commits by date
|
||||
$groupedCommits = @{}
|
||||
foreach ($line in $commits) {
|
||||
if ($line.Trim() -ne "") {
|
||||
$parts = $line.Split('|')
|
||||
$date = $parts[0]
|
||||
$message = $parts[1]
|
||||
$hash = $parts[2]
|
||||
|
||||
if (-not $groupedCommits.ContainsKey($date)) {
|
||||
$groupedCommits[$date] = @()
|
||||
}
|
||||
$groupedCommits[$date] += "- $message ($hash)"
|
||||
}
|
||||
}
|
||||
|
||||
# Build formatted release notes grouped by date
|
||||
$commitNotes = "## Changes since $latestTag`n`n"
|
||||
$sortedDates = $groupedCommits.Keys | Sort-Object -Descending
|
||||
foreach ($date in $sortedDates) {
|
||||
$commitNotes += "### $date`n"
|
||||
foreach ($commit in $groupedCommits[$date]) {
|
||||
$commitNotes += "$commit`n"
|
||||
}
|
||||
$commitNotes += "`n"
|
||||
}
|
||||
|
||||
$releaseNotes = $commitNotes
|
||||
} else {
|
||||
Write-Host "No commits found between $latestTag and HEAD"
|
||||
Write-Host "Trying alternative approach..."
|
||||
|
||||
# Alternative: get commits since the tag (not range) with datetime
|
||||
$commits = git log --oneline --pretty=format:"%ad|%s|%h" --date=short $latestTag.. --not $latestTag
|
||||
|
||||
if ($commits -and $commits.Trim() -ne "") {
|
||||
Write-Host "Found commits with alternative method:"
|
||||
Write-Host $commits
|
||||
|
||||
# Group commits by date
|
||||
$groupedCommits = @{}
|
||||
foreach ($line in $commits) {
|
||||
if ($line.Trim() -ne "") {
|
||||
$parts = $line.Split('|')
|
||||
$date = $parts[0]
|
||||
$message = $parts[1]
|
||||
$hash = $parts[2]
|
||||
|
||||
if (-not $groupedCommits.ContainsKey($date)) {
|
||||
$groupedCommits[$date] = @()
|
||||
}
|
||||
$groupedCommits[$date] += "- $message ($hash)"
|
||||
}
|
||||
}
|
||||
|
||||
# Build formatted release notes grouped by date
|
||||
$commitNotes = "## Changes since $latestTag`n`n"
|
||||
$sortedDates = $groupedCommits.Keys | Sort-Object -Descending
|
||||
foreach ($date in $sortedDates) {
|
||||
$commitNotes += "### $date`n"
|
||||
foreach ($commit in $groupedCommits[$date]) {
|
||||
$commitNotes += "$commit`n"
|
||||
}
|
||||
$commitNotes += "`n"
|
||||
}
|
||||
|
||||
$releaseNotes = $commitNotes
|
||||
} else {
|
||||
Write-Host "Still no commits found, using basic release notes"
|
||||
$releaseNotes = "## Beta Release`n`nThis is a beta release."
|
||||
}
|
||||
}
|
||||
} else {
|
||||
Write-Host "No non-prerelease tags found, using basic release notes"
|
||||
$releaseNotes = "## Beta Release`n`nThis is a beta release."
|
||||
}
|
||||
|
||||
# Update the release with new title and notes
|
||||
Write-Host "Updating release with title 'Beta' and new notes..."
|
||||
gh release edit $tagVersion --title "Beta" --notes "$releaseNotes"
|
||||
Write-Host "Successfully updated release title to 'Beta' and added commit notes"
|
||||
} else {
|
||||
Write-Host "No release found with tag $tagVersion"
|
||||
}
|
||||
- name: Set release as prerelease
|
||||
shell: pwsh
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
gh release edit $tagVersion --prerelease
|
||||
Write-Host "Successfully set release as prerelease"
|
||||
@@ -3,6 +3,7 @@ name: Publish Docker to GHCR
|
||||
permissions: write-all
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
tags:
|
||||
- 'v*.*.*'
|
||||
@@ -49,6 +50,6 @@ jobs:
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
platforms: |
|
||||
linux/amd64
|
||||
linux/arm/v7
|
||||
linux/arm64/v8
|
||||
linux/amd64
|
||||
linux/arm/v7
|
||||
linux/arm64/v8
|
||||
|
||||
@@ -24,11 +24,9 @@ jobs:
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Extract metadata (tags, labels) for Docker
|
||||
id: meta
|
||||
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||
tags: |
|
||||
type=raw,value=latest,enable={{is_default_branch}}
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3
|
||||
- name: Setup Docker buildx
|
||||
@@ -41,6 +39,6 @@ jobs:
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
platforms: |
|
||||
linux/amd64
|
||||
linux/arm/v7
|
||||
linux/arm64/v8
|
||||
linux/amd64
|
||||
linux/arm/v7
|
||||
linux/arm64/v8
|
||||
|
||||
@@ -14,17 +14,15 @@ jobs:
|
||||
- name: Checkout git repo
|
||||
uses: actions/checkout@v1
|
||||
|
||||
- name: Install Node and NPM
|
||||
uses: actions/setup-node@v1
|
||||
- name: Install Node and PNPM
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
with:
|
||||
node-version: 16
|
||||
cache: npm
|
||||
version: 9
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
npm install --legacy-peer-deps
|
||||
run: pnpm install
|
||||
|
||||
- name: Publish releases
|
||||
- name: Build and Publish releases
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
uses: nick-invision/retry@v2.8.2
|
||||
@@ -33,12 +31,10 @@ jobs:
|
||||
max_attempts: 3
|
||||
retry_on: error
|
||||
command: |
|
||||
npm run postinstall
|
||||
npm run build
|
||||
npm exec electron-builder -- --publish always --linux
|
||||
on_retry_command: npm cache clean --force
|
||||
pnpm run publish:linux
|
||||
on_retry_command: pnpm cache delete
|
||||
|
||||
- name: Publish releases (arm64)
|
||||
- name: Build and Publish releases (arm64)
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
uses: nick-invision/retry@v2.8.2
|
||||
@@ -47,7 +43,5 @@ jobs:
|
||||
max_attempts: 3
|
||||
retry_on: error
|
||||
command: |
|
||||
npm run postinstall
|
||||
npm run build
|
||||
npm exec electron-builder -- --publish always --arm64
|
||||
on_retry_command: npm cache clean --force
|
||||
pnpm run publish:linux-arm64
|
||||
on_retry_command: pnpm cache delete
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
name: Publish Windows and macOS (Manual)
|
||||
name: Publish macOS (Manual)
|
||||
|
||||
on: workflow_dispatch
|
||||
|
||||
@@ -14,17 +14,15 @@ jobs:
|
||||
- name: Checkout git repo
|
||||
uses: actions/checkout@v1
|
||||
|
||||
- name: Install Node and NPM
|
||||
uses: actions/setup-node@v1
|
||||
- name: Install Node and PNPM
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
with:
|
||||
node-version: 16
|
||||
cache: npm
|
||||
version: 9
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
npm install --legacy-peer-deps
|
||||
run: pnpm install
|
||||
|
||||
- name: Publish releases
|
||||
- name: Build and Publish releases
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
uses: nick-invision/retry@v2.8.2
|
||||
@@ -33,7 +31,5 @@ jobs:
|
||||
max_attempts: 3
|
||||
retry_on: error
|
||||
command: |
|
||||
npm run postinstall
|
||||
npm run build
|
||||
npm exec electron-builder -- --publish always --win --mac
|
||||
on_retry_command: npm cache clean --force
|
||||
pnpm run publish:mac
|
||||
on_retry_command: pnpm cache delete
|
||||
|
||||
@@ -11,50 +11,83 @@ jobs:
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
os: [macos-latest]
|
||||
os: [macos-latest, ubuntu-latest, windows-latest]
|
||||
|
||||
steps:
|
||||
- name: Checkout git repo
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Install Node and NPM
|
||||
uses: actions/setup-node@v3
|
||||
- name: Install Node and PNPM
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
with:
|
||||
node-version: 16
|
||||
cache: npm
|
||||
version: 9
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
npm install --legacy-peer-deps
|
||||
run: pnpm install
|
||||
|
||||
- name: Build releases
|
||||
- name: Build for Windows
|
||||
if: ${{ matrix.os == 'windows-latest' }}
|
||||
uses: nick-invision/retry@v2.8.2
|
||||
with:
|
||||
timeout_minutes: 30
|
||||
max_attempts: 3
|
||||
retry_on: error
|
||||
command: |
|
||||
npm run postinstall
|
||||
npm run build
|
||||
npm run package:pr
|
||||
on_retry_command: npm cache clean --force
|
||||
pnpm run package:win:pr
|
||||
|
||||
- uses: actions/upload-artifact@v3
|
||||
- name: Build for Linux
|
||||
if: ${{ matrix.os == 'ubuntu-latest' }}
|
||||
uses: nick-invision/retry@v2.8.2
|
||||
with:
|
||||
timeout_minutes: 30
|
||||
max_attempts: 3
|
||||
retry_on: error
|
||||
command: |
|
||||
pnpm run package:linux:pr
|
||||
|
||||
- name: Build for MacOS
|
||||
if: ${{ matrix.os == 'macos-latest' }}
|
||||
uses: nick-invision/retry@v2.8.2
|
||||
with:
|
||||
timeout_minutes: 30
|
||||
max_attempts: 3
|
||||
retry_on: error
|
||||
command: |
|
||||
pnpm run package:mac:pr
|
||||
|
||||
- name: Zip Windows Binaries
|
||||
if: ${{ matrix.os == 'windows-latest' }}
|
||||
shell: pwsh
|
||||
run: |
|
||||
Compress-Archive -Path "dist/*.exe" -DestinationPath "dist/windows-binaries.zip" -Force
|
||||
|
||||
- name: Zip Linux Binaries
|
||||
if: ${{ matrix.os == 'ubuntu-latest' }}
|
||||
run: |
|
||||
zip -r dist/linux-binaries.zip dist/*.{AppImage,deb,rpm}
|
||||
|
||||
- name: Zip MacOS Binaries
|
||||
if: ${{ matrix.os == 'macos-latest' }}
|
||||
run: |
|
||||
zip -r dist/macos-binaries.zip dist/*.dmg
|
||||
|
||||
- name: Upload Windows Binaries
|
||||
if: ${{ matrix.os == 'windows-latest' }}
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: windows-binaries
|
||||
path: |
|
||||
release/build/*.exe
|
||||
path: dist/windows-binaries.zip
|
||||
|
||||
- uses: actions/upload-artifact@v3
|
||||
- name: Upload Linux Binaries
|
||||
if: ${{ matrix.os == 'ubuntu-latest' }}
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: linux-binaries
|
||||
path: |
|
||||
release/build/*.AppImage
|
||||
release/build/*.deb
|
||||
release/build/*.rpm
|
||||
path: dist/linux-binaries.zip
|
||||
|
||||
- uses: actions/upload-artifact@v3
|
||||
- name: Upload MacOS Binaries
|
||||
if: ${{ matrix.os == 'macos-latest' }}
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: macos-binaries
|
||||
path: |
|
||||
release/build/*.dmg
|
||||
path: dist/macos-binaries.zip
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
name: Publish Windows (Manual)
|
||||
|
||||
on: workflow_dispatch
|
||||
|
||||
jobs:
|
||||
publish:
|
||||
runs-on: ${{ matrix.os }}
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
os: [windows-latest]
|
||||
|
||||
steps:
|
||||
- name: Checkout git repo
|
||||
uses: actions/checkout@v1
|
||||
|
||||
- name: Install Node and PNPM
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
with:
|
||||
version: 9
|
||||
|
||||
- name: Install dependencies
|
||||
run: pnpm install
|
||||
|
||||
- name: Build and Publish releases
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
uses: nick-invision/retry@v2.8.2
|
||||
with:
|
||||
timeout_minutes: 30
|
||||
max_attempts: 3
|
||||
retry_on: error
|
||||
command: |
|
||||
pnpm run publish:win
|
||||
on_retry_command: pnpm cache delete
|
||||
@@ -0,0 +1,47 @@
|
||||
name: 'Close stale issues and PRs'
|
||||
on:
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
- cron: '30 1 * * *'
|
||||
permissions:
|
||||
contents: read
|
||||
jobs:
|
||||
stale:
|
||||
permissions:
|
||||
issues: write
|
||||
pull-requests: write
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: dessant/lock-threads@v5
|
||||
with:
|
||||
process-only: 'issues, prs'
|
||||
issue-inactive-days: 120
|
||||
pr-inactive-days: 120
|
||||
log-output: true
|
||||
add-issue-labels: 'frozen-due-to-age'
|
||||
add-pr-labels: 'frozen-due-to-age'
|
||||
- uses: actions/stale@v9
|
||||
with:
|
||||
operations-per-run: 999
|
||||
days-before-issue-stale: 180
|
||||
days-before-pr-stale: 180
|
||||
days-before-issue-close: 30
|
||||
days-before-pr-close: 30
|
||||
stale-issue-message: >
|
||||
This issue has been automatically marked as stale because it has not had recent activity. The resources of the Feishin team are limited, and so we are asking for your help.
|
||||
|
||||
If this is a **bug** and you can still reproduce this error on the <code>development</code> branch, please reply with all of the information you have about it in order to keep the issue open.
|
||||
|
||||
This issue will automatically be closed in the near future if no further activity occurs. Thank you for all your contributions.
|
||||
|
||||
|
||||
stale-pr-message: >
|
||||
This PR has been automatically marked as stale because it has not had recent activity. The resources of the Feishin team are limited, and so we are asking for your help.
|
||||
|
||||
This PR will automatically be closed in the near future if no further activity occurs. Thank you for all your contributions.
|
||||
|
||||
|
||||
stale-issue-label: 'stale'
|
||||
exempt-issue-labels: 'keep,security'
|
||||
stale-pr-label: 'stale'
|
||||
exempt-pr-labels: 'keep,security'
|
||||
@@ -3,7 +3,7 @@ name: Test
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
release:
|
||||
lint:
|
||||
runs-on: ${{ matrix.os }}
|
||||
|
||||
strategy:
|
||||
@@ -14,21 +14,13 @@ jobs:
|
||||
- name: Check out Git repository
|
||||
uses: actions/checkout@v1
|
||||
|
||||
- name: Install Node.js and NPM
|
||||
uses: actions/setup-node@v2
|
||||
- name: Install Node.js and PNPM
|
||||
uses: pnpm/action-setup@v4.1.0
|
||||
with:
|
||||
node-version: 16
|
||||
cache: npm
|
||||
version: 9
|
||||
|
||||
- name: npm install
|
||||
run: |
|
||||
npm install --legacy-peer-deps
|
||||
- name: Install dependencies
|
||||
run: pnpm install
|
||||
|
||||
- name: npm test
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
npm run lint
|
||||
npm run package
|
||||
npm exec tsc
|
||||
npm test
|
||||
- name: Lint Files
|
||||
run: pnpm run lint
|
||||
|
||||
+5
-29
@@ -1,31 +1,7 @@
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
|
||||
# Runtime data
|
||||
pids
|
||||
*.pid
|
||||
*.seed
|
||||
|
||||
# Coverage directory used by tools like istanbul
|
||||
coverage
|
||||
.eslintcache
|
||||
|
||||
# Dependency directory
|
||||
# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
|
||||
node_modules
|
||||
|
||||
# OSX
|
||||
dist
|
||||
out
|
||||
.DS_Store
|
||||
|
||||
release/app/dist
|
||||
release/build
|
||||
.erb/dll
|
||||
|
||||
.idea
|
||||
npm-debug.log.*
|
||||
*.css.d.ts
|
||||
*.sass.d.ts
|
||||
*.scss.d.ts
|
||||
|
||||
.env*
|
||||
.eslintcache
|
||||
*.log*
|
||||
release
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
#!/bin/sh
|
||||
. "$(dirname "$0")/_/husky.sh"
|
||||
|
||||
npx lint-staged
|
||||
@@ -0,0 +1,6 @@
|
||||
out
|
||||
dist
|
||||
pnpm-lock.yaml
|
||||
LICENSE.md
|
||||
tsconfig.json
|
||||
tsconfig.*.json
|
||||
-22
@@ -1,22 +0,0 @@
|
||||
{
|
||||
"printWidth": 100,
|
||||
"semi": true,
|
||||
"singleQuote": true,
|
||||
"tabWidth": 4,
|
||||
"useTabs": false,
|
||||
"overrides": [
|
||||
{
|
||||
"files": ["**/*.css", "**/*.scss", "**/*.html"],
|
||||
"options": {
|
||||
"singleQuote": true
|
||||
}
|
||||
}
|
||||
],
|
||||
"trailingComma": "all",
|
||||
"bracketSpacing": true,
|
||||
"arrowParens": "always",
|
||||
"proseWrap": "never",
|
||||
"htmlWhitespaceSensitivity": "strict",
|
||||
"endOfLine": "lf",
|
||||
"singleAttributePerLine": true
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
singleQuote: true
|
||||
semi: true
|
||||
printWidth: 100
|
||||
tabWidth: 4
|
||||
trailingComma: all
|
||||
useTabs: false
|
||||
arrowParens: always
|
||||
proseWrap: never
|
||||
htmlWhitespaceSensitivity: strict
|
||||
endOfLine: lf
|
||||
singleAttributePerLine: false
|
||||
bracketSpacing: true
|
||||
plugins:
|
||||
- prettier-plugin-packagejson
|
||||
+9
-7
@@ -1,17 +1,19 @@
|
||||
{
|
||||
"customSyntax": "postcss-styled-syntax",
|
||||
"extends": [
|
||||
"stylelint-config-standard",
|
||||
"stylelint-config-styled-components",
|
||||
"stylelint-config-css-modules",
|
||||
"stylelint-config-recess-order"
|
||||
],
|
||||
"rules": {
|
||||
"declaration-empty-line-before": null,
|
||||
"declaration-block-no-redundant-longhand-properties": null,
|
||||
"selector-class-pattern": null,
|
||||
"block-no-empty": null,
|
||||
"selector-type-case": ["lower", { "ignoreTypes": ["/^\\$\\w+/"] }],
|
||||
"selector-type-no-unknown": [true, { "ignoreTypes": ["/-styled-mixin/", "/^\\$\\w+/"] }],
|
||||
"declaration-colon-newline-after": null,
|
||||
"property-no-vendor-prefix": null
|
||||
"declaration-block-no-shorthand-property-overrides": null,
|
||||
"declaration-block-no-redundant-longhand-properties": null,
|
||||
"at-rule-no-unknown": [true, { "ignoreAtRules": ["mixin", "value"] }],
|
||||
"function-no-unknown": [true, { "ignoreFunctions": ["darken", "alpha", "lighten"] }],
|
||||
"declaration-property-value-no-unknown": null,
|
||||
"no-descending-specificity": null,
|
||||
"no-empty-source": null
|
||||
}
|
||||
}
|
||||
|
||||
Vendored
+1
-8
@@ -1,10 +1,3 @@
|
||||
{
|
||||
"recommendations": [
|
||||
"dbaeumer.vscode-eslint",
|
||||
"EditorConfig.EditorConfig",
|
||||
"stylelint.vscode-stylelint",
|
||||
"esbenp.prettier-vscode",
|
||||
"clinyong.vscode-css-modules",
|
||||
"Huuums.vscode-fast-folder-structure"
|
||||
]
|
||||
"recommendations": ["dbaeumer.vscode-eslint"]
|
||||
}
|
||||
|
||||
Vendored
+37
-26
@@ -1,28 +1,39 @@
|
||||
{
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Electron: Main",
|
||||
"type": "node",
|
||||
"request": "launch",
|
||||
"protocol": "inspector",
|
||||
"runtimeExecutable": "npm",
|
||||
"runtimeArgs": ["run start:main --inspect=5858 --remote-debugging-port=9223"],
|
||||
"preLaunchTask": "Start Webpack Dev"
|
||||
},
|
||||
{
|
||||
"name": "Electron: Renderer",
|
||||
"type": "chrome",
|
||||
"request": "attach",
|
||||
"port": 9223,
|
||||
"webRoot": "${workspaceFolder}",
|
||||
"timeout": 15000
|
||||
}
|
||||
],
|
||||
"compounds": [
|
||||
{
|
||||
"name": "Electron: All",
|
||||
"configurations": ["Electron: Main", "Electron: Renderer"]
|
||||
}
|
||||
]
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Debug Main Process",
|
||||
"type": "node",
|
||||
"request": "launch",
|
||||
"cwd": "${workspaceRoot}",
|
||||
"runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron-vite",
|
||||
"windows": {
|
||||
"runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron-vite.cmd"
|
||||
},
|
||||
"runtimeArgs": ["--sourcemap"],
|
||||
"env": {
|
||||
"REMOTE_DEBUGGING_PORT": "9222"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Debug Renderer Process",
|
||||
"port": 9222,
|
||||
"request": "attach",
|
||||
"type": "chrome",
|
||||
"webRoot": "${workspaceFolder}/src/renderer",
|
||||
"timeout": 60000,
|
||||
"presentation": {
|
||||
"hidden": true
|
||||
}
|
||||
}
|
||||
],
|
||||
"compounds": [
|
||||
{
|
||||
"name": "Debug All",
|
||||
"configurations": ["Debug Main Process", "Debug Renderer Process"],
|
||||
"presentation": {
|
||||
"order": 1
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
Vendored
+23
-12
@@ -1,15 +1,23 @@
|
||||
{
|
||||
"[typescript]": {
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||
},
|
||||
"[javascript]": {
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||
},
|
||||
"[json]": {
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||
},
|
||||
"files.associations": {
|
||||
".eslintrc": "jsonc",
|
||||
".prettierrc": "jsonc",
|
||||
".eslintignore": "ignore"
|
||||
},
|
||||
"eslint.validate": ["typescript"],
|
||||
"eslint.validate": ["typescript", "typescriptreact"],
|
||||
"eslint.workingDirectories": [
|
||||
{ "directory": "./", "changeProcessCWD": true },
|
||||
{ "directory": "./server", "changeProcessCWD": true }
|
||||
],
|
||||
"typescript.tsserver.experimental.enableProjectDiagnostics": true,
|
||||
"typescript.tsserver.experimental.enableProjectDiagnostics": false,
|
||||
"editor.codeActionsOnSave": {
|
||||
"source.fixAll.eslint": "explicit",
|
||||
"source.fixAll.stylelint": "explicit",
|
||||
@@ -17,10 +25,6 @@
|
||||
"source.formatDocument": "explicit"
|
||||
},
|
||||
"css.validate": true,
|
||||
"less.validate": false,
|
||||
"scss.validate": true,
|
||||
"scss.lint.unknownAtRules": "warning",
|
||||
"scss.lint.unknownProperties": "warning",
|
||||
"javascript.validate.enable": false,
|
||||
"javascript.format.enable": false,
|
||||
"typescript.format.enable": false,
|
||||
@@ -33,14 +37,21 @@
|
||||
"npm-debug.log.*": true,
|
||||
"test/**/__snapshots__": true,
|
||||
"package-lock.json": true,
|
||||
"*.{css,sass,scss}.d.ts": true
|
||||
"*.{css,sass,scss}.d.ts": true,
|
||||
"out/**/*": true,
|
||||
"dist/**/*": true
|
||||
},
|
||||
"i18n-ally.localesPaths": ["src/i18n", "src/i18n/locales"],
|
||||
"typescript.tsdk": "node_modules\\typescript\\lib",
|
||||
"typescript.preferences.importModuleSpecifier": "non-relative",
|
||||
"stylelint.validate": ["css", "scss", "typescript", "typescriptreact"],
|
||||
"stylelint.config": null,
|
||||
"stylelint.validate": ["css", "postcss"],
|
||||
"typescript.updateImportsOnFileMove.enabled": "always",
|
||||
"[typescript]": { "editor.defaultFormatter": "esbenp.prettier-vscode" },
|
||||
"typescript.preferences.autoImportFileExcludePatterns": [
|
||||
"@mantine/core",
|
||||
"@mantine/modals",
|
||||
"@mantine/dates"
|
||||
],
|
||||
"[typescriptreact]": { "editor.defaultFormatter": "esbenp.prettier-vscode" },
|
||||
"typescript.format.insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces": true,
|
||||
"folderTemplates.structures": [
|
||||
@@ -53,14 +64,14 @@
|
||||
"template": "Functional Component with CSS Modules"
|
||||
},
|
||||
{
|
||||
"fileName": "<FTName | kebabcase>.module.scss"
|
||||
"fileName": "<FTName | kebabcase>.module.css"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"folderTemplates.fileTemplates": {
|
||||
"Functional Component with CSS Modules": [
|
||||
"import styles from './<FTName | kebabcase>.module.scss';",
|
||||
"import styles from './<FTName | kebabcase>.module.css';",
|
||||
"",
|
||||
"interface <FTName | pascalcase>Props {}",
|
||||
"",
|
||||
|
||||
Vendored
-25
@@ -1,25 +0,0 @@
|
||||
{
|
||||
"version": "2.0.0",
|
||||
"tasks": [
|
||||
{
|
||||
"type": "npm",
|
||||
"label": "Start Webpack Dev",
|
||||
"script": "start:renderer",
|
||||
"options": {
|
||||
"cwd": "${workspaceFolder}"
|
||||
},
|
||||
"isBackground": true,
|
||||
"problemMatcher": {
|
||||
"owner": "custom",
|
||||
"pattern": {
|
||||
"regexp": "____________"
|
||||
},
|
||||
"background": {
|
||||
"activeOnStart": true,
|
||||
"beginsPattern": "Compiling\\.\\.\\.$",
|
||||
"endsPattern": "(Compiled successfully|Failed to compile)\\.$"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
+11
-8
@@ -1,19 +1,22 @@
|
||||
# --- Builder stage
|
||||
FROM node:18-alpine as builder
|
||||
FROM node:23-alpine as builder
|
||||
WORKDIR /app
|
||||
|
||||
#Copy package.json first to cache node_modules
|
||||
COPY package.json package-lock.json .
|
||||
# Scripts include electron-specific dependencies, which we don't need
|
||||
RUN npm install --legacy-peer-deps --ignore-scripts
|
||||
#Copy code and build with cached modules
|
||||
# Copy package.json first to cache node_modules
|
||||
COPY package.json pnpm-lock.yaml .
|
||||
|
||||
RUN npm install -g pnpm
|
||||
|
||||
RUN pnpm install
|
||||
|
||||
# Copy code and build with cached modules
|
||||
COPY . .
|
||||
RUN npm run build:web
|
||||
RUN pnpm run build:web
|
||||
|
||||
# --- Production stage
|
||||
FROM nginx:alpine-slim
|
||||
|
||||
COPY --chown=nginx:nginx --from=builder /app/release/app/dist/web /usr/share/nginx/html
|
||||
COPY --chown=nginx:nginx --from=builder /app/out/web /usr/share/nginx/html
|
||||
COPY ./settings.js.template /etc/nginx/templates/settings.js.template
|
||||
COPY ng.conf.template /etc/nginx/templates/default.conf.template
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<img src="assets/icons/icon.png" alt="logo" title="feishin" align="right" height="60px" />
|
||||
<img src="assets/icons/icon.png" alt="logo" title="feishin" align="right" height="60px" width="60px" />
|
||||
|
||||
# Feishin
|
||||
|
||||
@@ -27,17 +27,19 @@
|
||||
</a>
|
||||
</p>
|
||||
|
||||
---
|
||||
|
||||
Rewrite of [Sonixd](https://github.com/jeffvli/sonixd).
|
||||
|
||||
## Features
|
||||
|
||||
- [x] MPV player backend
|
||||
- [x] Web player backend
|
||||
- [x] Modern UI
|
||||
- [x] Scrobble playback to your server
|
||||
- [x] Smart playlist editor (Navidrome)
|
||||
- [x] Synchronized and unsynchronized lyrics support
|
||||
- [ ] [Request a feature](https://github.com/jeffvli/feishin/issues) or [view taskboard](https://github.com/users/jeffvli/projects/5/views/1)
|
||||
- [x] MPV player backend
|
||||
- [x] Web player backend
|
||||
- [x] Modern UI
|
||||
- [x] Scrobble playback to your server
|
||||
- [x] Smart playlist editor (Navidrome)
|
||||
- [x] Synchronized and unsynchronized lyrics support
|
||||
- [ ] [Request a feature](https://github.com/jeffvli/feishin/issues) or [view taskboard](https://github.com/users/jeffvli/projects/5/views/1)
|
||||
|
||||
## Screenshots
|
||||
|
||||
@@ -49,12 +51,24 @@ Rewrite of [Sonixd](https://github.com/jeffvli/sonixd).
|
||||
|
||||
Download the [latest desktop client](https://github.com/jeffvli/feishin/releases). The desktop client is the recommended way to use Feishin. It supports both the MPV and web player backends, as well as includes built-in fetching for lyrics.
|
||||
|
||||
#### MacOS Notes
|
||||
#### macOS Notes
|
||||
|
||||
If you're using a device running macOS 12 (Monterey) or higher, [check here](https://github.com/jeffvli/feishin/issues/104#issuecomment-1553914730) for instructions on how to remove the app from quarantine.
|
||||
|
||||
For media keys to work, you will be prompted to allow Feishin to be a Trusted Accessibility Client. After allowing, you will need to restart Feishin for the privacy settings to take effect.
|
||||
|
||||
#### Linux Notes
|
||||
|
||||
If you're using a Linux device, a `.desktop` file is recommended for easy launching of Feishin.
|
||||
|
||||
Download the [latest release (AppImage)](https://github.com/jeffvli/feishin/releases) and [application icon](https://github.com/jeffvli/feishin/blob/development/resources/icon.png?raw=true) to your `~/applications/` folder. This folder may need to be created if it does not already exist.
|
||||
|
||||
Rename the icon to `Feishin-linux-x86_64.png`.
|
||||
|
||||
Save the [example desktop file](https://raw.githubusercontent.com/jeffvli/feishin/refs/heads/development/feishin.desktop) as `~/.local/share/applications/feishin.desktop`.
|
||||
|
||||
You will now see Feishin show up in your menu. The properties in the example desktop file may need to be modified to match your system.
|
||||
|
||||
### Web and Docker
|
||||
|
||||
Visit [https://feishin.vercel.app](https://feishin.vercel.app) to use the hosted web version of Feishin. The web client only supports the web player backend.
|
||||
@@ -70,14 +84,37 @@ docker build -t feishin .
|
||||
docker run --name feishin -p 9180:9180 feishin
|
||||
```
|
||||
|
||||
#### Docker Compose
|
||||
|
||||
To install via Docker Compose use the following snippit. This also works on Portainer.
|
||||
|
||||
```yaml
|
||||
services:
|
||||
feishin:
|
||||
container_name: feishin
|
||||
image: 'ghcr.io/jeffvli/feishin:latest'
|
||||
environment:
|
||||
- SERVER_NAME=jellyfin # pre defined server name
|
||||
- SERVER_LOCK=true # When true AND name/type/url are set, only username/password can be toggled
|
||||
- SERVER_TYPE=jellyfin # navidrome also works
|
||||
- SERVER_URL= # http://address:port
|
||||
- PUID=1000
|
||||
- PGID=1000
|
||||
- UMASK=002
|
||||
- TZ=America/Los_Angeles
|
||||
ports:
|
||||
- 9180:9180
|
||||
restart: unless-stopped
|
||||
```
|
||||
|
||||
### Configuration
|
||||
|
||||
1. Upon startup you will be greeted with a prompt to select the path to your MPV binary. If you do not have MPV installed, you can download it [here](https://mpv.io/installation/) or install it using any package manager supported by your OS. After inputting the path, restart the app.
|
||||
|
||||
2. After restarting the app, you will be prompted to select a server. Click the `Open menu` button and select `Manage servers`. Click the `Add server` button in the popup and fill out all applicable details. You will need to enter the full URL to your server, including the protocol and port if applicable (e.g. `https://navidrome.my-server.com` or `http://192.168.0.1:4533`).
|
||||
|
||||
- **Navidrome** - For the best experience, select "Save password" when creating the server and configure the `SessionTimeout` setting in your Navidrome config to a larger value (e.g. 72h).
|
||||
- **Linux users** - The default password store uses `libsecret`. `kwallet4/5/6` are also supported, but must be explicitly set in Settings > Window > Passwords/secret score.
|
||||
- **Navidrome** - For the best experience, select "Save password" when creating the server and configure the `SessionTimeout` setting in your Navidrome config to a larger value (e.g. 72h).
|
||||
- **Linux users** - The default password store uses `libsecret`. `kwallet4/5/6` are also supported, but must be explicitly set in Settings > Window > Passwords/secret score.
|
||||
|
||||
3. _Optional_ - If you want to host Feishin on a subpath (not `/`), then pass in the following environment variable: `PUBLIC_PATH=PATH`. For example, to host on `/feishin`, pass in `PUBLIC_PATH=/feishin`.
|
||||
|
||||
@@ -91,18 +128,65 @@ First thing to do is check that your MPV binary path is correct. Navigate to the
|
||||
|
||||
### What music servers does Feishin support?
|
||||
|
||||
Feishin supports any music server that implements a [Navidrome](https://www.navidrome.org/) or [Jellyfin](https://jellyfin.org/) API. **Subsonic API is not currently supported**. This will likely be added in [later when the new Subsonic API is decided on](https://support.symfonium.app/t/subsonic-servers-participation/1233).
|
||||
Feishin supports any music server that implements a [Navidrome](https://www.navidrome.org/), [Jellyfin](https://jellyfin.org/), or [OpenSubsonic compatible](https://opensubsonic.netlify.app/) API.
|
||||
|
||||
- [Navidrome](https://github.com/navidrome/navidrome) version 0.48.0 and newer
|
||||
- [Jellyfin](https://github.com/jellyfin/jellyfin)
|
||||
- [Funkwhale](https://funkwhale.audio/) - TBD
|
||||
- Subsonic-compatible servers - TBD
|
||||
- [Navidrome](https://github.com/navidrome/navidrome)
|
||||
- [Jellyfin](https://github.com/jellyfin/jellyfin)
|
||||
- [OpenSubsonic](https://opensubsonic.netlify.app/) compatible servers, such as...
|
||||
- [Airsonic-Advanced](https://github.com/airsonic-advanced/airsonic-advanced)
|
||||
- [Ampache](https://ampache.org)
|
||||
- [Astiga](https://asti.ga/)
|
||||
- [Funkwhale](https://www.funkwhale.audio/)
|
||||
- [Gonic](https://github.com/sentriz/gonic)
|
||||
- [LMS](https://github.com/epoupon/lms)
|
||||
- [Nextcloud Music](https://apps.nextcloud.com/apps/music)
|
||||
- [Supysonic](https://github.com/spl0k/supysonic)
|
||||
- [Qm-Music](https://github.com/chenqimiao/qm-music)
|
||||
- More (?)
|
||||
|
||||
### I have the issue "The SUID sandbox helper binary was found, but is not configured correctly" on Linux
|
||||
|
||||
This happens when you have user (unprivileged) namespaces disabled (`sysctl kernel.unprivileged_userns_clone` returns 0). You can fix this by either enabling unprivileged namespaces, or by making the `chrome-sandbox` Setuid.
|
||||
|
||||
```bash
|
||||
chmod 4755 chrome-sandbox
|
||||
sudo chown root:root chrome-sandbox
|
||||
```
|
||||
|
||||
Ubunutu 24.04 specifically introduced breaking changes that affect how namespaces work. Please see https://discourse.ubuntu.com/t/ubuntu-24-04-lts-noble-numbat-release-notes/39890#:~:text=security%20improvements%20 for possible fixes.
|
||||
|
||||
## Development
|
||||
|
||||
Built and tested using Node `v16.15.0`.
|
||||
Built and tested using Node `v23.11.0`.
|
||||
|
||||
This project is built off of [electron-react-boilerplate](https://github.com/electron-react-boilerplate/electron-react-boilerplate) v4.6.0.
|
||||
This project is built off of [electron-vite](https://github.com/alex8088/electron-vite)
|
||||
|
||||
- `pnpm run dev` - Start the development server
|
||||
- `pnpm run dev:watch` - Start the development server in watch mode (for main / preload HMR)
|
||||
- `pnpm run start` - Starts the app in production preview mode
|
||||
- `pnpm run build` - Builds the app for desktop
|
||||
- `pnpm run build:electron` - Build the electron app (main, preload, and renderer)
|
||||
- `pnpm run build:remote` - Build the remote app (remote)
|
||||
- `pnpm run build:web` - Build the standalone web app (renderer)
|
||||
- `pnpm run package` - Package the project
|
||||
- `pnpm run package:dev` - Package the project for development locally
|
||||
- `pnpm run package:linux` - Package the project for Linux locally
|
||||
- `pnpm run package:mac` - Package the project for Mac locally
|
||||
- `pnpm run package:win` - Package the project for Windows locally
|
||||
- `pnpm run publish:linux` - Publish the project for Linux
|
||||
- `pnpm run publish:linux:beta` - Publish the project for Linux (beta channel)
|
||||
- `pnpm run publish:linux-arm64` - Publish the project for Linux ARM64
|
||||
- `pnpm run publish:linux-arm64:beta` - Publish the project for Linux ARM64 (beta channel)
|
||||
- `pnpm run publish:mac` - Publish the project for Mac
|
||||
- `pnpm run publish:mac:beta` - Publish the project for Mac (beta channel)
|
||||
- `pnpm run publish:win` - Publish the project for Windows
|
||||
- `pnpm run publish:win:beta` - Publish the project for Windows (beta channel)
|
||||
- `pnpm run typecheck` - Type check the project
|
||||
- `pnpm run typecheck:node` - Type check the project with tsconfig.node.json
|
||||
- `pnpm run typecheck:web` - Type check the project with tsconfig.web.json
|
||||
- `pnpm run lint` - Lint the project
|
||||
- `pnpm run lint:fix` - Lint the project and fix linting errors
|
||||
- `pnpm run i18next` - Generate i18n files
|
||||
|
||||
## Translation
|
||||
|
||||
|
||||
@@ -2,9 +2,11 @@
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>com.apple.security.cs.allow-jit</key>
|
||||
<true/>
|
||||
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
|
||||
<true/>
|
||||
<key>com.apple.security.cs.allow-jit</key>
|
||||
<key>com.apple.security.cs.allow-dyld-environment-variables</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
Binary file not shown.
@@ -0,0 +1,3 @@
|
||||
provider: generic
|
||||
url: https://example.com/auto-updates
|
||||
updaterCacheDirName: feishin-updater
|
||||
+1
-1
@@ -2,7 +2,7 @@ version: '3.5'
|
||||
services:
|
||||
feishin:
|
||||
container_name: feishin
|
||||
image: jeffvli/feishin
|
||||
image: ghcr.io/jeffvli/feishin:latest
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- 9180:9180
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
appId: org.jeffvli.feishin
|
||||
productName: Feishin
|
||||
artifactName: ${productName}-${version}-${os}-${arch}.${ext}
|
||||
electronVersion: 35.1.5
|
||||
directories:
|
||||
buildResources: assets
|
||||
files:
|
||||
- 'out/**/*'
|
||||
- 'package.json'
|
||||
extraResources:
|
||||
- assets/**
|
||||
asarUnpack:
|
||||
- resources/**
|
||||
win:
|
||||
target:
|
||||
- zip
|
||||
- nsis
|
||||
icon: assets/icons/icon.png
|
||||
|
||||
nsis:
|
||||
allowToChangeInstallationDirectory: true
|
||||
oneClick: false
|
||||
shortcutName: ${productName}
|
||||
uninstallDisplayName: ${productName}
|
||||
createDesktopShortcut: always
|
||||
|
||||
mac:
|
||||
target:
|
||||
target: default
|
||||
arch:
|
||||
- arm64
|
||||
- x64
|
||||
icon: assets/icons/icon.icns
|
||||
type: distribution
|
||||
hardenedRuntime: true
|
||||
entitlements: assets/entitlements.mac.plist
|
||||
entitlementsInherit: assets/entitlements.mac.plist
|
||||
gatekeeperAssess: false
|
||||
notarize: false
|
||||
|
||||
dmg:
|
||||
contents: [{ x: 130, y: 220 }, { x: 410, y: 220, type: link, path: /Applications }]
|
||||
|
||||
linux:
|
||||
target:
|
||||
- AppImage
|
||||
- tar.xz
|
||||
category: AudioVideo;Audio;Player
|
||||
icon: assets/icons/icon.png
|
||||
artifactName: ${productName}-${os}-${arch}.${ext}
|
||||
|
||||
npmRebuild: false
|
||||
publish:
|
||||
provider: github
|
||||
owner: jeffvli
|
||||
repo: feishin
|
||||
channel: beta
|
||||
releaseType: draft
|
||||
@@ -0,0 +1,58 @@
|
||||
appId: org.jeffvli.feishin
|
||||
productName: Feishin
|
||||
artifactName: ${productName}-${version}-${os}-${arch}.${ext}
|
||||
electronVersion: 35.1.5
|
||||
directories:
|
||||
buildResources: assets
|
||||
files:
|
||||
- 'out/**/*'
|
||||
- 'package.json'
|
||||
extraResources:
|
||||
- assets/**
|
||||
asarUnpack:
|
||||
- resources/**
|
||||
win:
|
||||
target:
|
||||
- zip
|
||||
- nsis
|
||||
icon: assets/icons/icon.png
|
||||
|
||||
nsis:
|
||||
allowToChangeInstallationDirectory: true
|
||||
oneClick: false
|
||||
shortcutName: ${productName}
|
||||
uninstallDisplayName: ${productName}
|
||||
createDesktopShortcut: always
|
||||
|
||||
mac:
|
||||
target:
|
||||
target: default
|
||||
arch:
|
||||
- arm64
|
||||
- x64
|
||||
icon: assets/icons/icon.icns
|
||||
type: distribution
|
||||
hardenedRuntime: true
|
||||
entitlements: assets/entitlements.mac.plist
|
||||
entitlementsInherit: assets/entitlements.mac.plist
|
||||
gatekeeperAssess: false
|
||||
notarize: false
|
||||
|
||||
dmg:
|
||||
contents: [{ x: 130, y: 220 }, { x: 410, y: 220, type: link, path: /Applications }]
|
||||
|
||||
linux:
|
||||
target:
|
||||
- AppImage
|
||||
- tar.xz
|
||||
category: AudioVideo;Audio;Player
|
||||
icon: assets/icons/icon.png
|
||||
artifactName: ${productName}-${os}-${arch}.${ext}
|
||||
|
||||
npmRebuild: false
|
||||
publish:
|
||||
provider: github
|
||||
owner: jeffvli
|
||||
repo: feishin
|
||||
channel: latest
|
||||
releaseType: draft
|
||||
@@ -0,0 +1,66 @@
|
||||
import react from '@vitejs/plugin-react';
|
||||
import { externalizeDepsPlugin, UserConfig } from 'electron-vite';
|
||||
import { resolve } from 'path';
|
||||
import conditionalImportPlugin from 'vite-plugin-conditional-import';
|
||||
import dynamicImportPlugin from 'vite-plugin-dynamic-import';
|
||||
import { ViteEjsPlugin } from 'vite-plugin-ejs';
|
||||
|
||||
const currentOSEnv = process.platform;
|
||||
|
||||
const config: UserConfig = {
|
||||
main: {
|
||||
build: {
|
||||
rollupOptions: {
|
||||
external: ['source-map-support'],
|
||||
},
|
||||
sourcemap: true,
|
||||
},
|
||||
define: {
|
||||
'import.meta.env.IS_LINUX': JSON.stringify(currentOSEnv === 'linux'),
|
||||
'import.meta.env.IS_MACOS': JSON.stringify(currentOSEnv === 'darwin'),
|
||||
'import.meta.env.IS_WIN': JSON.stringify(currentOSEnv === 'win32'),
|
||||
},
|
||||
plugins: [
|
||||
externalizeDepsPlugin(),
|
||||
dynamicImportPlugin(),
|
||||
conditionalImportPlugin({
|
||||
currentEnv: currentOSEnv,
|
||||
envs: ['win32', 'linux', 'darwin'],
|
||||
}),
|
||||
],
|
||||
resolve: {
|
||||
alias: {
|
||||
'/@/main': resolve('src/main'),
|
||||
'/@/shared': resolve('src/shared'),
|
||||
},
|
||||
},
|
||||
},
|
||||
preload: {
|
||||
plugins: [externalizeDepsPlugin()],
|
||||
resolve: {
|
||||
alias: {
|
||||
'/@/preload': resolve('src/preload'),
|
||||
'/@/shared': resolve('src/shared'),
|
||||
},
|
||||
},
|
||||
},
|
||||
renderer: {
|
||||
css: {
|
||||
modules: {
|
||||
generateScopedName: 'fs-[name]-[local]',
|
||||
localsConvention: 'camelCase',
|
||||
},
|
||||
},
|
||||
plugins: [react(), ViteEjsPlugin({ web: false })],
|
||||
resolve: {
|
||||
alias: {
|
||||
'/@/i18n': resolve('src/i18n'),
|
||||
'/@/remote': resolve('src/remote'),
|
||||
'/@/renderer': resolve('src/renderer'),
|
||||
'/@/shared': resolve('src/shared'),
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default config;
|
||||
@@ -0,0 +1,53 @@
|
||||
import eslintConfigPrettier from '@electron-toolkit/eslint-config-prettier';
|
||||
import tseslint from '@electron-toolkit/eslint-config-ts';
|
||||
import perfectionist from 'eslint-plugin-perfectionist';
|
||||
import eslintPluginReact from 'eslint-plugin-react';
|
||||
import eslintPluginReactHooks from 'eslint-plugin-react-hooks';
|
||||
import eslintPluginReactRefresh from 'eslint-plugin-react-refresh';
|
||||
|
||||
export default tseslint.config(
|
||||
{ ignores: ['**/node_modules', '**/dist', '**/out'] },
|
||||
tseslint.configs.recommended,
|
||||
perfectionist.configs['recommended-natural'],
|
||||
eslintPluginReact.configs.flat.recommended,
|
||||
eslintPluginReact.configs.flat['jsx-runtime'],
|
||||
{
|
||||
settings: {
|
||||
react: {
|
||||
version: 'detect',
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
files: ['**/*.{ts,tsx}'],
|
||||
plugins: {
|
||||
'react-hooks': eslintPluginReactHooks,
|
||||
'react-refresh': eslintPluginReactRefresh,
|
||||
},
|
||||
rules: {
|
||||
...eslintPluginReactHooks.configs.recommended.rules,
|
||||
...eslintPluginReactRefresh.configs.vite.rules,
|
||||
'@typescript-eslint/explicit-function-return-type': 'off',
|
||||
'@typescript-eslint/no-duplicate-enum-values': 'off',
|
||||
'@typescript-eslint/no-explicit-any': 'off',
|
||||
'@typescript-eslint/no-unused-vars': 'warn',
|
||||
curly: ['error', 'all'],
|
||||
indent: [
|
||||
'error',
|
||||
'tab',
|
||||
{
|
||||
offsetTernaryExpressions: true,
|
||||
SwitchCase: 1,
|
||||
},
|
||||
],
|
||||
'no-unused-vars': 'off',
|
||||
'no-use-before-define': 'off',
|
||||
quotes: ['error', 'single'],
|
||||
'react-refresh/only-export-components': 'off',
|
||||
'react/display-name': 'off',
|
||||
semi: ['error', 'always'],
|
||||
'single-attribute-per-line': 'off',
|
||||
},
|
||||
},
|
||||
eslintConfigPrettier,
|
||||
);
|
||||
@@ -0,0 +1,9 @@
|
||||
[Desktop Entry]
|
||||
Name=Feishin
|
||||
Comment=An Electron-based music streaming app
|
||||
Exec=/home/username/.applications/Feishin-linux-x86_64.AppImage
|
||||
Icon=/home/username/.applications/Feishin-linux-x86_64.png
|
||||
Terminal=false
|
||||
Type=Application
|
||||
Categories=AudioVideo;Audio;Music;Player;
|
||||
StartupNotify=true
|
||||
+1
-1
@@ -24,4 +24,4 @@ server {
|
||||
location ${PUBLIC_PATH}/settings.js {
|
||||
alias /etc/nginx/conf.d/settings.js;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Generated
-37154
File diff suppressed because it is too large
Load Diff
+129
-313
@@ -1,292 +1,61 @@
|
||||
{
|
||||
"name": "feishin",
|
||||
"productName": "Feishin",
|
||||
"description": "Feishin music server",
|
||||
"version": "0.6.0",
|
||||
"scripts": {
|
||||
"build": "concurrently \"npm run build:main\" \"npm run build:renderer\" \"npm run build:remote\"",
|
||||
"build:main": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.main.prod.ts",
|
||||
"build:remote": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.remote.prod.ts",
|
||||
"build:renderer": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.renderer.prod.ts",
|
||||
"build:web": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.web.prod.ts",
|
||||
"build:docker": "docker build -t jeffvli/feishin .",
|
||||
"rebuild": "electron-rebuild --parallel --types prod,dev,optional --module-dir release/app",
|
||||
"lint": "concurrently \"npm run lint:code\" \"npm run lint:styles\"",
|
||||
"lint:code": "cross-env NODE_ENV=development eslint . --ext .js,.jsx,.ts,.tsx --fix",
|
||||
"lint:styles": "npx stylelint **/*.tsx --fix",
|
||||
"package": "ts-node ./.erb/scripts/clean.js dist && npm run build && electron-builder build --publish never",
|
||||
"package:pr": "ts-node ./.erb/scripts/clean.js dist && npm run build && electron-builder build --publish never --win --mac --linux",
|
||||
"package:dev": "ts-node ./.erb/scripts/clean.js dist && npm run build && electron-builder build --publish never --dir",
|
||||
"postinstall": "ts-node .erb/scripts/check-native-dep.js && electron-builder install-app-deps && cross-env NODE_ENV=development TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.renderer.dev.dll.ts",
|
||||
"start": "ts-node ./.erb/scripts/check-port-in-use.js && npm run start:renderer",
|
||||
"start:main": "cross-env NODE_ENV=development electron -r ts-node/register/transpile-only ./src/main/main.ts",
|
||||
"start:preload": "cross-env NODE_ENV=development TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.preload.dev.ts",
|
||||
"start:remote": "cross-env NODE_ENV=developemnt TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.remote.dev.ts",
|
||||
"start:renderer": "cross-env NODE_ENV=development TS_NODE_TRANSPILE_ONLY=true webpack serve --config ./.erb/configs/webpack.config.renderer.dev.ts",
|
||||
"start:web": "cross-env NODE_ENV=development TS_NODE_TRANSPILE_ONLY=true webpack serve --config ./.erb/configs/webpack.config.renderer.web.ts",
|
||||
"test": "jest",
|
||||
"prepare": "husky install",
|
||||
"i18next": "i18next -c src/i18n/i18next-parser.config.js",
|
||||
"prod:buildserver": "pwsh -c \"./scripts/server-build.ps1\"",
|
||||
"prod:publishserver": "pwsh -c \"./scripts/server-publish.ps1\""
|
||||
},
|
||||
"lint-staged": {
|
||||
"*.{js,jsx,ts,tsx}": [
|
||||
"cross-env NODE_ENV=development eslint --cache"
|
||||
],
|
||||
"*.json,.{eslintrc,prettierrc}": [
|
||||
"prettier --ignore-path .eslintignore --parser json --write"
|
||||
],
|
||||
"*.{css,scss}": [
|
||||
"prettier --ignore-path .eslintignore --single-quote --write"
|
||||
],
|
||||
"*.{html,md,yml}": [
|
||||
"prettier --ignore-path .eslintignore --single-quote --write"
|
||||
]
|
||||
},
|
||||
"build": {
|
||||
"productName": "Feishin",
|
||||
"appId": "org.jeffvli.feishin",
|
||||
"artifactName": "${productName}-${version}-${os}-${arch}.${ext}",
|
||||
"asar": true,
|
||||
"asarUnpack": "**\\*.{node,dll}",
|
||||
"files": [
|
||||
"dist",
|
||||
"node_modules",
|
||||
"package.json"
|
||||
],
|
||||
"afterSign": ".erb/scripts/notarize.js",
|
||||
"electronVersion": "27.1.0",
|
||||
"mac": {
|
||||
"target": {
|
||||
"target": "default",
|
||||
"arch": [
|
||||
"arm64",
|
||||
"x64"
|
||||
]
|
||||
},
|
||||
"icon": "assets/icons/icon.icns",
|
||||
"type": "distribution",
|
||||
"hardenedRuntime": true,
|
||||
"entitlements": "assets/entitlements.mac.plist",
|
||||
"entitlementsInherit": "assets/entitlements.mac.plist",
|
||||
"gatekeeperAssess": false
|
||||
},
|
||||
"dmg": {
|
||||
"contents": [
|
||||
{
|
||||
"x": 130,
|
||||
"y": 220
|
||||
},
|
||||
{
|
||||
"x": 410,
|
||||
"y": 220,
|
||||
"type": "link",
|
||||
"path": "/Applications"
|
||||
}
|
||||
]
|
||||
},
|
||||
"win": {
|
||||
"target": [
|
||||
"nsis",
|
||||
"zip"
|
||||
],
|
||||
"icon": "assets/icons/icon.ico"
|
||||
},
|
||||
"deb": {
|
||||
"depends": [
|
||||
"libgssapi_krb5.so.2",
|
||||
"libavahi-common.so.3",
|
||||
"libavahi-client.so.3",
|
||||
"libkrb5.so.3",
|
||||
"libkrb5support.so.0",
|
||||
"libkeyutils.so.1",
|
||||
"libcups.so.2"
|
||||
]
|
||||
},
|
||||
"rpm": {
|
||||
"depends": [
|
||||
"libgssapi_krb5.so.2",
|
||||
"libavahi-common.so.3",
|
||||
"libavahi-client.so.3",
|
||||
"libkrb5.so.3",
|
||||
"libkrb5support.so.0",
|
||||
"libkeyutils.so.1",
|
||||
"libcups.so.2"
|
||||
]
|
||||
},
|
||||
"freebsd": {
|
||||
"depends": [
|
||||
"libgssapi_krb5.so.2",
|
||||
"libavahi-common.so.3",
|
||||
"libavahi-client.so.3",
|
||||
"libkrb5.so.3",
|
||||
"libkrb5support.so.0",
|
||||
"libkeyutils.so.1",
|
||||
"libcups.so.2"
|
||||
]
|
||||
},
|
||||
"linux": {
|
||||
"target": [
|
||||
"AppImage",
|
||||
"tar.xz"
|
||||
],
|
||||
"icon": "assets/icons/icon.png",
|
||||
"category": "AudioVideo;Audio;Player"
|
||||
},
|
||||
"directories": {
|
||||
"app": "release/app",
|
||||
"buildResources": "assets",
|
||||
"output": "release/build"
|
||||
},
|
||||
"extraResources": [
|
||||
"./assets/**"
|
||||
],
|
||||
"publish": {
|
||||
"provider": "github",
|
||||
"owner": "jeffvli",
|
||||
"repo": "feishin"
|
||||
}
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/jeffvli/feishin.git"
|
||||
},
|
||||
"author": {
|
||||
"name": "jeffvli",
|
||||
"url": "https://github.com/jeffvli/"
|
||||
},
|
||||
"contributors": [],
|
||||
"license": "GPL-3.0",
|
||||
"bugs": {
|
||||
"url": "https://github.com/jeffvli/feishin/issues"
|
||||
},
|
||||
"version": "0.21.2",
|
||||
"description": "A modern self-hosted music player.",
|
||||
"keywords": [
|
||||
"subsonic",
|
||||
"navidrome",
|
||||
"airsonic",
|
||||
"jellyfin",
|
||||
"react",
|
||||
"electron"
|
||||
],
|
||||
"homepage": "https://github.com/jeffvli/feishin",
|
||||
"jest": {
|
||||
"testURL": "http://localhost/",
|
||||
"testEnvironment": "jsdom",
|
||||
"transform": {
|
||||
"\\.(ts|tsx|js|jsx)$": "ts-jest"
|
||||
},
|
||||
"moduleNameMapper": {
|
||||
"\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/.erb/mocks/fileMock.js",
|
||||
"\\.(css|less|sass|scss)$": "identity-obj-proxy"
|
||||
},
|
||||
"moduleFileExtensions": [
|
||||
"js",
|
||||
"jsx",
|
||||
"ts",
|
||||
"tsx",
|
||||
"json"
|
||||
],
|
||||
"moduleDirectories": [
|
||||
"node_modules",
|
||||
"release/app/node_modules"
|
||||
],
|
||||
"testPathIgnorePatterns": [
|
||||
"release/app/dist"
|
||||
],
|
||||
"setupFiles": [
|
||||
"./.erb/scripts/check-build-exists.ts"
|
||||
]
|
||||
"bugs": {
|
||||
"url": "https://github.com/jeffvli/feishin/issues"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@electron/rebuild": "^3.2.10",
|
||||
"@pmmmwh/react-refresh-webpack-plugin": "0.5.5",
|
||||
"@stylelint/postcss-css-in-js": "^0.38.0",
|
||||
"@teamsupercell/typings-for-css-modules-loader": "^2.5.1",
|
||||
"@testing-library/jest-dom": "^5.16.4",
|
||||
"@testing-library/react": "^13.0.0",
|
||||
"@types/electron-localshortcut": "^3.1.0",
|
||||
"@types/jest": "^27.4.1",
|
||||
"@types/lodash": "^4.14.188",
|
||||
"@types/md5": "^2.3.2",
|
||||
"@types/node": "^17.0.23",
|
||||
"@types/react": "^18.0.25",
|
||||
"@types/react-dom": "^18.0.8",
|
||||
"@types/react-test-renderer": "^17.0.1",
|
||||
"@types/react-virtualized-auto-sizer": "^1.0.1",
|
||||
"@types/react-window": "^1.8.5",
|
||||
"@types/react-window-infinite-loader": "^1.0.6",
|
||||
"@types/styled-components": "^5.1.26",
|
||||
"@types/terser-webpack-plugin": "^5.0.4",
|
||||
"@types/webpack-bundle-analyzer": "^4.4.1",
|
||||
"@types/webpack-env": "^1.16.3",
|
||||
"@typescript-eslint/eslint-plugin": "^5.47.0",
|
||||
"@typescript-eslint/parser": "^5.47.0",
|
||||
"browserslist-config-erb": "^0.0.3",
|
||||
"chalk": "^4.1.2",
|
||||
"concurrently": "^7.1.0",
|
||||
"core-js": "^3.21.1",
|
||||
"cross-env": "^7.0.3",
|
||||
"css-loader": "^6.7.1",
|
||||
"css-minimizer-webpack-plugin": "^3.4.1",
|
||||
"detect-port": "^1.3.0",
|
||||
"electron": "^27.1.0",
|
||||
"electron-builder": "^24.9.0",
|
||||
"electron-devtools-installer": "^3.2.0",
|
||||
"electron-notarize": "^1.2.1",
|
||||
"electronmon": "^2.0.2",
|
||||
"eslint": "^8.30.0",
|
||||
"eslint-config-airbnb-base": "^15.0.0",
|
||||
"eslint-config-erb": "^4.0.3",
|
||||
"eslint-import-resolver-typescript": "^2.7.1",
|
||||
"eslint-import-resolver-webpack": "^0.13.2",
|
||||
"eslint-plugin-compat": "^4.2.0",
|
||||
"eslint-plugin-import": "^2.26.0",
|
||||
"eslint-plugin-jest": "^26.1.3",
|
||||
"eslint-plugin-jsx-a11y": "^6.5.1",
|
||||
"eslint-plugin-promise": "^6.0.0",
|
||||
"eslint-plugin-react": "^7.29.4",
|
||||
"eslint-plugin-react-hooks": "^4.4.0",
|
||||
"eslint-plugin-sort-keys-fix": "^1.1.2",
|
||||
"eslint-plugin-typescript-sort-keys": "^2.1.0",
|
||||
"file-loader": "^6.2.0",
|
||||
"html-webpack-plugin": "^5.5.0",
|
||||
"husky": "^7.0.4",
|
||||
"i18next-parser": "^6.6.0",
|
||||
"identity-obj-proxy": "^3.0.0",
|
||||
"jest": "^27.5.1",
|
||||
"lint-staged": "^12.3.7",
|
||||
"mini-css-extract-plugin": "^2.6.0",
|
||||
"postcss-scss": "^4.0.4",
|
||||
"postcss-styled-syntax": "^0.5.0",
|
||||
"postcss-syntax": "^0.36.2",
|
||||
"prettier": "^2.6.2",
|
||||
"react-refresh": "^0.12.0",
|
||||
"react-refresh-typescript": "^2.0.4",
|
||||
"react-test-renderer": "^18.0.0",
|
||||
"rimraf": "^3.0.2",
|
||||
"sass": "^1.49.11",
|
||||
"sass-loader": "^12.6.0",
|
||||
"style-loader": "^3.3.1",
|
||||
"stylelint": "^15.10.3",
|
||||
"stylelint-config-css-modules": "^4.3.0",
|
||||
"stylelint-config-recess-order": "^4.3.0",
|
||||
"stylelint-config-standard": "^34.0.0",
|
||||
"stylelint-config-standard-scss": "^4.0.0",
|
||||
"stylelint-config-styled-components": "^0.1.1",
|
||||
"terser-webpack-plugin": "^5.3.1",
|
||||
"ts-jest": "^27.1.4",
|
||||
"ts-loader": "^9.2.8",
|
||||
"ts-node": "^10.7.0",
|
||||
"tsconfig-paths-webpack-plugin": "^4.0.0",
|
||||
"typescript": "^5.2.2",
|
||||
"typescript-plugin-styled-components": "^3.0.0",
|
||||
"url-loader": "^4.1.1",
|
||||
"webpack": "^5.71.0",
|
||||
"webpack-bundle-analyzer": "^4.5.0",
|
||||
"webpack-cli": "^4.9.2",
|
||||
"webpack-dev-server": "^4.8.0",
|
||||
"webpack-merge": "^5.8.0"
|
||||
"license": "GPL-3.0",
|
||||
"author": {
|
||||
"name": "jeffvli",
|
||||
"url": "https://github.com/jeffvli/"
|
||||
},
|
||||
"main": "./out/main/index.js",
|
||||
"scripts": {
|
||||
"build": "pnpm run typecheck && pnpm run build:electron && pnpm run build:remote",
|
||||
"build:electron": "electron-vite build",
|
||||
"build:remote": "vite build --config remote.vite.config.ts",
|
||||
"build:web": "vite build --config web.vite.config.ts",
|
||||
"dev": "electron-vite dev",
|
||||
"dev:remote": "vite dev --config remote.vite.config.ts",
|
||||
"dev:watch": "electron-vite dev --watch",
|
||||
"i18next": "i18next -c src/i18n/i18next-parser.config.js",
|
||||
"postinstall": "electron-builder install-app-deps",
|
||||
"lint": "pnpm run lint-code && pnpm run lint-styles",
|
||||
"lint-code": "eslint --max-warnings=0 --cache .",
|
||||
"lint-code:fix": "eslint --cache --fix .",
|
||||
"lint-styles": "stylelint --max-warnings=0 'src/**/*.{css,scss}'",
|
||||
"lint-styles:fix": "stylelint 'src/**/*.{css,scss}' --fix",
|
||||
"lint:fix": "pnpm run lint-code:fix && pnpm run lint-styles:fix",
|
||||
"package": "pnpm run build && electron-builder",
|
||||
"package:dev": "pnpm run build && electron-builder --dir",
|
||||
"package:linux": "pnpm run build && electron-builder --linux",
|
||||
"package:linux-arm64:pr": "pnpm run build && electron-builder --linux --arm64 --publish never",
|
||||
"package:linux:pr": "pnpm run build && electron-builder --linux --publish never",
|
||||
"package:mac": "pnpm run build && electron-builder --mac",
|
||||
"package:mac:pr": "pnpm run build && electron-builder --mac --publish never",
|
||||
"package:win": "pnpm run build && electron-builder --win",
|
||||
"package:win:pr": "pnpm run build && electron-builder --win --publish never",
|
||||
"publish:linux": "pnpm run build && electron-builder --publish always --linux",
|
||||
"publish:linux-arm64": "pnpm run build && electron-builder --publish always --linux --arm64",
|
||||
"publish:linux-arm64:beta": "pnpm run build && electron-builder --config electron-builder-beta.yml --publish always --linux --arm64",
|
||||
"publish:linux:beta": "pnpm run build && electron-builder --config electron-builder-beta.yml --publish always --linux",
|
||||
"publish:mac": "pnpm run build && electron-builder --publish always --mac",
|
||||
"publish:mac:beta": "pnpm run build && electron-builder --config electron-builder-beta.yml --publish always --mac",
|
||||
"publish:win": "pnpm run build && electron-builder --publish always --win",
|
||||
"publish:win:beta": "pnpm run build && electron-builder --config electron-builder-beta.yml --publish always --win",
|
||||
"start": "electron-vite preview",
|
||||
"typecheck": "pnpm run typecheck:node && pnpm run typecheck:web",
|
||||
"typecheck:node": "tsc --noEmit -p tsconfig.node.json --composite false",
|
||||
"typecheck:web": "tsc --noEmit -p tsconfig.web.json --composite false"
|
||||
},
|
||||
"dependencies": {
|
||||
"@ag-grid-community/client-side-row-model": "^28.2.1",
|
||||
@@ -294,33 +63,39 @@
|
||||
"@ag-grid-community/infinite-row-model": "^28.2.1",
|
||||
"@ag-grid-community/react": "^28.2.1",
|
||||
"@ag-grid-community/styles": "^28.2.1",
|
||||
"@emotion/react": "^11.10.4",
|
||||
"@mantine/core": "^6.0.17",
|
||||
"@mantine/dates": "^6.0.17",
|
||||
"@mantine/form": "^6.0.17",
|
||||
"@mantine/hooks": "^6.0.17",
|
||||
"@mantine/modals": "^6.0.17",
|
||||
"@mantine/notifications": "^6.0.17",
|
||||
"@mantine/utils": "^6.0.17",
|
||||
"@atlaskit/pragmatic-drag-and-drop": "1.4.0",
|
||||
"@atlaskit/pragmatic-drag-and-drop-auto-scroll": "^2.1.0",
|
||||
"@atlaskit/pragmatic-drag-and-drop-hitbox": "^1.0.3",
|
||||
"@electron-toolkit/preload": "^3.0.1",
|
||||
"@electron-toolkit/utils": "^4.0.0",
|
||||
"@mantine/colors-generator": "^8.2.8",
|
||||
"@mantine/core": "^8.2.8",
|
||||
"@mantine/dates": "^8.2.8",
|
||||
"@mantine/form": "^8.2.8",
|
||||
"@mantine/hooks": "^8.2.8",
|
||||
"@mantine/modals": "^8.2.8",
|
||||
"@mantine/notifications": "^8.2.8",
|
||||
"@tanstack/react-query": "^4.32.1",
|
||||
"@tanstack/react-query-devtools": "^4.32.1",
|
||||
"@tanstack/react-query-persist-client": "^4.32.1",
|
||||
"@ts-rest/core": "^3.23.0",
|
||||
"@xhayper/discord-rpc": "^1.0.24",
|
||||
"axios": "^1.6.0",
|
||||
"@xhayper/discord-rpc": "^1.3.0",
|
||||
"audiomotion-analyzer": "^4.5.0",
|
||||
"auto-text-size": "^0.2.3",
|
||||
"axios": "^1.12.0",
|
||||
"cheerio": "^1.0.0",
|
||||
"clsx": "^2.0.0",
|
||||
"cmdk": "^0.2.0",
|
||||
"dayjs": "^1.11.6",
|
||||
"dompurify": "^3.1.6",
|
||||
"electron-debug": "^3.2.0",
|
||||
"electron-localshortcut": "^3.2.1",
|
||||
"electron-log": "^5.1.1",
|
||||
"electron-store": "^8.1.0",
|
||||
"electron-updater": "^4.6.5",
|
||||
"electron-updater": "^6.3.9",
|
||||
"fast-average-color": "^9.3.0",
|
||||
"format-duration": "^2.0.0",
|
||||
"framer-motion": "^10.13.0",
|
||||
"fuse.js": "^6.6.2",
|
||||
"history": "^5.3.0",
|
||||
"i18next": "^21.10.0",
|
||||
"idb-keyval": "^6.2.1",
|
||||
"immer": "^9.0.21",
|
||||
@@ -328,41 +103,82 @@
|
||||
"lodash": "^4.17.21",
|
||||
"md5": "^2.3.0",
|
||||
"memoize-one": "^6.0.0",
|
||||
"motion": "^12.18.1",
|
||||
"mpris-service": "^2.1.2",
|
||||
"nanoid": "^3.3.3",
|
||||
"net": "^1.0.2",
|
||||
"node-mpv": "github:jeffvli/Node-MPV",
|
||||
"overlayscrollbars": "^2.2.1",
|
||||
"overlayscrollbars-react": "^0.5.1",
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.2.0",
|
||||
"node-mpv": "github:jeffvli/Node-MPV#32b4d64395289ad710c41d481d2707a7acfc228f",
|
||||
"overlayscrollbars": "^2.11.1",
|
||||
"overlayscrollbars-react": "^0.5.6",
|
||||
"qs": "^6.14.0",
|
||||
"react": "^19.1.0",
|
||||
"react-dom": "^19.1.0",
|
||||
"react-error-boundary": "^3.1.4",
|
||||
"react-i18next": "^11.18.6",
|
||||
"react-icons": "^4.10.1",
|
||||
"react-icons": "^5.5.0",
|
||||
"react-image": "^4.1.0",
|
||||
"react-intersection-observer": "^9.16.0",
|
||||
"react-loading-skeleton": "^3.5.0",
|
||||
"react-player": "^2.11.0",
|
||||
"react-router": "^6.16.0",
|
||||
"react-router-dom": "^6.16.0",
|
||||
"react-simple-img": "^3.0.0",
|
||||
"react-virtualized-auto-sizer": "^1.0.17",
|
||||
"react-window": "^1.8.9",
|
||||
"react-window-infinite-loader": "^1.0.9",
|
||||
"semver": "^7.5.4",
|
||||
"styled-components": "^6.0.8",
|
||||
"swiper": "^9.3.1",
|
||||
"use-sync-external-store": "^1.5.0",
|
||||
"ws": "^8.18.2",
|
||||
"zod": "^3.22.3",
|
||||
"zustand": "^4.3.9"
|
||||
"zustand": "^5.0.5"
|
||||
},
|
||||
"resolutions": {
|
||||
"styled-components": "^6"
|
||||
"devDependencies": {
|
||||
"@electron-toolkit/eslint-config-prettier": "^3.0.0",
|
||||
"@electron-toolkit/eslint-config-ts": "^3.0.0",
|
||||
"@electron-toolkit/tsconfig": "^1.0.1",
|
||||
"@types/electron-localshortcut": "^3.1.0",
|
||||
"@types/lodash": "^4.17.18",
|
||||
"@types/md5": "^2.3.5",
|
||||
"@types/node": "^22.15.32",
|
||||
"@types/react": "^18.3.23",
|
||||
"@types/react-dom": "^18.3.7",
|
||||
"@types/react-window": "^1.8.5",
|
||||
"@types/react-window-infinite-loader": "^1.0.6",
|
||||
"@types/source-map-support": "^0.5.10",
|
||||
"@types/ws": "^8.18.1",
|
||||
"@vitejs/plugin-react": "^4.3.4",
|
||||
"concurrently": "^7.1.0",
|
||||
"cross-env": "^7.0.3",
|
||||
"electron": "^37.4.0",
|
||||
"electron-builder": "^26.0.12",
|
||||
"electron-devtools-installer": "^3.2.0",
|
||||
"electron-vite": "^3.1.0",
|
||||
"eslint": "^9.24.0",
|
||||
"eslint-plugin-perfectionist": "^4.13.0",
|
||||
"eslint-plugin-prettier": "^5.4.0",
|
||||
"eslint-plugin-react": "^7.37.5",
|
||||
"eslint-plugin-react-hooks": "^5.2.0",
|
||||
"eslint-plugin-react-refresh": "^0.4.19",
|
||||
"i18next-parser": "^9.0.2",
|
||||
"postcss-preset-mantine": "^1.17.0",
|
||||
"prettier": "^3.5.3",
|
||||
"prettier-plugin-packagejson": "^2.5.14",
|
||||
"sass-embedded": "^1.89.0",
|
||||
"stylelint": "^16.14.1",
|
||||
"stylelint-config-css-modules": "^4.4.0",
|
||||
"stylelint-config-recess-order": "^7.1.0",
|
||||
"stylelint-config-standard": "^38.0.0",
|
||||
"typescript": "^5.8.3",
|
||||
"vite": "^6.3.6",
|
||||
"vite-plugin-conditional-import": "^0.1.7",
|
||||
"vite-plugin-dynamic-import": "^1.6.0",
|
||||
"vite-plugin-ejs": "^1.7.0",
|
||||
"vite-plugin-pwa": "^1.0.3"
|
||||
},
|
||||
"devEngines": {
|
||||
"node": ">=14.x",
|
||||
"npm": ">=7.x"
|
||||
},
|
||||
"browserslist": [],
|
||||
"electronmon": {
|
||||
"patterns": [
|
||||
"!server",
|
||||
"!src/renderer"
|
||||
"pnpm": {
|
||||
"onlyBuiltDependencies": [
|
||||
"electron",
|
||||
"esbuild"
|
||||
]
|
||||
}
|
||||
},
|
||||
"productName": "feishin"
|
||||
}
|
||||
|
||||
Generated
+11744
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,5 @@
|
||||
module.exports = {
|
||||
plugins: {
|
||||
'postcss-preset-mantine': {},
|
||||
},
|
||||
};
|
||||
Generated
-2330
File diff suppressed because it is too large
Load Diff
@@ -1,24 +0,0 @@
|
||||
{
|
||||
"name": "feishin",
|
||||
"version": "0.6.0",
|
||||
"description": "",
|
||||
"main": "./dist/main/main.js",
|
||||
"author": {
|
||||
"name": "jeffvli",
|
||||
"url": "https://github.com/jeffvli/"
|
||||
},
|
||||
"scripts": {
|
||||
"electron-rebuild": "node -r ts-node/register ../../.erb/scripts/electron-rebuild.js",
|
||||
"link-modules": "node -r ts-node/register ../../.erb/scripts/link-modules.ts",
|
||||
"postinstall": "npm run electron-rebuild && npm run link-modules"
|
||||
},
|
||||
"dependencies": {
|
||||
"cheerio": "^1.0.0-rc.12",
|
||||
"mpris-service": "^2.1.2",
|
||||
"ws": "^8.13.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"electron": "25.8.4"
|
||||
},
|
||||
"license": "GPL-3.0"
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
import react from '@vitejs/plugin-react';
|
||||
import path from 'path';
|
||||
import { defineConfig, normalizePath } from 'vite';
|
||||
import { ViteEjsPlugin } from 'vite-plugin-ejs';
|
||||
|
||||
import { version } from './package.json';
|
||||
|
||||
export default defineConfig({
|
||||
build: {
|
||||
emptyOutDir: true,
|
||||
outDir: path.resolve(__dirname, './out/remote'),
|
||||
rollupOptions: {
|
||||
input: {
|
||||
favicon: normalizePath(path.resolve(__dirname, './assets/icons/favicon.ico')),
|
||||
index: normalizePath(path.resolve(__dirname, './src/remote/index.html')),
|
||||
manifest: normalizePath(path.resolve(__dirname, './src/remote/manifest.json')),
|
||||
remote: normalizePath(path.resolve(__dirname, './src/remote/index.tsx')),
|
||||
worker: normalizePath(path.resolve(__dirname, './src/remote/service-worker.ts')),
|
||||
},
|
||||
output: {
|
||||
assetFileNames: '[name].[ext]',
|
||||
chunkFileNames: '[name].js',
|
||||
entryFileNames: '[name].js',
|
||||
},
|
||||
},
|
||||
sourcemap: true,
|
||||
},
|
||||
css: {
|
||||
modules: {
|
||||
generateScopedName: 'fs-[name]-[local]',
|
||||
localsConvention: 'camelCase',
|
||||
},
|
||||
},
|
||||
plugins: [
|
||||
react(),
|
||||
ViteEjsPlugin({
|
||||
prod: process.env.NODE_ENV === 'production',
|
||||
root: normalizePath(path.resolve(__dirname, './src/remote')),
|
||||
version,
|
||||
}),
|
||||
],
|
||||
resolve: {
|
||||
alias: {
|
||||
'/@/i18n': path.resolve(__dirname, './src/i18n'),
|
||||
'/@/remote': path.resolve(__dirname, './src/remote'),
|
||||
'/@/renderer': path.resolve(__dirname, './src/renderer'),
|
||||
'/@/shared': path.resolve(__dirname, './src/shared'),
|
||||
},
|
||||
},
|
||||
root: path.resolve(__dirname, './src/remote'),
|
||||
});
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 48 KiB |
@@ -1,9 +0,0 @@
|
||||
import '@testing-library/jest-dom';
|
||||
import { render } from '@testing-library/react';
|
||||
import { App } from '../renderer/app';
|
||||
|
||||
describe('App', () => {
|
||||
it('should render', () => {
|
||||
expect(render(<App />)).toBeTruthy();
|
||||
});
|
||||
});
|
||||
+110
-29
@@ -1,38 +1,65 @@
|
||||
import { PostProcessorModule, TOptions, StringMap } from 'i18next';
|
||||
import { PostProcessorModule, StringMap, TOptions } from 'i18next';
|
||||
import i18n from 'i18next';
|
||||
import { initReactI18next } from 'react-i18next';
|
||||
|
||||
import ar from './locales/ar.json';
|
||||
import ca from './locales/ca.json';
|
||||
import cs from './locales/cs.json';
|
||||
import de from './locales/de.json';
|
||||
import en from './locales/en.json';
|
||||
import es from './locales/es.json';
|
||||
import eu from './locales/eu.json';
|
||||
import fa from './locales/fa.json';
|
||||
import fi from './locales/fi.json';
|
||||
import fr from './locales/fr.json';
|
||||
import ja from './locales/ja.json';
|
||||
import pl from './locales/pl.json';
|
||||
import zhHans from './locales/zh-Hans.json';
|
||||
import de from './locales/de.json';
|
||||
import hu from './locales/hu.json';
|
||||
import id from './locales/id.json';
|
||||
import it from './locales/it.json';
|
||||
import ru from './locales/ru.json';
|
||||
import ptBr from './locales/pt-BR.json';
|
||||
import sr from './locales/sr.json';
|
||||
import sv from './locales/sv.json';
|
||||
import cs from './locales/cs.json';
|
||||
import ja from './locales/ja.json';
|
||||
import ko from './locales/ko.json';
|
||||
import nbNO from './locales/nb-NO.json';
|
||||
import nl from './locales/nl.json';
|
||||
import pl from './locales/pl.json';
|
||||
import ptBr from './locales/pt-BR.json';
|
||||
import pt from './locales/pt.json';
|
||||
import ru from './locales/ru.json';
|
||||
import sl from './locales/sl.json';
|
||||
import sr from './locales/sr.json';
|
||||
import sv from './locales/sv.json';
|
||||
import ta from './locales/ta.json';
|
||||
import tr from './locales/tr.json';
|
||||
import zhHans from './locales/zh-Hans.json';
|
||||
import zhHant from './locales/zh-Hant.json';
|
||||
|
||||
const resources = {
|
||||
ar: { translation: ar },
|
||||
ca: { translation: ca },
|
||||
cs: { translation: cs },
|
||||
de: { translation: de },
|
||||
en: { translation: en },
|
||||
es: { translation: es },
|
||||
de: { translation: de },
|
||||
it: { translation: it },
|
||||
ru: { translation: ru },
|
||||
'pt-BR': { translation: ptBr },
|
||||
eu: { translation: eu },
|
||||
fa: { translation: fa },
|
||||
fi: { translation: fi },
|
||||
fr: { translation: fr },
|
||||
hu: { translation: hu },
|
||||
id: { translation: id },
|
||||
it: { translation: it },
|
||||
ja: { translation: ja },
|
||||
ko: { translation: ko },
|
||||
'nb-NO': { translation: nbNO },
|
||||
nl: { translation: nl },
|
||||
pl: { translation: pl },
|
||||
'zh-Hans': { translation: zhHans },
|
||||
pt: { translation: pt },
|
||||
'pt-BR': { translation: ptBr },
|
||||
ru: { translation: ru },
|
||||
sl: { translation: sl },
|
||||
sr: { translation: sr },
|
||||
sv: { translation: sv },
|
||||
cs: { translation: cs },
|
||||
nl: { translation: nl },
|
||||
'nb-NO': { translation: nbNO },
|
||||
ta: { translation: ta },
|
||||
tr: { translation: tr },
|
||||
'zh-Hans': { translation: zhHans },
|
||||
'zh-Hant': { translation: zhHant },
|
||||
};
|
||||
|
||||
export const languages = [
|
||||
@@ -41,21 +68,45 @@ export const languages = [
|
||||
value: 'en',
|
||||
},
|
||||
{
|
||||
label: 'Čeština',
|
||||
value: 'cs',
|
||||
label: 'العربية',
|
||||
value: 'ar',
|
||||
},
|
||||
{
|
||||
label: 'Español',
|
||||
value: 'es',
|
||||
label: 'Català',
|
||||
value: 'ca',
|
||||
},
|
||||
{
|
||||
label: 'Čeština',
|
||||
value: 'cs',
|
||||
},
|
||||
{
|
||||
label: 'Deutsch',
|
||||
value: 'de',
|
||||
},
|
||||
{
|
||||
label: 'Español',
|
||||
value: 'es',
|
||||
},
|
||||
{
|
||||
label: 'Basque',
|
||||
value: 'eu',
|
||||
},
|
||||
{
|
||||
label: 'Français',
|
||||
value: 'fr',
|
||||
},
|
||||
{
|
||||
label: 'Bahasa Indonesia',
|
||||
value: 'id',
|
||||
},
|
||||
{
|
||||
label: 'Suomeksi',
|
||||
value: 'fi',
|
||||
},
|
||||
{
|
||||
label: 'Magyar',
|
||||
value: 'hu',
|
||||
},
|
||||
{
|
||||
label: 'Italiano',
|
||||
value: 'it',
|
||||
@@ -64,6 +115,10 @@ export const languages = [
|
||||
label: '日本語',
|
||||
value: 'ja',
|
||||
},
|
||||
{
|
||||
label: '한국어',
|
||||
value: 'ko',
|
||||
},
|
||||
{
|
||||
label: 'Nederlands',
|
||||
value: 'nl',
|
||||
@@ -72,7 +127,14 @@ export const languages = [
|
||||
label: 'Norsk (Bokmål)',
|
||||
value: 'nb-NO',
|
||||
},
|
||||
|
||||
{
|
||||
label: 'فارسی',
|
||||
value: 'fa',
|
||||
},
|
||||
{
|
||||
label: 'Português',
|
||||
value: 'pt',
|
||||
},
|
||||
{
|
||||
label: 'Português (Brasil)',
|
||||
value: 'pt-BR',
|
||||
@@ -85,6 +147,10 @@ export const languages = [
|
||||
label: 'Русский',
|
||||
value: 'ru',
|
||||
},
|
||||
{
|
||||
label: 'Slovenščina',
|
||||
value: 'sl',
|
||||
},
|
||||
{
|
||||
label: 'Srpski',
|
||||
value: 'sr',
|
||||
@@ -93,42 +159,53 @@ export const languages = [
|
||||
label: 'Svenska',
|
||||
value: 'sv',
|
||||
},
|
||||
{
|
||||
label: 'Tamil',
|
||||
value: 'ta',
|
||||
},
|
||||
{
|
||||
label: 'Türkçe',
|
||||
value: 'tr',
|
||||
},
|
||||
{
|
||||
label: '简体中文',
|
||||
value: 'zh-Hans',
|
||||
},
|
||||
{
|
||||
label: '繁體中文',
|
||||
value: 'zh-Hant',
|
||||
},
|
||||
];
|
||||
|
||||
const lowerCasePostProcessor: PostProcessorModule = {
|
||||
type: 'postProcessor',
|
||||
name: 'lowerCase',
|
||||
process: (value: string) => {
|
||||
return value.toLocaleLowerCase();
|
||||
},
|
||||
type: 'postProcessor',
|
||||
};
|
||||
|
||||
const upperCasePostProcessor: PostProcessorModule = {
|
||||
type: 'postProcessor',
|
||||
name: 'upperCase',
|
||||
process: (value: string) => {
|
||||
return value.toLocaleUpperCase();
|
||||
},
|
||||
type: 'postProcessor',
|
||||
};
|
||||
|
||||
const titleCasePostProcessor: PostProcessorModule = {
|
||||
type: 'postProcessor',
|
||||
name: 'titleCase',
|
||||
process: (value: string) => {
|
||||
return value.replace(/\S\S*/g, (txt) => {
|
||||
return txt.charAt(0).toLocaleUpperCase() + txt.slice(1).toLowerCase();
|
||||
});
|
||||
},
|
||||
type: 'postProcessor',
|
||||
};
|
||||
|
||||
const ignoreSentenceCaseLanguages = ['de']
|
||||
const ignoreSentenceCaseLanguages = ['de'];
|
||||
|
||||
const sentenceCasePostProcessor: PostProcessorModule = {
|
||||
type: 'postProcessor',
|
||||
name: 'sentenceCase',
|
||||
process: (value: string, _key: string, _options: TOptions<StringMap>, translator: any) => {
|
||||
const sentences = value.split('. ');
|
||||
@@ -136,11 +213,15 @@ const sentenceCasePostProcessor: PostProcessorModule = {
|
||||
return sentences
|
||||
.map((sentence) => {
|
||||
return (
|
||||
sentence.charAt(0).toLocaleUpperCase() + (!ignoreSentenceCaseLanguages.includes(translator.language) ? sentence.slice(1).toLocaleLowerCase() : sentence.slice(1))
|
||||
sentence.charAt(0).toLocaleUpperCase() +
|
||||
(!ignoreSentenceCaseLanguages.includes(translator.language)
|
||||
? sentence.slice(1).toLocaleLowerCase()
|
||||
: sentence.slice(1))
|
||||
);
|
||||
})
|
||||
.join('. ');
|
||||
},
|
||||
type: 'postProcessor',
|
||||
};
|
||||
i18n.use(lowerCasePostProcessor)
|
||||
.use(upperCasePostProcessor)
|
||||
|
||||
@@ -5,7 +5,9 @@ module.exports = {
|
||||
createOldCatalogs: true,
|
||||
customValueTemplate: null,
|
||||
defaultNamespace: 'translation',
|
||||
defaultValue: '',
|
||||
defaultValue: function (locale, namespace, key) {
|
||||
return key;
|
||||
},
|
||||
failOnUpdate: false,
|
||||
failOnWarnings: false,
|
||||
i18nextOptions: null,
|
||||
@@ -37,8 +39,6 @@ module.exports = {
|
||||
output: 'src/renderer/i18n/locales/$LOCALE.json',
|
||||
pluralSeparator: '_',
|
||||
resetDefaultValueLocale: 'en',
|
||||
skipDefaultValues: false,
|
||||
sort: true,
|
||||
useKeysAsDefaultValue: true,
|
||||
verbose: false,
|
||||
};
|
||||
|
||||
@@ -0,0 +1,149 @@
|
||||
{
|
||||
"action": {
|
||||
"addToFavorites": "إضافة الى $t(entity.favorite_other)",
|
||||
"addToPlaylist": "إضافة الى $t(entity.playlist_one)",
|
||||
"clearQueue": "مسح قائمة الإنتظار",
|
||||
"createPlaylist": "إنشاء $t(entity.playlist_one)",
|
||||
"deletePlaylist": "حذف $t(entity.playlist_one)",
|
||||
"deselectAll": "إلغاء تحديد الكل",
|
||||
"editPlaylist": "تعديل $t(entity.playlist_one)",
|
||||
"goToPage": "اذهب الى صفحة",
|
||||
"moveToNext": "الذهاب الى التالي",
|
||||
"moveToBottom": "الذهاب الى الأسفل",
|
||||
"moveToTop": "الذهاب الى الأعلى",
|
||||
"refresh": "$t(common.refresh)",
|
||||
"removeFromFavorites": "حذف من $t(entity.favorite_other)",
|
||||
"removeFromPlaylist": "حذف من $t(entity.playlist_one)",
|
||||
"removeFromQueue": "حذف من قائمة الإنتظار",
|
||||
"setRating": "تحديد التقييم",
|
||||
"toggleSmartPlaylistEditor": "تشغيل / إطفاء وضع التعديل لـ $t(entity.smartPlaylist)",
|
||||
"viewPlaylists": "إظهار $t(entity.playlist_other)",
|
||||
"openIn": {
|
||||
"lastfm": "فتح في Last.fm",
|
||||
"musicbrainz": "فتح في MusicBrainz"
|
||||
}
|
||||
},
|
||||
"common": {
|
||||
"action_zero": "عملية",
|
||||
"action_one": "عملية",
|
||||
"action_two": "عمليتين",
|
||||
"action_few": "عمليات",
|
||||
"action_many": "عمليات",
|
||||
"action_other": "عمليات",
|
||||
"add": "إضافة",
|
||||
"additionalParticipants": "مشاركين إضافيين",
|
||||
"newVersion": "تم تثبيت تحديث جديد {{version}}",
|
||||
"viewReleaseNotes": "عرض معلومات الإصدار",
|
||||
"albumGain": "مستوى صوت الألبوم",
|
||||
"albumPeak": "اعلى مستوى للألبوم",
|
||||
"areYouSure": "هل أنت متأكد؟",
|
||||
"ascending": "تصاعدي",
|
||||
"backward": "خلف",
|
||||
"biography": "سيرة",
|
||||
"bitDepth": "عمق البت",
|
||||
"bitrate": "معدل البت (البت ريت)",
|
||||
"bpm": "نبضة في الدقيقة",
|
||||
"cancel": "إلغاء",
|
||||
"center": "منتصف",
|
||||
"channel_zero": "قناة",
|
||||
"channel_one": "قناة",
|
||||
"channel_two": "قناتين",
|
||||
"channel_few": "قنوات",
|
||||
"channel_many": "قنوات",
|
||||
"channel_other": "قنوات",
|
||||
"clear": "مسح",
|
||||
"close": "إغلاق",
|
||||
"codec": "كوديك",
|
||||
"collapse": "طي",
|
||||
"comingSoon": "قريبًا…",
|
||||
"configure": "تعديل",
|
||||
"confirm": "تأكيد",
|
||||
"create": "إنشاء",
|
||||
"currentSong": "$t(entity.track_one) الحالي",
|
||||
"decrease": "تنقيص",
|
||||
"delete": "حذف",
|
||||
"descending": "تنازلي",
|
||||
"description": "وصف",
|
||||
"disable": "تعطيل",
|
||||
"disc": "قرص",
|
||||
"dismiss": "إخفاء",
|
||||
"duration": "مدة",
|
||||
"edit": "تعديل",
|
||||
"enable": "تفعيل",
|
||||
"expand": "توسيع",
|
||||
"favorite": "مفضلة",
|
||||
"filter_zero": "فلتر",
|
||||
"filter_one": "فلتر",
|
||||
"filter_two": "فلاتر",
|
||||
"filter_few": "فلاتر",
|
||||
"filter_many": "فلاتر",
|
||||
"filter_other": "فلاتر",
|
||||
"filters": "فلاتر",
|
||||
"forceRestartRequired": "اعد التشغيل لتطبيق التعديلات... اغلق التنبية لإعادة التشغيل",
|
||||
"forward": "امام",
|
||||
"gap": "فجوة",
|
||||
"home": "الرئيسية",
|
||||
"increase": "زيادة",
|
||||
"left": "يسار",
|
||||
"limit": "حد",
|
||||
"manage": "إدارة",
|
||||
"maximize": "تكبير",
|
||||
"menu": "القائمة",
|
||||
"minimize": "تصغير",
|
||||
"modified": "تم تعديله",
|
||||
"mbid": "معرف MusicBrainz",
|
||||
"name": "إسم",
|
||||
"no": "لا",
|
||||
"none": "لا شي",
|
||||
"noResultsFromQuery": "لا توجد نتائج",
|
||||
"note": "ملاحظة",
|
||||
"ok": "نعم",
|
||||
"owner": "المالك",
|
||||
"path": "المسار",
|
||||
"playerMustBePaused": "يجب إيقاف المشغل",
|
||||
"preview": "معاينة",
|
||||
"previousSong": "$t(entity.track_one) السابق",
|
||||
"quit": "خروج",
|
||||
"random": "عشوائي",
|
||||
"rating": "التقييم",
|
||||
"refresh": "تحديث",
|
||||
"reload": "تحديث",
|
||||
"reset": "إعادة تعيين",
|
||||
"resetToDefault": "إعادة تعيين الى الافتراضي",
|
||||
"restartRequired": "يجب إعادة التشغيل",
|
||||
"right": "يمين",
|
||||
"sampleRate": "معدل العينة (sample rate)",
|
||||
"save": "حفظ",
|
||||
"saveAndReplace": "حفظ واستبدال",
|
||||
"saveAs": "حفظ بإسم",
|
||||
"search": "بحث",
|
||||
"setting": "إعداد",
|
||||
"share": "نشر",
|
||||
"size": "حجم",
|
||||
"sortOrder": "الترتيب",
|
||||
"tags": "العلامات",
|
||||
"title": "العنوان",
|
||||
"trackNumber": "رقم المسار",
|
||||
"trackGain": "مستوى صوت المسار",
|
||||
"trackPeak": "اعلى مستوى للمسار",
|
||||
"translation": "الترجمة",
|
||||
"unknown": "غير معروف",
|
||||
"version": "الإصدار",
|
||||
"year": "السنة",
|
||||
"yes": "نعم"
|
||||
},
|
||||
"entity": {
|
||||
"album_zero": "الالبوم",
|
||||
"album_one": "الالبوم",
|
||||
"album_two": "الالبومين",
|
||||
"album_few": "الالبومات",
|
||||
"album_many": "الالبومات",
|
||||
"album_other": "الالبومات",
|
||||
"albumArtist_zero": "فنان الالبوم",
|
||||
"albumArtist_one": "فنان الالبوم",
|
||||
"albumArtist_two": "فنان الالبومين",
|
||||
"albumArtist_few": "فنان الالبومات",
|
||||
"albumArtist_many": "فنان الالبومات",
|
||||
"albumArtist_other": "فنان الالبومات"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,848 @@
|
||||
{
|
||||
"page": {
|
||||
"sidebar": {
|
||||
"myLibrary": "La meva llibreria",
|
||||
"albumArtists": "$t(entity.albumArtist_other)",
|
||||
"albums": "$t(entity.album_other)",
|
||||
"artists": "$t(entity.artist_other)",
|
||||
"folders": "$t(entity.folder_other)",
|
||||
"genres": "$t(entity.genre_other)",
|
||||
"home": "$t(common.home)",
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"search": "$t(common.search)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"tracks": "$t(entity.track_other)",
|
||||
"nowPlaying": "ara sona",
|
||||
"shared": "$t(entity.playlist_other) compartida"
|
||||
},
|
||||
"albumArtistDetail": {
|
||||
"relatedArtists": "$t(entity.artist_other) similars",
|
||||
"viewAllTracks": "veure totes les $t(entity.track_other)",
|
||||
"about": "Sobre {{artist}}",
|
||||
"appearsOn": "apareix a",
|
||||
"recentReleases": "Llançaments recents",
|
||||
"viewDiscography": "Mosta la discografia",
|
||||
"topSongs": "millors cançons",
|
||||
"topSongsFrom": "les millors cançons de {{title}}",
|
||||
"viewAll": "mostra-ho tot"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "més d'aquest $t(entity.artist_one)",
|
||||
"moreFromGeneric": "més de {{item}}",
|
||||
"released": "publicat"
|
||||
},
|
||||
"albumList": {
|
||||
"title": "$t(entity.album_other)",
|
||||
"artistAlbums": "àlbums de {{artist}}",
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)"
|
||||
},
|
||||
"appMenu": {
|
||||
"quit": "$t(common.quit)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"goBack": "torna enrere",
|
||||
"goForward": "avança",
|
||||
"collapseSidebar": "replega la barra lateral",
|
||||
"expandSidebar": "expandeix la barra lateral",
|
||||
"manageServers": "gestionar servidors",
|
||||
"selectServer": "seleccionar servidor",
|
||||
"version": "versió {{version}}",
|
||||
"openBrowserDevtools": "obre les eines de desenvolupament del navegador",
|
||||
"privateModeOff": "desactiva el mode privat",
|
||||
"privateModeOn": "activa el mode privat"
|
||||
},
|
||||
"contextMenu": {
|
||||
"addFavorite": "$t(action.addToFavorites)",
|
||||
"addLast": "$t(player.addLast)",
|
||||
"addNext": "$t(player.addNext)",
|
||||
"addToFavorites": "$t(action.addToFavorites)",
|
||||
"addToPlaylist": "$t(action.addToPlaylist)",
|
||||
"createPlaylist": "$t(action.createPlaylist)",
|
||||
"deletePlaylist": "$t(action.deletePlaylist)",
|
||||
"deselectAll": "$t(action.deselectAll)",
|
||||
"moveToNext": "$t(action.moveToNext)",
|
||||
"moveToBottom": "$t(action.moveToBottom)",
|
||||
"moveToTop": "$t(action.moveToTop)",
|
||||
"play": "$t(player.play)",
|
||||
"playSimilarSongs": "$t(player.playSimilarSongs)",
|
||||
"removeFromFavorites": "$t(action.removeFromFavorites)",
|
||||
"removeFromPlaylist": "$t(action.removeFromPlaylist)",
|
||||
"removeFromQueue": "$t(action.removeFromQueue)",
|
||||
"setRating": "$t(action.setRating)",
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"download": "descarregar",
|
||||
"showDetails": "informació",
|
||||
"numberSelected": "{{count}} seleccionat",
|
||||
"shareItem": "comparteix l'element",
|
||||
"goToAlbumArtist": "Ves a $t(entity.albumArtist_one)",
|
||||
"goToAlbum": "ves a $t(entity.album_one)"
|
||||
},
|
||||
"genreList": {
|
||||
"title": "$t(entity.genre_other)",
|
||||
"showAlbums": "mostra $t(entity.album_other) $t(entity.genre_one)",
|
||||
"showTracks": "mostra $t(entity.track_other) $t(entity.genre_one)"
|
||||
},
|
||||
"home": {
|
||||
"title": "$t(common.home)",
|
||||
"explore": "explora la teva biblioteca",
|
||||
"newlyAdded": "afegits recentment",
|
||||
"mostPlayed": "els més reproduïts",
|
||||
"recentlyPlayed": "reproduït recentment",
|
||||
"recentlyReleased": "estrenat fa poc"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist_other)"
|
||||
},
|
||||
"trackList": {
|
||||
"title": "$t(entity.track_other)",
|
||||
"artistTracks": "pistes de {{artist}}",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track_other)"
|
||||
},
|
||||
"manageServers": {
|
||||
"username": "nom d'usuari",
|
||||
"title": "gestionar servidors",
|
||||
"serverDetails": "detalls del servidor",
|
||||
"editServerDetailsTooltip": "editar els detalls del servidor",
|
||||
"removeServer": "eliminar el servidor",
|
||||
"url": "URL"
|
||||
},
|
||||
"fullscreenPlayer": {
|
||||
"config": {
|
||||
"opacity": "opacitat",
|
||||
"synchronized": "sincronitzat",
|
||||
"unsynchronized": "no sincronitzat",
|
||||
"useImageAspectRatio": "utilitza la relació d'aspecte de la imatge",
|
||||
"dynamicBackground": "fons dinàmic",
|
||||
"dynamicIsImage": "activar la imatge de fons",
|
||||
"followCurrentLyric": "seguir la lletra actual",
|
||||
"lyricAlignment": "alineació de la lletra",
|
||||
"lyricSize": "tamany de la lletra",
|
||||
"dynamicImageBlur": "mida del desenfocament de la imatge",
|
||||
"lyricOffset": "demora de la lletra (ms)",
|
||||
"showLyricMatch": "mosta coincidències de lletres",
|
||||
"showLyricProvider": "mostra el proveïdor de la lletra",
|
||||
"lyricGap": "espera entre lletres"
|
||||
},
|
||||
"lyrics": "lletres",
|
||||
"visualizer": "visualitzador",
|
||||
"noLyrics": "no s'ha trobat cap lletra",
|
||||
"related": "relacionat",
|
||||
"upNext": "a continuació"
|
||||
},
|
||||
"setting": {
|
||||
"advanced": "avançat",
|
||||
"generalTab": "general",
|
||||
"hotkeysTab": "tecles d'accés ràpid",
|
||||
"playbackTab": "reproducció",
|
||||
"windowTab": "finestra"
|
||||
},
|
||||
"globalSearch": {
|
||||
"commands": {
|
||||
"goToPage": "anar a la pàgina",
|
||||
"searchFor": "cerca {{query}}",
|
||||
"serverCommands": "ordres del servidor"
|
||||
},
|
||||
"title": "ordres"
|
||||
},
|
||||
"itemDetail": {
|
||||
"copyPath": "copia ruta al porta-retalls",
|
||||
"copiedPath": "ruta copiada correctament",
|
||||
"openFile": "mostra la pista al gestor d'arxius"
|
||||
},
|
||||
"playlist": {
|
||||
"reorder": "el reordenament només s'activa quan s'ordena per id"
|
||||
}
|
||||
},
|
||||
"common": {
|
||||
"home": "inici",
|
||||
"year": "any",
|
||||
"add": "afegir",
|
||||
"ascending": "ascendent",
|
||||
"biography": "biografia",
|
||||
"bitrate": "taxa de bits",
|
||||
"bpm": "bpm",
|
||||
"cancel": "cancel·lar",
|
||||
"center": "centrar",
|
||||
"close": "tancar",
|
||||
"codec": "còdec",
|
||||
"configure": "configurar",
|
||||
"confirm": "confirmar",
|
||||
"create": "crear",
|
||||
"decrease": "disminuir",
|
||||
"delete": "eliminar",
|
||||
"descending": "descendent",
|
||||
"description": "descripció",
|
||||
"disable": "desactivar",
|
||||
"disc": "disc",
|
||||
"dismiss": "descartar",
|
||||
"duration": "duració",
|
||||
"edit": "editar",
|
||||
"enable": "activar",
|
||||
"expand": "expandir",
|
||||
"filters": "filtres",
|
||||
"increase": "incrementar",
|
||||
"left": "esquerra",
|
||||
"maximize": "maximitzar",
|
||||
"menu": "menú",
|
||||
"minimize": "minimitzar",
|
||||
"modified": "modificació",
|
||||
"name": "nom",
|
||||
"no": "no",
|
||||
"none": "cap",
|
||||
"note": "nota",
|
||||
"ok": "bé",
|
||||
"preview": "vista prèvia",
|
||||
"quit": "sortir",
|
||||
"random": "aleatori",
|
||||
"rating": "valoració",
|
||||
"reload": "torna a carregar",
|
||||
"reset": "restablir",
|
||||
"right": "dreta",
|
||||
"save": "desar",
|
||||
"search": "cercar",
|
||||
"share": "compartir",
|
||||
"size": "mida",
|
||||
"sortOrder": "ordenar",
|
||||
"tags": "etiquetes",
|
||||
"title": "títol",
|
||||
"translation": "traducció",
|
||||
"unknown": "desconegut",
|
||||
"version": "versió",
|
||||
"yes": "sí",
|
||||
"additionalParticipants": "participants addicionals",
|
||||
"channel_one": "canal",
|
||||
"channel_many": "canals",
|
||||
"channel_other": "canals",
|
||||
"filter_one": "filtre",
|
||||
"filter_many": "filtres",
|
||||
"filter_other": "filtres",
|
||||
"saveAs": "desar com",
|
||||
"action_one": "acció",
|
||||
"action_many": "accions",
|
||||
"action_other": "accions",
|
||||
"newVersion": "s'ha instal·lat una nova versió ({{version}})",
|
||||
"viewReleaseNotes": "veure les notes de la versió",
|
||||
"currentSong": "$t(entity.track_one) actual",
|
||||
"limit": "límit",
|
||||
"previousSong": "$t(entity.track_one) anterior",
|
||||
"trackNumber": "pista",
|
||||
"albumGain": "guany de l'àlbum",
|
||||
"albumPeak": "pic de l'àlbum",
|
||||
"areYouSure": "estàs segur?",
|
||||
"backward": "enrere",
|
||||
"clear": "neteja",
|
||||
"collapse": "col·lapsa",
|
||||
"comingSoon": "aviat disponible…",
|
||||
"favorite": "preferit",
|
||||
"forceRestartRequired": "reinicia per aplicar els canvis… tanca la notificació per reiniciar",
|
||||
"owner": "propietari",
|
||||
"refresh": "actualitzar",
|
||||
"resetToDefault": "restablir els valors predeterminats",
|
||||
"saveAndReplace": "desar i substituir",
|
||||
"bitDepth": "profunditat de bits",
|
||||
"forward": "endavant",
|
||||
"manage": "gestiona",
|
||||
"mbid": "ID de MusicBrainz",
|
||||
"noResultsFromQuery": "la petició no ha produït resultats",
|
||||
"path": "ruta",
|
||||
"playerMustBePaused": "cal pausar el reproductor",
|
||||
"restartRequired": "cal reiniciar",
|
||||
"sampleRate": "freqüència de mostreig",
|
||||
"setting": "configuració",
|
||||
"trackGain": "guany de pista",
|
||||
"trackPeak": "pic de pista",
|
||||
"gap": "espera"
|
||||
},
|
||||
"entity": {
|
||||
"album_one": "àlbum",
|
||||
"album_many": "àlbums",
|
||||
"album_other": "àlbums",
|
||||
"albumWithCount_one": "{{count}} àlbum",
|
||||
"albumWithCount_many": "{{count}} àlbums",
|
||||
"albumWithCount_other": "{{count}} àlbums",
|
||||
"albumArtist_one": "artista de l'àlbum",
|
||||
"albumArtist_many": "artistes de l'àlbum",
|
||||
"albumArtist_other": "artistes de l'àlbum",
|
||||
"albumArtistCount_one": "{{count}} artista de l'àlbum",
|
||||
"albumArtistCount_many": "{{count}} artistes de l'àlbum",
|
||||
"albumArtistCount_other": "{{count}} artistes de l'àlbum",
|
||||
"artist_one": "artista",
|
||||
"artist_many": "artistes",
|
||||
"artist_other": "artistes",
|
||||
"artistWithCount_one": "{{count}} artista",
|
||||
"artistWithCount_many": "{{count}} artistes",
|
||||
"artistWithCount_other": "{{count}} artistes",
|
||||
"playlist_one": "llista de reproducció",
|
||||
"playlist_many": "llistes de reproducció",
|
||||
"playlist_other": "llistes de reproducció",
|
||||
"playlistWithCount_one": "{{count}} llista de reproducció",
|
||||
"playlistWithCount_many": "{{count}} llistes de reproducció",
|
||||
"playlistWithCount_other": "{{count}} llistes de reproducció",
|
||||
"smartPlaylist": "$t(entity.playlist_one) intel·ligent",
|
||||
"play_one": "{{count}} reproducció",
|
||||
"play_many": "{{count}} reproduccions",
|
||||
"play_other": "{{count}} reproduccions",
|
||||
"folderWithCount_one": "{{count}} carpeta",
|
||||
"folderWithCount_many": "{{count}} carpetes",
|
||||
"folderWithCount_other": "{{count}} carpetes",
|
||||
"genreWithCount_one": "{{count}} gènere",
|
||||
"genreWithCount_many": "{{count}} gèneres",
|
||||
"genreWithCount_other": "{{count}} gèneres",
|
||||
"track_one": "pista",
|
||||
"track_many": "pistes",
|
||||
"track_other": "pistes",
|
||||
"trackWithCount_one": "{{count}} pista",
|
||||
"trackWithCount_many": "{{count}} pistes",
|
||||
"trackWithCount_other": "{{count}} pistes",
|
||||
"folder_one": "carpeta",
|
||||
"folder_many": "carpetes",
|
||||
"folder_other": "carpetes",
|
||||
"genre_one": "gènere",
|
||||
"genre_many": "gèneres",
|
||||
"genre_other": "gèneres",
|
||||
"song_one": "cançó",
|
||||
"song_many": "cançons",
|
||||
"song_other": "cançons",
|
||||
"favorite_one": "preferit",
|
||||
"favorite_many": "preferits",
|
||||
"favorite_other": "preferits"
|
||||
},
|
||||
"form": {
|
||||
"addToPlaylist": {
|
||||
"input_playlists": "$t(entity.playlist_other)",
|
||||
"title": "afegir a una $t(entity.playlist_one)",
|
||||
"input_skipDuplicates": "salta't els duplicats",
|
||||
"success": "s'ha afegit $t(entity.trackWithCount, {\"count\": {{message}} }) a $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })"
|
||||
},
|
||||
"createPlaylist": {
|
||||
"input_description": "$t(common.description)",
|
||||
"input_name": "$t(common.name)",
|
||||
"input_owner": "$t(common.owner)",
|
||||
"success": "$t(entity.playlist_one) s'ha creat amb èxit",
|
||||
"title": "crear una $t(entity.playlist_one)",
|
||||
"input_public": "públic"
|
||||
},
|
||||
"deletePlaylist": {
|
||||
"success": "$t(entity.playlist_one) s'ha eliminat amb èxit",
|
||||
"title": "elimina la $t(entity.playlist_one)",
|
||||
"input_confirm": "escriviu el nom de la $t(entity.playlist_one) per confirmar"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"success": "$t(entity.playlist_one) s'ha actualitzat amb èxit",
|
||||
"title": "editar la $t(entity.playlist_one)",
|
||||
"publicJellyfinNote": "Per algun motiu, Jellyfin no exposa si una llista de reproducció és pública o no. Si voleu que es mantingui pública, seleccioneu la següent entrada"
|
||||
},
|
||||
"lyricSearch": {
|
||||
"input_artist": "$t(entity.artist_one)",
|
||||
"input_name": "$t(common.name)",
|
||||
"title": "cerca de lletres"
|
||||
},
|
||||
"addServer": {
|
||||
"input_password": "contrasenya",
|
||||
"input_username": "nom d'usuari",
|
||||
"error_savePassword": "hi ha hagut un error en intentar desar la contrasenya",
|
||||
"ignoreCors": "ignora el cors ($t(common.restartRequired))",
|
||||
"ignoreSsl": "ignora l'ssl ($t(common.restartRequired))",
|
||||
"input_legacyAuthentication": "activa l'autenticació antiga",
|
||||
"input_name": "nom del servidor",
|
||||
"input_savePassword": "desa la contrasenya",
|
||||
"input_url": "url",
|
||||
"success": "servidor afegit correctament",
|
||||
"title": "afegeix un servidor",
|
||||
"input_preferInstantMix": "prefereix el mix instantani",
|
||||
"input_preferInstantMixDescription": "utilitza només el mix instantani per obtenir cançons similars. útil si teniu complements que modifiquin aquest comportament"
|
||||
},
|
||||
"shareItem": {
|
||||
"description": "descripció",
|
||||
"allowDownloading": "permetre descàrrega",
|
||||
"setExpiration": "estableix expiració",
|
||||
"success": "s'ha copiat l'enllaç de compartició al porta-retalls (o feu clic aquí per obrir-lo)",
|
||||
"expireInvalid": "la data d'expiració ha de ser al futur",
|
||||
"createFailed": "no s'ha pogut crear el recurs compartit (està habilitat, l'ús compartit?)"
|
||||
},
|
||||
"updateServer": {
|
||||
"success": "s'ha actualitzat el servidor amb èxit",
|
||||
"title": "actualitzar el servidor"
|
||||
},
|
||||
"queryEditor": {
|
||||
"title": "editor de consultes",
|
||||
"input_optionMatchAll": "coincidències totals",
|
||||
"input_optionMatchAny": "coincidències parcials"
|
||||
},
|
||||
"privateMode": {
|
||||
"enabled": "mode privat actiu; l'estat de reproducció ara està ocult d'integracions externes",
|
||||
"disabled": "mode privat inactiu; l'estat de reproducció ara és visible per les integracions externes",
|
||||
"title": "mode privat"
|
||||
}
|
||||
},
|
||||
"action": {
|
||||
"addToFavorites": "afegir als $t(entity.favorite_other)",
|
||||
"addToPlaylist": "afegir a $t(entity.playlist_one)",
|
||||
"createPlaylist": "crear $t(entity.playlist_one)",
|
||||
"deletePlaylist": "elimina la $t(entity.playlist_one)",
|
||||
"editPlaylist": "edita la $t(entity.playlist_one)",
|
||||
"refresh": "$t(common.refresh)",
|
||||
"removeFromFavorites": "elimina dels $t(entity.favorite_other)",
|
||||
"removeFromPlaylist": "elimina de $t(entity.playlist_one)",
|
||||
"clearQueue": "buidar la cua",
|
||||
"removeFromQueue": "treure de la cua",
|
||||
"goToPage": "anar a la pàgina",
|
||||
"openIn": {
|
||||
"lastfm": "Obrir a Last.fm",
|
||||
"musicbrainz": "Obrir a MusicBrainz"
|
||||
},
|
||||
"deselectAll": "deselecciona-ho tot",
|
||||
"viewPlaylists": "veure$t(entity.playlist_other)",
|
||||
"moveToNext": "passar al següent",
|
||||
"moveToBottom": "anar al final",
|
||||
"moveToTop": "anar al principi",
|
||||
"setRating": "Qualifica",
|
||||
"toggleSmartPlaylistEditor": "canvia l'editor $t(entity.smartPlaylist)"
|
||||
},
|
||||
"setting": {
|
||||
"language_description": "estableix l'idioma de l'aplicació ($t(common.restartRequired))",
|
||||
"playButtonBehavior_optionAddLast": "$t(player.addLast)",
|
||||
"playButtonBehavior_optionAddNext": "$t(player.addNext)",
|
||||
"playButtonBehavior_optionPlay": "$t(player.play)",
|
||||
"playButtonBehavior_optionPlayShuffled": "$t(player.shuffle)",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album_one)",
|
||||
"replayGainMode_optionNone": "$t(common.none)",
|
||||
"replayGainMode_optionTrack": "$t(entity.track_one)",
|
||||
"font": "tipus de lletra",
|
||||
"fontType": "selecció de tipus de lletra",
|
||||
"fontType_optionBuiltIn": "tipus de lletra integrats",
|
||||
"fontType_optionCustom": "tipus de lletra personalitzats",
|
||||
"fontType_optionSystem": "tipus de lletra del sistema",
|
||||
"disableAutomaticUpdates": "desactivar les actualitzacions automàtiques",
|
||||
"disableLibraryUpdateOnStartup": "desactiva la comprovació de noves versions a l'inici",
|
||||
"homeConfiguration": "configuració de la pàgina d'inici",
|
||||
"sidebarConfiguration": "configuració de la barra lateral",
|
||||
"contextMenu": "configuració del menú contextual (clic amb el botó dret)",
|
||||
"hotkey_playbackNext": "pista següent",
|
||||
"hotkey_playbackPrevious": "pista anterior",
|
||||
"sidePlayQueueStyle_optionAttached": "unida",
|
||||
"sidePlayQueueStyle_optionDetached": "separada",
|
||||
"audioDevice": "dispositiu d'àudio",
|
||||
"audioDevice_description": "seleccioneu el dispositiu d'àudio que voleu utilitzar per a la reproducció (només pel reproductor web)",
|
||||
"audioPlayer": "reproductor d'àudio",
|
||||
"audioPlayer_description": "seleccioneu el reproductor d'àudio que voleu utilitzar per a la reproducció",
|
||||
"sidebarConfiguration_description": "selecciona els elements i l'ordre en què apareixen a la barra lateral",
|
||||
"sidebarPlaylistList_description": "mostra o amaga les llistes de reproducció a la barra lateral",
|
||||
"accentColor": "color de ressaltat",
|
||||
"accentColor_description": "estableix el color de ressaltat de l'aplicació",
|
||||
"useSystemTheme_description": "seguir la preferència de d'aspecte clar o fosc definida pel sistema",
|
||||
"themeDark": "aspecte fosc",
|
||||
"theme": "aspecte",
|
||||
"themeLight": "aspecte clar",
|
||||
"useSystemTheme": "utilitzar l'aspecte del sistema",
|
||||
"discordUpdateInterval_description": "el temps en segons entre cada actualització (mínim 15 segons)",
|
||||
"enableRemote": "activar el servidor de control remot",
|
||||
"enableRemote_description": "el servidor de control remot permet que altres dispositius controlin l'aplicació",
|
||||
"notify": "activa les notificacions de cançons",
|
||||
"transcode": "activa la transcodificació",
|
||||
"transcode_description": "permet la transcodificació a diferents formats",
|
||||
"albumBackground": "imatge de fons de l'àlbum",
|
||||
"albumBackground_description": "afegeix una imatge de fons per les pàgines d'àlbum amb caràtula",
|
||||
"albumBackgroundBlur": "mida del desenfocament de la imatge de fons de l'àlbum",
|
||||
"albumBackgroundBlur_description": "ajusa la quantitat de desenfocament que s'aplica a la imatge de fons de l'àlbum",
|
||||
"applicationHotkeys": "tecles de drecera de l'aplicació",
|
||||
"applicationHotkeys_description": "configura les tecles de drecera de l'aplicació. marca la casella per configurar-les com a derecres globals (només per ordinador)",
|
||||
"artistConfiguration": "configuració de la pàgina de l'artista de l'àlbum",
|
||||
"artistConfiguration_description": "configura quins elements es mostren i el seu ordre de la pàgina de l'artista de l'àlbum",
|
||||
"audioExclusiveMode": "mode d'àudio exclusiu",
|
||||
"audioExclusiveMode_description": "activa el mode d'àudio exclusiu. En aquest mode, el sistema normalment estarà bloquejat i només mpv podrà emetre àudio",
|
||||
"buttonSize": "mida dels botons de la barra de reproducció",
|
||||
"buttonSize_description": "la mida dels botons de la barra de reproducció",
|
||||
"clearCache": "neteja la memòria del navegador",
|
||||
"clearCache_description": "una \"neteja profunda\" del feishin. a més de netejar la memòria del feishin, buida la memòria del navegador (com les imatges desades i altres recursos). la configuració i les credencials del servidor es mantenen",
|
||||
"clearQueryCache": "buida la memòria de feishin",
|
||||
"clearQueryCache_description": "una neteja superficial de feishin. això refrescarà les llistes de reproducció, les metadades de les pistes i reestablirà les lletres desades. la configuració, les credencials del servidor i les imatges desades es mantindran",
|
||||
"clearCacheSuccess": "memòria netejada correctament",
|
||||
"contextMenu_description": "us permet amagar els elements que es mostren al menú quan fas clic dret sobre un element. els elements no seleccionats estaran amagats",
|
||||
"crossfadeDuration": "duracció de la fosa encadenada",
|
||||
"crossfadeDuration_description": "estableix la duració de l'efecte de fosa encadenada",
|
||||
"crossfadeStyle": "estil de fosa encadenada",
|
||||
"crossfadeStyle_description": "selecciona l'estil de fosa encadenada que s'utilitzarà pel reproductor d'àudio",
|
||||
"customCssEnable": "activa el css personalitzat",
|
||||
"customCssEnable_description": "permet escriure CSS personalitzat.",
|
||||
"customCssNotice": "Atenció: tot i que hi ha un filtre (no es permet ni url() ni content:), l'ús de CSS personalitzat pot presentar riscs si canvieu la interfície.",
|
||||
"customCss": "css personalitzat",
|
||||
"customCss_description": "contingut del css personalitzat. Nota: la propietat \"content\" i els urls remots no es permeten. A sota hi teniu una previsualització. Els camps addicionals que no establiu hi apareixin pel filtre.",
|
||||
"customFontPath": "ruta de font personalitzada",
|
||||
"customFontPath_description": "estableix la ruta a una font personalitzada per utilitzar-la a l'aplicació",
|
||||
"discordApplicationId": "id d'aplicació de {{discord}}",
|
||||
"discordApplicationId_description": "l'id d'aplicació per l'estat d'activitat de {{discord}} (per defecte, {{defaultId}})",
|
||||
"discordPausedStatus": "mosta l'estat d'activitat quan està en pausa",
|
||||
"discordPausedStatus_description": "si està activat, l'estat es mostrarà quan el reproductor estigui pausat",
|
||||
"discordIdleStatus": "mosta l'estat d'activitat en inactivitat",
|
||||
"discordIdleStatus_description": "si està activat, s'actualitzarà l'estat mentre el reproductor estigui inactiu",
|
||||
"discordListening": "mosta l'estat com escoltant",
|
||||
"discordListening_description": "mosta l'estat com escoltant en comptes de jugant",
|
||||
"discordRichPresence": "estat d'activitat de {{discord}}",
|
||||
"discordRichPresence_description": "activa l'estat de reproducció a l'activitat de {{discord}}. Les tecles d'imatge són: {{icon}}, {{playing}} i {{paused}}",
|
||||
"discordServeImage": "serveix imatges de {{discord}} des del servidor",
|
||||
"discordServeImage_description": "comparteix la caràtula per l'estat d'activitat de {{discord}} des del servidor; només disponible per jellyfin i navidrome. {{discord}} fa ser un bot per trobar les imatges, de manera que el vostre servidor ha de ser visible per l'internet públic.",
|
||||
"discordUpdateInterval": "interval d'actualització de l'estat d'activitat de {{discord}}",
|
||||
"doubleClickBehavior": "posa en cua totes les pistes cercades en fer doble clic",
|
||||
"doubleClickBehavior_description": "si està actiu, totes les pistes coincidents en una cerca de pistes es posaran a la cua. altrament, només la que seleccioneu s'afegirà a la cua",
|
||||
"externalLinks": "mostra enllaços externs",
|
||||
"externalLinks_description": "permet mostrar enllaços externs (Last.fm, MusicBrainz) a les pàgines d'artista/àlbum",
|
||||
"exitToTray": "surt a la safata",
|
||||
"exitToTray_description": "en sortir de l'aplicació, minimitza-la a la safa del sistema",
|
||||
"floatingQueueArea": "mostra la zona flotant de la cua",
|
||||
"floatingQueueArea_description": "mostra una icona flotant al costat dret de la pantalla per veure la cua de reproducció",
|
||||
"followLyric": "segueix la lletra actual",
|
||||
"followLyric_description": "desplaça la lletra a la posició de reproducció actual",
|
||||
"preferLocalLyrics": "prefereix les lletres locals",
|
||||
"preferLocalLyrics_description": "prefereix les lletres locals per sobre de les remotes, si estan disponibles",
|
||||
"font_description": "estableix la font utilitzada a l'aplicació",
|
||||
"fontType_description": "\"font incorporada\" selecciona una de les fonts proporcionades per Feishin. \"font del sistema\" us permet seleccionar qualsevol font proporcionada pel sistema operatiu. \"personalitzada\" us permet proporcionar la vostra pròpia font",
|
||||
"gaplessAudio": "àudio sense pauses",
|
||||
"gaplessAudio_description": "estableix la configuració d'àudio sense pauses per mpv",
|
||||
"gaplessAudio_optionWeak": "feble (recomanat)",
|
||||
"genreBehavior": "comportament predeterminat per les pàgines de gènere",
|
||||
"genreBehavior_description": "determina si clicar sobre un gènere obre per defecte la llista de pistes o d'àlbums",
|
||||
"globalMediaHotkeys": "tecles de drecera globals",
|
||||
"globalMediaHotkeys_description": "activa o desactiva l'ús de les tecles multimèdia del sistema per controlar la reproducció",
|
||||
"homeConfiguration_description": "configura quins objectes es mostren, i en quin ordre, a la pàgina d'inici",
|
||||
"homeFeature": "carrusel de destacats d'inici",
|
||||
"homeFeature_description": "controla si es mostra el gran carrusel d'elements destacats a la pàgina d'inici",
|
||||
"hotkey_browserBack": "anar enrere",
|
||||
"hotkey_browserForward": "anar endavant",
|
||||
"hotkey_favoriteCurrentSong": "marca $t(common.currentSong) com a preferida",
|
||||
"hotkey_favoritePreviousSong": "marca $t(common.previousSong) com a preferida",
|
||||
"hotkey_globalSearch": "cerca global",
|
||||
"hotkey_localSearch": "cerca a la pàgina",
|
||||
"hotkey_playbackPause": "pausa",
|
||||
"hotkey_playbackPlay": "reprodueix",
|
||||
"hotkey_playbackPlayPause": "reprodueix / pausa",
|
||||
"hotkey_playbackStop": "atura",
|
||||
"hotkey_rate0": "neteja la qualificació",
|
||||
"hotkey_rate1": "qualifica amb 1 estrella",
|
||||
"hotkey_rate2": "qualifica amb 2 estrelles",
|
||||
"hotkey_rate3": "qualifica amb 3 estrelles",
|
||||
"hotkey_rate4": "qualifica amb 4 estrelles",
|
||||
"hotkey_rate5": "qualifica amb 5 estrelles",
|
||||
"hotkey_skipBackward": "salta enrere",
|
||||
"hotkey_skipForward": "salta endavant",
|
||||
"hotkey_toggleCurrentSongFavorite": "canvia si $t(common.currentSong) és preferida",
|
||||
"hotkey_toggleFullScreenPlayer": "activa o desactiva el reproductor a pantalla completa",
|
||||
"hotkey_togglePreviousSongFavorite": "canvia si $t(common.previousSong) és preferida",
|
||||
"hotkey_toggleQueue": "activa o desactiva la cua",
|
||||
"hotkey_toggleRepeat": "activa o desactiva la repetició",
|
||||
"hotkey_toggleShuffle": "activa o desactiva la reproducció a l'atzar",
|
||||
"hotkey_unfavoriteCurrentSong": "elimina $t(common.currentSong) dels preferits",
|
||||
"hotkey_unfavoritePreviousSong": "elimina $t(common.previousSong) dels preferits",
|
||||
"hotkey_volumeDown": "redueix el volum",
|
||||
"hotkey_volumeMute": "silencia el volum",
|
||||
"hotkey_volumeUp": "augmenta el volum",
|
||||
"hotkey_zoomIn": "amplia",
|
||||
"hotkey_zoomOut": "redueix",
|
||||
"imageAspectRatio": "utilitza la relació d'aspecte predeterminada de la caràtula",
|
||||
"imageAspectRatio_description": "si està activat, la caràtula es mostrarà amb la relació d'aspecte predeterminada. per caràtules que no siguin 1:1, l'espai restant estarà buit",
|
||||
"language": "llengua",
|
||||
"lastfm": "mostra els enllaços last.fm",
|
||||
"lastfm_description": "mosta enllaços a last.fm a les pàgines d'artista/àlbum",
|
||||
"lastfmApiKey": "clau d'API per {{lastfm}}",
|
||||
"lastfmApiKey_description": "la clau d'API per {{lastfm}}. necessària per la caràtula",
|
||||
"lyricFetch": "extreu la lletra d'internet",
|
||||
"lyricFetch_description": "extreu la lletra de diverses fonts d'internet",
|
||||
"lyricFetchProvider": "proveïdors de lletres",
|
||||
"lyricFetchProvider_description": "selecciona els proveïdors de lletres. l'ordre en què apareixen és l'ordre en què es consultaran",
|
||||
"lyricOffset": "desfasament de la lletra (ms)",
|
||||
"lyricOffset_description": "desplaça la lletra els mil·lisegons especificats",
|
||||
"notify_description": "mostra notificacions en canvia la cançó actual",
|
||||
"minimizeToTray": "minimitza a la safata",
|
||||
"minimizeToTray_description": "minimitza l'aplicació a la safata del sistema",
|
||||
"minimumScrobblePercentage": "duració mínima de l'scrobble (percentatge)",
|
||||
"minimumScrobblePercentage_description": "el percentatge mínim de la cançó que cal reproduir abans d'activar l'scrobble",
|
||||
"minimumScrobbleSeconds": "scrobble mínim (segons)",
|
||||
"minimumScrobbleSeconds_description": "la duració mínima en segons durant la qual cal reproduir la cançó abans d'activar l'scrobble",
|
||||
"mpvExecutablePath": "ruta de l'executable de l'mpv",
|
||||
"mpvExecutablePath_description": "estableix la ruta de l'executable de l'mpv. si el deixeu buit, s'utilitzarà la ruta predeterminada",
|
||||
"mpvExtraParameters": "paràmetres de l'mpv",
|
||||
"mpvExtraParameters_help": "un per línia",
|
||||
"musicbrainz": "mostra els enllaços de musicbrainz",
|
||||
"musicbrainz_description": "mostra enllaços a les pàgines d'artista/àlbum a musicbrainz si hi ha mbid",
|
||||
"neteaseTranslation": "activeu les traduccions NetEase",
|
||||
"neteaseTranslation_description": "Si ho activeu, cerca i mostra lletres traduïdes de NetEase si estan disponibles.",
|
||||
"passwordStore": "contrasenyes/emmagatzematge secret",
|
||||
"passwordStore_description": "quina contrasenya/emmagatzematge secret s'utilitza. canvieu-ho si teniu problemes per desar contrasenyes.",
|
||||
"playbackStyle": "estil de reproducció",
|
||||
"playbackStyle_description": "selecciona l'estil de reproducció a utilitzar pel reproductor d'àudio",
|
||||
"playbackStyle_optionCrossFade": "fosa encadenada",
|
||||
"playbackStyle_optionNormal": "normal",
|
||||
"playButtonBehavior": "comportament del botó de reproducció",
|
||||
"playButtonBehavior_description": "estableix el comportament predeterminat del botó de reproducció quan s'afegeixen cançons a la cua",
|
||||
"playerAlbumArtResolution": "resolució de la caràtula de l'àlbum al reproductor",
|
||||
"playerAlbumArtResolution_description": "la resolució de la previsualització gran de la caràtula al reproductor. si és més alta, serà més nítida, però es carregarà més lent. el valor predeterminat 0 vol dir automàtic",
|
||||
"playerbarOpenDrawer": "activa el reproductor en pantalla completa",
|
||||
"playerbarOpenDrawer_description": "permet fer clic a la barra de reproducció per obrir el reproductor de pantalla completa",
|
||||
"remotePassword": "contrasenya del servidor de control remot",
|
||||
"remotePassword_description": "estableix la contrasenya pel servidor de control remot. Aquestes credencials es transfereixen de forma no segura per defecte, de manera que hauríeu d'utilitzar una contrasenya única no relacionada amb res més",
|
||||
"remotePort": "port del servidor de control remot",
|
||||
"remotePort_description": "estableix el port pel servidor de control remot",
|
||||
"remoteUsername": "nom d'usuari pel servidor de control remot",
|
||||
"remoteUsername_description": "estableix el nom d'usuari pel servidor de control remot. si tant el nom d'usuari com la contrasenya són buits, l'autenticació estarà desactivada",
|
||||
"replayGainPreamp_description": "ajusta el guany del preamplificador aplicat als valors de {{ReplayGain}}",
|
||||
"sampleRate": "ràtio de mostratge",
|
||||
"sampleRate_description": "selecciona el ràtio de mostratge de sortida que s'ha d'utilitzar si la freqüència de mostratge seleccionada és diferent a la del mitjà actual. un valor inferior a 8000 utilitzarà la freqüència predeterminada",
|
||||
"savePlayQueue": "desa la cua de reproducció",
|
||||
"savePlayQueue_description": "desa la cua de reproducció quan l'aplicació es tanca i la restaura quan s'obre",
|
||||
"scrobble": "scrobble",
|
||||
"scrobble_description": "fa scrobble de les reproduccions al vostre servidor multimèdia",
|
||||
"showSkipButton": "mostra els botons de saltar",
|
||||
"showSkipButton_description": "mostra o amaga els botons de saltar a la barra de reproducció",
|
||||
"showSkipButtons": "mostra els botons de saltar",
|
||||
"showSkipButtons_description": "mostra o amaga els botons de saltar a la barra de reproducció",
|
||||
"sidebarCollapsedNavigation": "navegació de la barra lateral (plegada)",
|
||||
"sidebarCollapsedNavigation_description": "mostra o amaga la navegació a la barra lateral plegada",
|
||||
"sidebarPlaylistList": "llista de reproducció lateral",
|
||||
"sidePlayQueueStyle": "estil de la cua de reproducció lateral",
|
||||
"sidePlayQueueStyle_description": "estableix l'estil de la cua de reproducció lateral",
|
||||
"skipDuration": "interval de salt",
|
||||
"skipDuration_description": "estableix l'interval de temps que se saltarà en fer servir els botons de saltar a la barra de reproducció",
|
||||
"skipPlaylistPage": "salta la pàgina de la llista de reproducció",
|
||||
"skipPlaylistPage_description": "en navegar a una llista de reproducció, obre la pàgina de cançons de la llista de reproducció en comptes de la pàgina predeterminada",
|
||||
"startMinimized": "obre minimitzada",
|
||||
"startMinimized_description": "obre l'aplicació a la safata del sistema",
|
||||
"theme_description": "estableix el tema visual per l'aplicació",
|
||||
"themeDark_description": "estableix el tema fosc per l'aplicació",
|
||||
"themeLight_description": "estableix el tema clar per l'aplicació",
|
||||
"transcodeNote": "tindrà efecte després d'1 (web) o 2 (mpv) cançons",
|
||||
"transcodeBitrate": "taxa de bits per transcodificar",
|
||||
"transcodeBitrate_description": "selecciona la taxa de bits per transcodificar. 0 significa deixar que el servidor triï",
|
||||
"transcodeFormat": "format per transcodificar",
|
||||
"transcodeFormat_description": "selecciona el format per transcodificar. deixeu-ho buit per deixar que el servidor decideixi",
|
||||
"translationApiProvider": "proveïdor d'api de traducció",
|
||||
"translationApiProvider_description": "proveïdor de l'api de traducció",
|
||||
"translationApiKey": "clau de l'api de traducció",
|
||||
"translationTargetLanguage": "llengua meta de traducció",
|
||||
"translationTargetLanguage_description": "llengua meta per la traducció",
|
||||
"trayEnabled": "mostra a la safata",
|
||||
"trayEnabled_description": "mostra/oculta la icona/menú de la safata. si està desactivat, també desactiva la funcionalitat de minimitzar/sortir a la safata",
|
||||
"volumeWheelStep": "increment de volum de la roda",
|
||||
"volumeWheelStep_description": "la quantitat de volum a canviar quan utilitzeu la roda del ratolí sobre el controlador de volum",
|
||||
"volumeWidth": "amplada del controlador de volum",
|
||||
"volumeWidth_description": "l'amplada del controlador de volum",
|
||||
"webAudio": "utilitza l'àudio web",
|
||||
"webAudio_description": "utilitza l'àudio web. això habilita funcions avançades com Replaygain. desactiveu-ho si teniu una experiència diferent",
|
||||
"replayGainClipping": "saturació de {{ReplayGain}}",
|
||||
"replayGainClipping_description": "rebaixa automàticament el guany per evitar la saturació causada pel {{ReplayGain}}",
|
||||
"replayGainFallback": "alternativa per {{ReplayGain}}",
|
||||
"replayGainFallback_description": "guany en db que s'ha d'aplicar si el fitxer no té etiquetes de {{ReplayGain}}",
|
||||
"replayGainMode": "mode de {{ReplayGain}}",
|
||||
"replayGainMode_description": "ajuda el volum del guany segons els vlors de {{ReplayGain}} desats a les metadades del fitxer",
|
||||
"replayGainPreamp": "preamplificador de {{ReplayGain}} (dB)",
|
||||
"translationApiKey_description": "clau api per la traducció (només per serveis globals)",
|
||||
"preservePitch": "mantén el to",
|
||||
"preservePitch_description": "manté el to quan s'altera la velocitat de reproducció",
|
||||
"windowBarStyle": "estil de la barra de la finestra",
|
||||
"windowBarStyle_description": "selecciona l'estil de la barra de la finestra",
|
||||
"zoom": "percentatge de zoom",
|
||||
"zoom_description": "estableix el percentatge de zoom de l'aplicació",
|
||||
"discordDisplayType": "tipus de pantalla d'activitat de {{discord}}",
|
||||
"discordDisplayType_description": "canvia què escolteu al vostre estat",
|
||||
"discordDisplayType_songname": "nom de la cançó",
|
||||
"discordDisplayType_artistname": "nom de l'artista",
|
||||
"hotkey_navigateHome": "ves a l'inici",
|
||||
"preventSleepOnPlayback": "evitar entrar en repòs durant la reproducció",
|
||||
"preventSleepOnPlayback_description": "evita que la pantalla s'adormi mentre la música es reprodueix",
|
||||
"discordLinkType": "enllaços d'estat de {{discord}}",
|
||||
"discordLinkType_description": "afegeix enllaços externs a {{lastfm}} o {{musicbrainz}} als camps de cançó i artista a l'estat d'activitat de {{discord}}. {{musicbrainz}} és el més precís, però requereix etiquetes i no proporciona enllaços d'artista, mentre que {{lastfm}} hauria de propocionar un enllaç sempre. no fa sol·licituds de xarxa addicionals",
|
||||
"discordLinkType_none": "$t(common.none)",
|
||||
"discordLinkType_mbz_lastfm": "{{musicbrainz}} amb {{lastfm}} com a alternativa",
|
||||
"artistBackground": "imatge de fons de l'artista",
|
||||
"artistBackground_description": "afegeix una imatge de fons per les pàgines d'artista amb l'art de l'artista",
|
||||
"artistBackgroundBlur": "mida del desenfocament de la imatge de fons de l'artista",
|
||||
"artistBackgroundBlur_description": "ajusta la quantitat de desenfocament aplicat a la imatge de fons de l'artista",
|
||||
"releaseChannel_optionLatest": "estable",
|
||||
"releaseChannel_optionBeta": "beta",
|
||||
"releaseChannel": "canal de versions",
|
||||
"releaseChannel_description": "tria entre versions estables i versions beta per les actualitzacions automàtiques",
|
||||
"mediaSession": "activa Media Session",
|
||||
"mediaSession_description": "Activa la integració amb Windows Media Session per mostrar els controls multimèdia i les metadades a l'indicador de volum del sistema i la pantalla de bloqueig (només per Windows)"
|
||||
},
|
||||
"table": {
|
||||
"column": {
|
||||
"albumCount": "$t(entity.album_other)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"codec": "$t(common.codec)",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"size": "$t(common.size)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"releaseYear": "any",
|
||||
"playCount": "reproduccions",
|
||||
"releaseDate": "data de llançament",
|
||||
"album": "àlbum",
|
||||
"albumArtist": "artista de l'àlbum",
|
||||
"biography": "biografia",
|
||||
"bitrate": "taxa de bits",
|
||||
"bpm": "bpm",
|
||||
"dateAdded": "data d'addició",
|
||||
"discNumber": "disc",
|
||||
"trackNumber": "pista",
|
||||
"comment": "comentari",
|
||||
"favorite": "preferit",
|
||||
"lastPlayed": "última reproducció",
|
||||
"path": "ruta",
|
||||
"rating": "qualificació",
|
||||
"title": "títol"
|
||||
},
|
||||
"config": {
|
||||
"general": {
|
||||
"gap": "$t(common.gap)",
|
||||
"size": "$t(common.size)",
|
||||
"autoFitColumns": "ajusta les columnes automàticament",
|
||||
"followCurrentSong": "segueix la cançó actual",
|
||||
"displayType": "tipus de visualització",
|
||||
"itemGap": "espai entre elements (px)",
|
||||
"itemSize": "mida dels elements (px)",
|
||||
"tableColumns": "columnes de la taula"
|
||||
},
|
||||
"label": {
|
||||
"actions": "$t(common.action_other)",
|
||||
"album": "$t(entity.album_one)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"biography": "$t(common.biography)",
|
||||
"bitrate": "$t(common.bitrate)",
|
||||
"bpm": "$t(common.bpm)",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"codec": "$t(common.codec)",
|
||||
"duration": "$t(common.duration)",
|
||||
"favorite": "$t(common.favorite)",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"note": "$t(common.note)",
|
||||
"owner": "$t(common.owner)",
|
||||
"path": "$t(common.path)",
|
||||
"rating": "$t(common.rating)",
|
||||
"size": "$t(common.size)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"title": "$t(common.title)",
|
||||
"year": "$t(common.year)",
|
||||
"playCount": "compte de reproduccions",
|
||||
"releaseDate": "data de llançament",
|
||||
"dateAdded": "data d'addició",
|
||||
"trackNumber": "número de pista",
|
||||
"discNumber": "número de disc",
|
||||
"lastPlayed": "última reproducció",
|
||||
"rowIndex": "índex de files",
|
||||
"titleCombined": "$t(common.title) (combinat)"
|
||||
},
|
||||
"view": {
|
||||
"table": "taula",
|
||||
"card": "targeta",
|
||||
"grid": "quadrícula",
|
||||
"list": "llista",
|
||||
"poster": "pòster"
|
||||
}
|
||||
}
|
||||
},
|
||||
"filter": {
|
||||
"fromYear": "des de l'any",
|
||||
"releaseYear": "any de llançament",
|
||||
"toYear": "fins a l'any",
|
||||
"album": "$t(entity.album_one)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"biography": "biografia",
|
||||
"bitrate": "taxa de bits",
|
||||
"bpm": "bpm",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"comment": "comentari",
|
||||
"disc": "disc",
|
||||
"duration": "durada",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"id": "identificador",
|
||||
"name": "nom",
|
||||
"note": "nota",
|
||||
"owner": "$t(common.owner)",
|
||||
"random": "aleatori",
|
||||
"rating": "valoració",
|
||||
"search": "cercar",
|
||||
"title": "títol",
|
||||
"playCount": "compte de reproduccions",
|
||||
"releaseDate": "data de llançament",
|
||||
"mostPlayed": "els més reproduïts",
|
||||
"dateAdded": "data d'addició",
|
||||
"trackNumber": "pista",
|
||||
"communityRating": "valoració de la comunitat",
|
||||
"criticRating": "valoració dels crítics",
|
||||
"recentlyAdded": "afegit recentment",
|
||||
"recentlyPlayed": "reproduït recentment",
|
||||
"recentlyUpdated": "actualitzat recentment",
|
||||
"albumCount": "nombre de $t(entity.album_other)",
|
||||
"favorited": "preferits",
|
||||
"isCompilation": "és una compilació",
|
||||
"isFavorited": "és un preferit",
|
||||
"isPublic": "és públic",
|
||||
"isRated": "està qualificat",
|
||||
"isRecentlyPlayed": "s'ha reproduït fa poc",
|
||||
"lastPlayed": "última reproducció",
|
||||
"path": "ruta",
|
||||
"songCount": "nombre de cançons"
|
||||
},
|
||||
"player": {
|
||||
"muted": "silenciat",
|
||||
"repeat": "repetició d'una pista",
|
||||
"skip": "saltar",
|
||||
"stop": "parar",
|
||||
"queue_clear": "buidar la cua",
|
||||
"viewQueue": "veure la cua",
|
||||
"playbackFetchInProgress": "carregant cançons…",
|
||||
"playbackFetchNoResults": "no s'han trobat cançons",
|
||||
"playbackSpeed": "velocitat de reproducció",
|
||||
"playSimilarSongs": "reproduir cançons similars",
|
||||
"repeat_off": "repetició desactivada",
|
||||
"repeat_all": "repetició",
|
||||
"shuffle": "reproducció aleatòria",
|
||||
"shuffle_off": "reproducció aleatòria desactivada",
|
||||
"addLast": "afegeix al final",
|
||||
"addNext": "afegeix a continuació",
|
||||
"favorite": "marcar com a preferida",
|
||||
"mute": "silencia",
|
||||
"next": "següent",
|
||||
"play": "reprodueix",
|
||||
"playbackFetchCancel": "està trigant bastant... tanqueu la notificació per cancel·lar",
|
||||
"playRandom": "reproducció a l'atzar",
|
||||
"previous": "anterior",
|
||||
"queue_moveToBottom": "mou la selecció a l'inici",
|
||||
"queue_moveToTop": "mou la selecció al final",
|
||||
"queue_remove": "elimina la selecció",
|
||||
"skip_back": "salta enrere",
|
||||
"skip_forward": "salta endavant",
|
||||
"toggleFullscreenPlayer": "activa el reproductor de pantalla completa",
|
||||
"unfavorite": "elimina de preferits",
|
||||
"pause": "pausa"
|
||||
},
|
||||
"error": {
|
||||
"credentialsRequired": "credencials requerides",
|
||||
"genericError": "s'ha produït un error",
|
||||
"invalidServer": "servidor no vàlid",
|
||||
"localFontAccessDenied": "accés denegat als tipus de lletra locals",
|
||||
"networkError": "s'ha produït un error de xarxa",
|
||||
"openError": "no s'ha pogut obrir el fitxer",
|
||||
"remotePortError": "s'ha produït un error en intentar configurar el port del servidor remot",
|
||||
"serverNotSelectedError": "no s'ha seleccionat cap servidor",
|
||||
"sessionExpiredError": "la sessió ha caducat",
|
||||
"systemFontError": "s'ha produït un error en intentar obtenir els tipus de lletra del sistema",
|
||||
"remoteEnableError": "s'ha produït un error en intentar $t(common.enable) el servidor remot",
|
||||
"remotePortWarning": "reiniciar el servidor per aplicar el nou port",
|
||||
"serverRequired": "servidor requerit",
|
||||
"apiRouteError": "no es pot encaminar la sol·licitud",
|
||||
"audioDeviceFetchError": "hi ha hagut un error en obtenir els dispositius d'àudio",
|
||||
"authenticationFailed": "autenticació fallida",
|
||||
"badAlbum": "esteu veient aquesta pàgina perquè aquesta cançó no és part de cap àlbum. aquest problema pot passar si teniu una cançó al nivell superior de la vostra carpeta de música. jellyfin només agrupa pistes si són en una carpeta.",
|
||||
"badValue": "l'opció \"{{value}}\"és invàlida. aquest valor ja no existeix",
|
||||
"loginRateError": "massa intents d'inici de sessió, intenteu-ho de nou d'aquí uns segons",
|
||||
"mpvRequired": "Cal l'MPV",
|
||||
"notificationDenied": "s'han negat els permisos per enviar notificacions. aquesta opció no té cap efecte",
|
||||
"playbackError": "hi ha hagut un error en intentar reproduir el mitjà",
|
||||
"remoteDisableError": "hi ha hagut un error en intentar $t(common.disable) el servidor remot",
|
||||
"endpointNotImplementedError": "el punt final {{endpoint}} no està implementat per {{serverType}}"
|
||||
}
|
||||
}
|
||||
+235
-30
@@ -4,14 +4,14 @@
|
||||
"stop": "zastavit",
|
||||
"repeat": "opakovat",
|
||||
"queue_remove": "odebrat vybrané",
|
||||
"playRandom": "přehrát náhodné",
|
||||
"playRandom": "přehrát náhodně",
|
||||
"skip": "přeskočit",
|
||||
"previous": "předchozí",
|
||||
"toggleFullscreenPlayer": "přepnout celoobrazovkový přehrávač",
|
||||
"skip_back": "přeskočit dozadu",
|
||||
"favorite": "oblíbené",
|
||||
"next": "další",
|
||||
"shuffle": "náhodně",
|
||||
"shuffle": "přehrát náhodně",
|
||||
"playbackFetchNoResults": "nenalezeny žádné skladby",
|
||||
"playbackFetchInProgress": "načítání skladeb…",
|
||||
"addNext": "přidat další",
|
||||
@@ -28,7 +28,9 @@
|
||||
"shuffle_off": "náhodně zakázáno",
|
||||
"addLast": "přidat poslední",
|
||||
"mute": "ztlumit",
|
||||
"skip_forward": "přeskočit dopředu"
|
||||
"skip_forward": "přeskočit dopředu",
|
||||
"playSimilarSongs": "přehrát podobné skladby",
|
||||
"viewQueue": "zobrazit frontu"
|
||||
},
|
||||
"setting": {
|
||||
"crossfadeStyle_description": "vyberte způsob prolnutí u přehrávače zvuku",
|
||||
@@ -122,7 +124,7 @@
|
||||
"hotkey_toggleShuffle": "přepnutí náhodného přehrávání",
|
||||
"theme": "motiv",
|
||||
"playbackStyle_description": "nastavení způsobu přehrávání pro přehrávač zvuku",
|
||||
"discordRichPresence_description": "povolit stav přehrávání v {{discord}} rich presence. Klíče obrázků jsou: {{icon}}, {{playing}}, {{paused}} ",
|
||||
"discordRichPresence_description": "povolit stav přehrávání v {{discord}} rich presence. Klíče obrázků jsou: {{icon}}, {{playing}}, {{paused}}",
|
||||
"mpvExecutablePath": "cesta ke spustitelnému souboru mpv",
|
||||
"audioDevice": "zvukové zařízení",
|
||||
"hotkey_rate2": "hodnocení 2 hvězdami",
|
||||
@@ -169,7 +171,7 @@
|
||||
"hotkey_zoomOut": "oddálení",
|
||||
"hotkey_unfavoriteCurrentSong": "zrušení oblíbení u $t(common.currentSong)",
|
||||
"hotkey_rate0": "vymazání hodnocení",
|
||||
"discordApplicationId": "aplikační id pro {{discord}}",
|
||||
"discordApplicationId": "id aplikace pro {{discord}}",
|
||||
"applicationHotkeys_description": "nastavení klávesových zkratek aplikace. přepněte pole pro nastavení jako globální zkratku (pouze na počítači)",
|
||||
"floatingQueueArea_description": "zobrazit ikonu přejetí myší na pravé straně obrazovky pro zobrazení fronty",
|
||||
"hotkey_volumeMute": "ztlumení",
|
||||
@@ -196,7 +198,97 @@
|
||||
"clearCache": "vymazat mezipaměť prohlížeče",
|
||||
"clearCache_description": "„tvrdé pročištění“ aplikace feishin. kromě mezipaměti aplikace feishin vymaže i mezipaměť prohlížeče (uložené obrázky a další zdroje). přihlašovací údaje k serveru a nastavení nebudou ovlivněny",
|
||||
"clearQueryCache": "vymazat mezipaměť aplikace feishin",
|
||||
"clearQueryCache_description": "„lehké pročištění“ aplikace feishin. tímto obnovíte seznamy skladeb, metadata skladeb a resetujete uložené texty. nastavení, přihlašovací údaje k serveru a obrázky v mezipaměti nebudou ovlivněny"
|
||||
"clearQueryCache_description": "„lehké pročištění“ aplikace feishin. tímto obnovíte seznamy skladeb, metadata skladeb a resetujete uložené texty. nastavení, přihlašovací údaje k serveru a obrázky v mezipaměti nebudou ovlivněny",
|
||||
"startMinimized": "spustit minimalizované",
|
||||
"homeConfiguration_description": "nastavte, které položky a v jakém pořadí mají být zobrazeny na domovské stránce",
|
||||
"passwordStore": "ukládání hesel / tajných klíčů",
|
||||
"mpvExtraParameters_help": "jeden na řádek",
|
||||
"homeConfiguration": "nastavení domovské stránky",
|
||||
"playerAlbumArtResolution_description": "rozlišení náhledu obalu alba ve velkém přehrávači. větší hodnota znamená kvalitnější obrázek, ale může se déle načítat. výchozí hodnota je 0, což znamená automatické rozlišení",
|
||||
"playerAlbumArtResolution": "rozlišení obalu alba v přehrávači",
|
||||
"genreBehavior": "výchozí chování stránky žánrů",
|
||||
"externalLinks_description": "zapne zobrazování externích odkazů (Last.fm, MusicBrainz) na stránce umělce/alba",
|
||||
"genreBehavior_description": "určuje, zda kliknutí na žánr otevře seznam skladeb nebo alb",
|
||||
"clearCacheSuccess": "mezipaměť úspěšně vymazána",
|
||||
"externalLinks": "zobrazit externí odkazy",
|
||||
"startMinimized_description": "spustit aplikaci do systémové lišty",
|
||||
"passwordStore_description": "který způsob ukládání hesel / tajných klíčů použít. změňte tuto možnost, pokud máte problémy s ukládáním hesel.",
|
||||
"homeFeature": "carousel doporučení na domovské stránce",
|
||||
"homeFeature_description": "ovládá, zda se má zobrazovat velký carousel s doporučenými alby na domovské stránce",
|
||||
"imageAspectRatio": "použít nativní poměr stran obalů alb",
|
||||
"imageAspectRatio_description": "pokud je povoleno, budou obaly alb zobrazeny s jejich nativním poměrem stran. u obalů, které nemají poměr 1:1, bude zbývající místo prázdné",
|
||||
"doubleClickBehavior": "dvojitým kliknutím zařadit všechny vyhledané skladby do fronty",
|
||||
"doubleClickBehavior_description": "pokud je zapnuto, budou všechny odpovídající skladby ve vyhledávání zařazeny do fronty. v opačném případě bude zařazena pouze ta, na kterou kliknete",
|
||||
"volumeWidth": "šířka posuvníku hlasitosti",
|
||||
"volumeWidth_description": "horizontální velikost posuvníku hlasitosti",
|
||||
"discordListening": "zobrazit stav jako „Poslouchá“",
|
||||
"discordListening_description": "zobrazit stav jako „Poslouchá“ namísto „Hraje“",
|
||||
"contextMenu": "nastavení kontextové nabídky (kliknutí pravým)",
|
||||
"contextMenu_description": "umožňuje skrýt položky, které se zobrazí v nabídce po kliknutí pravým tlačítkem myši na položku. položky, které nejsou zaškrtnuté, se skryjí",
|
||||
"customCssEnable": "povolit vlastní CSS",
|
||||
"customCssEnable_description": "povolit vlastní CSS.",
|
||||
"customCssNotice": "Varování: i když provádíme určitou sanitizaci (zakázáním url() a content:), může používání CSS stále představovat riziko změnami rozhraní.",
|
||||
"customCss_description": "vlastní CSS obsah. Upozornění: vlastnosti content a vzdálené url jsou zakázané. Níže je zobrazen náhled vašeho obsahu. Další pole, která jste nenastavili, jsou přítomna z důvodu sanitizace.",
|
||||
"customCss": "vlastní CSS",
|
||||
"webAudio": "použít webový zvuk",
|
||||
"webAudio_description": "použít webový zvuk. tím povolíte pokročilé funkce jako replaygain. zakažte, pokud se objeví problémy",
|
||||
"transcodeNote": "projeví se po 1 (web) - 2 (mpv) skladbách",
|
||||
"transcode": "povolit překódování",
|
||||
"transcode_description": "zapnout překódování do různých formátů",
|
||||
"transcodeFormat_description": "vybere formát k překódování. pokud chcete nechat rozhodnout server, ponechte prázdné",
|
||||
"transcodeFormat": "formát k překódování",
|
||||
"transcodeBitrate": "datový tok k překódování",
|
||||
"transcodeBitrate_description": "vybere datový tok k překódování. 0 znamená, že necháte server vybrat",
|
||||
"albumBackground": "obrázek alba na pozadí",
|
||||
"albumBackground_description": "přidá obrázek alba na pozadí pro stránky alba obsahující obrázky alba",
|
||||
"albumBackgroundBlur": "velikost rozostření obrázku alba na pozadí",
|
||||
"albumBackgroundBlur_description": "upraví množství rozostření použité na obrázek alba na pozadí",
|
||||
"playerbarOpenDrawer": "lišta přehrávače jako přepínač celé obrazovky",
|
||||
"playerbarOpenDrawer_description": "umožňuje kliknutí na lištu přehrávače pro otevření celoobrazovkového přehrávače",
|
||||
"artistConfiguration": "nastavení stránky umělce alba",
|
||||
"artistConfiguration_description": "nastavit, které položky na stránce umělce alba budou zobrazeny a v jakém pořadí",
|
||||
"playButtonBehavior_optionPlayShuffled": "$t(player.shuffle)",
|
||||
"trayEnabled": "zobrazit v oznamovací oblasti",
|
||||
"trayEnabled_description": "zobrazit/skrýt ikonu/nabídku v oznamovací oblasti. pokud je zakázáno, vypne také minimalizaci/ukončení do oznamovací oblasti",
|
||||
"translationApiProvider": "poskytovatel api překladů",
|
||||
"translationApiProvider_description": "poskytovatel api pro překlady",
|
||||
"translationApiKey": "klíč api překladů",
|
||||
"translationApiKey_description": "klíč api pro překlady (podporuje pouze koncový bod globální služby)",
|
||||
"translationTargetLanguage": "cílový jazyk překladu",
|
||||
"translationTargetLanguage_description": "cílový jazyk pro překlad",
|
||||
"lastfmApiKey": "klíč API {{lastfm}}",
|
||||
"lastfmApiKey_description": "klíč API pro {{lastfm}}. vyžadováno pro obaly alb",
|
||||
"discordServeImage": "načítat obrázky {{discord}} ze serveru",
|
||||
"discordServeImage_description": "sdílet obaly alb pro {{discord}} rich presence ze samotného serveru, dostupné pouze pro jellyfin a navidrome",
|
||||
"lastfm": "zobrazit odkazy na last.fm",
|
||||
"lastfm_description": "na stránkách umělců a alb zobrazit odkazy na last.fm",
|
||||
"musicbrainz": "zobrazit odkazy na musicbrainz",
|
||||
"musicbrainz_description": "na stránkách umělců a alb, kde existuje mbid, zobrazit odkazy na musicbrainz",
|
||||
"neteaseTranslation": "Povolit překlady NetEase",
|
||||
"neteaseTranslation_description": "Pokud je povoleno, načte a zobrazí přeložené texty ze služby NetEase, pokud jsou dostupné.",
|
||||
"preferLocalLyrics": "preferovat místní texty",
|
||||
"preferLocalLyrics_description": "preferovat místní texty před vzdálenými, pokud jsou dostupné",
|
||||
"discordPausedStatus": "zobrazit rich presence při pozastavení",
|
||||
"discordPausedStatus_description": "pokud je povoleno, bude při pozastavení přehrávače zobrazen stav",
|
||||
"preservePitch": "zachovat výšku",
|
||||
"preservePitch_description": "zachová výšku při úpravě rychlosti přehrávání",
|
||||
"notify": "povolit oznámení o skladbách",
|
||||
"notify_description": "zobrazit oznámení při změně aktuální skladby",
|
||||
"discordDisplayType": "typ zobrazení stavu {{discord}}",
|
||||
"discordDisplayType_description": "změní, co posloucháte, ve vašem stavu",
|
||||
"discordDisplayType_songname": "název skladby",
|
||||
"discordDisplayType_artistname": "jména umělců",
|
||||
"hotkey_navigateHome": "přejít domů",
|
||||
"preventSleepOnPlayback": "zabránit uspání při přehrávání",
|
||||
"preventSleepOnPlayback_description": "zabránit uspání displeje během přehrávání hudby",
|
||||
"discordLinkType": "odkazy ve stavu na službě {{discord}}",
|
||||
"discordLinkType_description": "přidá externí odkazy na {{lastfm}} nebo {{musicbrainz}} do polí skladby a umělce ve stavu na službě {{discord}}. {{musicbrainz}} je nejpřesnější, ale vyžaduje značky a neposkytuje odkazy na umělce, zatímco {{lastfm}} by mělo vždy poskytnout odkaz. neprovádí žádné další síťové požadavky",
|
||||
"discordLinkType_none": "$t(common.none)",
|
||||
"discordLinkType_mbz_lastfm": "{{musicbrainz}} se zálohou na {{lastfm}}",
|
||||
"artistBackground": "obrázek umělce na pozadí",
|
||||
"artistBackground_description": "přidá obrázek na pozadí u stránek umělců",
|
||||
"artistBackgroundBlur": "velikost rozostření obrázku umělce na pozadí",
|
||||
"artistBackgroundBlur_description": "upraví velikost rozostření použitého na obrázek umělce na pozadí"
|
||||
},
|
||||
"action": {
|
||||
"editPlaylist": "upravit $t(entity.playlist_one)",
|
||||
@@ -215,7 +307,12 @@
|
||||
"moveToBottom": "přesunout dolů",
|
||||
"setRating": "nastavit hodnocení",
|
||||
"toggleSmartPlaylistEditor": "přepnout editor $t(entity.smartPlaylist)",
|
||||
"removeFromFavorites": "odebrat z $t(entity.favorite_other)"
|
||||
"removeFromFavorites": "odebrat z $t(entity.favorite_other)",
|
||||
"openIn": {
|
||||
"lastfm": "Otevřít v Last.fm",
|
||||
"musicbrainz": "Otevřít v MusicBrainz"
|
||||
},
|
||||
"moveToNext": "přesunout na další"
|
||||
},
|
||||
"common": {
|
||||
"backward": "zpátky",
|
||||
@@ -298,21 +395,43 @@
|
||||
"random": "náhodně",
|
||||
"size": "velikost",
|
||||
"biography": "biografie",
|
||||
"note": "poznámka"
|
||||
"note": "poznámka",
|
||||
"albumGain": "gain alba",
|
||||
"albumPeak": "vrchol alba",
|
||||
"close": "zavřít",
|
||||
"mbid": "ID MusicBrainz",
|
||||
"trackGain": "zisk (gain) skladby",
|
||||
"reload": "znovu načíst",
|
||||
"share": "sdílet",
|
||||
"codec": "kodek",
|
||||
"trackPeak": "vrchol skladby",
|
||||
"preview": "náhled",
|
||||
"translation": "překlad",
|
||||
"additionalParticipants": "další přispívající",
|
||||
"tags": "štítky",
|
||||
"viewReleaseNotes": "zobrazit seznam změn",
|
||||
"newVersion": "byla nainstalována nová verze ({{version}})",
|
||||
"bitDepth": "bitová hloubka",
|
||||
"sampleRate": "vzorkovací frekvence"
|
||||
},
|
||||
"table": {
|
||||
"config": {
|
||||
"view": {
|
||||
"card": "karta",
|
||||
"table": "tabulka",
|
||||
"poster": "plakát"
|
||||
"poster": "plakát",
|
||||
"list": "seznam",
|
||||
"grid": "mřížka"
|
||||
},
|
||||
"general": {
|
||||
"displayType": "typ zobrazení",
|
||||
"gap": "$t(common.gap)",
|
||||
"tableColumns": "sloupce tabulky",
|
||||
"autoFitColumns": "automaticky přizpůsobit sloupce",
|
||||
"size": "$t(common.size)"
|
||||
"size": "$t(common.size)",
|
||||
"itemGap": "mezera mezi položkami (px)",
|
||||
"itemSize": "velikost položek (px)",
|
||||
"followCurrentSong": "následovat aktuální skladbu"
|
||||
},
|
||||
"label": {
|
||||
"releaseDate": "datum vydání",
|
||||
@@ -340,7 +459,9 @@
|
||||
"discNumber": "číslo disku",
|
||||
"favorite": "$t(common.favorite)",
|
||||
"year": "$t(common.year)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)"
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"codec": "$t(common.codec)",
|
||||
"songCount": "$t(entity.track_other)"
|
||||
}
|
||||
},
|
||||
"column": {
|
||||
@@ -365,7 +486,9 @@
|
||||
"albumArtist": "umělec alba",
|
||||
"path": "cesta",
|
||||
"discNumber": "disk",
|
||||
"channels": "$t(common.channel_other)"
|
||||
"channels": "$t(common.channel_other)",
|
||||
"size": "$t(common.size)",
|
||||
"codec": "$t(common.codec)"
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
@@ -387,7 +510,12 @@
|
||||
"mpvRequired": "vyžadován přehrávač MPV",
|
||||
"audioDeviceFetchError": "při pokusu o přístup ke zvukovým zařízením se vyskytla chyba",
|
||||
"invalidServer": "neplatný server",
|
||||
"loginRateError": "příliš mnoho pokusů o přihlášení, zkuste to znovu za pár vteřin"
|
||||
"loginRateError": "příliš mnoho pokusů o přihlášení, zkuste to znovu za pár vteřin",
|
||||
"badAlbum": "tuto stránku vidíte, protože tato skladba není součástí alba. tento problém může nastat, pokud máte skladbu na nejvyšší úrovni vaší složky s hudbou. jellyfin seskupuje skladby pouze, pokud se nacházejí ve složce.",
|
||||
"networkError": "vyskytla se chyba sítě",
|
||||
"openError": "nepodařilo se otevřít soubor",
|
||||
"badValue": "neplatná možnost „{{value}}“. tato možnost již neexistuje",
|
||||
"notificationDenied": "oprávnění k posílání oznámení byla zamítnuta. toto nastavení nemá žádný vliv"
|
||||
},
|
||||
"filter": {
|
||||
"mostPlayed": "nejvíce přehráváno",
|
||||
@@ -445,7 +573,9 @@
|
||||
"settings": "$t(common.setting_other)",
|
||||
"home": "$t(common.home)",
|
||||
"artists": "$t(entity.artist_other)",
|
||||
"albumArtists": "$t(entity.albumArtist_other)"
|
||||
"albumArtists": "$t(entity.albumArtist_other)",
|
||||
"shared": "$t(entity.playlist_other) sdíleny",
|
||||
"myLibrary": "moje knihovna"
|
||||
},
|
||||
"fullscreenPlayer": {
|
||||
"config": {
|
||||
@@ -459,11 +589,16 @@
|
||||
"unsynchronized": "nesynchronizováno",
|
||||
"lyricAlignment": "zarovnání textů",
|
||||
"useImageAspectRatio": "použít poměr stran obrázku",
|
||||
"lyricGap": "mezera textů"
|
||||
"lyricGap": "mezera textů",
|
||||
"dynamicImageBlur": "velikost rozostření obrázku",
|
||||
"dynamicIsImage": "povolit obrázek na pozadí",
|
||||
"lyricOffset": "posunutí textů (ms)"
|
||||
},
|
||||
"upNext": "další",
|
||||
"lyrics": "texty",
|
||||
"related": "související"
|
||||
"related": "související",
|
||||
"visualizer": "vizualizér",
|
||||
"noLyrics": "nenalezeny žádné texty"
|
||||
},
|
||||
"appMenu": {
|
||||
"selectServer": "vybrat server",
|
||||
@@ -475,7 +610,9 @@
|
||||
"openBrowserDevtools": "otevřít vývojářské nástroje",
|
||||
"quit": "$t(common.quit)",
|
||||
"goBack": "přejít zpět",
|
||||
"goForward": "přejít vpřed"
|
||||
"goForward": "přejít vpřed",
|
||||
"privateModeOff": "vypnout soukromý režim",
|
||||
"privateModeOn": "zapnout soukromý režim"
|
||||
},
|
||||
"contextMenu": {
|
||||
"addToPlaylist": "$t(action.addToPlaylist)",
|
||||
@@ -493,33 +630,48 @@
|
||||
"addFavorite": "$t(action.addToFavorites)",
|
||||
"play": "$t(player.play)",
|
||||
"numberSelected": "vybráno {{count}}",
|
||||
"removeFromQueue": "$t(action.removeFromQueue)"
|
||||
"removeFromQueue": "$t(action.removeFromQueue)",
|
||||
"showDetails": "získat informace",
|
||||
"shareItem": "sdílet položku",
|
||||
"playSimilarSongs": "$t(player.playSimilarSongs)",
|
||||
"download": "stáhnout",
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"moveToNext": "$t(action.moveToNext)",
|
||||
"goToAlbum": "přejít na $t(entity.album_one)",
|
||||
"goToAlbumArtist": "přejít na $t(entity.albumArtist_one)"
|
||||
},
|
||||
"home": {
|
||||
"mostPlayed": "nejpřehrávanější",
|
||||
"newlyAdded": "nově přidáno",
|
||||
"title": "$t(common.home)",
|
||||
"explore": "procházet z vaší knihovny",
|
||||
"recentlyPlayed": "nedávno přehráno"
|
||||
"recentlyPlayed": "nedávno přehráno",
|
||||
"recentlyReleased": "nedávno vydáno"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "více od tohoto umělce",
|
||||
"moreFromGeneric": "více od {{item}}"
|
||||
"moreFromGeneric": "více od {{item}}",
|
||||
"released": "vydáno"
|
||||
},
|
||||
"setting": {
|
||||
"playbackTab": "přehrávání",
|
||||
"generalTab": "obecné",
|
||||
"hotkeysTab": "klávesové zkratky",
|
||||
"windowTab": "okno"
|
||||
"windowTab": "okno",
|
||||
"advanced": "pokročilé"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
},
|
||||
"genreList": {
|
||||
"title": "$t(entity.genre_other)"
|
||||
"title": "$t(entity.genre_other)",
|
||||
"showTracks": "zobrazit $t(entity.track_other) s žánrem",
|
||||
"showAlbums": "zobrazit $t(entity.album_other) s žánrem"
|
||||
},
|
||||
"trackList": {
|
||||
"title": "$t(entity.track_other)"
|
||||
"title": "$t(entity.track_other)",
|
||||
"artistTracks": "skladby od umělce {{artist}}",
|
||||
"genreTracks": "$t(entity.track_other) s žánrem „{{genre}}“"
|
||||
},
|
||||
"globalSearch": {
|
||||
"commands": {
|
||||
@@ -533,7 +685,36 @@
|
||||
"title": "$t(entity.playlist_other)"
|
||||
},
|
||||
"albumList": {
|
||||
"title": "$t(entity.album_other)"
|
||||
"title": "$t(entity.album_other)",
|
||||
"artistAlbums": "alba od umělce {{artist}}",
|
||||
"genreAlbums": "$t(entity.album_other) s žánrem „{{genre}}“"
|
||||
},
|
||||
"albumArtistDetail": {
|
||||
"recentReleases": "nedávno vydáno",
|
||||
"viewDiscography": "zobrazit diskografii",
|
||||
"about": "O umělci {{artist}}",
|
||||
"appearsOn": "také v",
|
||||
"topSongs": "nejlepší skladby",
|
||||
"topSongsFrom": "nejlepší skladby od umělce {{title}}",
|
||||
"relatedArtists": "podobní $t(entity.artist_other)",
|
||||
"viewAllTracks": "zobrazit všechny $t(entity.track_other)",
|
||||
"viewAll": "zobrazit vše"
|
||||
},
|
||||
"itemDetail": {
|
||||
"copiedPath": "cesta úspěšně zkopírována",
|
||||
"copyPath": "kopírovat cestu do schránky",
|
||||
"openFile": "zobrazit skladbu ve správci souborů"
|
||||
},
|
||||
"playlist": {
|
||||
"reorder": "změna pořadí povolena pouze při řazení podle id"
|
||||
},
|
||||
"manageServers": {
|
||||
"url": "URL",
|
||||
"username": "uživatelské jméno",
|
||||
"editServerDetailsTooltip": "upravit podrobnosti o serveru",
|
||||
"removeServer": "odstranit server",
|
||||
"serverDetails": "podrobnosti o serveru",
|
||||
"title": "správa serverů"
|
||||
}
|
||||
},
|
||||
"form": {
|
||||
@@ -561,7 +742,9 @@
|
||||
"input_savePassword": "uložit heslo",
|
||||
"ignoreSsl": "ignorovat SSL $t(common.restartRequired)",
|
||||
"ignoreCors": "ignorovat CORS $t(common.restartRequired)",
|
||||
"error_savePassword": "při ukládání hesla se vyskytla chyba"
|
||||
"error_savePassword": "při ukládání hesla se vyskytla chyba",
|
||||
"input_preferInstantMix": "preferovat instantní mix",
|
||||
"input_preferInstantMixDescription": "pro získání podobných skladeb použít pouze instantní mix. užitečné, pokud máte doplňky, které upravují toto chování"
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"success": "přidáno $t(entity.trackWithCount, {\"count\": {{message}} }) do $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })",
|
||||
@@ -575,7 +758,8 @@
|
||||
},
|
||||
"queryEditor": {
|
||||
"input_optionMatchAll": "shoda všeho",
|
||||
"input_optionMatchAny": "shoda libovolného"
|
||||
"input_optionMatchAny": "shoda libovolného",
|
||||
"title": "editor dotazů"
|
||||
},
|
||||
"lyricSearch": {
|
||||
"input_name": "$t(common.name)",
|
||||
@@ -583,7 +767,22 @@
|
||||
"title": "Hledat texty"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"title": "upravit $t(entity.playlist_one)"
|
||||
"title": "upravit $t(entity.playlist_one)",
|
||||
"success": "$t(entity.playlist_one) úspěšně aktualizován",
|
||||
"publicJellyfinNote": "Jellyfin z nějakého důvodu neukazuje, zda je seznam skladeb veřejný, nebo ne. Pokud si přejete, aby zůstal veřejný, zvolte prosím následující vstup"
|
||||
},
|
||||
"shareItem": {
|
||||
"allowDownloading": "umožnit stahování",
|
||||
"success": "odkaz ke sdílení zkopírován do schránky (klikněte sem pro otevření)",
|
||||
"description": "popis",
|
||||
"expireInvalid": "čas vypršení musí být v budoucnosti",
|
||||
"setExpiration": "nastavit vypršení",
|
||||
"createFailed": "nepodařilo se vytvořit sdílení (je sdílení povoleno?)"
|
||||
},
|
||||
"privateMode": {
|
||||
"enabled": "soukromý režim povolen, stav přehrávání je nyní skryt před externími integracemi",
|
||||
"disabled": "soukromý režim povolen, stav přehrávání je nyní viditelný pro externími integrace",
|
||||
"title": "soukromý režim"
|
||||
}
|
||||
},
|
||||
"entity": {
|
||||
@@ -603,8 +802,8 @@
|
||||
"folderWithCount_few": "{{count}} složky",
|
||||
"folderWithCount_other": "{{count}} složek",
|
||||
"albumArtist_one": "umělec alba",
|
||||
"albumArtist_few": "umělci alba",
|
||||
"albumArtist_other": "umělců alba",
|
||||
"albumArtist_few": "umělci alb",
|
||||
"albumArtist_other": "umělci alb",
|
||||
"track_one": "skladba",
|
||||
"track_few": "skladby",
|
||||
"track_other": "skladby",
|
||||
@@ -632,6 +831,12 @@
|
||||
"genreWithCount_other": "{{count}} žánrů",
|
||||
"trackWithCount_one": "{{count}} skladba",
|
||||
"trackWithCount_few": "{{count}} skladby",
|
||||
"trackWithCount_other": "{{count}} skladeb"
|
||||
"trackWithCount_other": "{{count}} skladeb",
|
||||
"play_one": "{{count}} přehrání",
|
||||
"play_few": "{{count}} přehrání",
|
||||
"play_other": "{{count}} přehrání",
|
||||
"song_one": "píseň",
|
||||
"song_few": "písničky",
|
||||
"song_other": "písní"
|
||||
}
|
||||
}
|
||||
|
||||
+142
-27
@@ -16,7 +16,12 @@
|
||||
"removeFromQueue": "Von Warteschlange entfernen",
|
||||
"setRating": "Bewertung festlegen",
|
||||
"toggleSmartPlaylistEditor": "Editor $t(entity.smartPlaylist) umschalten",
|
||||
"removeFromFavorites": "Entfernen von $t(entity.favorite_other)"
|
||||
"removeFromFavorites": "Entfernen von $t(entity.favorite_other)",
|
||||
"openIn": {
|
||||
"lastfm": "In Last.fm öffnen",
|
||||
"musicbrainz": "In MusicBrainz öffnen"
|
||||
},
|
||||
"moveToNext": "nach unten verschieben"
|
||||
},
|
||||
"common": {
|
||||
"backward": "rückwärts",
|
||||
@@ -62,7 +67,7 @@
|
||||
"cancel": "Abbrechen",
|
||||
"forceRestartRequired": "Neustarten um die Änderungen zu übernehmen... Schließe die Benachrichtigung zum Neustarten",
|
||||
"setting": "Einstellungen",
|
||||
"setting_one": "",
|
||||
"setting_one": "Einstellung",
|
||||
"setting_other": "Einstellungen",
|
||||
"version": "Version",
|
||||
"title": "Titel",
|
||||
@@ -98,7 +103,23 @@
|
||||
"random": "zufällig",
|
||||
"size": "Größe",
|
||||
"biography": "Biografie",
|
||||
"note": "Hinweis"
|
||||
"note": "Hinweis",
|
||||
"preview": "Vorschau",
|
||||
"reload": "Neu Laden",
|
||||
"mbid": "MusicBrainz ID",
|
||||
"close": "schliessen",
|
||||
"share": "Teilen",
|
||||
"translation": "Übersetzung",
|
||||
"trackGain": "Track-Pegelverstärkung",
|
||||
"trackPeak": "Track-Spitzenpegel",
|
||||
"codec": "Codec",
|
||||
"albumPeak": "Album-Spitzenpegel",
|
||||
"albumGain": "Album-Pegelverstärkung",
|
||||
"tags": "tags",
|
||||
"viewReleaseNotes": "Release Notes anzeigen",
|
||||
"newVersion": "eine neue Version wurde installiert ({{version}})",
|
||||
"bitDepth": "Bittiefe",
|
||||
"sampleRate": "Abtastrate"
|
||||
},
|
||||
"error": {
|
||||
"remotePortWarning": "Starten Sie den Server neu, um den neuen Port anzuwenden",
|
||||
@@ -119,7 +140,12 @@
|
||||
"mpvRequired": "MPV benötigt",
|
||||
"audioDeviceFetchError": "Beim Versuch, Audiogeräte abzurufen, ist ein Fehler aufgetreten",
|
||||
"invalidServer": "Ungültiger Server",
|
||||
"loginRateError": "Zu viele Anmeldeversuche, bitte versuche es in einigen Sekunden erneut"
|
||||
"loginRateError": "Zu viele Anmeldeversuche, bitte versuche es in einigen Sekunden erneut",
|
||||
"badAlbum": "Sie sehen diese Seite, weil dieses Lied nicht Teil eines Albums ist. Wahrscheinlich sehen Sie dieses Problem, wenn Sie einen Song in Ihrem Musikordner auf oberster Ebene haben. Jellyfin gruppiert nur Songs, wenn sie sich in einem Ordner befinden.",
|
||||
"networkError": "ein Netzwerkfehler ist aufgetreten",
|
||||
"openError": "datei kann nicht geöffnet werden",
|
||||
"badValue": "ungültige option \"{{value}}\". Dieser Wert existiert nicht mehr",
|
||||
"notificationDenied": "Berechtigungen über Benachrichtigungen wurden verweigert. Diese Einstellung hat keinen Effekt"
|
||||
},
|
||||
"filter": {
|
||||
"mostPlayed": "Meistgespielt",
|
||||
@@ -167,13 +193,13 @@
|
||||
},
|
||||
"form": {
|
||||
"deletePlaylist": {
|
||||
"title": "Lösche $t(entity.playlist_one)",
|
||||
"title": "$t(entity.playlist_one) löschen",
|
||||
"success": "$t(entity.playlist_one) erfolgreich gelöscht",
|
||||
"input_confirm": "Geben Sie zur Bestätigung den Namen von $t(entity.playlist_one) ein"
|
||||
},
|
||||
"createPlaylist": {
|
||||
"input_description": "$t(common.description)",
|
||||
"title": "Erstellen $t(entity.playlist_one)",
|
||||
"title": "$t(entity.playlist_one) erstellen",
|
||||
"input_public": "öffentlich",
|
||||
"success": "$t(entity.playlist_one) erfolgreich erstellt",
|
||||
"input_name": "$t(common.name)",
|
||||
@@ -207,12 +233,27 @@
|
||||
"input_optionMatchAny": "Treffer Einige"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"title": "Bearbeite $t(entity.playlist_one)"
|
||||
"title": "Bearbeite $t(entity.playlist_one)",
|
||||
"success": "$t(entity.playlist_one) erfolgreich aktualisiert",
|
||||
"publicJellyfinNote": "Jellyfin legt aus irgendwelchen Gründen nicht offen ob eine Playlist öffentlich ist oder nicht. Wenn du möchtest, dass sie öffentlich bleibt, wähle bitte diese Option aus"
|
||||
},
|
||||
"lyricSearch": {
|
||||
"title": "Songtext Suche",
|
||||
"input_name": "$t(common.name)",
|
||||
"input_artist": "$t(entity.artist_one)"
|
||||
},
|
||||
"shareItem": {
|
||||
"description": "Beschreibung",
|
||||
"setExpiration": "Ablaufdatum setzen",
|
||||
"expireInvalid": "Ablaufdatum muss in der Zukunft liegen",
|
||||
"allowDownloading": "Herunterladen zulassen",
|
||||
"success": "Link in die Zwischenablage kopiert (oder hier klicken um zu öffnen)",
|
||||
"createFailed": "Fehler beim Teilen (Ist Teilen aktiviert?)"
|
||||
},
|
||||
"privateMode": {
|
||||
"enabled": "Privatmodus aktiviert, Wiedergabe-Status wird externen Quellen nicht preisgegeben",
|
||||
"disabled": "Privatmodus deaktiviert, Wiedergabe-Status wird externen Quellen preisgegeben",
|
||||
"title": "Privatmodus"
|
||||
}
|
||||
},
|
||||
"entity": {
|
||||
@@ -246,7 +287,11 @@
|
||||
"genreWithCount_other": "{{count}} Genres",
|
||||
"trackWithCount_one": "{{count}} Track",
|
||||
"trackWithCount_other": "{{count}} Tracks",
|
||||
"smartPlaylist": "Smart $t(entity.playlist_one)"
|
||||
"smartPlaylist": "Smart $t(entity.playlist_one)",
|
||||
"play_one": "{{count}} Wiedergabe",
|
||||
"play_other": "{{count}} Wiedergaben",
|
||||
"song_one": "Lied",
|
||||
"song_other": "Lieder"
|
||||
},
|
||||
"table": {
|
||||
"config": {
|
||||
@@ -310,7 +355,8 @@
|
||||
"discNumber": "Disk",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"trackNumber": "Nr."
|
||||
"trackNumber": "Nr.",
|
||||
"size": "$t(common.size)"
|
||||
}
|
||||
},
|
||||
"page": {
|
||||
@@ -326,11 +372,16 @@
|
||||
"unsynchronized": "nicht synchronisiert",
|
||||
"lyricAlignment": "Songtext-Ausrichtung",
|
||||
"useImageAspectRatio": "Bildseitenverhältnis verwenden",
|
||||
"lyricGap": "Songtext-Lücke"
|
||||
"lyricGap": "Songtext-Lücke",
|
||||
"dynamicIsImage": "Hintergrundbild aktivieren",
|
||||
"dynamicImageBlur": "Größe der Bildunschärfe",
|
||||
"lyricOffset": "Zeitversetzung des Liedtexts (ms)"
|
||||
},
|
||||
"upNext": "als nächstes",
|
||||
"lyrics": "Songtexte",
|
||||
"related": "Ähnliche"
|
||||
"related": "Ähnliche",
|
||||
"noLyrics": "Keine Liedtexte gefunden",
|
||||
"visualizer": "visualizer"
|
||||
},
|
||||
"appMenu": {
|
||||
"selectServer": "Server auswählen",
|
||||
@@ -342,29 +393,33 @@
|
||||
"goBack": "Gehe zurück",
|
||||
"goForward": "Gehe vorwärts",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"quit": "$t(common.quit)"
|
||||
"quit": "$t(common.quit)",
|
||||
"privateModeOff": "Privatmodus deaktivieren",
|
||||
"privateModeOn": "Privatmodus aktivieren"
|
||||
},
|
||||
"home": {
|
||||
"mostPlayed": "Meistgespielt",
|
||||
"newlyAdded": "Neu hinzugefügte Veröffentlichungen",
|
||||
"explore": "Entdecke deine Bibliothek",
|
||||
"recentlyPlayed": "Kürzlich gespielt",
|
||||
"title": "$t(common.home)"
|
||||
"title": "$t(common.home)",
|
||||
"recentlyReleased": "kürzlich veröffentlicht"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "Mehr von diesem $t(entity.artist_one)",
|
||||
"moreFromGeneric": "Mehr von {{item}}"
|
||||
"moreFromGeneric": "Mehr von {{item}}",
|
||||
"released": "erschienen"
|
||||
},
|
||||
"globalSearch": {
|
||||
"commands": {
|
||||
"serverCommands": "Serverbefehle",
|
||||
"goToPage": "Gehe zur Seite",
|
||||
"searchFor": "Suche nach {{query}}"
|
||||
"searchFor": "Nach {{query}} suchen"
|
||||
},
|
||||
"title": "Befehle"
|
||||
},
|
||||
"contextMenu": {
|
||||
"numberSelected": "{{count}} Ausgewählte",
|
||||
"numberSelected": "{{count}} ausgewählt",
|
||||
"addToPlaylist": "$t(action.addToPlaylist)",
|
||||
"addToFavorites": "$t(action.addToFavorites)",
|
||||
"setRating": "$t(action.setRating)",
|
||||
@@ -379,7 +434,13 @@
|
||||
"addLast": "$t(player.addLast)",
|
||||
"addFavorite": "$t(action.addToFavorites)",
|
||||
"play": "$t(player.play)",
|
||||
"removeFromQueue": "$t(action.removeFromQueue)"
|
||||
"removeFromQueue": "$t(action.removeFromQueue)",
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"download": "Download",
|
||||
"playSimilarSongs": "$t(player.playSimilarSongs)",
|
||||
"moveToNext": "$t(action.moveToNext)",
|
||||
"shareItem": "teilen",
|
||||
"showDetails": "Informationen"
|
||||
},
|
||||
"sidebar": {
|
||||
"nowPlaying": "läuft gerade",
|
||||
@@ -392,28 +453,61 @@
|
||||
"settings": "$t(common.setting_other)",
|
||||
"home": "$t(common.home)",
|
||||
"artists": "$t(entity.artist_other)",
|
||||
"albumArtists": "$t(entity.albumArtist_other)"
|
||||
"albumArtists": "$t(entity.albumArtist_other)",
|
||||
"shared": "$t(entity.playlist_other) geteilt",
|
||||
"myLibrary": "meine bibliothek"
|
||||
},
|
||||
"setting": {
|
||||
"playbackTab": "Wiedergabe",
|
||||
"generalTab": "allgemein",
|
||||
"generalTab": "Allgemein",
|
||||
"hotkeysTab": "Kurzbefehle",
|
||||
"windowTab": "Fenster"
|
||||
"windowTab": "Fenster",
|
||||
"advanced": "Erweitert"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
},
|
||||
"genreList": {
|
||||
"title": "$t(entity.genre_other)"
|
||||
"title": "$t(entity.genre_other)",
|
||||
"showTracks": "$t(entity.genre_one) $t(entity.track_other) anzeigen",
|
||||
"showAlbums": "$t(entity.genre_one) $t(entity.album_other) anzeigen"
|
||||
},
|
||||
"trackList": {
|
||||
"title": "$t(entity.track_other)"
|
||||
"title": "$t(entity.track_other)",
|
||||
"artistTracks": "Tracks von {{artist}}",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track_other)"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist_other)"
|
||||
},
|
||||
"albumList": {
|
||||
"title": "$t(entity.album_other)"
|
||||
"title": "$t(entity.album_other)",
|
||||
"artistAlbums": "Alben von {{artist}}",
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)"
|
||||
},
|
||||
"albumArtistDetail": {
|
||||
"about": "Über {{artist}}",
|
||||
"appearsOn": "erscheint auf",
|
||||
"recentReleases": "Kürzliche Veröffentlichungen",
|
||||
"viewDiscography": "Diskographie ansehen",
|
||||
"viewAllTracks": "Alle $t(entity.track_other) ansehen",
|
||||
"topSongsFrom": "Toplieder von {{title}}",
|
||||
"viewAll": "Alles ansehen",
|
||||
"topSongs": "Toplieder",
|
||||
"relatedArtists": "ähnliche $t(entity.artist_other)"
|
||||
},
|
||||
"manageServers": {
|
||||
"title": "Servers verwalten",
|
||||
"editServerDetailsTooltip": "Serverdetails editieren",
|
||||
"removeServer": "Server entfernen",
|
||||
"url": "URL",
|
||||
"serverDetails": "Serverdetails",
|
||||
"username": "Benutzername"
|
||||
},
|
||||
"itemDetail": {
|
||||
"copyPath": "Pfad in Zwischenablage kopieren",
|
||||
"copiedPath": "Pfad erfolgreich kopiert",
|
||||
"openFile": "Track im Dateiexplorer anzeigen"
|
||||
}
|
||||
},
|
||||
"player": {
|
||||
@@ -445,10 +539,12 @@
|
||||
"pause": "Pause",
|
||||
"unfavorite": "Aus Favoriten entfernen",
|
||||
"skip_forward": "Vorspulen",
|
||||
"skip": "Überspringen"
|
||||
"skip": "Überspringen",
|
||||
"playSimilarSongs": "Ähnliche Lieder abspielen",
|
||||
"viewQueue": "Warteschlange anzeigen"
|
||||
},
|
||||
"setting": {
|
||||
"audioDevice_description": "Wählen Sie das Audiogerät aus, das für die Wiedergabe verwendet werden soll (nur Webplayer).",
|
||||
"audioDevice_description": "Wählen Sie das Audiogerät aus, das für die Wiedergabe verwendet werden soll (nur Webplayer)",
|
||||
"audioExclusiveMode": "Audio-Exklusivmodus",
|
||||
"audioDevice": "Audiogerät",
|
||||
"accentColor": "Akzentfarbe",
|
||||
@@ -602,12 +698,31 @@
|
||||
"windowBarStyle_description": "Wähle den Stil der Windows-Leiste",
|
||||
"hotkey_toggleCurrentSongFavorite": "$t(common.currentSong) zu Favoriten hinzufügen",
|
||||
"clearQueryCache_description": "\"Weiches\" Zurücksetzen. Dies wird Playlisten, Musik-Metadaten und gespeicherte Liedtexte zurücksetzen, Zugangsinformationen und zwischengespeicherte Bilder werden behalten",
|
||||
"discordRichPresence_description": "Zeige deinen Wiedergabe-Status in {{discord}} als rich presence an. Angezeigte Bilder sind: {{icon}}, {{playing}}, und {{paused}} ",
|
||||
"discordRichPresence_description": "Zeige deinen Wiedergabe-Status in {{discord}} als rich presence an. Angezeigte Bilder sind: {{icon}}, {{playing}}, und {{paused}}",
|
||||
"clearCache": "Browser-Zwischenspeicher löschen",
|
||||
"clearQueryCache": "feishins Zwischenspeicher leeren",
|
||||
"clearCache_description": "Hartes Zurücksetzen. Neben feishins Zwischenspeicher wird auch der des Browsers gelöscht (Bilder und andere Daten). Zugangsinformationen und Einstellungen werden behalten",
|
||||
"sidePlayQueueStyle": "Wiedergabelistenstil in der Seitenleiste",
|
||||
"zoom_description": "Setzt den Zoom (in %) für das Programm",
|
||||
"zoom": "Zoom"
|
||||
"zoom": "Zoom",
|
||||
"albumBackground": "Album Hintergrund",
|
||||
"customCss": "Benutzerdefiniert css",
|
||||
"homeConfiguration": "Startseite Konfiguration",
|
||||
"lastfmApiKey": "{{lastfm}} API-Schlüssel",
|
||||
"lastfmApiKey_description": "Der API-Schlüssel für {{lastfm}}. wird für benötigt",
|
||||
"discordListening": "Status als hört zu anzeigen",
|
||||
"discordListening_description": "Status als hört zu statt als spielt anzeigen",
|
||||
"lastfm": "zeige last.fm links",
|
||||
"lastfm_description": "zeige links zu last.fm auf dem Künstler/Album-Seiten",
|
||||
"musicbrainz": "Zeig musicbrainz links",
|
||||
"customCssEnable": "aktiviere Benutzerdefinierte css",
|
||||
"albumBackground_description": "fügt ein Hintergrundbild für die Albumseiten hinzu, welche das Albumcover zeigen",
|
||||
"albumBackgroundBlur": "Größe der Album-Bildunschärfe",
|
||||
"albumBackgroundBlur_description": "passt die Stärke der Unschärfe an, welche auf das Hintergrundbild des Albums angewandt wird",
|
||||
"clearCacheSuccess": "Cache erfolgreich geleert",
|
||||
"contextMenu": "Kontextmenü-Einstellungen (Rechtsklick)",
|
||||
"customCssEnable_description": "ermöglicht das Schreiben benutzerdefinierten CSS.",
|
||||
"doubleClickBehavior": "bei Doppelklick alle gesuchten Tracks zur Warteschlange hinzufügen",
|
||||
"artistBackground": "Künstler Hintergrundbild"
|
||||
}
|
||||
}
|
||||
|
||||
+177
-8
@@ -8,6 +8,7 @@
|
||||
"deselectAll": "deselect all",
|
||||
"editPlaylist": "edit $t(entity.playlist_one)",
|
||||
"goToPage": "go to page",
|
||||
"moveToNext": "move to next",
|
||||
"moveToBottom": "move to bottom",
|
||||
"moveToTop": "move to top",
|
||||
"refresh": "$t(common.refresh)",
|
||||
@@ -26,10 +27,16 @@
|
||||
"action_one": "action",
|
||||
"action_other": "actions",
|
||||
"add": "add",
|
||||
"additionalParticipants": "additional participants",
|
||||
"newVersion": "a new version has been installed ({{version}})",
|
||||
"viewReleaseNotes": "view release notes",
|
||||
"albumGain": "album gain",
|
||||
"albumPeak": "album peak",
|
||||
"areYouSure": "are you sure?",
|
||||
"ascending": "ascending",
|
||||
"backward": "backward",
|
||||
"biography": "biography",
|
||||
"bitDepth": "bit depth",
|
||||
"bitrate": "bitrate",
|
||||
"bpm": "bpm",
|
||||
"cancel": "cancel",
|
||||
@@ -72,6 +79,7 @@
|
||||
"menu": "menu",
|
||||
"minimize": "minimize",
|
||||
"modified": "modified",
|
||||
"mbid": "MusicBrainz ID",
|
||||
"name": "name",
|
||||
"no": "no",
|
||||
"none": "none",
|
||||
@@ -81,6 +89,7 @@
|
||||
"owner": "owner",
|
||||
"path": "path",
|
||||
"playerMustBePaused": "player must be paused",
|
||||
"preview": "preview",
|
||||
"previousSong": "previous $t(entity.track_one)",
|
||||
"quit": "quit",
|
||||
"random": "random",
|
||||
@@ -91,6 +100,7 @@
|
||||
"resetToDefault": "reset to default",
|
||||
"restartRequired": "restart required",
|
||||
"right": "right",
|
||||
"sampleRate": "sample rate",
|
||||
"save": "save",
|
||||
"saveAndReplace": "save and replace",
|
||||
"saveAs": "save as",
|
||||
@@ -98,10 +108,15 @@
|
||||
"setting": "setting",
|
||||
"setting_one": "setting",
|
||||
"setting_other": "settings",
|
||||
"share": "share",
|
||||
"size": "size",
|
||||
"sortOrder": "order",
|
||||
"tags": "tags",
|
||||
"title": "title",
|
||||
"trackNumber": "track",
|
||||
"trackGain": "track gain",
|
||||
"trackPeak": "track peak",
|
||||
"translation": "translation",
|
||||
"unknown": "unknown",
|
||||
"version": "version",
|
||||
"year": "year",
|
||||
@@ -132,11 +147,15 @@
|
||||
"genreWithCount_other": "{{count}} genres",
|
||||
"playlist_one": "playlist",
|
||||
"playlist_other": "playlists",
|
||||
"play_one": "{{count}} play",
|
||||
"play_other": "{{count}} plays",
|
||||
"playlistWithCount_one": "{{count}} playlist",
|
||||
"playlistWithCount_other": "{{count}} playlists",
|
||||
"smartPlaylist": "smart $t(entity.playlist_one)",
|
||||
"track_one": "track",
|
||||
"track_other": "tracks",
|
||||
"song_one": "song",
|
||||
"song_other": "songs",
|
||||
"trackWithCount_one": "{{count}} track",
|
||||
"trackWithCount_other": "{{count}} tracks"
|
||||
},
|
||||
@@ -144,6 +163,8 @@
|
||||
"apiRouteError": "unable to route request",
|
||||
"audioDeviceFetchError": "an error occurred when trying to get audio devices",
|
||||
"authenticationFailed": "authentication failed",
|
||||
"badAlbum": "you are seeing this page because this song is not part of an album. you are most likely seeing this issue if you have a song at the top level of your music folder. jellyfin only groups tracks if they are in a folder.",
|
||||
"badValue": "invalid option \"{{value}}\". this value no longer exists",
|
||||
"credentialsRequired": "credentials required",
|
||||
"endpointNotImplementedError": "endpoint {{endpoint}} is not implemented for {{serverType}}",
|
||||
"genericError": "an error occurred",
|
||||
@@ -152,6 +173,8 @@
|
||||
"loginRateError": "too many login attempts, please try again in a few seconds",
|
||||
"mpvRequired": "MPV required",
|
||||
"networkError": "a network error occurred",
|
||||
"notificationDenied": "permissions for notifications were denied. this setting has no effect",
|
||||
"openError": "could not open file",
|
||||
"playbackError": "an error occurred when trying to play the media",
|
||||
"remoteDisableError": "an error occurred when trying to $t(common.disable) the remote server",
|
||||
"remoteEnableError": "an error occurred when trying to $t(common.enable) the remote server",
|
||||
@@ -214,6 +237,8 @@
|
||||
"input_legacyAuthentication": "enable legacy authentication",
|
||||
"input_name": "server name",
|
||||
"input_password": "password",
|
||||
"input_preferInstantMix": "prefer instant mix",
|
||||
"input_preferInstantMixDescription": "only use instant mix to get similar songs. useful if you have plugins that modify this behavior",
|
||||
"input_savePassword": "save password",
|
||||
"input_url": "url",
|
||||
"input_username": "username",
|
||||
@@ -240,6 +265,8 @@
|
||||
"title": "delete $t(entity.playlist_one)"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"publicJellyfinNote": "Jellyfin for some reason does not expose whether a playlist is public or not. If you wish for this to remain public, please have the following input selected",
|
||||
"success": "$t(entity.playlist_one) updated successfully",
|
||||
"title": "edit $t(entity.playlist_one)"
|
||||
},
|
||||
"lyricSearch": {
|
||||
@@ -248,12 +275,26 @@
|
||||
"title": "lyric search"
|
||||
},
|
||||
"queryEditor": {
|
||||
"title": "query editor",
|
||||
"input_optionMatchAll": "match all",
|
||||
"input_optionMatchAny": "match any"
|
||||
},
|
||||
"shareItem": {
|
||||
"allowDownloading": "allow downloading",
|
||||
"description": "description",
|
||||
"setExpiration": "set expiration",
|
||||
"success": "share link copied to clipboard (or click here to open)",
|
||||
"expireInvalid": "expiration must be in the future",
|
||||
"createFailed": "failed to create share (is sharing enabled?)"
|
||||
},
|
||||
"updateServer": {
|
||||
"success": "server updated successfully",
|
||||
"title": "update server"
|
||||
},
|
||||
"privateMode": {
|
||||
"enabled": "private mode enabled, playback status is now hidden from external integrations",
|
||||
"disabled": "private mode disabled, playback status is now visible to enabled external integrations",
|
||||
"title": "private mode"
|
||||
}
|
||||
},
|
||||
"page": {
|
||||
@@ -264,7 +305,7 @@
|
||||
"viewDiscography": "view discography",
|
||||
"relatedArtists": "related $t(entity.artist_other)",
|
||||
"topSongs": "top songs",
|
||||
"topSongsFrom": "Top songs from {{title}}",
|
||||
"topSongsFrom": "top songs from {{title}}",
|
||||
"viewAll": "view all",
|
||||
"viewAllTracks": "view all $t(entity.track_other)"
|
||||
},
|
||||
@@ -273,9 +314,12 @@
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "more from this $t(entity.artist_one)",
|
||||
"moreFromGeneric": "more from {{item}}"
|
||||
"moreFromGeneric": "more from {{item}}",
|
||||
"released": "released"
|
||||
},
|
||||
"albumList": {
|
||||
"artistAlbums": "albums by {{artist}}",
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)",
|
||||
"title": "$t(entity.album_other)"
|
||||
},
|
||||
"appMenu": {
|
||||
@@ -284,12 +328,22 @@
|
||||
"goBack": "go back",
|
||||
"goForward": "go forward",
|
||||
"manageServers": "manage servers",
|
||||
"privateModeOff": "turn off private mode",
|
||||
"privateModeOn": "turn on private mode",
|
||||
"openBrowserDevtools": "open browser devtools",
|
||||
"quit": "$t(common.quit)",
|
||||
"selectServer": "select server",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"version": "version {{version}}"
|
||||
},
|
||||
"manageServers": {
|
||||
"title": "manage servers",
|
||||
"serverDetails": "server details",
|
||||
"url": "URL",
|
||||
"username": "username",
|
||||
"editServerDetailsTooltip": "edit server details",
|
||||
"removeServer": "remove server"
|
||||
},
|
||||
"contextMenu": {
|
||||
"addFavorite": "$t(action.addToFavorites)",
|
||||
"addLast": "$t(player.addLast)",
|
||||
@@ -299,14 +353,22 @@
|
||||
"createPlaylist": "$t(action.createPlaylist)",
|
||||
"deletePlaylist": "$t(action.deletePlaylist)",
|
||||
"deselectAll": "$t(action.deselectAll)",
|
||||
"download": "download",
|
||||
"moveToNext": "$t(action.moveToNext)",
|
||||
"moveToBottom": "$t(action.moveToBottom)",
|
||||
"moveToTop": "$t(action.moveToTop)",
|
||||
"numberSelected": "{{count}} selected",
|
||||
"play": "$t(player.play)",
|
||||
"playSimilarSongs": "$t(player.playSimilarSongs)",
|
||||
"removeFromFavorites": "$t(action.removeFromFavorites)",
|
||||
"removeFromPlaylist": "$t(action.removeFromPlaylist)",
|
||||
"removeFromQueue": "$t(action.removeFromQueue)",
|
||||
"setRating": "$t(action.setRating)"
|
||||
"setRating": "$t(action.setRating)",
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"shareItem": "share item",
|
||||
"goToAlbum": "go to $t(entity.album_one)",
|
||||
"goToAlbumArtist": "go to $t(entity.albumArtist_one)",
|
||||
"showDetails": "get info"
|
||||
},
|
||||
"fullscreenPlayer": {
|
||||
"config": {
|
||||
@@ -315,6 +377,7 @@
|
||||
"dynamicIsImage": "enable background image",
|
||||
"followCurrentLyric": "follow current lyric",
|
||||
"lyricAlignment": "lyric alignment",
|
||||
"lyricOffset": "lyrics offset (ms)",
|
||||
"lyricGap": "lyric gap",
|
||||
"lyricSize": "lyric size",
|
||||
"opacity": "opacity",
|
||||
@@ -326,9 +389,13 @@
|
||||
},
|
||||
"lyrics": "lyrics",
|
||||
"related": "related",
|
||||
"upNext": "up next"
|
||||
"upNext": "up next",
|
||||
"visualizer": "visualizer",
|
||||
"noLyrics": "no lyrics found"
|
||||
},
|
||||
"genreList": {
|
||||
"showAlbums": "show $t(entity.genre_one) $t(entity.album_other)",
|
||||
"showTracks": "show $t(entity.genre_one) $t(entity.track_other)",
|
||||
"title": "$t(entity.genre_other)"
|
||||
},
|
||||
"globalSearch": {
|
||||
@@ -344,12 +411,22 @@
|
||||
"mostPlayed": "most played",
|
||||
"newlyAdded": "newly added releases",
|
||||
"recentlyPlayed": "recently played",
|
||||
"recentlyReleased": "recently released",
|
||||
"title": "$t(common.home)"
|
||||
},
|
||||
"itemDetail": {
|
||||
"copyPath": "copy path to clipboard",
|
||||
"copiedPath": "path copied successfully",
|
||||
"openFile": "show track in file manager"
|
||||
},
|
||||
"playlist": {
|
||||
"reorder": "reordering only enabled when sorting by id"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist_other)"
|
||||
},
|
||||
"setting": {
|
||||
"advanced": "advanced",
|
||||
"generalTab": "general",
|
||||
"hotkeysTab": "hotkeys",
|
||||
"playbackTab": "playback",
|
||||
@@ -362,6 +439,7 @@
|
||||
"folders": "$t(entity.folder_other)",
|
||||
"genres": "$t(entity.genre_other)",
|
||||
"home": "$t(common.home)",
|
||||
"myLibrary": "my library",
|
||||
"nowPlaying": "now playing",
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"search": "$t(common.search)",
|
||||
@@ -370,7 +448,7 @@
|
||||
"tracks": "$t(entity.track_other)"
|
||||
},
|
||||
"trackList": {
|
||||
"artistTracks": "Tracks by {{artist}}",
|
||||
"artistTracks": "tracks by {{artist}}",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track_other)",
|
||||
"title": "$t(entity.track_other)"
|
||||
}
|
||||
@@ -388,6 +466,7 @@
|
||||
"playbackFetchNoResults": "no songs found",
|
||||
"playbackSpeed": "playback speed",
|
||||
"playRandom": "play random",
|
||||
"playSimilarSongs": "play similar songs",
|
||||
"previous": "previous",
|
||||
"queue_clear": "clear queue",
|
||||
"queue_moveToBottom": "move selected to top",
|
||||
@@ -398,7 +477,7 @@
|
||||
"repeat_off": "repeat disabled",
|
||||
"repeat_one": "repeat one",
|
||||
"repeat_other": "",
|
||||
"shuffle": "shuffle",
|
||||
"shuffle": "play shuffled",
|
||||
"shuffle_off": "shuffle disabled",
|
||||
"skip": "skip",
|
||||
"skip_back": "skip backwards",
|
||||
@@ -406,13 +485,24 @@
|
||||
"stop": "stop",
|
||||
"toggleFullscreenPlayer": "toggle fullscreen player",
|
||||
"unfavorite": "unfavorite",
|
||||
"pause": "pause"
|
||||
"pause": "pause",
|
||||
"viewQueue": "view queue"
|
||||
},
|
||||
"setting": {
|
||||
"accentColor": "accent color",
|
||||
"accentColor_description": "sets the accent color for the application",
|
||||
"albumBackground": "album background image",
|
||||
"albumBackground_description": "adds a background image for album pages containing the album art",
|
||||
"albumBackgroundBlur": "album background image blur size",
|
||||
"albumBackgroundBlur_description": "adjusts the amount of blur applied to the album background image",
|
||||
"applicationHotkeys": "application hotkeys",
|
||||
"applicationHotkeys_description": "configure application hotkeys. toggle the checkbox to set as a global hotkey (desktop only)",
|
||||
"artistBackground": "artist background image",
|
||||
"artistBackground_description": "adds a background image for artist pages containing the artist art",
|
||||
"artistBackgroundBlur": "artist background image blur size",
|
||||
"artistBackgroundBlur_description": "adjusts the amount of blur applied to the artist background image",
|
||||
"artistConfiguration": "album artist page configuration",
|
||||
"artistConfiguration_description": "configure what items are shown, and in what order, on the album artist page",
|
||||
"audioDevice": "audio device",
|
||||
"audioDevice_description": "select the audio device to use for playback (web player only)",
|
||||
"audioExclusiveMode": "audio exclusive mode",
|
||||
@@ -426,22 +516,49 @@
|
||||
"clearQueryCache": "clear feishin cache",
|
||||
"clearQueryCache_description": "a 'soft clear' of feishin. this will refresh playlists, track metadata, and reset saved lyrics. settings, server credentials and cached images are preserved",
|
||||
"clearCacheSuccess": "cache cleared successfully",
|
||||
"contextMenu": "context menu (right click) configuration",
|
||||
"contextMenu_description": "allows you to hide items that are shown in the menu when you right click on an item. items that are unchecked will be hidden",
|
||||
"crossfadeDuration": "crossfade duration",
|
||||
"crossfadeDuration_description": "sets the duration of the crossfade effect",
|
||||
"crossfadeStyle": "crossfade style",
|
||||
"crossfadeStyle_description": "select the crossfade style to use for the audio player",
|
||||
"customCssEnable": "enable custom css",
|
||||
"customCssEnable_description": "allow for writing custom css.",
|
||||
"customCssNotice": "Warning: while there is some sanitization (disallowing url() and content:), using custom CSS can still pose risks by changing the interface.",
|
||||
"customCss": "custom css",
|
||||
"customCss_description": "custom css content. Note: content and remote urls are disallowed properties. A preview of your content is shown below. Additional fields you didn't set are present due to sanitization.",
|
||||
"customFontPath": "custom font path",
|
||||
"customFontPath_description": "sets the path to the custom font to use for the application",
|
||||
"disableAutomaticUpdates": "disable automatic updates",
|
||||
"releaseChannel_optionLatest": "stable",
|
||||
"releaseChannel_optionBeta": "beta",
|
||||
"releaseChannel": "release channel",
|
||||
"releaseChannel_description": "choose between stable releases or beta releases for automatic updates",
|
||||
"disableLibraryUpdateOnStartup": "disable checking for new versions on startup",
|
||||
"discordApplicationId": "{{discord}} application id",
|
||||
"discordApplicationId_description": "the application id for {{discord}} rich presence (defaults to {{defaultId}})",
|
||||
"discordPausedStatus": "show rich presence when paused",
|
||||
"discordPausedStatus_description": "when enabled, status will show when player is paused",
|
||||
"discordIdleStatus": "show rich presence idle status",
|
||||
"discordIdleStatus_description": "when enabled, update status while player is idle",
|
||||
"discordListening": "show status as listening",
|
||||
"discordListening_description": "show status as listening instead of playing",
|
||||
"discordRichPresence": "{{discord}} rich presence",
|
||||
"discordRichPresence_description": "enable playback status in {{discord}} rich presence. Image keys are: {{icon}}, {{playing}}, and {{paused}} ",
|
||||
"discordRichPresence_description": "enable playback status in {{discord}} rich presence. Image keys are: {{icon}}, {{playing}}, and {{paused}}",
|
||||
"discordServeImage": "serve {{discord}} images from server",
|
||||
"discordServeImage_description": "share cover art for {{discord}} rich presence from server itself, only available for jellyfin and navidrome. {{discord}} uses a bot to fetch images, so your server must be reachable from the public internet.",
|
||||
"discordUpdateInterval": "{{discord}} rich presence update interval",
|
||||
"discordUpdateInterval_description": "the time in seconds between each update (minimum 15 seconds)",
|
||||
"discordDisplayType": "{{discord}} presence display type",
|
||||
"discordDisplayType_description": "changes what you are listening to in your status",
|
||||
"discordDisplayType_songname": "song name",
|
||||
"discordDisplayType_artistname": "artist name(s)",
|
||||
"discordLinkType": "{{discord}} presence links",
|
||||
"discordLinkType_description": "adds external links to {{lastfm}} or {{musicbrainz}} to the song and artist fields in {{discord}} rich presence. {{musicbrainz}} is the most accurate but requires tags and doesn't provide artist links while {{lastfm}} should always provide a link. makes no extra network requests",
|
||||
"discordLinkType_none": "$t(common.none)",
|
||||
"discordLinkType_mbz_lastfm": "{{musicbrainz}} with {{lastfm}} fallback",
|
||||
"doubleClickBehavior": "queue all searched tracks when double clicking",
|
||||
"doubleClickBehavior_description": "if true, all matching tracks in a track search will be queued. otherwise, only the clicked one will be queued",
|
||||
"enableRemote": "enable remote control server",
|
||||
"enableRemote_description": "enables the remote control server to allow other devices to control the application",
|
||||
"externalLinks": "show external links",
|
||||
@@ -452,6 +569,8 @@
|
||||
"floatingQueueArea_description": "display a hover icon on the right side of the screen to view the play queue",
|
||||
"followLyric": "follow current lyric",
|
||||
"followLyric_description": "scroll the lyric to the current playing position",
|
||||
"preferLocalLyrics": "prefer local lyrics",
|
||||
"preferLocalLyrics_description": "prefer local lyrics over remote lyrics when available",
|
||||
"font": "font",
|
||||
"font_description": "sets the font to use for the application",
|
||||
"fontType": "font type",
|
||||
@@ -462,16 +581,21 @@
|
||||
"gaplessAudio": "gapless audio",
|
||||
"gaplessAudio_description": "sets the gapless audio setting for mpv",
|
||||
"gaplessAudio_optionWeak": "weak (recommended)",
|
||||
"genreBehavior": "genre page default behavior",
|
||||
"genreBehavior_description": "determines whether clicking on a genre opens by default in track or album list",
|
||||
"globalMediaHotkeys": "global media hotkeys",
|
||||
"globalMediaHotkeys_description": "enable or disable the usage of your system media hotkeys to control playback",
|
||||
"homeConfiguration": "home page configuration",
|
||||
"homeConfiguration_description": "configure what items are shown, and in what order, on the home page",
|
||||
"homeFeature": "home featured carousel",
|
||||
"homeFeature_description": "controls whether to show the large featured carousel on the home page",
|
||||
"hotkey_browserBack": "browser back",
|
||||
"hotkey_browserForward": "browser forward",
|
||||
"hotkey_favoriteCurrentSong": "favorite $t(common.currentSong)",
|
||||
"hotkey_favoritePreviousSong": "favorite $t(common.previousSong)",
|
||||
"hotkey_globalSearch": "global search",
|
||||
"hotkey_localSearch": "in-page search",
|
||||
"hotkey_navigateHome": "navigate to home",
|
||||
"hotkey_playbackNext": "next track",
|
||||
"hotkey_playbackPause": "pause",
|
||||
"hotkey_playbackPlay": "play",
|
||||
@@ -499,14 +623,22 @@
|
||||
"hotkey_volumeUp": "volume up",
|
||||
"hotkey_zoomIn": "zoom in",
|
||||
"hotkey_zoomOut": "zoom out",
|
||||
"imageAspectRatio": "use native cover art aspect ratio",
|
||||
"imageAspectRatio_description": "if enabled, cover art will be shown using their native aspect ratio. for art that is not 1:1, the remaining space will be empty",
|
||||
"language": "language",
|
||||
"language_description": "sets the language for the application ($t(common.restartRequired))",
|
||||
"lastfm": "show last.fm links",
|
||||
"lastfm_description": "show links to last.fm on artist/album pages",
|
||||
"lastfmApiKey": "{{lastfm}} API key",
|
||||
"lastfmApiKey_description": "the API key for {{lastfm}}. required for cover art",
|
||||
"lyricFetch": "fetch lyrics from the internet",
|
||||
"lyricFetch_description": "fetch lyrics from various internet sources",
|
||||
"lyricFetchProvider": "providers to fetch lyrics from",
|
||||
"lyricFetchProvider_description": "select the providers to fetch lyrics from. the order of the providers is the order in which they will be queried",
|
||||
"lyricOffset": "lyric offset (ms)",
|
||||
"lyricOffset_description": "offset the lyric by the specified amount of milliseconds",
|
||||
"notify": "enable song notifications",
|
||||
"notify_description": "show notifications when changing the current song",
|
||||
"minimizeToTray": "minimize to tray",
|
||||
"minimizeToTray_description": "minimize the application to the system tray",
|
||||
"minimumScrobblePercentage": "minimum scrobble duration (percentage)",
|
||||
@@ -517,6 +649,10 @@
|
||||
"mpvExecutablePath_description": "sets the path to the mpv executable. if left empty, the default path will be used",
|
||||
"mpvExtraParameters": "mpv parameters",
|
||||
"mpvExtraParameters_help": "one per line",
|
||||
"musicbrainz": "show musicbrainz links",
|
||||
"musicbrainz_description": "show links to musicbrainz on artist/album pages, where mbid exists",
|
||||
"neteaseTranslation": "Enable NetEase translations",
|
||||
"neteaseTranslation_description": "When enabled, fetches and displays translated lyrics from NetEase if available.",
|
||||
"passwordStore": "passwords/secret store",
|
||||
"passwordStore_description": "what password/secret store to use. change this if you are having issues storing passwords.",
|
||||
"playbackStyle": "playback style",
|
||||
@@ -528,8 +664,11 @@
|
||||
"playButtonBehavior_optionAddLast": "$t(player.addLast)",
|
||||
"playButtonBehavior_optionAddNext": "$t(player.addNext)",
|
||||
"playButtonBehavior_optionPlay": "$t(player.play)",
|
||||
"playButtonBehavior_optionPlayShuffled": "$t(player.shuffle)",
|
||||
"playerAlbumArtResolution": "player album art resolution",
|
||||
"playerAlbumArtResolution_description": "the resolution for the large player's album art preview. larger makes it look more crisp, but may slow loading down. defaults to 0, meaning auto",
|
||||
"playerbarOpenDrawer": "playerbar fullscreen toggle",
|
||||
"playerbarOpenDrawer_description": "allows clicking of the playerbar to open the full screen player",
|
||||
"remotePassword": "remote control server password",
|
||||
"remotePassword_description": "sets the password for the remote control server. These credentials are by default transferred insecurely, so you should use a unique password that you do not care about",
|
||||
"remotePort": "remote control server port",
|
||||
@@ -573,16 +712,41 @@
|
||||
"skipPlaylistPage_description": "when navigating to a playlist, go to the playlist song list page instead of the default page",
|
||||
"startMinimized": "start minimized",
|
||||
"startMinimized_description": "start the application in system tray",
|
||||
"preventSleepOnPlayback": "prevent sleep on playback",
|
||||
"preventSleepOnPlayback_description": "prevent the display from sleeping while music is playing",
|
||||
"theme": "theme",
|
||||
"theme_description": "sets the theme to use for the application",
|
||||
"themeDark": "theme (dark)",
|
||||
"themeDark_description": "sets the dark theme to use for the application",
|
||||
"themeLight": "theme (light)",
|
||||
"themeLight_description": "sets the light theme to use for the application",
|
||||
"transcodeNote": "takes effect after 1 (web) - 2 (mpv) songs",
|
||||
"transcode": "enable transcoding",
|
||||
"transcode_description": "enables transcoding to different formats",
|
||||
"transcodeBitrate": "bitrate to transcode",
|
||||
"transcodeBitrate_description": "selects the bitrate to transcode. 0 means let the server pick",
|
||||
"transcodeFormat": "format to transcode",
|
||||
"transcodeFormat_description": "selects the format to transcode. leave empty to let the server decide",
|
||||
"mediaSession": "enable media session",
|
||||
"mediaSession_description": "Enables Windows Media Session integration, displaying media controls and metadata in the system volume overlay and lock screen (Windows only)",
|
||||
"translationApiProvider": "translation api provider",
|
||||
"translationApiProvider_description": "api provider for translation",
|
||||
"translationApiKey": "translation api key",
|
||||
"translationApiKey_description": "api key for translation (Support global service endpoint only)",
|
||||
"translationTargetLanguage": "translation target language",
|
||||
"translationTargetLanguage_description": "target language for translation",
|
||||
"trayEnabled": "show tray",
|
||||
"trayEnabled_description": "show/hide tray icon/menu. if disabled, also disables minimize/exit to tray",
|
||||
"useSystemTheme": "use system theme",
|
||||
"useSystemTheme_description": "follow the system-defined light or dark preference",
|
||||
"volumeWheelStep": "volume wheel step",
|
||||
"volumeWheelStep_description": "the amount of volume to change when scrolling the mouse wheel on the volume slider",
|
||||
"volumeWidth": "volume slider width",
|
||||
"volumeWidth_description": "the width of the volume slider",
|
||||
"webAudio": "use web audio",
|
||||
"webAudio_description": "use web audio. this enables advanced features like replaygain. disable if you experience otherwise",
|
||||
"preservePitch": "preserve pitch",
|
||||
"preservePitch_description": "preserves pitch when modifying playback speed",
|
||||
"windowBarStyle": "window bar style",
|
||||
"windowBarStyle_description": "select the style of the window bar",
|
||||
"zoom": "zoom percentage",
|
||||
@@ -610,6 +774,7 @@
|
||||
"rating": "rating",
|
||||
"releaseDate": "release date",
|
||||
"releaseYear": "year",
|
||||
"size": "$t(common.size)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"title": "title",
|
||||
"trackNumber": "track"
|
||||
@@ -617,6 +782,7 @@
|
||||
"config": {
|
||||
"general": {
|
||||
"autoFitColumns": "auto fit columns",
|
||||
"followCurrentSong": "follow current song",
|
||||
"displayType": "display type",
|
||||
"gap": "$t(common.gap)",
|
||||
"itemGap": "item gap (px)",
|
||||
@@ -648,6 +814,7 @@
|
||||
"releaseDate": "release date",
|
||||
"rowIndex": "row index",
|
||||
"size": "$t(common.size)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"title": "$t(common.title)",
|
||||
"titleCombined": "$t(common.title) (combined)",
|
||||
"trackNumber": "track number",
|
||||
@@ -655,6 +822,8 @@
|
||||
},
|
||||
"view": {
|
||||
"card": "card",
|
||||
"grid": "grid",
|
||||
"list": "list",
|
||||
"poster": "poster",
|
||||
"table": "table"
|
||||
}
|
||||
|
||||
+275
-66
@@ -8,10 +8,10 @@
|
||||
"skip": "saltar",
|
||||
"previous": "anterior",
|
||||
"toggleFullscreenPlayer": "activar el reproductor a pantalla completa",
|
||||
"skip_back": "saltar hacia atrás",
|
||||
"skip_back": "retroceder",
|
||||
"favorite": "favorito",
|
||||
"next": "siguiente",
|
||||
"shuffle": "mezclar",
|
||||
"shuffle": "Reproducir aleatoriamente",
|
||||
"playbackFetchNoResults": "ninguna canción encontrada",
|
||||
"playbackFetchInProgress": "cargando canciones…",
|
||||
"addNext": "añadir siguiente",
|
||||
@@ -21,21 +21,23 @@
|
||||
"repeat_off": "repetir desactivado",
|
||||
"queue_clear": "limpiar cola",
|
||||
"muted": "silenciado",
|
||||
"unfavorite": "no favorito",
|
||||
"queue_moveToTop": "mover seleccionado al fondo",
|
||||
"unfavorite": "no favorita",
|
||||
"queue_moveToTop": "mover seleccionado al final",
|
||||
"queue_moveToBottom": "mover seleccionado al principio",
|
||||
"shuffle_off": "mezclar desactivado",
|
||||
"addLast": "añadir último",
|
||||
"mute": "silencio",
|
||||
"skip_forward": "saltar hacia delante",
|
||||
"pause": "pausa"
|
||||
"pause": "pausa",
|
||||
"playSimilarSongs": "Reproducir canciones similares",
|
||||
"viewQueue": "ver cola"
|
||||
},
|
||||
"setting": {
|
||||
"crossfadeStyle_description": "selecciona el estilo de crossfade a usar por el reproductor de audio",
|
||||
"remotePort_description": "establece el puerto para el control remoto del servidor",
|
||||
"hotkey_skipBackward": "saltar hacia atrás",
|
||||
"hotkey_skipBackward": "retroceder",
|
||||
"replayGainMode_description": "ajusta el volumen de ganancia acorde a los valores de {{ReplayGain}} almacenados en los metadatos del archivo",
|
||||
"audioDevice_description": "selecciona el dispositivo de audio para usar en la reproducción (solo reproductor web)",
|
||||
"audioDevice_description": "selecciona el dispositivo de audio a usar durante la reproducción (solo reproductor web)",
|
||||
"theme_description": "establece el tema a usar por la aplicación",
|
||||
"hotkey_playbackPause": "pausa",
|
||||
"replayGainFallback": "{{ReplayGain}} alternativa",
|
||||
@@ -66,7 +68,7 @@
|
||||
"scrobble_description": "hace scrobble de las reproducciones en tu servidor de medios",
|
||||
"audioExclusiveMode_description": "activa el modo de audio exclusivo. En este modo, el sistema es normalmente bloqueado, y solo se permitirá mpv en la salida de audio",
|
||||
"discordUpdateInterval": "intervalo de actualización del estado de actividad de {{discord}}",
|
||||
"themeLight": "tema (luminoso)",
|
||||
"themeLight": "tema (claro)",
|
||||
"fontType_optionBuiltIn": "fuente incorporada",
|
||||
"hotkey_playbackPlayPause": "play / pausa",
|
||||
"hotkey_rate1": "calificar con 1 estrella",
|
||||
@@ -80,8 +82,8 @@
|
||||
"hotkey_playbackPlay": "reproducir",
|
||||
"hotkey_togglePreviousSongFavorite": "cambia $t(common.previousSong) a favorito",
|
||||
"hotkey_volumeDown": "bajar volumen",
|
||||
"hotkey_unfavoritePreviousSong": "$t(common.previousSong) no favorito",
|
||||
"audioPlayer_description": "selecciona el reproductor de audio a usar en la reproducción",
|
||||
"hotkey_unfavoritePreviousSong": "$t(common.previousSong) no favorita",
|
||||
"audioPlayer_description": "selecciona el reproductor de audio a usar durante la reproducción",
|
||||
"globalMediaHotkeys": "teclas de acceso rápido globales a medios",
|
||||
"hotkey_globalSearch": "búsqueda global",
|
||||
"gaplessAudio_description": "establece la configuración de audio sin pausas para mpv",
|
||||
@@ -104,11 +106,11 @@
|
||||
"font": "fuente",
|
||||
"mpvExtraParameters": "parámetros de mpv",
|
||||
"replayGainMode_optionTrack": "$t(entity.track_one)",
|
||||
"themeLight_description": "establece el tema luminoso a usar por la aplicación",
|
||||
"themeLight_description": "establece el tema claro a usar por la aplicación",
|
||||
"hotkey_toggleFullScreenPlayer": "cambia el reproductor a pantalla completa",
|
||||
"hotkey_localSearch": "búsqueda en la página",
|
||||
"hotkey_toggleQueue": "cambia la cola",
|
||||
"remotePassword_description": "establece la contraseña para el control remoto del servidor. Esas credenciales son transferidas de forma insegura por defecto, por lo que deberías usar una contraseña única para que no tengas nada de qué preocuparte",
|
||||
"remotePassword_description": "establece la contraseña para el control remoto del servidor. Esas credenciales son transferidas de forma insegura por defecto, por lo que deberías usar una contraseña única para que no tengas nada de lo que preocuparte",
|
||||
"hotkey_rate5": "calificar con 5 estrellas",
|
||||
"hotkey_playbackPrevious": "pista anterior",
|
||||
"showSkipButtons_description": "muestra o esconde los botones de saltar en la barra del reproductor",
|
||||
@@ -118,13 +120,13 @@
|
||||
"hotkey_toggleShuffle": "alterna aleatorio",
|
||||
"theme": "tema",
|
||||
"playbackStyle_description": "selecciona el estilo de reproducción a usar por el reproductor de audio",
|
||||
"discordRichPresence_description": "activa el estado de reproducción en el estado de actividad de {{discord}}. Las teclas de imagen son: {{icon}}, {{playing}}, y {{paused}} ",
|
||||
"discordRichPresence_description": "activa el estado de reproducción en el estado de actividad de {{discord}}. Las teclas de imagen son: {{icon}}, {{playing}}, y {{paused}}",
|
||||
"mpvExecutablePath": "ruta del ejecutable mpv",
|
||||
"audioDevice": "dispositivo de audio",
|
||||
"hotkey_rate2": "calificar con 2 estrellas",
|
||||
"playButtonBehavior_description": "establece el comportamiento por defecto del botón de reproducción cuando se añaden canciones a la cola",
|
||||
"minimumScrobblePercentage_description": "el porcentaje mínimo de la canción que debe ser reproducido antes de hacer scrobble",
|
||||
"exitToTray": "salida a bandeja",
|
||||
"exitToTray": "salir a la bandeja",
|
||||
"hotkey_rate4": "calificar con 4 estrellas",
|
||||
"enableRemote": "activar control remoto del servidor",
|
||||
"showSkipButton_description": "muestra o esconde los botones de saltar en la barra del reproductor",
|
||||
@@ -140,13 +142,13 @@
|
||||
"replayGainFallback_description": "ganancia en db a aplicar si el archivo no tiene etiquetas de {{ReplayGain}}",
|
||||
"replayGainPreamp_description": "ajusta la ganancia del preamplificador aplicada a los valores de {{ReplayGain}}",
|
||||
"hotkey_toggleRepeat": "alterna repetir",
|
||||
"lyricOffset_description": "desfasa la letra por la cantidad de milisegundos especificada",
|
||||
"lyricOffset_description": "desfasa la letra en la cantidad de milisegundos especificada",
|
||||
"sidebarConfiguration_description": "selecciona los elementos y el orden en que aparecerán en la barra lateral",
|
||||
"fontType": "tipo de fuente",
|
||||
"remotePort": "puerto del control remoto del servidor",
|
||||
"applicationHotkeys": "teclas de acceso rápido de la aplicación",
|
||||
"hotkey_playbackNext": "pista siguiente",
|
||||
"useSystemTheme_description": "sigue la preferencia luminosa u oscura definida por el sistema",
|
||||
"useSystemTheme_description": "sigue la preferencia clara u oscura definida por el sistema",
|
||||
"playButtonBehavior_optionAddNext": "$t(player.addNext)",
|
||||
"lyricFetch_description": "busca letras en varias fuentes de Internet",
|
||||
"lyricFetchProvider_description": "selecciona los proveedores para buscar letras. el orden de los proveedores es el orden en el que se consultarán",
|
||||
@@ -158,13 +160,13 @@
|
||||
"sidePlayQueueStyle_optionDetached": "separada",
|
||||
"audioPlayer": "reproductor de audio",
|
||||
"hotkey_zoomOut": "reducir",
|
||||
"hotkey_unfavoriteCurrentSong": "$t(common.currentSong) no favorito",
|
||||
"hotkey_rate0": "limpiar calificación",
|
||||
"hotkey_unfavoriteCurrentSong": "$t(common.currentSong) no favorita",
|
||||
"hotkey_rate0": "Limpiar calificación",
|
||||
"discordApplicationId": "id de aplicación {{discord}}",
|
||||
"applicationHotkeys_description": "configura las teclas de acceso rápido de la aplicación. marca la casilla para establecerlas como teclas de acceso rápido globales (solo escritorio)",
|
||||
"floatingQueueArea_description": "muestra un icono flotante en el lado derecho de la pantalla para ver la cola de reproducción",
|
||||
"hotkey_volumeMute": "silenciar volumen",
|
||||
"hotkey_toggleCurrentSongFavorite": "cambia $t(common.currentSong) a favorito",
|
||||
"hotkey_toggleCurrentSongFavorite": "$t(common.currentSong) cambia a favorita",
|
||||
"remoteUsername": "nombre de usuario del control remoto del servidor",
|
||||
"showSkipButton": "mostrar botones de saltar",
|
||||
"sidebarPlaylistList": "listas de reproducción de la barra lateral",
|
||||
@@ -191,12 +193,106 @@
|
||||
"skipPlaylistPage": "saltar página de lista de reproducción",
|
||||
"hotkey_browserForward": "avance",
|
||||
"hotkey_browserBack": "retroceso",
|
||||
"clearCache": "limpiar la caché del navegador",
|
||||
"clearQueryCache": "limpiar la caché de feishin",
|
||||
"clearQueryCache_description": "una 'limpieza suave' de feishin. esto refrescará las listas de reproducción, metadatos de pistas y restablece las letras guardadas. se mantienen los ajustes, credenciales del servidor y las imágenes en caché",
|
||||
"clearCache": "Limpiar la caché del navegador",
|
||||
"clearQueryCache": "Limpiar la caché de Feishin",
|
||||
"clearQueryCache_description": "Una 'limpieza suave' de Feishin. Esto refrescará las listas de reproducción, los metadatos de las pistas y restablecerá las letras guardadas. Se mantienen los ajustes, credenciales del servidor y las imágenes en caché",
|
||||
"buttonSize": "tamaño del botón de la barra de reproducción",
|
||||
"clearCache_description": "una 'limpieza fuerte' de feishin. para limpiar la caché de feishin, vacía la caché del navegador (imágenes guardadas y otros elementos). se mantienen las credenciales y ajustes del servidor",
|
||||
"buttonSize_description": "el tamaño de los botones de la barra de reproducción"
|
||||
"clearCache_description": "Una 'limpieza fuerte' de Feishin. Para limpiar la caché de Feishin, vacía la caché del navegador (imágenes guardadas y otros elementos). Se mantienen las credenciales y ajustes del servidor",
|
||||
"buttonSize_description": "el tamaño de los botones de la barra de reproducción",
|
||||
"passwordStore_description": "qué método de almacenamiento de contraseñas/claves secretas utilizar. cambia esta opción si tienes problemas para guardar contraseñas.",
|
||||
"startMinimized_description": "inicia la aplicación en la bandeja del sistema",
|
||||
"startMinimized": "iniciar minimizado",
|
||||
"passwordStore": "contraseñas/almacenamiento secreto",
|
||||
"playerAlbumArtResolution_description": "la resolución para la vista previa de la carátula del álbum del reproductor grande. más grande hace que parezca más nítido, pero puede ralentizar la carga. El valor predeterminado es 0, lo que significa automático",
|
||||
"playerAlbumArtResolution": "resolución de la carátula del álbum del reproductor",
|
||||
"homeConfiguration": "Configuración de la página de inicio",
|
||||
"mpvExtraParameters_help": "Uno por línea",
|
||||
"genreBehavior": "Comportamiento predeterminado de la página de géneros",
|
||||
"externalLinks_description": "Permite mostrar enlaces externos (Last.fm, MusicBrainz) en las páginas del artista/álbum",
|
||||
"genreBehavior_description": "Determina si al hacer clic en un género se abre por defecto la lista de pistas o de álbumes",
|
||||
"homeConfiguration_description": "Configura qué elementos son mostrados y en qué orden en la página de inicio",
|
||||
"clearCacheSuccess": "Caché limpiada correctamente",
|
||||
"externalLinks": "Mostrar enlaces externos",
|
||||
"homeFeature": "Carrusel destacado de inicio",
|
||||
"homeFeature_description": "Controla si se muestra el gran carrusel destacado en la página de inicio",
|
||||
"imageAspectRatio_description": "Si está habilitado, la portada será mostrada usando su relación de aspecto nativa. Para arte que no es 1:1, el espacio restante estará vacío",
|
||||
"imageAspectRatio": "Usar relación de aspecto nativa de portada",
|
||||
"doubleClickBehavior": "poner en cola todas las pistas buscadas al hacer doble clic",
|
||||
"doubleClickBehavior_description": "si está activado, se pondrán en cola todas las pistas que coincidan en una búsqueda de pistas. De lo contrario, solo se pondrán en cola las pistas seleccionadas",
|
||||
"volumeWidth": "Ancho del deslizador de volumen",
|
||||
"volumeWidth_description": "La anchura del deslizador de volumen",
|
||||
"discordListening_description": "muestra el estado como Escuchando en lugar de Jugando a",
|
||||
"discordListening": "Mostrar estado como escuchando",
|
||||
"contextMenu": "Configuración del menú de contexto (clic derecho)",
|
||||
"contextMenu_description": "Te permite esconder elementos que son mostrados en el menú cuando haces clic derecho en un elemento. Los elementos que no estén seleccionados serán escondidos",
|
||||
"customCssEnable": "Habilitar CSS personalizado",
|
||||
"customCssEnable_description": "Permite escribir CSS personalizado.",
|
||||
"customCss": "CSS personalizado",
|
||||
"customCssNotice": "Aviso: mientras hay alguna sanitización (rechazar url() y content:), usar CSS personalizado puede aún entrañar riesgos cambiando la interfaz.",
|
||||
"customCss_description": "Content CSS personalizado. Nota: content y urls remotas son propiedades rechazadas. Una vista previa de tu content se muestra debajo. Las entradas adicionales que no estableciste están presentes debido a la sanitización.",
|
||||
"webAudio": "usar audio web",
|
||||
"webAudio_description": "Utilizar audio web. Esto habilita funciones avanzadas como Replaygain. Desactiva esta opción si tienes problemas",
|
||||
"transcode": "activar la transcodificación",
|
||||
"transcode_description": "permite la transcodificación a distintos formatos",
|
||||
"transcodeBitrate": "tasa de bits a transcodificar",
|
||||
"transcodeBitrate_description": "selecciona el bitrate a transcodificar. 0 significa dejar que el servidor elija",
|
||||
"transcodeNote": "tendrá efecto después de 1 (web) - 2 (mpv) canciones",
|
||||
"transcodeFormat": "formato a transcodificar",
|
||||
"transcodeFormat_description": "selecciona el formato a transcodificar. dejar vacío para que el servidor decida",
|
||||
"albumBackground": "imagen de fondo del álbum",
|
||||
"albumBackground_description": "Añade una imagen de fondo a las páginas del álbum que contienen la carátula del álbum",
|
||||
"albumBackgroundBlur": "Tamaño de desenfoque de la imagen de fondo del álbum",
|
||||
"albumBackgroundBlur_description": "Ajusta la cantidad de desenfoque aplicado a la imagen de fondo del álbum",
|
||||
"playerbarOpenDrawer": "Cambiar la barra del reproductor a pantalla completa",
|
||||
"playerbarOpenDrawer_description": "Permite hacer clic en la barra del reproductor para abrir el reproductor a pantalla completa",
|
||||
"artistConfiguration": "Configuración de la página del artista del álbum",
|
||||
"artistConfiguration_description": "Configura qué elementos se muestran y en qué orden en la página del artista del álbum",
|
||||
"playButtonBehavior_optionPlayShuffled": "$t(player.shuffle)",
|
||||
"trayEnabled": "Mostrar en el área de notificación",
|
||||
"trayEnabled_description": "muestra/oculta el icono/menú del área de notificación. si está deshabilitado, también deshabilita minimizar/salir a la bandeja",
|
||||
"translationApiProvider": "Proveedor de API de traducción",
|
||||
"translationApiProvider_description": "Proveedor de API para traducción",
|
||||
"translationApiKey": "clave api de traducción",
|
||||
"translationApiKey_description": "Clave API para la traducción (solo para el punto final del servicio global)",
|
||||
"translationTargetLanguage": "idioma final de la traducción",
|
||||
"translationTargetLanguage_description": "lengua de destino de la traducción",
|
||||
"lastfmApiKey_description": "la clave API para {{lastfm}}. Requerida para la portada",
|
||||
"lastfmApiKey": "Clave API para {{lastfm}}",
|
||||
"discordServeImage": "Servir imágenes de {{discord}} desde el servidor",
|
||||
"discordServeImage_description": "Comparte el arte de la portada para el estado de actividad de {{discord}} desde el propio servidor, solo disponible para Jellyfin y Navidrome. {{discord}} usa un bot para obtener las imágenes, por lo que tu servidor debe ser alcanzable desde el Internet público.",
|
||||
"lastfm": "Mostrar enlaces de last.fm",
|
||||
"lastfm_description": "Muestra enlaces a last.fm en las páginas de artistas/álbumes",
|
||||
"musicbrainz": "Mostrar enlaces de MusicBrainz",
|
||||
"musicbrainz_description": "Muestra enlaces a MusicBrainz en las páginas de artistas/álbumes, donde exista mbid",
|
||||
"neteaseTranslation": "Activar traducciones de NetEase",
|
||||
"neteaseTranslation_description": "Cuando se habilita, busca y muestra letras traducidas desde NetEase si está disponible.",
|
||||
"preferLocalLyrics_description": "Prefiere letras locales sobre letras remotas cuando esté disponible",
|
||||
"preferLocalLyrics": "Preferir letras locales",
|
||||
"discordPausedStatus": "Mostrar estado de actividad cuando esté en pausa",
|
||||
"discordPausedStatus_description": "Cuando está activado, el estado mostrará cuando el reproductor esté en pausa",
|
||||
"preservePitch": "Mantener el tono",
|
||||
"preservePitch_description": "Mantiene el tono cuando se modifica la velocidad de reproducción",
|
||||
"notify": "Activar notificaciones de canciones",
|
||||
"notify_description": "Muestra notificaciones cuando se cambia la canción actual",
|
||||
"discordDisplayType_songname": "Nombre de la canción",
|
||||
"discordDisplayType_artistname": "Nombre(s) del artista(s)",
|
||||
"discordDisplayType_description": "Cambia qué estás escuchando en tu estado",
|
||||
"discordDisplayType": "Tipo de pantalla de actividad de {{discord}}",
|
||||
"hotkey_navigateHome": "Navegar a inicio",
|
||||
"preventSleepOnPlayback": "Evitar entrar en reposo durante la reproducción",
|
||||
"preventSleepOnPlayback_description": "Evita que la pantalla entre en reposo mientras se está reproduciendo música",
|
||||
"discordLinkType": "Enlaces de estado de {{discord}}",
|
||||
"discordLinkType_none": "$t(common.none)",
|
||||
"discordLinkType_mbz_lastfm": "{{musicbrainz}} con {{lastfm}} como alternativa",
|
||||
"discordLinkType_description": "Añade enlaces externos a {{lastfm}} o {{musicbrainz}} a la canción y campos del artista en el estado de actividad de {{discord}} . {{musicbrainz}} es el más preciso pero requiere etiquetas y no proporciona enlaces del artista mientras que {{lastfm}} debería siempre proporcionar un enlace. No realiza peticiones de red adicionales",
|
||||
"artistBackground": "imagen de fondo del artista",
|
||||
"artistBackgroundBlur": "tamaño de desenfoque de imagen de fondo del artista",
|
||||
"artistBackgroundBlur_description": "ajusta la cantidad de desenfoque aplicado a la imagen de fondo del artista",
|
||||
"releaseChannel_optionLatest": "Estable",
|
||||
"releaseChannel_optionBeta": "Beta",
|
||||
"releaseChannel": "Canal de lanzamiento",
|
||||
"releaseChannel_description": "Elige entre lanzamientos estables o beta para las actualizaciones automáticas",
|
||||
"artistBackground_description": "Añade una imagen de fondo para las páginas de artista que contienen el arte del artista"
|
||||
},
|
||||
"action": {
|
||||
"editPlaylist": "editar $t(entity.playlist_one)",
|
||||
@@ -212,25 +308,30 @@
|
||||
"deletePlaylist": "eliminar $t(entity.playlist_one)",
|
||||
"removeFromQueue": "eliminar de la cola",
|
||||
"deselectAll": "desmarcar todo",
|
||||
"moveToBottom": "mover al fondo",
|
||||
"moveToBottom": "mover al final",
|
||||
"setRating": "establecer calificación",
|
||||
"toggleSmartPlaylistEditor": "cambiar editor $t(entity.smartPlaylist)",
|
||||
"removeFromFavorites": "eliminar de $t(entity.favorite_other)"
|
||||
"removeFromFavorites": "eliminar de $t(entity.favorite_other)",
|
||||
"openIn": {
|
||||
"lastfm": "Abrir en Last.fm",
|
||||
"musicbrainz": "Abrir en MusicBrainz"
|
||||
},
|
||||
"moveToNext": "pasar al siguiente"
|
||||
},
|
||||
"common": {
|
||||
"backward": "hacia atrás",
|
||||
"increase": "aumentar",
|
||||
"rating": "calificación",
|
||||
"bpm": "bpm",
|
||||
"bpm": "lpm",
|
||||
"refresh": "actualizar",
|
||||
"unknown": "desconocido",
|
||||
"areYouSure": "estás seguro?",
|
||||
"areYouSure": "seguro?",
|
||||
"edit": "editar",
|
||||
"favorite": "favorito",
|
||||
"left": "izquierda",
|
||||
"save": "guardar",
|
||||
"right": "derecha",
|
||||
"currentSong": "actual $t(entity.track_one)",
|
||||
"currentSong": "$t(entity.track_one) actual",
|
||||
"collapse": "contraer",
|
||||
"trackNumber": "pista",
|
||||
"descending": "descendiente",
|
||||
@@ -268,7 +369,7 @@
|
||||
"saveAndReplace": "guardar y reemplazar",
|
||||
"playerMustBePaused": "el reproductor debe pausarse",
|
||||
"confirm": "confirmar",
|
||||
"resetToDefault": "restablecer a valor por defecto",
|
||||
"resetToDefault": "restablecer al valor predeterminado",
|
||||
"home": "inicio",
|
||||
"comingSoon": "próximamente…",
|
||||
"reset": "restablecer",
|
||||
@@ -280,7 +381,7 @@
|
||||
"previousSong": "anterior $t(entity.track_one)",
|
||||
"noResultsFromQuery": "la petición no devolvió resultados",
|
||||
"quit": "salir",
|
||||
"expand": "ampliar",
|
||||
"expand": "expandir",
|
||||
"search": "buscar",
|
||||
"saveAs": "guardar como",
|
||||
"disc": "disco",
|
||||
@@ -298,7 +399,24 @@
|
||||
"action_other": "acciones",
|
||||
"channel_one": "Canal",
|
||||
"channel_many": "Canales",
|
||||
"channel_other": "Canales"
|
||||
"channel_other": "Canales",
|
||||
"trackPeak": "pico de pista",
|
||||
"albumPeak": "pico del álbum",
|
||||
"albumGain": "Ganancia de álbum",
|
||||
"mbid": "ID de MusicBrainz",
|
||||
"codec": "Códec",
|
||||
"close": "Cerrar",
|
||||
"reload": "Recargar",
|
||||
"share": "Compartir",
|
||||
"trackGain": "Ganancia de pista",
|
||||
"preview": "Vista previa",
|
||||
"translation": "traducción",
|
||||
"additionalParticipants": "Participantes adicionales",
|
||||
"tags": "Etiquetas",
|
||||
"newVersion": "Una nueva versión ha sido instalada ({{version}})",
|
||||
"viewReleaseNotes": "Ver notas de lanzamiento",
|
||||
"bitDepth": "Profundidad de bit",
|
||||
"sampleRate": "Frecuencia de muestreo"
|
||||
},
|
||||
"error": {
|
||||
"remotePortWarning": "reiniciar el servidor para aplicar el nuevo puerto",
|
||||
@@ -319,11 +437,16 @@
|
||||
"mpvRequired": "MPV requerido",
|
||||
"audioDeviceFetchError": "un error ocurrió cuando se intentó obtener los dispositivos de audio",
|
||||
"invalidServer": "servidor inválido",
|
||||
"loginRateError": "demasiados intentos de inicio de sesión, por favor inténtalo en unos segundos"
|
||||
"loginRateError": "demasiados intentos de inicio de sesión, por favor inténtalo en unos segundos",
|
||||
"badAlbum": "Estás viendo esta página porque esta canción no forma parte de un álbum. Este problema puede ocurrir si tienes una canción en el nivel superior de tu carpeta de música. Jellyfin solo agrupa pistas si están en una carpeta.",
|
||||
"networkError": "Ocurrió un error de red",
|
||||
"openError": "No se pudo abrir el archivo",
|
||||
"badValue": "Opción inválida \"{{value}}\". Este valor ya no existe",
|
||||
"notificationDenied": "Se denegaron los permisos para notificaciones. Esta configuración no tiene efecto"
|
||||
},
|
||||
"filter": {
|
||||
"mostPlayed": "más reproducido",
|
||||
"isCompilation": "es compilación",
|
||||
"isCompilation": "es una compilación",
|
||||
"recentlyPlayed": "recientemente reproducido",
|
||||
"isRated": "es clasificado",
|
||||
"title": "título",
|
||||
@@ -341,7 +464,7 @@
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"isRecentlyPlayed": "reproducido recientemente",
|
||||
"isFavorited": "es favorito",
|
||||
"bpm": "bpm",
|
||||
"bpm": "lpm",
|
||||
"releaseYear": "año de lanzamiento",
|
||||
"disc": "disco",
|
||||
"biography": "biografía",
|
||||
@@ -354,7 +477,7 @@
|
||||
"criticRating": "calificación de la crítica",
|
||||
"trackNumber": "pista",
|
||||
"comment": "comentarios",
|
||||
"playCount": "número de reproducción",
|
||||
"playCount": "número de reproducciones",
|
||||
"recentlyUpdated": "actualizado recientemente",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"owner": "$t(common.owner)",
|
||||
@@ -367,7 +490,7 @@
|
||||
},
|
||||
"page": {
|
||||
"sidebar": {
|
||||
"nowPlaying": "en reproducción",
|
||||
"nowPlaying": "reproduciendo",
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"search": "$t(common.search)",
|
||||
"tracks": "$t(entity.track_other)",
|
||||
@@ -377,7 +500,9 @@
|
||||
"settings": "$t(common.setting_other)",
|
||||
"home": "$t(common.home)",
|
||||
"artists": "$t(entity.artist_other)",
|
||||
"albumArtists": "$t(entity.albumArtist_other)"
|
||||
"albumArtists": "$t(entity.albumArtist_other)",
|
||||
"shared": "compartido $t(entity.playlist_other)",
|
||||
"myLibrary": "Mi biblioteca"
|
||||
},
|
||||
"appMenu": {
|
||||
"selectServer": "seleccionar servidor",
|
||||
@@ -389,7 +514,9 @@
|
||||
"openBrowserDevtools": "abrir herramientas de desarrollador del navegador",
|
||||
"quit": "$t(common.quit)",
|
||||
"goBack": "retroceder",
|
||||
"goForward": "avanzar"
|
||||
"goForward": "avanzar",
|
||||
"privateModeOff": "Desactivar modo privado",
|
||||
"privateModeOn": "Activar modo privado"
|
||||
},
|
||||
"contextMenu": {
|
||||
"addToPlaylist": "$t(action.addToPlaylist)",
|
||||
@@ -407,14 +534,23 @@
|
||||
"addFavorite": "$t(action.addToFavorites)",
|
||||
"play": "$t(player.play)",
|
||||
"numberSelected": "{{count}} seleccionado",
|
||||
"removeFromQueue": "$t(action.removeFromQueue)"
|
||||
"removeFromQueue": "$t(action.removeFromQueue)",
|
||||
"shareItem": "Compartir elemento",
|
||||
"showDetails": "Obtener información",
|
||||
"playSimilarSongs": "$t(player.playSimilarSongs)",
|
||||
"download": "descargar",
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"moveToNext": "$t(action.moveToNext)",
|
||||
"goToAlbum": "Ir a $t(entity.album_one)",
|
||||
"goToAlbumArtist": "Ir a $t(entity.albumArtist_one)"
|
||||
},
|
||||
"home": {
|
||||
"mostPlayed": "más reproducidos",
|
||||
"newlyAdded": "nuevos lanzamientos añadidos",
|
||||
"title": "$t(common.home)",
|
||||
"explore": "explorar desde tu biblioteca",
|
||||
"recentlyPlayed": "recientemente reproducidos"
|
||||
"explore": "explora desde tu biblioteca",
|
||||
"recentlyPlayed": "reproducidos recientemente",
|
||||
"recentlyReleased": "Lanzado recientemente"
|
||||
},
|
||||
"fullscreenPlayer": {
|
||||
"upNext": "siguiente",
|
||||
@@ -429,29 +565,40 @@
|
||||
"lyricAlignment": "alineación de letra",
|
||||
"useImageAspectRatio": "usar ratio de aspecto de imagen",
|
||||
"showLyricMatch": "mostrar coincidencia de letras",
|
||||
"lyricGap": "desfase de letra"
|
||||
"lyricGap": "desfase de letra",
|
||||
"dynamicImageBlur": "tamaño de desenfoque de imagen",
|
||||
"dynamicIsImage": "habilitar imagen de fondo",
|
||||
"lyricOffset": "desplazamiento de letras (ms)"
|
||||
},
|
||||
"lyrics": "letras",
|
||||
"related": "relacionado"
|
||||
"related": "relacionado",
|
||||
"visualizer": "visualizador",
|
||||
"noLyrics": "sin letras"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "más de este $t(entity.artist_one)",
|
||||
"moreFromGeneric": "más de {{item}}"
|
||||
"moreFromGeneric": "más de {{item}}",
|
||||
"released": "publicado el"
|
||||
},
|
||||
"setting": {
|
||||
"playbackTab": "reproducción",
|
||||
"generalTab": "general",
|
||||
"hotkeysTab": "teclas de acceso rápido",
|
||||
"windowTab": "ventana"
|
||||
"windowTab": "ventana",
|
||||
"advanced": "Avanzado"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
},
|
||||
"genreList": {
|
||||
"title": "$t(entity.genre_other)"
|
||||
"title": "$t(entity.genre_other)",
|
||||
"showAlbums": "Mostrar $t(entity.genre_one) $t(entity.album_other)",
|
||||
"showTracks": "Mostrar $t(entity.genre_one) $t(entity.track_other)"
|
||||
},
|
||||
"trackList": {
|
||||
"title": "$t(entity.track_other)"
|
||||
"title": "$t(entity.track_other)",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track_other)",
|
||||
"artistTracks": "Pistas de {{artist}}"
|
||||
},
|
||||
"globalSearch": {
|
||||
"commands": {
|
||||
@@ -465,7 +612,36 @@
|
||||
"title": "$t(entity.playlist_other)"
|
||||
},
|
||||
"albumList": {
|
||||
"title": "$t(entity.album_other)"
|
||||
"title": "$t(entity.album_other)",
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)",
|
||||
"artistAlbums": "Álbumes de {{artist}}"
|
||||
},
|
||||
"albumArtistDetail": {
|
||||
"viewAllTracks": "ver todas las $t(entity.track_other)",
|
||||
"relatedArtists": "$t(entity.artist_other) similares",
|
||||
"topSongs": "mejores canciones",
|
||||
"topSongsFrom": "las mejores canciones de {{title}}",
|
||||
"viewAll": "Ver todo",
|
||||
"recentReleases": "Lanzamientos recientes",
|
||||
"viewDiscography": "Ver discografía",
|
||||
"about": "Sobre {{artist}}",
|
||||
"appearsOn": "Aparece en"
|
||||
},
|
||||
"itemDetail": {
|
||||
"copiedPath": "Ruta copiada correctamente",
|
||||
"openFile": "Mostrar pista en el gestor de archivos",
|
||||
"copyPath": "Copiar ruta al portapapeles"
|
||||
},
|
||||
"playlist": {
|
||||
"reorder": "la reordenación solo se activa al ordenar por id"
|
||||
},
|
||||
"manageServers": {
|
||||
"removeServer": "eliminar servidor",
|
||||
"title": "administrar servidores",
|
||||
"serverDetails": "detalles del servidor",
|
||||
"username": "nombre de usuario",
|
||||
"editServerDetailsTooltip": "editar detalles del servidor",
|
||||
"url": "URL"
|
||||
}
|
||||
},
|
||||
"form": {
|
||||
@@ -493,7 +669,9 @@
|
||||
"input_savePassword": "guardar contraseña",
|
||||
"ignoreSsl": "ignorar ssl ($t(common.restartRequired))",
|
||||
"ignoreCors": "ignorar cors ($t(common.restartRequired))",
|
||||
"error_savePassword": "un error ocurrió cuando se intentó guardar la contraseña"
|
||||
"error_savePassword": "un error ocurrió cuando se intentó guardar la contraseña",
|
||||
"input_preferInstantMix": "Preferir mix instantáneo",
|
||||
"input_preferInstantMixDescription": "Usa solo el mix instantáneo para obtener canciones similares. Útil si tienes complementos que modifican este comportamiento"
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"success": "añadido $t(entity.trackWithCount, {\"count\": {{message}} }) a $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })",
|
||||
@@ -511,11 +689,27 @@
|
||||
"title": "buscar letras"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"title": "editar $t(entity.playlist_one)"
|
||||
"title": "editar $t(entity.playlist_one)",
|
||||
"success": "$t(entity.playlist_one) actualizada correctamente",
|
||||
"publicJellyfinNote": "Jellyfin por alguna razón no expone si una lista de reproducción es pública o no. Si deseas que ésta siga siendo pública, por favor ten seleccionada la siguiente entrada"
|
||||
},
|
||||
"queryEditor": {
|
||||
"input_optionMatchAll": "coincidir todos",
|
||||
"input_optionMatchAny": "coincidir cualquiera"
|
||||
"input_optionMatchAny": "coincidir cualquiera",
|
||||
"title": "Editor de consultas"
|
||||
},
|
||||
"shareItem": {
|
||||
"createFailed": "No se pudo crear el recurso compartido (¿está habilitado el uso compartido?)",
|
||||
"allowDownloading": "Permitir la descarga",
|
||||
"description": "Descripción",
|
||||
"setExpiration": "Establecer expiración",
|
||||
"success": "Enlace de compartición copiado al portapapeles (o pulsa aquí para abrir)",
|
||||
"expireInvalid": "La expiración debe ser en el futuro"
|
||||
},
|
||||
"privateMode": {
|
||||
"enabled": "Modo privado activado, el estado de reproducción ahora está oculto de integraciones externas",
|
||||
"disabled": "Modo privado desactivado, el estado de reproducción ahora es visible a las integraciones externas habilitadas",
|
||||
"title": "Modo privado"
|
||||
}
|
||||
},
|
||||
"table": {
|
||||
@@ -532,16 +726,18 @@
|
||||
"releaseDate": "fecha de lanzamiento",
|
||||
"bitrate": "tasa de bits",
|
||||
"title": "título",
|
||||
"bpm": "bpm",
|
||||
"bpm": "lpm",
|
||||
"dateAdded": "fecha de adición",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"trackNumber": "pista",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"albumArtist": "artista de álbum",
|
||||
"albumArtist": "artista del álbum",
|
||||
"path": "ruta",
|
||||
"discNumber": "disco",
|
||||
"channels": "$t(common.channel_other)"
|
||||
"channels": "$t(common.channel_other)",
|
||||
"size": "$t(common.size)",
|
||||
"codec": "$t(common.codec)"
|
||||
},
|
||||
"config": {
|
||||
"label": {
|
||||
@@ -567,22 +763,29 @@
|
||||
"note": "$t(common.note)",
|
||||
"owner": "$t(common.owner)",
|
||||
"path": "$t(common.path)",
|
||||
"playCount": "número de reproducción",
|
||||
"playCount": "número de reproducciones",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"favorite": "$t(common.favorite)",
|
||||
"year": "$t(common.year)"
|
||||
"year": "$t(common.year)",
|
||||
"codec": "$t(common.codec)",
|
||||
"songCount": "$t(entity.track_other)"
|
||||
},
|
||||
"general": {
|
||||
"gap": "$t(common.gap)",
|
||||
"tableColumns": "columnas de la tabla",
|
||||
"autoFitColumns": "ajuste automático de columnas",
|
||||
"size": "$t(common.size)",
|
||||
"displayType": "tipo de visualización"
|
||||
"displayType": "tipo de visualización",
|
||||
"itemGap": "espacio entre elementos (px)",
|
||||
"itemSize": "tamaño del elemento (px)",
|
||||
"followCurrentSong": "seguir la canción actual"
|
||||
},
|
||||
"view": {
|
||||
"card": "tarjeta",
|
||||
"table": "tabla",
|
||||
"poster": "cartel"
|
||||
"poster": "cartel",
|
||||
"list": "Lista",
|
||||
"grid": "Cuadrícula"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -603,15 +806,15 @@
|
||||
"folderWithCount_one": "{{count}} carpeta",
|
||||
"folderWithCount_many": "{{count}} carpetas",
|
||||
"folderWithCount_other": "{{count}} carpetas",
|
||||
"albumArtist_one": "artista de álbum",
|
||||
"albumArtist_many": "artistas de álbum",
|
||||
"albumArtist_other": "artistas de álbum",
|
||||
"albumArtist_one": "artista del álbum",
|
||||
"albumArtist_many": "artistas del álbum",
|
||||
"albumArtist_other": "artistas del álbum",
|
||||
"track_one": "pista",
|
||||
"track_many": "pistas",
|
||||
"track_other": "pistas",
|
||||
"albumArtistCount_one": "{{count}} artista de álbum",
|
||||
"albumArtistCount_many": "{{count}} artistas de álbum",
|
||||
"albumArtistCount_other": "{{count}} artistas de álbum",
|
||||
"albumArtistCount_one": "{{count}} artista del álbum",
|
||||
"albumArtistCount_many": "{{count}} artistas del álbum",
|
||||
"albumArtistCount_other": "{{count}} artistas del álbum",
|
||||
"albumWithCount_one": "{{count}} álbum",
|
||||
"albumWithCount_many": "{{count}} álbumes",
|
||||
"albumWithCount_other": "{{count}} álbumes",
|
||||
@@ -632,6 +835,12 @@
|
||||
"genreWithCount_other": "{{count}} géneros",
|
||||
"trackWithCount_one": "{{count}} pista",
|
||||
"trackWithCount_many": "{{count}} pistas",
|
||||
"trackWithCount_other": "{{count}} pistas"
|
||||
"trackWithCount_other": "{{count}} pistas",
|
||||
"play_one": "{{count}} reproducción",
|
||||
"play_many": "{{count}} reproducciones",
|
||||
"play_other": "{{count}} reproducciones",
|
||||
"song_one": "canción",
|
||||
"song_many": "canciones",
|
||||
"song_other": "canciones"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,699 @@
|
||||
{
|
||||
"action": {
|
||||
"deselectAll": "deshautatu dena",
|
||||
"editPlaylist": "editatu $t(entity.playlist_one)",
|
||||
"goToPage": "joan orrira",
|
||||
"moveToNext": "mugitu hurrengora",
|
||||
"moveToBottom": "mugitu behera",
|
||||
"moveToTop": "mugitu gora",
|
||||
"refresh": "$t(common.refresh)",
|
||||
"removeFromFavorites": "kendu $t(entity.favorite_other)-(e)tik",
|
||||
"removeFromPlaylist": "kendu $t(entity.playlist_one)-(e)tik",
|
||||
"removeFromQueue": "kendu ilaratik",
|
||||
"setRating": "ezarri balorazioa",
|
||||
"toggleSmartPlaylistEditor": "txandakatu $t(entity.smartPlaylist) editorea",
|
||||
"viewPlaylists": "ikusi $t(entity.playlist_other)",
|
||||
"openIn": {
|
||||
"lastfm": "Ireki Last.fm-n",
|
||||
"musicbrainz": "Ireki MusicBrainz-en"
|
||||
},
|
||||
"clearQueue": "garbitu ilara",
|
||||
"createPlaylist": "sortu $t(entity.playlist_one)",
|
||||
"deletePlaylist": "ezabatu $t(entity.playlist_one)",
|
||||
"addToFavorites": "gehitu $t(entity.favorite_other)-(e)ra",
|
||||
"addToPlaylist": "gehitu $t(entity.playlist_one)-(e)ra"
|
||||
},
|
||||
"common": {
|
||||
"add": "gehitu",
|
||||
"additionalParticipants": "partaide gehigarriak",
|
||||
"newVersion": "bertsio berri bat instalatu da ({{version}})",
|
||||
"viewReleaseNotes": "ikusi argitalpen oharrak",
|
||||
"areYouSure": "ziur zaude?",
|
||||
"ascending": "goranzkoa",
|
||||
"backward": "atzeraka",
|
||||
"biography": "biografia",
|
||||
"close": "itxi",
|
||||
"codec": "kodeka",
|
||||
"collapse": "tolestu",
|
||||
"configure": "konfiguratu",
|
||||
"confirm": "berretsi",
|
||||
"create": "sortu",
|
||||
"currentSong": "uneko $t(entity.track_one)",
|
||||
"decrease": "gutxitu",
|
||||
"delete": "ezabatu",
|
||||
"descending": "beheranzkoa",
|
||||
"description": "deskripzioa",
|
||||
"disable": "desgaitu",
|
||||
"disc": "diskoa",
|
||||
"dismiss": "baztertu",
|
||||
"duration": "iraupena",
|
||||
"edit": "editatu",
|
||||
"enable": "gaitu",
|
||||
"expand": "zabaldu",
|
||||
"favorite": "gogokoa",
|
||||
"filter_one": "iragazkia",
|
||||
"filter_other": "iragazkiak",
|
||||
"filters": "iragazkiak",
|
||||
"forceRestartRequired": "berreabiarazi aldaketak aplikatzeko... itxi notifikazioa berreabiarazteko",
|
||||
"setting": "ezarpena",
|
||||
"share": "partekatu",
|
||||
"action_one": "ekintza",
|
||||
"action_other": "ekintzak",
|
||||
"unknown": "ezezaguna",
|
||||
"version": "bertsioa",
|
||||
"year": "urtea",
|
||||
"yes": "bai",
|
||||
"bitrate": "bit-emaria",
|
||||
"bpm": "bpm",
|
||||
"cancel": "utzi",
|
||||
"center": "lerrokatu",
|
||||
"channel_one": "kanala",
|
||||
"channel_other": "kanalak",
|
||||
"clear": "garbitu",
|
||||
"forward": "aurrerantz",
|
||||
"home": "etxea",
|
||||
"increase": "handitu",
|
||||
"left": "ezkerra",
|
||||
"limit": "mugatu",
|
||||
"manage": "kudeatu",
|
||||
"maximize": "maximizatu",
|
||||
"menu": "menua",
|
||||
"minimize": "minimizatu",
|
||||
"modified": "aldatuta",
|
||||
"mbid": "MusicBrainz IDa",
|
||||
"name": "izena",
|
||||
"no": "ez",
|
||||
"none": "bat ere ez",
|
||||
"noResultsFromQuery": "kontsultak ez du emaitzik itzuli",
|
||||
"note": "oharra",
|
||||
"ok": "ados",
|
||||
"owner": "jabea",
|
||||
"path": "bidea",
|
||||
"playerMustBePaused": "erreproduzitzailea pausatuta egon behar da",
|
||||
"preview": "aurrebista",
|
||||
"previousSong": "aurreko $t(entity.track_one)",
|
||||
"quit": "irten",
|
||||
"random": "ausazkoa",
|
||||
"rating": "balorazioa",
|
||||
"refresh": "freskatu",
|
||||
"reload": "birkargatu",
|
||||
"reset": "berrerazi",
|
||||
"right": "eskuina",
|
||||
"save": "gorde",
|
||||
"search": "bilatu",
|
||||
"size": "tamaina",
|
||||
"sortOrder": "ordena",
|
||||
"tags": "etiketak",
|
||||
"title": "tituloa",
|
||||
"trackNumber": "pista",
|
||||
"translation": "itzulpena",
|
||||
"albumGain": "album irabazpena",
|
||||
"bitDepth": "bit-sakonera",
|
||||
"resetToDefault": "lehenetsitako egoerara berrezarri",
|
||||
"restartRequired": "berrabiarazi behar da",
|
||||
"sampleRate": "laginketa-tasa",
|
||||
"saveAndReplace": "gorde eta ordezkatu",
|
||||
"saveAs": "gorde honela",
|
||||
"trackGain": "pista irabazpena",
|
||||
"comingSoon": "laster…",
|
||||
"trackPeak": "pistaren gailurra",
|
||||
"albumPeak": "albumaren gailurra"
|
||||
},
|
||||
"player": {
|
||||
"repeat": "errepikatu",
|
||||
"play": "erreproduzitu",
|
||||
"previous": "aurrekoa",
|
||||
"pause": "pausatu",
|
||||
"favorite": "gogokoa",
|
||||
"mute": "isilarazi",
|
||||
"muted": "isilduta",
|
||||
"next": "hurrengoa",
|
||||
"skip": "saltatu",
|
||||
"stop": "gelditu",
|
||||
"unfavorite": "kendu gogokoetatik",
|
||||
"addLast": "gehitu azkena",
|
||||
"addNext": "gehitu hurrengoa",
|
||||
"playbackFetchInProgress": "abestiak kargatzen…",
|
||||
"playbackSpeed": "erreprodukzio-abiadura",
|
||||
"playRandom": "erreproduzitu auzaz",
|
||||
"playbackFetchNoResults": "ez da abestirik aurkitu",
|
||||
"playSimilarSongs": "erreproduzitu antzeko abestiak",
|
||||
"queue_clear": "garbitu ilara",
|
||||
"queue_moveToBottom": "gora eraman hautatutakoak",
|
||||
"queue_moveToTop": "behera eraman hautatutakoak",
|
||||
"queue_remove": "kendu hautatutakoak",
|
||||
"repeat_all": "errepikatu dena",
|
||||
"repeat_off": "errepikapena desgaituta",
|
||||
"shuffle": "erreproduzitu ausaz",
|
||||
"shuffle_off": "auza desgaituta",
|
||||
"skip_back": "saltatu atzeraka",
|
||||
"skip_forward": "saltatu aurreraka",
|
||||
"toggleFullscreenPlayer": "txandakatu pantaila osoko erreproduzitzailea",
|
||||
"viewQueue": "ikusi ilara"
|
||||
},
|
||||
"table": {
|
||||
"config": {
|
||||
"view": {
|
||||
"table": "taula",
|
||||
"list": "zerrenda",
|
||||
"card": "txartela",
|
||||
"grid": "sareta",
|
||||
"poster": "kartela"
|
||||
},
|
||||
"general": {
|
||||
"gap": "$t(common.gap)",
|
||||
"size": "$t(common.size)",
|
||||
"tableColumns": "taula zutabeak",
|
||||
"itemSize": "elementuaren tamaina (px)",
|
||||
"followCurrentSong": "jarraitu uneko abestia"
|
||||
},
|
||||
"label": {
|
||||
"actions": "$t(common.action_other)",
|
||||
"album": "$t(entity.album_one)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"biography": "$t(common.biography)",
|
||||
"bitrate": "$t(common.bitrate)",
|
||||
"bpm": "$t(common.bpm)",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"codec": "$t(common.codec)",
|
||||
"duration": "$t(common.duration)",
|
||||
"favorite": "$t(common.favorite)",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"note": "$t(common.note)",
|
||||
"owner": "$t(common.owner)",
|
||||
"path": "$t(common.path)",
|
||||
"rating": "$t(common.rating)",
|
||||
"size": "$t(common.size)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"title": "$t(common.title)",
|
||||
"year": "$t(common.year)",
|
||||
"titleCombined": "$t(common.title) (batuta)",
|
||||
"releaseDate": "argitalpen data",
|
||||
"playCount": "erreprodukzio kopurua",
|
||||
"lastPlayed": "azken aldiz entzundakoa",
|
||||
"discNumber": "disko zenbakia",
|
||||
"dateAdded": "gehitze data"
|
||||
}
|
||||
},
|
||||
"column": {
|
||||
"album": "albuma",
|
||||
"albumCount": "$t(entity.album_other)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"biography": "biografia",
|
||||
"bitrate": "bit-emaria",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"codec": "$t(common.codec)",
|
||||
"discNumber": "diskoa",
|
||||
"favorite": "gogokoa",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"path": "bidea",
|
||||
"rating": "balorazioa",
|
||||
"releaseYear": "urtea",
|
||||
"size": "$t(common.size)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"title": "tituloa",
|
||||
"trackNumber": "pista",
|
||||
"bpm": "bpm",
|
||||
"comment": "iruzkina",
|
||||
"playCount": "erreprodukzioak",
|
||||
"releaseDate": "argitalpen data",
|
||||
"lastPlayed": "azken aldiz entzundakoa",
|
||||
"dateAdded": "gehitutako data",
|
||||
"albumArtist": "albumeko artista"
|
||||
}
|
||||
},
|
||||
"entity": {
|
||||
"album_one": "albuma",
|
||||
"album_other": "albumak",
|
||||
"albumArtist_one": "albumaren artista",
|
||||
"albumArtist_other": "albumaren artistak",
|
||||
"albumArtistCount_one": "album artista {{count}}",
|
||||
"albumArtistCount_other": "{{count}} album artista",
|
||||
"albumWithCount_one": "album {{count}}",
|
||||
"albumWithCount_other": "{{count}} album",
|
||||
"artist_one": "artista",
|
||||
"artist_other": "artistak",
|
||||
"artistWithCount_one": "artista {{count}}",
|
||||
"artistWithCount_other": "{{count}} artista",
|
||||
"favorite_one": "gogokoa",
|
||||
"favorite_other": "gogokoak",
|
||||
"folder_one": "karpeta",
|
||||
"folder_other": "karpetak",
|
||||
"folderWithCount_one": "karpeta {{count}}",
|
||||
"folderWithCount_other": "{{count}} karpeta",
|
||||
"genre_one": "generoa",
|
||||
"genre_other": "generoak",
|
||||
"genreWithCount_one": "genero {{count}}generoa",
|
||||
"genreWithCount_other": "{{count}} genero",
|
||||
"playlist_one": "erreprodukzio-zerrenda",
|
||||
"playlist_other": "erreprodukzio-zerrendak",
|
||||
"play_one": "erreprodukzio {{count}}",
|
||||
"play_other": "{{count}} erreprodukzio",
|
||||
"playlistWithCount_one": "erreprodukzio-zerrenda {{count}}",
|
||||
"playlistWithCount_other": "{{count}} erreprodukzio-zerrenda",
|
||||
"smartPlaylist": "$t(entity.playlist_one) adimentsua",
|
||||
"track_one": "pista",
|
||||
"track_other": "pistak",
|
||||
"song_one": "abestia",
|
||||
"song_other": "abestiak",
|
||||
"trackWithCount_one": "pista {{count}}",
|
||||
"trackWithCount_other": "{{count}} pista"
|
||||
},
|
||||
"error": {
|
||||
"apiRouteError": "ezin izan da eskaera bideratu",
|
||||
"audioDeviceFetchError": "errore bat gertatu da audio gailuak lortzen saiatzean",
|
||||
"authenticationFailed": "autentifikazioa huts egin du",
|
||||
"badValue": "\"{{value}}\" aukera baliogabea. Balio hau ez da gehiago existitzen.",
|
||||
"credentialsRequired": "kredentzialak beharrezkoak dira",
|
||||
"endpointNotImplementedError": "{{endpoint}} amaiera-puntua ez dago {{serverType}}-(e)rako inplementatuta",
|
||||
"genericError": "errore bat gertatu da",
|
||||
"invalidServer": "zerbitzari baliogabea",
|
||||
"localFontAccessDenied": "tokiko letra-tipoetarako sarbidea ukatuta",
|
||||
"mpvRequired": "MPV beharrezkoa da",
|
||||
"networkError": "sareko errore bat gertatu da",
|
||||
"openError": "ezin izan da fitxategia ireki",
|
||||
"playbackError": "errore bat gertatu da multimedia erreproduzitzen saiatzean",
|
||||
"remoteDisableError": "errore bat gertatu da urruneko zerbitzaria $t(common.disable) desgaitzen saiatzean",
|
||||
"remoteEnableError": "errore bat gertatu da urruneko zerbitzaria $t(common.enable) gaitzen saiatzean",
|
||||
"remotePortError": "errore bat gertatu da urruneko zerbitzariaren ataka ezartzen saiatzean",
|
||||
"remotePortWarning": "Berrabiarazi zerbitzaria portu berria aplikatzeko",
|
||||
"serverNotSelectedError": "ez da zerbitzaririk hautatu",
|
||||
"serverRequired": "zerbitzaria beharrezkoa da",
|
||||
"sessionExpiredError": "zure saioa iraungi da",
|
||||
"badAlbum": "Orrialde hau ikusten ari zara abesti hau album batekoa ez delako. Ziurrenik arazo hau ikusten ari zara zure musika karpetaren goiko mailan abesti bat baduzu. Jellyfinek abestiak karpeta batean badaude taldekatzen ditu bakarrik.",
|
||||
"loginRateError": "Saioa hasteko saiakera gehiegi egin dira, saiatu berriro segundo batzuk barru",
|
||||
"notificationDenied": "Jakinarazpenetarako baimenak ukatu dira. Ezarpen honek ez du eraginik.",
|
||||
"systemFontError": "errore bat gertatu da sistemaren letra-tipoak lortzen saiatzean"
|
||||
},
|
||||
"filter": {
|
||||
"disc": "diskoa",
|
||||
"duration": "iraupena",
|
||||
"id": "id-a",
|
||||
"isPublic": "publikoa da",
|
||||
"name": "izena",
|
||||
"note": "oharra",
|
||||
"owner": "$t(common.owner)",
|
||||
"path": "bidea",
|
||||
"random": "ausazkoa",
|
||||
"rating": "balorazioa",
|
||||
"trackNumber": "pista",
|
||||
"album": "$t(entity.album_one)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"biography": "biografia",
|
||||
"bitrate": "bit-emaria",
|
||||
"bpm": "bpm-ak",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"comment": "iruzkina",
|
||||
"favorited": "gogoko gisa markatua",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"search": "bilatu",
|
||||
"title": "tituloa",
|
||||
"albumCount": "$t(entity.album_other) kopurua",
|
||||
"communityRating": "komunitatearen balorazioa",
|
||||
"criticRating": "kritikarien balorazioa",
|
||||
"dateAdded": "gehitutako data",
|
||||
"isCompilation": "konpilazioa da",
|
||||
"isFavorited": "gogokoetan dago",
|
||||
"isRated": "baloratua dago",
|
||||
"isRecentlyPlayed": "duela gutxi entzundakoa",
|
||||
"lastPlayed": "azken aldiz entzundakoa",
|
||||
"mostPlayed": "gehien entzundakoa",
|
||||
"playCount": "erreprodukzio kopurua",
|
||||
"recentlyAdded": "duela gutxi gehitutakoa",
|
||||
"recentlyPlayed": "duela gutxi entzundakoa",
|
||||
"recentlyUpdated": "duela gutxi eguneratua",
|
||||
"songCount": "abesti kopurua",
|
||||
"releaseDate": "argitalpen data",
|
||||
"releaseYear": "argitalpen urtea",
|
||||
"toYear": "urtera arte",
|
||||
"fromYear": "urtetik aurrera"
|
||||
},
|
||||
"setting": {
|
||||
"hotkey_playbackPause": "pausatu",
|
||||
"hotkey_playbackPlay": "erreproduzitu",
|
||||
"language": "hizkuntza",
|
||||
"playbackStyle_optionNormal": "normala",
|
||||
"playButtonBehavior_optionPlay": "$t(player.play)",
|
||||
"playButtonBehavior_optionPlayShuffled": "$t(player.shuffle)",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album_one)",
|
||||
"replayGainMode_optionNone": "$t(common.none)",
|
||||
"replayGainMode_optionTrack": "$t(entity.track_one)",
|
||||
"font": "letra-tipoa",
|
||||
"hotkey_playbackStop": "gelditu",
|
||||
"buttonSize_description": "erreproduzitzailearen barrako botoien tamaina",
|
||||
"clearCache": "garbitu nabigatzailearen katxea",
|
||||
"clearQueryCache": "garbitu feishinen katxea",
|
||||
"clearCacheSuccess": "katxea behar bezala garbitu da",
|
||||
"contextMenu": "testuinguru-menuaren konfigurazioa (klik eskuineko botoiarekin)",
|
||||
"customCssEnable": "gaitu css pertsonalizatua",
|
||||
"customCssEnable_description": "css pertsonalizatua idazteko aukera eman.",
|
||||
"customCss": "css pertsonalizatua",
|
||||
"customFontPath": "letra-tipo pertsonalizatuaren bidea",
|
||||
"customFontPath_description": "aplikazioan erabiliko den letra-tipo pertsonalizatuaren bidea ezartzen du",
|
||||
"disableAutomaticUpdates": "desgaitu eguneratze automatikoak",
|
||||
"discordApplicationId": "{{discord}} aplikazioaren IDa",
|
||||
"followLyric": "jarraitu uneko letra",
|
||||
"font_description": "aplikazioan erabiliko den letra-tipoa ezartzen du",
|
||||
"fontType": "letra-tipo mota",
|
||||
"fontType_optionCustom": "letra-tipo pertsonalizatua",
|
||||
"fontType_optionSystem": "sistemaren letra-tipoa",
|
||||
"gaplessAudio_optionWeak": "ahula (gomendatua)",
|
||||
"homeConfiguration": "hasierako orriaren konfigurazioa",
|
||||
"hotkey_favoriteCurrentSong": "$t(common.currentSong) gogokoa",
|
||||
"hotkey_favoritePreviousSong": "$t(common.previousSong) gogokoa",
|
||||
"hotkey_navigateHome": "nabigatu etxera",
|
||||
"hotkey_playbackNext": "hurrengo pista",
|
||||
"hotkey_playbackPlayPause": "erreproduzitu / pausatu",
|
||||
"hotkey_playbackPrevious": "aurreko pista",
|
||||
"hotkey_skipBackward": "saltatu atzeraka",
|
||||
"hotkey_skipForward": "saltatu aurrerantz",
|
||||
"hotkey_toggleCurrentSongFavorite": "txandakatu $t(common.currentSong) gogokoa",
|
||||
"hotkey_toggleFullScreenPlayer": "txandakatu pantaila osoko erreproduzitzailea",
|
||||
"hotkey_togglePreviousSongFavorite": "txandakatu $t(common.previousSong) gogokoa",
|
||||
"hotkey_toggleQueue": "txandakatu ilara",
|
||||
"hotkey_toggleRepeat": "txandakatu errepikapena",
|
||||
"hotkey_toggleShuffle": "txandakatu auzazkoa",
|
||||
"hotkey_unfavoriteCurrentSong": "kendu $t(common.currentSong) gogokoetatik",
|
||||
"hotkey_unfavoritePreviousSong": "kendu $t(common.previousSong) gogokoetatik",
|
||||
"hotkey_volumeDown": "bolumena jaitsi",
|
||||
"hotkey_volumeMute": "isilarazi bolumena",
|
||||
"hotkey_volumeUp": "bolumena igo",
|
||||
"hotkey_zoomIn": "hurbildu",
|
||||
"hotkey_zoomOut": "txikiagotu",
|
||||
"language_description": "aplikazioaren hizkuntza ezartzen du ($t(common.restartRequired))",
|
||||
"lastfm": "erakutsi last.fm estekak",
|
||||
"lastfm_description": "erakutsi last.fm-rako estekak artista/album orrialdeetan",
|
||||
"lastfmApiKey": "{{lastfm}} API gakoa",
|
||||
"lastfmApiKey_description": "{{lastfm}}-ren API gakoa. Azaleko arterako beharrezkoa.",
|
||||
"lyricFetch": "eskuratu letrak internetetik",
|
||||
"lyricFetch_description": "Eskuratu letrak hainbat internet iturrietatik",
|
||||
"notify": "gaitu abesti japinarazpenak",
|
||||
"notify_description": "erakutsi jakinarazpenak uneko abestia aldatzean",
|
||||
"audioExclusiveMode_description": "gaitu irteera esklusiboko modua. Modu honetan, sistema normalean blokeatuta egoten da, eta mpv-k bakarrik atera ahal izango du audioa",
|
||||
"audioDevice_description": "aukeratu erreproduzitzeko erabiliko den audio gailua (web erreproduzitzailea bakarrik)",
|
||||
"audioPlayer": "audio erreproduzitzailea",
|
||||
"audioPlayer_description": "aukeratu erabiliko den audio erreproduzitzailea",
|
||||
"buttonSize": "erreproduzitzaile barrako botoien tamaina",
|
||||
"crossfadeDuration": "crossfade iraupena",
|
||||
"crossfadeDuration_description": "crossfade efektuaren iraupena ezartzen du",
|
||||
"crossfadeStyle": "crossfade estiloa",
|
||||
"crossfadeStyle_description": "aukeratu audio erreproduzitzailearentzat erabiliko den crossfade estiloa",
|
||||
"disableLibraryUpdateOnStartup": "desgaitu bertsio berrien egiaztapena abiaraztean",
|
||||
"discordApplicationId_description": "{{discord}} jarduera-egoeraren aplikazioaren IDa (lehenetsia {{defaultId}} da)",
|
||||
"discordPausedStatus": "erakutsi jarduera-egoera pausatuta dagoenean",
|
||||
"discordPausedStatus_description": "gaituta dagoenean, egoera agertuko da erreproduzitzailea pausatuta dagoenean",
|
||||
"discordIdleStatus": "erakutsi inaktibo jarduera-egoeran",
|
||||
"discordIdleStatus_description": "gaituta dagoenean, eguneratu egoera erreproduzitzailea inaktibo dagoen bitartean",
|
||||
"discordListening_description": "erakutsi egoera entzuten bezala erreproduzitzen ordez",
|
||||
"discordListening": "erakutsi egoera entzuten bezala",
|
||||
"discordRichPresence": "{{discord}} jarduera-egoera",
|
||||
"discordRichPresence_description": "gaitu erreprodukzioa egoera {{discord}}-en jarduera-egoeran. Irudi gakoak hauek dira: {{icon}}, {{playing}}, eta {{paused}}",
|
||||
"discordServeImage": "zerbitzatu {{discord}} irudiak zerbitzaritik",
|
||||
"discordServeImage_description": "partekatu {{discord}} jarduera-egoerarentzako azala artea zerbitzaritik bertatik, Jellyfin eta Navidrome-rentzat bakarrik eskuragarri. {{discord}}-(e)k bot bat erabiltzen du irudiak eskuratzeko, beraz, zure zerbitzaria internet publikotik eskuragarri egon behar da.",
|
||||
"discordUpdateInterval": "{{discord}} jarduera-egoera eguneraketa tartea",
|
||||
"discordLinkType_none": "$t(common.none)",
|
||||
"albumBackground": "albumaren atzeko planoaren irudia",
|
||||
"albumBackground_description": "albumaren azala artea duten album orrietarako atzeko plano irudi bat gehitzen du",
|
||||
"albumBackgroundBlur": "albumaren atzeko planoaren irudiaren lausotze tamaina",
|
||||
"discordLinkType_description": "{{lastfm}} edo {{musicbrainz}}-(e)rako kanpoko estekak gehitzen ditu abesti eta artista eremuetan {{discord}} jarduera-egoeran. {{musicbrainz}} da zehatzena, baina etiketak behar ditu eta ez ditu artistaren estekak ematen, {{lastfm}}-k beti esteka bat eman beharko lukeen bitartean. ez du sareko eskaera gehigarririk egiten",
|
||||
"playButtonBehavior_optionAddNext": "$t(player.addNext)",
|
||||
"scrobble": "scrobble",
|
||||
"sidePlayQueueStyle_optionAttached": "erantsita",
|
||||
"sidePlayQueueStyle_optionDetached": "bereizita",
|
||||
"theme": "gaia",
|
||||
"audioDevice": "audio gailua",
|
||||
"discordDisplayType_songname": "abesti izena",
|
||||
"discordDisplayType_artistname": "artista izena(k)",
|
||||
"fontType_optionBuiltIn": "barneko letra-tipoa",
|
||||
"hotkey_globalSearch": "bilaketa globala",
|
||||
"albumBackgroundBlur_description": "albumaren atzeko planoaren irudiari aplikatzen zaion lausotze-kopurua doitzen du",
|
||||
"artistBackground": "artistaren atzeko planoaren irudia",
|
||||
"artistBackgroundBlur": "artistaren atzeko planoko irudiaren lausotze-tamaina",
|
||||
"artistBackgroundBlur_description": "artistaren atzeko planoaren irudiari aplikatzen zaion lausotze-kopurua doitzen du",
|
||||
"artistConfiguration": "albumaren artistaren konfigurazio orria",
|
||||
"artistConfiguration_description": "konfiguratu zein elementu erakusten diren eta zein ordenatan albumaren artistaren orrian",
|
||||
"audioExclusiveMode": "audio esklusiboko modua",
|
||||
"releaseChannel_optionLatest": "egonkorra",
|
||||
"releaseChannel_optionBeta": "beta",
|
||||
"releaseChannel": "argitalpen kanala",
|
||||
"releaseChannel_description": "aukeratu argitalpen egonkorren edo beta artean eguneratze automatikoak lortzeko",
|
||||
"discordUpdateInterval_description": "eguneratze bakoitzaren arteko denbora segundotan (gutxienez 15 segundo)",
|
||||
"discordDisplayType": "{{discord}} jarduera-pantailaren mota",
|
||||
"discordDisplayType_description": "zure egoeran entzuten ari zarena aldatzen du",
|
||||
"discordLinkType": "{{discord}} egoera estekak",
|
||||
"fontType_description": "barneko letra-tipoa Feishinek eskaintzen dituen letra-tipoetako bat aukeratzen du. sistemaren letra-tipoa zure sistema eragileak eskaintzen duen edozein letra-tipo hautatzeko aukera ematen dizu. pertsonalizatua zure letra-tipoa eskaintzeko aukera ematen dizu",
|
||||
"genreBehavior": "genero orriaren portaera lehenetsia",
|
||||
"homeConfiguration_description": "konfiguratu zein elementu erakusten diren hasierako orrian eta zein ordenatan",
|
||||
"homeFeature": "etxeko karrusela nabarmendua",
|
||||
"homeFeature_description": "hasierako orrian karrusel nabarmen handia erakutsi behar den ala ez kontrolatzen du",
|
||||
"hotkey_localSearch": "orrian bilatu",
|
||||
"hotkey_rate0": "garbitu balorazioa",
|
||||
"hotkey_rate1": "1 izarretako balorazioa",
|
||||
"hotkey_rate2": "2 izarretako balorazioa",
|
||||
"hotkey_rate3": "3 izarretako balorazioa",
|
||||
"hotkey_rate4": "4 izarretako balorazioa",
|
||||
"hotkey_rate5": "5 izarretako balorazioa",
|
||||
"zoom_description": "aplikazioaren zoom ehunekoa ezartzen du",
|
||||
"zoom": "zoom ehunekoa",
|
||||
"windowBarStyle_description": "aukeratu leiho-barraren estiloa",
|
||||
"windowBarStyle": "leiho-barra estiloa",
|
||||
"webAudio": "erabili web audioa",
|
||||
"useSystemTheme_description": "jarraitu sistemak definitutako argi edo iluntasun lehentasuna",
|
||||
"useSystemTheme": "erabili sistemaren gaia",
|
||||
"translationTargetLanguage_description": "itzulpenerako helburu-hizkuntza",
|
||||
"translationTargetLanguage": "itzulpenerako helburu-hizkuntza",
|
||||
"translationApiKey": "itzulpen api gakoa",
|
||||
"translationApiProvider_description": "itzulpenerako api hornitzailea",
|
||||
"translationApiProvider": "itzulpen api hornitzailea",
|
||||
"mediaSession": "gaitu multimedia saioa",
|
||||
"themeLight_description": "aplikaziorako erabiliko den gaia argia ezartzen du",
|
||||
"themeLight": "gaia (argia)",
|
||||
"themeDark_description": "aplikaziorako erabiliko den gai iluna ezartzen du",
|
||||
"themeDark": "gaia (iluna)",
|
||||
"theme_description": "aplikaziorako erabiliko den gaia ezartzen du",
|
||||
"externalLinks": "kanpoko estekak erakutsi",
|
||||
"externalLinks_description": "kanpoko estekak (Last.fm, MusicBrainz) artista/album orrietan erakustea gaitzen du",
|
||||
"exitToTray": "irten erretilura"
|
||||
},
|
||||
"form": {
|
||||
"addServer": {
|
||||
"input_password": "pasahitza",
|
||||
"input_url": "url-a",
|
||||
"input_username": "erabiltzaile-izena",
|
||||
"error_savePassword": "errore bat gertatu da pasahitza gordetzen saiatzean",
|
||||
"input_name": "zerbitzari izena",
|
||||
"input_savePassword": "pasahitza gorde",
|
||||
"title": "zerbitzaria gehitu",
|
||||
"ignoreCors": "alde batera utzi cors $t(common.restartRequired)",
|
||||
"ignoreSsl": "alde batera utzi ssl $t(common.restartRequired)",
|
||||
"input_legacyAuthentication": "gaitu zaharkitutako autentifikazioa",
|
||||
"success": "zerbitzaria behar bezala gehitu da"
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"input_playlists": "$t(entity.playlist_other)",
|
||||
"success": "$t(entity.trackWithCount, {\"count\": {{message}} }) gehitu da $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })-ra",
|
||||
"input_skipDuplicates": "saltatu bikoiztuak",
|
||||
"title": "gehitu $t(entity.playlist_one)-(a)ri"
|
||||
},
|
||||
"createPlaylist": {
|
||||
"input_description": "$t(common.description)",
|
||||
"input_name": "$t(common.name)",
|
||||
"input_owner": "$t(common.owner)",
|
||||
"input_public": "publikoa",
|
||||
"title": "$t(entity.playlist_one) sortu",
|
||||
"success": "$t(entity.playlist_one) behar bezala sortu da"
|
||||
},
|
||||
"lyricSearch": {
|
||||
"input_artist": "$t(entity.artist_one)",
|
||||
"input_name": "$t(common.name)",
|
||||
"title": "letra bilatu"
|
||||
},
|
||||
"shareItem": {
|
||||
"description": "deskripzioa",
|
||||
"setExpiration": "iraungitze-data ezarri",
|
||||
"success": "partekatzeko esteka arbelera kopiatu da (edo egin klik hemen irekitzeko)",
|
||||
"expireInvalid": "iraungitze-data etorkizunean izan behar da",
|
||||
"allowDownloading": "baimendu deskargatzea",
|
||||
"createFailed": "partekatzea sortzeak huts egin du (partekatzea gaituta al dago?)"
|
||||
},
|
||||
"deletePlaylist": {
|
||||
"success": "$t(entity.playlist_one) behar bezala ezabatu da",
|
||||
"title": "$t(entity.playlist_one) ezabatu",
|
||||
"input_confirm": "idatzi $t(entity.playlist_one)-(a)ren izena berresteko"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"success": "$t(entity.playlist_one) behar bezala eguneratu da",
|
||||
"title": "$t(entity.playlist_one) editatu",
|
||||
"publicJellyfinNote": "Arrazoiren batengatik, Jellyfin ez du erakusten erreprodukzio-zerrendak publikoak diren edo ez. Hau publiko izaten jarraitzea nahi baduzu, hautatu sarrera hau"
|
||||
},
|
||||
"queryEditor": {
|
||||
"title": "kontsulta editorea",
|
||||
"input_optionMatchAll": "guztiak bat etorri",
|
||||
"input_optionMatchAny": "edozeinekin bat etorri"
|
||||
},
|
||||
"updateServer": {
|
||||
"success": "zerbitzaria behar bezala eguneratu da",
|
||||
"title": "zerbitzaria eguneratu"
|
||||
},
|
||||
"privateMode": {
|
||||
"title": "modu pribatua",
|
||||
"enabled": "modu pribatua gaituta, erreprodukzio egoera kanpoko integrazioetatik ezkutatuta dago orain",
|
||||
"disabled": "modu pribatua desgaituta, erreprodukzio egoera ikusgai dago orain gaitutako kanpoko integrazioentzat"
|
||||
}
|
||||
},
|
||||
"page": {
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
},
|
||||
"albumDetail": {
|
||||
"released": "argitaratuta",
|
||||
"moreFromArtist": "$t(entity.artist_one) honetatik gehiago",
|
||||
"moreFromGeneric": "{{item}}-(e)tik gehiago"
|
||||
},
|
||||
"albumList": {
|
||||
"title": "$t(entity.album_other)",
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)",
|
||||
"artistAlbums": "{{artist}}-(a)ren albumak"
|
||||
},
|
||||
"appMenu": {
|
||||
"quit": "$t(common.quit)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"collapseSidebar": "tolestu alboko barra",
|
||||
"expandSidebar": "zabaldu alboko barra",
|
||||
"goBack": "atzera",
|
||||
"goForward": "aurrera",
|
||||
"manageServers": "kudeatu zerbitzariak",
|
||||
"privateModeOff": "itzali modu pribatua",
|
||||
"privateModeOn": "aktibatu modu pribatua",
|
||||
"selectServer": "aukeratu zerbitzaria",
|
||||
"version": "bertsioa {{version}}",
|
||||
"openBrowserDevtools": "ireki nabigatzailearen garapen tresnak"
|
||||
},
|
||||
"manageServers": {
|
||||
"url": "URLa",
|
||||
"username": "erabiltzaile-izena",
|
||||
"title": "kudeatu zerbitzariak",
|
||||
"serverDetails": "zerbitzariaren xehetasunak",
|
||||
"editServerDetailsTooltip": "editatu zerbitzariaren xehetasunak",
|
||||
"removeServer": "kendu zerbitzaria"
|
||||
},
|
||||
"contextMenu": {
|
||||
"addFavorite": "$t(action.addToFavorites)",
|
||||
"addLast": "$t(player.addLast)",
|
||||
"addNext": "$t(player.addNext)",
|
||||
"addToFavorites": "$t(action.addToFavorites)",
|
||||
"addToPlaylist": "$t(action.addToPlaylist)",
|
||||
"createPlaylist": "$t(action.createPlaylist)",
|
||||
"deletePlaylist": "$t(action.deletePlaylist)",
|
||||
"deselectAll": "$t(action.deselectAll)",
|
||||
"download": "deskargatu",
|
||||
"moveToNext": "$t(action.moveToNext)",
|
||||
"moveToBottom": "$t(action.moveToBottom)",
|
||||
"moveToTop": "$t(action.moveToTop)",
|
||||
"play": "$t(player.play)",
|
||||
"playSimilarSongs": "$t(player.playSimilarSongs)",
|
||||
"removeFromFavorites": "$t(action.removeFromFavorites)",
|
||||
"removeFromPlaylist": "$t(action.removeFromPlaylist)",
|
||||
"removeFromQueue": "$t(action.removeFromQueue)",
|
||||
"setRating": "$t(action.setRating)",
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"numberSelected": "{{count}} hautatuta",
|
||||
"shareItem": "partekatu elementua",
|
||||
"goToAlbum": "joan $t(entity.album_one)-(e)ra",
|
||||
"goToAlbumArtist": "joan $t(entity.albumArtist_one)-(e)ra",
|
||||
"showDetails": "informazioa lortu"
|
||||
},
|
||||
"fullscreenPlayer": {
|
||||
"config": {
|
||||
"opacity": "opakotasuna",
|
||||
"synchronized": "sinkronizatuta",
|
||||
"unsynchronized": "sinkronizatu gabe",
|
||||
"dynamicIsImage": "gaitu atzeko planoaren irudia",
|
||||
"followCurrentLyric": "jarraitu uneko letra",
|
||||
"lyricSize": "letraren tamaina",
|
||||
"dynamicBackground": "atzeko plano dinamikoa",
|
||||
"dynamicImageBlur": "irudiaren lausotze tamaina",
|
||||
"lyricAlignment": "letraren lerrokatzea",
|
||||
"showLyricMatch": "erakutsi letren bat-etortzea",
|
||||
"showLyricProvider": "erakutsi letra hornitzailea",
|
||||
"lyricOffset": "letra-desplazamendua (ms)"
|
||||
},
|
||||
"lyrics": "letrak",
|
||||
"related": "erlazionatuta",
|
||||
"upNext": "hurrengoa",
|
||||
"visualizer": "bistaratzailea",
|
||||
"noLyrics": "ez da letrarik aurkitu"
|
||||
},
|
||||
"genreList": {
|
||||
"title": "$t(entity.genre_other)",
|
||||
"showAlbums": "erakutsi $t(entity.album_other) $t(entity.album_other)",
|
||||
"showTracks": "erakutsi $t(entity.genre_one) $t(entity.track_other)"
|
||||
},
|
||||
"globalSearch": {
|
||||
"title": "komandoak",
|
||||
"commands": {
|
||||
"goToPage": "joan orrira",
|
||||
"searchFor": "bilatu {{query}}",
|
||||
"serverCommands": "zerbitzariaren komandoak"
|
||||
}
|
||||
},
|
||||
"home": {
|
||||
"title": "$t(common.home)",
|
||||
"mostPlayed": "gehien entzundakoak",
|
||||
"newlyAdded": "azken aldian gehitutako argitalpenak",
|
||||
"recentlyPlayed": "azken aldian entzundakoak",
|
||||
"recentlyReleased": "azken aldian argitaratutak",
|
||||
"explore": "arakatu zure liburutegitik"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist_other)"
|
||||
},
|
||||
"setting": {
|
||||
"advanced": "aurreratua",
|
||||
"generalTab": "orokorra",
|
||||
"playbackTab": "erreprodukzioa",
|
||||
"windowTab": "leihoa"
|
||||
},
|
||||
"sidebar": {
|
||||
"albumArtists": "$t(entity.albumArtist_other)",
|
||||
"albums": "$t(entity.album_other)",
|
||||
"artists": "$t(entity.artist_other)",
|
||||
"folders": "$t(entity.folder_other)",
|
||||
"genres": "$t(entity.genre_other)",
|
||||
"home": "$t(common.home)",
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"search": "$t(common.search)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"tracks": "$t(entity.track_other)",
|
||||
"myLibrary": "nire liburutegia",
|
||||
"nowPlaying": "orain erreproduzitzen",
|
||||
"shared": "partekatutako $t(entity.playlist_other)"
|
||||
},
|
||||
"trackList": {
|
||||
"title": "$t(entity.track_other)",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track_other)",
|
||||
"artistTracks": "{{artist}}-(r)en abestiak"
|
||||
},
|
||||
"albumArtistDetail": {
|
||||
"about": "{{artist}}-(r)i buruz",
|
||||
"relatedArtists": "erlazionatutako $t(entity.artist_other)",
|
||||
"topSongs": "abesti nagusiak",
|
||||
"topSongsFrom": "{{title}}-(a)ren abesti nagusiak",
|
||||
"viewAll": "ikusi guztiak",
|
||||
"viewAllTracks": "ikusi $t(entity.track_other) guztiak",
|
||||
"appearsOn": "agertzen da hemen",
|
||||
"recentReleases": "azken argitalpenak",
|
||||
"viewDiscography": "ikusi diskografia"
|
||||
},
|
||||
"itemDetail": {
|
||||
"copyPath": "kopiatu bidea arbelean",
|
||||
"openFile": "erakutsi pista fitxategi-kudeatzailean",
|
||||
"copiedPath": "bidea behar bezala kopiatu da"
|
||||
},
|
||||
"playlist": {
|
||||
"reorder": "berrantolaketa IDaren arabera ordenatzean bakarrik gaituta dago"
|
||||
}
|
||||
}
|
||||
}
|
||||
+354
-33
@@ -6,12 +6,31 @@
|
||||
"skip": "رد کن",
|
||||
"toggleFullscreenPlayer": "تغییر به پخشکنندهٔ تمامصفحه",
|
||||
"skip_back": "برو عقب",
|
||||
"shuffle": "شافل",
|
||||
"shuffle": "پخش تصادفی",
|
||||
"repeat_off": "تکرار غیرفعال",
|
||||
"pause": "pause",
|
||||
"pause": "ایست",
|
||||
"unfavorite": "حذف از موردعلاقهها",
|
||||
"shuffle_off": "شافل غیرفعال",
|
||||
"skip_forward": "برو جلو"
|
||||
"shuffle_off": "پخش تصادفی غیر فعال",
|
||||
"skip_forward": "برو جلو",
|
||||
"queue_moveToTop": "جابجا کردن انتخاب شده به پایین",
|
||||
"queue_clear": "خالی کردن صف",
|
||||
"queue_remove": "حذف انتخاب شده",
|
||||
"addLast": "افزودن به پایان",
|
||||
"next": "پسین",
|
||||
"play": "پخش",
|
||||
"playbackSpeed": "تندی پخش",
|
||||
"playRandom": "پخش تصادفی",
|
||||
"previous": "پیشین",
|
||||
"mute": "بیصدا کردن",
|
||||
"playbackFetchCancel": "دارد طول میکشد... برای لفو کردن اعلان را ببندید",
|
||||
"playbackFetchInProgress": "بارگذاری قطعهها…",
|
||||
"queue_moveToBottom": "جابجا کردن انتخاب شده به بالا",
|
||||
"addNext": "افزودن به پسین",
|
||||
"favorite": "مورد علاقه",
|
||||
"playSimilarSongs": "پخش آهنگهای همگون",
|
||||
"playbackFetchNoResults": "هیچ آهنگی پیدا نشد",
|
||||
"viewQueue": "دیدن صف",
|
||||
"muted": "بیصدا"
|
||||
},
|
||||
"action": {
|
||||
"editPlaylist": "ویرایش $t(entity.playlist_one)",
|
||||
@@ -29,8 +48,13 @@
|
||||
"deselectAll": "لغو انتخاب همه",
|
||||
"moveToBottom": "انتقال به پایین",
|
||||
"setRating": "تعیین امتیاز",
|
||||
"toggleSmartPlaylistEditor": "تغییر $t(entity.smartPlaylist) ویرایشگر",
|
||||
"removeFromFavorites": "حذف از $t(entity.favorite_other)"
|
||||
"toggleSmartPlaylistEditor": "تغییر ویرایشگر $t(entity.smartPlaylist)",
|
||||
"removeFromFavorites": "حذف از $t(entity.favorite_other)",
|
||||
"openIn": {
|
||||
"lastfm": "باز کردن در Last.fm",
|
||||
"musicbrainz": "باز کردن در MusicBranz"
|
||||
},
|
||||
"moveToNext": "جابجا کردن به بعدی"
|
||||
},
|
||||
"setting": {
|
||||
"hotkey_skipBackward": "برو عقب",
|
||||
@@ -72,7 +96,7 @@
|
||||
"mpvExecutablePath": "مسیر اجرای MPV",
|
||||
"audioDevice": "دستگاه صوتی",
|
||||
"hotkey_rate2": "امتیاز ۲ ستاره",
|
||||
"playButtonBehavior_description": "رفتار پیشفرض دکمهٔ پخش را هنگامی که آهنگی به صف اضافه میشود معین میکند",
|
||||
"playButtonBehavior_description": "رفتار پیشفرض دکمهٔ پخش را هنگامی که آهنگی به صف افزوده میشود را معین میکند",
|
||||
"exitToTray": "خروج به tray",
|
||||
"hotkey_rate4": "امتیاز ۴ ستاره",
|
||||
"enableRemote": "فعال کردن کنترل از راه دور سرویسدهنده",
|
||||
@@ -93,7 +117,64 @@
|
||||
"customFontPath_description": "مسیر قلم سفارشی را برای استفاده در اپلیکیشن مشخص کنید",
|
||||
"gaplessAudio_optionWeak": "ضعیف (توصیه شده)",
|
||||
"hotkey_playbackStop": "توقف",
|
||||
"font_description": "قلم مورد استفادهٔ اپلیکیشن را معین میکند"
|
||||
"font_description": "قلم مورد استفادهٔ اپلیکیشن را معین میکند",
|
||||
"accentColor_description": "رنگ شاخص را برای نرمافزار مشخص میکند",
|
||||
"applicationHotkeys": "کلیدهای میانبر نرمافزار",
|
||||
"accentColor": "رنگ شاخص",
|
||||
"albumBackgroundBlur": "اندازهی مبهمی نگارهی پسزمینهی آلبوم",
|
||||
"albumBackgroundBlur_description": "مقدار مبهمیای که روی نگارهی پسزمینهی آلبوم اعمال میشود را تنظیم میکند",
|
||||
"albumBackground": "نگارهی پسزمینهی آلبوم",
|
||||
"albumBackground_description": "یک نگارهی پسزمینه برای صفحات آلبوم دارای نگار آلبوم هستند، میافزاید",
|
||||
"artistConfiguration": "پیکربندی صفحهی هنرمند آلبوم",
|
||||
"applicationHotkeys_description": "پیکربندی کلیدهای میانبر نرمافزار. برای تنظیم یک کلید میانبر عمومی مربع چک را فعال کنید (فقط پخشکنندهی میزکار)",
|
||||
"clearCache": "پاکسازی کَش مرورگر",
|
||||
"clearQueryCache": "پاکسازی کَش فیشین",
|
||||
"clearCacheSuccess": "با موفقیت کَش پاک شد",
|
||||
"artistConfiguration_description": "پیکربندی اینکه چه آیتمیهایی و در چه ترتیبی در صفحهی هنرمند آلبوم نمایش داده شوند",
|
||||
"buttonSize": "اندازهی دکمهی پخش نوار",
|
||||
"contextMenu": "پیکربندی فهرست زمینه (کلیک راست)",
|
||||
"buttonSize_description": "اندازهی دکمههای پخش نوار",
|
||||
"audioExclusiveMode_description": "حالت اختصاصی خروجی را فعال میکند. در این حالت، سامانه معمولاً قفل است و فقط mpv میتواند خروجی صدا دهد",
|
||||
"clearQueryCache_description": "یک 'پاکسازی نرم' از فیشین. این فهرستهای پخش و فرادادهی قطعهها را تازه میکند و متن شعرهای ذخیره شده را بازنشانی میکند. پیکربندیها، اعتبارنامههای سرویسدهنده و نگارههای کَش شده حفظ میشوند",
|
||||
"clearCache_description": "یک 'پاکسازی سخت' فیشین. افزون بر پاکسازی کَش فیشین، کَش مرورگر هم تهی میشود (نگارههای ذخیره شده و باقی داراییها). اعتبارنامهها و پیکربندیها حفظ میشوند",
|
||||
"contextMenu_description": "به شما اجازه میدهد که آیتمهای نمایش داده شده در فهرستی که وقتی روی یک آیتم کلیک راست میکنید پدیدار میشود، را پنهان کنید. آیتمهایی که منتخب نیستند پنهان میشوند",
|
||||
"crossfadeStyle": "شیوهی crossfade",
|
||||
"customCssEnable_description": "اجازه دادن برای نوشتن css سفارشی.",
|
||||
"translationApiKey": "کلید API ترجمه",
|
||||
"webAudio_description": "از صدای وب بهرهمند میشود. این قابلیتهای پیشرفتهای مانند گین بازپخش (replygain) را فعال میکند. غیرفعال کنید اگر غیر از این را تجربه میکنید",
|
||||
"windowBarStyle_description": "گزینش سبک نوار پنجره",
|
||||
"translationApiKey_description": "کلید API برای ترجمه (پشتیبانی فقط برای نقطهی پایانی سرویسدهندهی جهانی)",
|
||||
"theme": "تم",
|
||||
"hotkey_togglePreviousSongFavorite": "تغییر وضعیت برای مورد علاقهی $t(common.previousSong)",
|
||||
"transcode": "فعالسازی رمزگردانی",
|
||||
"transcode_description": "رمزگردانی به فرمتهای گوناگون را فعال میکند",
|
||||
"transcodeBitrate": "نرخ انتقال رمزگردانی",
|
||||
"startMinimized": "پنهانشده آغاز کن",
|
||||
"theme_description": "تم مورد استفاده در نرمافزار را میگزیند",
|
||||
"themeLight": "تم (روشن)",
|
||||
"transcodeBitrate_description": "نرخ انتقال برای رمزگردانی را انتخاب میکند. 0 بدان معناست سرور آن را انتخاب کند",
|
||||
"transcodeFormat": "فرمت رمزگردانی",
|
||||
"transcodeFormat_description": "فرمت رمزگردانی را انتخاب میکند. برای اینکه سرور آن را انتخاب کند، خالی بگذارید",
|
||||
"customCssEnable": "فعال کردن css سفارشی",
|
||||
"translationTargetLanguage": "زبان هدف ترجمه",
|
||||
"hotkey_toggleCurrentSongFavorite": "تغییر وضعیت مورد علاقه برای $t(common.currentSong)",
|
||||
"themeDark_description": "تم تاریک را برای استفادهی نرمافزار میگزیند",
|
||||
"volumeWheelStep_description": "اندازهای از حجم صدا را در زمان اسکرول کردن روی نوار لغزنده تغییر داده شود",
|
||||
"trayEnabled": "نمایش سینی",
|
||||
"trayEnabled_description": "نمایش/پنهان کردن آیکون/فهرست در سینی. اگر غیرفعال باشد، کوچک کردن/خروج به سینی را نیز غیرفعال میکند",
|
||||
"useSystemTheme_description": "از روشنی یا تاریکی که سیستم تعریف کرده است، پیروی میکند",
|
||||
"crossfadeDuration": "زمان محو کردن گذار قطعه به قطعهی بعدی",
|
||||
"themeLight_description": "تم روشن را برای استفادهی نرمافزار میگزیند",
|
||||
"volumeWidth": "عرض نوار لغزندهی حجم صدا",
|
||||
"crossfadeStyle_description": "شیوهی crossfade که میخواهید پخشکننده از آن استفاده کند را انتخاب کنید",
|
||||
"startMinimized_description": "نرمافزار را در سینی اجرا کن",
|
||||
"volumeWidth_description": "عرضی که نوار لغزندهی حجم صدا داشته باشد",
|
||||
"themeDark": "تم (تاریک)",
|
||||
"useSystemTheme": "استفاده از تم سیستم",
|
||||
"volumeWheelStep": "گام چرخ حجم صدا",
|
||||
"webAudio": "استفاده از صدای وب",
|
||||
"windowBarStyle": "سبک نوار پنجره",
|
||||
"crossfadeDuration_description": "زمان افکت crossfade را مشخص میکند"
|
||||
},
|
||||
"common": {
|
||||
"backward": "به عقب",
|
||||
@@ -140,9 +221,9 @@
|
||||
"forceRestartRequired": "برای اعمال تغییرها دوباره راهاندازی کنید… اعلان را برای راهاندازی دوباره ببندید",
|
||||
"version": "نسخه",
|
||||
"title": "عنوان",
|
||||
"filter_one": "فیلتر",
|
||||
"filter_other": "فیلتر",
|
||||
"filters": "فیلتر",
|
||||
"filter_one": "پالایش",
|
||||
"filter_other": "پالایش",
|
||||
"filters": "پالایش",
|
||||
"create": "ساختن",
|
||||
"bitrate": "بیتریت",
|
||||
"saveAndReplace": "ذخیره و جایگزین",
|
||||
@@ -162,17 +243,29 @@
|
||||
"menu": "منو",
|
||||
"restartRequired": "راهاندازی دوباره لازم است",
|
||||
"previousSong": "$t(entity.track_one) پیشین",
|
||||
"noResultsFromQuery": "جست و جو نتیجهای نداشت",
|
||||
"noResultsFromQuery": "جستوجو نتیجهای نداشت",
|
||||
"quit": "خروج",
|
||||
"expand": "گسترش",
|
||||
"search": "جست و جو",
|
||||
"search": "جستوجو",
|
||||
"saveAs": "ذخیره کن با اسم",
|
||||
"disc": "دیسک",
|
||||
"yes": "بله",
|
||||
"random": "تصادفی",
|
||||
"size": "حجم",
|
||||
"biography": "زندگینامه",
|
||||
"note": "توجه"
|
||||
"note": "توجه",
|
||||
"albumGain": "گین آلبوم",
|
||||
"close": "بستن",
|
||||
"albumPeak": "اوج آلبوم",
|
||||
"mbid": "شناسهی MusicBrainz",
|
||||
"reload": "بارگذاری مجدد",
|
||||
"setting": "پیکربندی",
|
||||
"trackGain": "گین قطعه",
|
||||
"trackPeak": "اوج قطعه",
|
||||
"translation": "ترجمه",
|
||||
"preview": "پیشنمایش",
|
||||
"share": "اشتراکگذاری",
|
||||
"codec": "کدک"
|
||||
},
|
||||
"error": {
|
||||
"remotePortWarning": "برای تعیین port تازه، سرویس دهنده را دوباره راهاندازی کنید",
|
||||
@@ -188,7 +281,15 @@
|
||||
"serverNotSelectedError": "سرویسدهندهای انتخاب نشده",
|
||||
"remoteDisableError": "هنگام $t(common.disable) سرویس دهنده خطایی رخ داد",
|
||||
"mpvRequired": "وجود MPV ضروری است",
|
||||
"audioDeviceFetchError": "هنگام دسترسی به دستگاه صوتی خطایی رخ داد"
|
||||
"audioDeviceFetchError": "هنگام دسترسی به دستگاه صوتی خطایی رخ داد",
|
||||
"localFontAccessDenied": "دسترسی به فونتهای محلی پذیرفته نشد",
|
||||
"loginRateError": "تلاشهای بسیار برای ورود انجام دادهاید،لطفاً بعد از چند ثانیه دوباره امتحان کنید",
|
||||
"networkError": "خطای شبکه رخ داد",
|
||||
"badAlbum": "شما این صفحه را میبینید چونکه این آهنگ قسمتی از یک آلبوم نیست. شما احتمالا این مسأله را به این خاطر میبینید که آهنگی در پوشهی سطح بالای آهنگهایتان دارید. جلیفین فقط قطعههایی را گروهبندی میکند که در یک پوشه قرار دارند.",
|
||||
"invalidServer": "سرویسدهندهی نامعتبر",
|
||||
"openError": "نمیتوان پرونده را باز کرد",
|
||||
"endpointNotImplementedError": "نقطهی پایان {{endpoint}} برای {{serverType}} قرار داده نشده است",
|
||||
"systemFontError": "خطایی هنگام تلاش برای دریافت فونتهای سیستم رخ داد"
|
||||
},
|
||||
"filter": {
|
||||
"mostPlayed": "بیشتر پخش شده",
|
||||
@@ -201,13 +302,13 @@
|
||||
"owner": "$t(common.owner)",
|
||||
"title": "عنوان",
|
||||
"rating": "امتیاز",
|
||||
"search": "جست و جو",
|
||||
"search": "جستوجو",
|
||||
"bitrate": "بیتریت",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"recentlyAdded": "به تازگی اضافه شده",
|
||||
"recentlyAdded": "به تازگی افزوده شده",
|
||||
"note": "توجه",
|
||||
"name": "نام",
|
||||
"dateAdded": "تاریخ اضافه شدن",
|
||||
"dateAdded": "تاریخ افزوده شدن",
|
||||
"releaseDate": "تاریخ انتشار",
|
||||
"albumCount": "$t(entity.album_other) عدد",
|
||||
"path": "مسیر",
|
||||
@@ -230,7 +331,9 @@
|
||||
"fromYear": "از سال",
|
||||
"criticRating": "امتیاز منتقدین",
|
||||
"album": "$t(entity.album_one)",
|
||||
"trackNumber": "قطعه"
|
||||
"trackNumber": "قطعه",
|
||||
"communityRating": "رتبه بندی جامعه",
|
||||
"isCompilation": "مخلوط است"
|
||||
},
|
||||
"form": {
|
||||
"deletePlaylist": {
|
||||
@@ -252,38 +355,61 @@
|
||||
"input_url": "نشانی",
|
||||
"input_password": "رمز عبور",
|
||||
"input_name": "نام سرویسدهنده",
|
||||
"success": "سرویسدهنده اضافه شد",
|
||||
"success": "سرویسدهنده افزوده شد",
|
||||
"input_savePassword": "ذخیرهٔ رمز",
|
||||
"error_savePassword": "هنگام ذخیره رمز خطایی رخ داد"
|
||||
"error_savePassword": "هنگام ذخیره رمز خطایی رخ داد",
|
||||
"ignoreCors": "نادیده گرفتن هستهها ($t(common.restartRequired))",
|
||||
"input_legacyAuthentication": "فعالسازی احراز هویت سنتی",
|
||||
"ignoreSsl": "نادیده گرفتن ssl ($t(common.restartRequired))"
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"success": "$t(entity.song_other) به {{numOfPlaylists}}$t(entity.playlist_other) اضافه شد",
|
||||
"success": "$t(entity.song_other) به {{numOfPlaylists}}$t(entity.playlist_other) افزوده شد",
|
||||
"title": "افزودن به $t(entity.playlist_one)",
|
||||
"input_playlists": "$t(entity.playlist_other)"
|
||||
"input_playlists": "$t(entity.playlist_other)",
|
||||
"input_skipDuplicates": "پرش از تکراریها"
|
||||
},
|
||||
"lyricSearch": {
|
||||
"input_name": "$t(common.name)",
|
||||
"input_artist": "$t(entity.artist_one)"
|
||||
"input_artist": "$t(entity.artist_one)",
|
||||
"title": "جستوجو در متن شعر"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"title": "ویرایش $t(entity.playlist_one)"
|
||||
"title": "ویرایش $t(entity.playlist_one)",
|
||||
"success": "$t(entity.playlist_one) با موفقیت بروزرسانی شد",
|
||||
"publicJellyfinNote": "جلیفین به دلیلی اینکه فهرست پخش عمومیست یا خصوصی را فاش نمیکند. اگر میخواهید این عمومی باقی بماند، لطفاٌ ورودی پیشرو را منتخب داشته باشید"
|
||||
},
|
||||
"queryEditor": {
|
||||
"input_optionMatchAny": "همخوانی داشتن هر کدام",
|
||||
"input_optionMatchAll": "همخوانی داشتن همه"
|
||||
},
|
||||
"shareItem": {
|
||||
"expireInvalid": "انقضا باید در آینده باشد",
|
||||
"description": "بازنمود",
|
||||
"setExpiration": "تنظیم انقضا",
|
||||
"success": "پیوند اشتراکگذاری در کلیپبورد کپی شد (یا اینجا را کلیک کنید تا باز شود)",
|
||||
"allowDownloading": "اجازه دادن بارگیری",
|
||||
"createFailed": "ناکامی در ساخت پیوند اشتراکگذاری (آیا اشتراکگذاری فعال است؟)"
|
||||
},
|
||||
"updateServer": {
|
||||
"success": "سرویسدهنده با موفقیت بروزرسانی شد",
|
||||
"title": "بروزرسانی سرویسدهنده"
|
||||
}
|
||||
},
|
||||
"entity": {
|
||||
"genre_one": "ژانر",
|
||||
"genre_other": "ژانر",
|
||||
"genre_other": "ژانرها",
|
||||
"playlistWithCount_one": "{{count}} فهرست پخش",
|
||||
"playlistWithCount_other": "{{count}} فهرست پخش",
|
||||
"playlist_one": "فهرست پخش",
|
||||
"playlist_other": "فهرست پخش",
|
||||
"playlist_other": "فهرستهای پخش",
|
||||
"artist_one": "هنرمند",
|
||||
"artist_other": "هنرمند",
|
||||
"artist_other": "هنرمندان",
|
||||
"folderWithCount_one": "{{count}} پوشه",
|
||||
"folderWithCount_other": "{{count}} پوشه",
|
||||
"albumArtist_one": "هنرمند آلبوم",
|
||||
"albumArtist_other": "هنرمند آلبوم",
|
||||
"albumArtist_other": "هنرمندان آلبوم",
|
||||
"track_one": "قطعه",
|
||||
"track_other": "قطعه",
|
||||
"track_other": "قطعهها",
|
||||
"albumArtistCount_one": "{{count}} هنرمند آلبوم",
|
||||
"albumArtistCount_other": "{{count}} هنرمند آلبوم",
|
||||
"albumWithCount_one": "{{count}} آلبوم",
|
||||
@@ -293,13 +419,208 @@
|
||||
"artistWithCount_one": "{{count}} هنرمند",
|
||||
"artistWithCount_other": "{{count}} هنرمند",
|
||||
"folder_one": "پوشه",
|
||||
"folder_other": "پوشه",
|
||||
"folder_other": "پوشهها",
|
||||
"smartPlaylist": "$t(entity.playlist_one) هوشمند",
|
||||
"album_one": "آلبوم",
|
||||
"album_other": "آلبوم",
|
||||
"album_other": "آلبومها",
|
||||
"genreWithCount_one": "{{count}} ژانر",
|
||||
"genreWithCount_other": "{{count}} ژانر",
|
||||
"trackWithCount_one": "{{count}} قطعه",
|
||||
"trackWithCount_other": "{{count}} قطعه"
|
||||
"trackWithCount_other": "{{count}} قطعه",
|
||||
"play_one": "{{count}} بار پخش",
|
||||
"play_other": "{{count}} بار پخش",
|
||||
"song_one": "آهنگ",
|
||||
"song_other": "آهنگها"
|
||||
},
|
||||
"page": {
|
||||
"albumList": {
|
||||
"title": "$t(entity.album_other)",
|
||||
"artistAlbums": "آلبومهای {{artist}}",
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)"
|
||||
},
|
||||
"appMenu": {
|
||||
"settings": "$t(common.setting_other)",
|
||||
"selectServer": "گزینش سرویسدهنده",
|
||||
"expandSidebar": "گسترش نوار کناری",
|
||||
"collapseSidebar": "فروکش نوار کناری",
|
||||
"goBack": "بازگشت",
|
||||
"openBrowserDevtools": "باز کردن ابزارهای توسعه مرورگر",
|
||||
"quit": "$t(common.quit)",
|
||||
"goForward": "پیش رفتن",
|
||||
"manageServers": "مدیریت سرویسدهندهها",
|
||||
"version": "نسخهی {{version}}"
|
||||
},
|
||||
"albumArtistDetail": {
|
||||
"appearsOn": "مشاهده میشود در",
|
||||
"about": "دربارهی {{artist}}",
|
||||
"recentReleases": "عرضههای اخیر",
|
||||
"viewAllTracks": "نمایش همهی $t(entity.track_other)",
|
||||
"topSongsFrom": "قطعههای برتر از {{title}}",
|
||||
"viewAll": "نمایش همه",
|
||||
"viewDiscography": "نمایش کاتالوگ",
|
||||
"relatedArtists": "$t(entity.artist_other) مربوطه",
|
||||
"topSongs": "قطعههای برتر"
|
||||
},
|
||||
"contextMenu": {
|
||||
"addFavorite": "$t(action.addToFavorites)",
|
||||
"addLast": "$t(player.addLast)",
|
||||
"addNext": "$t(player.addNext)",
|
||||
"addToFavorites": "$t(action.addToFavorites)",
|
||||
"numberSelected": "{{count}} تا انتخاب شده",
|
||||
"play": "$t(player.play)",
|
||||
"removeFromFavorites": "$t(action.removeFromFavorites)",
|
||||
"deselectAll": "$t(action.deselectAll)",
|
||||
"download": "بارگیری",
|
||||
"shareItem": "اشتراکگذاری آیتم",
|
||||
"removeFromPlaylist": "$t(action.removeFromPlaylist)",
|
||||
"showDetails": "دریافت داده",
|
||||
"playSimilarSongs": "$t(player.playSimilarSongs)",
|
||||
"removeFromQueue": "$t(action.removeFromQueue)",
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"addToPlaylist": "$t(action.addToPlaylist)",
|
||||
"createPlaylist": "$t(action.createPlaylist)",
|
||||
"moveToBottom": "$t(action.moveToBottom)",
|
||||
"moveToTop": "$t(action.moveToTop)",
|
||||
"setRating": "$t(action.setRating)",
|
||||
"deletePlaylist": "$t(action.deletePlaylist)",
|
||||
"moveToNext": "$t(action.moveToNext)"
|
||||
},
|
||||
"fullscreenPlayer": {
|
||||
"related": "موارد مربوطه",
|
||||
"visualizer": "تجسم یافته",
|
||||
"config": {
|
||||
"dynamicImageBlur": "اندازه مبهمی نگاره",
|
||||
"dynamicIsImage": "فعالسازی نگاره به عنوان پسزمینه",
|
||||
"lyricOffset": "انحراف متن شعر (میلیثانیه)",
|
||||
"unsynchronized": "همگام نشده",
|
||||
"dynamicBackground": "پسزمینه پویا",
|
||||
"followCurrentLyric": "دنبال کردن متن شعر کنونی",
|
||||
"lyricAlignment": "همترازی متن شعر",
|
||||
"lyricGap": "فاصلهی متن شعر",
|
||||
"showLyricProvider": "نمایش فراهمگر متن شعر",
|
||||
"useImageAspectRatio": "استفاده از نسبت نمای نگاره",
|
||||
"lyricSize": "اندازهی متن شعر",
|
||||
"opacity": "شفافی",
|
||||
"showLyricMatch": "نمایش همخوانی متن شعر",
|
||||
"synchronized": "همگام شده"
|
||||
},
|
||||
"noLyrics": "هیچ متن شعری پیدا نشد",
|
||||
"lyrics": "متن شعر",
|
||||
"upNext": "در ادامه"
|
||||
},
|
||||
"home": {
|
||||
"mostPlayed": "بیشترین پخششدهها",
|
||||
"title": "$t(common.home)",
|
||||
"explore": "در کتابخانهی خود کاوش کنید",
|
||||
"newlyAdded": "عرضههای تازه افزوده شده",
|
||||
"recentlyPlayed": "تازه پخش شدهها"
|
||||
},
|
||||
"playlist": {
|
||||
"reorder": "مرتب کردن دوباره زمانی فقط زمانی فعال شود که مرتبسازی بر اساس شناسه است"
|
||||
},
|
||||
"setting": {
|
||||
"advanced": "پیشرفته",
|
||||
"windowTab": "پنجره",
|
||||
"generalTab": "همگانی",
|
||||
"hotkeysTab": "کلیدهای میانبر",
|
||||
"playbackTab": "پخش"
|
||||
},
|
||||
"sidebar": {
|
||||
"genres": "$t(entity.genre_other)",
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"search": "$t(common.search)",
|
||||
"albumArtists": "$t(entity.albumArtist_other)",
|
||||
"albums": "$t(entity.album_other)",
|
||||
"folders": "$t(entity.folder_other)",
|
||||
"artists": "$t(entity.artist_other)",
|
||||
"home": "$t(common.home)",
|
||||
"nowPlaying": "پخش کنونی",
|
||||
"tracks": "$t(entity.track_other)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"shared": "$t(entity.playlist_other) اشتراکگذاری شده"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "موارد بیشتر از این $t(entity.artist_one)",
|
||||
"moreFromGeneric": "موارد بیشتر از {{item}}",
|
||||
"released": "عرضه شده"
|
||||
},
|
||||
"manageServers": {
|
||||
"title": "مدیریت سرویسدهندهها",
|
||||
"url": "آدرس",
|
||||
"serverDetails": "ریزگان سرویسدهنده",
|
||||
"removeServer": "حذف سرویسدهنده",
|
||||
"username": "نام کاربری",
|
||||
"editServerDetailsTooltip": "ویرایش ریزگان سرویسدهنده"
|
||||
},
|
||||
"genreList": {
|
||||
"showAlbums": "نمایش $t(entity.genre_one) $t(entity.album_other)",
|
||||
"title": "$t(entity.genre_other)",
|
||||
"showTracks": "نمایش $t(entity.genre_one) $t(entity.track_other)"
|
||||
},
|
||||
"globalSearch": {
|
||||
"commands": {
|
||||
"goToPage": "رفتن به صفحهی",
|
||||
"searchFor": "جستوجو برای {{query}}",
|
||||
"serverCommands": "فرمانهای سرویسدهنده"
|
||||
},
|
||||
"title": "فرمانها"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist_other)"
|
||||
},
|
||||
"trackList": {
|
||||
"title": "$t(entity.track_other)",
|
||||
"artistTracks": "قطعههای {{artist}}",
|
||||
"genreTracks": "$t(entity.track_other) \"{{genre}}\""
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
},
|
||||
"itemDetail": {
|
||||
"copyPath": "کپی کردن مسیر در کلیپبورد",
|
||||
"copiedPath": "مسیر با موفقیت کپی شد",
|
||||
"openFile": "نمایش قطعه در مدیر پرونده"
|
||||
}
|
||||
},
|
||||
"table": {
|
||||
"column": {
|
||||
"size": "$t(common.size)",
|
||||
"lastPlayed": "آخرین بار پخش شده",
|
||||
"discNumber": "دیسک",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"title": "عنوان",
|
||||
"trackNumber": "قطعه",
|
||||
"favorite": "مورد علاقه",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"comment": "دیدگاه",
|
||||
"playCount": "تعداد پخش",
|
||||
"rating": "امتیاز",
|
||||
"path": "مسیر",
|
||||
"releaseYear": "سال",
|
||||
"dateAdded": "تاریخ افزوده شدن",
|
||||
"releaseDate": "تاریخ عرضه"
|
||||
},
|
||||
"config": {
|
||||
"general": {
|
||||
"followCurrentSong": "آهنگ کنونی را دنبال کن",
|
||||
"displayType": "نوع نمایش",
|
||||
"itemSize": "اندازهی آیتم (px)",
|
||||
"size": "$t(common.size)",
|
||||
"tableColumns": "ستونهای جدول",
|
||||
"autoFitColumns": "تطبیق دادن ستونها به شیوهی خودکار",
|
||||
"gap": "$t(common.gap)",
|
||||
"itemGap": "فاصلهی آیتم (px)"
|
||||
},
|
||||
"view": {
|
||||
"card": "کارت"
|
||||
},
|
||||
"label": {
|
||||
"playCount": "تعداد پخش",
|
||||
"dateAdded": "تاریخ افزوده شدن",
|
||||
"discNumber": "شمارهی دیسک",
|
||||
"lastPlayed": "آخرین بار پخش شده",
|
||||
"actions": "$t(common.action_other)"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,795 @@
|
||||
{
|
||||
"common": {
|
||||
"size": "koko",
|
||||
"search": "etsi",
|
||||
"sortOrder": "järjestys",
|
||||
"setting": "asetus",
|
||||
"title": "otsikko",
|
||||
"trackNumber": "raita",
|
||||
"action_one": "toiminto",
|
||||
"action_other": "toiminnot",
|
||||
"add": "lisää",
|
||||
"areYouSure": "oletko varma?",
|
||||
"ascending": "nouseva",
|
||||
"backward": "takaperin",
|
||||
"bitrate": "bittinopeus",
|
||||
"channel_one": "kanava",
|
||||
"channel_other": "kanavat",
|
||||
"collapse": "luhista",
|
||||
"comingSoon": "tulossa pian…",
|
||||
"configure": "konfiguroi",
|
||||
"confirm": "hyväksy",
|
||||
"disable": "poista käytöstä",
|
||||
"disc": "levy",
|
||||
"dismiss": "hylkää",
|
||||
"favorite": "suosikki",
|
||||
"filter_one": "suodatin",
|
||||
"filter_other": "suodattimet",
|
||||
"filters": "suodattimet",
|
||||
"forceRestartRequired": "käynnistä uudelleen ottaaksesi muutokset käyttöön… sulje ilmoitus käynnistääksesi uudelleen",
|
||||
"gap": "väli",
|
||||
"home": "koti",
|
||||
"left": "vasen",
|
||||
"limit": "raja",
|
||||
"manage": "hallitse",
|
||||
"menu": "valikko",
|
||||
"minimize": "minimoi",
|
||||
"modified": "muokattu",
|
||||
"name": "nimi",
|
||||
"no": "ei",
|
||||
"none": "ei mitään",
|
||||
"noResultsFromQuery": "kysely ei tuottanut tuloksia",
|
||||
"note": "huomautus",
|
||||
"ok": "ok",
|
||||
"owner": "omistaja",
|
||||
"path": "polku",
|
||||
"preview": "esikatsele",
|
||||
"previousSong": "edellinen $t(entity.track_one)",
|
||||
"resetToDefault": "palauta oletusarvoihin",
|
||||
"restartRequired": "vaatii uudelleenkäynnistyksen",
|
||||
"right": "oikea",
|
||||
"save": "tallenna",
|
||||
"saveAndReplace": "tallenna ja korvaa",
|
||||
"saveAs": "tallenna nimellä",
|
||||
"unknown": "tuntematon",
|
||||
"version": "versio",
|
||||
"year": "vuosi",
|
||||
"yes": "kyllä",
|
||||
"close": "sulje",
|
||||
"descending": "laskeva",
|
||||
"biography": "biografia",
|
||||
"cancel": "peruuta",
|
||||
"bpm": "bpm",
|
||||
"decrease": "pienennä",
|
||||
"center": "keskitä",
|
||||
"clear": "tyhjennä",
|
||||
"codec": "koodekki",
|
||||
"create": "luo",
|
||||
"description": "kuvaus",
|
||||
"currentSong": "nykyinen $t(entity.track_one)",
|
||||
"delete": "poista",
|
||||
"duration": "kesto",
|
||||
"edit": "muokkaa",
|
||||
"enable": "ota käyttöön",
|
||||
"expand": "laajenna",
|
||||
"increase": "lisää",
|
||||
"forward": "eteenpäin",
|
||||
"maximize": "maksimoi",
|
||||
"mbid": "MusicBrainz ID",
|
||||
"share": "jaa",
|
||||
"random": "satunnainen",
|
||||
"reload": "lataa uudelleen",
|
||||
"quit": "poistu",
|
||||
"rating": "arvostelu",
|
||||
"refresh": "virkistä",
|
||||
"reset": "nollaa",
|
||||
"playerMustBePaused": "soittimen täytyy olla pysäytetty",
|
||||
"translation": "käännös",
|
||||
"albumGain": "albumin vahvistus (gain)",
|
||||
"albumPeak": "albumin huippu (peak)",
|
||||
"trackGain": "raidan vahvistus (gain)",
|
||||
"trackPeak": "kappaleen huippu (peak)",
|
||||
"additionalParticipants": "muut osallistujat",
|
||||
"tags": "tägit",
|
||||
"newVersion": "uusi versio on asennettu ({{version}})",
|
||||
"viewReleaseNotes": "katsele julkaisutietoja",
|
||||
"bitDepth": "bittisyvyys",
|
||||
"sampleRate": "näytteenottotaajuus"
|
||||
},
|
||||
"entity": {
|
||||
"album_one": "albumi",
|
||||
"album_other": "albumit",
|
||||
"albumArtist_one": "albumin artisti",
|
||||
"albumArtist_other": "albumin artistit",
|
||||
"artistWithCount_one": "{{count}} artisti",
|
||||
"artistWithCount_other": "{{count}} artistia",
|
||||
"playlist_one": "soittolista",
|
||||
"playlist_other": "soittolistat",
|
||||
"playlistWithCount_one": "{{count}} soittolista",
|
||||
"playlistWithCount_other": "{{count}} soittolistaa",
|
||||
"albumArtistCount_one": "{{count}} albumin artisti",
|
||||
"albumArtistCount_other": "{{count}} albumin artistia",
|
||||
"albumWithCount_one": "{{count}} albumi",
|
||||
"albumWithCount_other": "{{count}} albumia",
|
||||
"artist_one": "artisti",
|
||||
"artist_other": "artistit",
|
||||
"favorite_one": "suosikki",
|
||||
"favorite_other": "suosikit",
|
||||
"folder_one": "kansio",
|
||||
"folder_other": "kansiot",
|
||||
"folderWithCount_one": "{{count}} kansio",
|
||||
"folderWithCount_other": "{{count}} kansiota",
|
||||
"genre_one": "genre",
|
||||
"genre_other": "genret",
|
||||
"genreWithCount_one": "{{count}} genre",
|
||||
"genreWithCount_other": "{{count}} genreä",
|
||||
"smartPlaylist": "älykäs $t(entity.playlist_one)",
|
||||
"track_one": "raita",
|
||||
"track_other": "raidat",
|
||||
"trackWithCount_one": "{{count}} raita",
|
||||
"trackWithCount_other": "{{count}} raitaa",
|
||||
"play_one": "{{count}} toisto",
|
||||
"play_other": "{{count}} toistoa",
|
||||
"song_one": "kappale",
|
||||
"song_other": "kappaleet"
|
||||
},
|
||||
"action": {
|
||||
"clearQueue": "tyhjennä jono",
|
||||
"createPlaylist": "luo $t(entity.playlist_one)",
|
||||
"deselectAll": "poista kaikkien valinta",
|
||||
"editPlaylist": "muokkaa $t(entity.playlist_one)",
|
||||
"removeFromQueue": "poista jonosta",
|
||||
"viewPlaylists": "katsele $t(entity.playlist_other)",
|
||||
"openIn": {
|
||||
"lastfm": "Avaa Last.fm:ssä",
|
||||
"musicbrainz": "Avaa MusicBrainz:ssä"
|
||||
},
|
||||
"goToPage": "mene sivulle",
|
||||
"moveToBottom": "siirry pohjalle",
|
||||
"moveToTop": "siirry ylös",
|
||||
"addToFavorites": "lisää kohteeseen $t(entity.favorite_other)",
|
||||
"addToPlaylist": "lisää kohteeseen $t(entity.playlist_one)",
|
||||
"refresh": "$t(common.refresh)",
|
||||
"removeFromFavorites": "poista kohteesta $t(entity.favorite_other)",
|
||||
"toggleSmartPlaylistEditor": "kytke $t(entity.smartPlaylist) editori",
|
||||
"deletePlaylist": "poista $t(entity.playlist_one)",
|
||||
"removeFromPlaylist": "poista kohteesta $t(entity.playlist_one)",
|
||||
"setRating": "aseta arvostelu",
|
||||
"moveToNext": "siirry seuraavaan"
|
||||
},
|
||||
"error": {
|
||||
"remoteEnableError": "virhe tapahtui yrittäessä $t(common.enable) etäpalvelinta",
|
||||
"remotePortError": "virhe tapahtui etäpalvelimen porttia määrittäessä",
|
||||
"serverNotSelectedError": "palvelinta ei ole valittu",
|
||||
"remoteDisableError": "virhe tapahtui yrittäessä $t(common.disable) etäpalvelinta",
|
||||
"serverRequired": "palvelin vaadittu",
|
||||
"systemFontError": "virhe tapahtui yrittäessä hakea järjestelmän fontteja",
|
||||
"sessionExpiredError": "istuntosi on vanhentunut",
|
||||
"genericError": "tapahtui virhe",
|
||||
"invalidServer": "virheellinen palvelin",
|
||||
"audioDeviceFetchError": "äänentoistolaitteita haettaessa tapahtui virhe",
|
||||
"authenticationFailed": "tunnistautuminen epäonnistui",
|
||||
"badAlbum": "näet tämän sivun koska tämä kappale ei ole osa albumia. Näet tämän todennäköisesti jos kappaleesi on päämusiikkikansiosi juuressa. jellyfin ryhmittää kappaleet vain jos ne ovat kansiossa.",
|
||||
"apiRouteError": "pyynnön reititys epäonnistui",
|
||||
"credentialsRequired": "käyttäjätunnuksia vaaditaan",
|
||||
"loginRateError": "liian monta kirjautumisyritystä, kokeile muutaman sekuntin päästä uudestaan",
|
||||
"mpvRequired": "MPV vaadittu",
|
||||
"networkError": "verkkoyhteysvirhe",
|
||||
"openError": "tiedostoa ei voitu avata",
|
||||
"localFontAccessDenied": "paikallisiin fontteihin pääsy on kielletty",
|
||||
"playbackError": "mediaa toistaessa tapahtui virhe",
|
||||
"remotePortWarning": "käynnistä palvelin uudestaan ottaaksesi uuden portin käyttöön",
|
||||
"endpointNotImplementedError": "päätepiste {{endpoint}} ei ole toteutettu {{serverType}} varten",
|
||||
"badValue": "kelpaamaton optio \"{{value}}\". tätä arvoa ei ole enää olemassa",
|
||||
"notificationDenied": "luvat ilmouilmoituksia varten evättiin. tällä asetuksella ei ole vaikutusta"
|
||||
},
|
||||
"filter": {
|
||||
"album": "$t(entity.album_one)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"biography": "biografia",
|
||||
"bitrate": "bittinopeus",
|
||||
"bpm": "lyöntiä minuutissa (bpm)",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"title": "otsikko",
|
||||
"playCount": "toistomäärä",
|
||||
"dateAdded": "lisätty päivänä",
|
||||
"lastPlayed": "viimeksi toistettu",
|
||||
"mostPlayed": "eniten toistettu",
|
||||
"isRecentlyPlayed": "on äskettäin toistettu",
|
||||
"rating": "arvostelu",
|
||||
"recentlyAdded": "äskettäin lisätty",
|
||||
"recentlyUpdated": "äskettäin päivitetty",
|
||||
"releaseDate": "julkaisupäivä",
|
||||
"toYear": "vuoteen",
|
||||
"releaseYear": "julkaisuvuosi",
|
||||
"search": "haku",
|
||||
"trackNumber": "raita",
|
||||
"isPublic": "on julkinen",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"favorited": "suosikeissa",
|
||||
"fromYear": "vuodelta",
|
||||
"isRated": "on arvosteltu",
|
||||
"recentlyPlayed": "äskettäin toistetut",
|
||||
"albumCount": "$t(entity.album_other) määrä",
|
||||
"disc": "levy",
|
||||
"duration": "kesto",
|
||||
"id": "tunnus",
|
||||
"random": "satunnainen",
|
||||
"isFavorited": "on suosikeissa",
|
||||
"isCompilation": "on osa kokoelmaa",
|
||||
"comment": "kommentti",
|
||||
"communityRating": "yhteisön arvostelu",
|
||||
"criticRating": "kriitikon arvostelu",
|
||||
"name": "nimi",
|
||||
"note": "muistiinpano",
|
||||
"owner": "$t(common.owner)",
|
||||
"path": "polku",
|
||||
"songCount": "kappalemäärä"
|
||||
},
|
||||
"form": {
|
||||
"addServer": {
|
||||
"input_legacyAuthentication": "käytä vanhaa kirjautumistapaa",
|
||||
"ignoreCors": "ohita CORS ($t(common.restartRequired))",
|
||||
"input_name": "palvelimen nimi",
|
||||
"ignoreSsl": "ohita SSL ($t(common.restartRequired))",
|
||||
"input_savePassword": "tallenna salasana",
|
||||
"input_url": "url-osoite",
|
||||
"title": "lisää palvelin",
|
||||
"error_savePassword": "salasanaa tallentaessa tapahtui virhe",
|
||||
"input_password": "salasana",
|
||||
"input_username": "käyttäjänimi",
|
||||
"success": "palvelin lisätty onnistuneesti"
|
||||
},
|
||||
"createPlaylist": {
|
||||
"input_public": "julkinen",
|
||||
"input_name": "$t(common.name)",
|
||||
"input_owner": "$t(common.owner)",
|
||||
"success": "$t(entity.playlist_one) luotu onnistuneesti",
|
||||
"title": "luo $t(entity.playlist_one)",
|
||||
"input_description": "$t(common.description)"
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"input_skipDuplicates": "ohita kaksoiskappaleet",
|
||||
"success": "$t(entity.trackWithCount, {\"count\": {{message}} }) lisätty $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })",
|
||||
"title": "lisää soittolistalle $t(entity.playlist_one)",
|
||||
"input_playlists": "$t(entity.playlist_other)"
|
||||
},
|
||||
"updateServer": {
|
||||
"success": "palvelin on päivitetty onnistuneesti",
|
||||
"title": "päivitä palvelin"
|
||||
},
|
||||
"deletePlaylist": {
|
||||
"success": "$t(entity.playlist_one) poistettu onnistuneesti",
|
||||
"title": "poista $t(entity.playlist_one)",
|
||||
"input_confirm": "kirjoita soittolistan $t(entity.playlist_one) nimi vahvistaaksesi"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"success": "$t(entity.playlist_one) päivitetty onnistuneesti",
|
||||
"title": "muokkaa $t(entity.playlist_one)",
|
||||
"publicJellyfinNote": "Jellyfin ei jostain syystä kerro onko soittolista julkinen vai ei. Jos haluat sen pysyvän julkisena, pidä seuraava valinta valittuna"
|
||||
},
|
||||
"lyricSearch": {
|
||||
"input_artist": "$t(entity.artist_one)",
|
||||
"input_name": "$t(common.name)",
|
||||
"title": "sanojen haku"
|
||||
},
|
||||
"shareItem": {
|
||||
"createFailed": "jaon luonti epäonnistui (onko jako päällä?)",
|
||||
"allowDownloading": "salli lataus",
|
||||
"description": "kuvaus",
|
||||
"setExpiration": "aseta vanheneminen",
|
||||
"success": "jakolinkki kopioitu leikepöydälle (tai klikkaa tästä avataksesi)",
|
||||
"expireInvalid": "vanhetumisen pitää olla tulevaisuudessa"
|
||||
},
|
||||
"queryEditor": {
|
||||
"input_optionMatchAny": "sovita joku",
|
||||
"input_optionMatchAll": "sovita kaikki",
|
||||
"title": "kyselyeditori"
|
||||
}
|
||||
},
|
||||
"setting": {
|
||||
"clearCacheSuccess": "välimuisti on tyhjennetty onnistuneesti",
|
||||
"artistConfiguration_description": "valise näytettävät asiat ja niiden järjestys albumin artistin sivulla",
|
||||
"audioDevice": "äänilaite",
|
||||
"clearQueryCache_description": "feishinin 'pehmeä tyhjennys'. tämä tyhjentää soittolistat, raitojen metadatat ja tallennetut sanoitukset. asetukset, palvelimien käyttäjätunnukset ja välimuistissa olevat kuvat säilyvät",
|
||||
"crossfadeDuration": "ristihäivytyksen kesto",
|
||||
"audioPlayer_description": "valitse toistossa käytettävä soitin",
|
||||
"buttonSize": "soittimen palkin nappien koko",
|
||||
"buttonSize_description": "soittimen palkin nappien koko",
|
||||
"clearCache": "tyhjennä selaimen välimuisti",
|
||||
"clearQueryCache": "tyhjennä feishinin välimuisti",
|
||||
"crossfadeDuration_description": "aseta ristihäivytystehosteen kesto",
|
||||
"applicationHotkeys_description": "aseta sovelluksen pikanäppäimet. vaihda valintaruutua asettaaksesi valinta globaaliksi pikanäppäimeksi (vain työpöydällä)",
|
||||
"crossfadeStyle": "ristihäivytyksen tyyli",
|
||||
"crossfadeStyle_description": "valitse soittimessa käytettävän ristihäivytyksen tyyli",
|
||||
"contextMenu_description": "mahdollistaa sinun piilottaa asiat, jotka näytetään valikossa klikatessasi objektia hiiren väärällä painikkella. poistetut valinnat piilotetaan",
|
||||
"customCssEnable_description": "mahdollista oman css:n kirjoittaminen.",
|
||||
"accentColor": "korostusväri",
|
||||
"customCssEnable": "käytä omaa css:ää",
|
||||
"albumBackgroundBlur_description": "säätää albumin taustakuvan sumennuksen määrää",
|
||||
"audioExclusiveMode_description": "käytä yksinomaista ulostulotilaa. Tässä tilassa järjestelmä on yleensä lukittuna ja vain mpv voi tuottaa ääntä",
|
||||
"albumBackgroundBlur": "albumin taustakuvan sumennuksen koko",
|
||||
"clearCache_description": "feishinin 'kova tyhjennys'. feishinin välimuistin lisäksi tyhjennä selaimen välimuisti (tallennetut kuvat ja muut kohteet). palvelimien käyttäjättunnukset ja asetukset säilyvät",
|
||||
"audioExclusiveMode": "äänen yksinomainen tila",
|
||||
"audioPlayer": "soitin",
|
||||
"contextMenu": "kontekstivalikon (hiiren väärä näppäin) asetukset",
|
||||
"accentColor_description": "aseta sovelluksen korostusväri",
|
||||
"albumBackground_description": "lisää taustakuva albumin sivuille, jotka sisältävät albumin kuvitusta",
|
||||
"artistConfiguration": "albumin artistin sivun hallinta",
|
||||
"audioDevice_description": "valitse toistossa käytettävä äänilaite (vain verkkosoittimessa)",
|
||||
"applicationHotkeys": "sovelluksen pikanäppäimet",
|
||||
"albumBackground": "albumin taustakuva",
|
||||
"customCss": "oma css",
|
||||
"customFontPath_description": "asettaa polun mukautetulle fontille jota sovellus käyttää",
|
||||
"homeConfiguration": "koti sivun muokkaus",
|
||||
"homeConfiguration_description": "määritä mitä osioita näkyy, ja missä järjestyksessä, koti sivulla",
|
||||
"gaplessAudio_optionWeak": "heikko (suositus)",
|
||||
"genreBehavior_description": "määrittää avautuuko generä painettaessa oletuksena ääniraita vaiko albumi listassa",
|
||||
"hotkey_browserBack": "selain takaisin",
|
||||
"hotkey_playbackPlay": "toista",
|
||||
"hotkey_playbackPlayPause": "toista / tauko",
|
||||
"hotkey_playbackPrevious": "edellinen ääniraita",
|
||||
"hotkey_rate3": "arvostelu 3 tähteä",
|
||||
"hotkey_playbackStop": "lopeta",
|
||||
"hotkey_rate4": "arvostelu 4 tähteä",
|
||||
"hotkey_rate1": "arvostelu 1 tähti",
|
||||
"hotkey_rate2": "arvostelu 2 tähteä",
|
||||
"hotkey_unfavoriteCurrentSong": "poista suosikeista $t(common.currentSong)",
|
||||
"fontType_description": "sisäänrakennettu fontti valitsee yhden Feishinin tuomista fonteista. järjestelmän fontti antaa sinun valita minkä tahansa käyttöjärjestelmään asennetun fontin. mukautettu antaa sinun tuoda oman fontin",
|
||||
"fontType_optionBuiltIn": "sisäänrakennettu fontti",
|
||||
"fontType_optionSystem": "järjestelmän fontti",
|
||||
"fontType_optionCustom": "mukautettu fontti",
|
||||
"hotkey_favoriteCurrentSong": "lisää suosikiksi $t(common.currentSong)",
|
||||
"hotkey_favoritePreviousSong": "lisää suosikiksi $t(common.previousSong)",
|
||||
"hotkey_rate5": "arvostelu 5 tähteä",
|
||||
"hotkey_skipBackward": "ohita taaksepäin",
|
||||
"hotkey_skipForward": "ohita eteenpäin",
|
||||
"font": "kirjaisin",
|
||||
"font_description": "asettaa fontin jota sovellus käyttää",
|
||||
"discordApplicationId": "{{discord}} sovelluksen tunnus",
|
||||
"hotkey_globalSearch": "globaali haku",
|
||||
"hotkey_playbackNext": "seuraava ääniraita",
|
||||
"hotkey_browserForward": "selain eteenpäin",
|
||||
"hotkey_playbackPause": "tauko",
|
||||
"hotkey_localSearch": "hae sivulta",
|
||||
"customFontPath": "mukautetun fontin polku",
|
||||
"fontType": "fonttityyppi",
|
||||
"hotkey_unfavoritePreviousSong": "poista suosikeista $t(common.previousSong)",
|
||||
"customCss_description": "mukautettu CSS-sisältö. Huomautus: content- ja etä-URL-osoitteet ovat estettyjä ominaisuuksia. Esikatselu sisällöstäsi on alla. Lisäkenttiä, joita et ole määrittänyt, on näkyvissä puhdistuksen vuoksi.",
|
||||
"customCssNotice": "Varoitus: vaikka jonkinlainen puhdistus onkin tehty (url()- ja content:-komentojen estäminen), mukautetun CSS:n käyttäminen voi silti aiheuttaa riskejä muuttamalla käyttöliittymää.",
|
||||
"disableLibraryUpdateOnStartup": "poista uusimman version tarkistus käynnistyksen yhteydessä käytöstä",
|
||||
"disableAutomaticUpdates": "poista automaattiset päivitykset käytöstä",
|
||||
"discordIdleStatus": "näytä rich presencen käyttämätön tila",
|
||||
"discordIdleStatus_description": "kun käytössä, päivitä tila kun soitin on käyttämättömänä",
|
||||
"doubleClickBehavior": "lisää kaikki haetut kappaleet soittojonoon tuplaklikkauksella",
|
||||
"discordUpdateInterval_description": "päivitysväli sekunnteina (vähintään 15 sekunttia)",
|
||||
"discordRichPresence": "{{discord}} rich presence",
|
||||
"discordRichPresence_description": "ota toiston tila käyttöön {{discord}}n rich presence-toiminnossa. Kuvakkeiden avaimet ovat {{icon}}, {{playing}} ja {{paused}}",
|
||||
"discordUpdateInterval": "{{discord}} rich presencen päivitysväli",
|
||||
"enableRemote": "aktivoi etäohjauspalvelin",
|
||||
"externalLinks_description": "ottaa ulkoiset linkit (Last.fm, MusicBrainz) artistien/albumien sivuilla",
|
||||
"exitToTray": "sulje tehtäväpalkkiin",
|
||||
"doubleClickBehavior_description": "jos päällä, kaikki hakutuloksissa olevat kappaleet lisätään soittojonoon. muuten vain napsautettu kappale lisätään jonoon",
|
||||
"discordApplicationId_description": "{{discord}}n ohjelma-ID rich presenceä varten (oletuksena {{defaultId}})",
|
||||
"enableRemote_description": "aktivoi etäohjauspalvelimen, jolla muut laitteet voivat ohjata sovellusta",
|
||||
"externalLinks": "näytä ulkoiset linkit",
|
||||
"exitToTray_description": "sovellus suljetaan tehtäväpalkkiin",
|
||||
"discordListening_description": "näytä status kuuntelee pelaa sijaan",
|
||||
"discordListening": "näytä status kuuntelee",
|
||||
"playButtonBehavior_optionPlayShuffled": "$t(player.shuffle)",
|
||||
"playButtonBehavior_optionAddNext": "$t(player.addNext)",
|
||||
"lastfmApiKey_description": "API-avain {{lastfm}}:lle. tarvitaan kansikuvia varten",
|
||||
"passwordStore_description": "mitä salasanojen/avaimien tallennusta käytetään. muuta tätä, jos sinulla on ongelmia salasanojen tallennuksessa.",
|
||||
"floatingQueueArea_description": "näyttää ikonin ikkunan oikealla reunalla jonon katselua varten",
|
||||
"homeFeature_description": "ohjaa näytetäänkö suuri esittelykaruselli kotisivulla",
|
||||
"hotkey_rate0": "arvostelun tyhjennys",
|
||||
"hotkey_togglePreviousSongFavorite": "vaihda $t(common.previousSong) suosikkiasetus",
|
||||
"imageAspectRatio_description": "jos käytössä, kansikuvat näytetään niiden alkuperäisellä kuvasuhteella. jos kuvasuhde ei ole 1:1, jäljelle jäävä tila jää tyhjäksi",
|
||||
"language_description": "asettaa sovelluksen kielen $t(common.restartRequired)",
|
||||
"lyricFetch": "hae sanoitukset internetistä",
|
||||
"lyricFetchProvider_description": "valitse lähteet sanoituksien hakua varten. lähteiden järjestys on se järjestys, jossa ne tiedustellaan",
|
||||
"minimumScrobblePercentage": "pienin skrobblauksen kesto (prosenttia)",
|
||||
"mpvExecutablePath": "mpv:n suoritettavan tiedoston polku",
|
||||
"mpvExecutablePath_description": "asettaa mpv:n suoritettavan tiedoston polun. ollessa tyhjä, käytetään oletuspolkua",
|
||||
"mpvExtraParameters_help": "yksi per rivi",
|
||||
"playButtonBehavior_optionPlay": "$t(player.play)",
|
||||
"genreBehavior": "genre-sivun oletustoiminta",
|
||||
"globalMediaHotkeys": "globaalit median pikanäppäimet",
|
||||
"globalMediaHotkeys_description": "ota käyttöön tai poista käytöstä järjestelmän median pikanäppäinten käyttö toiston hallintaa",
|
||||
"hotkey_toggleCurrentSongFavorite": "vaihda $t(common.currentSong) suosikkiasetus",
|
||||
"imageAspectRatio": "käytä alkuperäistä kansikuvan kuvasuhdetta",
|
||||
"language": "kieli",
|
||||
"lyricOffset_description": "siirrä sanoituksia valitun ajan millisekuntteina",
|
||||
"minimizeToTray": "pienennä ilmaisinalueelle",
|
||||
"gaplessAudio_description": "asettaa tauottoman toiston asetukset mpv:hen",
|
||||
"hotkey_volumeDown": "äänenvoimakkuuden vähentäminen",
|
||||
"hotkey_zoomIn": "lähennä",
|
||||
"lyricFetch_description": "hae sanoitukset eri lähteistä internetissä",
|
||||
"lyricFetchProvider": "lähteet sanoituksia varten",
|
||||
"lyricOffset": "sanotuksien siirto (ms)",
|
||||
"mpvExtraParameters": "mpv:n parametrit",
|
||||
"followLyric": "seuraa lyriikoita",
|
||||
"followLyric_description": "vieritä lyriikat tämänhetkiseen paikkaan",
|
||||
"hotkey_toggleQueue": "vaihda jono",
|
||||
"minimumScrobblePercentage_description": "vähimmäisprosentti kappaleesta, joka on soitettava ennen kuin se skrobblataan",
|
||||
"minimumScrobbleSeconds": "pienin skrobblaus (sekunttia)",
|
||||
"minimumScrobbleSeconds_description": "vähimmäisaika kappaleesta, joka on soitettava ennen kuin se skrobblataan",
|
||||
"passwordStore": "salasanojen/avaimien tallennus",
|
||||
"hotkey_volumeUp": "äänenvoimakkuuden lisääminen",
|
||||
"hotkey_toggleShuffle": "vaihda sekoitus",
|
||||
"hotkey_volumeMute": "mykistäminen",
|
||||
"lastfmApiKey": "{{lastfm}} API-avain",
|
||||
"minimizeToTray_description": "pienennä sovellus ilmaisinalueelle",
|
||||
"playButtonBehavior_optionAddLast": "$t(player.addLast)",
|
||||
"hotkey_zoomOut": "loitonna",
|
||||
"floatingQueueArea": "näytä kelluvan jonon avausalue",
|
||||
"homeFeature": "kodin esittelykaruselli",
|
||||
"hotkey_toggleFullScreenPlayer": "vaihda kokonäytön toistin",
|
||||
"hotkey_toggleRepeat": "vaihda kertaus",
|
||||
"gaplessAudio": "tauoton toisto",
|
||||
"transcodeFormat_description": "valitsee transkoodattavan formaatin. jätä tyhjäksi palvelimen valintaa varten",
|
||||
"replayGainMode_optionNone": "$t(common.none)",
|
||||
"replayGainMode_optionTrack": "$t(entity.track_one)",
|
||||
"themeDark": "teema (tumma)",
|
||||
"transcodeNote": "tulee voimaan 1 (web) - 2 (mpv) kappaleen jälkeen",
|
||||
"translationApiKey_description": "API-avain käännöstä varten (tukee vain globaalia palvelun palvelupistettä)",
|
||||
"playbackStyle_description": "valitse toiston tyyli, jota käytetään soittimessa",
|
||||
"transcode_description": "ottaa transkoodaksen käyttöön eri formaateille",
|
||||
"transcodeBitrate": "transkoodattava bittinopeus",
|
||||
"translationApiProvider": "käännös-API:n palveluntarjoaja",
|
||||
"trayEnabled_description": "näytä/piilota järjestelmäpalkin kuvake/valikko. jos poistettu käytöstä, myös pienennä/sulje järjestelmäpalkkiin -toiminto poistetaan käytöstä",
|
||||
"windowBarStyle_description": "valitse ikkunapalkin tyyli",
|
||||
"webAudio": "käytä web-ääntä",
|
||||
"windowBarStyle": "ikkunapalkin tyyli",
|
||||
"zoom": "zoomausprosentti",
|
||||
"playbackStyle": "toiston tyyli",
|
||||
"remotePassword": "kauko-ohjauspalvelimen salasana",
|
||||
"remoteUsername_description": "asettaa käyttäjänimen kauko-ohjauspalvelimelle. jos sekä käyttäjätunnus, että salasana ovat tyhjänä, todennus poistetaan käytöstä",
|
||||
"skipPlaylistPage": "ohita soittolistojen sivu",
|
||||
"themeDark_description": "asettaa tumman teeman käytettäväksi sovelluksessa",
|
||||
"playbackStyle_optionCrossFade": "ristivaihto",
|
||||
"playbackStyle_optionNormal": "normaali",
|
||||
"playButtonBehavior": "toistopainikkeen toiminta",
|
||||
"playButtonBehavior_description": "asettaa toistopainikkeen oletustoiminnan lisättäessä kappaleita jonoon",
|
||||
"remotePort": "kauko-ohjauspalvelimen portti",
|
||||
"replayGainMode": "{{ReplayGain}} tila",
|
||||
"sampleRate_description": "valitse käytettävä näytteenottotaajuus, jos valittu näytetaajuus poikkeaa nykyisen median taajuudesta. arvo, joka on alle 8 000, käyttää oletustaajuutta",
|
||||
"skipDuration": "ohituksen kesto",
|
||||
"sidePlayQueueStyle_description": "asettaa tyylin sivupalkin toistojonolle",
|
||||
"sidePlayQueueStyle_optionAttached": "liitetty",
|
||||
"sidePlayQueueStyle_optionDetached": "irrotettu",
|
||||
"startMinimized_description": "käynnistä sovellus järjestelmäpalkissa",
|
||||
"theme": "teema",
|
||||
"useSystemTheme_description": "seuraa järjestelmän määrittämää asetusta vaalealle tai tummalle asetukselle",
|
||||
"remoteUsername": "kauko-ohjauspalvelimen käyttäjänimi",
|
||||
"remotePort_description": "asettaa kauko-ohjauspalvelimen portin",
|
||||
"remotePassword_description": "asettaa kauko-ohjauspalvelimen salasanan. Nämä tunnukset siirretään oletuksena turvattomasti, joten sinun kuuluisi käyttää uniikkia salasanaa, josta et välitä",
|
||||
"replayGainClipping": "{{ReplayGain}} leikkaus",
|
||||
"replayGainClipping_description": "Estää {{ReplayGain}}n aiheuttaman leikkauksen laskemalla vahvistusta automaatisesti",
|
||||
"replayGainFallback": "{{ReplayGain}} palautus",
|
||||
"playerAlbumArtResolution_description": "suurien kansikuvien resoluutio soittimen esikatselussa. suurempi tekee niistä terävempiä, mutta voi hidastaa latausta. oletuksena on 0, joka tarkoittaa automaattista",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album_one)",
|
||||
"replayGainPreamp": "{{ReplayGain}} esivahvistus (dB)",
|
||||
"scrobble_description": "skrobblaa toistot mediapalvelimellesi",
|
||||
"replayGainPreamp_description": "säätää esivahvistuksen määrää {{ReplayGain}} arvoon",
|
||||
"showSkipButtons": "näytä ohituspainikkeet",
|
||||
"showSkipButtons_description": "näytä tai piilota soitinpalkin ohituspainikkeet",
|
||||
"showSkipButton": "näytä ohituspainikkeet",
|
||||
"showSkipButton_description": "näytä tai piilota soitinpalkin ohituspainikkeet",
|
||||
"sidebarPlaylistList": "sivupakin soittolistojen lista",
|
||||
"skipDuration_description": "asettaa ohitettavan ajan käytettäessä soitinpalkin ohituspainikkeita",
|
||||
"volumeWidth": "äänenvoimakkuuden säätimen leveys",
|
||||
"sidebarCollapsedNavigation_description": "näytä tai piilota navigointi romautetussa sivupalkissa",
|
||||
"sidebarConfiguration": "sivupalkin asetukset",
|
||||
"sidebarConfiguration_description": "valitse kohteet ja niiden järjestys sivupalkissa",
|
||||
"volumeWidth_description": "äänenvoimakkuuden säätimen leveys",
|
||||
"playerAlbumArtResolution": "soittimen kansikuvien resoluutio",
|
||||
"playerbarOpenDrawer": "toistipalkin kokoruudun kytkin",
|
||||
"playerbarOpenDrawer_description": "sallii toistopalkin klikkaamisen avaamaan kokonäytön soittimen",
|
||||
"replayGainFallback_description": "asetettava vahvistus desibelinä (dB), jos tiedostolla ei ole {{ReplayGain}} tageja",
|
||||
"replayGainMode_description": "säätää äänenvoimmakkuutta {{ReplayGain}} arvojen mukaisesti tiedoston metadatasta",
|
||||
"sampleRate": "näytteenottotaajuus",
|
||||
"savePlayQueue": "tallenna toistojono",
|
||||
"savePlayQueue_description": "tallenna toistojono, kun sovellus suljetaan ja avaa se uudestaan, kun sovellus avataan",
|
||||
"scrobble": "skrobblaus",
|
||||
"sidebarCollapsedNavigation": "sivupalkin (romautettu) navigointi",
|
||||
"sidebarPlaylistList_description": "näytä tai piilota soittolistojen lista sivupalkissa",
|
||||
"sidePlayQueueStyle": "sivupalkin jonon tyyli",
|
||||
"skipPlaylistPage_description": "navigoidessa soittolistaan, mene soittolistan kappaleiden listaan oletussivun sijaan",
|
||||
"theme_description": "asettaa ohjelmassa käytettävän teeman",
|
||||
"themeLight": "teema (vaalea)",
|
||||
"themeLight_description": "asettaa vaalean teeman käytettäväksi sovelluksessa",
|
||||
"transcode": "ota transkoodaus käyttöön",
|
||||
"transcodeBitrate_description": "valitsee transkoodattavan bittinopeuden. 0 tarkoittaa palvelimen valintaa",
|
||||
"transcodeFormat": "transkoodattava formaatti",
|
||||
"translationApiProvider_description": "palveluntarjoajan API käännöstä varten",
|
||||
"translationApiKey": "käännöksen API-avain",
|
||||
"translationTargetLanguage": "käännöksen kohdekieli",
|
||||
"translationTargetLanguage_description": "kohdekieli käännöstä varten",
|
||||
"trayEnabled": "näytä järjestelmäpalkki",
|
||||
"volumeWheelStep_description": "äänenvoimakkuuden muutoksen suuruus rullattaessa hiiren rullalla äänenvoimakkuuden säätimen päällä",
|
||||
"zoom_description": "asettaa sovelluksen zoomausprosentin",
|
||||
"webAudio_description": "käytä web-ääntä. tämä mahdollistaa edistyneet ominaisuudet, kuten replaygainin. poista käytöstä, jos koet ongelmia",
|
||||
"startMinimized": "käynnistä pienennettynä",
|
||||
"useSystemTheme": "käytä järjestelmän teemaa",
|
||||
"volumeWheelStep": "äänenvoimakkuusrullan askel",
|
||||
"discordServeImage": "jaa {{discord}} kuvat palvelimelta",
|
||||
"discordServeImage_description": "jaa kansikuvat {{discord}}n rich presenceä varten suoraan palvelimelta. saatavilla vain jellyfinille ja navidromelle",
|
||||
"musicbrainz_description": "näytä linkit musicbrainz sivulle artistin/albumin sivuilla, jos musicbrainz-id löytyy",
|
||||
"lastfm": "näytä last.fm linkit",
|
||||
"lastfm_description": "näytä linkit last.fm sivulle artistin/albumin sivuilla",
|
||||
"musicbrainz": "näytä musicbrainz linkit",
|
||||
"neteaseTranslation": "Ota NetEasen käännökset käyttöön",
|
||||
"neteaseTranslation_description": "Käytöss ollessa noutaa ja näyttää käännetyt sanat NetEasesta, jos ne ovat saatavilla.",
|
||||
"preferLocalLyrics_description": "suosi paikallisia sanoituksia ulkoisten sijasta, kun saatavilla",
|
||||
"preferLocalLyrics": "suosi paikallisia sanoituksia",
|
||||
"discordPausedStatus": "näytä rich presence tauotettuna",
|
||||
"discordPausedStatus_description": "ollessak käytössä, status näyttää milloin soitin on tautotettuna",
|
||||
"preservePitch": "säilytä sävelkorkeus",
|
||||
"preservePitch_description": "säilytä sävelkorkeus toistonopeutta muokatessa",
|
||||
"notify": "käytä kappaleen ilmoituksia",
|
||||
"notify_description": "näytä limoituksia, kun vaihdetaan nykyistä kappaletta"
|
||||
},
|
||||
"page": {
|
||||
"itemDetail": {
|
||||
"copiedPath": "polku on kopioitu onnistuneesti",
|
||||
"copyPath": "kopioi reitti leikepöytälle",
|
||||
"openFile": "näytä kappale tiedostonhallinnassa"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "siirrä kohteesta $t(entity.artist_one)",
|
||||
"moreFromGeneric": "listää kohteesta {{item}}",
|
||||
"released": "julkaistu"
|
||||
},
|
||||
"albumList": {
|
||||
"artistAlbums": "artistin {{artist}} albumit",
|
||||
"genreAlbums": "\"{{genre}}\"$t(entity.album_other)",
|
||||
"title": "$t(entity.album_other)"
|
||||
},
|
||||
"appMenu": {
|
||||
"goBack": "mene takaisin",
|
||||
"openBrowserDevtools": "avaa selaimen kehitystyökalut",
|
||||
"quit": "$t(common.quit)",
|
||||
"selectServer": "valitse palvelin",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"expandSidebar": "laajenna sivupalkki",
|
||||
"goForward": "mene eteenpäin",
|
||||
"manageServers": "hallitse palvelimia",
|
||||
"collapseSidebar": "kutista sivupalkki",
|
||||
"version": "versio {{version}}"
|
||||
},
|
||||
"contextMenu": {
|
||||
"playSimilarSongs": "$t(player.playSimilarSongs)",
|
||||
"addNext": "$t(player.addNext)",
|
||||
"addToFavorites": "$t(action.addToFavorites)",
|
||||
"addToPlaylist": "$t(action.addToPlaylist)",
|
||||
"createPlaylist": "$t(action.createPlaylist)",
|
||||
"deletePlaylist": "$t(action.deletePlaylist)",
|
||||
"deselectAll": "$t(action.deselectAll)",
|
||||
"removeFromPlaylist": "$t(action.removeFromPlaylist)",
|
||||
"setRating": "$t(action.setRating)",
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"numberSelected": "{{count}} valittuna",
|
||||
"play": "$t(player.play)",
|
||||
"download": "lataa",
|
||||
"moveToBottom": "$t(action.moveToBottom)",
|
||||
"moveToTop": "$t(action.moveToTop)",
|
||||
"removeFromFavorites": "$t(action.removeFromFavorites)",
|
||||
"shareItem": "jaa kohde",
|
||||
"showDetails": "lisätietoa",
|
||||
"addFavorite": "$t(action.addToFavorites)",
|
||||
"addLast": "$t(player.addLast)",
|
||||
"moveToNext": "$t(action.moveToNext)",
|
||||
"removeFromQueue": "$t(action.removeFromQueue)"
|
||||
},
|
||||
"sidebar": {
|
||||
"albumArtists": "$t(entity.albumArtist_other)",
|
||||
"albums": "$t(entity.album_other)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"shared": "$t(entity.playlist_other) jaettu",
|
||||
"tracks": "$t(entity.track_other)",
|
||||
"artists": "$t(entity.artist_other)",
|
||||
"folders": "$t(entity.folder_other)",
|
||||
"genres": "$t(entity.genre_other)",
|
||||
"home": "$t(common.home)",
|
||||
"nowPlaying": "nyt soi",
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"search": "$t(common.search)",
|
||||
"myLibrary": "oma kirjasto"
|
||||
},
|
||||
"setting": {
|
||||
"generalTab": "yleinen",
|
||||
"windowTab": "ikkuna",
|
||||
"hotkeysTab": "pikanäppäimet",
|
||||
"playbackTab": "toisto",
|
||||
"advanced": "edistyneet"
|
||||
},
|
||||
"fullscreenPlayer": {
|
||||
"upNext": "seuraavaksi",
|
||||
"visualizer": "visualisaattori",
|
||||
"noLyrics": "sanoja ei löytynyt",
|
||||
"config": {
|
||||
"showLyricMatch": "näytä sanojen yhteneväisyys",
|
||||
"showLyricProvider": "näytä sanojen tarjoaja",
|
||||
"lyricGap": "sanojen rako",
|
||||
"synchronized": "synkronoitu",
|
||||
"lyricSize": "sanojen koko",
|
||||
"opacity": "läpinäkyvyys",
|
||||
"unsynchronized": "synkronoimaton",
|
||||
"useImageAspectRatio": "käytä kuvan kuvasuhdetta",
|
||||
"dynamicBackground": "liikkuva tausta",
|
||||
"dynamicImageBlur": "kuvan sumennuksen koko",
|
||||
"dynamicIsImage": "käytä taustakuvaa",
|
||||
"lyricOffset": "sanojen kompensointi (ms)",
|
||||
"followCurrentLyric": "seuraa nykyisiä sanoja",
|
||||
"lyricAlignment": "sanojen kohdistus"
|
||||
},
|
||||
"lyrics": "sanat",
|
||||
"related": "liittyvät"
|
||||
},
|
||||
"genreList": {
|
||||
"showAlbums": "näytä $t(entity.genre_one) $t(entity.album_other)",
|
||||
"showTracks": "näytä $t(entity.genre_one) $t(entity.track_other)",
|
||||
"title": "$t(entity.genre_other)"
|
||||
},
|
||||
"globalSearch": {
|
||||
"commands": {
|
||||
"searchFor": "hae {{query}}",
|
||||
"serverCommands": "palvelimen komennot",
|
||||
"goToPage": "mene sivulle"
|
||||
},
|
||||
"title": "komennot"
|
||||
},
|
||||
"home": {
|
||||
"explore": "tutki kirjastotasi",
|
||||
"recentlyPlayed": "hiljattain soitetut",
|
||||
"title": "$t(common.home)",
|
||||
"mostPlayed": "eniten soitetut",
|
||||
"newlyAdded": "hiljattain lisätyt julkaisut"
|
||||
},
|
||||
"albumArtistDetail": {
|
||||
"about": "{{artist}}{sta/stä",
|
||||
"viewDiscography": "katsele diskografiaa",
|
||||
"relatedArtists": "liittyvät $t(entity.artist_other)",
|
||||
"appearsOn": "esiintyy",
|
||||
"topSongs": "parhaat kappaleet",
|
||||
"topSongsFrom": "parhaat kappaleet albumilta {{title}}",
|
||||
"recentReleases": "hiljattaiset julkaisut",
|
||||
"viewAll": "katsele kaikkia",
|
||||
"viewAllTracks": "katsele kaikkia $t(entity.track_other)"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist_other)"
|
||||
},
|
||||
"manageServers": {
|
||||
"title": "hallitse palvelimia",
|
||||
"serverDetails": "palvelimen lisätiedot",
|
||||
"url": "URL",
|
||||
"username": "käyttäjänimi",
|
||||
"editServerDetailsTooltip": "muokkaa palvelimen lisätietoja",
|
||||
"removeServer": "etäpalvelin"
|
||||
},
|
||||
"playlist": {
|
||||
"reorder": "uudelleenjärjestely mahdollista vain, kun järjestellään id:n mukaan"
|
||||
},
|
||||
"trackList": {
|
||||
"artistTracks": "artistin {{artist}} kappaleet",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track_other)",
|
||||
"title": "$t(entity.track_other)"
|
||||
}
|
||||
},
|
||||
"player": {
|
||||
"addLast": "lisää viimeinen",
|
||||
"addNext": "lisää seuraava",
|
||||
"favorite": "suosikki",
|
||||
"queue_moveToTop": "siirrä valittu alas",
|
||||
"queue_remove": "poista valittu",
|
||||
"repeat": "kertaus",
|
||||
"previous": "edellinen",
|
||||
"queue_clear": "tyhjennä jono",
|
||||
"skip": "ohita",
|
||||
"skip_forward": "ohita eteenpäin",
|
||||
"stop": "pysäytä",
|
||||
"skip_back": "ohita taaksepäin",
|
||||
"unfavorite": "poista suosikeista",
|
||||
"playbackFetchNoResults": "kappaleita ei löytynyt",
|
||||
"queue_moveToBottom": "siittä valittu ylös",
|
||||
"pause": "tauota",
|
||||
"playbackSpeed": "toistonopeus",
|
||||
"repeat_all": "kertaa kaikki",
|
||||
"playbackFetchCancel": "tämä vie aikaa... sulje ilmoitus peruaksesi",
|
||||
"mute": "mykistä",
|
||||
"shuffle": "soita sekoitettuna",
|
||||
"next": "seuraava",
|
||||
"play": "toista",
|
||||
"playbackFetchInProgress": "ladataan kappaleita…",
|
||||
"viewQueue": "katsele jonoa",
|
||||
"muted": "mykistetty",
|
||||
"playRandom": "toista satunnainen",
|
||||
"playSimilarSongs": "toista samanlaisia kappaleita",
|
||||
"repeat_off": "kertaus pois päältä",
|
||||
"shuffle_off": "sekoitus pois päältä",
|
||||
"toggleFullscreenPlayer": "vaihda kokoruudun soittimeen"
|
||||
},
|
||||
"table": {
|
||||
"config": {
|
||||
"general": {
|
||||
"gap": "$t(common.gap)",
|
||||
"size": "$t(common.size)",
|
||||
"autoFitColumns": "sovita sarakkeet",
|
||||
"followCurrentSong": "seuraa nykyistä kappaletta",
|
||||
"displayType": "näytön tyyppi",
|
||||
"itemGap": "kohteiden väli (px)",
|
||||
"itemSize": "kohteiden koko (px)",
|
||||
"tableColumns": "taulukon sarakkeet"
|
||||
},
|
||||
"label": {
|
||||
"channels": "$t(common.channel_other)",
|
||||
"trackNumber": "raidan numero",
|
||||
"album": "$t(entity.album_one)",
|
||||
"actions": "$t(common.action_other)",
|
||||
"codec": "$t(common.codec)",
|
||||
"dateAdded": "lisäyspäivämäärä",
|
||||
"owner": "$t(common.owner)",
|
||||
"path": "$t(common.path)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"discNumber": "levyn numero",
|
||||
"duration": "$t(common.duration)",
|
||||
"favorite": "$t(common.favorite)",
|
||||
"lastPlayed": "viimeksi soitettu",
|
||||
"note": "$t(common.note)",
|
||||
"titleCombined": "$t(common.title) (yhdistetty)",
|
||||
"rowIndex": "rivin indeksi",
|
||||
"biography": "$t(common.biography)",
|
||||
"bitrate": "$t(common.bitrate)",
|
||||
"bpm": "$t(common.bpm)",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"playCount": "toistojen lukumäärä",
|
||||
"rating": "$t(common.rating)",
|
||||
"releaseDate": "julkaisupäivämäärä",
|
||||
"size": "$t(common.size)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"title": "$t(common.title)",
|
||||
"year": "$t(common.year)"
|
||||
},
|
||||
"view": {
|
||||
"table": "taulukko",
|
||||
"card": "kortti",
|
||||
"poster": "juliste",
|
||||
"grid": "ruudukko",
|
||||
"list": "lista"
|
||||
}
|
||||
},
|
||||
"column": {
|
||||
"releaseYear": "vuosi",
|
||||
"bpm": "bpm",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"biography": "biografia",
|
||||
"dateAdded": "lisäyspäivämäärä",
|
||||
"album": "albumi",
|
||||
"albumArtist": "albumin artisti",
|
||||
"lastPlayed": "viimeksi toistettu",
|
||||
"path": "polku",
|
||||
"size": "$t(common.size)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"title": "nimi",
|
||||
"trackNumber": "raita",
|
||||
"codec": "$t(common.codec)",
|
||||
"comment": "kommentti",
|
||||
"albumCount": "$t(entity.album_other)",
|
||||
"bitrate": "bittinopeus",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"discNumber": "levy",
|
||||
"favorite": "suosikki",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"playCount": "toistoja",
|
||||
"rating": "arvostelu",
|
||||
"releaseDate": "julkaisupäivämäärä"
|
||||
}
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user