Compare commits

...

353 Commits

Author SHA1 Message Date
jeffvli 4134af0340 update to v0.20.1 2025-09-10 21:28:13 -07:00
Hosted Weblate 29a43ca185 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (699 of 699 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/zh_Hans/
Translation: feishin/Translation
2025-09-11 05:49:32 +02:00
Hosted Weblate e452f86170 Translated using Weblate (Slovak)
Currently translated at 100.0% (699 of 699 strings)

Translated using Weblate (Slovak)

Currently translated at 81.2% (568 of 699 strings)

Translated using Weblate (Slovak)

Currently translated at 78.3% (548 of 699 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: peter cerny <posli.to.semka@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/sk/
Translation: feishin/Translation
2025-09-11 05:49:32 +02:00
Hosted Weblate ec765dca6a Translated using Weblate (French)
Currently translated at 100.0% (699 of 699 strings)

Translated using Weblate (French)

Currently translated at 100.0% (699 of 699 strings)

Co-authored-by: Dylan MONTIGAUD <dylanmontigaud17@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fr/
Translation: feishin/Translation
2025-09-11 05:49:31 +02:00
Hosted Weblate 64a3752b54 Translated using Weblate (Italian)
Currently translated at 100.0% (699 of 699 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Marco Ciotola <github@ciotola.dev>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/it/
Translation: feishin/Translation
2025-09-11 05:49:30 +02:00
Hosted Weblate 24069d285f Translated using Weblate (Czech)
Currently translated at 100.0% (699 of 699 strings)

Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/cs/
Translation: feishin/Translation
2025-09-11 05:49:30 +02:00
Hosted Weblate 77fe886da4 Translated using Weblate (Catalan)
Currently translated at 100.0% (699 of 699 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Ondo <SparkyOndo@proton.me>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/ca/
Translation: feishin/Translation
2025-09-11 05:49:29 +02:00
Hosted Weblate ef16e1403d Translated using Weblate (Turkish)
Currently translated at 100.0% (699 of 699 strings)

Co-authored-by: Mücahit Kaya <kaya-mucahit@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/tr/
Translation: feishin/Translation
2025-09-11 05:49:28 +02:00
jeffvli ff6dda7b06 prevent width overflow on lyrics container (#1106) 2025-09-10 20:49:15 -07:00
Jeff 479aa2e22d Merge pull request #1122 from jeffvli/properly-handle-context-menu-close
fix(context menu): Properly handle click outside, and show initial rating
2025-09-10 20:39:31 -07:00
jeffvli ab8c3ad0ec handle initial rating for multiple items in context menu 2025-09-10 20:32:34 -07:00
Kendall Garner dc03a432fe add initial rating when a single item is provided in context menu 2025-09-10 20:20:56 -07:00
Kendall Garner 751ad55d02 remove all node selectors in useClickOutside 2025-09-10 17:49:13 -07:00
Kendall Garner 78dc89303d show right control rating for subsonic servers 2025-09-10 17:27:07 -07:00
Jeff 4328d8860e Merge pull request #1113 from maximelafarie/fix/darwin-top-bar
fix: electron menu bar for darwin devices
2025-09-10 00:43:59 -07:00
Maxime LAFARIE 58a36b3bba fix: electron menu bar for darwin 2025-09-10 09:36:19 +02:00
Jeff 618e5d8da8 Merge pull request #1114 from maximelafarie/feature/one-click-context-menu
feat: add context menu on left controls and sidebar image
2025-09-09 19:19:09 -07:00
Jeff be6ec49cfa Merge pull request #1107 from mihawk90/now-playing-reformat
cleanup notification text
2025-09-09 19:00:19 -07:00
Maxime LAFARIE 65ecdc7666 feat: add context menu on left controls and sidebar image 2025-09-09 23:38:39 +02:00
Tarulia da42fd78d2 cleanup notification text 2025-09-08 17:20:03 +02:00
Kendall Garner c36735575f actually allow url('data:) in custom css 2025-09-06 19:28:15 -07:00
jeffvli 854222d2fa use consistent height calculation for sidebar scrollarea 2025-09-06 18:34:13 -07:00
jeffvli cd0a8d0fec revert min-height of library header
- causes issues with the positioning of the image at minimum size
2025-09-06 18:25:34 -07:00
jeffvli ed6376d99b update to 0.20.0 2025-09-06 17:24:12 -07:00
Hosted Weblate a6a51946f1 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (699 of 699 strings)

Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/zh_Hans/
Translation: feishin/Translation
2025-09-07 02:14:39 +02:00
Hosted Weblate 6e5acfa9da Translated using Weblate (Slovak)
Currently translated at 58.9% (412 of 699 strings)

Translated using Weblate (Slovak)

Currently translated at 57.0% (396 of 694 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: peter cerny <posli.to.semka@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/sk/
Translation: feishin/Translation
2025-09-07 02:14:39 +02:00
Hosted Weblate 2c7fda63d3 Translated using Weblate (French)
Currently translated at 100.0% (694 of 694 strings)

Co-authored-by: Dylan MONTIGAUD <dylanmontigaud17@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fr/
Translation: feishin/Translation
2025-09-07 02:14:39 +02:00
Hosted Weblate cf72016575 Translated using Weblate (Spanish)
Currently translated at 100.0% (699 of 699 strings)

Co-authored-by: Fordas <fordas15@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/es/
Translation: feishin/Translation
2025-09-07 02:14:39 +02:00
jeffvli 6368137815 move inView ref to ImageContainer component
- the separate outer component is unneeded and affects the positioning of some components which rely on the ImageContainer's styling
2025-09-06 17:14:30 -07:00
jeffvli ea122f5a4f add theme stylesheet loader 2025-09-06 03:02:58 -07:00
jeffvli bb7d561d0f adjust min-height on library header to better match minimum size 2025-09-06 01:21:06 -07:00
jeffvli 6dea9196a4 fix various light theme issues 2025-09-06 01:19:16 -07:00
jeffvli 4a28e7230a add hotkey to navigate to home route (#1074) 2025-09-06 01:01:48 -07:00
jeffvli b00305cc86 add setting to prevent sleep on playback (#1072) 2025-09-06 00:56:06 -07:00
jeffvli 40fb5ba916 add show album / album artist context menu items (#1105) 2025-09-06 00:45:59 -07:00
Kendall Garner 2cf0027419 only show translation when api key and provider are picked, and fix eslint vscode 2025-09-05 19:55:58 -07:00
Kendall Garner c81bd93d04 remove unnecessary console log 2025-09-05 05:51:28 -07:00
jeffvli 229f9e984e fix position of sidebar image when using custom windowbar 2025-09-05 01:17:00 -07:00
jeffvli e1e0670350 remove unused file
- broke on electron v37 due to File.path deprecated
2025-09-05 01:00:51 -07:00
jeffvli 20debb099d remove electron file menu (#1041) 2025-09-05 00:16:49 -07:00
jeffvli 99f9cc5968 bump to electron v37 2025-09-04 21:52:17 -07:00
jeffvli 53b4a2ee8a bump to mantine v8.2.8 2025-09-04 21:42:13 -07:00
jeffvli 0b59a54f04 remove debug tools 2025-09-04 21:18:23 -07:00
jeffvli f85ce9703f add catalan language to config 2025-09-04 21:17:13 -07:00
jeffvli cf3fd53bc1 add portugese language to config 2025-09-04 21:17:13 -07:00
Kendall Garner 871923a977 Merge branch 'development' of github.com:jeffvli/feishin into development 2025-09-04 21:16:08 -07:00
Kendall Garner c21f7df7b2 fix share date setting, notification, lint fix 2025-09-04 21:15:42 -07:00
jeffvli c83f27ce14 add turkish language to config (#1087) 2025-09-04 21:14:54 -07:00
jeffvli 53499e2579 fix clickoutside on main context menu 2025-09-04 20:48:15 -07:00
jeffvli cbbf2db087 remove nested rating menu 2025-09-04 20:37:59 -07:00
Kendall Garner dd60634a40 exclude missing for more fields 2025-09-04 19:53:41 -07:00
jeffvli 54932fee86 fix context menu stuck on rating hover (#1079) 2025-09-04 19:49:25 -07:00
jeffvli 878e0007d9 fix typo 2025-09-04 19:38:17 -07:00
Jeff 2260c0c02b Merge pull request #1002 from jeffvli/react-image-lazy-loaded
Use lazy loading (react-intersection-observer) for image loading
2025-09-03 21:43:55 -07:00
Hosted Weblate dd3285544e Translated using Weblate (Norwegian Bokmål)
Currently translated at 54.8% (376 of 685 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: klodrik <klodrik@zoominn.no>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/nb_NO/
Translation: feishin/Translation
2025-09-04 03:29:47 +00:00
Hosted Weblate f3c674fb20 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (694 of 694 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/zh_Hans/
Translation: feishin/Translation
2025-09-04 03:29:46 +00:00
Hosted Weblate 6e0ae3ba92 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (685 of 685 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: York <goog10216922@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/zh_Hant/
Translation: feishin/Translation
2025-09-04 03:29:46 +00:00
Hosted Weblate c76cad9727 Translated using Weblate (Slovak)
Currently translated at 53.8% (374 of 694 strings)

Added translation using Weblate (Slovak)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: peter cerny <posli.to.semka@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/sk/
Translation: feishin/Translation
2025-09-04 03:29:45 +00:00
Hosted Weblate 3c29004e28 Translated using Weblate (Finnish)
Currently translated at 100.0% (685 of 685 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: jonoafi <joona@jonottaa.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fi/
Translation: feishin/Translation
2025-09-04 03:29:44 +00:00
Hosted Weblate b08050d9ff Translated using Weblate (French)
Currently translated at 100.0% (694 of 694 strings)

Translated using Weblate (French)

Currently translated at 100.0% (694 of 694 strings)

Translated using Weblate (French)

Currently translated at 100.0% (694 of 694 strings)

Translated using Weblate (French)

Currently translated at 100.0% (685 of 685 strings)

Co-authored-by: Dylan MONTIGAUD <dylanmontigaud17@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: KosmoMoustache <kosmomoustache@users.noreply.hosted.weblate.org>
Co-authored-by: mrchonks <chonkstv@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fr/
Translation: feishin/Translation
2025-09-04 03:29:44 +00:00
Hosted Weblate 908d5dde0f Translated using Weblate (Spanish)
Currently translated at 100.0% (694 of 694 strings)

Co-authored-by: Fordas <fordas15@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/es/
Translation: feishin/Translation
2025-09-04 03:29:43 +00:00
Hosted Weblate 0540b224ec Translated using Weblate (Dutch)
Currently translated at 36.3% (252 of 694 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Joren-vanGoethem <jorenvangoethem@hotmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/nl/
Translation: feishin/Translation
2025-09-04 03:29:42 +00:00
Hosted Weblate d0a2583edb Translated using Weblate (Polish)
Currently translated at 98.3% (674 of 685 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Piotr Łoboda <loboda4450@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/pl/
Translation: feishin/Translation
2025-09-04 03:29:42 +00:00
Hosted Weblate 97ca234015 Translated using Weblate (Portuguese)
Currently translated at 61.1% (419 of 685 strings)

Added translation using Weblate (Portuguese)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: ssantos <ssantos@web.de>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/pt/
Translation: feishin/Translation
2025-09-04 03:29:41 +00:00
Hosted Weblate b07395c12b Translated using Weblate (Czech)
Currently translated at 100.0% (694 of 694 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (685 of 685 strings)

Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/cs/
Translation: feishin/Translation
2025-09-04 03:29:40 +00:00
Hosted Weblate d8a10c8841 Translated using Weblate (Catalan)
Currently translated at 100.0% (694 of 694 strings)

Translated using Weblate (Catalan)

Currently translated at 100.0% (685 of 685 strings)

Translated using Weblate (Catalan)

Currently translated at 95.0% (651 of 685 strings)

Translated using Weblate (Catalan)

Currently translated at 88.7% (608 of 685 strings)

Translated using Weblate (Catalan)

Currently translated at 88.7% (608 of 685 strings)

Translated using Weblate (Catalan)

Currently translated at 49.0% (336 of 685 strings)

Translated using Weblate (Catalan)

Currently translated at 49.0% (336 of 685 strings)

Update translation files

Updated by "Remove blank strings" hook in Weblate.

Translated using Weblate (Catalan)

Currently translated at 47.4% (325 of 685 strings)

Added translation using Weblate (Catalan)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Isaac Miró <isaac.miro.garcia@gmail.com>
Co-authored-by: Ondo <SparkyOndo@proton.me>
Co-authored-by: Àlex Bravo <alexbravobosch@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/ca/
Translation: feishin/Translation
2025-09-04 03:29:40 +00:00
Hosted Weblate e112d0acbf Translated using Weblate (German)
Currently translated at 87.7% (601 of 685 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Trrevvoorr <trevinofficial@hotmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/de/
Translation: feishin/Translation
2025-09-04 03:29:39 +00:00
Hosted Weblate 8ca0a207d4 Translated using Weblate (Tamil)
Currently translated at 100.0% (685 of 685 strings)

Translated using Weblate (Tamil)

Currently translated at 99.8% (684 of 685 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: தமிழ்நேரம் <anishprabu.t@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/ta/
Translation: feishin/Translation
2025-09-04 03:29:38 +00:00
Hosted Weblate 4950ce1aed Translated using Weblate (Turkish)
Currently translated at 100.0% (685 of 685 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (685 of 685 strings)

Translated using Weblate (Turkish)

Currently translated at 54.8% (376 of 685 strings)

Translated using Weblate (Turkish)

Currently translated at 51.5% (353 of 685 strings)

Translated using Weblate (Turkish)

Currently translated at 31.5% (216 of 685 strings)

Added translation using Weblate (Turkish)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Mücahit Kaya <kaya-mucahit@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/tr/
Translation: feishin/Translation
2025-09-04 03:29:38 +00:00
Jeff 471d35dd70 Merge pull request #1055 from jeffvli/dependabot/npm_and_yarn/npm_and_yarn-5a0513363d
Bump tmp from 0.2.3 to 0.2.4 in the npm_and_yarn group across 1 directory
2025-09-03 20:29:31 -07:00
Kendall Garner f5af1c314c add image loader/unloader and only toggle source 2025-09-03 19:56:51 -07:00
Kendall Garner 1aac1a6361 Merge branch 'development' into react-image-lazy-loaded 2025-09-03 19:47:53 -07:00
Jeff 003e71d974 Merge pull request #1101 from ch-rit/fix-hiding-toast
fixed hiding the toast after content is loaded
2025-09-03 18:49:48 -07:00
Jeff 94b2668384 Merge pull request #1095 from johnson-dave/bad_encoding_autoplay
fix: ensure autoplay on metadata duration mismatch causing decoding error
2025-09-03 18:43:54 -07:00
ch-rit 039e553aa0 fixed hiding the toast after content is loaded 2025-09-03 19:04:36 +02:00
Jeff 755a09ceec Merge pull request #1092 from ch-rit/fix-genre-list
fixed the api call to get musicgenres
2025-09-03 01:30:53 -07:00
Jeff 60c94c2299 Merge pull request #1086 from hansyulian/feature/improve-add-to-playlist-ux
Feature: improve add to playlist UX
2025-09-03 01:25:41 -07:00
Dave Johnson 59e01f90e8 fix: ensure autoplay on bad encoding 2025-09-01 09:23:39 +01:00
Jeff 59065d24bc Merge pull request #1034 from Lyall-A/private-mode
add private mode toggle to app menu
2025-08-27 22:02:28 -07:00
Lyall 2271c211cb display private mode status 2025-08-28 05:48:21 +01:00
Jeff 7394d639e2 Merge pull request #1044 from Der-Penz/development
fix song getting added twice to queue when using tab navigation in command palette
2025-08-27 21:05:47 -07:00
Jeff 352a8e71e6 Merge pull request #1037 from vimaexd/discord-displaytype
implement discord status types
2025-08-27 21:00:52 -07:00
Christoph Ritzer 377a3ea8ab fixed the api call to get musicgenres 2025-08-26 17:14:17 +02:00
Hans Yulian 35b869ee7b feature: improve add to playlist UX 2025-08-23 06:00:17 +07:00
dependabot[bot] 618d27ffc1 Bump tmp in the npm_and_yarn group across 1 directory
Bumps the npm_and_yarn group with 1 update in the / directory: [tmp](https://github.com/raszi/node-tmp).


Updates `tmp` from 0.2.3 to 0.2.4
- [Changelog](https://github.com/raszi/node-tmp/blob/master/CHANGELOG.md)
- [Commits](https://github.com/raszi/node-tmp/compare/v0.2.3...v0.2.4)

---
updated-dependencies:
- dependency-name: tmp
  dependency-version: 0.2.4
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-06 17:36:57 +00:00
DerPenz 24b9bf210c fix song getting added twice to queue 2025-08-03 17:19:07 +02:00
mae taylor 76770de7d8 feat: discord presence display type 2025-08-01 16:43:34 +01:00
mae taylor 7ff74b8d5e bump @xhayper/discord-rpc to 1.3.0 2025-08-01 15:50:53 +01:00
Lyall 7423b71a65 change text 2025-07-31 16:26:05 +01:00
Lyall a44ad66d46 add private mode toggle to app menu 2025-07-31 16:12:03 +01:00
jeffvli 5ab0eba23e update to 0.19.0 2025-07-30 19:53:07 -07:00
jeffvli 08fc307516 attempt to catch network errors to prevent credential invalidation 2025-07-30 19:51:46 -07:00
Hosted Weblate e5adc0caa9 Translated using Weblate (Norwegian Bokmål)
Currently translated at 53.4% (365 of 683 strings)

Translated using Weblate (Norwegian Bokmål)

Currently translated at 53.4% (365 of 683 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: klodrik <klodrik@zoominn.no>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/nb_NO/
Translation: feishin/Translation
2025-07-31 04:11:35 +02:00
Hosted Weblate 7f0bdf20fc Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (685 of 685 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (683 of 683 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/zh_Hans/
Translation: feishin/Translation
2025-07-31 04:11:34 +02:00
Hosted Weblate deb89ef87d Translated using Weblate (French)
Currently translated at 100.0% (685 of 685 strings)

Translated using Weblate (French)

Currently translated at 100.0% (683 of 683 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: KosmoMoustache <kosmomoustache@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fr/
Translation: feishin/Translation
2025-07-31 04:11:34 +02:00
Hosted Weblate 9751e22db4 Translated using Weblate (Spanish)
Currently translated at 100.0% (685 of 685 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (683 of 683 strings)

Co-authored-by: Fordas <fordas15@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/es/
Translation: feishin/Translation
2025-07-31 04:11:33 +02:00
Hosted Weblate 6128470a47 Translated using Weblate (Czech)
Currently translated at 100.0% (685 of 685 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (683 of 683 strings)

Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Fjuro <git@alius.cz>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/cs/
Translation: feishin/Translation
2025-07-31 04:11:32 +02:00
Jeff ea79885ef5 Merge pull request #1030 from jeffvli/dependabot/npm_and_yarn/npm_and_yarn-373e2693b3
Bump @eslint/plugin-kit from 0.3.3 to 0.3.4 in the npm_and_yarn group across 1 directory
2025-07-30 21:11:24 -05:00
dependabot[bot] 84fd6e482d Bump @eslint/plugin-kit in the npm_and_yarn group across 1 directory
Bumps the npm_and_yarn group with 1 update in the / directory: [@eslint/plugin-kit](https://github.com/eslint/rewrite/tree/HEAD/packages/plugin-kit).


Updates `@eslint/plugin-kit` from 0.3.3 to 0.3.4
- [Release notes](https://github.com/eslint/rewrite/releases)
- [Changelog](https://github.com/eslint/rewrite/blob/main/packages/plugin-kit/CHANGELOG.md)
- [Commits](https://github.com/eslint/rewrite/commits/plugin-kit-v0.3.4/packages/plugin-kit)

---
updated-dependencies:
- dependency-name: "@eslint/plugin-kit"
  dependency-version: 0.3.4
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-30 02:24:51 +00:00
Jeff 904f05ff61 Merge pull request #1021 from jeffvli/dependabot/npm_and_yarn/npm_and_yarn-e04d5d616f
Bump form-data from 4.0.2 to 4.0.4 in the npm_and_yarn group across 1 directory
2025-07-29 21:23:23 -05:00
Jeff e78ec7688a Merge pull request #1024 from Der-Penz/development
Support tab navigation on ActionIcons in command palette
2025-07-29 21:22:47 -05:00
jeffvli f43de7f23c remove version from linux artifactName (#1020) 2025-07-29 19:18:27 -07:00
Jeff 07532ca55a Merge pull request #1018 from Lyall-A/fix-discord-disappearing
fix discord status clearing when song loops
2025-07-29 21:15:37 -05:00
Jeff 040a805f5f Merge pull request #1023 from chenqimiao/development
Add qm-music to an OpenSubsonic compatible server list
2025-07-29 21:04:39 -05:00
DerPenz 33af5e625b support tab navigation on ActionIcons in command palette 2025-07-26 14:01:05 +02:00
Qimiao Chen bdedcb883d introduce qm-music in readme 2025-07-25 18:22:34 +08:00
dependabot[bot] e842a75722 Bump form-data in the npm_and_yarn group across 1 directory
Bumps the npm_and_yarn group with 1 update in the / directory: [form-data](https://github.com/form-data/form-data).


Updates `form-data` from 4.0.2 to 4.0.4
- [Release notes](https://github.com/form-data/form-data/releases)
- [Changelog](https://github.com/form-data/form-data/blob/master/CHANGELOG.md)
- [Commits](https://github.com/form-data/form-data/compare/v4.0.2...v4.0.4)

---
updated-dependencies:
- dependency-name: form-data
  dependency-version: 4.0.4
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-25 03:38:33 +00:00
dependabot[bot] d28054cc7f Bump @eslint/plugin-kit in the npm_and_yarn group across 1 directory (#1014)
Bumps the npm_and_yarn group with 1 update in the / directory: [@eslint/plugin-kit](https://github.com/eslint/rewrite/tree/HEAD/packages/plugin-kit).


Updates `@eslint/plugin-kit` from 0.3.1 to 0.3.3
- [Release notes](https://github.com/eslint/rewrite/releases)
- [Changelog](https://github.com/eslint/rewrite/blob/main/packages/plugin-kit/CHANGELOG.md)
- [Commits](https://github.com/eslint/rewrite/commits/plugin-kit-v0.3.3/packages/plugin-kit)

---
updated-dependencies:
- dependency-name: "@eslint/plugin-kit"
  dependency-version: 0.3.3
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-25 03:37:07 +00:00
Lyall 41f8c34f6e fix discord status clearing when song loops 2025-07-22 10:23:02 +01:00
Kendall Garner 4b4df28641 add bit depth, sample rate 2025-07-13 07:12:13 -07:00
jeffvli 8b141d652c disable single attribute per line 2025-07-12 11:17:54 -07:00
Kendall Garner 92ed8e20c9 fix custom path 2025-07-12 07:21:34 -07:00
Kendall Garner 746ab8c2d9 large notification z-index 2025-07-11 19:21:52 -07:00
Kendall Garner 69341f4492 More typechecks on scrobble, use timeout on notification (#1004) 2025-07-10 13:53:40 +00:00
Kendall Garner 56130d8503 fix subsonic login error: use status instead 2025-07-08 16:42:30 -07:00
Kendall Garner 4407c8d424 convert query="" to query= for subsonic 2025-07-08 14:42:49 -07:00
Kendall Garner 58bb8e716e undo that change, remove magic numbers 2025-07-08 11:26:07 -07:00
Kendall Garner 0becfd4b59 subsonic limit to 500 2025-07-08 08:30:31 -07:00
jeffvli c94029012f update to v0.18.0 2025-07-08 00:48:01 -07:00
jeffvli 2d9176cd21 fix click propagation on right controls 2025-07-08 00:46:50 -07:00
jeffvli e28dad3f84 add code to language select label 2025-07-08 00:11:37 -07:00
jeffvli 60d3eec8f7 add sl to i18n config 2025-07-08 00:11:20 -07:00
Hosted Weblate 62f9d064d9 Translated using Weblate (Slovenian)
Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 74.8% (509 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 9.1% (62 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 9.1% (62 of 680 strings)

Translated using Weblate (Slovenian)

Currently translated at 9.1% (62 of 680 strings)

Added translation using Weblate (Slovenian)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Martin Stojanoski <martin.stojanoski2000@gmail.com>
Co-authored-by: mytja <mamnju21@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/sl/
Translation: feishin/Translation
2025-07-08 08:39:51 +02:00
Hosted Weblate 196b9be65b Translated using Weblate (French)
Currently translated at 100.0% (680 of 680 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: KosmoMoustache <kosmomoustache@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fr/
Translation: feishin/Translation
2025-07-08 08:39:50 +02:00
Hosted Weblate 587ce68018 Translated using Weblate (Italian)
Currently translated at 100.0% (680 of 680 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (680 of 680 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (680 of 680 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (680 of 680 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (680 of 680 strings)

Co-authored-by: Daivy <reale805@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/it/
Translation: feishin/Translation
2025-07-08 08:39:49 +02:00
Hosted Weblate 1ec6176b77 Translated using Weblate (Portuguese (Brazil))
Currently translated at 61.6% (419 of 680 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Renan <renan1211@hotmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/pt_BR/
Translation: feishin/Translation
2025-07-08 08:39:49 +02:00
jeffvli a5f28e49eb fix click propagation on PlayButton 2025-07-07 23:20:10 -07:00
Gemini Wen 0b7d4bfb6a macOS: change window close behavior, like other macOS App (#999) 2025-07-07 23:00:21 -07:00
jeffvli 2492456b93 fix search on filtered list pages 2025-07-07 21:28:34 -07:00
jeffvli 1c22c9506e remove stale lock comments 2025-07-07 21:14:18 -07:00
Kendall Garner 49bb42a298 Use lazy loading (react-intersection-observer) for image loading 2025-07-07 20:11:32 -07:00
Kendall Garner e00aeb2b67 enable notify, simplify use-scrobble with types, remove unused check 2025-07-07 19:25:25 -07:00
Kendall Garner b219c900ca fix readme logo rendering 2025-07-06 21:37:00 -07:00
Kendall Garner 5eacb4e3cb ...lodash random uses inclusive on both ends 2025-07-06 21:26:30 -07:00
Kendall Garner a86d44a29e fix(queue): random start index when play shuffled center control is enabled, play mode is now, no start specified 2025-07-06 21:24:45 -07:00
Jeff b7a0b7f997 handle undefined options in GenericCell (#998) 2025-07-06 03:33:11 -07:00
Lyall cd2d531c54 Automatically reconnect to Discord RPC at interval (#996)
* initialize before setActivity
2025-07-06 00:34:26 -07:00
ENDzZ 19c8980784 Translation Display Normalization (#982) 2025-07-05 16:41:42 -07:00
Lyall a2e5f86eac fix navidrome filter labels (#995) 2025-07-05 16:31:35 -07:00
dependabot[bot] d8c93cadce Bump brace-expansion in the npm_and_yarn group across 1 directory (#955)
Bumps the npm_and_yarn group with 1 update in the / directory: [brace-expansion](https://github.com/juliangruber/brace-expansion).


Updates `brace-expansion` from 1.1.11 to 1.1.12
- [Release notes](https://github.com/juliangruber/brace-expansion/releases)
- [Commits](https://github.com/juliangruber/brace-expansion/compare/1.1.11...v1.1.12)

---
updated-dependencies:
- dependency-name: brace-expansion
  dependency-version: 1.1.12
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-05 00:47:48 -07:00
Kendall Garner 35f87c8552 Fix ContextMenu star menu clicking (#987)
Resolves #985.
Currently, attempting to click on one of the `set rating` buttons is a no-op.
This is because it is considered "outside" the `ContextMenu`, which immediately closes it.
Pass in the same merged ref into the body of the `DropDown` component so that it is also treated as "inside".
2025-07-05 00:33:37 -07:00
Kendall Garner 4f7b0983ec port over ND stalebot (#991) 2025-07-02 21:55:02 -07:00
Kendall Garner 055d9ac5c1 use initial index for shuffling when availabe 2025-07-02 20:48:45 -07:00
Kendall Garner 039d008223 use fr plural setting translation from navidrome 2025-07-02 20:10:49 -07:00
Kendall Garner 2b8db9cfc1 fix table albumCount translation 2025-07-02 19:52:13 -07:00
Kendall Garner caa9448200 don't set sink on closed context 2025-07-02 19:19:51 -07:00
Kendall Garner 176a95a946 Compilation support for Jellyfin artist albums, misc other album filter fixes
- Jellyfin will use `ContributingArtistsId` (compilation), `AlbumArtistIds` (compilation is false), or `ArtistIds` (unspecified; all)
- Jellyfin can filter by compilation _only_ on the artist discography page
- Navidrome album filter fix for `defaultValue` display and prevent showing `tagQuery` 0 when querying
- Subsonic can filter by one or more artists in the album page. Sort is also applied on these items
- Bump genre/tag cache/stale time to 2/1 minutes
- Fix various cases where the album filter would display as active when it wasn't
2025-07-02 07:44:57 -07:00
Kendall Garner 6f5dd4881a join path with library path 2025-07-01 21:51:09 -07:00
Kendall Garner ce6aaa709f bugfix: handle table update when column is missing 2025-07-01 19:03:54 -07:00
Kendall Garner 217a4d65fd Merge branch 'development' of github.com:jeffvli/feishin into development 2025-07-01 17:34:32 -07:00
Kendall Garner b88671161a actually actually fix album list count for subsonic artists 2025-06-30 07:19:34 -07:00
jeffvli dde48335cd fix word-break overflow for CJK characters on lyrics 2025-06-30 00:47:13 -07:00
jeffvli 8611f08f54 right-align is-updated dialog buttons 2025-06-30 00:43:59 -07:00
Kendall Garner cd18e683bf yesnofilter null when not provided 2025-06-29 22:34:39 -07:00
Kendall Garner 286441c1b1 Merge branch 'development' of github.com:jeffvli/feishin into development 2025-06-29 22:30:36 -07:00
Kendall Garner 5456c2c2b8 Improve Jellyfin/Navidrome Album/Song filter, Navidrome artist recent release
- Use `compilation=false` for Navidrome recent releases with artist credit
- Add `YesNoSelect` (yes, no, undefined) for `favorite` for Navidrome/Jellyfin `album`/`track`, and Navidrome `compilation`
- Fix folderButton translation
2025-06-29 22:14:06 -07:00
jeffvli 5cd4fc227e update to v0.17.0 2025-06-29 21:36:36 -07:00
Hosted Weblate 737d672918 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (680 of 680 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (680 of 680 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (676 of 676 strings)

Co-authored-by: ENDzZ <godzmichael@outlook.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/zh_Hans/
Translation: feishin/Translation
2025-06-30 05:35:41 +02:00
Hosted Weblate a6ac4c8f67 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 76.9% (523 of 680 strings)

Co-authored-by: ENDzZ <godzmichael@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/zh_Hant/
Translation: feishin/Translation
2025-06-30 05:35:41 +02:00
Hosted Weblate c9217827ab Translated using Weblate (Serbian)
Currently translated at 75.8% (516 of 680 strings)

Co-authored-by: ENDzZ <godzmichael@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/sr/
Translation: feishin/Translation
2025-06-30 05:35:40 +02:00
Hosted Weblate 0ff8fad071 Translated using Weblate (Finnish)
Currently translated at 100.0% (680 of 680 strings)

Translated using Weblate (Finnish)

Currently translated at 100.0% (680 of 680 strings)

Translated using Weblate (Finnish)

Currently translated at 100.0% (680 of 680 strings)

Co-authored-by: ENDzZ <godzmichael@outlook.com>
Co-authored-by: jonoafi <joona@jonottaa.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fi/
Translation: feishin/Translation
2025-06-30 05:35:39 +02:00
Hosted Weblate f3cb15eae2 Translated using Weblate (French)
Currently translated at 100.0% (680 of 680 strings)

Translated using Weblate (French)

Currently translated at 100.0% (680 of 680 strings)

Translated using Weblate (French)

Currently translated at 100.0% (676 of 676 strings)

Co-authored-by: ENDzZ <godzmichael@outlook.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: KosmoMoustache <kosmomoustache@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fr/
Translation: feishin/Translation
2025-06-30 05:35:39 +02:00
Hosted Weblate 5b34b287e2 Translated using Weblate (Spanish)
Currently translated at 100.0% (680 of 680 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (680 of 680 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (676 of 676 strings)

Co-authored-by: ENDzZ <godzmichael@outlook.com>
Co-authored-by: Fordas <fordas15@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/es/
Translation: feishin/Translation
2025-06-30 05:35:38 +02:00
Hosted Weblate dc461a253f Translated using Weblate (Indonesian)
Currently translated at 96.6% (657 of 680 strings)

Co-authored-by: ENDzZ <godzmichael@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/id/
Translation: feishin/Translation
2025-06-30 05:35:37 +02:00
Hosted Weblate 958416af4c Translated using Weblate (Italian)
Currently translated at 75.7% (515 of 680 strings)

Co-authored-by: ENDzZ <godzmichael@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/it/
Translation: feishin/Translation
2025-06-30 05:35:37 +02:00
Hosted Weblate 1dd8eec4a5 Translated using Weblate (Polish)
Currently translated at 96.6% (657 of 680 strings)

Translated using Weblate (Polish)

Currently translated at 96.6% (657 of 680 strings)

Co-authored-by: ENDzZ <godzmichael@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/pl/
Translation: feishin/Translation
2025-06-30 05:35:36 +02:00
Hosted Weblate b263db5483 Translated using Weblate (Hungarian)
Currently translated at 30.5% (208 of 680 strings)

Co-authored-by: ENDzZ <godzmichael@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/hu/
Translation: feishin/Translation
2025-06-30 05:35:35 +02:00
Hosted Weblate 528f60c5f3 Translated using Weblate (Czech)
Currently translated at 100.0% (680 of 680 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (680 of 680 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (676 of 676 strings)

Co-authored-by: ENDzZ <godzmichael@outlook.com>
Co-authored-by: Fjuro <git@alius.cz>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/cs/
Translation: feishin/Translation
2025-06-30 05:35:35 +02:00
Hosted Weblate 007b0166ab Translated using Weblate (Japanese)
Currently translated at 75.7% (515 of 680 strings)

Co-authored-by: ENDzZ <godzmichael@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/ja/
Translation: feishin/Translation
2025-06-30 05:35:34 +02:00
Hosted Weblate d3fb2374ff Translated using Weblate (Russian)
Currently translated at 92.5% (629 of 680 strings)

Co-authored-by: ENDzZ <godzmichael@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/ru/
Translation: feishin/Translation
2025-06-30 05:35:34 +02:00
Hosted Weblate 676c091d28 Translated using Weblate (English)
Currently translated at 100.0% (680 of 680 strings)

Co-authored-by: ENDzZ <godzmichael@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/en/
Translation: feishin/Translation
2025-06-30 05:35:33 +02:00
Hosted Weblate 58b7572a8b Translated using Weblate (German)
Currently translated at 86.0% (585 of 680 strings)

Co-authored-by: ENDzZ <godzmichael@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/de/
Translation: feishin/Translation
2025-06-30 05:35:32 +02:00
Hosted Weblate fc77c32a0e Translated using Weblate (Tamil)
Currently translated at 96.6% (657 of 680 strings)

Co-authored-by: ENDzZ <godzmichael@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/ta/
Translation: feishin/Translation
2025-06-30 05:35:32 +02:00
Kendall Garner b5bdea1845 actually fix subsonic album count 2025-06-29 20:35:06 -07:00
jeffvli 8eb591bd08 properly handle overflow on sidebar items (#971) 2025-06-29 18:56:46 -07:00
jeffvli 88be98f703 cleanup unneeded div wrapper on lyric lines 2025-06-29 18:31:43 -07:00
jeffvli df6b6d514d update netease translation lyric line handling (#979)
- lyric should be appended to the original lyric line with a custom splitter
- the custom splitter is now handled in LyricLine
2025-06-29 18:29:59 -07:00
Lyall b6d902e425 fix: discord presence not clearing after pausing player (#973)
* add show rich presence when paused option
2025-06-28 13:46:12 -07:00
jeffvli d922d8b034 fix sidebar height when using custom window bar 2025-06-28 13:42:33 -07:00
jeffvli f4db8fdb84 fix background color of collapsed sidebar 2025-06-28 13:34:16 -07:00
Lyall 81ca6937bc add preserve pitch option (#972) 2025-06-28 13:18:08 -07:00
Kendall Garner c382e01f64 fix regex in proxy 2025-06-28 07:29:42 -07:00
Kendall Garner fb80b66310 update remote regex 2025-06-28 06:48:04 -07:00
Kendall Garner 63e3b97bca log -> error, remove unnecesary logs 2025-06-26 21:17:59 -07:00
Kendall Garner fb584b35a9 handle Navidrome login loop error 2025-06-26 21:14:20 -07:00
jeffvli bdc372636b update issue templates 2025-06-26 09:52:11 -07:00
jeffvli 2c5671cf38 update to v0.16.0 2025-06-26 01:39:47 -07:00
Hosted Weblate bd12fbecac Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (674 of 674 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/zh_Hans/
Translation: feishin/Translation
2025-06-26 10:37:11 +02:00
Hosted Weblate c1d88ada91 Translated using Weblate (Finnish)
Currently translated at 100.0% (676 of 676 strings)

Co-authored-by: jonoafi <joona@jonottaa.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fi/
Translation: feishin/Translation
2025-06-26 10:37:11 +02:00
Hosted Weblate d6a3e1d90b Translated using Weblate (French)
Currently translated at 100.0% (674 of 674 strings)

Translated using Weblate (French)

Currently translated at 99.2% (669 of 674 strings)

Translated using Weblate (French)

Currently translated at 99.2% (669 of 674 strings)

Co-authored-by: Dylan MONTIGAUD <dylanmontigaud17@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: KosmoMoustache <kosmomoustache@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fr/
Translation: feishin/Translation
2025-06-26 10:37:11 +02:00
Hosted Weblate 789c7f3d81 Translated using Weblate (Spanish)
Currently translated at 100.0% (674 of 674 strings)

Co-authored-by: Fordas <fordas15@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/es/
Translation: feishin/Translation
2025-06-26 10:37:11 +02:00
Hosted Weblate f3c785d0fa Translated using Weblate (German)
Currently translated at 86.7% (585 of 674 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Slincess <kisacikdevran0@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/de/
Translation: feishin/Translation
2025-06-26 10:37:10 +02:00
jeffvli 062c1c2b61 decrease brightness of header overlay on dark 2025-06-26 01:36:54 -07:00
jeffvli eb078d62cd more adjustments to styles on the fullscreen player 2025-06-26 01:36:42 -07:00
jeffvli c429ac9223 move fonts to assets folder 2025-06-26 01:36:16 -07:00
jeffvli bd26967ff2 fix word breaks on lyrics (#969) 2025-06-26 01:11:46 -07:00
jeffvli 620b810191 add option to set local lyric priority 2025-06-25 21:25:29 -07:00
jeffvli 64866c59bd adjust styles on fullscreen player image section
- fix image transition
- fix image aspect ratio
- adjust text sizes and shadow
2025-06-25 20:40:45 -07:00
jeffvli 0afbe4c0a2 improve visibility of fullscreen player buttons 2025-06-25 19:53:49 -07:00
jeffvli 6782cd0dcc re-add presence animation when collapsing sidebar image 2025-06-25 19:48:59 -07:00
jeffvli 8f585a5be9 adjust styles to better support light theme 2025-06-25 19:44:28 -07:00
jeffvli ac0c396712 fix sidebar image height when using Windows or macOS window bar 2025-06-25 09:02:22 -07:00
Kendall Garner b989a66991 only show owned playlists on playlist sidebar 2025-06-25 08:19:22 -07:00
Kendall Garner 2814b623e7 fix player button light theme and tooltip 2025-06-25 08:05:57 -07:00
jeffvli 7d29a692ef remove unused import 2025-06-24 22:34:06 -07:00
jeffvli 3f9eb446f7 update to v0.15.1 2025-06-24 22:27:12 -07:00
jeffvli d8f7b49ab6 increase size of play button icon 2025-06-24 22:22:15 -07:00
jeffvli 35e70a3eff fix synchronized lyric styles not applying 2025-06-24 22:20:26 -07:00
jeffvli ef9c16e940 attempt fix on docker build 2025-06-24 22:16:16 -07:00
Kendall Garner 0b39c35132 make item modal links have heavier font width 2025-06-24 21:39:47 -07:00
Kendall Garner 9f5b4e5410 remove unused length in visualizer 2025-06-24 21:20:41 -07:00
jeffvli dbf840b185 fix actionbar not growing to width of container 2025-06-24 20:33:50 -07:00
jeffvli e0f0524eb9 adjust button styles on playerbar 2025-06-24 20:31:33 -07:00
jeffvli 8598313d12 fix styling on web titlebar style 2025-06-24 20:14:15 -07:00
jeffvli c84dd648ea various clean up and fixes 2025-06-24 18:43:37 -07:00
jeffvli 01885c1a9b decrease spacing on playerbar details 2025-06-24 18:38:10 -07:00
jeffvli 5121f57171 use native img for sidebar image 2025-06-24 18:38:10 -07:00
jeffvli 3d7ee10328 add standalone fast-average-color function 2025-06-24 18:38:10 -07:00
jeffvli 4db47b4d37 switch image loading to lazy by default 2025-06-24 18:38:10 -07:00
jeffvli 786a693526 add animation presets 2025-06-24 18:38:10 -07:00
jeffvli 1faef6a1a7 fix unused var on visualizer 2025-06-24 18:38:10 -07:00
jeffvli 1598642389 re-add page fade in 2025-06-24 18:38:10 -07:00
Kendall Garner 8c4a7f4f91 only show lastfm/listenbrainz if configured 2025-06-24 17:58:43 -07:00
jeffvli 5878f89339 set sidebar items open by default 2025-06-24 15:04:22 -07:00
jeffvli 4acbb1820d set fullscreen player badges to transparent 2025-06-24 14:52:40 -07:00
jeffvli 01f5745629 update visualizer sizing and z-index 2025-06-24 14:52:27 -07:00
jeffvli 73dd781a88 fix regression on image blur in fullscreen player 2025-06-24 14:47:50 -07:00
jeffvli d777be6251 increase minRows on custom css input 2025-06-24 14:42:16 -07:00
jeffvli 6689e84f67 fix and update remote design 2025-06-24 14:36:14 -07:00
jeffvli ad533a1d9c update to v0.15.0 2025-06-24 00:07:51 -07:00
Hosted Weblate b691891e62 Translated using Weblate (Finnish)
Currently translated at 100.0% (668 of 668 strings)

Co-authored-by: jonoafi <joona@jonottaa.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fi/
Translation: feishin/Translation
2025-06-24 09:06:37 +02:00
Hosted Weblate 53fa265af9 Translated using Weblate (Spanish)
Currently translated at 100.0% (668 of 668 strings)

Co-authored-by: Fordas <fordas15@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/es/
Translation: feishin/Translation
2025-06-24 09:06:36 +02:00
Hosted Weblate 55f6a382d4 Translated using Weblate (Czech)
Currently translated at 100.0% (668 of 668 strings)

Co-authored-by: Fjuro <git@alius.cz>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/cs/
Translation: feishin/Translation
2025-06-24 09:06:36 +02:00
Hosted Weblate 9c30acdd56 Translated using Weblate (Portuguese (Brazil))
Currently translated at 62.1% (414 of 666 strings)

Co-authored-by: Brunno Hofmann <brunno.hofmann@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/pt_BR/
Translation: feishin/Translation
2025-06-24 09:06:35 +02:00
jeffvli b29d3e7f78 disable netease translation by default 2025-06-24 00:06:19 -07:00
Jeff c1330d92b2 Migrate to Mantine v8 and Design Changes (#961)
* mantine v8 migration

* various design changes and improvements
2025-06-24 00:04:36 -07:00
Benjamin bea55d48a8 discord rpc changes (#958) 2025-06-21 12:38:06 -07:00
et21ff ae41fe99bb lyrics: add translation lyrics for netease.ts (#951)
* lyrics: add translation lyrics for netease.ts
2025-06-21 12:19:23 -07:00
Pyx e3751229b6 update readme because subsonic is supported now (#960)
* Update README.md
2025-06-20 18:53:44 -07:00
Kendall Garner 87c9963354 fix subsonic album artist and album list count 2025-06-20 18:35:11 -07:00
Kendall Garner b7fb7c7f94 improve library header loading 2025-06-20 17:57:15 -07:00
Hosted Weblate b8ceb174b3 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (666 of 666 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/zh_Hans/
Translation: feishin/Translation
2025-06-11 02:38:13 +02:00
Hosted Weblate 48f085b0ac Translated using Weblate (Finnish)
Currently translated at 100.0% (666 of 666 strings)

Co-authored-by: jonoafi <joona@jonottaa.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fi/
Translation: feishin/Translation
2025-06-11 02:38:13 +02:00
Hosted Weblate dfc0639f95 Translated using Weblate (French)
Currently translated at 100.0% (666 of 666 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: KosmoMoustache <kosmomoustache@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fr/
Translation: feishin/Translation
2025-06-11 02:38:13 +02:00
Hosted Weblate 80ffd1a925 Translated using Weblate (Spanish)
Currently translated at 100.0% (666 of 666 strings)

Co-authored-by: Fordas <fordas15@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/es/
Translation: feishin/Translation
2025-06-11 02:38:13 +02:00
Hosted Weblate c87bb65023 Translated using Weblate (Czech)
Currently translated at 100.0% (666 of 666 strings)

Co-authored-by: Fjuro <git@alius.cz>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/cs/
Translation: feishin/Translation
2025-06-11 02:38:13 +02:00
jeffvli 5ae21bd224 fix icon alignment for context menu items 2025-06-10 17:37:43 -07:00
jeffvli 12d293a74c remove trailing space 2025-06-10 17:34:00 -07:00
et21ff 62f4bb0d7b fix(player): Improve MPV stability and seek performance (#953) 2025-06-10 17:22:40 -07:00
Pyx 9f11061433 disable visualizer background (#949)
* disable visualizer background
2025-06-09 18:14:59 -07:00
Hans Yulian aba64b10d0 Feature: Shuffle Button (#941) 2025-06-09 02:02:03 -07:00
jeffvli c20e30e387 include sourcemap in vite build 2025-06-09 01:28:27 -07:00
jeffvli c4b4300845 fix lyrics offset type conversion (#948) 2025-06-09 01:28:27 -07:00
Kendall Garner f1e5ed41bc also gate by external link 2025-06-07 20:54:23 -07:00
Kendall Garner 9b79502022 config option for listenbrainz/lastfm links 2025-06-07 20:36:41 -07:00
jeffvli 636c227a83 replace and fix position of current track play icon 2025-06-03 01:05:19 -07:00
jeffvli e8a94a0b1c bump to node 23 image 2025-06-02 21:39:12 -07:00
jeffvli fa93dfd771 add pnpm install to alpine image 2025-06-02 21:37:27 -07:00
jeffvli 8629994eb6 fix docker build issues
- pnpm-lock instead of package-lock
- fix build out directory
2025-06-02 21:32:00 -07:00
jeffvli c54423a667 fix wrong lockfile copy 2025-06-02 21:30:57 -07:00
jeffvli d28fc9f630 allow workflow_dispath on docker deploy 2025-06-02 21:23:07 -07:00
jeffvli bd2b39fdfb re-add ng.conf.template file 2025-06-02 21:20:57 -07:00
jeffvli 2912cd72ef fix build artifactName to include arch 2025-06-02 20:49:55 -07:00
jeffvli 9d31d952b7 update to v0.14.0 2025-06-02 20:34:30 -07:00
jeffvli 8f692b6f4d call remote shutdown on app quit 2025-06-02 20:32:05 -07:00
jeffvli 7562c619d2 fix mpv path save dialog (#930) (#940) 2025-06-02 20:17:55 -07:00
Kendall Garner 6b91ee4a25 fix album genre filter 2025-06-02 19:38:39 -07:00
Kendall Garner 9e689468f9 info for playlists, show id, fix playlist duration 2025-06-02 00:26:36 -07:00
Kendall Garner 1cda4363ef add lockfile 2025-05-28 22:00:26 -07:00
Kendall Garner b6941df7a7 fix editorconfig and downgrade react player back to lazy 2025-05-28 21:57:47 -07:00
jeffvli 608b322f9e remove maintenance notice 2025-05-28 14:49:32 -07:00
jeffvli daee582e92 fix web player playback
- add missing forwardRef on AudioPlayer component
- bump react-player to latest
2025-05-28 10:39:25 -07:00
jeffvli 6525a8a725 fix remote dev path 2025-05-27 18:28:52 -07:00
jeffvli ee1896c345 fix version number 2025-05-27 01:47:18 -07:00
Jeff ec625c2c65 Merge pull request #933 from jeffvli/experimental/vite
Migrate from Webpack to Vite
2025-05-26 18:10:48 -07:00
jeffvli 52e4423cf1 update readme with new pnpm scripts 2025-05-26 17:20:45 -07:00
jeffvli a9f7e808cb update the docker build for pnpm 2025-05-26 17:20:45 -07:00
jeffvli 9c26187b45 fixes for pnpm v10 2025-05-26 17:20:45 -07:00
jeffvli 90afa11f20 set custom userData path for dev 2025-05-26 17:20:45 -07:00
jeffvli 6463ea937b add vite build for web 2025-05-26 17:20:45 -07:00
jeffvli ac682428e6 various cleanup 2025-05-26 17:20:45 -07:00
jeffvli 48917547b2 add vite build for remote 2025-05-26 17:20:45 -07:00
jeffvli 74554d9725 use lowercase in package productName 2025-05-26 17:20:45 -07:00
jeffvli 0d42a6ea49 update workflows for new build 2025-05-26 17:20:45 -07:00
jeffvli faadff0211 migrate to pnpm 2025-05-26 17:20:44 -07:00
jeffvli 91715ebf7d change build dir 2025-05-26 17:20:28 -07:00
jeffvli 1808f160b4 clean up dependencies 2025-05-26 17:20:28 -07:00
jeffvli e10a92a5c2 add legacy-peer-deps default 2025-05-26 17:20:02 -07:00
jeffvli 930165d006 fix all imports for new structure 2025-05-26 17:20:02 -07:00
jeffvli 249eaf89f8 update linter rules 2025-05-26 17:18:56 -07:00
jeffvli bf1cddae9d remove unusued paths from tsconfig node 2025-05-26 17:18:56 -07:00
jeffvli 9db2e51d2d reorganize global types to shared directory 2025-05-26 17:18:56 -07:00
jeffvli 26c02e03c5 update package.json and electron builder 2025-05-26 17:18:56 -07:00
jeffvli 1cf587bc8f restructure files onto electron-vite boilerplate 2025-05-26 17:18:55 -07:00
Hosted Weblate 91ce2cd8a1 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (662 of 662 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/zh_Hans/
Translation: feishin/Translation
2025-05-26 11:11:24 +02:00
Hosted Weblate 4f61e82068 Translated using Weblate (Finnish)
Currently translated at 100.0% (659 of 659 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: jonoafi <joona@jonottaa.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fi/
Translation: feishin/Translation
2025-05-26 11:11:24 +02:00
Hosted Weblate 1e6673fabd Translated using Weblate (French)
Currently translated at 100.0% (662 of 662 strings)

Co-authored-by: KosmoMoustache <hosted.weblate.org@kosmo.ovh>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fr/
Translation: feishin/Translation
2025-05-26 11:11:24 +02:00
Hosted Weblate 02951c92af Translated using Weblate (Spanish)
Currently translated at 100.0% (662 of 662 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (659 of 659 strings)

Co-authored-by: Fordas <fordas15@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/es/
Translation: feishin/Translation
2025-05-26 11:11:24 +02:00
Hosted Weblate 05f8fb3114 Translated using Weblate (Czech)
Currently translated at 100.0% (662 of 662 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (659 of 659 strings)

Co-authored-by: Fjuro <git@alius.cz>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/cs/
Translation: feishin/Translation
2025-05-26 11:11:24 +02:00
jeffvli 169da10c1b fix release version 2025-05-26 02:11:14 -07:00
jeffvli 5a79fee77e use missing UTC transform on navidrome dates (#928) 2025-05-26 02:08:08 -07:00
jeffvli 7ef80f14b0 fix casing on filtered list route titels (#929) 2025-05-26 01:58:16 -07:00
jeffvli 36cc37e39f update to v0.13.0 2025-05-26 01:47:13 -07:00
Kendall Garner d4e7c6bd18 fix copypasta 2025-05-20 08:40:24 -07:00
Kendall Garner 90f79b4ae7 add multiselect with invalid data handling to jellyfin album 2025-05-18 18:27:17 -07:00
Kendall Garner cf74625bfc warn if a value in select no longer exists 2025-05-18 10:59:45 -07:00
Kendall Garner f068d6e4b8 actually add type to query key 2025-05-18 09:29:13 -07:00
Kendall Garner e1aa8d74f3 Tag filter support
- Jellyfin: Uses `/items/filters` to get list of boolean tags. Notably, does not use this same filter for genres. Separate filter for song/album
- Navidrome: Uses `/api/tags`, which appears to be album-level as multiple independent selects. Same filter for song/album
2025-05-18 09:23:52 -07:00
Kendall Garner b0d86ee5c9 Support tags, and better participants for servers
- Parses `tags` for Navidrome (mapping string: string[])
- Parses `Tags` (and fetches for it) for Jellyfin (map a string to empty, and display as a bool)
- Clean parsing of participants for Navidrome/Subsonic
- Only show `People` for Jellyfin, not clickable
2025-05-17 21:35:58 -07:00
Kendall Garner 89e27ec6ff remove console.log 2025-05-16 11:50:26 -07:00
Kendall Garner 39c714a137 navidrome cover art workaround 2025-05-15 19:10:15 -07:00
Kendall Garner a8fb7ff11e fullscreen header image on click 2025-05-14 08:25:02 -07:00
jeffvli 9b95f47a91 update to v0.12.7 2025-05-12 18:27:37 -07:00
Hosted Weblate 2267e9bc9d Translated using Weblate (Czech)
Currently translated at 100.0% (657 of 657 strings)

Co-authored-by: Fjuro <fjuro@alius.cz>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/cs/
Translation: feishin/Translation
2025-05-13 03:24:48 +02:00
Kendall Garner 089311c673 add migrate from v8 (#925) 2025-05-12 18:24:42 -07:00
Kendall Garner 773f349b66 don't show song count if not present for home carousel 2025-05-09 19:08:36 -07:00
Kendall Garner 3980c8ea97 save the package-logk.json changes as well 2025-05-08 08:23:58 -07:00
Kendall Garner 257a5ceef0 force xmljs to 0.5.0 2025-05-08 08:08:31 -07:00
jeffvli fb022891fe update to v0.12.6 2025-05-08 00:44:13 -07:00
Kendall Garner 5d9906b8f2 include album artist song/album count for jellyfin, and disable playing/adding playinsts for artists with no albums 2025-05-07 21:16:47 -07:00
jeffvli 6f7cb468b2 fix regression on subsonic album artist play 2025-05-07 20:59:16 -07:00
Kendall Garner 076693e969 Merge branch 'development' of github.com:jeffvli/feishin into development 2025-05-07 20:01:04 -07:00
Kendall Garner 781d8055b5 minor artist count fixes 2025-05-07 19:53:23 -07:00
jeffvli 960bb5c660 fix navigation to detail page on artist list 2025-05-07 19:40:54 -07:00
jeffvli 42bb2bf66f fix regression on album artist play button 2025-05-07 19:25:25 -07:00
jeffvli f03d88cd8c batch jellyfin song list requests when fetching by albumId (#922) 2025-05-07 01:42:32 -07:00
jeffvli 58f6535ba6 revert electron to gtk 3 (#923) 2025-05-07 01:28:54 -07:00
jeffvli 9a59ce3613 fix casing on artist albums title 2025-05-07 01:15:00 -07:00
jeffvli 6f37e13611 additional fix to sticky table header to account for native 2025-05-06 18:54:10 -07:00
jeffvli 3c494f1c72 update to v0.12.5 2025-05-06 18:27:02 -07:00
jeffvli ec0e7256cb fix set rating click on context menu (#900)
- star rating icon overriddes the pointer click event
2025-05-06 18:23:14 -07:00
jeffvli 262203b62d handle arrow keys in global hotkey (#913) 2025-05-06 15:19:34 -07:00
jeffvli 41bdc1a7b7 disable toast overlay blocking playerbar (#888) 2025-05-06 15:00:43 -07:00
jeffvli d35e73792f fix item playback buttons on search list (#885) 2025-05-06 14:50:59 -07:00
jeffvli 4a3604b1a8 handle playback on new artist list 2025-05-06 14:43:42 -07:00
jeffvli b9611589ba fix casing on some translation strings 2025-05-06 13:23:29 -07:00
jeffvli 12c517f0ff update to v0.12.4 2025-05-06 03:40:42 -07:00
Hosted Weblate 01884ab656 Translated using Weblate (Finnish)
Currently translated at 100.0% (657 of 657 strings)

Translated using Weblate (Finnish)

Currently translated at 77.3% (508 of 657 strings)

Translated using Weblate (Finnish)

Currently translated at 69.2% (455 of 657 strings)

Translated using Weblate (Finnish)

Currently translated at 64.9% (427 of 657 strings)

Translated using Weblate (Finnish)

Currently translated at 64.9% (427 of 657 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Lunya <Lunya2@protonmail.com>
Co-authored-by: Ricky Tigg <ricky.tigg@gmail.com>
Co-authored-by: jonoafi <joona@jonottaa.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fi/
Translation: feishin/Translation
2025-05-06 12:28:46 +02:00
Hosted Weblate 0ba830d5d7 Translated using Weblate (Persian)
Currently translated at 74.8% (492 of 657 strings)

Co-authored-by: Hadi <xhopeter@proton.me>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fa/
Translation: feishin/Translation
2025-05-06 12:28:46 +02:00
Hosted Weblate b08a0d178c Translated using Weblate (Spanish)
Currently translated at 100.0% (657 of 657 strings)

Co-authored-by: Fordas <fordas15@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/es/
Translation: feishin/Translation
2025-05-06 12:28:46 +02:00
Hosted Weblate 9afa64b537 Translated using Weblate (Polish)
Currently translated at 100.0% (657 of 657 strings)

Translated using Weblate (Polish)

Currently translated at 93.4% (614 of 657 strings)

Translated using Weblate (Polish)

Currently translated at 92.2% (606 of 657 strings)

Co-authored-by: Adam Perkowski <adas1per@protonmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: skajmer <skajmer@protonmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/pl/
Translation: feishin/Translation
2025-05-06 12:28:46 +02:00
Hosted Weblate be8bc74ab5 Translated using Weblate (Russian)
Currently translated at 95.7% (629 of 657 strings)

Translated using Weblate (Russian)

Currently translated at 95.2% (626 of 657 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Rachel Podya <homicide@disroot.org>
Co-authored-by: zv0r <mount.dev.brain@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/ru/
Translation: feishin/Translation
2025-05-06 12:28:46 +02:00
Hosted Weblate 2f4e228fa1 Translated using Weblate (Portuguese (Brazil))
Currently translated at 61.1% (402 of 657 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Joao <joaohirasawaa@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/feishin/translation/pt_BR/
Translation: feishin/Translation
2025-05-06 12:28:46 +02:00
jeffvli 35ee7e4606 fix position of sticky table header when titlebar present 2025-05-06 03:27:30 -07:00
jeffvli b265f2817b bump to electron 36 (#921) 2025-05-06 02:58:22 -07:00
Kendall Garner 48af447838 fix entities version 2025-04-25 10:35:52 -07:00
Kendall Garner 397df0c9c6 npm update 2025-04-25 09:53:15 -07:00
Kendall Garner 68759a2613 artists fixes 2025-04-25 09:30:17 -07:00
Kendall Garner c376293f2f always add all artists to subsonic 2025-04-23 23:33:58 -07:00
Kendall Garner e84a4b20bc add artist list 2025-04-23 23:27:06 -07:00
Kendall Garner 14e9f6ac41 bump electronVersion 2025-04-22 07:41:56 -07:00
Kendall Garner 0115ecb59b fix repeat one/repeat all scrobble 2025-04-20 10:54:44 -07:00
Kendall Garner 1555b827ee fix: normalize artists with no album count 2025-03-10 14:20:19 -07:00
753 changed files with 38210 additions and 64175 deletions
+2 -5
View File
@@ -1,12 +1,9 @@
root = true root = true
[*] [*]
charset = utf-8
indent_style = space indent_style = space
indent_size = 4 indent_size = 4
end_of_line = lf end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true insert_final_newline = true
trim_trailing_whitespace = true
[*.md]
trim_trailing_whitespace = false
-7
View File
@@ -1,7 +0,0 @@
{
"rules": {
"no-console": "off",
"global-require": "off",
"import/no-dynamic-require": "off"
}
}
-64
View File
@@ -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;
-3
View File
@@ -1,3 +0,0 @@
/* eslint import/no-unresolved: off, import/no-self-import: off */
module.exports = require('./webpack.config.renderer.dev').default;
-84
View File
@@ -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);
-127
View File
@@ -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);
-142
View File
@@ -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);
-201
View File
@@ -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);
-147
View File
@@ -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);
-138
View File
@@ -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);
-46
View File
@@ -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
View File
@@ -1 +0,0 @@
export default 'test-file-stub';
-8
View File
@@ -1,8 +0,0 @@
{
"rules": {
"no-console": "off",
"global-require": "off",
"import/no-dynamic-require": "off",
"import/no-extraneous-dependencies": "off"
}
}
-33
View File
@@ -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"',
),
);
}
-54
View File
@@ -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');
}
}
-16
View File
@@ -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);
}
}
-16
View File
@@ -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);
}
});
-17
View File
@@ -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);
}
});
-9
View File
@@ -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'));
}
-20
View File
@@ -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',
});
}
-9
View File
@@ -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');
}
-30
View File
@@ -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,
});
};
-34
View File
@@ -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
-97
View File
@@ -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
+74
View File
@@ -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
-63
View File
@@ -1,63 +0,0 @@
name: Bug report
description: You're having technical issues. 🐞
labels: ['bug']
body:
- type: textarea
attributes:
label: Expected Behavior
description: What should have happened?
validations:
required: true
- type: textarea
attributes:
label: Current Behavior
description: What went wrong? Add screenshots to help explain your problem. (Open the browser dev tools in the menu or using CTRL + SHIFT + I)
validations:
required: true
- type: textarea
attributes:
label: Steps to Reproduce
placeholder: |
<!-- Add relevant code and/or a live example -->
<!-- Add stack traces -->
1.
2.
3.
4.
validations:
required: true
- type: textarea
attributes:
label: Possible Solution
description: Suggest a reason for the bug or how to fix it.
validations:
required: false
- type: textarea
attributes:
label: Context
description: How has this issue affected you? What are you trying to accomplish?
validations:
required: false
- type: input
attributes:
label: Application version
placeholder: (e.g. v0.1.0)
validations:
required: true
- type: input
attributes:
label: Operating System and version
placeholder: (e.g. Windows 11 desktop, Webapp in Firefox)
validations:
required: true
- type: input
attributes:
label: Server and Version
placeholder: (e.g. Navidrome v0.48.0)
validations:
required: true
- type: input
attributes:
label: Node Version (if developing locally)
validations:
required: false
+9 -3
View File
@@ -1,5 +1,11 @@
blank_issues_enabled: true blank_issues_enabled: false
contact_links: contact_links:
- name: Question - name: Questions or help
url: https://github.com/jeffvli/feishin/discussions url: https://github.com/jeffvli/feishin/discussions
about: Please ask and answer questions here. 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
@@ -1,20 +0,0 @@
name: Feature request - NOT ACCEPTING NEW FEATURE REQUESTS
description: Feature requests are currently closed. The application is actively being rewritten https://github.com/audioling/audioling.
labels: ['enhancement']
body:
- type: textarea
attributes:
label: What do you want to be added?
validations:
required: true
- type: textarea
attributes:
label: Additional context
validations:
required: false
- type: checkboxes
attributes:
label: Is this a server-specific feature? (e.g. Jellyfin only)
options:
- label: 'Yes'
required: false
+4 -3
View File
@@ -3,6 +3,7 @@ name: Publish Docker to GHCR
permissions: write-all permissions: write-all
on: on:
workflow_dispatch:
push: push:
tags: tags:
- 'v*.*.*' - 'v*.*.*'
@@ -49,6 +50,6 @@ jobs:
tags: ${{ steps.meta.outputs.tags }} tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }} labels: ${{ steps.meta.outputs.labels }}
platforms: | platforms: |
linux/amd64 linux/amd64
linux/arm/v7 linux/arm/v7
linux/arm64/v8 linux/arm64/v8
+4 -6
View File
@@ -24,11 +24,9 @@ jobs:
password: ${{ secrets.GITHUB_TOKEN }} password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata (tags, labels) for Docker - name: Extract metadata (tags, labels) for Docker
id: meta id: meta
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7 uses: docker/metadata-action@v5
with: with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
tags: |
type=raw,value=latest,enable={{is_default_branch}}
- name: Set up QEMU - name: Set up QEMU
uses: docker/setup-qemu-action@v3 uses: docker/setup-qemu-action@v3
- name: Setup Docker buildx - name: Setup Docker buildx
@@ -41,6 +39,6 @@ jobs:
tags: ${{ steps.meta.outputs.tags }} tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }} labels: ${{ steps.meta.outputs.labels }}
platforms: | platforms: |
linux/amd64 linux/amd64
linux/arm/v7 linux/arm/v7
linux/arm64/v8 linux/arm64/v8
+12 -16
View File
@@ -14,17 +14,15 @@ jobs:
- name: Checkout git repo - name: Checkout git repo
uses: actions/checkout@v1 uses: actions/checkout@v1
- name: Install Node and NPM - name: Install Node and PNPM
uses: actions/setup-node@v1 uses: pnpm/action-setup@v4
with: with:
node-version: 18 version: 9
cache: npm
- name: Install dependencies - name: Install dependencies
run: | run: pnpm install
npm install --legacy-peer-deps
- name: Publish releases - name: Build and Publish releases
env: env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
uses: nick-invision/retry@v2.8.2 uses: nick-invision/retry@v2.8.2
@@ -33,12 +31,11 @@ jobs:
max_attempts: 3 max_attempts: 3
retry_on: error retry_on: error
command: | command: |
npm run postinstall pnpm run package:linux
npm run build pnpm run publish:linux
npm exec electron-builder -- --publish always --linux on_retry_command: pnpm cache delete
on_retry_command: npm cache clean --force
- name: Publish releases (arm64) - name: Build and Publish releases (arm64)
env: env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
uses: nick-invision/retry@v2.8.2 uses: nick-invision/retry@v2.8.2
@@ -47,7 +44,6 @@ jobs:
max_attempts: 3 max_attempts: 3
retry_on: error retry_on: error
command: | command: |
npm run postinstall pnpm run package:linux-arm64
npm run build pnpm run publish:linux-arm64
npm exec electron-builder -- --publish always --arm64 on_retry_command: pnpm cache delete
on_retry_command: npm cache clean --force
+8 -11
View File
@@ -14,17 +14,15 @@ jobs:
- name: Checkout git repo - name: Checkout git repo
uses: actions/checkout@v1 uses: actions/checkout@v1
- name: Install Node and NPM - name: Install Node and PNPM
uses: actions/setup-node@v1 uses: pnpm/action-setup@v4
with: with:
node-version: 18 version: 9
cache: npm
- name: Install dependencies - name: Install dependencies
run: | run: pnpm install
npm install --legacy-peer-deps
- name: Publish releases - name: Build and Publish releases
env: env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
uses: nick-invision/retry@v2.8.2 uses: nick-invision/retry@v2.8.2
@@ -33,7 +31,6 @@ jobs:
max_attempts: 3 max_attempts: 3
retry_on: error retry_on: error
command: | command: |
npm run postinstall pnpm run package:mac
npm run build pnpm run publish:mac
npm exec electron-builder -- --publish always --mac on_retry_command: pnpm cache delete
on_retry_command: npm cache clean --force
+13 -15
View File
@@ -17,15 +17,13 @@ jobs:
- name: Checkout git repo - name: Checkout git repo
uses: actions/checkout@v3 uses: actions/checkout@v3
- name: Install Node and NPM - name: Install Node and PNPM
uses: actions/setup-node@v3 uses: pnpm/action-setup@v4
with: with:
node-version: 18 version: 9
cache: npm
- name: Install dependencies - name: Install dependencies
run: | run: pnpm install
npm install --legacy-peer-deps
- name: Build for Windows - name: Build for Windows
if: ${{ matrix.os == 'windows-latest' }} if: ${{ matrix.os == 'windows-latest' }}
@@ -35,7 +33,7 @@ jobs:
max_attempts: 3 max_attempts: 3
retry_on: error retry_on: error
command: | command: |
npm run package:pr:windows pnpm run package:win:pr
- name: Build for Linux - name: Build for Linux
if: ${{ matrix.os == 'ubuntu-latest' }} if: ${{ matrix.os == 'ubuntu-latest' }}
@@ -45,7 +43,7 @@ jobs:
max_attempts: 3 max_attempts: 3
retry_on: error retry_on: error
command: | command: |
npm run package:pr:linux pnpm run package:linux:pr
- name: Build for MacOS - name: Build for MacOS
if: ${{ matrix.os == 'macos-latest' }} if: ${{ matrix.os == 'macos-latest' }}
@@ -55,41 +53,41 @@ jobs:
max_attempts: 3 max_attempts: 3
retry_on: error retry_on: error
command: | command: |
npm run package:pr:macos pnpm run package:mac:pr
- name: Zip Windows Binaries - name: Zip Windows Binaries
if: ${{ matrix.os == 'windows-latest' }} if: ${{ matrix.os == 'windows-latest' }}
shell: pwsh shell: pwsh
run: | run: |
Compress-Archive -Path "release/build/*.exe" -DestinationPath "release/build/windows-binaries.zip" -Force Compress-Archive -Path "dist/*.exe" -DestinationPath "dist/windows-binaries.zip" -Force
- name: Zip Linux Binaries - name: Zip Linux Binaries
if: ${{ matrix.os == 'ubuntu-latest' }} if: ${{ matrix.os == 'ubuntu-latest' }}
run: | run: |
zip -r release/build/linux-binaries.zip release/build/*.{AppImage,deb,rpm} zip -r dist/linux-binaries.zip dist/*.{AppImage,deb,rpm}
- name: Zip MacOS Binaries - name: Zip MacOS Binaries
if: ${{ matrix.os == 'macos-latest' }} if: ${{ matrix.os == 'macos-latest' }}
run: | run: |
zip -r release/build/macos-binaries.zip release/build/*.dmg zip -r dist/macos-binaries.zip dist/*.dmg
- name: Upload Windows Binaries - name: Upload Windows Binaries
if: ${{ matrix.os == 'windows-latest' }} if: ${{ matrix.os == 'windows-latest' }}
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
name: windows-binaries name: windows-binaries
path: release/build/windows-binaries.zip path: dist/windows-binaries.zip
- name: Upload Linux Binaries - name: Upload Linux Binaries
if: ${{ matrix.os == 'ubuntu-latest' }} if: ${{ matrix.os == 'ubuntu-latest' }}
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
name: linux-binaries name: linux-binaries
path: release/build/linux-binaries.zip path: dist/linux-binaries.zip
- name: Upload MacOS Binaries - name: Upload MacOS Binaries
if: ${{ matrix.os == 'macos-latest' }} if: ${{ matrix.os == 'macos-latest' }}
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
name: macos-binaries name: macos-binaries
path: release/build/macos-binaries.zip path: dist/macos-binaries.zip
+8 -11
View File
@@ -14,17 +14,15 @@ jobs:
- name: Checkout git repo - name: Checkout git repo
uses: actions/checkout@v1 uses: actions/checkout@v1
- name: Install Node and NPM - name: Install Node and PNPM
uses: actions/setup-node@v1 uses: pnpm/action-setup@v4
with: with:
node-version: 18 version: 9
cache: npm
- name: Install dependencies - name: Install dependencies
run: | run: pnpm install
npm install --legacy-peer-deps
- name: Publish releases - name: Build and Publish releases
env: env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
uses: nick-invision/retry@v2.8.2 uses: nick-invision/retry@v2.8.2
@@ -33,7 +31,6 @@ jobs:
max_attempts: 3 max_attempts: 3
retry_on: error retry_on: error
command: | command: |
npm run postinstall pnpm run package:win
npm run build pnpm run publish:win
npm exec electron-builder -- --publish always --win on_retry_command: pnpm cache delete
on_retry_command: npm cache clean --force
+47
View File
@@ -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: 'enhancement,keep,security'
stale-pr-label: 'stale'
exempt-pr-labels: 'keep,security'
+7 -15
View File
@@ -14,21 +14,13 @@ jobs:
- name: Check out Git repository - name: Check out Git repository
uses: actions/checkout@v1 uses: actions/checkout@v1
- name: Install Node.js and NPM - name: Install Node.js and PNPM
uses: actions/setup-node@v2 uses: pnpm/action-setup@v4
with: with:
node-version: 16 version: 9
cache: npm
- name: npm install - name: Install dependencies
run: | run: pnpm install
npm install --legacy-peer-deps
- name: npm test - name: Lint Files
env: run: pnpm run lint
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
npm run lint
npm run package
npm exec tsc
npm test
+5 -29
View File
@@ -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 node_modules
dist
# OSX out
.DS_Store .DS_Store
.eslintcache
release/app/dist *.log*
release/build release
.erb/dll
.idea
npm-debug.log.*
*.css.d.ts
*.sass.d.ts
*.scss.d.ts
.env*
-4
View File
@@ -1,4 +0,0 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
npx lint-staged
+2
View File
@@ -0,0 +1,2 @@
legacy-peer-deps=true
only-built-dependencies=electron,esbuild
+6
View File
@@ -0,0 +1,6 @@
out
dist
pnpm-lock.yaml
LICENSE.md
tsconfig.json
tsconfig.*.json
-22
View File
@@ -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
}
+14
View File
@@ -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
View File
@@ -1,17 +1,19 @@
{ {
"customSyntax": "postcss-styled-syntax",
"extends": [ "extends": [
"stylelint-config-standard", "stylelint-config-standard",
"stylelint-config-styled-components", "stylelint-config-css-modules",
"stylelint-config-recess-order" "stylelint-config-recess-order"
], ],
"rules": { "rules": {
"declaration-empty-line-before": null, "block-no-empty": null,
"declaration-block-no-redundant-longhand-properties": null,
"selector-class-pattern": null,
"selector-type-case": ["lower", { "ignoreTypes": ["/^\\$\\w+/"] }], "selector-type-case": ["lower", { "ignoreTypes": ["/^\\$\\w+/"] }],
"selector-type-no-unknown": [true, { "ignoreTypes": ["/-styled-mixin/", "/^\\$\\w+/"] }], "selector-type-no-unknown": [true, { "ignoreTypes": ["/-styled-mixin/", "/^\\$\\w+/"] }],
"declaration-colon-newline-after": null, "declaration-block-no-shorthand-property-overrides": null,
"property-no-vendor-prefix": 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
} }
} }
+1 -8
View File
@@ -1,10 +1,3 @@
{ {
"recommendations": [ "recommendations": ["dbaeumer.vscode-eslint"]
"dbaeumer.vscode-eslint",
"EditorConfig.EditorConfig",
"stylelint.vscode-stylelint",
"esbenp.prettier-vscode",
"clinyong.vscode-css-modules",
"Huuums.vscode-fast-folder-structure"
]
} }
+37 -26
View File
@@ -1,28 +1,39 @@
{ {
"version": "0.2.0", "version": "0.2.0",
"configurations": [ "configurations": [
{ {
"name": "Electron: Main", "name": "Debug Main Process",
"type": "node", "type": "node",
"request": "launch", "request": "launch",
"protocol": "inspector", "cwd": "${workspaceRoot}",
"runtimeExecutable": "npm", "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron-vite",
"runtimeArgs": ["run start:main --inspect=5858 --remote-debugging-port=9223"], "windows": {
"preLaunchTask": "Start Webpack Dev" "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron-vite.cmd"
}, },
{ "runtimeArgs": ["--sourcemap"],
"name": "Electron: Renderer", "env": {
"type": "chrome", "REMOTE_DEBUGGING_PORT": "9222"
"request": "attach", }
"port": 9223, },
"webRoot": "${workspaceFolder}", {
"timeout": 15000 "name": "Debug Renderer Process",
} "port": 9222,
], "request": "attach",
"compounds": [ "type": "chrome",
{ "webRoot": "${workspaceFolder}/src/renderer",
"name": "Electron: All", "timeout": 60000,
"configurations": ["Electron: Main", "Electron: Renderer"] "presentation": {
} "hidden": true
] }
}
],
"compounds": [
{
"name": "Debug All",
"configurations": ["Debug Main Process", "Debug Renderer Process"],
"presentation": {
"order": 1
}
}
]
} }
+23 -12
View File
@@ -1,15 +1,23 @@
{ {
"[typescript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[javascript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[json]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"files.associations": { "files.associations": {
".eslintrc": "jsonc", ".eslintrc": "jsonc",
".prettierrc": "jsonc", ".prettierrc": "jsonc",
".eslintignore": "ignore" ".eslintignore": "ignore"
}, },
"eslint.validate": ["typescript"], "eslint.validate": ["typescript", "typescriptreact"],
"eslint.workingDirectories": [ "eslint.workingDirectories": [
{ "directory": "./", "changeProcessCWD": true }, { "directory": "./", "changeProcessCWD": true },
{ "directory": "./server", "changeProcessCWD": true }
], ],
"typescript.tsserver.experimental.enableProjectDiagnostics": true, "typescript.tsserver.experimental.enableProjectDiagnostics": false,
"editor.codeActionsOnSave": { "editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit", "source.fixAll.eslint": "explicit",
"source.fixAll.stylelint": "explicit", "source.fixAll.stylelint": "explicit",
@@ -17,10 +25,6 @@
"source.formatDocument": "explicit" "source.formatDocument": "explicit"
}, },
"css.validate": true, "css.validate": true,
"less.validate": false,
"scss.validate": true,
"scss.lint.unknownAtRules": "warning",
"scss.lint.unknownProperties": "warning",
"javascript.validate.enable": false, "javascript.validate.enable": false,
"javascript.format.enable": false, "javascript.format.enable": false,
"typescript.format.enable": false, "typescript.format.enable": false,
@@ -33,14 +37,21 @@
"npm-debug.log.*": true, "npm-debug.log.*": true,
"test/**/__snapshots__": true, "test/**/__snapshots__": true,
"package-lock.json": 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"], "i18n-ally.localesPaths": ["src/i18n", "src/i18n/locales"],
"typescript.tsdk": "node_modules\\typescript\\lib", "typescript.tsdk": "node_modules\\typescript\\lib",
"typescript.preferences.importModuleSpecifier": "non-relative", "typescript.preferences.importModuleSpecifier": "non-relative",
"stylelint.validate": ["css", "scss", "typescript", "typescriptreact"], "stylelint.config": null,
"stylelint.validate": ["css", "postcss"],
"typescript.updateImportsOnFileMove.enabled": "always", "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" }, "[typescriptreact]": { "editor.defaultFormatter": "esbenp.prettier-vscode" },
"typescript.format.insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces": true, "typescript.format.insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces": true,
"folderTemplates.structures": [ "folderTemplates.structures": [
@@ -53,14 +64,14 @@
"template": "Functional Component with CSS Modules" "template": "Functional Component with CSS Modules"
}, },
{ {
"fileName": "<FTName | kebabcase>.module.scss" "fileName": "<FTName | kebabcase>.module.css"
} }
] ]
} }
], ],
"folderTemplates.fileTemplates": { "folderTemplates.fileTemplates": {
"Functional Component with CSS Modules": [ "Functional Component with CSS Modules": [
"import styles from './<FTName | kebabcase>.module.scss';", "import styles from './<FTName | kebabcase>.module.css';",
"", "",
"interface <FTName | pascalcase>Props {}", "interface <FTName | pascalcase>Props {}",
"", "",
-25
View File
@@ -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
View File
@@ -1,19 +1,22 @@
# --- Builder stage # --- Builder stage
FROM node:18-alpine as builder FROM node:23-alpine as builder
WORKDIR /app WORKDIR /app
#Copy package.json first to cache node_modules # Copy package.json first to cache node_modules
COPY package.json package-lock.json . COPY package.json pnpm-lock.yaml .
# Scripts include electron-specific dependencies, which we don't need
RUN npm install --legacy-peer-deps --ignore-scripts RUN npm install -g pnpm
#Copy code and build with cached modules
RUN pnpm install
# Copy code and build with cached modules
COPY . . COPY . .
RUN npm run build:web RUN pnpm run build:web
# --- Production stage # --- Production stage
FROM nginx:alpine-slim 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 ./settings.js.template /etc/nginx/templates/settings.js.template
COPY ng.conf.template /etc/nginx/templates/default.conf.template COPY ng.conf.template /etc/nginx/templates/default.conf.template
+49 -33
View File
@@ -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 # Feishin
@@ -29,25 +29,17 @@
--- ---
## MAINTENANCE NOTICE
Feishin is currently undergoing a major rewrite. New feature requests will not be accepted. The rewrite is being actively developed at the [audioling](https://github.com/audioling/audioling) repository.
Follow the repository or join the discord/matrix server for updates.
---
Rewrite of [Sonixd](https://github.com/jeffvli/sonixd). Rewrite of [Sonixd](https://github.com/jeffvli/sonixd).
## Features ## Features
- [x] MPV player backend - [x] MPV player backend
- [x] Web player backend - [x] Web player backend
- [x] Modern UI - [x] Modern UI
- [x] Scrobble playback to your server - [x] Scrobble playback to your server
- [x] Smart playlist editor (Navidrome) - [x] Smart playlist editor (Navidrome)
- [x] Synchronized and unsynchronized lyrics support - [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) - [ ] [Request a feature](https://github.com/jeffvli/feishin/issues) or [view taskboard](https://github.com/users/jeffvli/projects/5/views/1)
## Screenshots ## Screenshots
@@ -109,8 +101,8 @@ services:
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`). 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). - **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. - **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`. 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`.
@@ -124,20 +116,21 @@ First thing to do is check that your MPV binary path is correct. Navigate to the
### What music servers does Feishin support? ### 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) - [Navidrome](https://github.com/navidrome/navidrome)
- [Jellyfin](https://github.com/jellyfin/jellyfin) - [Jellyfin](https://github.com/jellyfin/jellyfin)
- Subsonic-compatible servers - [OpenSubsonic](https://opensubsonic.netlify.app/) compatible servers, such as...
- [Airsonic-Advanced](https://github.com/airsonic-advanced/airsonic-advanced) - [Airsonic-Advanced](https://github.com/airsonic-advanced/airsonic-advanced)
- [Ampache](https://ampache.org) - [Ampache](https://ampache.org)
- [Astiga](https://asti.ga/) - [Astiga](https://asti.ga/)
- [Funkwhale](https://www.funkwhale.audio/) - [Funkwhale](https://www.funkwhale.audio/)
- [Gonic](https://github.com/sentriz/gonic) - [Gonic](https://github.com/sentriz/gonic)
- [LMS](https://github.com/epoupon/lms) - [LMS](https://github.com/epoupon/lms)
- [Nextcloud Music](https://apps.nextcloud.com/apps/music) - [Nextcloud Music](https://apps.nextcloud.com/apps/music)
- [Supysonic](https://github.com/spl0k/supysonic) - [Supysonic](https://github.com/spl0k/supysonic)
- More (?) - [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 ### I have the issue "The SUID sandbox helper binary was found, but is not configured correctly" on Linux
@@ -152,9 +145,32 @@ Ubunutu 24.04 specifically introduced breaking changes that affect how namespace
## Development ## 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
- `pnpm run package:linux` - Package the project for Linux
- `pnpm run package:mac` - Package the project for Mac
- `pnpm run package:win` - Package the project for Windows
- `pnpm run publish:linux` - Publish the project for Linux
- `pnpm run publish:linux-arm64` - Publish the project for Linux ARM64
- `pnpm run publish:mac` - Publish the project for Mac
- `pnpm run publish:win` - Publish the project for Windows
- `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 ## Translation
+3 -1
View File
@@ -2,9 +2,11 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>com.apple.security.cs.allow-jit</key>
<true/>
<key>com.apple.security.cs.allow-unsigned-executable-memory</key> <key>com.apple.security.cs.allow-unsigned-executable-memory</key>
<true/> <true/>
<key>com.apple.security.cs.allow-jit</key> <key>com.apple.security.cs.allow-dyld-environment-variables</key>
<true/> <true/>
</dict> </dict>
</plist> </plist>
Binary file not shown.
+3
View File
@@ -0,0 +1,3 @@
provider: generic
url: https://example.com/auto-updates
updaterCacheDirName: feishin-updater
+49
View File
@@ -0,0 +1,49 @@
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:
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
+66
View File
@@ -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;
+53
View File
@@ -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,
);
+1 -1
View File
@@ -24,4 +24,4 @@ server {
location ${PUBLIC_PATH}/settings.js { location ${PUBLIC_PATH}/settings.js {
alias /etc/nginx/conf.d/settings.js; alias /etc/nginx/conf.d/settings.js;
} }
} }
-41090
View File
File diff suppressed because it is too large Load Diff
+119 -324
View File
@@ -1,297 +1,57 @@
{ {
"name": "feishin", "name": "feishin",
"productName": "Feishin", "version": "0.20.1",
"description": "Feishin music server", "description": "A modern self-hosted music player.",
"version": "0.12.3",
"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": "node --import tsx ./.erb/scripts/clean.js dist && npm run build && electron-builder build --publish never",
"package:pr": "node --import tsx ./.erb/scripts/clean.js dist && npm run build && electron-builder build --publish never --win --mac --linux",
"package:pr:macos": "node --import tsx ./.erb/scripts/clean.js dist && npm run build && electron-builder build --publish never --mac",
"package:pr:windows": "node --import tsx ./.erb/scripts/clean.js dist && npm run build && electron-builder build --publish never --win",
"package:pr:linux": "node --import tsx ./.erb/scripts/clean.js dist && npm run build && electron-builder build --publish never --linux",
"package:dev": "node --import tsx ./.erb/scripts/clean.js dist && npm run build && electron-builder build --publish never --dir",
"postinstall": "node --import tsx .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": "node --import tsx ./.erb/scripts/check-port-in-use.js && npm run start:renderer",
"start:main": "cross-env NODE_ENV=development NODE_OPTIONS=\"--import tsx\" 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": "31.2.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"
},
"keywords": [ "keywords": [
"subsonic", "subsonic",
"navidrome", "navidrome",
"airsonic",
"jellyfin", "jellyfin",
"react", "react",
"electron" "electron"
], ],
"homepage": "https://github.com/jeffvli/feishin", "homepage": "https://github.com/jeffvli/feishin",
"jest": { "bugs": {
"testURL": "http://localhost/", "url": "https://github.com/jeffvli/feishin/issues"
"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"
]
}, },
"devDependencies": { "license": "GPL-3.0",
"@electron/rebuild": "^3.6.0", "author": {
"@pmmmwh/react-refresh-webpack-plugin": "0.5.5", "name": "jeffvli",
"@stylelint/postcss-css-in-js": "^0.38.0", "url": "https://github.com/jeffvli/"
"@teamsupercell/typings-for-css-modules-loader": "^2.5.1", },
"@testing-library/jest-dom": "^5.16.4", "main": "./out/main/index.js",
"@testing-library/react": "^13.0.0", "scripts": {
"@types/dompurify": "^3.0.5", "build": "pnpm run typecheck && pnpm run build:electron && pnpm run build:remote",
"@types/electron-localshortcut": "^3.1.0", "build:electron": "electron-vite build",
"@types/jest": "^27.4.1", "build:remote": "vite build --config remote.vite.config.ts",
"@types/lodash": "^4.14.188", "build:web": "vite build --config web.vite.config.ts",
"@types/md5": "^2.3.2", "dev": "electron-vite dev",
"@types/node": "^17.0.23", "dev:remote": "vite dev --config remote.vite.config.ts",
"@types/react": "^18.0.25", "dev:watch": "electron-vite dev --watch",
"@types/react-dom": "^18.0.8", "i18next": "i18next -c src/i18n/i18next-parser.config.js",
"@types/react-test-renderer": "^17.0.1", "postinstall": "electron-builder install-app-deps",
"@types/react-virtualized-auto-sizer": "^1.0.1", "lint": "pnpm run lint-code && pnpm run lint-styles",
"@types/react-window": "^1.8.5", "lint-code": "eslint --cache .",
"@types/react-window-infinite-loader": "^1.0.6", "lint-code:fix": "eslint --cache --fix .",
"@types/styled-components": "^5.1.26", "lint-styles": "stylelint 'src/**/*.{css,scss}'",
"@types/terser-webpack-plugin": "^5.0.4", "lint-styles:fix": "stylelint 'src/**/*.{css,scss}' --fix",
"@types/webpack-bundle-analyzer": "^4.4.1", "lint:fix": "pnpm run lint-code:fix && pnpm run lint-styles:fix",
"@types/webpack-env": "^1.16.3", "package": "pnpm run build && electron-builder",
"@typescript-eslint/eslint-plugin": "^5.47.0", "package:dev": "pnpm run build && electron-builder --dir",
"@typescript-eslint/parser": "^5.47.0", "package:linux": "pnpm run build && electron-builder --linux",
"browserslist-config-erb": "^0.0.3", "package:linux-arm64:pr": "pnpm run build && electron-builder --linux --arm64 --publish never",
"chalk": "^4.1.2", "package:linux:pr": "pnpm run build && electron-builder --linux --publish never",
"concurrently": "^7.1.0", "package:mac": "pnpm run build && electron-builder --mac",
"core-js": "^3.21.1", "package:mac:pr": "pnpm run build && electron-builder --mac --publish never",
"cross-env": "^7.0.3", "package:win": "pnpm run build && electron-builder --win",
"css-loader": "^6.7.1", "package:win:pr": "pnpm run build && electron-builder --win --publish never",
"css-minimizer-webpack-plugin": "^3.4.1", "publish:linux": "electron-builder --publish always --linux",
"detect-port": "^1.3.0", "publish:linux-arm64": "electron-builder --publish always --linux --arm64",
"electron": "^33.3.1", "publish:mac": "electron-builder --publish always --mac",
"electron-builder": "^24.13.3", "publish:win": "electron-builder --publish always --win",
"electron-devtools-installer": "^3.2.0", "start": "electron-vite preview",
"electron-notarize": "^1.2.1", "typecheck": "pnpm run typecheck:node && pnpm run typecheck:web",
"electronmon": "^2.0.2", "typecheck:node": "tsc --noEmit -p tsconfig.node.json --composite false",
"eslint": "^8.30.0", "typecheck:web": "tsc --noEmit -p tsconfig.web.json --composite false"
"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": "^9.0.2",
"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": "^3.3.3",
"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.9.2",
"tsconfig-paths-webpack-plugin": "^4.0.0",
"tsx": "^4.16.2",
"typescript": "^5.2.2",
"typescript-plugin-styled-components": "^3.0.0",
"url-loader": "^4.1.1",
"webpack": "^5.94.0",
"webpack-bundle-analyzer": "^4.5.0",
"webpack-cli": "^4.9.2",
"webpack-dev-server": "^4.8.0",
"webpack-merge": "^5.8.0"
}, },
"dependencies": { "dependencies": {
"@ag-grid-community/client-side-row-model": "^28.2.1", "@ag-grid-community/client-side-row-model": "^28.2.1",
@@ -299,22 +59,27 @@
"@ag-grid-community/infinite-row-model": "^28.2.1", "@ag-grid-community/infinite-row-model": "^28.2.1",
"@ag-grid-community/react": "^28.2.1", "@ag-grid-community/react": "^28.2.1",
"@ag-grid-community/styles": "^28.2.1", "@ag-grid-community/styles": "^28.2.1",
"@emotion/react": "^11.10.4", "@atlaskit/pragmatic-drag-and-drop": "1.4.0",
"@mantine/core": "^6.0.17", "@atlaskit/pragmatic-drag-and-drop-auto-scroll": "^2.1.0",
"@mantine/dates": "^6.0.17", "@atlaskit/pragmatic-drag-and-drop-hitbox": "^1.0.3",
"@mantine/form": "^6.0.17", "@electron-toolkit/preload": "^3.0.1",
"@mantine/hooks": "^6.0.17", "@electron-toolkit/utils": "^4.0.0",
"@mantine/modals": "^6.0.17", "@mantine/colors-generator": "^8.2.8",
"@mantine/notifications": "^6.0.17", "@mantine/core": "^8.2.8",
"@mantine/utils": "^6.0.17", "@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": "^4.32.1",
"@tanstack/react-query-devtools": "^4.32.1", "@tanstack/react-query-devtools": "^4.32.1",
"@tanstack/react-query-persist-client": "^4.32.1", "@tanstack/react-query-persist-client": "^4.32.1",
"@ts-rest/core": "^3.23.0", "@ts-rest/core": "^3.23.0",
"@xhayper/discord-rpc": "^1.0.24", "@xhayper/discord-rpc": "^1.3.0",
"audiomotion-analyzer": "^4.5.0", "audiomotion-analyzer": "^4.5.0",
"auto-text-size": "^0.2.3", "auto-text-size": "^0.2.3",
"axios": "^1.6.0", "axios": "^1.6.0",
"cheerio": "^1.0.0",
"clsx": "^2.0.0", "clsx": "^2.0.0",
"cmdk": "^0.2.0", "cmdk": "^0.2.0",
"dayjs": "^1.11.6", "dayjs": "^1.11.6",
@@ -323,12 +88,10 @@
"electron-localshortcut": "^3.2.1", "electron-localshortcut": "^3.2.1",
"electron-log": "^5.1.1", "electron-log": "^5.1.1",
"electron-store": "^8.1.0", "electron-store": "^8.1.0",
"electron-updater": "^6.3.1", "electron-updater": "^6.3.9",
"fast-average-color": "^9.3.0", "fast-average-color": "^9.3.0",
"format-duration": "^2.0.0", "format-duration": "^2.0.0",
"framer-motion": "^11.0.0",
"fuse.js": "^6.6.2", "fuse.js": "^6.6.2",
"history": "^5.3.0",
"i18next": "^21.10.0", "i18next": "^21.10.0",
"idb-keyval": "^6.2.1", "idb-keyval": "^6.2.1",
"immer": "^9.0.21", "immer": "^9.0.21",
@@ -336,49 +99,81 @@
"lodash": "^4.17.21", "lodash": "^4.17.21",
"md5": "^2.3.0", "md5": "^2.3.0",
"memoize-one": "^6.0.0", "memoize-one": "^6.0.0",
"motion": "^12.18.1",
"mpris-service": "^2.1.2",
"nanoid": "^3.3.3", "nanoid": "^3.3.3",
"net": "^1.0.2",
"node-mpv": "github:jeffvli/Node-MPV#32b4d64395289ad710c41d481d2707a7acfc228f", "node-mpv": "github:jeffvli/Node-MPV#32b4d64395289ad710c41d481d2707a7acfc228f",
"overlayscrollbars": "^2.2.1", "overlayscrollbars": "^2.11.1",
"overlayscrollbars-react": "^0.5.1", "overlayscrollbars-react": "^0.5.6",
"react": "^18.2.0", "qs": "^6.14.0",
"react-dom": "^18.2.0", "react": "^19.1.0",
"react-dom": "^19.1.0",
"react-error-boundary": "^3.1.4", "react-error-boundary": "^3.1.4",
"react-i18next": "^11.18.6", "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-player": "^2.11.0",
"react-router": "^6.16.0", "react-router": "^6.16.0",
"react-router-dom": "^6.16.0", "react-router-dom": "^6.16.0",
"react-simple-img": "^3.0.0",
"react-virtualized-auto-sizer": "^1.0.17", "react-virtualized-auto-sizer": "^1.0.17",
"react-window": "^1.8.9", "react-window": "^1.8.9",
"react-window-infinite-loader": "^1.0.9", "react-window-infinite-loader": "^1.0.9",
"semver": "^7.5.4", "semver": "^7.5.4",
"styled-components": "^6.0.8",
"swiper": "^9.3.1", "swiper": "^9.3.1",
"use-sync-external-store": "^1.5.0",
"ws": "^8.18.2",
"zod": "^3.22.3", "zod": "^3.22.3",
"zustand": "^4.3.9" "zustand": "^5.0.5"
}, },
"resolutions": { "devDependencies": {
"styled-components": "^6" "@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.5",
"vite-plugin-conditional-import": "^0.1.7",
"vite-plugin-dynamic-import": "^1.6.0",
"vite-plugin-ejs": "^1.7.0"
}, },
"devEngines": { "pnpm": {
"runtime": { "onlyBuiltDependencies": [
"name": "node", "electron",
"version": ">=18.x", "esbuild"
"onFail": "error"
},
"packageManager": {
"name": "npm",
"version": ">=7.x",
"onFail": "error"
}
},
"browserslist": [],
"electronmon": {
"patterns": [
"!server",
"!src/renderer"
] ]
} },
"productName": "feishin"
} }
+9690
View File
File diff suppressed because it is too large Load Diff
+5
View File
@@ -0,0 +1,5 @@
module.exports = {
plugins: {
'postcss-preset-mantine': {},
},
};
-2348
View File
File diff suppressed because it is too large Load Diff
-24
View File
@@ -1,24 +0,0 @@
{
"name": "feishin",
"version": "0.12.3",
"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.18.0"
},
"devDependencies": {
"electron": "31.1.0"
},
"license": "GPL-3.0"
}
+51
View File
@@ -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

-9
View File
@@ -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();
});
});
+57 -32
View File
@@ -1,52 +1,61 @@
import { PostProcessorModule, TOptions, StringMap } from 'i18next'; import { PostProcessorModule, StringMap, TOptions } from 'i18next';
import i18n from 'i18next'; import i18n from 'i18next';
import { initReactI18next } from 'react-i18next'; import { initReactI18next } from 'react-i18next';
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 en from './locales/en.json';
import es from './locales/es.json'; import es from './locales/es.json';
import fa from './locales/fa.json';
import fi from './locales/fi.json';
import fr from './locales/fr.json'; import fr from './locales/fr.json';
import ja from './locales/ja.json'; import hu from './locales/hu.json';
import pl from './locales/pl.json'; import id from './locales/id.json';
import zhHans from './locales/zh-Hans.json';
import de from './locales/de.json';
import it from './locales/it.json'; import it from './locales/it.json';
import ru from './locales/ru.json'; import ja from './locales/ja.json';
import ptBr from './locales/pt-BR.json'; import ko from './locales/ko.json';
import sr from './locales/sr.json';
import sv from './locales/sv.json';
import cs from './locales/cs.json';
import nbNO from './locales/nb-NO.json'; import nbNO from './locales/nb-NO.json';
import nl from './locales/nl.json'; import nl from './locales/nl.json';
import zhHant from './locales/zh-Hant.json'; import pl from './locales/pl.json';
import fa from './locales/fa.json'; import ptBr from './locales/pt-BR.json';
import ko from './locales/ko.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 ta from './locales/ta.json';
import id from './locales/id.json'; import tr from './locales/tr.json';
import fi from './locales/fi.json'; import zhHans from './locales/zh-Hans.json';
import hu from './locales/hu.json'; import zhHant from './locales/zh-Hant.json';
const resources = { const resources = {
ca: { translation: ca },
cs: { translation: cs },
de: { translation: de },
en: { translation: en }, en: { translation: en },
es: { translation: es }, es: { translation: es },
de: { translation: de },
it: { translation: it },
ru: { translation: ru },
'pt-BR': { translation: ptBr },
fa: { translation: fa }, fa: { translation: fa },
fi: { translation: fi },
fr: { translation: fr }, fr: { translation: fr },
hu: { translation: hu },
id: { translation: id },
it: { translation: it },
ja: { translation: ja }, ja: { translation: ja },
ko: { translation: ko }, ko: { translation: ko },
'nb-NO': { translation: nbNO },
nl: { translation: nl },
pl: { translation: pl }, pl: { translation: pl },
'zh-Hans': { translation: zhHans }, pt: { translation: pt },
'zh-Hant': { translation: zhHant }, 'pt-BR': { translation: ptBr },
ru: { translation: ru },
sl: { translation: sl },
sr: { translation: sr }, sr: { translation: sr },
sv: { translation: sv }, sv: { translation: sv },
cs: { translation: cs },
nl: { translation: nl },
'nb-NO': { translation: nbNO },
ta: { translation: ta }, ta: { translation: ta },
id: { translation: id }, tr: { translation: tr },
fi: { translation: fi }, 'zh-Hans': { translation: zhHans },
hu: { translation: hu }, 'zh-Hant': { translation: zhHant },
}; };
export const languages = [ export const languages = [
@@ -54,6 +63,10 @@ export const languages = [
label: 'English', label: 'English',
value: 'en', value: 'en',
}, },
{
label: 'Català',
value: 'ca',
},
{ {
label: 'Čeština', label: 'Čeština',
value: 'cs', value: 'cs',
@@ -106,6 +119,10 @@ export const languages = [
label: 'فارسی', label: 'فارسی',
value: 'fa', value: 'fa',
}, },
{
label: 'Português',
value: 'pt',
},
{ {
label: 'Português (Brasil)', label: 'Português (Brasil)',
value: 'pt-BR', value: 'pt-BR',
@@ -118,6 +135,10 @@ export const languages = [
label: 'Русский', label: 'Русский',
value: 'ru', value: 'ru',
}, },
{
label: 'Slovenščina',
value: 'sl',
},
{ {
label: 'Srpski', label: 'Srpski',
value: 'sr', value: 'sr',
@@ -130,6 +151,10 @@ export const languages = [
label: 'Tamil', label: 'Tamil',
value: 'ta', value: 'ta',
}, },
{
label: 'Türkçe',
value: 'tr',
},
{ {
label: '简体中文', label: '简体中文',
value: 'zh-Hans', value: 'zh-Hans',
@@ -141,35 +166,34 @@ export const languages = [
]; ];
const lowerCasePostProcessor: PostProcessorModule = { const lowerCasePostProcessor: PostProcessorModule = {
type: 'postProcessor',
name: 'lowerCase', name: 'lowerCase',
process: (value: string) => { process: (value: string) => {
return value.toLocaleLowerCase(); return value.toLocaleLowerCase();
}, },
type: 'postProcessor',
}; };
const upperCasePostProcessor: PostProcessorModule = { const upperCasePostProcessor: PostProcessorModule = {
type: 'postProcessor',
name: 'upperCase', name: 'upperCase',
process: (value: string) => { process: (value: string) => {
return value.toLocaleUpperCase(); return value.toLocaleUpperCase();
}, },
type: 'postProcessor',
}; };
const titleCasePostProcessor: PostProcessorModule = { const titleCasePostProcessor: PostProcessorModule = {
type: 'postProcessor',
name: 'titleCase', name: 'titleCase',
process: (value: string) => { process: (value: string) => {
return value.replace(/\S\S*/g, (txt) => { return value.replace(/\S\S*/g, (txt) => {
return txt.charAt(0).toLocaleUpperCase() + txt.slice(1).toLowerCase(); return txt.charAt(0).toLocaleUpperCase() + txt.slice(1).toLowerCase();
}); });
}, },
type: 'postProcessor',
}; };
const ignoreSentenceCaseLanguages = ['de']; const ignoreSentenceCaseLanguages = ['de'];
const sentenceCasePostProcessor: PostProcessorModule = { const sentenceCasePostProcessor: PostProcessorModule = {
type: 'postProcessor',
name: 'sentenceCase', name: 'sentenceCase',
process: (value: string, _key: string, _options: TOptions<StringMap>, translator: any) => { process: (value: string, _key: string, _options: TOptions<StringMap>, translator: any) => {
const sentences = value.split('. '); const sentences = value.split('. ');
@@ -185,6 +209,7 @@ const sentenceCasePostProcessor: PostProcessorModule = {
}) })
.join('. '); .join('. ');
}, },
type: 'postProcessor',
}; };
i18n.use(lowerCasePostProcessor) i18n.use(lowerCasePostProcessor)
.use(upperCasePostProcessor) .use(upperCasePostProcessor)
+1 -1
View File
@@ -5,7 +5,7 @@ module.exports = {
createOldCatalogs: true, createOldCatalogs: true,
customValueTemplate: null, customValueTemplate: null,
defaultNamespace: 'translation', defaultNamespace: 'translation',
defaultValue: function (locale, namespace, key, value) { defaultValue: function (locale, namespace, key) {
return key; return key;
}, },
failOnUpdate: false, failOnUpdate: false,
+831
View File
@@ -0,0 +1,831 @@
{
"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": "millos 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"
},
"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"
},
"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",
"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"
},
"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}}"
}
}
+58 -14
View File
@@ -4,7 +4,7 @@
"stop": "zastavit", "stop": "zastavit",
"repeat": "opakovat", "repeat": "opakovat",
"queue_remove": "odebrat vybrané", "queue_remove": "odebrat vybrané",
"playRandom": "přehrát náhodné", "playRandom": "přehrát náhodně",
"skip": "přeskočit", "skip": "přeskočit",
"previous": "předchozí", "previous": "předchozí",
"toggleFullscreenPlayer": "přepnout celoobrazovkový přehrávač", "toggleFullscreenPlayer": "přepnout celoobrazovkový přehrávač",
@@ -124,7 +124,7 @@
"hotkey_toggleShuffle": "přepnutí náhodného přehrávání", "hotkey_toggleShuffle": "přepnutí náhodného přehrávání",
"theme": "motiv", "theme": "motiv",
"playbackStyle_description": "nastavení způsobu přehrávání pro přehrávač zvuku", "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", "mpvExecutablePath": "cesta ke spustitelnému souboru mpv",
"audioDevice": "zvukové zařízení", "audioDevice": "zvukové zařízení",
"hotkey_rate2": "hodnocení 2 hvězdami", "hotkey_rate2": "hodnocení 2 hvězdami",
@@ -171,7 +171,7 @@
"hotkey_zoomOut": "oddálení", "hotkey_zoomOut": "oddálení",
"hotkey_unfavoriteCurrentSong": "zrušení oblíbení u $t(common.currentSong)", "hotkey_unfavoriteCurrentSong": "zrušení oblíbení u $t(common.currentSong)",
"hotkey_rate0": "vymazání hodnocení", "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)", "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", "floatingQueueArea_description": "zobrazit ikonu přejetí myší na pravé straně obrazovky pro zobrazení fronty",
"hotkey_volumeMute": "ztlumení", "hotkey_volumeMute": "ztlumení",
@@ -257,7 +257,30 @@
"translationTargetLanguage": "cílový jazyk překladu", "translationTargetLanguage": "cílový jazyk překladu",
"translationTargetLanguage_description": "cílový jazyk pro překlad", "translationTargetLanguage_description": "cílový jazyk pro překlad",
"lastfmApiKey": "klíč API {{lastfm}}", "lastfmApiKey": "klíč API {{lastfm}}",
"lastfmApiKey_description": "klíč API pro {{lastfm}}. vyžadováno pro obaly alb" "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"
}, },
"action": { "action": {
"editPlaylist": "upravit $t(entity.playlist_one)", "editPlaylist": "upravit $t(entity.playlist_one)",
@@ -365,7 +388,7 @@
"size": "velikost", "size": "velikost",
"biography": "biografie", "biography": "biografie",
"note": "poznámka", "note": "poznámka",
"albumGain": "zisk (gain) alba", "albumGain": "gain alba",
"albumPeak": "vrchol alba", "albumPeak": "vrchol alba",
"close": "zavřít", "close": "zavřít",
"mbid": "ID MusicBrainz", "mbid": "ID MusicBrainz",
@@ -375,14 +398,22 @@
"codec": "kodek", "codec": "kodek",
"trackPeak": "vrchol skladby", "trackPeak": "vrchol skladby",
"preview": "náhled", "preview": "náhled",
"translation": "překlad" "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": { "table": {
"config": { "config": {
"view": { "view": {
"card": "karta", "card": "karta",
"table": "tabulka", "table": "tabulka",
"poster": "plakát" "poster": "plakát",
"list": "seznam",
"grid": "mřížka"
}, },
"general": { "general": {
"displayType": "typ zobrazení", "displayType": "typ zobrazení",
@@ -474,7 +505,9 @@
"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.", "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ě", "networkError": "vyskytla se chyba sítě",
"openError": "nepodařilo se otevřít soubor" "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": { "filter": {
"mostPlayed": "nejvíce přehráváno", "mostPlayed": "nejvíce přehráváno",
@@ -533,7 +566,8 @@
"home": "$t(common.home)", "home": "$t(common.home)",
"artists": "$t(entity.artist_other)", "artists": "$t(entity.artist_other)",
"albumArtists": "$t(entity.albumArtist_other)", "albumArtists": "$t(entity.albumArtist_other)",
"shared": "$t(entity.playlist_other) sdíleny" "shared": "$t(entity.playlist_other) sdíleny",
"myLibrary": "moje knihovna"
}, },
"fullscreenPlayer": { "fullscreenPlayer": {
"config": { "config": {
@@ -568,7 +602,9 @@
"openBrowserDevtools": "otevřít vývojářské nástroje", "openBrowserDevtools": "otevřít vývojářské nástroje",
"quit": "$t(common.quit)", "quit": "$t(common.quit)",
"goBack": "přejít zpět", "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": { "contextMenu": {
"addToPlaylist": "$t(action.addToPlaylist)", "addToPlaylist": "$t(action.addToPlaylist)",
@@ -592,7 +628,9 @@
"playSimilarSongs": "$t(player.playSimilarSongs)", "playSimilarSongs": "$t(player.playSimilarSongs)",
"download": "stáhnout", "download": "stáhnout",
"playShuffled": "$t(player.shuffle)", "playShuffled": "$t(player.shuffle)",
"moveToNext": "$t(action.moveToNext)" "moveToNext": "$t(action.moveToNext)",
"goToAlbum": "přejít na $t(entity.album_one)",
"goToAlbumArtist": "přejít na $t(entity.albumArtist_one)"
}, },
"home": { "home": {
"mostPlayed": "nejpřehrávanější", "mostPlayed": "nejpřehrávanější",
@@ -709,7 +747,8 @@
}, },
"queryEditor": { "queryEditor": {
"input_optionMatchAll": "shoda všeho", "input_optionMatchAll": "shoda všeho",
"input_optionMatchAny": "shoda libovolného" "input_optionMatchAny": "shoda libovolného",
"title": "editor dotazů"
}, },
"lyricSearch": { "lyricSearch": {
"input_name": "$t(common.name)", "input_name": "$t(common.name)",
@@ -728,6 +767,11 @@
"expireInvalid": "čas vypršení musí být v budoucnosti", "expireInvalid": "čas vypršení musí být v budoucnosti",
"setExpiration": "nastavit vypršení", "setExpiration": "nastavit vypršení",
"createFailed": "nepodařilo se vytvořit sdílení (je sdílení povoleno?)" "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": { "entity": {
@@ -747,8 +791,8 @@
"folderWithCount_few": "{{count}} složky", "folderWithCount_few": "{{count}} složky",
"folderWithCount_other": "{{count}} složek", "folderWithCount_other": "{{count}} složek",
"albumArtist_one": "umělec alba", "albumArtist_one": "umělec alba",
"albumArtist_few": "umělci alba", "albumArtist_few": "umělci alb",
"albumArtist_other": "umělců alba", "albumArtist_other": "umělci alb",
"track_one": "skladba", "track_one": "skladba",
"track_few": "skladby", "track_few": "skladby",
"track_other": "skladby", "track_other": "skladby",
+45 -12
View File
@@ -20,7 +20,8 @@
"openIn": { "openIn": {
"lastfm": "In Last.fm öffnen", "lastfm": "In Last.fm öffnen",
"musicbrainz": "In MusicBrainz öffnen" "musicbrainz": "In MusicBrainz öffnen"
} },
"moveToNext": "nach unten verschieben"
}, },
"common": { "common": {
"backward": "rückwärts", "backward": "rückwärts",
@@ -113,7 +114,12 @@
"trackPeak": "Track-Spitzenpegel", "trackPeak": "Track-Spitzenpegel",
"codec": "Codec", "codec": "Codec",
"albumPeak": "Album-Spitzenpegel", "albumPeak": "Album-Spitzenpegel",
"albumGain": "Album-Pegelverstärkung" "albumGain": "Album-Pegelverstärkung",
"tags": "tags",
"viewReleaseNotes": "Release Notes anzeigen",
"newVersion": "eine neue Version wurde installiert ({{version}})",
"bitDepth": "Bittiefe",
"sampleRate": "Abtastrate"
}, },
"error": { "error": {
"remotePortWarning": "Starten Sie den Server neu, um den neuen Port anzuwenden", "remotePortWarning": "Starten Sie den Server neu, um den neuen Port anzuwenden",
@@ -137,7 +143,9 @@
"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.", "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", "networkError": "ein Netzwerkfehler ist aufgetreten",
"openError": "datei kann nicht geöffnet werden" "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": { "filter": {
"mostPlayed": "Meistgespielt", "mostPlayed": "Meistgespielt",
@@ -237,7 +245,8 @@
"description": "Beschreibung", "description": "Beschreibung",
"setExpiration": "Ablaufdatum setzen", "setExpiration": "Ablaufdatum setzen",
"expireInvalid": "Ablaufdatum muss in der Zukunft liegen", "expireInvalid": "Ablaufdatum muss in der Zukunft liegen",
"allowDownloading": "Herunterladen zulassen" "allowDownloading": "Herunterladen zulassen",
"success": "Link in die Zwischenablage kopiert (oder hier klicken um zu öffnen)"
} }
}, },
"entity": { "entity": {
@@ -357,12 +366,15 @@
"lyricAlignment": "Songtext-Ausrichtung", "lyricAlignment": "Songtext-Ausrichtung",
"useImageAspectRatio": "Bildseitenverhältnis verwenden", "useImageAspectRatio": "Bildseitenverhältnis verwenden",
"lyricGap": "Songtext-Lücke", "lyricGap": "Songtext-Lücke",
"dynamicIsImage": "Hintergrundbild aktivieren" "dynamicIsImage": "Hintergrundbild aktivieren",
"dynamicImageBlur": "Größe der Bildunschärfe",
"lyricOffset": "Zeitversetzung des Liedtexts (ms)"
}, },
"upNext": "als nächstes", "upNext": "als nächstes",
"lyrics": "Songtexte", "lyrics": "Songtexte",
"related": "Ähnliche", "related": "Ähnliche",
"noLyrics": "Keine Liedtexte gefunden" "noLyrics": "Keine Liedtexte gefunden",
"visualizer": "visualizer"
}, },
"appMenu": { "appMenu": {
"selectServer": "Server auswählen", "selectServer": "Server auswählen",
@@ -415,7 +427,8 @@
"removeFromQueue": "$t(action.removeFromQueue)", "removeFromQueue": "$t(action.removeFromQueue)",
"playShuffled": "$t(player.shuffle)", "playShuffled": "$t(player.shuffle)",
"download": "Download", "download": "Download",
"playSimilarSongs": "$t(player.playSimilarSongs)" "playSimilarSongs": "$t(player.playSimilarSongs)",
"moveToNext": "$t(action.moveToNext)"
}, },
"sidebar": { "sidebar": {
"nowPlaying": "läuft gerade", "nowPlaying": "läuft gerade",
@@ -429,7 +442,8 @@
"home": "$t(common.home)", "home": "$t(common.home)",
"artists": "$t(entity.artist_other)", "artists": "$t(entity.artist_other)",
"albumArtists": "$t(entity.albumArtist_other)", "albumArtists": "$t(entity.albumArtist_other)",
"shared": "$t(entity.playlist_other) geteilt" "shared": "$t(entity.playlist_other) geteilt",
"myLibrary": "meine bibliothek"
}, },
"setting": { "setting": {
"playbackTab": "Wiedergabe", "playbackTab": "Wiedergabe",
@@ -513,10 +527,11 @@
"unfavorite": "Aus Favoriten entfernen", "unfavorite": "Aus Favoriten entfernen",
"skip_forward": "Vorspulen", "skip_forward": "Vorspulen",
"skip": "Überspringen", "skip": "Überspringen",
"playSimilarSongs": "Ähnliche Lieder abspielen" "playSimilarSongs": "Ähnliche Lieder abspielen",
"viewQueue": "Warteschlange anzeigen"
}, },
"setting": { "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", "audioExclusiveMode": "Audio-Exklusivmodus",
"audioDevice": "Audiogerät", "audioDevice": "Audiogerät",
"accentColor": "Akzentfarbe", "accentColor": "Akzentfarbe",
@@ -670,12 +685,30 @@
"windowBarStyle_description": "Wähle den Stil der Windows-Leiste", "windowBarStyle_description": "Wähle den Stil der Windows-Leiste",
"hotkey_toggleCurrentSongFavorite": "$t(common.currentSong) zu Favoriten hinzufügen", "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", "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", "clearCache": "Browser-Zwischenspeicher löschen",
"clearQueryCache": "feishins Zwischenspeicher leeren", "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", "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", "sidePlayQueueStyle": "Wiedergabelistenstil in der Seitenleiste",
"zoom_description": "Setzt den Zoom (in %) für das Programm", "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"
} }
} }
+45 -1
View File
@@ -27,12 +27,16 @@
"action_one": "action", "action_one": "action",
"action_other": "actions", "action_other": "actions",
"add": "add", "add": "add",
"additionalParticipants": "additional participants",
"newVersion": "a new version has been installed ({{version}})",
"viewReleaseNotes": "view release notes",
"albumGain": "album gain", "albumGain": "album gain",
"albumPeak": "album peak", "albumPeak": "album peak",
"areYouSure": "are you sure?", "areYouSure": "are you sure?",
"ascending": "ascending", "ascending": "ascending",
"backward": "backward", "backward": "backward",
"biography": "biography", "biography": "biography",
"bitDepth": "bit depth",
"bitrate": "bitrate", "bitrate": "bitrate",
"bpm": "bpm", "bpm": "bpm",
"cancel": "cancel", "cancel": "cancel",
@@ -96,6 +100,7 @@
"resetToDefault": "reset to default", "resetToDefault": "reset to default",
"restartRequired": "restart required", "restartRequired": "restart required",
"right": "right", "right": "right",
"sampleRate": "sample rate",
"save": "save", "save": "save",
"saveAndReplace": "save and replace", "saveAndReplace": "save and replace",
"saveAs": "save as", "saveAs": "save as",
@@ -106,6 +111,7 @@
"share": "share", "share": "share",
"size": "size", "size": "size",
"sortOrder": "order", "sortOrder": "order",
"tags": "tags",
"title": "title", "title": "title",
"trackNumber": "track", "trackNumber": "track",
"trackGain": "track gain", "trackGain": "track gain",
@@ -158,6 +164,7 @@
"audioDeviceFetchError": "an error occurred when trying to get audio devices", "audioDeviceFetchError": "an error occurred when trying to get audio devices",
"authenticationFailed": "authentication failed", "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.", "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", "credentialsRequired": "credentials required",
"endpointNotImplementedError": "endpoint {{endpoint}} is not implemented for {{serverType}}", "endpointNotImplementedError": "endpoint {{endpoint}} is not implemented for {{serverType}}",
"genericError": "an error occurred", "genericError": "an error occurred",
@@ -166,6 +173,7 @@
"loginRateError": "too many login attempts, please try again in a few seconds", "loginRateError": "too many login attempts, please try again in a few seconds",
"mpvRequired": "MPV required", "mpvRequired": "MPV required",
"networkError": "a network error occurred", "networkError": "a network error occurred",
"notificationDenied": "permissions for notifications were denied. this setting has no effect",
"openError": "could not open file", "openError": "could not open file",
"playbackError": "an error occurred when trying to play the media", "playbackError": "an error occurred when trying to play the media",
"remoteDisableError": "an error occurred when trying to $t(common.disable) the remote server", "remoteDisableError": "an error occurred when trying to $t(common.disable) the remote server",
@@ -265,6 +273,7 @@
"title": "lyric search" "title": "lyric search"
}, },
"queryEditor": { "queryEditor": {
"title": "query editor",
"input_optionMatchAll": "match all", "input_optionMatchAll": "match all",
"input_optionMatchAny": "match any" "input_optionMatchAny": "match any"
}, },
@@ -279,6 +288,11 @@
"updateServer": { "updateServer": {
"success": "server updated successfully", "success": "server updated successfully",
"title": "update server" "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": { "page": {
@@ -312,6 +326,8 @@
"goBack": "go back", "goBack": "go back",
"goForward": "go forward", "goForward": "go forward",
"manageServers": "manage servers", "manageServers": "manage servers",
"privateModeOff": "turn off private mode",
"privateModeOn": "turn on private mode",
"openBrowserDevtools": "open browser devtools", "openBrowserDevtools": "open browser devtools",
"quit": "$t(common.quit)", "quit": "$t(common.quit)",
"selectServer": "select server", "selectServer": "select server",
@@ -348,6 +364,8 @@
"setRating": "$t(action.setRating)", "setRating": "$t(action.setRating)",
"playShuffled": "$t(player.shuffle)", "playShuffled": "$t(player.shuffle)",
"shareItem": "share item", "shareItem": "share item",
"goToAlbum": "go to $t(entity.album_one)",
"goToAlbumArtist": "go to $t(entity.albumArtist_one)",
"showDetails": "get info" "showDetails": "get info"
}, },
"fullscreenPlayer": { "fullscreenPlayer": {
@@ -418,6 +436,7 @@
"folders": "$t(entity.folder_other)", "folders": "$t(entity.folder_other)",
"genres": "$t(entity.genre_other)", "genres": "$t(entity.genre_other)",
"home": "$t(common.home)", "home": "$t(common.home)",
"myLibrary": "my library",
"nowPlaying": "now playing", "nowPlaying": "now playing",
"playlists": "$t(entity.playlist_other)", "playlists": "$t(entity.playlist_other)",
"search": "$t(common.search)", "search": "$t(common.search)",
@@ -507,14 +526,22 @@
"disableLibraryUpdateOnStartup": "disable checking for new versions on startup", "disableLibraryUpdateOnStartup": "disable checking for new versions on startup",
"discordApplicationId": "{{discord}} application id", "discordApplicationId": "{{discord}} application id",
"discordApplicationId_description": "the application id for {{discord}} rich presence (defaults to {{defaultId}})", "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": "show rich presence idle status",
"discordIdleStatus_description": "when enabled, update status while player is idle", "discordIdleStatus_description": "when enabled, update status while player is idle",
"discordListening": "show status as listening", "discordListening": "show status as listening",
"discordListening_description": "show status as listening instead of playing", "discordListening_description": "show status as listening instead of playing",
"discordRichPresence": "{{discord}} rich presence", "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",
"discordUpdateInterval": "{{discord}} rich presence update interval", "discordUpdateInterval": "{{discord}} rich presence update interval",
"discordUpdateInterval_description": "the time in seconds between each update (minimum 15 seconds)", "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)",
"doubleClickBehavior": "queue all searched tracks when double clicking", "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", "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": "enable remote control server",
@@ -527,6 +554,8 @@
"floatingQueueArea_description": "display a hover icon on the right side of the screen to view the play queue", "floatingQueueArea_description": "display a hover icon on the right side of the screen to view the play queue",
"followLyric": "follow current lyric", "followLyric": "follow current lyric",
"followLyric_description": "scroll the lyric to the current playing position", "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": "font",
"font_description": "sets the font to use for the application", "font_description": "sets the font to use for the application",
"fontType": "font type", "fontType": "font type",
@@ -551,6 +580,7 @@
"hotkey_favoritePreviousSong": "favorite $t(common.previousSong)", "hotkey_favoritePreviousSong": "favorite $t(common.previousSong)",
"hotkey_globalSearch": "global search", "hotkey_globalSearch": "global search",
"hotkey_localSearch": "in-page search", "hotkey_localSearch": "in-page search",
"hotkey_navigateHome": "navigate to home",
"hotkey_playbackNext": "next track", "hotkey_playbackNext": "next track",
"hotkey_playbackPause": "pause", "hotkey_playbackPause": "pause",
"hotkey_playbackPlay": "play", "hotkey_playbackPlay": "play",
@@ -582,6 +612,8 @@
"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", "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": "language",
"language_description": "sets the language for the application ($t(common.restartRequired))", "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": "{{lastfm}} API key",
"lastfmApiKey_description": "the API key for {{lastfm}}. required for cover art", "lastfmApiKey_description": "the API key for {{lastfm}}. required for cover art",
"lyricFetch": "fetch lyrics from the internet", "lyricFetch": "fetch lyrics from the internet",
@@ -590,6 +622,8 @@
"lyricFetchProvider_description": "select the providers to fetch lyrics from. the order of the providers is the order in which they will be queried", "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": "lyric offset (ms)",
"lyricOffset_description": "offset the lyric by the specified amount of milliseconds", "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": "minimize to tray",
"minimizeToTray_description": "minimize the application to the system tray", "minimizeToTray_description": "minimize the application to the system tray",
"minimumScrobblePercentage": "minimum scrobble duration (percentage)", "minimumScrobblePercentage": "minimum scrobble duration (percentage)",
@@ -600,6 +634,10 @@
"mpvExecutablePath_description": "sets the path to the mpv executable. if left empty, the default path will be used", "mpvExecutablePath_description": "sets the path to the mpv executable. if left empty, the default path will be used",
"mpvExtraParameters": "mpv parameters", "mpvExtraParameters": "mpv parameters",
"mpvExtraParameters_help": "one per line", "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": "passwords/secret store",
"passwordStore_description": "what password/secret store to use. change this if you are having issues storing passwords.", "passwordStore_description": "what password/secret store to use. change this if you are having issues storing passwords.",
"playbackStyle": "playback style", "playbackStyle": "playback style",
@@ -659,6 +697,8 @@
"skipPlaylistPage_description": "when navigating to a playlist, go to the playlist song list page instead of the default page", "skipPlaylistPage_description": "when navigating to a playlist, go to the playlist song list page instead of the default page",
"startMinimized": "start minimized", "startMinimized": "start minimized",
"startMinimized_description": "start the application in system tray", "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": "theme",
"theme_description": "sets the theme to use for the application", "theme_description": "sets the theme to use for the application",
"themeDark": "theme (dark)", "themeDark": "theme (dark)",
@@ -688,6 +728,8 @@
"volumeWidth_description": "the width of the volume slider", "volumeWidth_description": "the width of the volume slider",
"webAudio": "use web audio", "webAudio": "use web audio",
"webAudio_description": "use web audio. this enables advanced features like replaygain. disable if you experience otherwise", "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": "window bar style",
"windowBarStyle_description": "select the style of the window bar", "windowBarStyle_description": "select the style of the window bar",
"zoom": "zoom percentage", "zoom": "zoom percentage",
@@ -763,6 +805,8 @@
}, },
"view": { "view": {
"card": "card", "card": "card",
"grid": "grid",
"list": "list",
"poster": "poster", "poster": "poster",
"table": "table" "table": "table"
} }
+107 -63
View File
@@ -21,8 +21,8 @@
"repeat_off": "repetir desactivado", "repeat_off": "repetir desactivado",
"queue_clear": "limpiar cola", "queue_clear": "limpiar cola",
"muted": "silenciado", "muted": "silenciado",
"unfavorite": "no favorito", "unfavorite": "no favorita",
"queue_moveToTop": "mover seleccionado al fondo", "queue_moveToTop": "mover seleccionado al final",
"queue_moveToBottom": "mover seleccionado al principio", "queue_moveToBottom": "mover seleccionado al principio",
"shuffle_off": "mezclar desactivado", "shuffle_off": "mezclar desactivado",
"addLast": "añadir último", "addLast": "añadir último",
@@ -37,7 +37,7 @@
"remotePort_description": "establece el puerto para el control remoto del servidor", "remotePort_description": "establece el puerto para el control remoto del servidor",
"hotkey_skipBackward": "retroceder", "hotkey_skipBackward": "retroceder",
"replayGainMode_description": "ajusta el volumen de ganancia acorde a los valores de {{ReplayGain}} almacenados en los metadatos del archivo", "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", "theme_description": "establece el tema a usar por la aplicación",
"hotkey_playbackPause": "pausa", "hotkey_playbackPause": "pausa",
"replayGainFallback": "{{ReplayGain}} alternativa", "replayGainFallback": "{{ReplayGain}} alternativa",
@@ -68,7 +68,7 @@
"scrobble_description": "hace scrobble de las reproducciones en tu servidor de medios", "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", "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}}", "discordUpdateInterval": "intervalo de actualización del estado de actividad de {{discord}}",
"themeLight": "tema (luminoso)", "themeLight": "tema (claro)",
"fontType_optionBuiltIn": "fuente incorporada", "fontType_optionBuiltIn": "fuente incorporada",
"hotkey_playbackPlayPause": "play / pausa", "hotkey_playbackPlayPause": "play / pausa",
"hotkey_rate1": "calificar con 1 estrella", "hotkey_rate1": "calificar con 1 estrella",
@@ -82,8 +82,8 @@
"hotkey_playbackPlay": "reproducir", "hotkey_playbackPlay": "reproducir",
"hotkey_togglePreviousSongFavorite": "cambia $t(common.previousSong) a favorito", "hotkey_togglePreviousSongFavorite": "cambia $t(common.previousSong) a favorito",
"hotkey_volumeDown": "bajar volumen", "hotkey_volumeDown": "bajar volumen",
"hotkey_unfavoritePreviousSong": "$t(common.previousSong) no favorito", "hotkey_unfavoritePreviousSong": "$t(common.previousSong) no favorita",
"audioPlayer_description": "selecciona el reproductor de audio a usar en la reproducción", "audioPlayer_description": "selecciona el reproductor de audio a usar durante la reproducción",
"globalMediaHotkeys": "teclas de acceso rápido globales a medios", "globalMediaHotkeys": "teclas de acceso rápido globales a medios",
"hotkey_globalSearch": "búsqueda global", "hotkey_globalSearch": "búsqueda global",
"gaplessAudio_description": "establece la configuración de audio sin pausas para mpv", "gaplessAudio_description": "establece la configuración de audio sin pausas para mpv",
@@ -106,11 +106,11 @@
"font": "fuente", "font": "fuente",
"mpvExtraParameters": "parámetros de mpv", "mpvExtraParameters": "parámetros de mpv",
"replayGainMode_optionTrack": "$t(entity.track_one)", "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_toggleFullScreenPlayer": "cambia el reproductor a pantalla completa",
"hotkey_localSearch": "búsqueda en la página", "hotkey_localSearch": "búsqueda en la página",
"hotkey_toggleQueue": "cambia la cola", "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_rate5": "calificar con 5 estrellas",
"hotkey_playbackPrevious": "pista anterior", "hotkey_playbackPrevious": "pista anterior",
"showSkipButtons_description": "muestra o esconde los botones de saltar en la barra del reproductor", "showSkipButtons_description": "muestra o esconde los botones de saltar en la barra del reproductor",
@@ -120,13 +120,13 @@
"hotkey_toggleShuffle": "alterna aleatorio", "hotkey_toggleShuffle": "alterna aleatorio",
"theme": "tema", "theme": "tema",
"playbackStyle_description": "selecciona el estilo de reproducción a usar por el reproductor de audio", "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", "mpvExecutablePath": "ruta del ejecutable mpv",
"audioDevice": "dispositivo de audio", "audioDevice": "dispositivo de audio",
"hotkey_rate2": "calificar con 2 estrellas", "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", "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", "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", "hotkey_rate4": "calificar con 4 estrellas",
"enableRemote": "activar control remoto del servidor", "enableRemote": "activar control remoto del servidor",
"showSkipButton_description": "muestra o esconde los botones de saltar en la barra del reproductor", "showSkipButton_description": "muestra o esconde los botones de saltar en la barra del reproductor",
@@ -142,13 +142,13 @@
"replayGainFallback_description": "ganancia en db a aplicar si el archivo no tiene etiquetas de {{ReplayGain}}", "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}}", "replayGainPreamp_description": "ajusta la ganancia del preamplificador aplicada a los valores de {{ReplayGain}}",
"hotkey_toggleRepeat": "alterna repetir", "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", "sidebarConfiguration_description": "selecciona los elementos y el orden en que aparecerán en la barra lateral",
"fontType": "tipo de fuente", "fontType": "tipo de fuente",
"remotePort": "puerto del control remoto del servidor", "remotePort": "puerto del control remoto del servidor",
"applicationHotkeys": "teclas de acceso rápido de la aplicación", "applicationHotkeys": "teclas de acceso rápido de la aplicación",
"hotkey_playbackNext": "pista siguiente", "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)", "playButtonBehavior_optionAddNext": "$t(player.addNext)",
"lyricFetch_description": "busca letras en varias fuentes de Internet", "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", "lyricFetchProvider_description": "selecciona los proveedores para buscar letras. el orden de los proveedores es el orden en el que se consultarán",
@@ -160,13 +160,13 @@
"sidePlayQueueStyle_optionDetached": "separada", "sidePlayQueueStyle_optionDetached": "separada",
"audioPlayer": "reproductor de audio", "audioPlayer": "reproductor de audio",
"hotkey_zoomOut": "reducir", "hotkey_zoomOut": "reducir",
"hotkey_unfavoriteCurrentSong": "$t(common.currentSong) no favorito", "hotkey_unfavoriteCurrentSong": "$t(common.currentSong) no favorita",
"hotkey_rate0": "Limpiar calificación", "hotkey_rate0": "Limpiar calificación",
"discordApplicationId": "id de aplicación {{discord}}", "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)", "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", "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_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", "remoteUsername": "nombre de usuario del control remoto del servidor",
"showSkipButton": "mostrar botones de saltar", "showSkipButton": "mostrar botones de saltar",
"sidebarPlaylistList": "listas de reproducción de la barra lateral", "sidebarPlaylistList": "listas de reproducción de la barra lateral",
@@ -195,12 +195,12 @@
"hotkey_browserBack": "retroceso", "hotkey_browserBack": "retroceso",
"clearCache": "Limpiar la caché del navegador", "clearCache": "Limpiar la caché del navegador",
"clearQueryCache": "Limpiar la caché de Feishin", "clearQueryCache": "Limpiar la caché de Feishin",
"clearQueryCache_description": "Una 'limpieza suave' de Feishin. Esto refrescará las listas de reproducción, metadatos de pistas y restablecerá las letras guardadas. Se mantienen los ajustes, credenciales del servidor y las imágenes en caché", "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", "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", "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", "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. cambie esta opción si tiene problemas para guardar contraseñas.", "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": "iniciar la aplicación en la bandeja del sistema", "startMinimized_description": "inicia la aplicación en la bandeja del sistema",
"startMinimized": "iniciar minimizado", "startMinimized": "iniciar minimizado",
"passwordStore": "contraseñas/almacenamiento secreto", "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_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",
@@ -208,8 +208,8 @@
"homeConfiguration": "Configuración de la página de inicio", "homeConfiguration": "Configuración de la página de inicio",
"mpvExtraParameters_help": "Uno por línea", "mpvExtraParameters_help": "Uno por línea",
"genreBehavior": "Comportamiento predeterminado de la página de géneros", "genreBehavior": "Comportamiento predeterminado de la página de géneros",
"externalLinks_description": "Permite mostrar enlaces externos (Last.fm, MusicBrainz) en páginas de artista/álbum", "externalLinks_description": "Permite mostrar enlaces externos (Last.fm, MusicBrainz) en las páginas del artista/álbum",
"genreBehavior_description": "Determina si al pulsar en un género se abre por defecto la lista de pistas o de álbumes", "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", "homeConfiguration_description": "Configura qué elementos son mostrados y en qué orden en la página de inicio",
"clearCacheSuccess": "Caché limpiada correctamente", "clearCacheSuccess": "Caché limpiada correctamente",
"externalLinks": "Mostrar enlaces externos", "externalLinks": "Mostrar enlaces externos",
@@ -218,15 +218,15 @@
"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_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", "imageAspectRatio": "Usar relación de aspecto nativa de portada",
"doubleClickBehavior": "poner en cola todas las pistas buscadas al hacer doble clic", "doubleClickBehavior": "poner en cola todas las pistas buscadas al hacer doble clic",
"doubleClickBehavior_description": "si es true, se pondrán en cola todas las pistas que coincidan en una búsqueda de pistas. De lo contrario, solo se pondrá en cola la pista seleccionada", "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": "Ancho del deslizador de volumen",
"volumeWidth_description": "La anchura del deslizador de volumen", "volumeWidth_description": "La anchura del deslizador de volumen",
"discordListening_description": "mostrar el estado como escuchando en lugar de jugando", "discordListening_description": "muestra el estado como Escuchando en lugar de Jugando a",
"discordListening": "Mostrar estado como escuchando", "discordListening": "Mostrar estado como escuchando",
"contextMenu": "Configuración del menú de contexto (clic derecho)", "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", "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": "Habilitar CSS personalizado",
"customCssEnable_description": "Permite la escritura de CSS personalizado.", "customCssEnable_description": "Permite escribir CSS personalizado.",
"customCss": "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.", "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.", "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.",
@@ -236,20 +236,20 @@
"transcode_description": "permite la transcodificación a distintos formatos", "transcode_description": "permite la transcodificación a distintos formatos",
"transcodeBitrate": "tasa de bits a transcodificar", "transcodeBitrate": "tasa de bits a transcodificar",
"transcodeBitrate_description": "selecciona el bitrate a transcodificar. 0 significa dejar que el servidor elija", "transcodeBitrate_description": "selecciona el bitrate a transcodificar. 0 significa dejar que el servidor elija",
"transcodeNote": "Se mostrará después de 1 (web) - 2 (mpv) pistas", "transcodeNote": "tendrá efecto después de 1 (web) - 2 (mpv) canciones",
"transcodeFormat": "formato a transcodificar", "transcodeFormat": "formato a transcodificar",
"transcodeFormat_description": "selecciona el formato a transcodificar. dejar vacío para que el servidor decida", "transcodeFormat_description": "selecciona el formato a transcodificar. dejar vacío para que el servidor decida",
"albumBackground": "imagen de fondo del álbum", "albumBackground": "imagen de fondo del álbum",
"albumBackground_description": "Agregar una imagen de fondo a las páginas del álbum que contienen la carátula 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": "Tamaño de desenfoque de la imagen de fondo del álbum",
"albumBackgroundBlur_description": "Ajustar el nivel 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": "Cambiar la barra del reproductor a pantalla completa",
"playerbarOpenDrawer_description": "Permitir hacer clic en la barra del reproductor para abrir el reproductor en 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": "Configuración de la página del artista del álbum",
"artistConfiguration_description": "Configurar qué elementos se muestran y en qué orden en 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)", "playButtonBehavior_optionPlayShuffled": "$t(player.shuffle)",
"trayEnabled": "Mostrar en el área de notificación", "trayEnabled": "Mostrar en el área de notificación",
"trayEnabled_description": "mostrar/ocultar el icono/menú del área de notificación. si está deshabilitado, también deshabilita minimizar/salir a la bandeja", "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": "Proveedor de API de traducción",
"translationApiProvider_description": "Proveedor de API para traducción", "translationApiProvider_description": "Proveedor de API para traducción",
"translationApiKey": "clave api de traducción", "translationApiKey": "clave api de traducción",
@@ -257,7 +257,30 @@
"translationTargetLanguage": "idioma final de la traducción", "translationTargetLanguage": "idioma final de la traducción",
"translationTargetLanguage_description": "lengua de destino 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_description": "la clave API para {{lastfm}}. Requerida para la portada",
"lastfmApiKey": "Clave API para {{lastfm}}" "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",
"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"
}, },
"action": { "action": {
"editPlaylist": "editar $t(entity.playlist_one)", "editPlaylist": "editar $t(entity.playlist_one)",
@@ -273,7 +296,7 @@
"deletePlaylist": "eliminar $t(entity.playlist_one)", "deletePlaylist": "eliminar $t(entity.playlist_one)",
"removeFromQueue": "eliminar de la cola", "removeFromQueue": "eliminar de la cola",
"deselectAll": "desmarcar todo", "deselectAll": "desmarcar todo",
"moveToBottom": "mover al fondo", "moveToBottom": "mover al final",
"setRating": "establecer calificación", "setRating": "establecer calificación",
"toggleSmartPlaylistEditor": "cambiar editor $t(entity.smartPlaylist)", "toggleSmartPlaylistEditor": "cambiar editor $t(entity.smartPlaylist)",
"removeFromFavorites": "eliminar de $t(entity.favorite_other)", "removeFromFavorites": "eliminar de $t(entity.favorite_other)",
@@ -296,7 +319,7 @@
"left": "izquierda", "left": "izquierda",
"save": "guardar", "save": "guardar",
"right": "derecha", "right": "derecha",
"currentSong": "actual $t(entity.track_one)", "currentSong": "$t(entity.track_one) actual",
"collapse": "contraer", "collapse": "contraer",
"trackNumber": "pista", "trackNumber": "pista",
"descending": "descendiente", "descending": "descendiente",
@@ -334,7 +357,7 @@
"saveAndReplace": "guardar y reemplazar", "saveAndReplace": "guardar y reemplazar",
"playerMustBePaused": "el reproductor debe pausarse", "playerMustBePaused": "el reproductor debe pausarse",
"confirm": "confirmar", "confirm": "confirmar",
"resetToDefault": "restablecer a valor por defecto", "resetToDefault": "restablecer al valor predeterminado",
"home": "inicio", "home": "inicio",
"comingSoon": "próximamente…", "comingSoon": "próximamente…",
"reset": "restablecer", "reset": "restablecer",
@@ -365,8 +388,8 @@
"channel_one": "Canal", "channel_one": "Canal",
"channel_many": "Canales", "channel_many": "Canales",
"channel_other": "Canales", "channel_other": "Canales",
"trackPeak": "la más alta de la canción", "trackPeak": "pico de pista",
"albumPeak": "lo más destacado del álbum", "albumPeak": "pico del álbum",
"albumGain": "Ganancia de álbum", "albumGain": "Ganancia de álbum",
"mbid": "ID de MusicBrainz", "mbid": "ID de MusicBrainz",
"codec": "Códec", "codec": "Códec",
@@ -375,7 +398,13 @@
"share": "Compartir", "share": "Compartir",
"trackGain": "Ganancia de pista", "trackGain": "Ganancia de pista",
"preview": "Vista previa", "preview": "Vista previa",
"translation": "traducción" "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": { "error": {
"remotePortWarning": "reiniciar el servidor para aplicar el nuevo puerto", "remotePortWarning": "reiniciar el servidor para aplicar el nuevo puerto",
@@ -397,13 +426,15 @@
"audioDeviceFetchError": "un error ocurrió cuando se intentó obtener los dispositivos de audio", "audioDeviceFetchError": "un error ocurrió cuando se intentó obtener los dispositivos de audio",
"invalidServer": "servidor inválido", "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 tiene una canción en el nivel superior de su carpeta de música. Jellyfin solo agrupa pistas si están en una carpeta.", "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", "networkError": "Ocurrió un error de red",
"openError": "No se pudo abrir el archivo" "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": { "filter": {
"mostPlayed": "más reproducido", "mostPlayed": "más reproducido",
"isCompilation": "es compilación", "isCompilation": "es una compilación",
"recentlyPlayed": "recientemente reproducido", "recentlyPlayed": "recientemente reproducido",
"isRated": "es clasificado", "isRated": "es clasificado",
"title": "título", "title": "título",
@@ -434,7 +465,7 @@
"criticRating": "calificación de la crítica", "criticRating": "calificación de la crítica",
"trackNumber": "pista", "trackNumber": "pista",
"comment": "comentarios", "comment": "comentarios",
"playCount": "número de reproducción", "playCount": "número de reproducciones",
"recentlyUpdated": "actualizado recientemente", "recentlyUpdated": "actualizado recientemente",
"channels": "$t(common.channel_other)", "channels": "$t(common.channel_other)",
"owner": "$t(common.owner)", "owner": "$t(common.owner)",
@@ -458,7 +489,8 @@
"home": "$t(common.home)", "home": "$t(common.home)",
"artists": "$t(entity.artist_other)", "artists": "$t(entity.artist_other)",
"albumArtists": "$t(entity.albumArtist_other)", "albumArtists": "$t(entity.albumArtist_other)",
"shared": "compartido $t(entity.playlist_other)" "shared": "compartido $t(entity.playlist_other)",
"myLibrary": "Mi biblioteca"
}, },
"appMenu": { "appMenu": {
"selectServer": "seleccionar servidor", "selectServer": "seleccionar servidor",
@@ -470,7 +502,9 @@
"openBrowserDevtools": "abrir herramientas de desarrollador del navegador", "openBrowserDevtools": "abrir herramientas de desarrollador del navegador",
"quit": "$t(common.quit)", "quit": "$t(common.quit)",
"goBack": "retroceder", "goBack": "retroceder",
"goForward": "avanzar" "goForward": "avanzar",
"privateModeOff": "Apagar modo privado",
"privateModeOn": "Encender modo privado"
}, },
"contextMenu": { "contextMenu": {
"addToPlaylist": "$t(action.addToPlaylist)", "addToPlaylist": "$t(action.addToPlaylist)",
@@ -494,14 +528,16 @@
"playSimilarSongs": "$t(player.playSimilarSongs)", "playSimilarSongs": "$t(player.playSimilarSongs)",
"download": "descargar", "download": "descargar",
"playShuffled": "$t(player.shuffle)", "playShuffled": "$t(player.shuffle)",
"moveToNext": "$t(action.moveToNext)" "moveToNext": "$t(action.moveToNext)",
"goToAlbum": "Ir a $t(entity.album_one)",
"goToAlbumArtist": "Ir a $t(entity.albumArtist_one)"
}, },
"home": { "home": {
"mostPlayed": "más reproducidos", "mostPlayed": "más reproducidos",
"newlyAdded": "nuevos lanzamientos añadidos", "newlyAdded": "nuevos lanzamientos añadidos",
"title": "$t(common.home)", "title": "$t(common.home)",
"explore": "explorar desde tu biblioteca", "explore": "explora desde tu biblioteca",
"recentlyPlayed": "recientemente reproducidos" "recentlyPlayed": "reproducidos recientemente"
}, },
"fullscreenPlayer": { "fullscreenPlayer": {
"upNext": "siguiente", "upNext": "siguiente",
@@ -519,7 +555,7 @@
"lyricGap": "desfase de letra", "lyricGap": "desfase de letra",
"dynamicImageBlur": "tamaño de desenfoque de imagen", "dynamicImageBlur": "tamaño de desenfoque de imagen",
"dynamicIsImage": "habilitar imagen de fondo", "dynamicIsImage": "habilitar imagen de fondo",
"lyricOffset": "compensación de letras (ms)" "lyricOffset": "desplazamiento de letras (ms)"
}, },
"lyrics": "letras", "lyrics": "letras",
"related": "relacionado", "related": "relacionado",
@@ -529,7 +565,7 @@
"albumDetail": { "albumDetail": {
"moreFromArtist": "más de este $t(entity.artist_one)", "moreFromArtist": "más de este $t(entity.artist_one)",
"moreFromGeneric": "más de {{item}}", "moreFromGeneric": "más de {{item}}",
"released": "publicado" "released": "publicado el"
}, },
"setting": { "setting": {
"playbackTab": "reproducción", "playbackTab": "reproducción",
@@ -549,7 +585,7 @@
"trackList": { "trackList": {
"title": "$t(entity.track_other)", "title": "$t(entity.track_other)",
"genreTracks": "\"{{genre}}\" $t(entity.track_other)", "genreTracks": "\"{{genre}}\" $t(entity.track_other)",
"artistTracks": "pistas por {{artist}}" "artistTracks": "Pistas de {{artist}}"
}, },
"globalSearch": { "globalSearch": {
"commands": { "commands": {
@@ -565,11 +601,11 @@
"albumList": { "albumList": {
"title": "$t(entity.album_other)", "title": "$t(entity.album_other)",
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)", "genreAlbums": "\"{{genre}}\" $t(entity.album_other)",
"artistAlbums": "álbumes de {{artist}}" "artistAlbums": "Álbumes de {{artist}}"
}, },
"albumArtistDetail": { "albumArtistDetail": {
"viewAllTracks": "ver todo de $t(entity.track_other)", "viewAllTracks": "ver todas las $t(entity.track_other)",
"relatedArtists": "$t(entity.artist_other) similar", "relatedArtists": "$t(entity.artist_other) similares",
"topSongs": "mejores canciones", "topSongs": "mejores canciones",
"topSongsFrom": "las mejores canciones de {{title}}", "topSongsFrom": "las mejores canciones de {{title}}",
"viewAll": "Ver todo", "viewAll": "Ver todo",
@@ -644,7 +680,8 @@
}, },
"queryEditor": { "queryEditor": {
"input_optionMatchAll": "coincidir todos", "input_optionMatchAll": "coincidir todos",
"input_optionMatchAny": "coincidir cualquiera" "input_optionMatchAny": "coincidir cualquiera",
"title": "Editor de consultas"
}, },
"shareItem": { "shareItem": {
"createFailed": "No se pudo crear el recurso compartido (¿está habilitado el uso compartido?)", "createFailed": "No se pudo crear el recurso compartido (¿está habilitado el uso compartido?)",
@@ -653,6 +690,11 @@
"setExpiration": "Establecer expiración", "setExpiration": "Establecer expiración",
"success": "Enlace de compartición copiado al portapapeles (o pulsa aquí para abrir)", "success": "Enlace de compartición copiado al portapapeles (o pulsa aquí para abrir)",
"expireInvalid": "La expiración debe ser en el futuro" "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": { "table": {
@@ -675,7 +717,7 @@
"songCount": "$t(entity.track_other)", "songCount": "$t(entity.track_other)",
"trackNumber": "pista", "trackNumber": "pista",
"genre": "$t(entity.genre_one)", "genre": "$t(entity.genre_one)",
"albumArtist": "artista de álbum", "albumArtist": "artista del álbum",
"path": "ruta", "path": "ruta",
"discNumber": "disco", "discNumber": "disco",
"channels": "$t(common.channel_other)", "channels": "$t(common.channel_other)",
@@ -706,7 +748,7 @@
"note": "$t(common.note)", "note": "$t(common.note)",
"owner": "$t(common.owner)", "owner": "$t(common.owner)",
"path": "$t(common.path)", "path": "$t(common.path)",
"playCount": "número de reproducción", "playCount": "número de reproducciones",
"genre": "$t(entity.genre_one)", "genre": "$t(entity.genre_one)",
"favorite": "$t(common.favorite)", "favorite": "$t(common.favorite)",
"year": "$t(common.year)", "year": "$t(common.year)",
@@ -726,7 +768,9 @@
"view": { "view": {
"card": "tarjeta", "card": "tarjeta",
"table": "tabla", "table": "tabla",
"poster": "cartel" "poster": "cartel",
"list": "Lista",
"grid": "Cuadrícula"
} }
} }
}, },
@@ -747,15 +791,15 @@
"folderWithCount_one": "{{count}} carpeta", "folderWithCount_one": "{{count}} carpeta",
"folderWithCount_many": "{{count}} carpetas", "folderWithCount_many": "{{count}} carpetas",
"folderWithCount_other": "{{count}} carpetas", "folderWithCount_other": "{{count}} carpetas",
"albumArtist_one": "artista de álbum", "albumArtist_one": "artista del álbum",
"albumArtist_many": "artistas de álbum", "albumArtist_many": "artistas del álbum",
"albumArtist_other": "artistas de álbum", "albumArtist_other": "artistas del álbum",
"track_one": "pista", "track_one": "pista",
"track_many": "pistas", "track_many": "pistas",
"track_other": "pistas", "track_other": "pistas",
"albumArtistCount_one": "{{count}} artista de álbum", "albumArtistCount_one": "{{count}} artista del álbum",
"albumArtistCount_many": "{{count}} artistas de álbum", "albumArtistCount_many": "{{count}} artistas del álbum",
"albumArtistCount_other": "{{count}} artistas de álbum", "albumArtistCount_other": "{{count}} artistas del álbum",
"albumWithCount_one": "{{count}} álbum", "albumWithCount_one": "{{count}} álbum",
"albumWithCount_many": "{{count}} álbumes", "albumWithCount_many": "{{count}} álbumes",
"albumWithCount_other": "{{count}} álbumes", "albumWithCount_other": "{{count}} álbumes",
@@ -777,9 +821,9 @@
"trackWithCount_one": "{{count}} pista", "trackWithCount_one": "{{count}} pista",
"trackWithCount_many": "{{count}} pistas", "trackWithCount_many": "{{count}} pistas",
"trackWithCount_other": "{{count}} pistas", "trackWithCount_other": "{{count}} pistas",
"play_one": "Reproducir {{count}}", "play_one": "{{count}} reproducción",
"play_many": "Reproducir {{count}}", "play_many": "{{count}} reproducciones",
"play_other": "Reproducir {{count}}", "play_other": "{{count}} reproducciones",
"song_one": "canción", "song_one": "canción",
"song_many": "canciones", "song_many": "canciones",
"song_other": "canciones" "song_other": "canciones"
+86 -8
View File
@@ -6,11 +6,11 @@
"skip": "رد کن", "skip": "رد کن",
"toggleFullscreenPlayer": "تغییر به پخش‌کنندهٔ تمام‌صفحه", "toggleFullscreenPlayer": "تغییر به پخش‌کنندهٔ تمام‌صفحه",
"skip_back": "برو عقب", "skip_back": "برو عقب",
"shuffle": "شافل", "shuffle": "پخش تصادفی",
"repeat_off": "تکرار غیرفعال", "repeat_off": "تکرار غیرفعال",
"pause": "ایست", "pause": "ایست",
"unfavorite": "حذف از موردعلاقه‌ها", "unfavorite": "حذف از موردعلاقه‌ها",
"shuffle_off": "شافل غیرفعال", "shuffle_off": "پخش تصادفی غیر فعال",
"skip_forward": "برو جلو", "skip_forward": "برو جلو",
"queue_moveToTop": "جابجا کردن انتخاب شده به پایین", "queue_moveToTop": "جابجا کردن انتخاب شده به پایین",
"queue_clear": "خالی کردن صف", "queue_clear": "خالی کردن صف",
@@ -48,7 +48,7 @@
"deselectAll": "لغو انتخاب همه", "deselectAll": "لغو انتخاب همه",
"moveToBottom": "انتقال به پایین", "moveToBottom": "انتقال به پایین",
"setRating": "تعیین امتیاز", "setRating": "تعیین امتیاز",
"toggleSmartPlaylistEditor": "تغییر $t(entity.smartPlaylist) ویرایشگر", "toggleSmartPlaylistEditor": "تغییر ویرایشگر $t(entity.smartPlaylist)",
"removeFromFavorites": "حذف از $t(entity.favorite_other)", "removeFromFavorites": "حذف از $t(entity.favorite_other)",
"openIn": { "openIn": {
"lastfm": "باز کردن در Last.fm", "lastfm": "باز کردن در Last.fm",
@@ -137,7 +137,44 @@
"audioExclusiveMode_description": "حالت اختصاصی خروجی را فعال می‌کند. در این حالت، سامانه معمولاً قفل است و فقط mpv می‌تواند خروجی صدا دهد", "audioExclusiveMode_description": "حالت اختصاصی خروجی را فعال می‌کند. در این حالت، سامانه معمولاً قفل است و فقط mpv می‌تواند خروجی صدا دهد",
"clearQueryCache_description": "یک 'پاک‌سازی نرم' از فیشین. این فهرست‌های پخش و فراداده‌ی قطعه‌ها را تازه می‌کند و متن شعرهای ذخیره شده را بازنشانی می‌کند. پیکربندی‌ها، اعتبارنامه‌های سرویس‌دهنده و نگاره‌های کَش شده حفظ می‌شوند", "clearQueryCache_description": "یک 'پاک‌سازی نرم' از فیشین. این فهرست‌های پخش و فراداده‌ی قطعه‌ها را تازه می‌کند و متن شعرهای ذخیره شده را بازنشانی می‌کند. پیکربندی‌ها، اعتبارنامه‌های سرویس‌دهنده و نگاره‌های کَش شده حفظ می‌شوند",
"clearCache_description": "یک 'پاک‌سازی سخت' فیشین. افزون بر پاک‌سازی کَش فیشین، کَش مرورگر هم تهی می‌شود (نگاره‌های ذخیره شده و باقی دارایی‌ها). اعتبارنامه‌ها و پیکربندی‌ها حفظ می‌شوند", "clearCache_description": "یک 'پاک‌سازی سخت' فیشین. افزون بر پاک‌سازی کَش فیشین، کَش مرورگر هم تهی می‌شود (نگاره‌های ذخیره شده و باقی دارایی‌ها). اعتبارنامه‌ها و پیکربندی‌ها حفظ می‌شوند",
"contextMenu_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": { "common": {
"backward": "به عقب", "backward": "به عقب",
@@ -184,9 +221,9 @@
"forceRestartRequired": "برای اعمال تغییرها دوباره راه‌اندازی کنید… اعلان را برای راه‌اندازی دوباره ببندید", "forceRestartRequired": "برای اعمال تغییرها دوباره راه‌اندازی کنید… اعلان را برای راه‌اندازی دوباره ببندید",
"version": "نسخه", "version": "نسخه",
"title": "عنوان", "title": "عنوان",
"filter_one": "فیلتر", "filter_one": "پالایش",
"filter_other": "فیلتر", "filter_other": "پالایش",
"filters": "فیلتر", "filters": "پالایش",
"create": "ساختن", "create": "ساختن",
"bitrate": "بیت‌ریت", "bitrate": "بیت‌ریت",
"saveAndReplace": "ذخیره و جایگزین", "saveAndReplace": "ذخیره و جایگزین",
@@ -468,7 +505,7 @@
"synchronized": "همگام شده" "synchronized": "همگام شده"
}, },
"noLyrics": "هیچ متن شعری پیدا نشد", "noLyrics": "هیچ متن شعری پیدا نشد",
"lyrics": "متن شعرها", "lyrics": "متن شعر",
"upNext": "در ادامه" "upNext": "در ادامه"
}, },
"home": { "home": {
@@ -544,5 +581,46 @@
"copiedPath": "مسیر با موفقیت کپی شد", "copiedPath": "مسیر با موفقیت کپی شد",
"openFile": "نمایش قطعه در مدیر پرونده" "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)"
}
}
} }
} }
+323 -26
View File
@@ -24,7 +24,7 @@
"dismiss": "hylkää", "dismiss": "hylkää",
"favorite": "suosikki", "favorite": "suosikki",
"filter_one": "suodatin", "filter_one": "suodatin",
"filter_other": "suodatinta", "filter_other": "suodattimet",
"filters": "suodattimet", "filters": "suodattimet",
"forceRestartRequired": "käynnistä uudelleen ottaaksesi muutokset käyttöön… sulje ilmoitus käynnistääksesi uudelleen", "forceRestartRequired": "käynnistä uudelleen ottaaksesi muutokset käyttöön… sulje ilmoitus käynnistääksesi uudelleen",
"gap": "väli", "gap": "väli",
@@ -42,11 +42,11 @@
"note": "huomautus", "note": "huomautus",
"ok": "ok", "ok": "ok",
"owner": "omistaja", "owner": "omistaja",
"path": "reitti", "path": "polku",
"preview": "esikatsele", "preview": "esikatsele",
"previousSong": "edellinen $t(entity.track_one)", "previousSong": "edellinen $t(entity.track_one)",
"resetToDefault": "palauta oletusarvoihin", "resetToDefault": "palauta oletusarvoihin",
"restartRequired": "uudelleen käynnistys vaaditaan", "restartRequired": "vaatii uudelleenkäynnistyksen",
"right": "oikea", "right": "oikea",
"save": "tallenna", "save": "tallenna",
"saveAndReplace": "tallenna ja korvaa", "saveAndReplace": "tallenna ja korvaa",
@@ -57,7 +57,7 @@
"yes": "kyllä", "yes": "kyllä",
"close": "sulje", "close": "sulje",
"descending": "laskeva", "descending": "laskeva",
"biography": "elämänkerta", "biography": "biografia",
"cancel": "peruuta", "cancel": "peruuta",
"bpm": "bpm", "bpm": "bpm",
"decrease": "pienennä", "decrease": "pienennä",
@@ -88,42 +88,48 @@
"albumGain": "albumin vahvistus (gain)", "albumGain": "albumin vahvistus (gain)",
"albumPeak": "albumin huippu (peak)", "albumPeak": "albumin huippu (peak)",
"trackGain": "raidan vahvistus (gain)", "trackGain": "raidan vahvistus (gain)",
"trackPeak": "kappaleen huippu (peak)" "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": { "entity": {
"album_one": "albumi", "album_one": "albumi",
"album_other": "albumit", "album_other": "albumit",
"albumArtist_one": "albumi artisti", "albumArtist_one": "albumin artisti",
"albumArtist_other": "albumi artistit", "albumArtist_other": "albumin artistit",
"artistWithCount_one": "{{count}} artisti", "artistWithCount_one": "{{count}} artisti",
"artistWithCount_other": "{{count}} artistia", "artistWithCount_other": "{{count}} artistia",
"playlist_one": "soittolista", "playlist_one": "soittolista",
"playlist_other": "soittolistaa", "playlist_other": "soittolistat",
"playlistWithCount_one": "{{count}} soittolista", "playlistWithCount_one": "{{count}} soittolista",
"playlistWithCount_other": "{{count}} soittolistaa", "playlistWithCount_other": "{{count}} soittolistaa",
"albumArtistCount_one": "{{count}} albumi artisti", "albumArtistCount_one": "{{count}} albumin artisti",
"albumArtistCount_other": "{{count}} albumi artistia", "albumArtistCount_other": "{{count}} albumin artistia",
"albumWithCount_one": "{{count}} albumi", "albumWithCount_one": "{{count}} albumi",
"albumWithCount_other": "{{count}} albumia", "albumWithCount_other": "{{count}} albumia",
"artist_one": "artisti", "artist_one": "artisti",
"artist_other": "artistia", "artist_other": "artistit",
"favorite_one": "suosikki", "favorite_one": "suosikki",
"favorite_other": "suosikkia", "favorite_other": "suosikit",
"folder_one": "kansio", "folder_one": "kansio",
"folder_other": "kansiota", "folder_other": "kansiot",
"folderWithCount_one": "{{count}} kansio", "folderWithCount_one": "{{count}} kansio",
"folderWithCount_other": "{{count}} kansiota", "folderWithCount_other": "{{count}} kansiota",
"genre_one": "genre", "genre_one": "genre",
"genre_other": "genreä", "genre_other": "genret",
"genreWithCount_one": "{{count}} genre", "genreWithCount_one": "{{count}} genre",
"genreWithCount_other": "{{count}} genreä", "genreWithCount_other": "{{count}} genreä",
"smartPlaylist": "älykäs $t(entity.playlist_one)", "smartPlaylist": "älykäs $t(entity.playlist_one)",
"track_one": "raita", "track_one": "raita",
"track_other": "raitaa", "track_other": "raidat",
"trackWithCount_one": "{{count}} raita", "trackWithCount_one": "{{count}} raita",
"trackWithCount_other": "{{count}} raitaa", "trackWithCount_other": "{{count}} raitaa",
"play_one": "{{count}} toista", "play_one": "{{count}} toisto",
"play_other": "{{count}} toistaa", "play_other": "{{count}} toistoa",
"song_one": "kappale", "song_one": "kappale",
"song_other": "kappaleet" "song_other": "kappaleet"
}, },
@@ -139,7 +145,7 @@
"musicbrainz": "Avaa MusicBrainz:ssä" "musicbrainz": "Avaa MusicBrainz:ssä"
}, },
"goToPage": "mene sivulle", "goToPage": "mene sivulle",
"moveToBottom": "siirry alas", "moveToBottom": "siirry pohjalle",
"moveToTop": "siirry ylös", "moveToTop": "siirry ylös",
"addToFavorites": "lisää kohteeseen $t(entity.favorite_other)", "addToFavorites": "lisää kohteeseen $t(entity.favorite_other)",
"addToPlaylist": "lisää kohteeseen $t(entity.playlist_one)", "addToPlaylist": "lisää kohteeseen $t(entity.playlist_one)",
@@ -168,12 +174,14 @@
"credentialsRequired": "käyttäjätunnuksia vaaditaan", "credentialsRequired": "käyttäjätunnuksia vaaditaan",
"loginRateError": "liian monta kirjautumisyritystä, kokeile muutaman sekuntin päästä uudestaan", "loginRateError": "liian monta kirjautumisyritystä, kokeile muutaman sekuntin päästä uudestaan",
"mpvRequired": "MPV vaadittu", "mpvRequired": "MPV vaadittu",
"networkError": "yhteysvirhe", "networkError": "verkkoyhteysvirhe",
"openError": "tiedostoa ei voitu avata", "openError": "tiedostoa ei voitu avata",
"localFontAccessDenied": "paikallisiin fontteihin pääsy on estetty", "localFontAccessDenied": "paikallisiin fontteihin pääsy on kielletty",
"playbackError": "mediaa toistaessa tapahtui virhe", "playbackError": "mediaa toistaessa tapahtui virhe",
"remotePortWarning": "käynnistä palvelin uudestaan ottaaksesi uuden portin käyttöön", "remotePortWarning": "käynnistä palvelin uudestaan ottaaksesi uuden portin käyttöön",
"endpointNotImplementedError": "endpoint {{endpoint}} ei ole toteutettu {{serverType}} varten" "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": { "filter": {
"album": "$t(entity.album_one)", "album": "$t(entity.album_one)",
@@ -221,7 +229,7 @@
}, },
"form": { "form": {
"addServer": { "addServer": {
"input_legacyAuthentication": "käytä vanhaa kirjautumista", "input_legacyAuthentication": "käytä vanhaa kirjautumistapaa",
"ignoreCors": "ohita CORS ($t(common.restartRequired))", "ignoreCors": "ohita CORS ($t(common.restartRequired))",
"input_name": "palvelimen nimi", "input_name": "palvelimen nimi",
"ignoreSsl": "ohita SSL ($t(common.restartRequired))", "ignoreSsl": "ohita SSL ($t(common.restartRequired))",
@@ -243,7 +251,7 @@
}, },
"addToPlaylist": { "addToPlaylist": {
"input_skipDuplicates": "ohita kaksoiskappaleet", "input_skipDuplicates": "ohita kaksoiskappaleet",
"success": "lisätty $t(entity.trackWithCount, {\"count\": {{message}} }) soittolistalle $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })", "success": "$t(entity.trackWithCount, {\"count\": {{message}} }) lisätty $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })",
"title": "lisää soittolistalle $t(entity.playlist_one)", "title": "lisää soittolistalle $t(entity.playlist_one)",
"input_playlists": "$t(entity.playlist_other)" "input_playlists": "$t(entity.playlist_other)"
}, },
@@ -276,7 +284,8 @@
}, },
"queryEditor": { "queryEditor": {
"input_optionMatchAny": "sovita joku", "input_optionMatchAny": "sovita joku",
"input_optionMatchAll": "sovita kaikki" "input_optionMatchAll": "sovita kaikki",
"title": "kyselyeditori"
} }
}, },
"setting": { "setting": {
@@ -310,7 +319,217 @@
"artistConfiguration": "albumin artistin sivun hallinta", "artistConfiguration": "albumin artistin sivun hallinta",
"audioDevice_description": "valitse toistossa käytettävä äänilaite (vain verkkosoittimessa)", "audioDevice_description": "valitse toistossa käytettävä äänilaite (vain verkkosoittimessa)",
"applicationHotkeys": "sovelluksen pikanäppäimet", "applicationHotkeys": "sovelluksen pikanäppäimet",
"albumBackground": "albumin taustakuva" "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": { "page": {
"itemDetail": { "itemDetail": {
@@ -379,7 +598,8 @@
"home": "$t(common.home)", "home": "$t(common.home)",
"nowPlaying": "nyt soi", "nowPlaying": "nyt soi",
"playlists": "$t(entity.playlist_other)", "playlists": "$t(entity.playlist_other)",
"search": "$t(common.search)" "search": "$t(common.search)",
"myLibrary": "oma kirjasto"
}, },
"setting": { "setting": {
"generalTab": "yleinen", "generalTab": "yleinen",
@@ -494,5 +714,82 @@
"repeat_off": "kertaus pois päältä", "repeat_off": "kertaus pois päältä",
"shuffle_off": "sekoitus pois päältä", "shuffle_off": "sekoitus pois päältä",
"toggleFullscreenPlayer": "vaihda kokoruudun soittimeen" "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ä"
}
} }
} }
+95 -48
View File
@@ -12,8 +12,8 @@
"favorite": "favori", "favorite": "favori",
"next": "suivant", "next": "suivant",
"shuffle": "lecture aléatoire", "shuffle": "lecture aléatoire",
"playbackFetchNoResults": "aucune chansons trouvées", "playbackFetchNoResults": "aucun titre trouvé",
"playbackFetchInProgress": "chargement des chansons…", "playbackFetchInProgress": "chargement des titres…",
"addNext": "ajouter ensuite", "addNext": "ajouter ensuite",
"playbackSpeed": "vitesse de lecture", "playbackSpeed": "vitesse de lecture",
"playbackFetchCancel": "cela prend du temps… fermez la notification pour annuler", "playbackFetchCancel": "cela prend du temps… fermez la notification pour annuler",
@@ -29,7 +29,7 @@
"skip_forward": "avancer", "skip_forward": "avancer",
"pause": "pause", "pause": "pause",
"unfavorite": "retirer des favoris", "unfavorite": "retirer des favoris",
"playSimilarSongs": "jouer des chansons similaires", "playSimilarSongs": "jouer des titres similaires",
"viewQueue": "voir la file d'attente" "viewQueue": "voir la file d'attente"
}, },
"action": { "action": {
@@ -60,7 +60,7 @@
"backward": "en arrière", "backward": "en arrière",
"increase": "augmenter", "increase": "augmenter",
"rating": "note", "rating": "note",
"bpm": "bpm", "bpm": "BPM",
"refresh": "rafraichir", "refresh": "rafraichir",
"unknown": "inconnu", "unknown": "inconnu",
"areYouSure": "êtes-vous sûr?", "areYouSure": "êtes-vous sûr?",
@@ -81,7 +81,7 @@
"manage": "gérer", "manage": "gérer",
"limit": "limite", "limit": "limite",
"minimize": "minimiser", "minimize": "minimiser",
"modified": "modifier", "modified": "modifié",
"duration": "durée", "duration": "durée",
"name": "nom", "name": "nom",
"maximize": "agrandir", "maximize": "agrandir",
@@ -100,6 +100,9 @@
"cancel": "annuler", "cancel": "annuler",
"forceRestartRequired": "redémarrer pour appliquer les changements… fermer la notification pour redémarrer", "forceRestartRequired": "redémarrer pour appliquer les changements… fermer la notification pour redémarrer",
"setting": "paramètre", "setting": "paramètre",
"setting_one": "paramètre",
"setting_many": "",
"setting_other": "paramètres",
"version": "version", "version": "version",
"title": "titre", "title": "titre",
"filter_one": "filtre", "filter_one": "filtre",
@@ -148,7 +151,13 @@
"trackGain": "gain de la piste", "trackGain": "gain de la piste",
"trackPeak": "crête de la piste", "trackPeak": "crête de la piste",
"codec": "codec", "codec": "codec",
"translation": "traduction" "translation": "traduction",
"additionalParticipants": "participants additionnels",
"tags": "tags",
"newVersion": "une nouvelle version vient d'être installée ({{version}})",
"viewReleaseNotes": "voir la note de version",
"sampleRate": "taux d'échantillonnage",
"bitDepth": "bit par échantillon"
}, },
"error": { "error": {
"remotePortWarning": "redémarrer le serveur pour appliquer le nouveau port", "remotePortWarning": "redémarrer le serveur pour appliquer le nouveau port",
@@ -172,7 +181,9 @@
"loginRateError": "trop de tentative de connexion, merci de réessayer dans quelques secondes", "loginRateError": "trop de tentative de connexion, merci de réessayer dans quelques secondes",
"openError": "impossible d'ouvrir le fichier", "openError": "impossible d'ouvrir le fichier",
"networkError": "une erreur de réseau est survenue", "networkError": "une erreur de réseau est survenue",
"badAlbum": "vous voyez cette page parce que cette chanson ne fait pas parti d'un album. vous rencontrez probablement cette erreur si vous avez une chanson qui n'est pas dans votre répertoire de musique. jellyfin gère les chansons uniquement si elles sont dans un sous-dossier, qui est lui-même dans un dossier \"Musique(s)\"." "badAlbum": "vous voyez cette page parce que cette chanson ne fait pas parti d'un album. vous rencontrez probablement cette erreur si vous avez une chanson qui n'est pas dans votre répertoire de musique. jellyfin gère les chansons uniquement si elles sont dans un sous-dossier, qui est lui-même dans un dossier \"Musique(s)\".",
"badValue": "option {{value}} invalide. Cette valeur n'existe plus",
"notificationDenied": "les autorisations pour les notifications ont été refusées. ce paramètre n'a aucun effet"
}, },
"filter": { "filter": {
"mostPlayed": "plus joués", "mostPlayed": "plus joués",
@@ -194,7 +205,7 @@
"favorited": "favoris", "favorited": "favoris",
"isRecentlyPlayed": "est récemment joué", "isRecentlyPlayed": "est récemment joué",
"isFavorited": "est favori", "isFavorited": "est favori",
"bpm": "bpm", "bpm": "BPM",
"releaseYear": "année de sortie", "releaseYear": "année de sortie",
"disc": "disque", "disc": "disque",
"biography": "biographie", "biography": "biographie",
@@ -231,7 +242,8 @@
"home": "$t(common.home)", "home": "$t(common.home)",
"artists": "$t(entity.artist_other)", "artists": "$t(entity.artist_other)",
"albumArtists": "$t(entity.albumArtist_other)", "albumArtists": "$t(entity.albumArtist_other)",
"shared": "partagé $t(entity.playlist_other)" "shared": "partagé $t(entity.playlist_other)",
"myLibrary": "Bibliothèque"
}, },
"fullscreenPlayer": { "fullscreenPlayer": {
"config": { "config": {
@@ -266,13 +278,15 @@
"goForward": "avancer", "goForward": "avancer",
"version": "version {{version}}", "version": "version {{version}}",
"settings": "$t(common.setting_other)", "settings": "$t(common.setting_other)",
"quit": "$t(common.quit)" "quit": "$t(common.quit)",
"privateModeOff": "désactiver le mode privé",
"privateModeOn": "activer le mode privé"
}, },
"home": { "home": {
"mostPlayed": "plus joués", "mostPlayed": "Les plus joués",
"newlyAdded": "versions récemment ajoutés", "newlyAdded": "Ajoutés récemment",
"explore": "explorer depuis votre bibliothèque", "explore": "explorer depuis la bibliothèque",
"recentlyPlayed": "récemment joué", "recentlyPlayed": "Joués récemment",
"title": "$t(common.home)" "title": "$t(common.home)"
}, },
"albumDetail": { "albumDetail": {
@@ -317,7 +331,9 @@
"showDetails": "obtenir des informations", "showDetails": "obtenir des informations",
"download": "télécharger", "download": "télécharger",
"playShuffled": "$t(player.shuffle)", "playShuffled": "$t(player.shuffle)",
"moveToNext": "$t(action.moveToNext)" "moveToNext": "$t(action.moveToNext)",
"goToAlbumArtist": "aller à l'$t(entity.albumArtist_one)",
"goToAlbum": "aller à l'$t(entity.album_one)"
}, },
"albumArtistList": { "albumArtistList": {
"title": "$t(entity.albumArtist_other)" "title": "$t(entity.albumArtist_other)"
@@ -343,13 +359,13 @@
"albumArtistDetail": { "albumArtistDetail": {
"about": "À propos de {{artist}}", "about": "À propos de {{artist}}",
"appearsOn": "apparaît sur", "appearsOn": "apparaît sur",
"topSongsFrom": "meilleures chansons de {{title}}", "topSongsFrom": "meilleurs titres de {{title}}",
"viewAll": "voir tout", "viewAll": "voir tout",
"viewAllTracks": "voir tout $t(entity.track_other)", "viewAllTracks": "voir tout $t(entity.track_other)",
"recentReleases": "sorties récentes", "recentReleases": "sorties récentes",
"viewDiscography": "voir la discographie", "viewDiscography": "voir la discographie",
"relatedArtists": "en rapport avec $t(entity.artist_other)", "relatedArtists": "en rapport avec $t(entity.artist_other)",
"topSongs": "meilleures chansons" "topSongs": "meilleurs titres"
}, },
"itemDetail": { "itemDetail": {
"copyPath": "copier le chemin dans le presse-papiers", "copyPath": "copier le chemin dans le presse-papiers",
@@ -357,11 +373,11 @@
"copiedPath": "chemin copié avec succès" "copiedPath": "chemin copié avec succès"
}, },
"playlist": { "playlist": {
"reorder": "le tri n'est possible que lorsque l'on trie par identifiant" "reorder": "le tri n'est possible que lors du tri par identifiant"
}, },
"manageServers": { "manageServers": {
"serverDetails": "détails du serveur", "serverDetails": "détails du serveur",
"removeServer": "supprimer le serveur", "removeServer": "retirer le serveur",
"url": "URL du serveur", "url": "URL du serveur",
"title": "gérer les serveurs", "title": "gérer les serveurs",
"username": "nom d'utilisateur", "username": "nom d'utilisateur",
@@ -392,7 +408,7 @@
"discordIdleStatus_description": "quand activé, mettre à jour le status pendant que le lecteur est inactif", "discordIdleStatus_description": "quand activé, mettre à jour le status pendant que le lecteur est inactif",
"showSkipButtons": "affiche les boutons suivants et précédents", "showSkipButtons": "affiche les boutons suivants et précédents",
"minimumScrobblePercentage": "durée minimal du scobble (pourcentage)", "minimumScrobblePercentage": "durée minimal du scobble (pourcentage)",
"lyricFetch": "récupère les paroles depuis internet", "lyricFetch": "récupérer les paroles depuis internet",
"scrobble": "scrobble", "scrobble": "scrobble",
"enableRemote_description": "activer le serveur de contrôle à distance, qui permet à d'autres appareils de contrôler l'application", "enableRemote_description": "activer le serveur de contrôle à distance, qui permet à d'autres appareils de contrôler l'application",
"fontType_optionSystem": "police système", "fontType_optionSystem": "police système",
@@ -443,17 +459,17 @@
"playbackStyle": "style de lecture", "playbackStyle": "style de lecture",
"hotkey_toggleShuffle": "basculer la lecture aléatoire", "hotkey_toggleShuffle": "basculer la lecture aléatoire",
"playbackStyle_description": "sélectionnez le style de lecture à utiliser pour le lecteur audio", "playbackStyle_description": "sélectionnez le style de lecture à utiliser pour le lecteur audio",
"discordRichPresence_description": "active l'état de lecteur dans le status d'activité {{discord}}. Les images clés sont: {{icon}}, {{playing}}, et {{paused}} ", "discordRichPresence_description": "active l'état de lecteur dans le status d'activité {{discord}}. Les images clés sont : {{icon}}, {{playing}}, et {{paused}}",
"mpvExecutablePath": "chemin de l'exécutable mpv", "mpvExecutablePath": "chemin de l'exécutable mpv",
"hotkey_rate2": "noter 2 étoiles", "hotkey_rate2": "noter 2 étoiles",
"playButtonBehavior_description": "définit le comportement par défaut du bouton play, lors de l'ajout de chanson à la file d'attente", "playButtonBehavior_description": "définit le comportement par défaut du bouton Jouer/Pause, lors de l'ajout de titres à la file d'attente",
"minimumScrobblePercentage_description": "le pourcentage minimum de la chanson qui doit être joué avant qu'elle ne soit scrobbleée", "minimumScrobblePercentage_description": "le pourcentage minimum de la chanson qui doit être joué avant qu'elle ne soit scrobblée",
"exitToTray": "quitter vers la barre des tâches", "exitToTray": "quitter vers la barre des tâches",
"hotkey_rate4": "noter 4 étoiles", "hotkey_rate4": "noter 4 étoiles",
"enableRemote": "activer le serveur de contrôle à distance", "enableRemote": "activer le serveur de contrôle à distance",
"showSkipButton_description": "affiche ou cache les boutons suivants et précédents de la barre de lecture", "showSkipButton_description": "affiche ou cache les boutons suivants et précédents de la barre de lecture",
"savePlayQueue": "sauvegarder la liste de lecture", "savePlayQueue": "sauvegarder la liste de lecture",
"minimumScrobbleSeconds_description": "la durée minimale en secondes de la chanson qui doit être jouée avant qu'elle ne soit scrobbleée", "minimumScrobbleSeconds_description": "la durée minimale en secondes de la chanson qui doit être jouée avant qu'elle ne soit scrobblée",
"fontType_description": "police intégré vous permet de sélectionner une des polices fourni par Feishin. Police système vous permet de sélectionner une des polices fourni par votre système d'éxploitation. personnalisé vous permet de fournir votre propre police", "fontType_description": "police intégré vous permet de sélectionner une des polices fourni par Feishin. Police système vous permet de sélectionner une des polices fourni par votre système d'éxploitation. personnalisé vous permet de fournir votre propre police",
"playButtonBehavior": "comportement du bouton play", "playButtonBehavior": "comportement du bouton play",
"playbackStyle_optionNormal": "normale", "playbackStyle_optionNormal": "normale",
@@ -485,12 +501,12 @@
"sidebarCollapsedNavigation_description": "affiche ou cache la navigation dans la barre latérale réduite", "sidebarCollapsedNavigation_description": "affiche ou cache la navigation dans la barre latérale réduite",
"sidebarConfiguration": "configuration de la barre latérale", "sidebarConfiguration": "configuration de la barre latérale",
"sidebarConfiguration_description": "sélectionnez les éléments et l'ordre dans lequel ils seront affichés dans la barre latérale", "sidebarConfiguration_description": "sélectionnez les éléments et l'ordre dans lequel ils seront affichés dans la barre latérale",
"sidebarPlaylistList": "liste de playlist de la barre latérale", "sidebarPlaylistList": "liste des listes de lecture de la barre latérale",
"sidebarCollapsedNavigation": "navigation de la barre latéral (réduite)", "sidebarCollapsedNavigation": "navigation de la barre latéral (réduite)",
"skipDuration": "durée de l'avance rapide", "skipDuration": "durée de l'avance rapide",
"sidePlayQueueStyle_optionAttached": "attaché", "sidePlayQueueStyle_optionAttached": "attaché",
"sidePlayQueueStyle": "style de la liste de lecture latérale", "sidePlayQueueStyle": "style de la liste de lecture latérale",
"sidebarPlaylistList_description": "affiche ou cache la liste de playlist de la barre latérale", "sidebarPlaylistList_description": "affiche ou cache le menu de listes de lecture de la barre latérale",
"sidePlayQueueStyle_description": "définit le style de la liste de lecture latérale", "sidePlayQueueStyle_description": "définit le style de la liste de lecture latérale",
"sidePlayQueueStyle_optionDetached": "détaché", "sidePlayQueueStyle_optionDetached": "détaché",
"volumeWheelStep_description": "la valeur de volume à modifier lors du défilement de la molette de la souris sur le curseur de volume", "volumeWheelStep_description": "la valeur de volume à modifier lors du défilement de la molette de la souris sur le curseur de volume",
@@ -502,11 +518,11 @@
"themeLight_description": "définit le thème clair à utiliser pour l'application", "themeLight_description": "définit le thème clair à utiliser pour l'application",
"zoom_description": "définit le pourcentage de zoom de l'application", "zoom_description": "définit le pourcentage de zoom de l'application",
"theme": "thème", "theme": "thème",
"skipPlaylistPage_description": "lors de la navigation dans une playlist, aller directement vers la liste des morceaux, au lieu de la page par défaut", "skipPlaylistPage_description": "lors de la navigation dans une liste de lecture, aller directement vers la liste des titres, au lieu de la page par défaut",
"volumeWheelStep": "valeur du pas de volume", "volumeWheelStep": "valeur du pas de volume",
"windowBarStyle": "style de la barre de la fenêtre", "windowBarStyle": "style de la barre de la fenêtre",
"useSystemTheme_description": "suivre les préférences du système (mode clair ou sombre)", "useSystemTheme_description": "suivre les préférences du système (mode clair ou sombre)",
"skipPlaylistPage": "sauter la page de playlist", "skipPlaylistPage": "sauter la page de listes de lecture",
"themeDark": "thème (sombre)", "themeDark": "thème (sombre)",
"windowBarStyle_description": "ajuster le style de la barre de la fenêtre", "windowBarStyle_description": "ajuster le style de la barre de la fenêtre",
"useSystemTheme": "utiliser le thème du système", "useSystemTheme": "utiliser le thème du système",
@@ -522,17 +538,17 @@
"replayGainMode_optionTrack": "$t(entity.track_one)", "replayGainMode_optionTrack": "$t(entity.track_one)",
"playButtonBehavior_optionAddNext": "$t(player.addNext)", "playButtonBehavior_optionAddNext": "$t(player.addNext)",
"replayGainMode_description": "ajuste le gain de volume accordement à la valeur de {{ReplayGain}} sauvegardé dans les métadonnées du fichier", "replayGainMode_description": "ajuste le gain de volume accordement à la valeur de {{ReplayGain}} sauvegardé dans les métadonnées du fichier",
"replayGainFallback": "{{ReplayGain}} fallback", "replayGainFallback": "valeur de repli {{ReplayGain}}",
"replayGainClipping_description": "Prévient le clipping causé par {{ReplayGain}} en baissant automatiquement le gain", "replayGainClipping_description": "Prévient le clipping causé par {{ReplayGain}} en baissant automatiquement le gain",
"replayGainPreamp": "préamplificateur (dB) de {{ReplayGain}}", "replayGainPreamp": "préamplificateur (dB) de {{ReplayGain}}",
"replayGainClipping": "{{ReplayGain}} clipping", "replayGainClipping": "écrêtage {{ReplayGain}}",
"replayGainMode": "mode de {{ReplayGain}}", "replayGainMode": "mode de {{ReplayGain}}",
"replayGainFallback_description": "gain en dB à appliquer si le fichier n'a pas de tag {{ReplayGain}}", "replayGainFallback_description": "gain en dB à appliquer si le fichier n'a pas de tag {{ReplayGain}}",
"replayGainPreamp_description": "ajuste le gain de préampli appliqué a la valeur de {{ReplayGain}}", "replayGainPreamp_description": "ajuste le gain de préampli appliqué a la valeur de {{ReplayGain}}",
"clearQueryCache": "vide le cache de feishin", "clearQueryCache": "vide le cache de feishin",
"clearCache": "vider le cache navigateur", "clearCache": "vider le cache navigateur",
"buttonSize_description": "la taille des boutons de la barre de lecture", "buttonSize_description": "la taille des boutons de la barre de lecture",
"clearQueryCache_description": "un 'soft clear' de feishin. cela actualisera les playlists, les métadonnées des pistes, et réinitialisera les paroles enregistrées. les paramètres, identifiants serveurs et les images mises en cache sont conservés", "clearQueryCache_description": "un 'soft clear' de Feishin. cela actualisera les liste de lecture, les métadonnées des titres, et réinitialisera les paroles enregistrées. les paramètres, identifiants du serveur et images mises en cache seront conservés",
"clearCache_description": "un 'hard clear' de feishin. en plus de vider le cache de feishin, vide le cache du navigateur (images sauvegardées et autres ressources). les identifiants serveurs et paramètres sont conservés", "clearCache_description": "un 'hard clear' de feishin. en plus de vider le cache de feishin, vide le cache du navigateur (images sauvegardées et autres ressources). les identifiants serveurs et paramètres sont conservés",
"buttonSize": "taille des boutons du lecteur", "buttonSize": "taille des boutons du lecteur",
"clearCacheSuccess": "le cache a été vidé", "clearCacheSuccess": "le cache a été vidé",
@@ -570,7 +586,7 @@
"artistConfiguration": "page de configuration de l'artiste de l'album", "artistConfiguration": "page de configuration de l'artiste de l'album",
"artistConfiguration_description": "configurer les éléments et l'ordre à afficher, sur la page de l'artiste de l'album", "artistConfiguration_description": "configurer les éléments et l'ordre à afficher, sur la page de l'artiste de l'album",
"doubleClickBehavior": "mettre en file d'attente toutes les pistes recherchées lors d'un double clic", "doubleClickBehavior": "mettre en file d'attente toutes les pistes recherchées lors d'un double clic",
"contextMenu": "configuration du menu contexte (clic droit)", "contextMenu": "configuration du menu contextuel (clic droit)",
"contextMenu_description": "permet de masquer les éléments qui s'affichent dans le menu lorsque vous cliquez avec le bouton droit de la souris sur un élément. les éléments qui ne sont pas cochés seront masqués", "contextMenu_description": "permet de masquer les éléments qui s'affichent dans le menu lorsque vous cliquez avec le bouton droit de la souris sur un élément. les éléments qui ne sont pas cochés seront masqués",
"albumBackground": "image d'arrière-plan de l'album", "albumBackground": "image d'arrière-plan de l'album",
"albumBackground_description": "ajoute une image d'arrière-plan pour les pages de l'album contenant les illustrations de l'album", "albumBackground_description": "ajoute une image d'arrière-plan pour les pages de l'album contenant les illustrations de l'album",
@@ -588,12 +604,35 @@
"customCss_description": "contenu css personnalisé. Remarque : le contenu et les URL distantes sont des propriétés non autorisées. Un aperçu de votre contenu est affiché ci-dessous. Des champs supplémentaires que vous n'avez pas définis sont présents en raison de la vérification.", "customCss_description": "contenu css personnalisé. Remarque : le contenu et les URL distantes sont des propriétés non autorisées. Un aperçu de votre contenu est affiché ci-dessous. Des champs supplémentaires que vous n'avez pas définis sont présents en raison de la vérification.",
"translationApiKey": "clé api de traduction", "translationApiKey": "clé api de traduction",
"translationTargetLanguage_description": "langue cible pour la traduction des paroles", "translationTargetLanguage_description": "langue cible pour la traduction des paroles",
"transcodeNote": "prend effet après 1 (web) - 2 (mpv) chansons", "transcodeNote": "prend effet après 1 (web) - 2 (mpv) titres",
"trayEnabled_description": "afficher ou masquer l'icône et le menu de la barre d'état système. si désactivé, désactive également la réduction et la sortie vers la barre d'état système", "trayEnabled_description": "afficher ou masquer l'icône et le menu de la barre d'état système. si désactivé, désactive également la réduction et la sortie vers la barre d'état système",
"doubleClickBehavior_description": "si vrai, toutes les pistes correspondantes dans une recherche de piste seront mises en file d'attente. sinon, seule celle sur laquelle vous avez cliqué sera mise en file d'attente", "doubleClickBehavior_description": "si vrai, toutes les pistes correspondantes dans une recherche de piste seront mises en file d'attente. sinon, seule celle sur laquelle vous avez cliqué sera mise en file d'attente",
"albumBackgroundBlur": "taille du flou de l'image d'arrière-plan de l'album", "albumBackgroundBlur": "taille du flou de l'image d'arrière-plan de l'album",
"lastfmApiKey": "clé API {{lastfm}}", "lastfmApiKey": "clé API {{lastfm}}",
"lastfmApiKey_description": "la clé API pour {{lastfm}} est requise pour la pochette d'album" "lastfmApiKey_description": "la clé API pour {{lastfm}} . requise pour la pochette d'album",
"discordServeImage": "servir l'image {{discord}} depuis le serveur",
"discordServeImage_description": "partage pochette du status d'activité {{discord}} depuis le serveur lui même, disponible uniquement pour jellyfin et navidrome",
"lastfm": "affiche les liens de last.fm",
"musicbrainz_description": "affiches les liens vers musicbrainz sur les pages des artistes/albums, quand mbid existes",
"lastfm_description": "affiche les liens vers last.fm sur les pages des artistes/albums",
"musicbrainz": "affiches les liens musicbrainz",
"neteaseTranslation": "Activer les traductions NetEase",
"neteaseTranslation_description": "Lorsque cette option est activée, récupère et affiche les paroles traduites de NetEase si elles sont disponibles.",
"preferLocalLyrics_description": "privilégier les paroles locales aux paroles distantes lorsqu'elles sont disponibles",
"preferLocalLyrics": "privilégier les paroles locales",
"discordPausedStatus_description": "quand activé, le status s'affichera lorsque le lecteur est en pause",
"discordPausedStatus": "afficher le status d'activité en pause",
"preservePitch": "préserver la hauteur",
"preservePitch_description": "préserver la hauteur lors du changement de la vitesse de lecture",
"notify": "activer les notifications des chansons",
"notify_description": "affiche une notification lors du changement de chanson",
"discordDisplayType": "type d'affichage du status {{discord}}",
"discordDisplayType_description": "change ce que vous écoutez dans votre statut",
"discordDisplayType_songname": "nom du morceau",
"discordDisplayType_artistname": "nom(s) dartiste",
"hotkey_navigateHome": "aller à l'accueil",
"preventSleepOnPlayback_description": "Empêche la mise en veille du lecteur lorsque la musique est en cours de lecture",
"preventSleepOnPlayback": "Empêche la mise en veille lors de la lecture"
}, },
"form": { "form": {
"deletePlaylist": { "deletePlaylist": {
@@ -621,7 +660,7 @@
"input_playlists": "$t(entity.playlist_other)" "input_playlists": "$t(entity.playlist_other)"
}, },
"createPlaylist": { "createPlaylist": {
"title": "créer $t(entity.playlist_one)", "title": "créer une $t(entity.playlist_one)",
"input_public": "publique", "input_public": "publique",
"success": "$t(entity.playlist_one) créée avec succès", "success": "$t(entity.playlist_one) créée avec succès",
"input_description": "$t(common.description)", "input_description": "$t(common.description)",
@@ -634,11 +673,12 @@
}, },
"queryEditor": { "queryEditor": {
"input_optionMatchAll": "correspondre à tous", "input_optionMatchAll": "correspondre à tous",
"input_optionMatchAny": "correspondre à n'importe quel" "input_optionMatchAny": "correspondre à n'importe quel",
"title": "éditeur de requête"
}, },
"editPlaylist": { "editPlaylist": {
"title": "modifier $t(entity.playlist_one)", "title": "modifier $t(entity.playlist_one)",
"publicJellyfinNote": "Jellyfin n'indique pas si une playlist est publique ou non. Si vous souhaitez que cette playlist reste publique, veuillez sélectionner l'entrée suivante", "publicJellyfinNote": "Jellyfin n'indique pas si une liste de lecture est publique ou non. Si vous souhaitez que cette liste de lecture reste publique, veuillez sélectionner l'entrée suivante",
"success": "$t(entity.playlist_one) mis à jour avec succès" "success": "$t(entity.playlist_one) mis à jour avec succès"
}, },
"lyricSearch": { "lyricSearch": {
@@ -653,18 +693,23 @@
"success": "lien de partage copié dans le presse-papier (ou cliquez ici pour ouvrir)", "success": "lien de partage copié dans le presse-papier (ou cliquez ici pour ouvrir)",
"expireInvalid": "l'expiration doit être définie à une date ultérieure", "expireInvalid": "l'expiration doit être définie à une date ultérieure",
"createFailed": "échec de la création du lien de partage (le partage est-il activé ?)" "createFailed": "échec de la création du lien de partage (le partage est-il activé ?)"
},
"privateMode": {
"enabled": "le mode privé est activé, le statut de lecture est maintenant caché des intégrations externes",
"disabled": "le mode privé est désactivé, le statut de lecture est maintenant visible des intégrations externes",
"title": "mode privé"
} }
}, },
"entity": { "entity": {
"genre_one": "genre", "genre_one": "genre",
"genre_many": "genres", "genre_many": "genres",
"genre_other": "genres", "genre_other": "genres",
"playlistWithCount_one": "{{count}} playlist", "playlistWithCount_one": "{{count}} liste de lecture",
"playlistWithCount_many": "{{count}} playlists", "playlistWithCount_many": "{{count}} listes de lecture",
"playlistWithCount_other": "{{count}} playlists", "playlistWithCount_other": "{{count}} listes de lecture",
"playlist_one": "playlist", "playlist_one": "liste de lecture",
"playlist_many": "playlists", "playlist_many": "listes de lecture",
"playlist_other": "playlists", "playlist_other": "listes de lecture",
"artist_one": "artiste", "artist_one": "artiste",
"artist_many": "artistes", "artist_many": "artistes",
"artist_other": "artistes", "artist_other": "artistes",
@@ -705,9 +750,9 @@
"play_one": "{{count}} écouter", "play_one": "{{count}} écouter",
"play_many": "{{count}} écoute", "play_many": "{{count}} écoute",
"play_other": "{{count}} écoute", "play_other": "{{count}} écoute",
"song_one": "chanson", "song_one": "titre",
"song_many": "chansons", "song_many": "titres",
"song_other": "chansons" "song_other": "titres"
}, },
"table": { "table": {
"config": { "config": {
@@ -723,8 +768,10 @@
}, },
"view": { "view": {
"table": "liste", "table": "liste",
"poster": "poster", "poster": "affiche",
"card": "Carte" "card": "Carte",
"grid": "grille",
"list": "liste"
}, },
"label": { "label": {
"releaseDate": "date de sortie", "releaseDate": "date de sortie",
+1 -1
View File
@@ -163,7 +163,7 @@
"remotePortWarning": "indítsd újra a szervert az új PORT használatához", "remotePortWarning": "indítsd újra a szervert az új PORT használatához",
"genericError": "hiba történt", "genericError": "hiba történt",
"endpointNotImplementedError": "a(z) {{endpoint}} végpont nincs implementálva a következőhöz: {{serverType}}", "endpointNotImplementedError": "a(z) {{endpoint}} végpont nincs implementálva a következőhöz: {{serverType}}",
"badAlbum": "azért látod ezt az oldalt mert ez a zeneszám nem része egy albumnak. ez általában akkor történik amikor egy szám a zenekönyvtárad gyökerébe kerül. a Jellyfin csak mappákba rendezett számokat csoportosít", "badAlbum": "azért látod ezt az oldalt mert ez a zeneszám nem része egy albumnak. ez általában akkor történik amikor egy szám a zenekönyvtárad gyökerébe kerül. a Jellyfin csak mappákba rendezett számokat csoportosít.",
"loginRateError": "túl sok bejelentkezési kísérlet, kérlek próbáld újra pár másodperc múlva", "loginRateError": "túl sok bejelentkezési kísérlet, kérlek próbáld újra pár másodperc múlva",
"mpvRequired": "MPV szükséges", "mpvRequired": "MPV szükséges",
"invalidServer": "érvénytelen szerver", "invalidServer": "érvénytelen szerver",
+1 -1
View File
@@ -491,7 +491,7 @@
"discordListening": "Tampilkan status sebagai mendengarkan", "discordListening": "Tampilkan status sebagai mendengarkan",
"discordListening_description": "tampilkan status sebagai mendengarkan alih-alih bermain", "discordListening_description": "tampilkan status sebagai mendengarkan alih-alih bermain",
"discordRichPresence": "status aktivitas {{discord}}", "discordRichPresence": "status aktivitas {{discord}}",
"discordRichPresence_description": "aktifkan status pemutaran di status aktivitas {{discord}}. Gambar tombol adalah: {{icon}}, {{playing}}, dan {{paused}} ", "discordRichPresence_description": "aktifkan status pemutaran di status aktivitas {{discord}}. Gambar tombol adalah: {{icon}}, {{playing}}, dan {{paused}}",
"discordUpdateInterval": "interval pembaruan status aktivitas {{discord}}", "discordUpdateInterval": "interval pembaruan status aktivitas {{discord}}",
"discordUpdateInterval_description": "waktu dalam detik antara setiap pembaruan (minimal 15 detik)", "discordUpdateInterval_description": "waktu dalam detik antara setiap pembaruan (minimal 15 detik)",
"doubleClickBehavior": "masukkan semua lagu yang dicari saat mengklik dua kali", "doubleClickBehavior": "masukkan semua lagu yang dicari saat mengklik dua kali",
+227 -28
View File
@@ -16,7 +16,12 @@
"toggleSmartPlaylistEditor": "attiva/disattiva editor $t(entity.smartPlaylist)", "toggleSmartPlaylistEditor": "attiva/disattiva editor $t(entity.smartPlaylist)",
"removeFromFavorites": "rimuovi da $t(entity.favorite_other)", "removeFromFavorites": "rimuovi da $t(entity.favorite_other)",
"moveToTop": "sposta in cima", "moveToTop": "sposta in cima",
"moveToBottom": "sposta in fondo" "moveToBottom": "sposta in fondo",
"moveToNext": "passa al successivo",
"openIn": {
"lastfm": "Apri in Last.fm",
"musicbrainz": "Apri in MusicBrainz"
}
}, },
"common": { "common": {
"backward": "indietro", "backward": "indietro",
@@ -99,7 +104,24 @@
"yes": "si", "yes": "si",
"random": "casuale", "random": "casuale",
"size": "dimensione", "size": "dimensione",
"note": "nota" "note": "nota",
"additionalParticipants": "partecipanti aggiuntivi",
"newVersion": "è stata installata una nuova versione ({{version}})",
"viewReleaseNotes": "mostra le note di rilascio",
"albumGain": "guadagno (gain) dell'album",
"albumPeak": "picco di volume dell'album",
"close": "chiudi",
"codec": "codec",
"mbid": "MusicBrainz ID",
"preview": "anteprima",
"reload": "aggiorna",
"share": "condividi",
"tags": "tags",
"trackGain": "normalizzazione (gain) del brano",
"trackPeak": "picco di volume del brano",
"translation": "traduzione",
"bitDepth": "bit depth (profondità di bit)",
"sampleRate": "sample rate (frequenza di campionamento)"
}, },
"player": { "player": {
"repeat_all": "ripeti coda", "repeat_all": "ripeti coda",
@@ -113,7 +135,7 @@
"skip_back": "salta indietro", "skip_back": "salta indietro",
"favorite": "preferito", "favorite": "preferito",
"next": "successivo", "next": "successivo",
"shuffle": "mescola", "shuffle": "riproduzione casuale",
"playbackFetchNoResults": "nessuna canzone trovata", "playbackFetchNoResults": "nessuna canzone trovata",
"playbackFetchInProgress": "caricamento canzoni…", "playbackFetchInProgress": "caricamento canzoni…",
"addNext": "aggiungi successivo", "addNext": "aggiungi successivo",
@@ -130,7 +152,9 @@
"shuffle_off": "non mescolare", "shuffle_off": "non mescolare",
"addLast": "aggiungi in coda", "addLast": "aggiungi in coda",
"mute": "silenzia", "mute": "silenzia",
"skip_forward": "salta avanti" "skip_forward": "salta avanti",
"playSimilarSongs": "riproduci brani simili",
"viewQueue": "visualizza coda"
}, },
"setting": { "setting": {
"crossfadeStyle_description": "seleziona lo stile dissolvenza da usare per il player audio", "crossfadeStyle_description": "seleziona lo stile dissolvenza da usare per il player audio",
@@ -150,7 +174,7 @@
"skipDuration_description": "imposta la durata da saltare quando vengono usati i pulsanti di salto nella barra del player", "skipDuration_description": "imposta la durata da saltare quando vengono usati i pulsanti di salto nella barra del player",
"enableRemote_description": "abilita il controllo remoto del server per permettere ad altri dispositivi di controllare l'applicazione", "enableRemote_description": "abilita il controllo remoto del server per permettere ad altri dispositivi di controllare l'applicazione",
"fontType_optionSystem": "font di sistema", "fontType_optionSystem": "font di sistema",
"mpvExecutablePath_description": "imposta il percorso dell'eseguibile di mpv", "mpvExecutablePath_description": "imposta il percorso dell'eseguibile mpv. se lasciato vuoto, verrà utilizzato il percorso predefinito",
"hotkey_favoriteCurrentSong": "$t(common.currentSong) preferita", "hotkey_favoriteCurrentSong": "$t(common.currentSong) preferita",
"crossfadeStyle": "stile dissolvenza", "crossfadeStyle": "stile dissolvenza",
"sidebarConfiguration": "configurazione barra laterale", "sidebarConfiguration": "configurazione barra laterale",
@@ -209,7 +233,7 @@
"hotkey_toggleShuffle": "attiva/disattiva mescolamento", "hotkey_toggleShuffle": "attiva/disattiva mescolamento",
"theme": "tema", "theme": "tema",
"playbackStyle_description": "selezione lo stile di riproduzione da usare per il player audio", "playbackStyle_description": "selezione lo stile di riproduzione da usare per il player audio",
"discordRichPresence_description": "abilita lo status del playback nello stato attività di {{discord}}. Le chiavi immagine sono: {{icon}}, {{playing}} e {{paused}} ", "discordRichPresence_description": "abilita lo stato di riproduzione nello stato attività di {{discord}}. Le chiavi immagine sono: {{icon}}, {{playing}} e {{paused}}",
"mpvExecutablePath": "percorso eseguibile mpv", "mpvExecutablePath": "percorso eseguibile mpv",
"audioDevice": "device audio", "audioDevice": "device audio",
"hotkey_rate2": "voto 2 stelle", "hotkey_rate2": "voto 2 stelle",
@@ -244,7 +268,7 @@
"customFontPath": "percorso font personalizzato", "customFontPath": "percorso font personalizzato",
"followLyric": "segui testo corrente", "followLyric": "segui testo corrente",
"crossfadeDuration": "durata dissolvenza", "crossfadeDuration": "durata dissolvenza",
"discordIdleStatus": "visualizza lo stato attività in stato inattivo", "discordIdleStatus": "mostra lo stato attività di Discord quando non stai riproducendo",
"audioPlayer": "player audio", "audioPlayer": "player audio",
"hotkey_zoomOut": "rimpicciolisci layout", "hotkey_zoomOut": "rimpicciolisci layout",
"hotkey_rate0": "rimuovi voto", "hotkey_rate0": "rimuovi voto",
@@ -268,7 +292,7 @@
"replayGainMode_description": "aggiusta il volume secondo i valori {{ReplayGain}} salvati nei metadati del file", "replayGainMode_description": "aggiusta il volume secondo i valori {{ReplayGain}} salvati nei metadati del file",
"showSkipButtons": "mostra pulsanti per saltare", "showSkipButtons": "mostra pulsanti per saltare",
"sampleRate": "frequenza di campionamento", "sampleRate": "frequenza di campionamento",
"sampleRate_description": "seleziona la frequenza di campionamento di output da usare se la frequenza di campionamento selezionata è diversa da quella della del media attuale", "sampleRate_description": "seleziona la frequenza di campionamento di output da utilizzare se quella selezionata è diversa da quella del file sorgente in riproduzione. Un valore inferiore a 8000 utilizzerà la frequenza predefinita",
"hotkey_togglePreviousSongFavorite": "imposta/rimuovi $t(common.previousSong) favorito", "hotkey_togglePreviousSongFavorite": "imposta/rimuovi $t(common.previousSong) favorito",
"hotkey_unfavoritePreviousSong": "rimuovi $t(common.previousSong) dai preferiti", "hotkey_unfavoritePreviousSong": "rimuovi $t(common.previousSong) dai preferiti",
"showSkipButton_description": "mostra o nascondi i pulsanti per saltare nella barra del player", "showSkipButton_description": "mostra o nascondi i pulsanti per saltare nella barra del player",
@@ -293,7 +317,94 @@
"clearQueryCache": "pulisci cache di feishin", "clearQueryCache": "pulisci cache di feishin",
"buttonSize_description": "Dimensione bottoni nella barra di riproduzione", "buttonSize_description": "Dimensione bottoni nella barra di riproduzione",
"clearCache": "pulisci la cache del browser", "clearCache": "pulisci la cache del browser",
"clearQueryCache_description": "\"leggera\" pulizia di feishin. verranno aggiornate le playlist, metadata delle tracce e i testi salvati. impostazioni, credenziali del server e le immagini salvate saranno mantenute" "clearQueryCache_description": "\"leggera\" pulizia di feishin. verranno aggiornate le playlist, metadata delle tracce e i testi salvati. impostazioni, credenziali del server e le immagini salvate saranno mantenute",
"albumBackground": "immagine di sfondo dell'album",
"albumBackground_description": "aggiunge un'immagine di sfondo per le pagine degli album contenenti l'album art",
"albumBackgroundBlur": "intensità sfocatura immagine di sfondo dell'album",
"albumBackgroundBlur_description": "regola la quantità di sfocatura applicata all'immagine di sfondo dell'album",
"artistConfiguration": "configurazione della pagina artista dellalbum",
"artistConfiguration_description": "configurare quali elementi vengono visualizzati, e in quale ordine, nella pagina dell'artista dell'album",
"buttonSize": "dimensione del bottone nella barra di riproduzione",
"clearCacheSuccess": "cache pulita correttamente",
"contextMenu": "configurazione menu contestuale (clic destro)",
"contextMenu_description": "consente di nascondere gli elementi che vengono visualizzati nel menu quando si fa clic destro su un elemento. gli oggetti non selezionati saranno nascosti",
"customCssEnable": "abilita css personalizzato",
"customCssEnable_description": "consente di scrivere css personalizzati.",
"customCssNotice": "Attenzione: sebbene ci sia una certa sanitizzazione (vengono bloccati url() e content:), luso di CSS personalizzati può comunque comportare dei rischi modificando linterfaccia.",
"customCss": "css personalizzato",
"customCss_description": "contenuto CSS personalizzato. Nota: le proprietà content e gli URL remoti non sono consentiti. Di seguito è mostrata unanteprima del tuo contenuto. Sono presenti anche altri campi non impostati da te a causa della sanitizzazione.",
"discordPausedStatus": "mostra lo stato attività di Discord quando la riproduzione è in pausa",
"discordPausedStatus_description": "quando abilitato, verrà mostrato lo stato del lettore in standby/pausa (nessun brano in riproduzione)",
"discordListening": "mostra stato come in ascolto",
"discordListening_description": "mostra lo stato come in ascolto invece che in riproduzione",
"discordServeImage": "recupera le immagini di {{discord}} dal server",
"discordServeImage_description": "condividi la copertina per lo stato attività di {{discord}} direttamente dal server, disponibile solo per Jellyfin e Navidrome",
"doubleClickBehavior": "aggiungi alla coda tutte le tracce cercate, con un doppio clic",
"doubleClickBehavior_description": "se attivato, tutte le tracce corrispondenti alla ricerca verranno aggiunte alla coda. altrimenti, verrà aggiunta alla coda solo la traccia selezionata",
"externalLinks": "mostra link esterni",
"externalLinks_description": "consente di visualizzare link esterni (Last.fm, MusicBrainz) sulle pagine di artista/album",
"preferLocalLyrics": "utilizza i testi locali",
"preferLocalLyrics_description": "usa i testi locali anziché quelli online, quando disponibili",
"genreBehavior": "comportamento predefinito della pagina genere",
"genreBehavior_description": "determina se cliccando su un genere si apre di default la lista dei brani o degli album",
"homeConfiguration": "configurazione della home page",
"homeConfiguration_description": "configura quali elementi vengono mostrati e in quale ordine nella home page",
"homeFeature": "carosello in evidenza nella home page",
"homeFeature_description": "controlla se mostrare il grande carosello in evidenza nella pagina principale",
"imageAspectRatio": "usa dimensioni originali(aspect ratio) della copertina",
"imageAspectRatio_description": "se abilitato, la copertina verrà mostrata utilizzando le dimesioni originali. per le immagini con rapporto diverso da 1:1, lo spazio residuo resterà vuoto",
"lastfm": "mostra links last.fm",
"lastfm_description": "mostra i link per last.fm sulle pagine di artista/album",
"lastfmApiKey": "{{lastfm}} chiave API",
"lastfmApiKey_description": "chiave API per {{lastfm}}. necessaria per visualizzare le copertine",
"mpvExtraParameters_help": "uno per linea",
"musicbrainz": "mostra links musicbrainz",
"musicbrainz_description": "mostra link a musicbrainz sulle pagine degli artisti/album, se è disponibile un mbid",
"neteaseTranslation": "Abilita traduzioni di NetEase",
"neteaseTranslation_description": "Se abilitato, recupera e mostra i testi tradotti da NetEase, se disponibili.",
"passwordStore": "Archivio di password/segreti",
"passwordStore_description": "specifica quale archivio di password e segreti utilizzare. modificalo in caso di problemi nel salvataggio delle credenziali.",
"playButtonBehavior_optionPlayShuffled": "$t(player.shuffle)",
"playerAlbumArtResolution": "risoluzione della copertina nel lettore",
"playerAlbumArtResolution_description": "la risoluzione dellanteprima della copertina nel lettore in formato grande. valori più alti la rendono più nitida, ma possono rallentare il caricamento. Il valore predefinito è 0, che indica la modalità automatica",
"sidePlayQueueStyle_optionAttached": "fissata",
"sidePlayQueueStyle_optionDetached": "sganciata",
"startMinimized": "avvia minimizzato",
"startMinimized_description": "avvia l'app nella barra di sistema",
"transcodeNote": "ha effetto dopo 1 brano (web) - 2 brani (mpv)",
"transcode": "abilita la transcodifica",
"transcode_description": "abilita la transcodifica in formati diversi",
"playerbarOpenDrawer": "attiva/disattiva schermo intero",
"playerbarOpenDrawer_description": "consente di cliccare sulla barra del lettore per aprire il lettore a schermo intero",
"replayGainClipping": "clipping di {{ReplayGain}}",
"replayGainFallback": "metodo alternativo di {{ReplayGain}}",
"transcodeBitrate": "bitrate per la transcodifica",
"transcodeBitrate_description": "seleziona il bitrate per la transcodifica. 0 significa lasciare che sia il server a scegliere",
"transcodeFormat": "formato per la transcodifica",
"transcodeFormat_description": "seleziona il formato per la transcodifica. se vuoto viene decisco dal server",
"translationApiProvider": "translation api provider",
"translationApiProvider_description": "api provider for translation",
"translationApiKey": "chiave api translation",
"translationApiKey_description": "chiave api per la traduzione (supporta solo endpoint di servizio globali)",
"translationTargetLanguage": "lingua di destinazione della traduzione",
"translationTargetLanguage_description": "lingua di destinazione per la traduzione",
"trayEnabled": "Mostra icona app nella barra di sistema",
"trayEnabled_description": "mostra/nascondi icona app nella barra si sistema. se disabilitato, disattiva anche minimizza/chiudi nella barra di sistema",
"volumeWidth": "larghezza della barra del volume",
"webAudio": "use audio web",
"webAudio_description": "usa audio web. abilita funzionalità avanzate come ReplayGain. disabilita se riscontri problemi",
"preservePitch": "mantieni tono (pitch)",
"preservePitch_description": "mantiene il tono (pitch) durante la modifica della velocità di riproduzione",
"volumeWidth_description": "larghezza del cursore del volume",
"discordDisplayType_description": "modifica cosa stai ascoltando nel tuo stato",
"discordDisplayType_songname": "titolo traccia",
"discordDisplayType_artistname": "nome artisti",
"hotkey_navigateHome": "vai alla schermata iniziale",
"notify": "abilita notifiche delle tracce",
"notify_description": "mostra una notifica quando cambia la traccia riprodotta",
"preventSleepOnPlayback": "non sospendere in riproduzione",
"preventSleepOnPlayback_description": "non sospendere il sistema quando la riproduzione è attiva",
"discordDisplayType": "stile dello stato su {{discord}}"
}, },
"error": { "error": {
"remotePortWarning": "riavvia il server per applicare la nuova porta", "remotePortWarning": "riavvia il server per applicare la nuova porta",
@@ -314,7 +425,12 @@
"mpvRequired": "MPV richiesto", "mpvRequired": "MPV richiesto",
"audioDeviceFetchError": "si è verificato un errore nel provare ad ottenre i device audio", "audioDeviceFetchError": "si è verificato un errore nel provare ad ottenre i device audio",
"invalidServer": "server non valido", "invalidServer": "server non valido",
"loginRateError": "troppi tentativi di accesso, per favore riprova tra qualche secondo" "loginRateError": "troppi tentativi di accesso, per favore riprova tra qualche secondo",
"badAlbum": "stai visualizzando questa pagina perché questa canzone non fa parte di un album. probabilmente vedi questo messaggio perché hai una canzone posizionata direttamente nella cartella principale della tua libreria musicale. jellyfin raggruppa le tracce solo se si trovano allinterno di una cartella.",
"badValue": "opzione non valida \"{{value}}\". valore inesistente",
"networkError": "si è verificato un errore di rete",
"openError": "impossibile aprire il file",
"notificationDenied": "i permessi per le notifiche non sono stati concessi. questa configurazione non ha effetto"
}, },
"filter": { "filter": {
"mostPlayed": "più riprodotti", "mostPlayed": "più riprodotti",
@@ -372,7 +488,9 @@
"settings": "$t(common.setting_other)", "settings": "$t(common.setting_other)",
"home": "$t(common.home)", "home": "$t(common.home)",
"artists": "$t(entity.artist_other)", "artists": "$t(entity.artist_other)",
"albumArtists": "$t(entity.albumArtist_other)" "albumArtists": "$t(entity.albumArtist_other)",
"myLibrary": "la mia libreria",
"shared": "condivisa $t(entity.playlist_other)"
}, },
"fullscreenPlayer": { "fullscreenPlayer": {
"config": { "config": {
@@ -386,11 +504,16 @@
"unsynchronized": "non sinncronizzato", "unsynchronized": "non sinncronizzato",
"lyricAlignment": "allineamento testo", "lyricAlignment": "allineamento testo",
"useImageAspectRatio": "usa le proporzioni dell'immagine", "useImageAspectRatio": "usa le proporzioni dell'immagine",
"lyricGap": "gap testo" "lyricGap": "gap testo",
"dynamicImageBlur": "intensità sfocatura immagine",
"dynamicIsImage": "abilita immagine di sfondo",
"lyricOffset": "ritardo testi (ms)"
}, },
"upNext": "successivamente", "upNext": "successivamente",
"lyrics": "testi", "lyrics": "testi",
"related": "correlati" "related": "correlati",
"visualizer": "visualizzatore audio",
"noLyrics": "nessun testo trovato"
}, },
"appMenu": { "appMenu": {
"selectServer": "seleziona server", "selectServer": "seleziona server",
@@ -402,7 +525,9 @@
"openBrowserDevtools": "apri devtools browser", "openBrowserDevtools": "apri devtools browser",
"quit": "$t(common.quit)", "quit": "$t(common.quit)",
"goBack": "torna indietro", "goBack": "torna indietro",
"goForward": "vai avanti" "goForward": "vai avanti",
"privateModeOff": "disabilita modalità privata",
"privateModeOn": "abilita modalità privata"
}, },
"contextMenu": { "contextMenu": {
"addToPlaylist": "$t(action.addToPlaylist)", "addToPlaylist": "$t(action.addToPlaylist)",
@@ -420,7 +545,15 @@
"addFavorite": "$t(action.addToFavorites)", "addFavorite": "$t(action.addToFavorites)",
"play": "$t(player.play)", "play": "$t(player.play)",
"numberSelected": "{{count}} selezionati", "numberSelected": "{{count}} selezionati",
"removeFromQueue": "$t(action.removeFromQueue)" "removeFromQueue": "$t(action.removeFromQueue)",
"download": "download",
"moveToNext": "$t(action.moveToNext)",
"playSimilarSongs": "$t(player.playSimilarSongs)",
"playShuffled": "$t(player.shuffle)",
"shareItem": "condividi elemento",
"showDetails": "mostra info",
"goToAlbum": "vai a $t(entity.album_one)",
"goToAlbumArtist": "vai a $t(entity.albumArtist_one)"
}, },
"home": { "home": {
"mostPlayed": "più riprodotti", "mostPlayed": "più riprodotti",
@@ -431,22 +564,28 @@
}, },
"albumDetail": { "albumDetail": {
"moreFromArtist": "di più da questo $t(entity.artist_one)", "moreFromArtist": "di più da questo $t(entity.artist_one)",
"moreFromGeneric": "di più da {{item}}" "moreFromGeneric": "di più da {{item}}",
"released": "rilasciato"
}, },
"setting": { "setting": {
"playbackTab": "riproduzione", "playbackTab": "riproduzione",
"generalTab": "generale", "generalTab": "generale",
"hotkeysTab": "tasti a scelta rapida", "hotkeysTab": "tasti a scelta rapida",
"windowTab": "finestra" "windowTab": "finestra",
"advanced": "avanzate"
}, },
"albumArtistList": { "albumArtistList": {
"title": "$t(entity.albumArtist_other)" "title": "$t(entity.albumArtist_other)"
}, },
"genreList": { "genreList": {
"title": "$t(entity.genre_other)" "title": "$t(entity.genre_other)",
"showAlbums": "mostra $t(entity.genre_one) $t(entity.album_other)",
"showTracks": "mostra $t(entity.genre_one) $t(entity.track_other)"
}, },
"trackList": { "trackList": {
"title": "$t(entity.track_other)" "title": "$t(entity.track_other)",
"artistTracks": "tracce di {{artist}}",
"genreTracks": "\"{{genre}}\" $t(entity.track_other)"
}, },
"globalSearch": { "globalSearch": {
"commands": { "commands": {
@@ -460,7 +599,36 @@
"title": "$t(entity.playlist_other)" "title": "$t(entity.playlist_other)"
}, },
"albumList": { "albumList": {
"title": "$t(entity.album_other)" "title": "$t(entity.album_other)",
"artistAlbums": "albums di {{artist}}",
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)"
},
"albumArtistDetail": {
"about": "Info {{artist}}",
"appearsOn": "compare su",
"recentReleases": "uscite recenti",
"viewDiscography": "mostra discografia",
"relatedArtists": "correlati $t(entity.artist_other)",
"topSongs": "brani migliori",
"topSongsFrom": "brani migliori da {{title}}",
"viewAll": "mostra tutto",
"viewAllTracks": "mostra tutto $t(entity.track_other)"
},
"manageServers": {
"title": "gestisci servers",
"serverDetails": "dettagli server",
"url": "URL",
"username": "nome utente",
"editServerDetailsTooltip": "modifica dettagli server",
"removeServer": "rimuovi server"
},
"itemDetail": {
"copyPath": "copia percorso negli appunti",
"copiedPath": "percorso copiato con successo",
"openFile": "mostra traccia nel gestore file"
},
"playlist": {
"reorder": "riordino abilitato solo quando si ordina per id"
} }
}, },
"form": { "form": {
@@ -491,7 +659,7 @@
"error_savePassword": "si è verificato un errore quando si è provato a salvare la password" "error_savePassword": "si è verificato un errore quando si è provato a salvare la password"
}, },
"addToPlaylist": { "addToPlaylist": {
"success": "aggiunto {{message}} $t(entity.track_other) a {{numOfPlaylists}} $t(entity.playlist_other)", "success": "aggiunto $t(entity.trackWithCount, {\"count\": {{message}} }) a $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })",
"title": "aggiungi a $t(entity.playlist_one)", "title": "aggiungi a $t(entity.playlist_one)",
"input_skipDuplicates": "salta duplicati", "input_skipDuplicates": "salta duplicati",
"input_playlists": "$t(entity.playlist_other)" "input_playlists": "$t(entity.playlist_other)"
@@ -502,7 +670,8 @@
}, },
"queryEditor": { "queryEditor": {
"input_optionMatchAll": "soddisfa tutti", "input_optionMatchAll": "soddisfa tutti",
"input_optionMatchAny": "soddisfa qualsiasi" "input_optionMatchAny": "soddisfa qualsiasi",
"title": "editor di query"
}, },
"lyricSearch": { "lyricSearch": {
"input_name": "$t(common.name)", "input_name": "$t(common.name)",
@@ -510,7 +679,22 @@
"title": "cerca testi" "title": "cerca testi"
}, },
"editPlaylist": { "editPlaylist": {
"title": "modifica $t(entity.playlist_one)" "title": "modifica $t(entity.playlist_one)",
"publicJellyfinNote": "Jellyfin non mostra se una playlist è pubblica o meno. Se vuoi che rimanga pubblica, assicurati di selezionare lopzione seguente",
"success": "$t(entity.playlist_one) aggiornato con successo"
},
"shareItem": {
"allowDownloading": "consentire il download",
"description": "descrizione",
"setExpiration": "imposta scadenza",
"success": "link di condivisione copiato negli appunti (o clicca qui per aprirlo)",
"expireInvalid": "la scadenza deve essere nel futuro",
"createFailed": "condivisione fallita (è abilitata la condivisione?)"
},
"privateMode": {
"enabled": "la modalità privata è abilitata: lo stato di riproduzione viene ora nascosto alle integrazioni esterne",
"disabled": "la modalità privata è disabilitata: lo stato di riproduzione è ora visibile alle integrazioni esterne abilitate",
"title": "modalità privata"
} }
}, },
"table": { "table": {
@@ -520,11 +704,17 @@
"gap": "$t(common.gap)", "gap": "$t(common.gap)",
"tableColumns": "tabella colonne", "tableColumns": "tabella colonne",
"autoFitColumns": "adatta colonne automaticamente", "autoFitColumns": "adatta colonne automaticamente",
"size": "$t(common.size)" "size": "$t(common.size)",
"followCurrentSong": "segui il brano corrente",
"itemGap": "spaziatura tra gli elementi (px)",
"itemSize": "dimensione dellelemento (px)"
}, },
"view": { "view": {
"table": "tabella", "table": "tabella",
"card": "Scheda" "card": "Scheda",
"grid": "griglia",
"list": "lista",
"poster": "poster"
}, },
"label": { "label": {
"releaseDate": "data rilascio", "releaseDate": "data rilascio",
@@ -552,7 +742,9 @@
"discNumber": "numero disco", "discNumber": "numero disco",
"favorite": "$t(common.favorite)", "favorite": "$t(common.favorite)",
"year": "$t(common.year)", "year": "$t(common.year)",
"albumArtist": "$t(entity.albumArtist_one)" "albumArtist": "$t(entity.albumArtist_one)",
"codec": "$t(common.codec)",
"songCount": "$t(entity.track_other)"
} }
}, },
"column": { "column": {
@@ -578,7 +770,8 @@
"path": "percorso", "path": "percorso",
"discNumber": "disco", "discNumber": "disco",
"channels": "$t(common.channel_other)", "channels": "$t(common.channel_other)",
"size": "$t(common.size)" "size": "$t(common.size)",
"codec": "$t(common.codec)"
} }
}, },
"entity": { "entity": {
@@ -627,6 +820,12 @@
"genreWithCount_other": "{{count}} generi", "genreWithCount_other": "{{count}} generi",
"trackWithCount_one": "{{count}} traccia", "trackWithCount_one": "{{count}} traccia",
"trackWithCount_many": "{{count}} tracce", "trackWithCount_many": "{{count}} tracce",
"trackWithCount_other": "{{count}} tracce" "trackWithCount_other": "{{count}} tracce",
"play_one": "{{count}} riproduzione",
"play_many": "{{count}} riproduzioni",
"play_other": "{{count}} riproduzioni",
"song_one": "traccia",
"song_many": "tracce",
"song_other": "tracce"
} }
} }
+1 -1
View File
@@ -122,7 +122,7 @@
"hotkey_toggleShuffle": "シャッフルの切り替え", "hotkey_toggleShuffle": "シャッフルの切り替え",
"theme": "テーマ", "theme": "テーマ",
"playbackStyle_description": "オーディオプレーヤーに使用する再生スタイルを選択します", "playbackStyle_description": "オーディオプレーヤーに使用する再生スタイルを選択します",
"discordRichPresence_description": "{{discord}} のRich Presenceに再生ステータスを表示するようにします。画像キー: {{icon}}, {{playing}}, {{paused}} ", "discordRichPresence_description": "{{discord}} のRich Presenceに再生ステータスを表示するようにします。画像キー: {{icon}}, {{playing}}, {{paused}}",
"mpvExecutablePath": "mpv 実行ファイルパス", "mpvExecutablePath": "mpv 実行ファイルパス",
"audioDevice": "オーディオデバイス", "audioDevice": "オーディオデバイス",
"hotkey_rate2": "2つ星で評価", "hotkey_rate2": "2つ星で評価",
+91 -9
View File
@@ -104,13 +104,21 @@
"year": "år", "year": "år",
"yes": "ja", "yes": "ja",
"descending": "synkende", "descending": "synkende",
"dismiss": "avkreft", "dismiss": "lukk",
"delete": "slett", "delete": "slett",
"description": "beskrivelse", "description": "beskrivelse",
"manage": "håndtere", "manage": "håndtere",
"maximize": "maksimer", "maximize": "maksimer",
"right": "høyre", "right": "høyre",
"sortOrder": "rekkefølge" "sortOrder": "rekkefølge",
"tags": "tagger",
"newVersion": "en ny versjon har blitt installert ({{version}})",
"viewReleaseNotes": "se utgivelsesnotater",
"additionalParticipants": "ytterligere deltakere",
"albumGain": "gjennomsnittlig lydnivå for album",
"albumPeak": "høyeste lydnivå for album",
"bitDepth": "bitdybde",
"sampleRate": "samplingsfrekvens"
}, },
"entity": { "entity": {
"smartPlaylist": "smart $t(entity.playlist_one)", "smartPlaylist": "smart $t(entity.playlist_one)",
@@ -153,7 +161,7 @@
"apiRouteError": "kan ikke behandle forespørselen", "apiRouteError": "kan ikke behandle forespørselen",
"mpvRequired": "MPV er påkrevd", "mpvRequired": "MPV er påkrevd",
"authenticationFailed": "autentisering feilet", "authenticationFailed": "autentisering feilet",
"badAlbum": "du ser denne siden fordi sangen ikke er med i et album. Mest sannsynlig opplever du dette problemet fordi du har en sang helt øverst i musikkmappen. jellyfin gruperer kun spor som ligger i en mappe.", "badAlbum": "du ser denne siden fordi sangen ikke er med i et album. Mest sannsynlig opplever du dette problemet fordi du har en sang helt øverst i musikkmappen. Jellyfin grupperer kun spor som ligger i en mappe.",
"endpointNotImplementedError": "endepunkt {{endpoint}} er ikke implementert for {{serverType}}", "endpointNotImplementedError": "endepunkt {{endpoint}} er ikke implementert for {{serverType}}",
"credentialsRequired": "innloggingsdetaljer er påkrevd", "credentialsRequired": "innloggingsdetaljer er påkrevd",
"genericError": "en feil har oppstått", "genericError": "en feil har oppstått",
@@ -171,7 +179,9 @@
"sessionExpiredError": "sesjonen din har utløpt", "sessionExpiredError": "sesjonen din har utløpt",
"remotePortWarning": "ta omstart av serveren for å aktivere ny port", "remotePortWarning": "ta omstart av serveren for å aktivere ny port",
"remoteDisableError": "en problem oppstod ved å $t(common.disable) serveren", "remoteDisableError": "en problem oppstod ved å $t(common.disable) serveren",
"remoteEnableError": "et problem oppstod ved å $t(common.enable) serveren" "remoteEnableError": "et problem oppstod ved å $t(common.enable) serveren",
"notificationDenied": "tillatelser for varsler ble avvist. Denne innstillingen har ingen effekt",
"badValue": "ugyldig alternativ \"{{value}}\". Denne verdien eksisterer ikke lenger"
}, },
"filter": { "filter": {
"bpm": "bpm", "bpm": "bpm",
@@ -214,7 +224,8 @@
"recentlyAdded": "nylig lagt til", "recentlyAdded": "nylig lagt til",
"channels": "$t(common.channel_other)", "channels": "$t(common.channel_other)",
"genre": "$t(entity.genre_one)", "genre": "$t(entity.genre_one)",
"trackNumber": "spor" "trackNumber": "spor",
"albumCount": "$t(entity.album_other) opptelling"
}, },
"form": { "form": {
"createPlaylist": { "createPlaylist": {
@@ -233,7 +244,7 @@
"addServer": { "addServer": {
"ignoreCors": "ignorer cors ($t(common.restartRequired))", "ignoreCors": "ignorer cors ($t(common.restartRequired))",
"ignoreSsl": "ignorer ssl ($t(common.restartRequired))", "ignoreSsl": "ignorer ssl ($t(common.restartRequired))",
"error_savePassword": "en problem oppstod ved lagring av passord", "error_savePassword": "et problem oppstod ved lagring av passord",
"input_savePassword": "lagre passord", "input_savePassword": "lagre passord",
"input_url": "lenke", "input_url": "lenke",
"input_username": "brukernavn", "input_username": "brukernavn",
@@ -269,6 +280,11 @@
"updateServer": { "updateServer": {
"success": "vellykket oppdatering av serveren", "success": "vellykket oppdatering av serveren",
"title": "oppdater server" "title": "oppdater server"
},
"queryEditor": {
"input_optionMatchAll": "match alle",
"input_optionMatchAny": "matche hvilken som helst",
"title": "redigeringsverktøy for spørringer"
} }
}, },
"page": { "page": {
@@ -338,7 +354,7 @@
"lyricGap": "sangtekstavstand", "lyricGap": "sangtekstavstand",
"dynamicImageBlur": "bilduskarphetstørrelse", "dynamicImageBlur": "bilduskarphetstørrelse",
"lyricAlignment": "sangtekstjustering", "lyricAlignment": "sangtekstjustering",
"lyricOffset": "sangtekstjustering (ms)", "lyricOffset": "sangtekstforskyvning (ms)",
"lyricSize": "sangtekststørrelse", "lyricSize": "sangtekststørrelse",
"opacity": "absorpsjon", "opacity": "absorpsjon",
"showLyricMatch": "vis sangteksttreff", "showLyricMatch": "vis sangteksttreff",
@@ -405,7 +421,8 @@
"search": "$t(common.search)", "search": "$t(common.search)",
"settings": "$t(common.setting_other)", "settings": "$t(common.setting_other)",
"shared": "delt $t(entity.playlist_other)", "shared": "delt $t(entity.playlist_other)",
"artists": "$t(entity.artist_other)" "artists": "$t(entity.artist_other)",
"myLibrary": "mitt bibliotek"
}, },
"setting": { "setting": {
"generalTab": "generelt", "generalTab": "generelt",
@@ -416,6 +433,9 @@
}, },
"playlistList": { "playlistList": {
"title": "$t(entity.playlist_other)" "title": "$t(entity.playlist_other)"
},
"playlist": {
"reorder": "omorganisering kun mulig ved sortering på id"
} }
}, },
"player": { "player": {
@@ -439,6 +459,68 @@
"queue_moveToTop": "flytt valgte til bunnen", "queue_moveToTop": "flytt valgte til bunnen",
"playbackFetchNoResults": "ingen sanger funnet", "playbackFetchNoResults": "ingen sanger funnet",
"playbackSpeed": "avspillingshastighet", "playbackSpeed": "avspillingshastighet",
"playSimilarSongs": "spill lignende sanger" "playSimilarSongs": "spill lignende sanger",
"skip": "hopp over",
"shuffle": "spill i tilfeldig rekkefølge",
"shuffle_off": "tilfeldig rekkefølge skrudd av",
"skip_back": "hopp bakover",
"skip_forward": "hopp fremover",
"stop": "stopp",
"toggleFullscreenPlayer": "bytt til fullskjermspiller",
"pause": "sett på pause",
"viewQueue": "se kø",
"unfavorite": "fjern fra favoritter"
},
"setting": {
"accentColor": "aksentfarge",
"accentColor_description": "setter aksentfarge i applikasjonen",
"albumBackground": "album bakgrunnsbilde",
"albumBackgroundBlur": "album bakgrunnsbilde uskarphetsstørrelse",
"albumBackgroundBlur_description": "justerer grad av uskarphet lagt til på album bakgrunnsbilde",
"audioDevice": "lydenhet",
"zoom": "zoomprosent",
"zoom_description": "angir zoomprosent for applikasjonen"
},
"table": {
"config": {
"label": {
"playCount": "antall avspillinger",
"releaseDate": "utgivelsesdato",
"trackNumber": "spornummer",
"rowIndex": "radindeks",
"dateAdded": "dato lagt til",
"discNumber": "skivenummer",
"lastPlayed": "sist avspilt"
},
"view": {
"table": "tabell",
"card": "kort",
"grid": "rutenett",
"list": "liste",
"poster": "plakat"
},
"general": {
"autoFitColumns": "automatisk kolonnetilpasning",
"displayType": "visningstype",
"followCurrentSong": "følg gjeldende sang"
}
},
"column": {
"releaseYear": "år",
"comment": "kommentar",
"biography": "biografi",
"album": "album",
"albumArtist": "albumartist",
"dateAdded": "dato lagt til",
"discNumber": "skive",
"favorite": "favoritt",
"lastPlayed": "sist avspilt",
"path": "sti",
"playCount": "avspillinger",
"rating": "vurdering",
"releaseDate": "utgivelsesdato",
"title": "tittel",
"trackNumber": "spor"
}
} }
} }
+11 -3
View File
@@ -20,7 +20,8 @@
"openIn": { "openIn": {
"lastfm": "Open in Last.fm", "lastfm": "Open in Last.fm",
"musicbrainz": "Open in MusicBrainz" "musicbrainz": "Open in MusicBrainz"
} },
"moveToNext": "ga naar volgende"
}, },
"common": { "common": {
"backward": "achteruit", "backward": "achteruit",
@@ -102,7 +103,12 @@
"size": "grootte", "size": "grootte",
"reload": "herlaad", "reload": "herlaad",
"setting": "instelling", "setting": "instelling",
"close": "sluiten" "close": "sluiten",
"additionalParticipants": "andere deelnemers",
"newVersion": "een nieuwe versie is geinstalleerd ({{version}})",
"viewReleaseNotes": "zie release notes",
"albumGain": "album gain",
"translation": "vertaling"
}, },
"filter": { "filter": {
"rating": "rating", "rating": "rating",
@@ -252,7 +258,9 @@
"genreWithCount_one": "{{count}} genre", "genreWithCount_one": "{{count}} genre",
"genreWithCount_other": "{{count}} genres", "genreWithCount_other": "{{count}} genres",
"trackWithCount_one": "{{count}} track", "trackWithCount_one": "{{count}} track",
"trackWithCount_other": "{{count}} tracks" "trackWithCount_other": "{{count}} tracks",
"song_one": "lied",
"song_other": "liedjes"
}, },
"table": { "table": {
"column": { "column": {

Some files were not shown because too many files have changed in this diff Show More