Compare commits
417 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| adfdf04240 | |||
| faa7281993 | |||
| 2d0f4e7881 | |||
| ce9183ffd6 | |||
| 3a5508653b | |||
| 7e4e28037c | |||
| d2d8ea8249 | |||
| ba835bec3e | |||
| 9850874dfd | |||
| 51a8285ba2 | |||
| e12150d026 | |||
| 54bc241984 | |||
| a698f83c45 | |||
| 854e7cc67e | |||
| c3920cbcc0 | |||
| 6a68cebc93 | |||
| ba474205c8 | |||
| dffe5bfffb | |||
| 7615c0d2ba | |||
| 216353837c | |||
| 7f180b2c50 | |||
| ce46e0f351 | |||
| 0999b93b47 | |||
| 63c21cf7c2 | |||
| 72ab1dc8a0 | |||
| 131e1ec11d | |||
| 4d60f5b8d9 | |||
| 6962a05c96 | |||
| 25ee57da1c | |||
| 37e41c9c8e | |||
| 69b6821deb | |||
| 8e6078515a | |||
| 73868dbcbf | |||
| 49ae774d48 | |||
| 5b3e2da95b | |||
| 1a5e513526 | |||
| ad83e95a46 | |||
| bdd5c78d39 | |||
| 6a0c2213a5 | |||
| 99515591f1 | |||
| b8228844df | |||
| 7613bc32c2 | |||
| 4d81dc49fa | |||
| 8c65775310 | |||
| 74c9d0ca6f | |||
| 871bb9da3a | |||
| 8ae1fb4fdb | |||
| 1a39182d80 | |||
| a1a837298f | |||
| 74b0e38f7e | |||
| c1f48b21a4 | |||
| a496c04701 | |||
| 590a7c7dfa | |||
| 796629b4e6 | |||
| ced3b491ff | |||
| 78aebd7c5d | |||
| 9532601efe | |||
| bd34a729b3 | |||
| 23990b581b | |||
| f786da52bb | |||
| ee145d6f65 | |||
| c310ad65ef | |||
| 26284e2412 | |||
| 6e4cd6912b | |||
| 974313c30b | |||
| 8ed586e2f3 | |||
| f016d2cdf4 | |||
| c79e041777 | |||
| a50984d2cb | |||
| 819945dcba | |||
| 9f81bff020 | |||
| b45594515e | |||
| 3a5d701195 | |||
| 34e037725c | |||
| b4fd7b6a66 | |||
| 81af324260 | |||
| a5541745c3 | |||
| 39d691d528 | |||
| 0c1537e5ef | |||
| 3405f853e3 | |||
| 8b0b53029c | |||
| f6012d3b03 | |||
| f4072c183b | |||
| 9a4a8eb742 | |||
| dbfb547af9 | |||
| 0492b867aa | |||
| b7cbb3055a | |||
| c3c18e22ea | |||
| 9318d00a5b | |||
| a5940a9124 | |||
| 9a8986834e | |||
| c5d2c60d70 | |||
| 52d2cf5cb4 | |||
| a63763bfe8 | |||
| 15633d07f0 | |||
| 04f7c7fdd4 | |||
| 1c6ee88912 | |||
| c53b2f8ed8 | |||
| 5c2c18268b | |||
| 5fd0ffaa4f | |||
| 4d0b0d0c8d | |||
| 45df497ee6 | |||
| 2dd83b111f | |||
| 6b599bf53d | |||
| d10e4a3d68 | |||
| 7f1c4a4d18 | |||
| c3d4f6cacd | |||
| dad3d10a83 | |||
| 5c06624f8c | |||
| cf428a14a3 | |||
| a0e09b80cf | |||
| 0e388dabf5 | |||
| 27a5153b8a | |||
| cad3b4c905 | |||
| bda82a8198 | |||
| b9d14e03f1 | |||
| ea46b98400 | |||
| 123f09da6c | |||
| 4155cd0963 | |||
| 27f82aef94 | |||
| 9f9d685353 | |||
| 9b97a3fa61 | |||
| 5b519320c2 | |||
| 790782b799 | |||
| 8c5188dfd0 | |||
| d793e67b56 | |||
| 9bccf7c405 | |||
| 291daa434c | |||
| ef5daad1dd | |||
| 6cb5c95c1f | |||
| 37068a3b89 | |||
| 5901748b76 | |||
| 945a4052e2 | |||
| cd887f8615 | |||
| 3f3540dd2b | |||
| b4b0c6cedd | |||
| afd91d2ae3 | |||
| e0e1799902 | |||
| e64d77feba | |||
| ac944c43bb | |||
| aec2f85165 | |||
| 85a7df29db | |||
| 18d56f32cf | |||
| d1aed5007f | |||
| e2b20eb89b | |||
| a5fa022eb6 | |||
| 79e7d7a010 | |||
| 431ff76e19 | |||
| dc5414284a | |||
| a59e57572c | |||
| 2827b2ae01 | |||
| fc5024be90 | |||
| dab1103279 | |||
| f5dabc134a | |||
| 9e57125c96 | |||
| 8a14327aaf | |||
| b9311e841c | |||
| 46b80b9a18 | |||
| b6a670689c | |||
| 1a3fbe0a7a | |||
| 66a2b4c225 | |||
| 83c47454c6 | |||
| 0947e209ce | |||
| 1f12ef2151 | |||
| 8de80c00a8 | |||
| b79ebdfbef | |||
| a8604dd150 | |||
| c676f5b91f | |||
| 41054ed819 | |||
| d95204513f | |||
| 1850cc68d8 | |||
| c1c07b861e | |||
| 244aebb0f5 | |||
| ae49e3cf2f | |||
| 40f04d6800 | |||
| bc0ba8c116 | |||
| 746951b55f | |||
| 89d4698155 | |||
| 415cc71f74 | |||
| 0e41144a10 | |||
| b5dbb30b02 | |||
| bc40123891 | |||
| f465e34ea3 | |||
| eca925a4eb | |||
| 6442728931 | |||
| 7e67d0dac6 | |||
| 2fdc214c21 | |||
| 652be94eb2 | |||
| 93a5bafc38 | |||
| c2de979527 | |||
| fd78bdf8af | |||
| e0e82e7246 | |||
| cb749480a4 | |||
| 5ec8f1a904 | |||
| 83b20d9086 | |||
| 211f09fe19 | |||
| 03c1fb0ff2 | |||
| 834412ad31 | |||
| 7ae0aa198e | |||
| 5d24d90a7c | |||
| b5923539c2 | |||
| 3a9d49549c | |||
| ff272a5385 | |||
| 327875df6a | |||
| 9bbb213bc2 | |||
| 3122c1a058 | |||
| af055ab6dd | |||
| e34d84deee | |||
| 0596faf51e | |||
| 5f1867c14f | |||
| 1c6b204e80 | |||
| 29957780cb | |||
| fd0d783e7d | |||
| 5ec025a70e | |||
| dc0c6401de | |||
| 06fc7b391f | |||
| 8c91f1c52d | |||
| 968d991a1a | |||
| f4f75f342c | |||
| ba32832619 | |||
| 186811156e | |||
| 261c5541cd | |||
| 5c14d20f78 | |||
| c67731f852 | |||
| 0336f4afea | |||
| ace4c77bdc | |||
| ffe3f08705 | |||
| d06d1674d1 | |||
| a66c67e86d | |||
| 0cfc4119ba | |||
| af0354a4d5 | |||
| e696c0c636 | |||
| 6aeec1e89c | |||
| e406b27170 | |||
| 55cead87c8 | |||
| aaf840d358 | |||
| af8470e254 | |||
| c7809c62ce | |||
| cb47883328 | |||
| 588e0609fd | |||
| 091d2efb2e | |||
| e5c5985f0f | |||
| b7627fd469 | |||
| 22c0f8f8c6 | |||
| a7d2a427ec | |||
| 14cc4079a3 | |||
| bb93b0895e | |||
| 1a3e2eec70 | |||
| 926b77c770 | |||
| a4472bb449 | |||
| cd04d7a760 | |||
| 6356c55c81 | |||
| 37ed99d0fb | |||
| 72475fbcc2 | |||
| 0096aeeb1b | |||
| 91ccc71fcd | |||
| b00f9795bf | |||
| 255b9a9c2d | |||
| 8eab4933ae | |||
| 031f443238 | |||
| 72d0fca28b | |||
| 7aeadb531f | |||
| 4e213ea79e | |||
| b99ea61115 | |||
| 4a025f82e4 | |||
| 6ddaf0366c | |||
| 62183ecb58 | |||
| 3ee92b068b | |||
| 4dc3a0e8d1 | |||
| 43652ce65d | |||
| b08c8a1719 | |||
| 0385f13928 | |||
| 3bf2c585b8 | |||
| 7d05e4536b | |||
| 0553f3b5a2 | |||
| c01a0d79e1 | |||
| adc094005f | |||
| 5b7557bd45 | |||
| 6aa3905922 | |||
| aa75aaaffb | |||
| 62ab4b7a00 | |||
| 145dc5c99e | |||
| 82a566aee1 | |||
| 42058ff6d6 | |||
| 9841cfba38 | |||
| 6c8099efe5 | |||
| 8ba87d57cd | |||
| 4d57faa197 | |||
| 4129a8f56e | |||
| 1aa91fe2f5 | |||
| 5c399f7117 | |||
| 3c07f03651 | |||
| b26b6eab09 | |||
| b2579c031d | |||
| 98e2458a03 | |||
| b30e26ae7e | |||
| fd158b956a | |||
| 109788ebbb | |||
| ffdef596ad | |||
| 0a54f7c44c | |||
| d5d995de5f | |||
| 304c38db1e | |||
| ef631d12cc | |||
| 4006980b29 | |||
| f9c3c107bd | |||
| 7106b100ce | |||
| e2d56c70b1 | |||
| 1a930021b6 | |||
| 66699b9572 | |||
| 99be12e648 | |||
| dde4e1b33c | |||
| 88711eac2f | |||
| f21ca83179 | |||
| f43950874d | |||
| a3794158f0 | |||
| 7f52b31b40 | |||
| 18a864a049 | |||
| 4eac6457ea | |||
| df0d4b7032 | |||
| f0942c7795 | |||
| 396325f397 | |||
| 63015195b0 | |||
| e821397e6c | |||
| aae68853ef | |||
| f904aafd4a | |||
| 38b2508de6 | |||
| 8fee57157a | |||
| 6207cea9f1 | |||
| c299752e44 | |||
| 82e4f832eb | |||
| c8221c07ef | |||
| 710fc16f62 | |||
| 331cddcabb | |||
| b9a0d9b847 | |||
| 9c59a38f7a | |||
| b573999d33 | |||
| 35d8698ca0 | |||
| 23e4574667 | |||
| 7db15c7c72 | |||
| d94b220319 | |||
| acfc106f40 | |||
| 856400048b | |||
| a7c2a92f16 | |||
| fc3d700a57 | |||
| a60973ffee | |||
| a1114235d6 | |||
| 928b0b6f4d | |||
| 60d6d49eaa | |||
| 804a670bf1 | |||
| e51bb05564 | |||
| a21ee21652 | |||
| 8b2d162733 | |||
| cc76c9f31e | |||
| aa7a5037fa | |||
| 0acb1f54fc | |||
| 403ed8cae6 | |||
| 3db229ef68 | |||
| f0d22267c3 | |||
| 796e511626 | |||
| 06e757d3b2 | |||
| 0c8032d097 | |||
| 7cd86d1301 | |||
| 781df3ab06 | |||
| 88b9124185 | |||
| 48724f816c | |||
| 1a184a73de | |||
| e4b5cf36e1 | |||
| dff182cbc5 | |||
| fb8245539f | |||
| bb3cb4a6ad | |||
| fb2e30c484 | |||
| 73c5292cc1 | |||
| 800074dced | |||
| f78a572a3c | |||
| 97b20cec19 | |||
| fd833f683b | |||
| 076d9b3083 | |||
| 3a2a1b0dc8 | |||
| 20c19cac6f | |||
| 8205eeed22 | |||
| 5eb2cff6e9 | |||
| d822d9cd29 | |||
| 4142132ebc | |||
| fb2746323b | |||
| d9172efae9 | |||
| 8e04f98e26 | |||
| 51587fbb6b | |||
| cf06d69822 | |||
| 22751de2f6 | |||
| 04fbf5d3d2 | |||
| 936ba73fe4 | |||
| 05efd0f318 | |||
| ce570eddd2 | |||
| 5b1f269344 | |||
| 0806d9852a | |||
| c3e38d7133 | |||
| a322717e0e | |||
| dcb84dd442 | |||
| ac257a9dc1 | |||
| 25bfb65b6d | |||
| 96f38e597c | |||
| 383b728ddc | |||
| 003cfbdd6c | |||
| a67ae50d16 | |||
| ac3dcb5e17 | |||
| 833f82edff | |||
| 76f55111ec | |||
| f418bbfd2f | |||
| b02eba510d | |||
| 7a77b9bfe7 | |||
| c34b6774b9 | |||
| f3fe5b013a | |||
| 37be2cc8fa | |||
| e3c26aa5fa | |||
| e21f538aa4 | |||
| c9cd87bae5 | |||
| 9a8cb45510 |
@@ -5,6 +5,7 @@
|
||||
*.jpeg binary
|
||||
*.ico binary
|
||||
*.icns binary
|
||||
*.webp binary
|
||||
*.eot binary
|
||||
*.otf binary
|
||||
*.ttf binary
|
||||
|
||||
@@ -4,9 +4,24 @@ on:
|
||||
pull_request:
|
||||
branches:
|
||||
- development
|
||||
paths:
|
||||
- 'src/**'
|
||||
|
||||
jobs:
|
||||
wait-for-lint:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Wait for Test workflow to complete
|
||||
uses: lewagon/wait-on-check-action@v1.4.1
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.head.sha }}
|
||||
check-name: 'lint'
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
wait-interval: 10
|
||||
allowed-conclusions: success
|
||||
|
||||
publish:
|
||||
needs: wait-for-lint
|
||||
runs-on: ${{ matrix.os }}
|
||||
|
||||
strategy:
|
||||
|
||||
@@ -20,6 +20,8 @@ COPY --chown=nginx:nginx --from=builder /app/out/web /usr/share/nginx/html
|
||||
COPY ./settings.js.template /etc/nginx/templates/settings.js.template
|
||||
COPY ng.conf.template /etc/nginx/templates/default.conf.template
|
||||
|
||||
ENV PUBLIC_PATH="/"
|
||||
ENV SERVER_LOCK=false SERVER_NAME="" SERVER_TYPE="" SERVER_URL=""
|
||||
ENV LEGACY_AUTHENTICATION="" ANALYTICS_DISABLED="" PUBLIC_PATH="/"
|
||||
|
||||
EXPOSE 9180
|
||||
CMD ["nginx", "-g", "daemon off;"]
|
||||
|
||||
@@ -43,7 +43,7 @@ Rewrite of [Sonixd](https://github.com/jeffvli/sonixd).
|
||||
|
||||
## Screenshots
|
||||
|
||||
<a href="https://raw.githubusercontent.com/jeffvli/feishin/development/media/preview_full_screen_player.png"><img src="https://raw.githubusercontent.com/jeffvli/feishin/development/media/preview_full_screen_player.png" width="49.5%"/></a> <a href="https://raw.githubusercontent.com/jeffvli/feishin/development/media/preview_album_artist_detail.png"><img src="https://raw.githubusercontent.com/jeffvli/feishin/development/media/preview_album_artist_detail.png" width="49.5%"/></a> <a href="https://raw.githubusercontent.com/jeffvli/feishin/development/media/preview_album_detail.png"><img src="https://raw.githubusercontent.com/jeffvli/feishin/development/media/preview_album_detail.png" width="49.5%"/></a> <a href="https://raw.githubusercontent.com/jeffvli/feishin/development/media/preview_smart_playlist.png"><img src="https://raw.githubusercontent.com/jeffvli/feishin/development/media/preview_smart_playlist.png" width="49.5%"/></a>
|
||||
<a href="./media/preview_full_screen_player.png"><img src="./media/preview_full_screen_player.png" width="49.5%"/></a> <a href="./media/preview_album_artist_detail.png"><img src="./media/preview_album_artist_detail.png" width="49.5%"/></a> <a href="./media/preview_album_detail.png"><img src="./media/preview_album_detail.png" width="49.5%"/></a> <a href="./media/preview_smart_playlist.png"><img src="./media/preview_smart_playlist.png" width="49.5%"/></a>
|
||||
|
||||
## Getting Started
|
||||
|
||||
@@ -62,18 +62,21 @@ For media keys to work, you will be prompted to allow Feishin to be a Trusted Ac
|
||||
We provide a small install script to download the latest `.AppImage`, make it executable, and also download the icons required by Desktop Environments. Finally, it generates a `.desktop` file to add Feishin to your Application Launcher.
|
||||
|
||||
Simply run the installer like this:
|
||||
|
||||
```sh
|
||||
dir=/your/application/directory
|
||||
curl 'https://raw.githubusercontent.com/jeffvli/feishin/refs/heads/development/install-feishin-appimage' | sh -s -- "$dir"
|
||||
```
|
||||
|
||||
The script also has an option to add launch arguments to run Feishin in native Wayland mode. Note that this is experimental in Electron and therefore not officially supported. If you want to use it, run this instead:
|
||||
|
||||
```sh
|
||||
dir=/your/application/directory
|
||||
curl 'https://raw.githubusercontent.com/jeffvli/feishin/refs/heads/development/install-feishin-appimage' | sh -s -- "$dir" wayland-native
|
||||
```
|
||||
|
||||
It also provides a simple uninstall routine, removing the downloaded files:
|
||||
|
||||
```sh
|
||||
dir=/your/application/directory
|
||||
curl 'https://raw.githubusercontent.com/jeffvli/feishin/refs/heads/development/install-feishin-appimage' | sh -s -- "$dir" remove
|
||||
@@ -105,18 +108,17 @@ services:
|
||||
feishin:
|
||||
container_name: feishin
|
||||
image: 'ghcr.io/jeffvli/feishin:latest'
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- SERVER_NAME=jellyfin # pre defined server name
|
||||
- SERVER_NAME=jellyfin # pre-defined server name
|
||||
- SERVER_LOCK=true # When true AND name/type/url are set, only username/password can be toggled
|
||||
- SERVER_TYPE=jellyfin # navidrome also works
|
||||
- SERVER_URL= # http://address:port
|
||||
- PUID=1000
|
||||
- PGID=1000
|
||||
- UMASK=002
|
||||
- TZ=America/Los_Angeles
|
||||
- SERVER_TYPE=jellyfin # the allowed types are: jellyfin, navidrome, subsonic. These values are case insensitive
|
||||
- SERVER_URL= # http://address:port or https://address:port
|
||||
- LEGACY_AUTHENTICATION=false # When SERVER_LOCK is true, sets the legacy (plaintext) authentication flag for Subsonic/OpenSubsonic servers
|
||||
- ANALYTICS_DISABLED=true # Set to true to disable Umami analytics tracking
|
||||
ports:
|
||||
- 9180:9180
|
||||
restart: unless-stopped
|
||||
# Alternatively, to restrict to only localhost, - 127.0.0.1:9180:8190
|
||||
```
|
||||
|
||||
### Configuration
|
||||
@@ -130,7 +132,9 @@ services:
|
||||
|
||||
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`.
|
||||
|
||||
4. _Optional_ - To hard code the server url, pass the following environment variables: `SERVER_NAME`, `SERVER_TYPE` (one of `jellyfin` or `navidrome` or `subsonic`), `SERVER_URL`. To prevent users from changing these settings, pass `SERVER_LOCK=true`. This can only be set if all three of the previous values are set.
|
||||
4. _Optional_ - To hard code the server url, pass the following environment variables: `SERVER_NAME`, `SERVER_TYPE` (one of `jellyfin` or `navidrome` or `subsonic`), `SERVER_URL`. To prevent users from changing these settings, pass `SERVER_LOCK=true`. This can only be set if all three of the previous values are set. When `SERVER_LOCK=true`, you can also set `LEGACY_AUTHENTICATION=true` or `LEGACY_AUTHENTICATION=false` to configure the legacy authentication flag for the server (only applicable for Subsonic/OpenSubsonic servers).
|
||||
|
||||
5. _Optional_ - To disable Umami analytics tracking in the Docker/web version, set the environment variable `ANALYTICS_DISABLED=true`. When enabled, the analytics script will not be loaded and all tracking will be disabled.
|
||||
|
||||
## FAQ
|
||||
|
||||
|
||||
|
After Width: | Height: | Size: 645 B |
|
After Width: | Height: | Size: 301 B |
|
After Width: | Height: | Size: 535 B |
@@ -1,13 +1,15 @@
|
||||
version: '3.5'
|
||||
services:
|
||||
feishin:
|
||||
container_name: feishin
|
||||
image: ghcr.io/jeffvli/feishin:latest
|
||||
image: "ghcr.io/jeffvli/feishin:latest"
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- SERVER_NAME=jellyfin # pre-defined server name
|
||||
- SERVER_LOCK=false # When true AND name/type/url are set, only username/password can be toggled
|
||||
- SERVER_TYPE=jellyfin # the allowed types are: jellyfin, navidrome, subsonic. These values are case insensitive
|
||||
- SERVER_URL=http://localhost:8096 # http://address:port or https://address:port
|
||||
- LEGACY_AUTHENTICATION=false # When SERVER_LOCK is true, sets the legacyauth flag for server authentication (true or false)
|
||||
- ANALYTICS_DISABLED=false # Set to true to disable Umami analytics tracking
|
||||
ports:
|
||||
- 9180:9180
|
||||
environment:
|
||||
- SERVER_NAME=jellyfin # pre defined server name
|
||||
- SERVER_LOCK=true # When true AND name/type/url are set, only username/password can be toggled
|
||||
- SERVER_TYPE=jellyfin # navidrome also works
|
||||
- SERVER_URL= # http://address:port
|
||||
# Alternatively, to restrict to only localhost, - 127.0.0.1:9180:8190
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
appId: org.jeffvli.feishin
|
||||
productName: Feishin
|
||||
artifactName: ${productName}-${version}-${os}-${arch}.${ext}
|
||||
electronVersion: 38.5.0
|
||||
electronVersion: 39.4.0
|
||||
directories:
|
||||
buildResources: assets
|
||||
files:
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
appId: org.jeffvli.feishin
|
||||
productName: Feishin
|
||||
artifactName: ${productName}-${version}-${os}-${arch}.${ext}
|
||||
electronVersion: 38.5.0
|
||||
electronVersion: 39.4.0
|
||||
directories:
|
||||
buildResources: assets
|
||||
files:
|
||||
@@ -15,7 +15,7 @@ win:
|
||||
target:
|
||||
- zip
|
||||
- nsis
|
||||
icon: assets/icons/icon.png
|
||||
icon: assets/icons/icon.ico
|
||||
|
||||
nsis:
|
||||
allowToChangeInstallationDirectory: true
|
||||
|
||||
@@ -6,6 +6,7 @@ import dynamicImportPlugin from 'vite-plugin-dynamic-import';
|
||||
import { ViteEjsPlugin } from 'vite-plugin-ejs';
|
||||
|
||||
const currentOSEnv = process.platform;
|
||||
const electronRendererTarget = 'chrome87';
|
||||
|
||||
const config: UserConfig = {
|
||||
main: {
|
||||
@@ -36,6 +37,9 @@ const config: UserConfig = {
|
||||
},
|
||||
},
|
||||
preload: {
|
||||
build: {
|
||||
sourcemap: true,
|
||||
},
|
||||
plugins: [externalizeDepsPlugin()],
|
||||
resolve: {
|
||||
alias: {
|
||||
@@ -48,7 +52,11 @@ const config: UserConfig = {
|
||||
build: {
|
||||
cssMinify: 'esbuild',
|
||||
minify: 'esbuild',
|
||||
modulePreload: {
|
||||
polyfill: false,
|
||||
},
|
||||
sourcemap: true,
|
||||
target: electronRendererTarget,
|
||||
},
|
||||
css: {
|
||||
modules: {
|
||||
|
||||
|
Before Width: | Height: | Size: 644 KiB After Width: | Height: | Size: 733 KiB |
|
Before Width: | Height: | Size: 186 KiB After Width: | Height: | Size: 371 KiB |
|
Before Width: | Height: | Size: 465 KiB After Width: | Height: | Size: 869 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 49 KiB |
|
Before Width: | Height: | Size: 887 KiB After Width: | Height: | Size: 990 KiB |
|
Before Width: | Height: | Size: 396 KiB After Width: | Height: | Size: 356 KiB |
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "feishin",
|
||||
"version": "0.22.0",
|
||||
"version": "1.4.2",
|
||||
"description": "A modern self-hosted music player.",
|
||||
"keywords": [
|
||||
"subsonic",
|
||||
@@ -30,7 +30,7 @@
|
||||
"dev:watch": "electron-vite dev --watch",
|
||||
"i18next": "i18next -c src/i18n/i18next-parser.config.js",
|
||||
"postinstall": "electron-builder install-app-deps",
|
||||
"lint": "pnpm run lint-code && pnpm run lint-styles",
|
||||
"lint": "pnpm run typecheck && pnpm run lint-code && pnpm run lint-styles",
|
||||
"lint-code": "eslint --max-warnings=0 --cache .",
|
||||
"lint-code:fix": "eslint --cache --fix .",
|
||||
"lint-styles": "stylelint --max-warnings=0 'src/**/*.{css,scss}'",
|
||||
@@ -82,6 +82,8 @@
|
||||
"@xhayper/discord-rpc": "^1.3.0",
|
||||
"audiomotion-analyzer": "^4.5.1",
|
||||
"axios": "^1.13.2",
|
||||
"butterchurn": "^3.0.0-beta.5",
|
||||
"butterchurn-presets": "^3.0.0-beta.4",
|
||||
"cheerio": "^1.1.2",
|
||||
"clsx": "^2.1.1",
|
||||
"cmdk": "^1.1.1",
|
||||
@@ -110,7 +112,7 @@
|
||||
"nuqs": "^2.7.1",
|
||||
"overlayscrollbars": "^2.11.1",
|
||||
"overlayscrollbars-react": "^0.5.6",
|
||||
"qs": "^6.14.0",
|
||||
"qs": "^6.14.1",
|
||||
"react": "^19.1.0",
|
||||
"react-call": "^1.8.1",
|
||||
"react-dom": "^19.1.0",
|
||||
@@ -118,9 +120,9 @@
|
||||
"react-i18next": "^16.3.3",
|
||||
"react-icons": "^5.5.0",
|
||||
"react-image": "^4.1.0",
|
||||
"react-loading-skeleton": "^3.5.0",
|
||||
"react-player": "^2.16.0",
|
||||
"react-router": "^7.9.6",
|
||||
"react-split-pane": "^3.0.4",
|
||||
"react-virtualized-auto-sizer": "^1.0.26",
|
||||
"react-window": "1.8.11",
|
||||
"react-window-v2": "npm:react-window@^2.2.3",
|
||||
@@ -147,7 +149,7 @@
|
||||
"@vitejs/plugin-react": "^5.1.1",
|
||||
"concurrently": "^9.2.1",
|
||||
"cross-env": "^10.1.0",
|
||||
"electron": "^38.5.0",
|
||||
"electron": "^39.4.0",
|
||||
"electron-builder": "^26.0.12",
|
||||
"electron-devtools-installer": "^4.0.0",
|
||||
"electron-vite": "^4.0.1",
|
||||
|
||||
@@ -19,10 +19,10 @@ importers:
|
||||
version: 1.1.0
|
||||
'@electron-toolkit/preload':
|
||||
specifier: ^3.0.1
|
||||
version: 3.0.2(electron@38.5.0)
|
||||
version: 3.0.2(electron@39.4.0)
|
||||
'@electron-toolkit/utils':
|
||||
specifier: ^4.0.0
|
||||
version: 4.0.0(electron@38.5.0)
|
||||
version: 4.0.0(electron@39.4.0)
|
||||
'@mantine/colors-generator':
|
||||
specifier: ^8.3.8
|
||||
version: 8.3.8(chroma-js@3.1.2)
|
||||
@@ -71,6 +71,12 @@ importers:
|
||||
axios:
|
||||
specifier: ^1.13.2
|
||||
version: 1.13.2
|
||||
butterchurn:
|
||||
specifier: ^3.0.0-beta.5
|
||||
version: 3.0.0-beta.5
|
||||
butterchurn-presets:
|
||||
specifier: ^3.0.0-beta.4
|
||||
version: 3.0.0-beta.4
|
||||
cheerio:
|
||||
specifier: ^1.1.2
|
||||
version: 1.1.2
|
||||
@@ -156,8 +162,8 @@ importers:
|
||||
specifier: ^0.5.6
|
||||
version: 0.5.6(overlayscrollbars@2.11.3)(react@19.1.0)
|
||||
qs:
|
||||
specifier: ^6.14.0
|
||||
version: 6.14.0
|
||||
specifier: ^6.14.1
|
||||
version: 6.14.1
|
||||
react:
|
||||
specifier: ^19.1.0
|
||||
version: 19.1.0
|
||||
@@ -179,15 +185,15 @@ importers:
|
||||
react-image:
|
||||
specifier: ^4.1.0
|
||||
version: 4.1.0(@babel/runtime@7.28.4)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
|
||||
react-loading-skeleton:
|
||||
specifier: ^3.5.0
|
||||
version: 3.5.0(react@19.1.0)
|
||||
react-player:
|
||||
specifier: ^2.16.0
|
||||
version: 2.16.0(react@19.1.0)
|
||||
react-router:
|
||||
specifier: ^7.9.6
|
||||
version: 7.9.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
|
||||
react-split-pane:
|
||||
specifier: ^3.0.4
|
||||
version: 3.0.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
|
||||
react-virtualized-auto-sizer:
|
||||
specifier: ^1.0.26
|
||||
version: 1.0.26(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
|
||||
@@ -262,8 +268,8 @@ importers:
|
||||
specifier: ^10.1.0
|
||||
version: 10.1.0
|
||||
electron:
|
||||
specifier: ^38.5.0
|
||||
version: 38.5.0
|
||||
specifier: ^39.4.0
|
||||
version: 39.4.0
|
||||
electron-builder:
|
||||
specifier: ^26.0.12
|
||||
version: 26.0.12(electron-builder-squirrel-windows@26.0.12)
|
||||
@@ -352,6 +358,9 @@ packages:
|
||||
peerDependencies:
|
||||
ajv: '>=8'
|
||||
|
||||
'@assemblyscript/loader@0.17.14':
|
||||
resolution: {integrity: sha512-+PVTOfla/0XMLRTQLJFPg4u40XcdTfon6GGea70hBGi8Pd7ZymIXyVUR+vK8wt5Jb4MVKTKPIz43Myyebw5mZA==}
|
||||
|
||||
'@atlaskit/pragmatic-drag-and-drop-auto-scroll@2.1.2':
|
||||
resolution: {integrity: sha512-6BgAUxSNbQFiG3uqNxf53cDQADn5mSeh/JsQzCHo46GPQnVWIJk77zWC8yZ++0Mfg1ECy02zNrbniF7SgHAhXQ==}
|
||||
|
||||
@@ -880,8 +889,8 @@ packages:
|
||||
resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==}
|
||||
engines: {node: '>=6.9.0'}
|
||||
|
||||
'@bufbuild/protobuf@2.10.1':
|
||||
resolution: {integrity: sha512-ckS3+vyJb5qGpEYv/s1OebUHDi/xSNtfgw1wqKZo7MR9F2z+qXr0q5XagafAG/9O0QPVIUfST0smluYSTpYFkg==}
|
||||
'@bufbuild/protobuf@2.10.2':
|
||||
resolution: {integrity: sha512-uFsRXwIGyu+r6AMdz+XijIIZJYpoWeYzILt5yZ2d3mCjQrWUTVpVD9WL/jZAbvp+Ed04rOhrsk7FiTcEDseB5A==}
|
||||
|
||||
'@cacheable/memoize@2.0.3':
|
||||
resolution: {integrity: sha512-hl9wfQgpiydhQEIv7fkjEzTGE+tcosCXLKFDO707wYJ/78FVOlowb36djex5GdbSyeHnG62pomYLMuV/OT8Pbw==}
|
||||
@@ -2279,8 +2288,8 @@ packages:
|
||||
resolution: {integrity: sha512-JMWsdF+O8Orq3EMukbUN1QfbLK9mX2CkUmQBcW2T0s8OmdAUL5LLM/6wFwSrqXzlXB13yhyK9gTKS1rIizOduQ==}
|
||||
hasBin: true
|
||||
|
||||
baseline-browser-mapping@2.8.32:
|
||||
resolution: {integrity: sha512-OPz5aBThlyLFgxyhdwf/s2+8ab3OvT7AdTNvKHBwpXomIYeXqpUUuT8LrdtxZSsWJ4R4CU1un4XGh5Ez3nlTpw==}
|
||||
baseline-browser-mapping@2.9.11:
|
||||
resolution: {integrity: sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==}
|
||||
hasBin: true
|
||||
|
||||
bind-event-listener@3.0.0:
|
||||
@@ -2332,8 +2341,8 @@ packages:
|
||||
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
|
||||
hasBin: true
|
||||
|
||||
browserslist@4.28.0:
|
||||
resolution: {integrity: sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==}
|
||||
browserslist@4.28.1:
|
||||
resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==}
|
||||
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
|
||||
hasBin: true
|
||||
|
||||
@@ -2359,6 +2368,12 @@ packages:
|
||||
builder-util@26.0.11:
|
||||
resolution: {integrity: sha512-xNjXfsldUEe153h1DraD0XvDOpqGR0L5eKFkdReB7eFW5HqysDZFfly4rckda6y9dF39N3pkPlOblcfHKGw+uA==}
|
||||
|
||||
butterchurn-presets@3.0.0-beta.4:
|
||||
resolution: {integrity: sha512-TbQLUPvGOYMZAtWKoCmBtludh9aQZ6NaMGQU4lvPeadBPy3Du3yNmwBjlTMLP5c5mRWElxQPjTL1PtR7FZK3OQ==}
|
||||
|
||||
butterchurn@3.0.0-beta.5:
|
||||
resolution: {integrity: sha512-BStK4OAbBb9Pvt8PuQlS4WVmYBwU1KuDMRHF1V89QjoIFauAqq7tpV4EpYXj7K563r5daLrMX+2y5DBhZZ9Xig==}
|
||||
|
||||
cac@6.7.14:
|
||||
resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
|
||||
engines: {node: '>=8'}
|
||||
@@ -2401,8 +2416,8 @@ packages:
|
||||
caniuse-lite@1.0.30001751:
|
||||
resolution: {integrity: sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==}
|
||||
|
||||
caniuse-lite@1.0.30001757:
|
||||
resolution: {integrity: sha512-r0nnL/I28Zi/yjk1el6ilj27tKcdjLsNqAOZr0yVjWPrSQyHgKI2INaEWw21bAQSv2LXRt1XuCS/GomNpWOxsQ==}
|
||||
caniuse-lite@1.0.30001762:
|
||||
resolution: {integrity: sha512-PxZwGNvH7Ak8WX5iXzoK1KPZttBXNPuaOvI2ZYU7NrlM+d9Ov+TUvlLOBNGzVXAntMSMMlJPd+jY6ovrVjSmUw==}
|
||||
|
||||
chalk@4.1.2:
|
||||
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
|
||||
@@ -2779,6 +2794,12 @@ packages:
|
||||
eastasianwidth@0.2.0:
|
||||
resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
|
||||
|
||||
ecma-proposal-math-extensions@0.0.2:
|
||||
resolution: {integrity: sha512-80BnDp2Fn7RxXlEr5HHZblniY4aQ97MOAicdWWpSo0vkQiISSE9wLR4SqxKsu4gCtXFBIPPzy8JMhay4NWRg/Q==}
|
||||
|
||||
eel-wasm@0.0.16:
|
||||
resolution: {integrity: sha512-1tkId7I7E1Vs4fXTRsH83Sjn2S/AbzrVQKLBRGys6NLc3eVH4NBffJsdEeLHOWWUgQpVXBEP3CV/srUZNIuBnw==}
|
||||
|
||||
ejs@3.1.10:
|
||||
resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
@@ -2820,8 +2841,8 @@ packages:
|
||||
electron-to-chromium@1.5.242:
|
||||
resolution: {integrity: sha512-msZ7SYGFpXkm/iUizlMrm/FPNeYo8uSltQccLVFO3fV4RN2JWGdG7Aatztxtw3uDWp3DkupfkrosLjUnhY+iOw==}
|
||||
|
||||
electron-to-chromium@1.5.262:
|
||||
resolution: {integrity: sha512-NlAsMteRHek05jRUxUR0a5jpjYq9ykk6+kO0yRaMi5moe7u0fVIOeQ3Y30A8dIiWFBNUoQGi1ljb1i5VtS9WQQ==}
|
||||
electron-to-chromium@1.5.267:
|
||||
resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==}
|
||||
|
||||
electron-updater@6.6.2:
|
||||
resolution: {integrity: sha512-Cr4GDOkbAUqRHP5/oeOmH/L2Bn6+FQPxVLZtPbcmKZC63a1F3uu5EefYOssgZXG3u/zBlubbJ5PJdITdMVggbw==}
|
||||
@@ -2841,8 +2862,8 @@ packages:
|
||||
resolution: {integrity: sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==}
|
||||
engines: {node: '>=8.0.0'}
|
||||
|
||||
electron@38.5.0:
|
||||
resolution: {integrity: sha512-dbC7V+eZweerYMJfxQldzHOg37a1VdNMCKxrJxlkp3cA30gOXtXSg4ZYs07L5+QwI19WOy1uyvtEUgbw1RRsCQ==}
|
||||
electron@39.4.0:
|
||||
resolution: {integrity: sha512-NCK/FTAqgG/N+09OXFES6bubamgPZs7TEPIjWZIrbEnm8GzEwxC22ZG6SEPid2DmJnJmBurJ6M0G4EShdSc28Q==}
|
||||
engines: {node: '>= 12.20.55'}
|
||||
hasBin: true
|
||||
|
||||
@@ -3178,6 +3199,10 @@ packages:
|
||||
resolution: {integrity: sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==}
|
||||
engines: {node: '>=14.14'}
|
||||
|
||||
fs-extra@11.3.3:
|
||||
resolution: {integrity: sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==}
|
||||
engines: {node: '>=14.14'}
|
||||
|
||||
fs-extra@7.0.1:
|
||||
resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==}
|
||||
engines: {node: '>=6 <7 || >=8'}
|
||||
@@ -3763,9 +3788,6 @@ packages:
|
||||
jsonfile@4.0.0:
|
||||
resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==}
|
||||
|
||||
jsonfile@6.1.0:
|
||||
resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
|
||||
|
||||
jsonfile@6.2.0:
|
||||
resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==}
|
||||
|
||||
@@ -4475,8 +4497,8 @@ packages:
|
||||
resolution: {integrity: sha512-7gJ6mxcQb9vUBOtbKm5mDevbe2uRcOEVp1g4gb/Q+oLntB3HY8eBhOYRxFI2mlDFlY1e4DOSCptzxarXRvzxCA==}
|
||||
engines: {node: '>=20'}
|
||||
|
||||
qs@6.14.0:
|
||||
resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==}
|
||||
qs@6.14.1:
|
||||
resolution: {integrity: sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==}
|
||||
engines: {node: '>=0.6'}
|
||||
|
||||
queue-microtask@1.2.3:
|
||||
@@ -4544,11 +4566,6 @@ packages:
|
||||
react-is@16.13.1:
|
||||
resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
|
||||
|
||||
react-loading-skeleton@3.5.0:
|
||||
resolution: {integrity: sha512-gxxSyLbrEAdXTKgfbpBEFZCO/P153DnqSCQau2+o6lNy1jgMRr2MmRmOzMmyrwSaSYLRB8g7b0waYPmUjz7IhQ==}
|
||||
peerDependencies:
|
||||
react: '>=16.8.0'
|
||||
|
||||
react-number-format@5.4.4:
|
||||
resolution: {integrity: sha512-wOmoNZoOpvMminhifQYiYSTCLUDOiUbBunrMrMjA+dV52sY+vck1S4UhR6PkgnoCquvvMSeJjErXZ4qSaWCliA==}
|
||||
peerDependencies:
|
||||
@@ -4621,6 +4638,13 @@ packages:
|
||||
react-dom:
|
||||
optional: true
|
||||
|
||||
react-split-pane@3.0.4:
|
||||
resolution: {integrity: sha512-+QNayN8lsYhT87z0bH5yAuUocoqHlc3AQnw/+pGXMH2kG2+mSfNAR4fHhEdmweHLFjIyX811hh9sgCkiHXCYag==}
|
||||
engines: {node: '>=20.0.0'}
|
||||
peerDependencies:
|
||||
react: ^17.0.0 || ^18.0.0 || ^19.0.0
|
||||
react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0
|
||||
|
||||
react-style-singleton@2.2.3:
|
||||
resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==}
|
||||
engines: {node: '>=10'}
|
||||
@@ -5478,6 +5502,12 @@ packages:
|
||||
peerDependencies:
|
||||
browserslist: '>= 4.21.0'
|
||||
|
||||
update-browserslist-db@1.2.3:
|
||||
resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==}
|
||||
hasBin: true
|
||||
peerDependencies:
|
||||
browserslist: '>= 4.21.0'
|
||||
|
||||
uri-js@4.4.1:
|
||||
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
|
||||
|
||||
@@ -5649,6 +5679,7 @@ packages:
|
||||
whatwg-encoding@3.1.1:
|
||||
resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==}
|
||||
engines: {node: '>=18'}
|
||||
deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation
|
||||
|
||||
whatwg-mimetype@4.0.0:
|
||||
resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==}
|
||||
@@ -5866,6 +5897,8 @@ snapshots:
|
||||
jsonpointer: 5.0.1
|
||||
leven: 3.1.0
|
||||
|
||||
'@assemblyscript/loader@0.17.14': {}
|
||||
|
||||
'@atlaskit/pragmatic-drag-and-drop-auto-scroll@2.1.2':
|
||||
dependencies:
|
||||
'@atlaskit/pragmatic-drag-and-drop': 1.7.7
|
||||
@@ -6582,7 +6615,7 @@ snapshots:
|
||||
'@babel/helper-string-parser': 7.27.1
|
||||
'@babel/helper-validator-identifier': 7.28.5
|
||||
|
||||
'@bufbuild/protobuf@2.10.1':
|
||||
'@bufbuild/protobuf@2.10.2':
|
||||
optional: true
|
||||
|
||||
'@cacheable/memoize@2.0.3':
|
||||
@@ -6658,17 +6691,17 @@ snapshots:
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
'@electron-toolkit/preload@3.0.2(electron@38.5.0)':
|
||||
'@electron-toolkit/preload@3.0.2(electron@39.4.0)':
|
||||
dependencies:
|
||||
electron: 38.5.0
|
||||
electron: 39.4.0
|
||||
|
||||
'@electron-toolkit/tsconfig@2.0.0(@types/node@24.10.1)':
|
||||
dependencies:
|
||||
'@types/node': 24.10.1
|
||||
|
||||
'@electron-toolkit/utils@4.0.0(electron@38.5.0)':
|
||||
'@electron-toolkit/utils@4.0.0(electron@39.4.0)':
|
||||
dependencies:
|
||||
electron: 38.5.0
|
||||
electron: 39.4.0
|
||||
|
||||
'@electron/asar@3.2.18':
|
||||
dependencies:
|
||||
@@ -6763,7 +6796,7 @@ snapshots:
|
||||
'@malept/cross-spawn-promise': 2.0.0
|
||||
debug: 4.4.3
|
||||
dir-compare: 4.2.0
|
||||
fs-extra: 11.3.2
|
||||
fs-extra: 11.3.3
|
||||
minimatch: 9.0.5
|
||||
plist: 3.1.0
|
||||
transitivePeerDependencies:
|
||||
@@ -6773,7 +6806,7 @@ snapshots:
|
||||
dependencies:
|
||||
cross-dirname: 0.1.0
|
||||
debug: 4.4.3
|
||||
fs-extra: 11.3.2
|
||||
fs-extra: 11.3.3
|
||||
minimist: 1.2.8
|
||||
postject: 1.0.0-alpha.6
|
||||
transitivePeerDependencies:
|
||||
@@ -7577,7 +7610,7 @@ snapshots:
|
||||
|
||||
'@types/electron-localshortcut@3.1.3':
|
||||
dependencies:
|
||||
electron: 38.5.0
|
||||
electron: 39.4.0
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
@@ -8009,7 +8042,7 @@ snapshots:
|
||||
|
||||
baseline-browser-mapping@2.8.20: {}
|
||||
|
||||
baseline-browser-mapping@2.8.32: {}
|
||||
baseline-browser-mapping@2.9.11: {}
|
||||
|
||||
bind-event-listener@3.0.0: {}
|
||||
|
||||
@@ -8080,13 +8113,13 @@ snapshots:
|
||||
node-releases: 2.0.26
|
||||
update-browserslist-db: 1.1.4(browserslist@4.27.0)
|
||||
|
||||
browserslist@4.28.0:
|
||||
browserslist@4.28.1:
|
||||
dependencies:
|
||||
baseline-browser-mapping: 2.8.32
|
||||
caniuse-lite: 1.0.30001757
|
||||
electron-to-chromium: 1.5.262
|
||||
baseline-browser-mapping: 2.9.11
|
||||
caniuse-lite: 1.0.30001762
|
||||
electron-to-chromium: 1.5.267
|
||||
node-releases: 2.0.27
|
||||
update-browserslist-db: 1.1.4(browserslist@4.28.0)
|
||||
update-browserslist-db: 1.2.3(browserslist@4.28.1)
|
||||
|
||||
buffer-builder@0.2.0:
|
||||
optional: true
|
||||
@@ -8134,6 +8167,16 @@ snapshots:
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
butterchurn-presets@3.0.0-beta.4:
|
||||
dependencies:
|
||||
'@babel/runtime': 7.28.4
|
||||
|
||||
butterchurn@3.0.0-beta.5:
|
||||
dependencies:
|
||||
'@assemblyscript/loader': 0.17.14
|
||||
ecma-proposal-math-extensions: 0.0.2
|
||||
eel-wasm: 0.0.16
|
||||
|
||||
cac@6.7.14: {}
|
||||
|
||||
cacache@16.1.3:
|
||||
@@ -8203,7 +8246,7 @@ snapshots:
|
||||
|
||||
caniuse-lite@1.0.30001751: {}
|
||||
|
||||
caniuse-lite@1.0.30001757: {}
|
||||
caniuse-lite@1.0.30001762: {}
|
||||
|
||||
chalk@4.1.2:
|
||||
dependencies:
|
||||
@@ -8359,7 +8402,7 @@ snapshots:
|
||||
|
||||
core-js-compat@3.47.0:
|
||||
dependencies:
|
||||
browserslist: 4.28.0
|
||||
browserslist: 4.28.1
|
||||
|
||||
core-util-is@1.0.2:
|
||||
optional: true
|
||||
@@ -8604,6 +8647,10 @@ snapshots:
|
||||
|
||||
eastasianwidth@0.2.0: {}
|
||||
|
||||
ecma-proposal-math-extensions@0.0.2: {}
|
||||
|
||||
eel-wasm@0.0.16: {}
|
||||
|
||||
ejs@3.1.10:
|
||||
dependencies:
|
||||
jake: 10.9.2
|
||||
@@ -8681,7 +8728,7 @@ snapshots:
|
||||
|
||||
electron-to-chromium@1.5.242: {}
|
||||
|
||||
electron-to-chromium@1.5.262: {}
|
||||
electron-to-chromium@1.5.267: {}
|
||||
|
||||
electron-updater@6.6.2:
|
||||
dependencies:
|
||||
@@ -8720,7 +8767,7 @@ snapshots:
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
electron@38.5.0:
|
||||
electron@39.4.0:
|
||||
dependencies:
|
||||
'@electron/get': 2.0.3
|
||||
'@types/node': 22.15.32
|
||||
@@ -9172,7 +9219,7 @@ snapshots:
|
||||
fs-extra@10.1.0:
|
||||
dependencies:
|
||||
graceful-fs: 4.2.11
|
||||
jsonfile: 6.1.0
|
||||
jsonfile: 6.2.0
|
||||
universalify: 2.0.1
|
||||
|
||||
fs-extra@11.3.2:
|
||||
@@ -9181,6 +9228,12 @@ snapshots:
|
||||
jsonfile: 6.2.0
|
||||
universalify: 2.0.1
|
||||
|
||||
fs-extra@11.3.3:
|
||||
dependencies:
|
||||
graceful-fs: 4.2.11
|
||||
jsonfile: 6.2.0
|
||||
universalify: 2.0.1
|
||||
|
||||
fs-extra@7.0.1:
|
||||
dependencies:
|
||||
graceful-fs: 4.2.11
|
||||
@@ -9526,7 +9579,7 @@ snapshots:
|
||||
|
||||
i18next@24.2.3(typescript@5.8.3):
|
||||
dependencies:
|
||||
'@babel/runtime': 7.27.1
|
||||
'@babel/runtime': 7.28.4
|
||||
optionalDependencies:
|
||||
typescript: 5.8.3
|
||||
|
||||
@@ -9810,12 +9863,6 @@ snapshots:
|
||||
optionalDependencies:
|
||||
graceful-fs: 4.2.11
|
||||
|
||||
jsonfile@6.1.0:
|
||||
dependencies:
|
||||
universalify: 2.0.1
|
||||
optionalDependencies:
|
||||
graceful-fs: 4.2.11
|
||||
|
||||
jsonfile@6.2.0:
|
||||
dependencies:
|
||||
universalify: 2.0.1
|
||||
@@ -10455,7 +10502,7 @@ snapshots:
|
||||
dependencies:
|
||||
hookified: 1.13.0
|
||||
|
||||
qs@6.14.0:
|
||||
qs@6.14.1:
|
||||
dependencies:
|
||||
side-channel: 1.1.0
|
||||
|
||||
@@ -10514,10 +10561,6 @@ snapshots:
|
||||
|
||||
react-is@16.13.1: {}
|
||||
|
||||
react-loading-skeleton@3.5.0(react@19.1.0):
|
||||
dependencies:
|
||||
react: 19.1.0
|
||||
|
||||
react-number-format@5.4.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
|
||||
dependencies:
|
||||
react: 19.1.0
|
||||
@@ -10588,6 +10631,11 @@ snapshots:
|
||||
optionalDependencies:
|
||||
react-dom: 19.1.0(react@19.1.0)
|
||||
|
||||
react-split-pane@3.0.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
|
||||
dependencies:
|
||||
react: 19.1.0
|
||||
react-dom: 19.1.0(react@19.1.0)
|
||||
|
||||
react-style-singleton@2.2.3(@types/react@19.2.5)(react@19.1.0):
|
||||
dependencies:
|
||||
get-nonce: 1.0.1
|
||||
@@ -10598,7 +10646,7 @@ snapshots:
|
||||
|
||||
react-textarea-autosize@8.5.9(@types/react@19.2.5)(react@19.1.0):
|
||||
dependencies:
|
||||
'@babel/runtime': 7.27.1
|
||||
'@babel/runtime': 7.28.4
|
||||
react: 19.1.0
|
||||
use-composed-ref: 1.4.0(@types/react@19.2.5)(react@19.1.0)
|
||||
use-latest: 1.3.0(@types/react@19.2.5)(react@19.1.0)
|
||||
@@ -10607,7 +10655,7 @@ snapshots:
|
||||
|
||||
react-transition-group@4.4.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
|
||||
dependencies:
|
||||
'@babel/runtime': 7.27.1
|
||||
'@babel/runtime': 7.28.4
|
||||
dom-helpers: 5.2.1
|
||||
loose-envify: 1.4.0
|
||||
prop-types: 15.8.1
|
||||
@@ -10902,7 +10950,7 @@ snapshots:
|
||||
|
||||
sass-embedded@1.89.0:
|
||||
dependencies:
|
||||
'@bufbuild/protobuf': 2.10.1
|
||||
'@bufbuild/protobuf': 2.10.2
|
||||
buffer-builder: 0.2.0
|
||||
colorjs.io: 0.5.2
|
||||
immutable: 5.1.4
|
||||
@@ -11559,9 +11607,9 @@ snapshots:
|
||||
escalade: 3.2.0
|
||||
picocolors: 1.1.1
|
||||
|
||||
update-browserslist-db@1.1.4(browserslist@4.28.0):
|
||||
update-browserslist-db@1.2.3(browserslist@4.28.1):
|
||||
dependencies:
|
||||
browserslist: 4.28.0
|
||||
browserslist: 4.28.1
|
||||
escalade: 3.2.0
|
||||
picocolors: 1.1.1
|
||||
|
||||
|
||||
@@ -23,6 +23,7 @@ export default defineConfig({
|
||||
assetFileNames: '[name].[ext]',
|
||||
chunkFileNames: '[name].js',
|
||||
entryFileNames: '[name].js',
|
||||
sourcemapExcludeSources: false,
|
||||
},
|
||||
},
|
||||
sourcemap: true,
|
||||
|
||||
@@ -1 +1 @@
|
||||
"use strict";window.SERVER_URL="${SERVER_URL}";window.SERVER_NAME="${SERVER_NAME}";window.SERVER_TYPE="${SERVER_TYPE}";window.SERVER_LOCK=${SERVER_LOCK};
|
||||
"use strict";window.SERVER_URL="${SERVER_URL}";window.SERVER_NAME="${SERVER_NAME}";window.SERVER_TYPE="${SERVER_TYPE}";window.SERVER_LOCK="${SERVER_LOCK}";window.LEGACY_AUTHENTICATION="${LEGACY_AUTHENTICATION}";window.ANALYTICS_DISABLED="${ANALYTICS_DISABLED}";
|
||||
|
||||
@@ -1,23 +1,23 @@
|
||||
{
|
||||
"action": {
|
||||
"addToFavorites": "إضافة الى $t(entity.favorite_other)",
|
||||
"addToPlaylist": "إضافة الى $t(entity.playlist_one)",
|
||||
"addToFavorites": "إضافة الى $t(entity.favorite, {\"count\": 2})",
|
||||
"addToPlaylist": "إضافة الى $t(entity.playlist, {\"count\": 1})",
|
||||
"clearQueue": "مسح قائمة الإنتظار",
|
||||
"createPlaylist": "إنشاء $t(entity.playlist_one)",
|
||||
"deletePlaylist": "حذف $t(entity.playlist_one)",
|
||||
"createPlaylist": "إنشاء $t(entity.playlist, {\"count\": 1})",
|
||||
"deletePlaylist": "حذف $t(entity.playlist, {\"count\": 1})",
|
||||
"deselectAll": "إلغاء تحديد الكل",
|
||||
"editPlaylist": "تعديل $t(entity.playlist_one)",
|
||||
"editPlaylist": "تعديل $t(entity.playlist, {\"count\": 1})",
|
||||
"goToPage": "اذهب الى صفحة",
|
||||
"moveToNext": "الذهاب الى التالي",
|
||||
"moveToBottom": "الذهاب الى الأسفل",
|
||||
"moveToTop": "الذهاب الى الأعلى",
|
||||
"refresh": "$t(common.refresh)",
|
||||
"removeFromFavorites": "حذف من $t(entity.favorite_other)",
|
||||
"removeFromPlaylist": "حذف من $t(entity.playlist_one)",
|
||||
"removeFromFavorites": "حذف من $t(entity.favorite, {\"count\": 2})",
|
||||
"removeFromPlaylist": "حذف من $t(entity.playlist, {\"count\": 1})",
|
||||
"removeFromQueue": "حذف من قائمة الإنتظار",
|
||||
"setRating": "تحديد التقييم",
|
||||
"toggleSmartPlaylistEditor": "تشغيل / إطفاء وضع التعديل لـ $t(entity.smartPlaylist)",
|
||||
"viewPlaylists": "إظهار $t(entity.playlist_other)",
|
||||
"viewPlaylists": "إظهار $t(entity.playlist, {\"count\": 2})",
|
||||
"openIn": {
|
||||
"lastfm": "فتح في Last.fm",
|
||||
"musicbrainz": "فتح في MusicBrainz"
|
||||
@@ -59,7 +59,7 @@
|
||||
"configure": "تعديل",
|
||||
"confirm": "تأكيد",
|
||||
"create": "إنشاء",
|
||||
"currentSong": "$t(entity.track_one) الحالي",
|
||||
"currentSong": "$t(entity.track, {\"count\": 1}) الحالي",
|
||||
"decrease": "تنقيص",
|
||||
"delete": "حذف",
|
||||
"descending": "تنازلي",
|
||||
@@ -102,7 +102,7 @@
|
||||
"path": "المسار",
|
||||
"playerMustBePaused": "يجب إيقاف المشغل",
|
||||
"preview": "معاينة",
|
||||
"previousSong": "$t(entity.track_one) السابق",
|
||||
"previousSong": "$t(entity.track, {\"count\": 1}) السابق",
|
||||
"quit": "خروج",
|
||||
"random": "عشوائي",
|
||||
"rating": "التقييم",
|
||||
@@ -117,7 +117,12 @@
|
||||
"saveAndReplace": "حفظ واستبدال",
|
||||
"saveAs": "حفظ بإسم",
|
||||
"search": "بحث",
|
||||
"setting": "إعداد",
|
||||
"setting_zero": "إعداد",
|
||||
"setting_one": "",
|
||||
"setting_two": "",
|
||||
"setting_few": "",
|
||||
"setting_many": "",
|
||||
"setting_other": "",
|
||||
"share": "نشر",
|
||||
"size": "حجم",
|
||||
"sortOrder": "الترتيب",
|
||||
|
||||
@@ -2,47 +2,50 @@
|
||||
"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)",
|
||||
"albumArtists": "$t(entity.albumArtist, {\"count\": 2})",
|
||||
"albums": "$t(entity.album, {\"count\": 2})",
|
||||
"artists": "$t(entity.artist, {\"count\": 2})",
|
||||
"folders": "$t(entity.folder, {\"count\": 2})",
|
||||
"genres": "$t(entity.genre, {\"count\": 2})",
|
||||
"home": "$t(common.home)",
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"search": "$t(common.search)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"tracks": "$t(entity.track_other)",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"tracks": "$t(entity.track, {\"count\": 2})",
|
||||
"nowPlaying": "ara sona",
|
||||
"shared": "$t(entity.playlist_other) compartida",
|
||||
"favorites": "$t(entity.favorite_other)"
|
||||
"shared": "$t(entity.playlist, {\"count\": 2}) compartides",
|
||||
"favorites": "$t(entity.favorite, {\"count\": 2})",
|
||||
"radio": "$t(entity.radioStation, {\"count\": 2})"
|
||||
},
|
||||
"albumArtistDetail": {
|
||||
"relatedArtists": "$t(entity.artist_other) similars",
|
||||
"viewAllTracks": "veure totes les $t(entity.track_other)",
|
||||
"relatedArtists": "$t(entity.artist, {\"count\": 2}) similars",
|
||||
"viewAllTracks": "mostra totes les $t(entity.track, {\"count\": 2})",
|
||||
"about": "Sobre {{artist}}",
|
||||
"appearsOn": "apareix a",
|
||||
"recentReleases": "Llançaments recents",
|
||||
"viewDiscography": "Mosta la discografia",
|
||||
"topSongs": "millors cançons",
|
||||
"topSongsFrom": "les millors cançons de {{title}}",
|
||||
"viewAll": "mostra-ho tot"
|
||||
"viewAll": "mostra-ho tot",
|
||||
"groupingTypeAll": "tots els tipus de llançaments",
|
||||
"groupingTypePrimary": "tipus principals de llançament"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
"title": "$t(entity.albumArtist, {\"count\": 2})"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "més d'aquest $t(entity.artist_one)",
|
||||
"moreFromArtist": "més d'aquest $t(entity.artist, {\"count\": 1})",
|
||||
"moreFromGeneric": "més de {{item}}",
|
||||
"released": "publicat"
|
||||
},
|
||||
"albumList": {
|
||||
"title": "$t(entity.album_other)",
|
||||
"title": "$t(entity.album, {\"count\": 2})",
|
||||
"artistAlbums": "àlbums de {{artist}}",
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)"
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album, {\"count\": 2})"
|
||||
},
|
||||
"appMenu": {
|
||||
"quit": "$t(common.quit)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"goBack": "torna enrere",
|
||||
"goForward": "avança",
|
||||
"collapseSidebar": "replega la barra lateral",
|
||||
@@ -81,15 +84,15 @@
|
||||
"showDetails": "informació",
|
||||
"numberSelected": "{{count}} seleccionat",
|
||||
"shareItem": "comparteix l'element",
|
||||
"goToAlbumArtist": "Ves a $t(entity.albumArtist_one)",
|
||||
"goToAlbum": "ves a $t(entity.album_one)",
|
||||
"goToAlbumArtist": "Ves a $t(entity.albumArtist, {\"count\": 1})",
|
||||
"goToAlbum": "ves a $t(entity.album, {\"count\": 1})",
|
||||
"moveItems": "$t(action.moveItems)",
|
||||
"goTo": "ves a"
|
||||
},
|
||||
"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)"
|
||||
"title": "$t(entity.genre, {\"count\": 2})",
|
||||
"showAlbums": "mostra $t(entity.album, {\"count\": 2}) de $t(entity.genre, {\"count\": 1})",
|
||||
"showTracks": "mostra $t(entity.track, {\"count\": 2}) de $t(entity.genre, {\"count\": 1})"
|
||||
},
|
||||
"home": {
|
||||
"title": "$t(common.home)",
|
||||
@@ -98,15 +101,15 @@
|
||||
"mostPlayed": "els més reproduïts",
|
||||
"recentlyPlayed": "reproduït recentment",
|
||||
"recentlyReleased": "estrenat fa poc",
|
||||
"genres": "$t(entity.genre_other)"
|
||||
"genres": "$t(entity.genre, {\"count\": 2})"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist_other)"
|
||||
"title": "$t(entity.playlist, {\"count\": 2})"
|
||||
},
|
||||
"trackList": {
|
||||
"title": "$t(entity.track_other)",
|
||||
"title": "$t(entity.track, {\"count\": 2})",
|
||||
"artistTracks": "pistes de {{artist}}",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track_other)"
|
||||
"genreTracks": "$t(entity.track, {\"count\": 2}) \"{{genre}}\""
|
||||
},
|
||||
"manageServers": {
|
||||
"username": "nom d'usuari",
|
||||
@@ -161,7 +164,8 @@
|
||||
"transcoding": "transcodificació",
|
||||
"discord": "discord",
|
||||
"logger": "registres",
|
||||
"playerFilters": "filtres de reproducció"
|
||||
"playerFilters": "filtres de reproducció",
|
||||
"lyricsDisplay": "mostra la lletra"
|
||||
},
|
||||
"globalSearch": {
|
||||
"commands": {
|
||||
@@ -180,10 +184,13 @@
|
||||
"reorder": "el reordenament només s'activa quan s'ordena per id"
|
||||
},
|
||||
"favorites": {
|
||||
"title": "$t(entity.favorite_other)"
|
||||
"title": "$t(entity.favorite, {\"count\": 2})"
|
||||
},
|
||||
"folderList": {
|
||||
"title": "$t(entity.folder_other)"
|
||||
"title": "$t(entity.folder, {\"count\": 2})"
|
||||
},
|
||||
"radioList": {
|
||||
"title": "emissores de ràdio"
|
||||
}
|
||||
},
|
||||
"common": {
|
||||
@@ -255,9 +262,9 @@
|
||||
"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",
|
||||
"currentSong": "$t(entity.track, {\"count\": 1}) actual",
|
||||
"limit": "límit",
|
||||
"previousSong": "$t(entity.track_one) anterior",
|
||||
"previousSong": "$t(entity.track, {\"count\": 1}) anterior",
|
||||
"trackNumber": "pista",
|
||||
"albumGain": "guany de l'àlbum",
|
||||
"albumPeak": "pic de l'àlbum",
|
||||
@@ -281,7 +288,9 @@
|
||||
"playerMustBePaused": "cal pausar el reproductor",
|
||||
"restartRequired": "cal reiniciar",
|
||||
"sampleRate": "freqüència de mostreig",
|
||||
"setting": "configuració",
|
||||
"setting_one": "configuració",
|
||||
"setting_many": "",
|
||||
"setting_other": "",
|
||||
"trackGain": "guany de pista",
|
||||
"trackPeak": "pic de pista",
|
||||
"gap": "espera",
|
||||
@@ -301,7 +310,13 @@
|
||||
"sort": "ordre",
|
||||
"gridRows": "files de la quadrícula",
|
||||
"tableColumns": "columnes de la taula",
|
||||
"itemsMore": "{{count}} més"
|
||||
"itemsMore": "{{count}} més",
|
||||
"countSelected": "{{count}} seleccionats",
|
||||
"retry": "reintenta",
|
||||
"example": "exemple",
|
||||
"mood": "estat d'ànim",
|
||||
"filter_single": "senzill",
|
||||
"filter_multiple": "multi"
|
||||
},
|
||||
"entity": {
|
||||
"album_one": "àlbum",
|
||||
@@ -328,7 +343,7 @@
|
||||
"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",
|
||||
"smartPlaylist": "$t(entity.playlist, {\"count\": 1}) intel·ligent",
|
||||
"play_one": "{{count}} reproducció",
|
||||
"play_many": "{{count}} reproduccions",
|
||||
"play_other": "{{count}} reproduccions",
|
||||
@@ -355,38 +370,44 @@
|
||||
"song_other": "cançons",
|
||||
"favorite_one": "preferit",
|
||||
"favorite_many": "preferits",
|
||||
"favorite_other": "preferits"
|
||||
"favorite_other": "preferits",
|
||||
"radioStation_one": "emissora de ràdio",
|
||||
"radioStation_many": "emissores de ràdio",
|
||||
"radioStation_other": "emissores de ràdio",
|
||||
"radioStationWithCount_one": "{{count}} emissora de ràdio",
|
||||
"radioStationWithCount_many": "{{count}} emissores de ràdio",
|
||||
"radioStationWithCount_other": "{{count}} emissores de ràdio"
|
||||
},
|
||||
"form": {
|
||||
"addToPlaylist": {
|
||||
"input_playlists": "$t(entity.playlist_other)",
|
||||
"title": "afegir a una $t(entity.playlist_one)",
|
||||
"input_playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"title": "afegir a una $t(entity.playlist, {\"count\": 1})",
|
||||
"input_skipDuplicates": "salta't els duplicats",
|
||||
"success": "s'ha afegit $t(entity.trackWithCount, {\"count\": {{message}} }) a $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })",
|
||||
"create": "crea $t(entity.playlist_one) {{playlist}}",
|
||||
"searchOrCreate": "cerca $t(entity.playlist_other) o escriu per crear-ne una de nova"
|
||||
"create": "crea $t(entity.playlist, {\"count\": 1}) {{playlist}}",
|
||||
"searchOrCreate": "cerca $t(entity.playlist, {\"count\": 2}) o escriu per crear-ne una de nova"
|
||||
},
|
||||
"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)",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) s'ha creat amb èxit",
|
||||
"title": "crea una $t(entity.playlist, {\"count\": 1})",
|
||||
"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"
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) s'ha eliminat amb èxit",
|
||||
"title": "elimina la $t(entity.playlist, {\"count\": 1})",
|
||||
"input_confirm": "escriviu el nom de la $t(entity.playlist, {\"count\": 1}) per confirmar"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"success": "$t(entity.playlist_one) s'ha actualitzat amb èxit",
|
||||
"title": "editar la $t(entity.playlist_one)",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) s'ha actualitzat amb èxit",
|
||||
"title": "editar la $t(entity.playlist, {\"count\": 1})",
|
||||
"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",
|
||||
"editNote": "es recomana no editar manualment les llistes de reproducció grans. segur que accepteu el risc de perdre dades si sobreescriviu la llista de reproducció existent?"
|
||||
},
|
||||
"lyricSearch": {
|
||||
"input_artist": "$t(entity.artist_one)",
|
||||
"input_artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"input_name": "$t(common.name)",
|
||||
"title": "cerca de lletres"
|
||||
},
|
||||
@@ -403,7 +424,10 @@
|
||||
"success": "servidor afegit correctament",
|
||||
"title": "afegeix un servidor",
|
||||
"input_preferInstantMix": "prefereix el mix instantani",
|
||||
"input_preferInstantMixDescription": "utilitza només el mix instantani per obtenir cançons similars. útil si teniu complements que modifiquin aquest comportament"
|
||||
"input_preferInstantMixDescription": "utilitza només el mix instantani per obtenir cançons similars. útil si teniu complements que modifiquin aquest comportament",
|
||||
"input_preferRemoteUrl": "prefereix l'url públic",
|
||||
"input_remoteUrl": "url públic",
|
||||
"input_remoteUrlPlaceholder": "opcional: url públic per característiques externes"
|
||||
},
|
||||
"shareItem": {
|
||||
"description": "descripció",
|
||||
@@ -437,7 +461,7 @@
|
||||
},
|
||||
"shuffleAll": {
|
||||
"title": "reprodueix a l'atzar",
|
||||
"input_genre": "$t(entity.genre_one)",
|
||||
"input_genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"input_limit": "quantes cançons?",
|
||||
"input_minYear": "de l'any",
|
||||
"input_maxYear": "fins a l'any",
|
||||
@@ -445,17 +469,32 @@
|
||||
"input_played_optionAll": "totes les pistes",
|
||||
"input_played_optionUnplayed": "només les pistes sense reproduir",
|
||||
"input_played_optionPlayed": "només les pistes reproduïdes"
|
||||
},
|
||||
"createRadioStation": {
|
||||
"success": "emissora de ràdio creada amb èxit",
|
||||
"title": "crea una emissora de ràdio",
|
||||
"input_homepageUrl": "URL de la pàgina d'inici",
|
||||
"input_name": "nom",
|
||||
"input_streamUrl": "URL de transmissió"
|
||||
},
|
||||
"saveQueue": {
|
||||
"success": "cua de reproducció desada al servidor"
|
||||
},
|
||||
"lyricsExport": {
|
||||
"export": "exporta la lletra",
|
||||
"input_synced": "exporta la lletra sincronitzada",
|
||||
"input_offset": "$t(setting.lyricOffset)"
|
||||
}
|
||||
},
|
||||
"action": {
|
||||
"addToFavorites": "afegeix a $t(entity.favorite_other)",
|
||||
"addToPlaylist": "afegeix a $t(entity.playlist_one)",
|
||||
"createPlaylist": "crea $t(entity.playlist_one)",
|
||||
"deletePlaylist": "elimina la $t(entity.playlist_one)",
|
||||
"editPlaylist": "edita la $t(entity.playlist_one)",
|
||||
"addToFavorites": "afegeix a $t(entity.favorite, {\"count\": 2})",
|
||||
"addToPlaylist": "afegeix a $t(entity.playlist, {\"count\": 1})",
|
||||
"createPlaylist": "crea $t(entity.playlist, {\"count\": 1})",
|
||||
"deletePlaylist": "elimina la $t(entity.playlist, {\"count\": 1})",
|
||||
"editPlaylist": "edita $t(entity.playlist, {\"count\": 1})",
|
||||
"refresh": "$t(common.refresh)",
|
||||
"removeFromFavorites": "elimina dels $t(entity.favorite_other)",
|
||||
"removeFromPlaylist": "elimina de $t(entity.playlist_one)",
|
||||
"removeFromFavorites": "elimina dels $t(entity.favorite, {\"count\": 2})",
|
||||
"removeFromPlaylist": "elimina de $t(entity.playlist, {\"count\": 1})",
|
||||
"clearQueue": "buida la cua",
|
||||
"removeFromQueue": "treure de la cua",
|
||||
"goToPage": "anar a la pàgina",
|
||||
@@ -464,7 +503,7 @@
|
||||
"musicbrainz": "Obrir a MusicBrainz"
|
||||
},
|
||||
"deselectAll": "deselecciona-ho tot",
|
||||
"viewPlaylists": "veure$t(entity.playlist_other)",
|
||||
"viewPlaylists": "veure $t(entity.playlist, {\"count\": 2})",
|
||||
"moveToNext": "passar al següent",
|
||||
"moveToBottom": "anar al final",
|
||||
"moveToTop": "anar al principi",
|
||||
@@ -479,7 +518,13 @@
|
||||
"shuffle": "mescla",
|
||||
"shuffleAll": "mescla-ho tot",
|
||||
"shuffleSelected": "mescla els seleccionats",
|
||||
"viewMore": "mostra'n més"
|
||||
"viewMore": "mostra'n més",
|
||||
"createRadioStation": "crea $t(entity.radioStation, {\"count\": 1})",
|
||||
"deleteRadioStation": "elimina $t(entity.radioStation, {\"count\": 1})",
|
||||
"addOrRemoveFromSelection": "afegeix o elimina de la selecció",
|
||||
"selectRangeOfItems": "selecciona un interval d'elements",
|
||||
"selectAll": "selecciona-ho tot",
|
||||
"openApplicationDirectory": "obre el directori de l'aplicació"
|
||||
},
|
||||
"setting": {
|
||||
"language_description": "estableix l'idioma de l'aplicació ($t(common.restartRequired))",
|
||||
@@ -487,9 +532,9 @@
|
||||
"playButtonBehavior_optionAddNext": "$t(player.addNext)",
|
||||
"playButtonBehavior_optionPlay": "$t(player.play)",
|
||||
"playButtonBehavior_optionPlayShuffled": "$t(player.shuffle)",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album_one)",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album, {\"count\": 1})",
|
||||
"replayGainMode_optionNone": "$t(common.none)",
|
||||
"replayGainMode_optionTrack": "$t(entity.track_one)",
|
||||
"replayGainMode_optionTrack": "$t(entity.track, {\"count\": 1})",
|
||||
"font": "tipus de lletra",
|
||||
"fontType": "selecció de tipus de lletra",
|
||||
"fontType_optionBuiltIn": "tipus de lletra integrats",
|
||||
@@ -619,7 +664,7 @@
|
||||
"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",
|
||||
"lyricFetchProvider_description": "selecciona els proveïdors de lletres",
|
||||
"lyricOffset": "desfasament de la lletra (ms)",
|
||||
"lyricOffset_description": "desplaça la lletra els mil·lisegons especificats",
|
||||
"minimizeToTray": "minimitza a la safata",
|
||||
@@ -643,8 +688,6 @@
|
||||
"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",
|
||||
@@ -729,7 +772,7 @@
|
||||
"releaseChannel": "canal de versions",
|
||||
"releaseChannel_description": "tria entre versions estables i versions beta per les actualitzacions automàtiques",
|
||||
"mediaSession": "activa Media Session",
|
||||
"mediaSession_description": "activa la integració amb Windows Media Session per mostrar els controls multimèdia i les metadades a l'indicador de volum del sistema i la pantalla de bloqueig (només per Windows)",
|
||||
"mediaSession_description": "activa la integració amb Media Session per mostrar els controls multimèdia i les metadades a l'indicador de volum del sistema i la pantalla de bloqueig",
|
||||
"crossfadeStyle": "estil de fosa encadenada",
|
||||
"discordRichPresence": "estat d'activitat de {{discord}}",
|
||||
"enableAutoTranslation_description": "activa la traducció automàtica en carregar la lletra",
|
||||
@@ -787,17 +830,49 @@
|
||||
"queryBuilderCustomFields_inputLabel": "discogràfica",
|
||||
"queryBuilderCustomFields_inputTag": "etiqueta",
|
||||
"queryBuilderCustomFields": "camps personalitzats",
|
||||
"queryBuilderCustomFields_description": "afegeix camps personalitzats pel constructor de consultes"
|
||||
"queryBuilderCustomFields_description": "afegeix camps personalitzats pel constructor de consultes",
|
||||
"useThemeAccentColor": "fes servir el color d'accent del tema",
|
||||
"useThemeAccentColor_description": "fes servir el color primari definit pel tema seleccionat en comptes del color d'accent personalitzat",
|
||||
"artistRadioCount_description": "estableix el número de cançons per cercar per la ràdio d'artista i pista",
|
||||
"artistRadioCount": "recompte de ràdios d'artista o pista",
|
||||
"imageResolution": "resolució d'imatge",
|
||||
"imageResolution_description": "la resolució per les imatges que s'utilitzen a l'aplicació. un valor de 0 equival a la resolució nativa de la imatge",
|
||||
"imageResolution_optionTable": "taula",
|
||||
"imageResolution_optionItemCard": "targeta d'element",
|
||||
"imageResolution_optionSidebar": "tauler lateral",
|
||||
"imageResolution_optionHeader": "encapçalament",
|
||||
"imageResolution_optionFullScreenPlayer": "reproductor de pantalla completa",
|
||||
"showRatings_description": "controla si es mostren les estrelles de valoració a la interfície",
|
||||
"showRatings": "mostra la valoració d'estrelles",
|
||||
"combinedLyricsAndVisualizer_description": "combina la lletra i el visualitzador en un sol tauler",
|
||||
"combinedLyricsAndVisualizer": "combina la lletra i el visualitzador al tauler lateral del reproductor",
|
||||
"artistReleaseTypeConfiguration": "configuració de tipus de llançament d'artista",
|
||||
"artistReleaseTypeConfiguration_description": "configura quins llançaments es mostren, i en quin ordre, a la pàgina d'artista de l'àlbum",
|
||||
"hotkey_listNavigateToPage": "navega per la llista fins a la pàgina de l'element",
|
||||
"hotkey_listPlayDefault": "reprodueix llista",
|
||||
"hotkey_listPlayLast": "reprodueix la llista al final",
|
||||
"hotkey_listPlayNext": "reprodueix la llista a continuació",
|
||||
"hotkey_listPlayNow": "reprodueix la llista ara",
|
||||
"mpvExtraParameters": "paràmetres addicionals d'mpv",
|
||||
"mpvExtraParameters_description": "arguments addicionals per l'mpv",
|
||||
"pathReplace": "substitució de la ruta de l'arxiu",
|
||||
"pathReplace_description": "substitueix la ruta d'arxiu predeterminada del servidor",
|
||||
"pathReplace_optionRemovePrefix": "elimina el prefix",
|
||||
"pathReplace_optionAddPrefix": "afegeix prefix",
|
||||
"homeFeatureStyle_description": "controla l'estil del carrusel de destacats de l'inici",
|
||||
"homeFeatureStyle": "estil del carrusel de destacats de l'inici",
|
||||
"homeFeatureStyle_optionMultiple": "múltiple",
|
||||
"homeFeatureStyle_optionSingle": "simple"
|
||||
},
|
||||
"table": {
|
||||
"column": {
|
||||
"albumCount": "$t(entity.album_other)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2})",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"channels": "$t(common.channel, {\"count\": 2})",
|
||||
"codec": "$t(common.codec)",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"size": "$t(common.size)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"songCount": "$t(entity.track, {\"count\": 2})",
|
||||
"releaseYear": "any",
|
||||
"playCount": "reproduccions",
|
||||
"releaseDate": "data de llançament",
|
||||
@@ -852,24 +927,24 @@
|
||||
"verticalBorders": "vores de columna"
|
||||
},
|
||||
"label": {
|
||||
"actions": "$t(common.action_other)",
|
||||
"album": "$t(entity.album_one)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"actions": "$t(common.action, {\"count\": 2})",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"biography": "$t(common.biography)",
|
||||
"bitrate": "$t(common.bitrate)",
|
||||
"bpm": "$t(common.bpm)",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"channels": "$t(common.channel, {\"count\": 2})",
|
||||
"codec": "$t(common.codec)",
|
||||
"duration": "$t(common.duration)",
|
||||
"favorite": "$t(common.favorite)",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"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)",
|
||||
"songCount": "$t(entity.track, {\"count\": 2})",
|
||||
"title": "$t(common.title)",
|
||||
"year": "$t(common.year)",
|
||||
"playCount": "compte de reproduccions",
|
||||
@@ -880,11 +955,13 @@
|
||||
"lastPlayed": "última reproducció",
|
||||
"rowIndex": "índex de files",
|
||||
"titleCombined": "$t(common.title) (combinat)",
|
||||
"albumCount": "$t(entity.album_other)",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2})",
|
||||
"bitDepth": "$t(common.bitDepth)",
|
||||
"genreBadge": "$t(entity.genre_one) (insígnies)",
|
||||
"genreBadge": "$t(entity.genre, {\"count\": 1}) (insígnies)",
|
||||
"image": "imatge",
|
||||
"sampleRate": "$t(common.sampleRate)"
|
||||
"sampleRate": "$t(common.sampleRate)",
|
||||
"composer": "compositor",
|
||||
"titleArtist": "$t(common.title) (artista)"
|
||||
},
|
||||
"view": {
|
||||
"table": "taula",
|
||||
@@ -897,17 +974,17 @@
|
||||
"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)",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"biography": "biografia",
|
||||
"bitrate": "taxa de bits",
|
||||
"bpm": "bpm",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"channels": "$t(common.channel, {\"count\": 2})",
|
||||
"comment": "comentari",
|
||||
"disc": "disc",
|
||||
"duration": "durada",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"id": "identificador",
|
||||
"name": "nom",
|
||||
"note": "nota",
|
||||
@@ -926,7 +1003,7 @@
|
||||
"recentlyAdded": "afegit recentment",
|
||||
"recentlyPlayed": "reproduït recentment",
|
||||
"recentlyUpdated": "actualitzat recentment",
|
||||
"albumCount": "nombre de $t(entity.album_other)",
|
||||
"albumCount": "nombre de $t(entity.album, {\"count\": 2})",
|
||||
"favorited": "preferits",
|
||||
"isCompilation": "és una compilació",
|
||||
"isFavorited": "és un preferit",
|
||||
@@ -953,8 +1030,8 @@
|
||||
"repeat_all": "repetició",
|
||||
"shuffle": "reprodueix (mesclat)",
|
||||
"shuffle_off": "reproducció aleatòria desactivada",
|
||||
"addLast": "afegeix al final",
|
||||
"addNext": "afegeix a continuació",
|
||||
"addLast": "al final",
|
||||
"addNext": "a continuació",
|
||||
"favorite": "marcar com a preferida",
|
||||
"mute": "silencia",
|
||||
"next": "següent",
|
||||
@@ -970,12 +1047,14 @@
|
||||
"toggleFullscreenPlayer": "activa el reproductor de pantalla completa",
|
||||
"unfavorite": "elimina de preferits",
|
||||
"pause": "pausa",
|
||||
"addLastShuffled": "afegeix al final (mesclat)",
|
||||
"addNextShuffled": "afegeix a continuació (mesclat)",
|
||||
"addLastShuffled": "al final (mesclat)",
|
||||
"addNextShuffled": "a continuació (mesclat)",
|
||||
"holdToShuffle": "mantén premut per mesclar",
|
||||
"queueType": "tipus de cua",
|
||||
"queueType_default": "predeterminat",
|
||||
"queueType_priority": "prioritat"
|
||||
"lyrics": "lletra",
|
||||
"restoreQueueFromServer": "restaura la cua del servidor",
|
||||
"saveQueueToServer": "desa la cua al servidor",
|
||||
"artistRadio": "ràdio de l'artista",
|
||||
"trackRadio": "ràdio de la pista"
|
||||
},
|
||||
"error": {
|
||||
"credentialsRequired": "credencials requerides",
|
||||
@@ -1001,11 +1080,16 @@
|
||||
"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}}"
|
||||
"endpointNotImplementedError": "el punt final {{endpoint}} no està implementat per {{serverType}}",
|
||||
"multipleServerSaveQueueError": "la cua de reproducció té una o més cançons que no són del servidor actual, cosa que no és compatible",
|
||||
"saveQueueFailed": "error en desar la cua",
|
||||
"settingsSyncError": "hi ha discrepàncies entre la configuració del renderitzador i el procés principal. reinicieu l'aplicació per aplicar els canvis",
|
||||
"noNetwork": "servidor no disponible",
|
||||
"noNetworkDescription": "no s'ha pogut connectar amb el servidor"
|
||||
},
|
||||
"releaseType": {
|
||||
"primary": {
|
||||
"album": "$t(entity.album_one)",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"broadcast": "emissió",
|
||||
"ep": "EP",
|
||||
"other": "altres",
|
||||
@@ -1055,5 +1139,160 @@
|
||||
"queryBuilder": {
|
||||
"standardTags": "etiquetes estàndard",
|
||||
"customTags": "etiquetes personalitzades"
|
||||
},
|
||||
"datetime": {
|
||||
"minuteShort": "min",
|
||||
"secondShort": "s",
|
||||
"hourShort": "h",
|
||||
"dayShort": "d"
|
||||
},
|
||||
"visualizer": {
|
||||
"visualizerType": "tipus de visualitzador",
|
||||
"cyclePresets": "opcions preconfigurades",
|
||||
"cycleTime": "duració d'un cicle (segons)",
|
||||
"includeAllPresets": "inclou totes les opcions predeterminades",
|
||||
"ignoredPresets": "ignora les opcions predeterminades",
|
||||
"selectedPresets": "opcions predeterminades seleccionades",
|
||||
"randomizeNextPreset": "tria la següent opcions predeterminada a l'atzar",
|
||||
"blendTime": "duració de la mescla",
|
||||
"presets": "opcions predeterminades",
|
||||
"selectPreset": "selecciona una opció predeterminada",
|
||||
"applyPreset": "aplica l'opció predeterminada",
|
||||
"saveAsPreset": "desa com a opció predeterminada",
|
||||
"updatePreset": "actualitza l'opció predeterminada",
|
||||
"copyConfiguration": "copia la configuració",
|
||||
"pasteConfiguration": "enganxa la configuració",
|
||||
"pasteConfigurationPlaceholder": "enganxa la configuració JSON aquí...",
|
||||
"pasteFromClipboard": "enganxa des del portaretalls",
|
||||
"applyConfiguration": "aplica la configuració",
|
||||
"configCopied": "configuració copiada al portaretalls",
|
||||
"configCopyFailed": "error en copiar la configuració",
|
||||
"configPasted": "configuració aplicada correctament",
|
||||
"configPasteFailed": "Error en aplicar la configuració. Reviseu-ne el format.",
|
||||
"configPasteReadFailed": "Error en llegir del portaretalls",
|
||||
"presetName": "Nom de l'opció predeterminada",
|
||||
"presetNamePlaceholder": "Escriviu el nom de l'opció predeterminada",
|
||||
"general": "General",
|
||||
"mode": "Mode",
|
||||
"mode1To8": "Mode 1 - 8",
|
||||
"mode10": "Mode 10",
|
||||
"barSpace": "Espai entre barres",
|
||||
"lineWidth": "Amplitud de línia",
|
||||
"fillAlpha": "Omplir alfa",
|
||||
"channelLayout": "Disseny del canal",
|
||||
"maxFPS": "FPS màxims",
|
||||
"opacity": "Opacitat",
|
||||
"customGradients": "Degradats personalitzats",
|
||||
"addCustomGradient": "Afegeix un degradat personalitzat",
|
||||
"gradientName": "Nom del degradat",
|
||||
"gradientNamePlaceholder": "Nom del degradat",
|
||||
"vertical": "Vertical",
|
||||
"horizontal": "Horitzontal",
|
||||
"colorStops": "Parades de color",
|
||||
"addColor": "Afegeix el color",
|
||||
"position": "Posició",
|
||||
"level": "Nivell",
|
||||
"remove": "Elimina",
|
||||
"custom": "Personalitzat",
|
||||
"builtIn": "Integrat",
|
||||
"colors": "Colors",
|
||||
"colorMode": "Mode de color",
|
||||
"gradient": "Degradat",
|
||||
"gradientLeft": "Esquerra del degradat",
|
||||
"gradientRight": "Dreta del degradat",
|
||||
"fft": "FFT",
|
||||
"fftSize": "Mida del FFT",
|
||||
"smoothing": "Suavitzador",
|
||||
"frequencyRangeAndScaling": "Escala i rang de freqüència",
|
||||
"minimumFrequency": "Freqüència mínima",
|
||||
"maximumFrequency": "Freqüència màxima",
|
||||
"frequencyScale": "Escala de freqüència",
|
||||
"sensitivity": "Sensibilitat",
|
||||
"weightingFilter": "Filtre de pes",
|
||||
"minimumDecibels": "Decibels mínims",
|
||||
"maximumDecibels": "Decibels màxims",
|
||||
"linearAmplitude": "Amplitud lineal",
|
||||
"linearBoost": "Augment lineal",
|
||||
"peakBehavior": "Comportament del pic",
|
||||
"showPeaks": "Mostra els pics",
|
||||
"fadePeaks": "Pics de fosa",
|
||||
"peakLine": "Línea del pic",
|
||||
"gravity": "Gravetat",
|
||||
"peakFadeTime": "Temps de fosa del pic (ms)",
|
||||
"peakHoldTime": "Temps d'espera del pic (ms)",
|
||||
"radialSpectrum": "Espectre radial",
|
||||
"radial": "Radial",
|
||||
"radialInvert": "Invertir el radial",
|
||||
"spinSpeed": "Velocitat de gir",
|
||||
"radius": "Radi",
|
||||
"reflexMirror": "Mirall del reflex",
|
||||
"reflexFit": "Ajustament del reflex",
|
||||
"reflexRatio": "Proporció del reflex",
|
||||
"reflexAlpha": "Alfa del reflex",
|
||||
"reflexBrightness": "Brillantor del reflex",
|
||||
"mirror": "Mirall",
|
||||
"miscellaneousSettings": "Configuració miscel·lànea",
|
||||
"alphaBars": "Barres alfa",
|
||||
"ansiBands": "Bandes ANSI",
|
||||
"ledBars": "Barres LED",
|
||||
"trueLeds": "LEDs reals",
|
||||
"lumiBars": "Barres Lumi",
|
||||
"outlineBars": "Barres de vora",
|
||||
"roundBars": "Barres arrodonides",
|
||||
"lowResolution": "Baixa resolució",
|
||||
"splitGradient": "Degradat dividit",
|
||||
"showFPS": "Mostra els FPS",
|
||||
"showScaleX": "Mostra l'escala X",
|
||||
"noteLabels": "Etiquetes de nota",
|
||||
"showScaleY": "Mostra l'escala Y",
|
||||
"options": {
|
||||
"colorMode": {
|
||||
"gradient": "Degradat",
|
||||
"barIndex": "Índex de barra",
|
||||
"barLevel": "Nivell de barra"
|
||||
},
|
||||
"gradient": {
|
||||
"classic": "Classic",
|
||||
"prism": "Prisme",
|
||||
"rainbow": "Arc de Sant Martí",
|
||||
"steelblue": "Blau d'acer",
|
||||
"orangered": "Vermell ataronjat"
|
||||
},
|
||||
"channelLayout": {
|
||||
"single": "Únic",
|
||||
"dualCombined": "Dual-Combinat",
|
||||
"dualHorizontal": "Dual-Horitzontal",
|
||||
"dualVertical": "Dual-Vertical"
|
||||
},
|
||||
"frequencyScale": {
|
||||
"bark": "Escala Bark",
|
||||
"linear": "Escala Lineal",
|
||||
"log": "Escala logarítmica",
|
||||
"mel": "Escala Mel",
|
||||
"none": "Cap"
|
||||
},
|
||||
"weightingFilter": {
|
||||
"none": "Cap",
|
||||
"a": "A",
|
||||
"b": "B",
|
||||
"c": "C",
|
||||
"d": "D",
|
||||
"z": "Z"
|
||||
},
|
||||
"mode": {
|
||||
"0": "[0] Freqüències discretes",
|
||||
"1": "[1] 1/24a octava / 240 bandes",
|
||||
"2": "[2] 1/12a octava / 120 bandes",
|
||||
"3": "[3] 1/8a octava / 80 bandes",
|
||||
"4": "[4] 1/6a octava / 60 bandes",
|
||||
"5": "[5] 1/4a octava / 40 bandes",
|
||||
"6": "[6] 1/3a octava / 30 bandes",
|
||||
"7": "[7] Mitja octava / 20 bandes",
|
||||
"8": "[8] Octava completa / 10 bandes",
|
||||
"10": "[10] Línia / Gràfic d'àrea"
|
||||
}
|
||||
},
|
||||
"pasteGradient": "enganxa degradat",
|
||||
"pasteGradientPlaceholder": "enganxa el degradat JSON aquí..."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,13 +33,12 @@
|
||||
"viewQueue": "zobrazit frontu",
|
||||
"addLastShuffled": "poslední (náhodně)",
|
||||
"addNextShuffled": "další (náhodně)",
|
||||
"queueType": "typ fronty",
|
||||
"queueType_default": "výchozí",
|
||||
"queueType_priority": "priorita",
|
||||
"holdToShuffle": "podržte pro zamíchání",
|
||||
"lyrics": "texty",
|
||||
"restoreQueueFromServer": "obnovit frontu ze serveru",
|
||||
"saveQueueToServer": "uložit frontu na server"
|
||||
"saveQueueToServer": "uložit frontu na server",
|
||||
"artistRadio": "rádio umělce",
|
||||
"trackRadio": "rádio skladby"
|
||||
},
|
||||
"setting": {
|
||||
"crossfadeStyle_description": "vyberte způsob prolnutí u přehrávače zvuku",
|
||||
@@ -103,7 +102,7 @@
|
||||
"exitToTray_description": "ukončit aplikaci do systémové lišty",
|
||||
"followLyric_description": "přesouvat texty s aktuální pozicí přehrávání",
|
||||
"hotkey_favoritePreviousSong": "oblíbit $t(common.previousSong)",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album_one)",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album, {\"count\": 1})",
|
||||
"lyricOffset": "odsazení textů (ms)",
|
||||
"discordUpdateInterval_description": "čas v sekundách mezi každou aktualizací (minimálně 15 sekund)",
|
||||
"fontType_optionCustom": "vlastní písmo",
|
||||
@@ -115,7 +114,7 @@
|
||||
"playbackStyle_optionCrossFade": "křížové prolnutí",
|
||||
"hotkey_rate3": "hodnocení 3 hvězdami",
|
||||
"font": "písmo",
|
||||
"replayGainMode_optionTrack": "$t(entity.track_one)",
|
||||
"replayGainMode_optionTrack": "$t(entity.track, {\"count\": 1})",
|
||||
"themeLight_description": "nastavit použití světlého motivu v aplikaci",
|
||||
"hotkey_toggleFullScreenPlayer": "přepnutí přehrávače na celou obrazovku",
|
||||
"hotkey_localSearch": "vyhledávání na stránce",
|
||||
@@ -165,7 +164,7 @@
|
||||
"useSystemTheme_description": "následovat systémovou předvolbu světlého nebo tmavého motivu",
|
||||
"playButtonBehavior_optionAddNext": "$t(player.addNext)",
|
||||
"lyricFetch_description": "načtení textů z různých internetových zdrojů",
|
||||
"lyricFetchProvider_description": "vyberte poskytovatele textů. pořadí poskytovatelů je pořadí, ve kterém budou načítány",
|
||||
"lyricFetchProvider_description": "vyberte poskytovatele textů",
|
||||
"globalMediaHotkeys_description": "zapnout nebo vypnout použití vašich systémových zkratek médií pro ovládání přehrávače",
|
||||
"customFontPath": "vlastní cesta k písmům",
|
||||
"followLyric": "zobrazit aktuální texty",
|
||||
@@ -207,8 +206,6 @@
|
||||
"passwordStore": "ukládání hesel / tajných klíčů",
|
||||
"mpvExtraParameters_help": "jeden na řádek",
|
||||
"homeConfiguration": "nastavení domovské stránky",
|
||||
"playerAlbumArtResolution_description": "rozlišení náhledu obalu alba ve velkém přehrávači. větší hodnota znamená kvalitnější obrázek, ale může se déle načítat. výchozí hodnota je 0, což znamená automatické rozlišení",
|
||||
"playerAlbumArtResolution": "rozlišení obalu alba v přehrávači",
|
||||
"externalLinks_description": "zapne zobrazování externích odkazů (Last.fm, MusicBrainz) na stránce umělce/alba",
|
||||
"clearCacheSuccess": "mezipaměť úspěšně vymazána",
|
||||
"externalLinks": "zobrazit externí odkazy",
|
||||
@@ -224,11 +221,11 @@
|
||||
"discordListening_description": "zobrazit stav jako „Poslouchá“ namísto „Hraje“",
|
||||
"contextMenu": "nastavení kontextové nabídky (kliknutí pravým)",
|
||||
"contextMenu_description": "umožňuje skrýt položky, které se zobrazí v nabídce po kliknutí pravým tlačítkem myši na položku. položky, které nejsou zaškrtnuté, se skryjí",
|
||||
"customCssEnable": "povolit vlastní CSS",
|
||||
"customCssEnable_description": "umožnit psaní vlastního CSS",
|
||||
"customCssNotice": "Varování: i když provádíme určitou sanitizaci (zakázáním url() a content:), může používání CSS stále představovat riziko změnami rozhraní",
|
||||
"customCss_description": "vlastní CSS obsah. Upozornění: vlastnosti content a vzdálené url jsou zakázané. Níže je zobrazen náhled vašeho obsahu. Další pole, která jste nenastavili, jsou přítomna z důvodu sanitizace",
|
||||
"customCss": "vlastní CSS",
|
||||
"customCssEnable": "povolit vlastní css",
|
||||
"customCssEnable_description": "umožnit psaní vlastního css",
|
||||
"customCssNotice": "Varování: i když provádíme určitou sanitizaci (zakázáním url() a content:), může používání css stále představovat riziko změnami rozhraní",
|
||||
"customCss_description": "vlastní css obsah. Upozornění: vlastnosti content a vzdálené url jsou zakázané. Níže je zobrazen náhled vašeho obsahu. Další pole, která jste nenastavili, jsou přítomna z důvodu sanitizace",
|
||||
"customCss": "vlastní css",
|
||||
"webAudio": "použít webový zvuk",
|
||||
"webAudio_description": "použít webový zvuk. tím povolíte pokročilé funkce jako replaygain. zakažte, pokud se objeví problémy",
|
||||
"transcode_description": "zapnout překódování do různých formátů",
|
||||
@@ -289,7 +286,7 @@
|
||||
"releaseChannel": "kanál vydání",
|
||||
"releaseChannel_description": "vyberte si mezi stabilními vydáními nebo beta vydáními pro automatické aktualizace",
|
||||
"mediaSession": "povolit relaci médií",
|
||||
"mediaSession_description": "povolí integraci do služby Windows Media Session, což zobrazí ovládání a metadata médií v překrytí systémové hlasitosti a na zamykací obrazovce (pouze Windows)",
|
||||
"mediaSession_description": "povolí integraci do služby Media Session, což zobrazí ovládání a metadata médií v překrytí systémové hlasitosti a na zamykací obrazovce",
|
||||
"exportImportSettings_control_description": "exportovat a importovat nastavení pomocí souboru JSON",
|
||||
"exportImportSettings_control_exportText": "exportovat nastavení",
|
||||
"exportImportSettings_control_importText": "importovat nastavení",
|
||||
@@ -349,26 +346,60 @@
|
||||
"logLevel_optionInfo": "informace",
|
||||
"logLevel_optionWarn": "varování",
|
||||
"useThemeAccentColor": "použít barvu motivu",
|
||||
"useThemeAccentColor_description": "použít primární barvu definovanou ve zvoleném motivu namísto vlastní barvy rozhraní"
|
||||
"useThemeAccentColor_description": "použít primární barvu definovanou ve zvoleném motivu namísto vlastní barvy rozhraní",
|
||||
"artistRadioCount_description": "nastaví počet skladeb, které načíst pro rádio umělce a rádio skladby",
|
||||
"artistRadioCount": "počet skladeb pro rádio umělce/skladby",
|
||||
"imageResolution": "rozlišení obrázků",
|
||||
"imageResolution_description": "rozlišení obrázků používaných napříč aplikací. nastavení hodnoty 0 použije nativní rozlišení obrázku",
|
||||
"imageResolution_optionTable": "tabulka",
|
||||
"imageResolution_optionItemCard": "karta položky",
|
||||
"imageResolution_optionSidebar": "postranní lišta",
|
||||
"imageResolution_optionHeader": "záhlaví",
|
||||
"imageResolution_optionFullScreenPlayer": "přehrávač na celé obrazovce",
|
||||
"combinedLyricsAndVisualizer_description": "spojit texty a vizualizér do jednoho panelu",
|
||||
"combinedLyricsAndVisualizer": "spojit texty a vizualizér v postranní liště přehrávače",
|
||||
"showRatings_description": "ovládá, zda se funkce hodnocení pomocí hvězdiček objeví v rozhraní",
|
||||
"showRatings": "zobrazit hodnocení pomocí hvězdiček",
|
||||
"artistReleaseTypeConfiguration": "nastavení typu vydání umělce",
|
||||
"artistReleaseTypeConfiguration_description": "nastavit, jaké typy vydání a v jakém pořadí jsou zobrazeny na stránce umělce alba",
|
||||
"mpvExtraParameters": "extra parametry mpv",
|
||||
"mpvExtraParameters_description": "další argumenty, které předat přehrávači mpv",
|
||||
"hotkey_listNavigateToPage": "navigace na stránku položky v seznamu",
|
||||
"hotkey_listPlayDefault": "přehrání v seznamu",
|
||||
"hotkey_listPlayLast": "přehrání poslední položky v seznamu",
|
||||
"hotkey_listPlayNext": "přehrání další položky v seznamu",
|
||||
"hotkey_listPlayNow": "okamžité přehrání v seznamu",
|
||||
"pathReplace": "nahrazení cesty k souborům",
|
||||
"pathReplace_description": "nahradit výchozí cestu k souborům vašeho serveru",
|
||||
"pathReplace_optionRemovePrefix": "odstranit předponu",
|
||||
"pathReplace_optionAddPrefix": "přidat předponu",
|
||||
"homeFeatureStyle_description": "ovládá styl doporučených skladeb na domovské stránce",
|
||||
"homeFeatureStyle": "styl doporučených na domovské stránce",
|
||||
"homeFeatureStyle_optionMultiple": "několik",
|
||||
"homeFeatureStyle_optionSingle": "jeden",
|
||||
"enableGridMultiSelect": "povolit vícenásobný výběr v mřížce",
|
||||
"enableGridMultiSelect_description": "pokud je povoleno, umožňuje vybrat několik položek v zobrazení mřížky. pokud je zakázáno, kliknutím na obrázek položky mřížky přejdete na stránku položky",
|
||||
"sidebarPlaylistSorting_description": "umožňuje ruční řazení seznamů skladeb v postranní liště pomocí přetažení namísto výchozího pořadí serveru",
|
||||
"sidebarPlaylistSorting": "řazení seznamů skladeb v postranní liště"
|
||||
},
|
||||
"action": {
|
||||
"editPlaylist": "upravit $t(entity.playlist_one)",
|
||||
"editPlaylist": "upravit $t(entity.playlist, {\"count\": 1})",
|
||||
"goToPage": "přejít na stránku",
|
||||
"moveToTop": "přesunout nahoru",
|
||||
"clearQueue": "vymazat frontu",
|
||||
"addToFavorites": "přidat do $t(entity.favorite_other)",
|
||||
"addToPlaylist": "přidat do $t(entity.playlist_one)",
|
||||
"createPlaylist": "vytvořit $t(entity.playlist_one)",
|
||||
"removeFromPlaylist": "odebrat z $t(entity.playlist_one)",
|
||||
"viewPlaylists": "zobrazit $t(entity.playlist_other)",
|
||||
"addToFavorites": "přidat do $t(entity.favorite, {\"count\": 2})",
|
||||
"addToPlaylist": "přidat do $t(entity.playlist, {\"count\": 1})",
|
||||
"createPlaylist": "vytvořit $t(entity.playlist, {\"count\": 1})",
|
||||
"removeFromPlaylist": "odebrat z $t(entity.playlist, {\"count\": 1})",
|
||||
"viewPlaylists": "zobrazit $t(entity.playlist, {\"count\": 2})",
|
||||
"refresh": "$t(common.refresh)",
|
||||
"deletePlaylist": "odstranit $t(entity.playlist_one)",
|
||||
"deletePlaylist": "odstranit $t(entity.playlist, {\"count\": 1})",
|
||||
"removeFromQueue": "odebrat z fronty",
|
||||
"deselectAll": "zrušit výběr všeho",
|
||||
"moveToBottom": "přesunout dolů",
|
||||
"setRating": "nastavit hodnocení",
|
||||
"toggleSmartPlaylistEditor": "přepnout editor $t(entity.smartPlaylist)",
|
||||
"removeFromFavorites": "odebrat z $t(entity.favorite_other)",
|
||||
"removeFromFavorites": "odebrat z $t(entity.favorite, {\"count\": 2})",
|
||||
"openIn": {
|
||||
"lastfm": "Otevřít v Last.fm",
|
||||
"musicbrainz": "Otevřít v MusicBrainz"
|
||||
@@ -384,8 +415,12 @@
|
||||
"moveDown": "posunout dolů",
|
||||
"holdToMoveToTop": "podržte pro přesunutí nahoru",
|
||||
"holdToMoveToBottom": "podržte pro přesunutí dolů",
|
||||
"createRadioStation": "vytvořit $t(entity.radioStation_one)",
|
||||
"deleteRadioStation": "odstranit $t(entity.radioStation_one)"
|
||||
"createRadioStation": "vytvořit $t(entity.radioStation, {\"count\": 1})",
|
||||
"deleteRadioStation": "odstranit $t(entity.radioStation, {\"count\": 1})",
|
||||
"openApplicationDirectory": "otevřít adresář aplikace",
|
||||
"addOrRemoveFromSelection": "přidat nebo odebrat z výběru",
|
||||
"selectRangeOfItems": "vyberte rozsah položek",
|
||||
"selectAll": "vybrat vše"
|
||||
},
|
||||
"common": {
|
||||
"backward": "zpátky",
|
||||
@@ -400,7 +435,7 @@
|
||||
"left": "vlevo",
|
||||
"save": "uložit",
|
||||
"right": "vpravo",
|
||||
"currentSong": "aktuální $t(entity.track_one)",
|
||||
"currentSong": "aktuální $t(entity.track, {\"count\": 1})",
|
||||
"collapse": "sbalit",
|
||||
"trackNumber": "stopa",
|
||||
"descending": "sestupně",
|
||||
@@ -430,7 +465,9 @@
|
||||
"delete": "odstranit",
|
||||
"cancel": "zrušit",
|
||||
"forceRestartRequired": "restartujte pro použití změn… zavřete oznámení pro restartování",
|
||||
"setting": "nastavení",
|
||||
"setting_one": "nastavení",
|
||||
"setting_few": "nastavení",
|
||||
"setting_other": "nastavení",
|
||||
"version": "verze",
|
||||
"title": "název",
|
||||
"filter_one": "filtr",
|
||||
@@ -457,7 +494,7 @@
|
||||
"none": "žádný",
|
||||
"menu": "nabídka",
|
||||
"restartRequired": "vyžadován restart",
|
||||
"previousSong": "předchozí $t(entity.track_one)",
|
||||
"previousSong": "předchozí $t(entity.track, {\"count\": 1})",
|
||||
"noResultsFromQuery": "nebyly nalezeny žádné výsledky",
|
||||
"quit": "ukončit",
|
||||
"expand": "rozbalit",
|
||||
@@ -502,7 +539,14 @@
|
||||
"tableColumns": "sloupce tabulky",
|
||||
"itemsMore": "{{count}} dalších",
|
||||
"noFilters": "nejsou nastaveny žádné filtry",
|
||||
"view": "zobrazit"
|
||||
"view": "zobrazit",
|
||||
"countSelected": "vybráno {{count}}",
|
||||
"retry": "zkusit znovu",
|
||||
"mood": "nálada",
|
||||
"example": "příklad",
|
||||
"filter_single": "jeden",
|
||||
"filter_multiple": "několik",
|
||||
"rename": "přejmenovat"
|
||||
},
|
||||
"table": {
|
||||
"config": {
|
||||
@@ -540,7 +584,8 @@
|
||||
"alternateRowColors": "střídat barvy řádků",
|
||||
"horizontalBorders": "okraje řádků",
|
||||
"rowHoverHighlight": "zvýraznění řádku při přejetí myší",
|
||||
"verticalBorders": "okraje sloupců"
|
||||
"verticalBorders": "okraje sloupců",
|
||||
"showHeader": "zobrazit záhlaví"
|
||||
},
|
||||
"label": {
|
||||
"releaseDate": "datum vydání",
|
||||
@@ -554,28 +599,30 @@
|
||||
"trackNumber": "číslo stopy",
|
||||
"rowIndex": "index řádku",
|
||||
"rating": "$t(common.rating)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"album": "$t(entity.album_one)",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"note": "$t(common.note)",
|
||||
"biography": "$t(common.biography)",
|
||||
"owner": "$t(common.owner)",
|
||||
"path": "$t(common.path)",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"channels": "$t(common.channel, {\"count\": 2})",
|
||||
"playCount": "počet přehrání",
|
||||
"bitrate": "$t(common.bitrate)",
|
||||
"actions": "$t(common.action_other)",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"actions": "$t(common.action, {\"count\": 2})",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"discNumber": "číslo disku",
|
||||
"favorite": "$t(common.favorite)",
|
||||
"year": "$t(common.year)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"codec": "$t(common.codec)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"albumCount": "$t(entity.album_other)",
|
||||
"genreBadge": "$t(entity.genre_one) (značky)",
|
||||
"songCount": "$t(entity.track, {\"count\": 2})",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2})",
|
||||
"genreBadge": "$t(entity.genre, {\"count\": 1}) (značky)",
|
||||
"image": "obrázek",
|
||||
"bitDepth": "$t(common.bitDepth)",
|
||||
"sampleRate": "$t(common.sampleRate)"
|
||||
"sampleRate": "$t(common.sampleRate)",
|
||||
"composer": "skladatel",
|
||||
"titleArtist": "$t(common.title) (umělec)"
|
||||
}
|
||||
},
|
||||
"column": {
|
||||
@@ -584,7 +631,7 @@
|
||||
"rating": "hodnocení",
|
||||
"favorite": "oblíbené",
|
||||
"playCount": "přehrání",
|
||||
"albumCount": "$t(entity.album_other)",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2})",
|
||||
"releaseYear": "rok",
|
||||
"lastPlayed": "naposledy přehráno",
|
||||
"biography": "biografie",
|
||||
@@ -593,14 +640,14 @@
|
||||
"title": "název",
|
||||
"bpm": "bpm",
|
||||
"dateAdded": "datum přidání",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"songCount": "$t(entity.track, {\"count\": 2})",
|
||||
"trackNumber": "skladba",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"albumArtist": "umělec alba",
|
||||
"path": "cesta",
|
||||
"discNumber": "disk",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"channels": "$t(common.channel, {\"count\": 2})",
|
||||
"size": "$t(common.size)",
|
||||
"codec": "$t(common.codec)",
|
||||
"owner": "majitel",
|
||||
@@ -634,14 +681,17 @@
|
||||
"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",
|
||||
"multipleServerSaveQueueError": "fronta přehrávání má jednu nebo více skladeb, které nejsou z aktuálního serveru. tato funkce není podporována",
|
||||
"saveQueueFailed": "nepodařilo se uložit frontu"
|
||||
"saveQueueFailed": "nepodařilo se uložit frontu",
|
||||
"settingsSyncError": "byly zjištěny nesrovnalosti mezi nastavením v rendereru a hlavním procesem. restartujte aplikaci, aby se změny projevily",
|
||||
"noNetwork": "server je nedostupný",
|
||||
"noNetworkDescription": "k tomuto serveru se nepodařilo připojit"
|
||||
},
|
||||
"filter": {
|
||||
"mostPlayed": "nejvíce přehráváno",
|
||||
"comment": "komentář",
|
||||
"playCount": "počet přehrání",
|
||||
"recentlyUpdated": "nedávno upraveno",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"channels": "$t(common.channel, {\"count\": 2})",
|
||||
"isCompilation": "je kompilace",
|
||||
"recentlyPlayed": "nedávno přehráno",
|
||||
"isRated": "je hodnoceno",
|
||||
@@ -650,17 +700,17 @@
|
||||
"rating": "hodnocení",
|
||||
"search": "hledat",
|
||||
"bitrate": "datový tok",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"recentlyAdded": "nedávno přidáno",
|
||||
"note": "poznámka",
|
||||
"name": "název",
|
||||
"dateAdded": "datum přidání",
|
||||
"releaseDate": "datum vydání",
|
||||
"albumCount": "počet $t(entity.album_other)",
|
||||
"albumCount": "počet $t(entity.album, {\"count\": 2})",
|
||||
"communityRating": "komunitní hodnocení",
|
||||
"path": "cesta",
|
||||
"favorited": "oblíbené",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"isRecentlyPlayed": "je nedávno přehráno",
|
||||
"isFavorited": "je oblíbené",
|
||||
"bpm": "bpm",
|
||||
@@ -669,7 +719,7 @@
|
||||
"disc": "disk",
|
||||
"biography": "biografie",
|
||||
"songCount": "počet skladeb",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"duration": "trvání",
|
||||
"isPublic": "je veřejné",
|
||||
"random": "náhodně",
|
||||
@@ -677,27 +727,29 @@
|
||||
"toYear": "do roku",
|
||||
"fromYear": "z roku",
|
||||
"criticRating": "hodnocení kritiků",
|
||||
"album": "$t(entity.album_one)",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"trackNumber": "skladba",
|
||||
"explicitStatus": "$t(common.explicitStatus)"
|
||||
"explicitStatus": "$t(common.explicitStatus)",
|
||||
"sortName": "název v řazení"
|
||||
},
|
||||
"page": {
|
||||
"sidebar": {
|
||||
"nowPlaying": "právě hraje",
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"search": "$t(common.search)",
|
||||
"tracks": "$t(entity.track_other)",
|
||||
"albums": "$t(entity.album_other)",
|
||||
"genres": "$t(entity.genre_other)",
|
||||
"folders": "$t(entity.folder_other)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"tracks": "$t(entity.track, {\"count\": 2})",
|
||||
"albums": "$t(entity.album, {\"count\": 2})",
|
||||
"genres": "$t(entity.genre, {\"count\": 2})",
|
||||
"folders": "$t(entity.folder, {\"count\": 2})",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"home": "$t(common.home)",
|
||||
"artists": "$t(entity.artist_other)",
|
||||
"albumArtists": "$t(entity.albumArtist_other)",
|
||||
"shared": "$t(entity.playlist_other) sdíleny",
|
||||
"artists": "$t(entity.artist, {\"count\": 2})",
|
||||
"albumArtists": "$t(entity.albumArtist, {\"count\": 2})",
|
||||
"shared": "$t(entity.playlist, {\"count\": 2}) sdíleny",
|
||||
"myLibrary": "moje knihovna",
|
||||
"favorites": "$t(entity.favorite_other)",
|
||||
"radio": "$t(entity.radioStation_other)"
|
||||
"favorites": "$t(entity.favorite, {\"count\": 2})",
|
||||
"radio": "$t(entity.radioStation, {\"count\": 2})",
|
||||
"collections": "sbírky"
|
||||
},
|
||||
"fullscreenPlayer": {
|
||||
"config": {
|
||||
@@ -725,7 +777,7 @@
|
||||
"appMenu": {
|
||||
"selectServer": "vybrat server",
|
||||
"version": "verze {{version}}",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"manageServers": "správce serverů",
|
||||
"expandSidebar": "rozbalit postranní panel",
|
||||
"collapseSidebar": "sbalit postranní panel",
|
||||
@@ -763,8 +815,8 @@
|
||||
"download": "stáhnout",
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"moveToNext": "$t(action.moveToNext)",
|
||||
"goToAlbum": "přejít na $t(entity.album_one)",
|
||||
"goToAlbumArtist": "přejít na $t(entity.albumArtist_one)",
|
||||
"goToAlbum": "přejít na $t(entity.album, {\"count\": 1})",
|
||||
"goToAlbumArtist": "přejít na $t(entity.albumArtist, {\"count\": 1})",
|
||||
"moveItems": "$t(action.moveItems)",
|
||||
"goTo": "přejít na"
|
||||
},
|
||||
@@ -775,10 +827,10 @@
|
||||
"explore": "procházet z vaší knihovny",
|
||||
"recentlyPlayed": "nedávno přehráno",
|
||||
"recentlyReleased": "nedávno vydáno",
|
||||
"genres": "$t(entity.genre_other)"
|
||||
"genres": "$t(entity.genre, {\"count\": 2})"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "více od tohoto $t(entity.artist_one)",
|
||||
"moreFromArtist": "více od tohoto $t(entity.artist, {\"count\": 1})",
|
||||
"moreFromGeneric": "více od {{item}}",
|
||||
"released": "vydáno"
|
||||
},
|
||||
@@ -804,20 +856,21 @@
|
||||
"transcoding": "překódování",
|
||||
"discord": "discord",
|
||||
"playerFilters": "filtry přehrávače",
|
||||
"logger": "protokol"
|
||||
"logger": "protokol",
|
||||
"lyricsDisplay": "zobrazení textů"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
"title": "$t(entity.albumArtist, {\"count\": 2})"
|
||||
},
|
||||
"genreList": {
|
||||
"title": "$t(entity.genre_other)",
|
||||
"showTracks": "zobrazit $t(entity.track_other) s žánrem $t(entity.genre_one)",
|
||||
"showAlbums": "zobrazit $t(entity.album_other) s žánrem $t(entity.genre_one)"
|
||||
"title": "$t(entity.genre, {\"count\": 2})",
|
||||
"showTracks": "zobrazit $t(entity.track, {\"count\": 2}) s žánrem $t(entity.genre, {\"count\": 1})",
|
||||
"showAlbums": "zobrazit $t(entity.album, {\"count\": 2}) s žánrem $t(entity.genre, {\"count\": 1})"
|
||||
},
|
||||
"trackList": {
|
||||
"title": "$t(entity.track_other)",
|
||||
"title": "$t(entity.track, {\"count\": 2})",
|
||||
"artistTracks": "skladby od umělce {{artist}}",
|
||||
"genreTracks": "$t(entity.track_other) s žánrem „{{genre}}“"
|
||||
"genreTracks": "$t(entity.track, {\"count\": 2}) s žánrem „{{genre}}“"
|
||||
},
|
||||
"globalSearch": {
|
||||
"commands": {
|
||||
@@ -828,12 +881,12 @@
|
||||
"title": "příkazy"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist_other)"
|
||||
"title": "$t(entity.playlist, {\"count\": 2})"
|
||||
},
|
||||
"albumList": {
|
||||
"title": "$t(entity.album_other)",
|
||||
"title": "$t(entity.album, {\"count\": 2})",
|
||||
"artistAlbums": "alba od umělce {{artist}}",
|
||||
"genreAlbums": "$t(entity.album_other) s žánrem „{{genre}}“"
|
||||
"genreAlbums": "$t(entity.album, {\"count\": 2}) s žánrem „{{genre}}“"
|
||||
},
|
||||
"albumArtistDetail": {
|
||||
"recentReleases": "nedávno vydáno",
|
||||
@@ -842,9 +895,11 @@
|
||||
"appearsOn": "také v",
|
||||
"topSongs": "nejlepší skladby",
|
||||
"topSongsFrom": "nejlepší skladby od umělce {{title}}",
|
||||
"relatedArtists": "podobní $t(entity.artist_other)",
|
||||
"viewAllTracks": "zobrazit všechny $t(entity.track_other)",
|
||||
"viewAll": "zobrazit vše"
|
||||
"relatedArtists": "podobní $t(entity.artist, {\"count\": 2})",
|
||||
"viewAllTracks": "zobrazit všechny $t(entity.track, {\"count\": 2})",
|
||||
"viewAll": "zobrazit vše",
|
||||
"groupingTypeAll": "všechny typy vydání",
|
||||
"groupingTypePrimary": "primární typy vydání"
|
||||
},
|
||||
"itemDetail": {
|
||||
"copiedPath": "cesta úspěšně zkopírována",
|
||||
@@ -863,27 +918,35 @@
|
||||
"title": "správa serverů"
|
||||
},
|
||||
"favorites": {
|
||||
"title": "$t(entity.favorite_other)"
|
||||
"title": "$t(entity.favorite, {\"count\": 2})"
|
||||
},
|
||||
"folderList": {
|
||||
"title": "$t(entity.folder_other)"
|
||||
"title": "$t(entity.folder, {\"count\": 2})"
|
||||
},
|
||||
"radioList": {
|
||||
"title": "stanice rádia"
|
||||
},
|
||||
"windowBar": {
|
||||
"paused": "(Pozastaveno) ",
|
||||
"privateMode": "(Soukromý režim)"
|
||||
},
|
||||
"collections": {
|
||||
"overrideExisting": "nahradit existující",
|
||||
"saveAsCollection": "uložit jako sbírku"
|
||||
}
|
||||
},
|
||||
"form": {
|
||||
"deletePlaylist": {
|
||||
"title": "odstranit $t(entity.playlist_one)",
|
||||
"success": "$t(entity.playlist_one) úspěšně odstraněn",
|
||||
"input_confirm": "pro potvrzení zadejte název $t(entity.playlist_one)u"
|
||||
"title": "odstranit $t(entity.playlist, {\"count\": 1})",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) úspěšně odstraněn",
|
||||
"input_confirm": "pro potvrzení zadejte název $t(entity.playlist, {\"count\": 1})u"
|
||||
},
|
||||
"createPlaylist": {
|
||||
"input_description": "$t(common.description)",
|
||||
"title": "vytvořit $t(entity.playlist_one)",
|
||||
"title": "vytvořit $t(entity.playlist, {\"count\": 1})",
|
||||
"input_public": "veřejné",
|
||||
"input_name": "$t(common.name)",
|
||||
"success": "$t(entity.playlist_one) úspěšně vytvořen",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) úspěšně vytvořen",
|
||||
"input_owner": "$t(common.owner)"
|
||||
},
|
||||
"addServer": {
|
||||
@@ -895,19 +958,22 @@
|
||||
"input_name": "název serveru",
|
||||
"success": "server úspěšně přidán",
|
||||
"input_savePassword": "uložit heslo",
|
||||
"ignoreSsl": "ignorovat SSL $t(common.restartRequired)",
|
||||
"ignoreCors": "ignorovat CORS $t(common.restartRequired)",
|
||||
"ignoreSsl": "ignorovat ssl $t(common.restartRequired)",
|
||||
"ignoreCors": "ignorovat cors $t(common.restartRequired)",
|
||||
"error_savePassword": "při ukládání hesla se vyskytla chyba",
|
||||
"input_preferInstantMix": "preferovat instantní mix",
|
||||
"input_preferInstantMixDescription": "pro získání podobných skladeb použít pouze instantní mix. užitečné, pokud máte doplňky, které upravují toto chování"
|
||||
"input_preferInstantMixDescription": "pro získání podobných skladeb použít pouze instantní mix. užitečné, pokud máte doplňky, které upravují toto chování",
|
||||
"input_preferRemoteUrl": "preferovat veřejnou adresu url",
|
||||
"input_remoteUrl": "veřejná adresa url",
|
||||
"input_remoteUrlPlaceholder": "volitelné: veřejná adresa url pro externí funkce"
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"success": "přidáno $t(entity.trackWithCount, {\"count\": {{message}} }) do $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })",
|
||||
"title": "přidat do $t(entity.playlist_one)",
|
||||
"title": "přidat do $t(entity.playlist, {\"count\": 1})",
|
||||
"input_skipDuplicates": "přeskočit duplicity",
|
||||
"input_playlists": "$t(entity.playlist_other)",
|
||||
"create": "vytvořit $t(entity.playlist_one) {{playlist}}",
|
||||
"searchOrCreate": "vyhledejte $t(entity.playlist_other) nebo pište pro vytvoření nového"
|
||||
"input_playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"create": "vytvořit $t(entity.playlist, {\"count\": 1}) {{playlist}}",
|
||||
"searchOrCreate": "vyhledejte $t(entity.playlist, {\"count\": 2}) nebo pište pro vytvoření nového"
|
||||
},
|
||||
"updateServer": {
|
||||
"title": "upravit server",
|
||||
@@ -924,12 +990,12 @@
|
||||
},
|
||||
"lyricSearch": {
|
||||
"input_name": "$t(common.name)",
|
||||
"input_artist": "$t(entity.artist_one)",
|
||||
"input_artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"title": "Hledat texty"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"title": "upravit $t(entity.playlist_one)",
|
||||
"success": "$t(entity.playlist_one) úspěšně aktualizován",
|
||||
"title": "upravit $t(entity.playlist, {\"count\": 1})",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) úspěšně aktualizován",
|
||||
"publicJellyfinNote": "Jellyfin z nějakého důvodu neukazuje, zda je seznam skladeb veřejný, nebo ne. Pokud si přejete, aby zůstal veřejný, zvolte prosím následující vstup",
|
||||
"editNote": "ruční úpravy velkých seznamů skladeb nejsou doporučeny. opravdu přijímáte riziko ztráty dat, které může vzniknout přepsáním existujícího seznamu skladeb?"
|
||||
},
|
||||
@@ -952,7 +1018,7 @@
|
||||
},
|
||||
"shuffleAll": {
|
||||
"title": "přehrát náhodně",
|
||||
"input_genre": "$t(entity.genre_one)",
|
||||
"input_genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"input_limit": "kolik skladeb?",
|
||||
"input_minYear": "od roku",
|
||||
"input_maxYear": "do roku",
|
||||
@@ -970,6 +1036,11 @@
|
||||
"input_homepageUrl": "adresa domovské stránky",
|
||||
"input_name": "název",
|
||||
"input_streamUrl": "adresa streamu"
|
||||
},
|
||||
"lyricsExport": {
|
||||
"export": "exportovat texty",
|
||||
"input_synced": "exportovat synchronizované texty",
|
||||
"input_offset": "$t(setting.lyricOffset)"
|
||||
}
|
||||
},
|
||||
"entity": {
|
||||
@@ -1000,16 +1071,16 @@
|
||||
"albumWithCount_one": "{{count}} album",
|
||||
"albumWithCount_few": "{{count}} alba",
|
||||
"albumWithCount_other": "{{count}} alb",
|
||||
"favorite_one": "oblíbená",
|
||||
"favorite_one": "oblíbený",
|
||||
"favorite_few": "oblíbené",
|
||||
"favorite_other": "oblíbených",
|
||||
"favorite_other": "oblíbené",
|
||||
"artistWithCount_one": "{{count}} umělec",
|
||||
"artistWithCount_few": "{{count}} umělci",
|
||||
"artistWithCount_other": "{{count}} umělců",
|
||||
"folder_one": "složka",
|
||||
"folder_few": "složky",
|
||||
"folder_other": "složky",
|
||||
"smartPlaylist": "chytrý $t(entity.playlist_one)",
|
||||
"smartPlaylist": "chytrý $t(entity.playlist, {\"count\": 1})",
|
||||
"album_one": "album",
|
||||
"album_few": "alba",
|
||||
"album_other": "alba",
|
||||
@@ -1039,7 +1110,7 @@
|
||||
},
|
||||
"releaseType": {
|
||||
"primary": {
|
||||
"album": "$t(entity.album_one)",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"broadcast": "vysílání",
|
||||
"ep": "ep",
|
||||
"other": "jiné",
|
||||
@@ -1084,5 +1155,160 @@
|
||||
"notInPlaylist": "není v",
|
||||
"notInTheLast": "není v posledním",
|
||||
"startsWith": "začíná na"
|
||||
},
|
||||
"datetime": {
|
||||
"minuteShort": "min.",
|
||||
"secondShort": "s",
|
||||
"hourShort": "h.",
|
||||
"dayShort": "d."
|
||||
},
|
||||
"visualizer": {
|
||||
"visualizerType": "Typ vizualizéru",
|
||||
"cyclePresets": "Cyklicky procházet předvolby",
|
||||
"cycleTime": "Čas cyklování (sekundy)",
|
||||
"includeAllPresets": "Zahrnout všechny předvolby",
|
||||
"ignoredPresets": "Ignorované předvolby",
|
||||
"selectedPresets": "Vybrané předvolby",
|
||||
"randomizeNextPreset": "Náhodně vybrat další předvolbu",
|
||||
"blendTime": "Čas prolnutí",
|
||||
"presets": "Předvolby",
|
||||
"selectPreset": "Vybrat předvolbu",
|
||||
"applyPreset": "Použít předvolbu",
|
||||
"saveAsPreset": "Uložit jako předvolbu",
|
||||
"updatePreset": "Aktualizovat předvolbu",
|
||||
"copyConfiguration": "Kopírovat konfiguraci",
|
||||
"pasteConfiguration": "Vložit konfiguraci",
|
||||
"pasteConfigurationPlaceholder": "Sem vložte konfiguraci JSON…",
|
||||
"pasteFromClipboard": "Vložit ze schránky",
|
||||
"applyConfiguration": "Použít konfiguraci",
|
||||
"configCopied": "Konfigurace zkopírována do schránky",
|
||||
"configCopyFailed": "Nepodařilo se zkopírovat konfiguraci",
|
||||
"configPasted": "Konfigurace úspěšně použita",
|
||||
"configPasteFailed": "Nepodařilo se použít konfiguraci. Zkontrolujte prosím formát.",
|
||||
"configPasteReadFailed": "Nepodařilo se přečíst schránku",
|
||||
"presetName": "Název předvolby",
|
||||
"presetNamePlaceholder": "Zadejte název předvolby",
|
||||
"general": "Obecné",
|
||||
"mode": "Režim",
|
||||
"mode1To8": "Režim 1–8",
|
||||
"mode10": "Režim 10",
|
||||
"barSpace": "Mezera mezi sloupci",
|
||||
"lineWidth": "Šířka linky",
|
||||
"fillAlpha": "Vyplnit alfu",
|
||||
"channelLayout": "Rozložení kanálů",
|
||||
"maxFPS": "Max. počet snímků za sekundu",
|
||||
"opacity": "Neprůhlednost",
|
||||
"customGradients": "Vlastní přechody",
|
||||
"addCustomGradient": "Přidat vlastní přechod",
|
||||
"gradientName": "Název přechodu",
|
||||
"gradientNamePlaceholder": "Název přechodu",
|
||||
"vertical": "Vertikální",
|
||||
"horizontal": "Horizontální",
|
||||
"colorStops": "Ukončení barev",
|
||||
"addColor": "Přidat barvu",
|
||||
"position": "Pozice",
|
||||
"level": "Úroveň",
|
||||
"remove": "Odstranit",
|
||||
"custom": "Vlastní",
|
||||
"builtIn": "Vestavěné",
|
||||
"colors": "Barvy",
|
||||
"colorMode": "Režim barev",
|
||||
"gradient": "Přechod",
|
||||
"gradientLeft": "Přechod zleva",
|
||||
"gradientRight": "Přechod zprava",
|
||||
"fft": "FFT",
|
||||
"fftSize": "Velikost FFT",
|
||||
"smoothing": "Vyhlazování",
|
||||
"frequencyRangeAndScaling": "Rozsah a škálování frekvencí",
|
||||
"minimumFrequency": "Minimální frekvence",
|
||||
"maximumFrequency": "Maximální frekvence",
|
||||
"frequencyScale": "Škála frekvence",
|
||||
"sensitivity": "Citlivost",
|
||||
"weightingFilter": "Filtr váhy",
|
||||
"minimumDecibels": "Minimální decibely",
|
||||
"maximumDecibels": "Maximální decibely",
|
||||
"linearAmplitude": "Lineární amplituda",
|
||||
"linearBoost": "Lineární zesílení",
|
||||
"peakBehavior": "Chování ve špičce",
|
||||
"showPeaks": "Zobrazit špičky",
|
||||
"fadePeaks": "Prolnout špičky",
|
||||
"peakLine": "Linka špiček",
|
||||
"gravity": "Gravitace",
|
||||
"peakFadeTime": "Čas pádu ze špičky (ms)",
|
||||
"peakHoldTime": "Čas udržení na špičce (ms)",
|
||||
"radialSpectrum": "Kruhové spektrum",
|
||||
"radial": "Kruhové",
|
||||
"radialInvert": "Kruhové invertované",
|
||||
"spinSpeed": "Rychlost rotace",
|
||||
"radius": "Poloměr",
|
||||
"reflexMirror": "Reflexní zrcadlení",
|
||||
"reflexFit": "Reflexní vyplnění",
|
||||
"reflexRatio": "Reflexní poměr",
|
||||
"reflexAlpha": "Reflexní alfa",
|
||||
"reflexBrightness": "Reflexní jas",
|
||||
"mirror": "Zrcadlení",
|
||||
"miscellaneousSettings": "Různá nastavení",
|
||||
"alphaBars": "Alfa sloupce",
|
||||
"ansiBands": "ANSI sloupce",
|
||||
"ledBars": "LED sloupce",
|
||||
"trueLeds": "Pravé LED",
|
||||
"lumiBars": "Lumi sloupce",
|
||||
"outlineBars": "Obrysové sloupce",
|
||||
"roundBars": "Zaoblené sloupce",
|
||||
"lowResolution": "Nízké rozlišení",
|
||||
"splitGradient": "Přechod rozdělení",
|
||||
"showFPS": "Zobrazit FPS",
|
||||
"showScaleX": "Zobrazit osu X",
|
||||
"noteLabels": "Štítky not",
|
||||
"showScaleY": "Zobrazit osu Y",
|
||||
"options": {
|
||||
"colorMode": {
|
||||
"gradient": "Přechod",
|
||||
"barIndex": "Index sloupce",
|
||||
"barLevel": "Úroveň sloupce"
|
||||
},
|
||||
"gradient": {
|
||||
"classic": "Klasický",
|
||||
"prism": "Prism",
|
||||
"rainbow": "Duha",
|
||||
"steelblue": "Ocelově modrá",
|
||||
"orangered": "Oranžová"
|
||||
},
|
||||
"channelLayout": {
|
||||
"single": "Jeden",
|
||||
"dualCombined": "Duální kombinované",
|
||||
"dualHorizontal": "Duální horizontální",
|
||||
"dualVertical": "Duální vertikální"
|
||||
},
|
||||
"frequencyScale": {
|
||||
"bark": "Barkova stupnice",
|
||||
"linear": "Lineární stupnice",
|
||||
"log": "Logaritmická stupnice",
|
||||
"mel": "Melová stupnice",
|
||||
"none": "Žádný"
|
||||
},
|
||||
"weightingFilter": {
|
||||
"none": "Žádný",
|
||||
"a": "A",
|
||||
"b": "B",
|
||||
"c": "C",
|
||||
"d": "D",
|
||||
"z": "Z"
|
||||
},
|
||||
"mode": {
|
||||
"0": "[0] Diskrétní frekvence",
|
||||
"1": "[1] 1/24 oktávy / 240 pásem",
|
||||
"2": "[2] 1/12 oktávy / 120 pásem",
|
||||
"3": "[3] 1/8 oktávy / 80 pásem",
|
||||
"4": "[4] 1/6 oktávy / 60 pásem",
|
||||
"5": "[5] 1/4 oktávy / 40 pásem",
|
||||
"6": "[6] 1/3 oktávy / 30 pásem",
|
||||
"7": "[7] Polovina oktávy / 20 pásem",
|
||||
"8": "[8] Celá oktáva / 10 pásem",
|
||||
"10": "[10] Linka / Graf oblasti"
|
||||
}
|
||||
},
|
||||
"pasteGradient": "Vložit přechod",
|
||||
"pasteGradientPlaceholder": "Sem vložte JSON přechodu…"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"action": {
|
||||
"addToFavorites": "tilføj til $t(entity.favorite, {\"count\": 2})",
|
||||
"addToPlaylist": "tilføj til $t(entity.playlist, {\"count\": 1})",
|
||||
"addOrRemoveFromSelection": "tilføj eller fjern fra valg",
|
||||
"selectAll": "vælge alt"
|
||||
}
|
||||
}
|
||||
@@ -1,22 +1,22 @@
|
||||
{
|
||||
"action": {
|
||||
"editPlaylist": "$t(entity.playlist_one) bearbeiten",
|
||||
"clearQueue": "Warteschlange leeren",
|
||||
"addToFavorites": "Zu $t(entity.favorite_other) hinzufügen",
|
||||
"addToPlaylist": "Zu $t(entity.playlist_one) hinzufügen",
|
||||
"createPlaylist": "$t(entity.playlist_one) erstellen",
|
||||
"deletePlaylist": "$t(entity.playlist_one) löschen",
|
||||
"editPlaylist": "$t(entity.playlist, {\"count\": 1}) bearbeiten",
|
||||
"clearQueue": "Wiedergabeliste leeren",
|
||||
"addToFavorites": "Zu $t(entity.favorite, {\"count\": 2}) hinzufügen",
|
||||
"addToPlaylist": "Zu $t(entity.playlist, {\"count\": 1}) hinzufügen",
|
||||
"createPlaylist": "$t(entity.playlist, {\"count\": 1}) erstellen",
|
||||
"deletePlaylist": "$t(entity.playlist, {\"count\": 1}) löschen",
|
||||
"deselectAll": "Alle abwählen",
|
||||
"goToPage": "Zu Seite gehen",
|
||||
"moveToTop": "Als erstes",
|
||||
"moveToBottom": "Als letztes",
|
||||
"removeFromPlaylist": "Aus $t(entity.playlist_one) entfernen",
|
||||
"viewPlaylists": "$t(entity.playlist_other) anzeigen",
|
||||
"removeFromPlaylist": "Aus $t(entity.playlist, {\"count\": 1}) entfernen",
|
||||
"viewPlaylists": "$t(entity.playlist, {\"count\": 2}) anzeigen",
|
||||
"refresh": "$t(common.refresh)",
|
||||
"removeFromQueue": "Aus Warteschlange entfernen",
|
||||
"removeFromQueue": "Aus Wiedergabeliste entfernen",
|
||||
"setRating": "Bewerten",
|
||||
"toggleSmartPlaylistEditor": "Editor für $t(entity.smartPlaylist) ein-/ausblenden",
|
||||
"removeFromFavorites": "Aus $t(entity.favorite_other) entfernen",
|
||||
"removeFromFavorites": "Aus $t(entity.favorite, {\"count\": 2}) entfernen",
|
||||
"openIn": {
|
||||
"lastfm": "Auf Last.fm öffnen",
|
||||
"musicbrainz": "Auf MusicBrainz öffnen"
|
||||
@@ -29,7 +29,11 @@
|
||||
"shuffleSelected": "Ausgewählte zufällig wiedergeben",
|
||||
"viewMore": "Mehr zeigen",
|
||||
"moveUp": "Nach oben bewegen",
|
||||
"moveDown": "Nach unten bewegen"
|
||||
"moveDown": "Nach unten bewegen",
|
||||
"createRadioStation": "$t(entity.radioStation, {\"count\": 1}) erstellen",
|
||||
"deleteRadioStation": "$t(entity.radioStation, {\"count\": 1}) löschen",
|
||||
"selectAll": "alle auswählen",
|
||||
"openApplicationDirectory": "Anwendungsverzeichnis öffnen"
|
||||
},
|
||||
"common": {
|
||||
"backward": "zurück",
|
||||
@@ -44,7 +48,7 @@
|
||||
"left": "Linksbündig",
|
||||
"save": "Speichern",
|
||||
"right": "Rechtsbündig",
|
||||
"currentSong": "Aktueller $t(entity.track_one)",
|
||||
"currentSong": "Aktueller $t(entity.track, {\"count\": 1})",
|
||||
"collapse": "Verkleinern",
|
||||
"trackNumber": "Track",
|
||||
"descending": "absteigend",
|
||||
@@ -100,7 +104,7 @@
|
||||
"none": "keine",
|
||||
"menu": "Menü",
|
||||
"restartRequired": "(Neustart benötigt)",
|
||||
"previousSong": "vorheriger $t(entity.track_one)",
|
||||
"previousSong": "vorheriger $t(entity.track, {\"count\": 1})",
|
||||
"noResultsFromQuery": "Die Abfrage brachte keine Ergebnisse",
|
||||
"quit": "verlassen",
|
||||
"expand": "Vergrößern",
|
||||
@@ -118,11 +122,11 @@
|
||||
"close": "schließen",
|
||||
"share": "Teilen",
|
||||
"translation": "Übersetzung",
|
||||
"trackGain": "Track-Pegelverstärkung",
|
||||
"trackPeak": "Track-Spitzenpegel",
|
||||
"trackGain": "Track Gain",
|
||||
"trackPeak": "Track Peak",
|
||||
"codec": "Codec",
|
||||
"albumPeak": "Album-Spitzenpegel",
|
||||
"albumGain": "Album-Pegelverstärkung",
|
||||
"albumGain": "Album Gain",
|
||||
"tags": "tags",
|
||||
"viewReleaseNotes": "Veröffentlichungsnotizen anzeigen",
|
||||
"newVersion": "eine neue Version wurde installiert ({{version}})",
|
||||
@@ -145,7 +149,9 @@
|
||||
"recordLabel": "Plattenlabel",
|
||||
"slower": "langsamer",
|
||||
"releaseType": "Veröffentlichungsformat",
|
||||
"view": "Betrachten"
|
||||
"view": "Betrachten",
|
||||
"countSelected": "{{count}} ausgewählt",
|
||||
"mood": "Stimmung"
|
||||
},
|
||||
"error": {
|
||||
"remotePortWarning": "Starten Sie den Server neu, um den neuen Port anzuwenden",
|
||||
@@ -167,11 +173,15 @@
|
||||
"audioDeviceFetchError": "Beim Versuch, Audiogeräte abzurufen, ist ein Fehler aufgetreten",
|
||||
"invalidServer": "Ungültiger Server",
|
||||
"loginRateError": "Zu viele Anmeldeversuche, bitte versuche es in einigen Sekunden erneut",
|
||||
"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. Dieses Problem tritt meist auf, wenn sich ein Lied im Überordner befindet. Jellyfin gruppiert Tracks nur, wenn diese sich innerhalb eines Ordners befinden",
|
||||
"networkError": "ein Netzwerkfehler ist aufgetreten",
|
||||
"openError": "datei kann nicht geöffnet werden",
|
||||
"badValue": "ungültige option \"{{value}}\". Dieser Wert existiert nicht mehr",
|
||||
"notificationDenied": "Berechtigungen über Benachrichtigungen wurden verweigert. Diese Einstellung hat keinen Effekt"
|
||||
"notificationDenied": "Berechtigungen über Benachrichtigungen wurden verweigert. Diese Einstellung hat keinen Effekt",
|
||||
"saveQueueFailed": "Wiedergabeliste konnte nicht gespeichert werden",
|
||||
"multipleServerSaveQueueError": "die Wiedergabeliste enthält einen oder mehrere Titel, die nicht vom aktuellen Server stammen. dies wird nicht unterstützt",
|
||||
"noNetwork": "Server nicht verfügbar",
|
||||
"noNetworkDescription": "Verbindung zum Server konnte nicht hergestellt werden"
|
||||
},
|
||||
"filter": {
|
||||
"mostPlayed": "Meistgespielt",
|
||||
@@ -190,11 +200,11 @@
|
||||
"name": "Name",
|
||||
"dateAdded": "Datum hinzugefügt",
|
||||
"releaseDate": "Veröffentlichungsdatum",
|
||||
"albumCount": "$t(entity.album_other) Anzahl",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2}) Anzahl",
|
||||
"communityRating": "Community-Wertung",
|
||||
"path": "Pfad",
|
||||
"favorited": "favorisiert",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"isRecentlyPlayed": "wurde kürzlich gespielt",
|
||||
"isFavorited": "wird favorisiert",
|
||||
"bpm": "bpm",
|
||||
@@ -210,25 +220,25 @@
|
||||
"toYear": "bis Jahr",
|
||||
"fromYear": "ab Jahr",
|
||||
"criticRating": "Kritikerbewertung",
|
||||
"album": "$t(entity.album_one)",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"trackNumber": "Track",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"owner": "$t(common.owner)",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"explicitStatus": "$t(common.explicitStatus)"
|
||||
},
|
||||
"form": {
|
||||
"deletePlaylist": {
|
||||
"title": "$t(entity.playlist_one) löschen",
|
||||
"success": "$t(entity.playlist_one) erfolgreich gelöscht",
|
||||
"input_confirm": "Geben Sie zur Bestätigung den Namen von $t(entity.playlist_one) ein"
|
||||
"title": "$t(entity.playlist, {\"count\": 1}) löschen",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) erfolgreich gelöscht",
|
||||
"input_confirm": "Geben Sie zur Bestätigung den Namen von $t(entity.playlist, {\"count\": 1}) ein"
|
||||
},
|
||||
"createPlaylist": {
|
||||
"input_description": "$t(common.description)",
|
||||
"title": "$t(entity.playlist_one) erstellen",
|
||||
"title": "$t(entity.playlist, {\"count\": 1}) erstellen",
|
||||
"input_public": "öffentlich",
|
||||
"success": "$t(entity.playlist_one) erfolgreich erstellt",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) erfolgreich erstellt",
|
||||
"input_name": "$t(common.name)",
|
||||
"input_owner": "$t(common.owner)"
|
||||
},
|
||||
@@ -249,11 +259,11 @@
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"success": "$t(entity.trackWithCount, {\"count\": {{message}} }) zu $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} }) hinzugefügt",
|
||||
"title": "Zu $t(entity.playlist_one) hinzufügen",
|
||||
"title": "Zu $t(entity.playlist, {\"count\": 1}) hinzufügen",
|
||||
"input_skipDuplicates": "Duplikate überspringen",
|
||||
"input_playlists": "$t(entity.playlist_other)",
|
||||
"create": "$t(entity.playlist_one) {{playlist}} erstellen",
|
||||
"searchOrCreate": "Nach $t(entity.playlist_other) suchen oder Namen eingeben, um eine neue zu erstellen"
|
||||
"input_playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"create": "$t(entity.playlist, {\"count\": 1}) {{playlist}} erstellen",
|
||||
"searchOrCreate": "Nach $t(entity.playlist, {\"count\": 2}) suchen oder Namen eingeben, um eine neue zu erstellen"
|
||||
},
|
||||
"updateServer": {
|
||||
"title": "Server aktualisieren",
|
||||
@@ -269,22 +279,22 @@
|
||||
"resetToDefault": "auf Standard zurücksetzen"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"title": "Bearbeite $t(entity.playlist_one)",
|
||||
"success": "$t(entity.playlist_one) erfolgreich aktualisiert",
|
||||
"title": "Bearbeite $t(entity.playlist, {\"count\": 1})",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) erfolgreich aktualisiert",
|
||||
"publicJellyfinNote": "Jellyfin legt aus irgendwelchen Gründen nicht offen ob eine Playlist öffentlich ist oder nicht. Wenn du möchtest, dass sie öffentlich bleibt, wähle bitte diese Option aus",
|
||||
"editNote": "Manuelles Bearbeiten wird für große Wiedergabelisten nicht empfohlen. Bist Du sicher, dass Du die aktuelle Wiedergabeliste unter dem Risiko von Datenverlust überschrieben möchtest?"
|
||||
},
|
||||
"lyricSearch": {
|
||||
"title": "Songtext Suche",
|
||||
"input_name": "$t(common.name)",
|
||||
"input_artist": "$t(entity.artist_one)"
|
||||
"input_artist": "$t(entity.artist, {\"count\": 1})"
|
||||
},
|
||||
"shareItem": {
|
||||
"description": "Beschreibung",
|
||||
"setExpiration": "Ablaufdatum setzen",
|
||||
"expireInvalid": "Ablaufdatum muss in der Zukunft liegen",
|
||||
"allowDownloading": "Herunterladen zulassen",
|
||||
"success": "Link in die Zwischenablage kopiert (oder hier klicken um zu öffnen)",
|
||||
"success": "Link in die Zwischenablage kopiert (oder hier klicken, um zu öffnen)",
|
||||
"createFailed": "fehler beim Teilen (Ist Teilen aktiviert?)"
|
||||
},
|
||||
"privateMode": {
|
||||
@@ -293,19 +303,32 @@
|
||||
"title": "Privatmodus"
|
||||
},
|
||||
"largeFetchConfirmation": {
|
||||
"title": "Elemente der Warteschlange hinzufügen",
|
||||
"title": "Elemente der Wiedergabeliste hinzufügen",
|
||||
"description": "Diese Aktion fügt alle Elemente in der aktuell gefilterten Ansicht hinzu"
|
||||
},
|
||||
"shuffleAll": {
|
||||
"title": "Zufallswiedergabe",
|
||||
"input_genre": "$t(entity.genre_one)",
|
||||
"input_genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"input_limit": "Wie viele Songs?",
|
||||
"input_minYear": "ab Jahr",
|
||||
"input_maxYear": "bis Jahr",
|
||||
"input_played_optionAll": "alle Tracks",
|
||||
"input_played_optionUnplayed": "nur ungespielte Tracks",
|
||||
"input_played_optionUnplayed": "nur nicht gespielte Tracks",
|
||||
"input_played_optionPlayed": "nur gespielte Tracks",
|
||||
"input_played": "Wiedergabefilter"
|
||||
},
|
||||
"saveQueue": {
|
||||
"success": "Wiedergabeliste auf Server gespeichert"
|
||||
},
|
||||
"createRadioStation": {
|
||||
"success": "Radiosender erfolgreich erstellt",
|
||||
"title": "Radiosender erstellen",
|
||||
"input_homepageUrl": "Homepage URL",
|
||||
"input_name": "Name",
|
||||
"input_streamUrl": "Stream URL"
|
||||
},
|
||||
"lyricsExport": {
|
||||
"input_offset": "$t(setting.lyricOffset)"
|
||||
}
|
||||
},
|
||||
"entity": {
|
||||
@@ -339,11 +362,15 @@
|
||||
"genreWithCount_other": "{{count}} Genres",
|
||||
"trackWithCount_one": "{{count}} Track",
|
||||
"trackWithCount_other": "{{count}} Tracks",
|
||||
"smartPlaylist": "Intelligente $t(entity.playlist_one)",
|
||||
"smartPlaylist": "Intelligente $t(entity.playlist, {\"count\": 1})",
|
||||
"play_one": "{{count}} Wiedergabe",
|
||||
"play_other": "{{count}} Wiedergaben",
|
||||
"song_one": "Lied",
|
||||
"song_other": "Lieder"
|
||||
"song_other": "Lieder",
|
||||
"radioStation_one": "Radiosender",
|
||||
"radioStation_other": "Radiosender",
|
||||
"radioStationWithCount_one": "{{count}} Radiosender",
|
||||
"radioStationWithCount_other": "{{count}} Radiosender"
|
||||
},
|
||||
"table": {
|
||||
"config": {
|
||||
@@ -359,7 +386,17 @@
|
||||
"displayType": "Anzeigestil",
|
||||
"autoFitColumns": "automatisch Spalten einpassen",
|
||||
"size_default": "Standard",
|
||||
"followCurrentSong": "aktuellem Titel folgen"
|
||||
"followCurrentSong": "aktuellem Titel folgen",
|
||||
"advancedSettings": "erweiterte Einstellungen",
|
||||
"autosize": "automatische Größe",
|
||||
"alignLeft": "linksbündig",
|
||||
"alignCenter": "mittig",
|
||||
"alignRight": "rechtsbündig",
|
||||
"size_compact": "kompakt",
|
||||
"size_large": "groß",
|
||||
"pagination": "Seitenzahlen",
|
||||
"pagination_itemsPerPage": "Elemente pro Seite",
|
||||
"pagination_infinite": "unendlich"
|
||||
},
|
||||
"label": {
|
||||
"dateAdded": "Hinzugefügt am",
|
||||
@@ -368,12 +405,12 @@
|
||||
"trackNumber": "Tracknummer",
|
||||
"biography": "$t(common.biography)",
|
||||
"bitrate": "$t(common.bitrate)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"favorite": "$t(common.favorite)",
|
||||
"actions": "$t(common.action_other)",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"album": "$t(entity.album_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"size": "$t(common.size)",
|
||||
"bpm": "$t(common.bpm)",
|
||||
"titleCombined": "$t(common.title) (kombiniert)",
|
||||
@@ -387,7 +424,14 @@
|
||||
"title": "$t(common.title)",
|
||||
"year": "$t(common.year)",
|
||||
"discNumber": "disk-Nummer",
|
||||
"playCount": "Wiedergaben"
|
||||
"playCount": "Wiedergaben",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2})",
|
||||
"bitDepth": "$t(common.bitDepth)",
|
||||
"codec": "$t(common.codec)",
|
||||
"image": "Bild",
|
||||
"sampleRate": "$t(common.sampleRate)",
|
||||
"songCount": "$t(entity.track, {\"count\": 2})",
|
||||
"genreBadge": "$t(entity.genre, {\"count\": 1}) (Abzeichen)"
|
||||
}
|
||||
},
|
||||
"column": {
|
||||
@@ -403,17 +447,21 @@
|
||||
"favorite": "Favorit",
|
||||
"lastPlayed": "zuletzt gespielt",
|
||||
"rating": "Bewertung",
|
||||
"albumCount": "$t(entity.album_other)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2})",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"comment": "Kommentar",
|
||||
"dateAdded": "hinzugefügt am",
|
||||
"playCount": "Abgespielt",
|
||||
"discNumber": "Disk",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"songCount": "$t(entity.track, {\"count\": 2})",
|
||||
"trackNumber": "titel",
|
||||
"size": "$t(common.size)"
|
||||
"size": "$t(common.size)",
|
||||
"bitDepth": "$t(common.bitDepth)",
|
||||
"codec": "$t(common.codec)",
|
||||
"sampleRate": "$t(common.sampleRate)",
|
||||
"owner": "Besitzer"
|
||||
}
|
||||
},
|
||||
"page": {
|
||||
@@ -449,7 +497,7 @@
|
||||
"openBrowserDevtools": "Browser-Entwicklungswerkzeuge öffnen",
|
||||
"goBack": "Gehe zurück",
|
||||
"goForward": "Gehe vorwärts",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"quit": "$t(common.quit)",
|
||||
"privateModeOff": "Privatmodus deaktivieren",
|
||||
"privateModeOn": "Privatmodus aktivieren",
|
||||
@@ -465,10 +513,10 @@
|
||||
"recentlyPlayed": "Kürzlich gespielt",
|
||||
"title": "$t(common.home)",
|
||||
"recentlyReleased": "kürzlich veröffentlicht",
|
||||
"genres": "$t(entity.genre_other)"
|
||||
"genres": "$t(entity.genre, {\"count\": 2})"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "mehr von diesem $t(entity.artist_one)",
|
||||
"moreFromArtist": "mehr von diesem $t(entity.artist, {\"count\": 1})",
|
||||
"moreFromGeneric": "Mehr von {{item}}",
|
||||
"released": "erschienen"
|
||||
},
|
||||
@@ -503,26 +551,27 @@
|
||||
"moveToNext": "$t(action.moveToNext)",
|
||||
"shareItem": "teilen",
|
||||
"showDetails": "Informationen",
|
||||
"goToAlbum": "zu $t(entity.album_one) gehen",
|
||||
"goToAlbumArtist": "zu $t(entity.albumArtist_one) gehen",
|
||||
"goToAlbum": "zu $t(entity.album, {\"count\": 1}) gehen",
|
||||
"goToAlbumArtist": "zu $t(entity.albumArtist, {\"count\": 1}) gehen",
|
||||
"moveItems": "$t(action.moveItems)",
|
||||
"goTo": "Gehe zu"
|
||||
},
|
||||
"sidebar": {
|
||||
"nowPlaying": "läuft gerade",
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"search": "$t(common.search)",
|
||||
"tracks": "$t(entity.track_other)",
|
||||
"albums": "$t(entity.album_other)",
|
||||
"genres": "$t(entity.genre_other)",
|
||||
"folders": "$t(entity.folder_other)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"tracks": "$t(entity.track, {\"count\": 2})",
|
||||
"albums": "$t(entity.album, {\"count\": 2})",
|
||||
"genres": "$t(entity.genre, {\"count\": 2})",
|
||||
"folders": "$t(entity.folder, {\"count\": 2})",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"home": "$t(common.home)",
|
||||
"artists": "$t(entity.artist_other)",
|
||||
"albumArtists": "$t(entity.albumArtist_other)",
|
||||
"shared": "$t(entity.playlist_other) geteilt",
|
||||
"artists": "$t(entity.artist, {\"count\": 2})",
|
||||
"albumArtists": "$t(entity.albumArtist, {\"count\": 2})",
|
||||
"shared": "$t(entity.playlist, {\"count\": 2}) geteilt",
|
||||
"myLibrary": "meine bibliothek",
|
||||
"favorites": "$t(entity.favorite_other)"
|
||||
"favorites": "$t(entity.favorite, {\"count\": 2})",
|
||||
"radio": "$t(entity.radioStation, {\"count\": 2})"
|
||||
},
|
||||
"setting": {
|
||||
"playbackTab": "Wiedergabe",
|
||||
@@ -538,7 +587,7 @@
|
||||
"application": "App",
|
||||
"queryBuilder": "Abfrage-Editor",
|
||||
"theme": "Erscheinungsbild",
|
||||
"controls": "Steuerung",
|
||||
"controls": "Steuerelemente",
|
||||
"sidebar": "Seitenleiste",
|
||||
"scrobble": "Scrobbeln",
|
||||
"audio": "Audio",
|
||||
@@ -549,36 +598,38 @@
|
||||
"remote": "Fernsteuerung"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
"title": "$t(entity.albumArtist, {\"count\": 2})"
|
||||
},
|
||||
"genreList": {
|
||||
"title": "$t(entity.genre_other)",
|
||||
"showTracks": "$t(entity.genre_one) $t(entity.track_other) anzeigen",
|
||||
"showAlbums": "$t(entity.genre_one) $t(entity.album_other) anzeigen"
|
||||
"title": "$t(entity.genre, {\"count\": 2})",
|
||||
"showTracks": "$t(entity.genre, {\"count\": 1}) $t(entity.track, {\"count\": 2}) anzeigen",
|
||||
"showAlbums": "$t(entity.genre, {\"count\": 1}) $t(entity.album, {\"count\": 2}) anzeigen"
|
||||
},
|
||||
"trackList": {
|
||||
"title": "$t(entity.track_other)",
|
||||
"title": "$t(entity.track, {\"count\": 2})",
|
||||
"artistTracks": "Tracks von {{artist}}",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track_other)"
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track, {\"count\": 2})"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist_other)"
|
||||
"title": "$t(entity.playlist, {\"count\": 2})"
|
||||
},
|
||||
"albumList": {
|
||||
"title": "$t(entity.album_other)",
|
||||
"title": "$t(entity.album, {\"count\": 2})",
|
||||
"artistAlbums": "Alben von {{artist}}",
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)"
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album, {\"count\": 2})"
|
||||
},
|
||||
"albumArtistDetail": {
|
||||
"about": "Über {{artist}}",
|
||||
"appearsOn": "erscheint auf",
|
||||
"recentReleases": "Kürzliche Veröffentlichungen",
|
||||
"viewDiscography": "Diskographie ansehen",
|
||||
"viewAllTracks": "Alle $t(entity.track_other) ansehen",
|
||||
"viewAllTracks": "Alle $t(entity.track, {\"count\": 2}) ansehen",
|
||||
"topSongsFrom": "Toplieder von {{title}}",
|
||||
"viewAll": "Alles ansehen",
|
||||
"topSongs": "Toplieder",
|
||||
"relatedArtists": "ähnliche $t(entity.artist_other)"
|
||||
"relatedArtists": "ähnliche $t(entity.artist, {\"count\": 2})",
|
||||
"groupingTypeAll": "alle Veröffentlichungsformate",
|
||||
"groupingTypePrimary": "primäre Veröffentlichungsformate"
|
||||
},
|
||||
"manageServers": {
|
||||
"title": "Servers verwalten",
|
||||
@@ -594,21 +645,24 @@
|
||||
"openFile": "Track im Dateiexplorer anzeigen"
|
||||
},
|
||||
"favorites": {
|
||||
"title": "$t(entity.favorite_other)"
|
||||
"title": "$t(entity.favorite, {\"count\": 2})"
|
||||
},
|
||||
"folderList": {
|
||||
"title": "$t(entity.folder_other)"
|
||||
"title": "$t(entity.folder, {\"count\": 2})"
|
||||
},
|
||||
"playlist": {
|
||||
"reorder": "Neuanordnung nur bei Sortierung nach ID möglich"
|
||||
},
|
||||
"radioList": {
|
||||
"title": "Radiosender"
|
||||
}
|
||||
},
|
||||
"player": {
|
||||
"next": "nächster",
|
||||
"addNext": "Als Nächstes spielen",
|
||||
"addNext": "als Nächstes",
|
||||
"play": "Abspielen",
|
||||
"muted": "stummgeschaltet",
|
||||
"addLast": "Als Letztes spielen",
|
||||
"addLast": "als Letztes",
|
||||
"mute": "Stumm",
|
||||
"playRandom": "Zufällige Wiedergabe",
|
||||
"previous": "Vorheriger",
|
||||
@@ -617,7 +671,7 @@
|
||||
"playbackFetchInProgress": "lieder werden geladen…",
|
||||
"playbackSpeed": "Wiedergabegeschwindigkeit",
|
||||
"playbackFetchCancel": "Das dauert eine Weile. Schließen Sie die Benachrichtigung, um den Vorgang abzubrechen",
|
||||
"queue_clear": "Bereinige Warteschlange",
|
||||
"queue_clear": "Wiedergabeliste bereinigen",
|
||||
"repeat_all": "Alle wiederholen",
|
||||
"repeat": "Wiederholen",
|
||||
"queue_remove": "Ausgewählte entfernen",
|
||||
@@ -634,13 +688,12 @@
|
||||
"skip_forward": "vorspulen",
|
||||
"skip": "Überspringen",
|
||||
"playSimilarSongs": "Ähnliche Lieder abspielen",
|
||||
"viewQueue": "Warteschlange anzeigen",
|
||||
"addLastShuffled": "Als Letztes spielen (zufällige Wiedergabe)",
|
||||
"addNextShuffled": "Als Nächstes spielen (zufällige Wiedergabe)",
|
||||
"queueType_default": "Standard",
|
||||
"queueType_priority": "Priorität",
|
||||
"viewQueue": "Wiedergabeliste anzeigen",
|
||||
"addLastShuffled": "als Letztes (zufällige Wiedergabe)",
|
||||
"addNextShuffled": "als Nächstes (zufällige Wiedergabe)",
|
||||
"holdToShuffle": "Halten für Zufallswiedergabe",
|
||||
"queueType": "Warteschlangentyp"
|
||||
"restoreQueueFromServer": "Wiedergabeliste von Server wiederherstellen",
|
||||
"saveQueueToServer": "Wiedergabeliste auf Server speichern"
|
||||
},
|
||||
"setting": {
|
||||
"audioDevice_description": "wählen Sie das Audiogerät aus, das für die Wiedergabe verwendet werden soll (nur Webplayer)",
|
||||
@@ -704,7 +757,7 @@
|
||||
"gaplessAudio_description": "Legt die lückenlose Audioeinstellung für MPV fest",
|
||||
"remoteUsername_description": "Legt den Benutzernamen für den Fernsteuerungsserver fest. Wenn sowohl Benutzername als auch Passwort leer sind, wird die Authentifizierung deaktiviert",
|
||||
"hotkey_favoritePreviousSong": "Favorit $t(common.previousSong)",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album_one)",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album, {\"count\": 1})",
|
||||
"lyricOffset": "Zeitversatz des Songtextes (ms)",
|
||||
"themeDark_description": "Legt das Erscheinungsbild für den dunklen Modus fest",
|
||||
"remotePassword": "Passwort des Fernsteuerungsservers",
|
||||
@@ -712,11 +765,11 @@
|
||||
"language_description": "Legt die Sprache für die Anwendung fest $t(common.restartRequired)",
|
||||
"playbackStyle_optionCrossFade": "Überblendung",
|
||||
"hotkey_rate3": "Bewertung 3 Sterne",
|
||||
"replayGainMode_optionTrack": "$t(entity.track_one)",
|
||||
"replayGainMode_optionTrack": "$t(entity.track, {\"count\": 1})",
|
||||
"themeLight_description": "Legt das Erscheinungsbild für den hellen Modus fest",
|
||||
"hotkey_toggleFullScreenPlayer": "Vollbildmodus umschalten",
|
||||
"hotkey_localSearch": "Suche auf Seite",
|
||||
"hotkey_toggleQueue": "Warteschlange umschalten",
|
||||
"hotkey_toggleQueue": "Wiedergabeliste umschalten",
|
||||
"remotePassword_description": "Legt das Passwort für den Fernsteuerungsserver fest. Diese Anmeldeinformationen werden standardmäßig unsicher übertragen, daher sollten Sie ein Passwort verwenden, das Ihnen egal ist",
|
||||
"hotkey_rate5": "Bewertung 5 Sterne",
|
||||
"hotkey_playbackPrevious": "Vorheriger Track",
|
||||
@@ -727,18 +780,19 @@
|
||||
"playbackStyle_description": "Wählen Sie den Wiedergabestil aus, der für den Audioplayer verwendet werden soll",
|
||||
"mpvExecutablePath": "Pfad der ausführbaren MPV-Datei",
|
||||
"hotkey_rate2": "Bewertung 2 Sterne",
|
||||
"playButtonBehavior_description": "Legt das Standardverhalten des Wiedergabe-Buttons fest, wenn Songs zur Warteschlange hinzugefügt werden",
|
||||
"playButtonBehavior_description": "legt das Standardverhalten des Wiedergabe-Buttons fest, wenn Lieder zur Wiedergabeliste hinzugefügt werden",
|
||||
"minimumScrobblePercentage_description": "die Mindestdauer in Prozent, welche das Lied gespielt werden muss, bevor dieses gescrobbelt wird",
|
||||
"hotkey_rate4": "Bewertung 4 Sterne",
|
||||
"showSkipButton_description": "Ein- oder Ausblenden der Überspringen-Schaltflächen in der Player-Leiste",
|
||||
"savePlayQueue": "Wiedergabe-Warteschlange speichern",
|
||||
"savePlayQueue": "Wiedergabeliste speichern",
|
||||
"minimumScrobbleSeconds_description": "die Mindestdauer in Sekunden, welche das Lied gespielt werden muss, bevor dieses gescrobbelt wird",
|
||||
"skipPlaylistPage_description": "Gehe beim Navigieren zu einer Wiedergabeliste zu deren Titelseite und nicht zur Standardseite",
|
||||
"fontType_description": "Die integrierte Schriftart wählt eine der von feishin bereitgestellten Schriftarten aus. Mit der Systemschriftart können Sie jede von Ihrem Betriebssystem bereitgestellte Schriftart auswählen. Benutzerdefiniert erlaubt es eine eigene Schriftart bereitzustellen",
|
||||
"playButtonBehavior": "Verhalten der Wiedergabetaste",
|
||||
"volumeWheelStep": "Lautstärkeänderung mit Mausrad",
|
||||
"sidebarPlaylistList_description": "Ein- oder Ausblenden der Playlisten-Liste in der Seitenleiste",
|
||||
"sidePlayQueueStyle_description": "Legt den Stil der Wiedergabewarteliste in der Seitenleiste fest",
|
||||
"sidebarPlaylistSorting_description": "sortiere Playlists in der Seitenleiste per Drag & Drop anstelle der standardmäßigen Serverreihenfolge",
|
||||
"sidePlayQueueStyle_description": "legt den Stil der Wiedergabeliste in der Seitenleiste fest",
|
||||
"replayGainMode": "{{ReplayGain}} Modus",
|
||||
"playbackStyle_optionNormal": "Normal",
|
||||
"windowBarStyle": "Fensterleistenstil",
|
||||
@@ -762,6 +816,7 @@
|
||||
"hotkey_browserBack": "Browser zurück",
|
||||
"showSkipButton": "Schaltflächen zum Überspringen anzeigen",
|
||||
"sidebarPlaylistList": "Seitenleiste Playlisten-Liste",
|
||||
"sidebarPlaylistSorting": "Playlist-Sortierung in der Seitenleiste",
|
||||
"minimizeToTray": "Zur Taskleiste minimieren",
|
||||
"skipPlaylistPage": "Playlisten-Seite überspringen",
|
||||
"themeDark": "Erscheinungsbild (dunkel)",
|
||||
@@ -769,7 +824,7 @@
|
||||
"gaplessAudio_optionWeak": "schwach (empfohlen)",
|
||||
"minimumScrobbleSeconds": "Minimum Scrobble-Dauer (Sekunden)",
|
||||
"hotkey_playbackStop": "Stoppen",
|
||||
"savePlayQueue_description": "Speichert Wiedergabewarteschlange, wenn die Anwendung geschlossen wird, und stellt sie wieder her, wenn die Anwendung geöffnet wird",
|
||||
"savePlayQueue_description": "speichert die Wiedergabeliste beim Schließen der Anwendung, und stellt diese wieder her, wenn die Anwendung geöffnet wird",
|
||||
"useSystemTheme": "Nach Erscheinungsbild des Systems richten",
|
||||
"enableRemote_description": "Aktiviert den Server für die Fernsteuerung, damit andere Geräte die Anwendung steuern können",
|
||||
"fontType_optionSystem": "System Schriftart",
|
||||
@@ -795,33 +850,33 @@
|
||||
"clearCache": "Browser-Zwischenspeicher löschen",
|
||||
"clearQueryCache": "feishins Zwischenspeicher leeren",
|
||||
"clearCache_description": "Hartes Zurücksetzen. Neben feishins Zwischenspeicher wird auch der des Browsers gelöscht (Bilder und andere Daten). Zugangsinformationen und Einstellungen werden behalten",
|
||||
"sidePlayQueueStyle": "Wiedergabelistenstil in der Seitenleiste",
|
||||
"sidePlayQueueStyle": "Stil der Wiedergabeliste in der Seitenleiste",
|
||||
"zoom_description": "Setzt den Zoom (in %) für das Programm",
|
||||
"zoom": "Zoom",
|
||||
"albumBackground": "Album Hintergrund",
|
||||
"customCss": "Benutzerdefiniert css",
|
||||
"customCss": "Benutzerdefiniertes CSS",
|
||||
"homeConfiguration": "Startseite Konfiguration",
|
||||
"lastfmApiKey": "{{lastfm}} API-Schlüssel",
|
||||
"lastfmApiKey_description": "Der API-Schlüssel für {{lastfm}}. wird für benötigt",
|
||||
"lastfmApiKey_description": "Der API-Schlüssel für {{lastfm}}. wird für Albumcover 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",
|
||||
"customCssEnable": "benutzerdefiniertes CSS aktivieren",
|
||||
"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",
|
||||
"customCssEnable_description": "erlaubt das Hinzufügen von benutzerdefiniertem CSS",
|
||||
"artistBackground": "Künstler Hintergrundbild",
|
||||
"artistBackground_description": "fügt ein Hintergrundbild für die Künstlerseite hinzu",
|
||||
"artistConfiguration": "künstler Albumseite Konfiguration",
|
||||
"buttonSize": "spielerleisten-Knopfgröße",
|
||||
"buttonSize_description": "die Größe der Spieler-Knöpfe",
|
||||
"hotkey_togglePreviousSongFavorite": "wähle $t(common.previousSong) als Favorit aus",
|
||||
"replayGainFallback": "{{ReplayGain}} Rückgriff",
|
||||
"replayGainFallback": "{{ReplayGain}} Alternative",
|
||||
"replayGainClipping": "{{ReplayGain}} Clipping",
|
||||
"exportImportSettings_control_description": "Einstellungen mit JSON exportieren und importieren",
|
||||
"exportImportSettings_control_exportText": "Einstellungen exportieren",
|
||||
@@ -833,9 +888,7 @@
|
||||
"exportImportSettings_notValidJSON": "Die Datei ist kein gültiges JSON",
|
||||
"exportImportSettings_offendingKeyError": "\"{{offendingKey}}\" ist falsch - {{reason}}",
|
||||
"language": "Sprache",
|
||||
"playerAlbumArtResolution": "Auflösung des Albumcovers",
|
||||
"imageAspectRatio": "Original Seitenverhältnis des Albumcovers verwenden",
|
||||
"playerAlbumArtResolution_description": "die Auflösung des Albumcovers im großen Player. Eine höhere Auflösung sorgt für ein schärferes Bild, kann jedoch das Laden verlangsamen. Standardwert: 0 (automatische Berechnung)",
|
||||
"analyticsDisable": "Keine nutzungsbasierte Analyse",
|
||||
"analyticsDisable_description": "Anonymisierte Nutzungsdaten werden an den Entwickler geschickt, um die Anwendung zu verbessern",
|
||||
"logLevel_optionDebug": "Debug",
|
||||
@@ -844,11 +897,11 @@
|
||||
"logLevel_optionError": "Fehler",
|
||||
"logLevel_optionInfo": "Info",
|
||||
"logLevel_optionWarn": "Warnung",
|
||||
"autoDJ_description": "Füge automatisch ähnliche Lieder der Warteschlange hinzu",
|
||||
"autoDJ_description": "füge automatisch ähnliche Lieder der Wiedergabeliste hinzu",
|
||||
"autoDJ": "Auto DJ",
|
||||
"autoDJ_itemCount": "Anzahl",
|
||||
"autoDJ_itemCount_description": "Die Anzahl der Lieder, die bei aktiviertem Auto DJ zur Warteschlange hinzugefügt werden sollen",
|
||||
"autoDJ_timing_description": "Die Anzahl der Lieder, die sich noch in der Warteschlange befinden, bevor Auto DJ ausgelöst wird",
|
||||
"autoDJ_itemCount_description": "die Anzahl der Lieder, die bei aktiviertem Auto DJ zur Wiedergabeliste hinzugefügt werden sollen",
|
||||
"autoDJ_timing_description": "die Anzahl der Lieder, die sich noch in der Wiedergabeliste befinden, bevor Auto DJ ausgelöst wird",
|
||||
"autoDJ_timing": "Timing",
|
||||
"discordDisplayType": "{{discord}} Presence Darstellungsart",
|
||||
"discordLinkType_mbz_lastfm": "{{musicbrainz}} mit {{lastfm}} als Ersatz",
|
||||
@@ -867,11 +920,11 @@
|
||||
"neteaseTranslation": "NetEase Übersetzungen aktivieren",
|
||||
"notify": "Benachrichtigungen aktivieren",
|
||||
"notify_description": "Zeigt Benachrichtigungen beim Titelwechsel",
|
||||
"playerFilters": "Lieder in der Warteschlange filtern",
|
||||
"playerFilters": "Lieder der Wiedergabeliste filtern",
|
||||
"playButtonBehavior_optionPlayShuffled": "$t(player.shuffle)",
|
||||
"volumeWidth_description": "Die Breite des Lautstärkereglers",
|
||||
"volumeWidth": "Lautstärkereglerbreite",
|
||||
"webAudio_description": "Web-Audio verwenden. Dies ermöglicht erweiterte Funktionen wie ReplayGain. Deaktiviere dies, wenn bei der Wiedergabe Probleme auftreten",
|
||||
"webAudio_description": "Web-Audio verwenden. Dies ermöglicht erweiterte Funktionen wie ReplayGain. Deaktiviere die Option, falls bei der Wiedergabe Probleme auftreten",
|
||||
"webAudio": "Web-Audio verwenden",
|
||||
"trayEnabled": "Info-Symbol anzeigen",
|
||||
"transcode": "Transkodierung aktivieren",
|
||||
@@ -889,7 +942,7 @@
|
||||
"artistConfiguration_description": "Legt fest, welche Elemente auf der Albumkünstlerseite angezeigt werden und in welcher Reihenfolge",
|
||||
"contextMenu_description": "Legt die Einträge fest, die im Rechtsklick-Menü angezeigt werden sollen. Abgewählte Einträge werden ausgeblendet",
|
||||
"crossfadeStyle": "Art der Überblende",
|
||||
"customCss_description": "Benutzerdefinierter CSS-Inhalt. Hinweis: content und entfernte URLs sind unzulässig. Siehe Vorschau unten. Aufgrund von Bereinigung werden womöglich nicht gesetzte Felder angezeigt",
|
||||
"customCss_description": "Benutzerdefinierter CSS-Inhalt. Hinweis: Inhalte und Remote-URLs sind nicht zulässige Eigenschaften. Unten siehst du eine Vorschau deines Inhalts. Aufgrund von Bereinigung werden womöglich zusätzliche, nicht von dir definierte Felder angezeigt",
|
||||
"customCssNotice": "Warnung: Obwohl eine gewisse Bereinigung erfolgt (url() und content: sind nicht zulässig), kann die Verwendung von benutzerdefiniertem CSS dennoch Risiken mit sich bringen, da dadurch die Benutzeroberfläche verändert wird",
|
||||
"releaseChannel_optionBeta": "Beta",
|
||||
"releaseChannel_optionLatest": "Stabil",
|
||||
@@ -903,11 +956,25 @@
|
||||
"exportImportSettings_destructiveWarning": "Das Importieren von Einstellungen ist irreversibel. Bitte lies die Hinweise oben sorgfältig durch, bevor du auf \"Importieren\" klickst!",
|
||||
"followCurrentSong": "aktuellem Titel folgen",
|
||||
"followCurrentSong_description": "die Wiedergabeliste scrollt automatisch zum aktuellen Titel",
|
||||
"playerFilters_description": "verhindert, dass Titel anhand der folgenden Kriterien zur Warteschlange hinzugefügt werden",
|
||||
"playerFilters_description": "verhindert, dass Titel anhand der folgenden Kriterien zur Wiedergabeliste hinzugefügt werden",
|
||||
"preferLocalLyrics_description": "lokale Songtexte gegenüber externen Quellen bevorzugen (sofern verfügbar)",
|
||||
"preferLocalLyrics": "Priorisiere lokale Songtexte",
|
||||
"showLyricsInSidebar_description": "ein Bereich, in dem Songtexte angezeigt werden, wird der Wiedergabeliste hinzugefügt",
|
||||
"showLyricsInSidebar": "zeige Songtexte in der Player-Seitenleiste"
|
||||
"showLyricsInSidebar": "zeige Songtexte in der Player-Seitenleiste",
|
||||
"homeFeature_description": "steuert, ob das große Featured-Karussell auf der Startseite angezeigt wird",
|
||||
"homeFeature": "Feature-Karussell",
|
||||
"playerbarWaveformAlign_optionTop": "Oben",
|
||||
"playerbarWaveformAlign_optionCenter": "Mitte",
|
||||
"playerbarWaveformAlign_optionBottom": "Unten",
|
||||
"translationApiKey_description": "API-Schlüssel für Übersetzungen (nur globale Service-Endpunkte)",
|
||||
"translationApiKey": "API-Schlüssel für Übersetzungen",
|
||||
"translationApiProvider_description": "API-Anbieter für Übersetzungen",
|
||||
"translationApiProvider": "API-Anbieter für Übersetzungen",
|
||||
"hotkey_navigateHome": "zurück zur Startseite",
|
||||
"translationTargetLanguage_description": "die gewünschte Sprache der Übersetzung",
|
||||
"translationTargetLanguage": "Zielsprache der Übersetzung",
|
||||
"queryBuilderCustomFields": "benutzerdefiniertes Feld",
|
||||
"queryBuilderCustomFields_inputTag": "Tag"
|
||||
},
|
||||
"dragDropZone": {
|
||||
"error_oneFileOnly": "Bitte wähle nur 1 Datei",
|
||||
@@ -941,7 +1008,7 @@
|
||||
},
|
||||
"releaseType": {
|
||||
"primary": {
|
||||
"album": "$t(entity.album_one)",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"broadcast": "Broadcast",
|
||||
"ep": "EP",
|
||||
"other": "andere",
|
||||
@@ -961,5 +1028,11 @@
|
||||
"soundtrack": "Soundtrack",
|
||||
"spokenWord": "Gesprochenes Wort"
|
||||
}
|
||||
},
|
||||
"datetime": {
|
||||
"minuteShort": "Min",
|
||||
"secondShort": "Sek",
|
||||
"hourShort": "Std",
|
||||
"dayShort": "Tag"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,15 +1,18 @@
|
||||
{
|
||||
"action": {
|
||||
"addToFavorites": "add to $t(entity.favorite_other)",
|
||||
"addToPlaylist": "add to $t(entity.playlist_one)",
|
||||
"addToFavorites": "add to $t(entity.favorite, {\"count\": 2})",
|
||||
"addToPlaylist": "add to $t(entity.playlist, {\"count\": 1})",
|
||||
"addOrRemoveFromSelection": "add or remove from selection",
|
||||
"selectRangeOfItems": "select a range of items",
|
||||
"clearQueue": "clear queue",
|
||||
"createPlaylist": "create $t(entity.playlist_one)",
|
||||
"createRadioStation": "create $t(entity.radioStation_one)",
|
||||
"deletePlaylist": "delete $t(entity.playlist_one)",
|
||||
"deleteRadioStation": "delete $t(entity.radioStation_one)",
|
||||
"createPlaylist": "create $t(entity.playlist, {\"count\": 1})",
|
||||
"createRadioStation": "create $t(entity.radioStation, {\"count\": 1})",
|
||||
"deletePlaylist": "delete $t(entity.playlist, {\"count\": 1})",
|
||||
"deleteRadioStation": "delete $t(entity.radioStation, {\"count\": 1})",
|
||||
"selectAll": "select all",
|
||||
"deselectAll": "deselect all",
|
||||
"downloadStarted": "started download of {{count}} items",
|
||||
"editPlaylist": "edit $t(entity.playlist_one)",
|
||||
"editPlaylist": "edit $t(entity.playlist, {\"count\": 1})",
|
||||
"goToPage": "go to page",
|
||||
"moveToNext": "move to next",
|
||||
"moveToBottom": "move to bottom",
|
||||
@@ -23,12 +26,12 @@
|
||||
"shuffleAll": "shuffle all",
|
||||
"shuffleSelected": "shuffle selected",
|
||||
"refresh": "$t(common.refresh)",
|
||||
"removeFromFavorites": "remove from $t(entity.favorite_other)",
|
||||
"removeFromPlaylist": "remove from $t(entity.playlist_one)",
|
||||
"removeFromFavorites": "remove from $t(entity.favorite, {\"count\": 2})",
|
||||
"removeFromPlaylist": "remove from $t(entity.playlist, {\"count\": 1})",
|
||||
"removeFromQueue": "remove from queue",
|
||||
"setRating": "set rating",
|
||||
"toggleSmartPlaylistEditor": "toggle $t(entity.smartPlaylist) editor",
|
||||
"viewPlaylists": "view $t(entity.playlist_other)",
|
||||
"viewPlaylists": "view $t(entity.playlist, {\"count\": 2})",
|
||||
"viewMore": "view more",
|
||||
"openApplicationDirectory": "open application directory",
|
||||
"openIn": {
|
||||
@@ -37,6 +40,7 @@
|
||||
}
|
||||
},
|
||||
"common": {
|
||||
"countSelected": "{{count}} selected",
|
||||
"explicitStatus": "explicit status",
|
||||
"action_one": "action",
|
||||
"action_other": "actions",
|
||||
@@ -65,7 +69,7 @@
|
||||
"configure": "configure",
|
||||
"confirm": "confirm",
|
||||
"create": "create",
|
||||
"currentSong": "current $t(entity.track_one)",
|
||||
"currentSong": "current $t(entity.track, {\"count\": 1})",
|
||||
"decrease": "decrease",
|
||||
"delete": "delete",
|
||||
"descending": "descending",
|
||||
@@ -79,12 +83,15 @@
|
||||
"edit": "edit",
|
||||
"enable": "enable",
|
||||
"expand": "expand",
|
||||
"example": "example",
|
||||
"externalLinks": "external links",
|
||||
"faster": "faster",
|
||||
"favorite": "favorite",
|
||||
"filter_one": "filter",
|
||||
"filter_other": "filters",
|
||||
"filters": "filters",
|
||||
"filter_single": "single",
|
||||
"filter_multiple": "multi",
|
||||
"forceRestartRequired": "restart to apply changes… close the notification to restart",
|
||||
"forward": "forward",
|
||||
"gap": "gap",
|
||||
@@ -98,6 +105,7 @@
|
||||
"minimize": "minimize",
|
||||
"modified": "modified",
|
||||
"mbid": "MusicBrainz ID",
|
||||
"mood": "mood",
|
||||
"name": "name",
|
||||
"no": "no",
|
||||
"none": "none",
|
||||
@@ -109,16 +117,18 @@
|
||||
"path": "path",
|
||||
"playerMustBePaused": "player must be paused",
|
||||
"preview": "preview",
|
||||
"previousSong": "previous $t(entity.track_one)",
|
||||
"previousSong": "previous $t(entity.track, {\"count\": 1})",
|
||||
"private": "private",
|
||||
"public": "public",
|
||||
"quit": "quit",
|
||||
"random": "random",
|
||||
"rating": "rating",
|
||||
"retry": "retry",
|
||||
"recordLabel": "record label",
|
||||
"releaseType": "release type",
|
||||
"refresh": "refresh",
|
||||
"reload": "reload",
|
||||
"rename": "rename",
|
||||
"reset": "reset",
|
||||
"resetToDefault": "reset to default",
|
||||
"restartRequired": "restart required",
|
||||
@@ -128,7 +138,6 @@
|
||||
"saveAndReplace": "save and replace",
|
||||
"saveAs": "save as",
|
||||
"search": "search",
|
||||
"setting": "setting",
|
||||
"setting_one": "setting",
|
||||
"setting_other": "settings",
|
||||
"slower": "slower",
|
||||
@@ -185,7 +194,7 @@
|
||||
"play_other": "{{count}} plays",
|
||||
"playlistWithCount_one": "{{count}} playlist",
|
||||
"playlistWithCount_other": "{{count}} playlists",
|
||||
"smartPlaylist": "smart $t(entity.playlist_one)",
|
||||
"smartPlaylist": "smart $t(entity.playlist, {\"count\": 1})",
|
||||
"track_one": "track",
|
||||
"track_other": "tracks",
|
||||
"song_one": "song",
|
||||
@@ -208,6 +217,8 @@
|
||||
"mpvRequired": "MPV required",
|
||||
"multipleServerSaveQueueError": "the play queue has one or more songs which are not from the current server. this is not supported",
|
||||
"networkError": "a network error occurred",
|
||||
"noNetwork": "server unavailable",
|
||||
"noNetworkDescription": "couldn't connect to this server",
|
||||
"notificationDenied": "permissions for notifications were denied. this setting has no effect",
|
||||
"openError": "could not open file",
|
||||
"playbackError": "an error occurred when trying to play the media",
|
||||
@@ -223,14 +234,14 @@
|
||||
"settingsSyncError": "discrepancies were found between the settings in the renderer and the main process. restart the application to apply the changes"
|
||||
},
|
||||
"filter": {
|
||||
"album": "$t(entity.album_one)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"albumCount": "$t(entity.album_other) count",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2}) count",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"biography": "biography",
|
||||
"bitrate": "bitrate",
|
||||
"bpm": "bpm",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"channels": "$t(common.channel, {\"count\": 2})",
|
||||
"comment": "comment",
|
||||
"communityRating": "community rating",
|
||||
"criticRating": "critic rating",
|
||||
@@ -239,7 +250,7 @@
|
||||
"duration": "duration",
|
||||
"favorited": "favorited",
|
||||
"fromYear": "from year",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"id": "id",
|
||||
"isCompilation": "is compilation",
|
||||
"isFavorited": "is favorited",
|
||||
@@ -262,16 +273,17 @@
|
||||
"releaseYear": "release year",
|
||||
"search": "search",
|
||||
"songCount": "song count",
|
||||
"sortName": "sort name",
|
||||
"title": "title",
|
||||
"toYear": "to year",
|
||||
"trackNumber": "track",
|
||||
"explicitStatus": "$t(common.explicitStatus)"
|
||||
},
|
||||
"datetime": {
|
||||
"minuteShort": "min",
|
||||
"secondShort": "sec",
|
||||
"hourShort": "hr",
|
||||
"dayShort": "day"
|
||||
"minuteShort": "m",
|
||||
"secondShort": "s",
|
||||
"hourShort": "h",
|
||||
"dayShort": "d"
|
||||
},
|
||||
"filterOperator": {
|
||||
"after": "is after",
|
||||
@@ -304,6 +316,9 @@
|
||||
"input_password": "password",
|
||||
"input_preferInstantMix": "prefer instant mix",
|
||||
"input_preferInstantMixDescription": "only use instant mix to get similar songs. useful if you have plugins that modify this behavior",
|
||||
"input_preferRemoteUrl": "prefer public url",
|
||||
"input_remoteUrl": "public url",
|
||||
"input_remoteUrlPlaceholder": "optional: public url for external features",
|
||||
"input_savePassword": "save password",
|
||||
"input_url": "url",
|
||||
"input_username": "username",
|
||||
@@ -315,20 +330,20 @@
|
||||
"description": "This action will add all items in the current filtered view"
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"create": "create $t(entity.playlist_one) {{playlist}}",
|
||||
"input_playlists": "$t(entity.playlist_other)",
|
||||
"create": "create $t(entity.playlist, {\"count\": 1}) {{playlist}}",
|
||||
"input_playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"input_skipDuplicates": "skip duplicates",
|
||||
"searchOrCreate": "search $t(entity.playlist_other) or type to create a new one",
|
||||
"searchOrCreate": "search $t(entity.playlist, {\"count\": 2}) or type to create a new one",
|
||||
"success": "added $t(entity.trackWithCount, {\"count\": {{message}} }) to $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })",
|
||||
"title": "add to $t(entity.playlist_one)"
|
||||
"title": "add to $t(entity.playlist, {\"count\": 1})"
|
||||
},
|
||||
"createPlaylist": {
|
||||
"input_description": "$t(common.description)",
|
||||
"input_name": "$t(common.name)",
|
||||
"input_owner": "$t(common.owner)",
|
||||
"input_public": "public",
|
||||
"success": "$t(entity.playlist_one) created successfully",
|
||||
"title": "create $t(entity.playlist_one)"
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) created successfully",
|
||||
"title": "create $t(entity.playlist, {\"count\": 1})"
|
||||
},
|
||||
"createRadioStation": {
|
||||
"success": "radio station created successfully",
|
||||
@@ -338,18 +353,23 @@
|
||||
"input_streamUrl": "stream url"
|
||||
},
|
||||
"deletePlaylist": {
|
||||
"input_confirm": "type the name of the $t(entity.playlist_one) to confirm",
|
||||
"success": "$t(entity.playlist_one) deleted successfully",
|
||||
"title": "delete $t(entity.playlist_one)"
|
||||
"input_confirm": "type the name of the $t(entity.playlist, {\"count\": 1}) to confirm",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) deleted successfully",
|
||||
"title": "delete $t(entity.playlist, {\"count\": 1})"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"publicJellyfinNote": "Jellyfin for some reason does not expose whether a playlist is public or not. If you wish for this to remain public, please have the following input selected",
|
||||
"editNote": "manual edits are not recommended for large playlists. are you sure you accept the risk of data loss incurred by overwriting the existing playlist?",
|
||||
"success": "$t(entity.playlist_one) updated successfully",
|
||||
"title": "edit $t(entity.playlist_one)"
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) updated successfully",
|
||||
"title": "edit $t(entity.playlist, {\"count\": 1})"
|
||||
},
|
||||
"lyricsExport": {
|
||||
"export": "export lyrics",
|
||||
"input_synced": "export synced lyrics",
|
||||
"input_offset": "$t(setting.lyricOffset)"
|
||||
},
|
||||
"lyricSearch": {
|
||||
"input_artist": "$t(entity.artist_one)",
|
||||
"input_artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"input_name": "$t(common.name)",
|
||||
"title": "lyric search"
|
||||
},
|
||||
@@ -375,7 +395,7 @@
|
||||
},
|
||||
"shuffleAll": {
|
||||
"title": "play random",
|
||||
"input_genre": "$t(entity.genre_one)",
|
||||
"input_genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"input_limit": "how many songs?",
|
||||
"input_minYear": "from year",
|
||||
"input_maxYear": "to year",
|
||||
@@ -398,32 +418,38 @@
|
||||
"albumArtistDetail": {
|
||||
"about": "About {{artist}}",
|
||||
"appearsOn": "appears on",
|
||||
"groupingTypeAll": "all release types",
|
||||
"groupingTypePrimary": "primary release types",
|
||||
"recentReleases": "recent releases",
|
||||
"viewDiscography": "view discography",
|
||||
"relatedArtists": "related $t(entity.artist_other)",
|
||||
"relatedArtists": "related $t(entity.artist, {\"count\": 2})",
|
||||
"topSongs": "top songs",
|
||||
"topSongsFrom": "top songs from {{title}}",
|
||||
"viewAll": "view all",
|
||||
"viewAllTracks": "view all $t(entity.track_other)"
|
||||
"viewAllTracks": "view all $t(entity.track, {\"count\": 2})"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
"title": "$t(entity.albumArtist, {\"count\": 2})"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "more from this $t(entity.artist_one)",
|
||||
"moreFromArtist": "more from this $t(entity.artist, {\"count\": 1})",
|
||||
"moreFromGeneric": "more from {{item}}",
|
||||
"released": "released"
|
||||
},
|
||||
"albumList": {
|
||||
"artistAlbums": "albums by {{artist}}",
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)",
|
||||
"title": "$t(entity.album_other)"
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album, {\"count\": 2})",
|
||||
"title": "$t(entity.album, {\"count\": 2})"
|
||||
},
|
||||
"radioList": {
|
||||
"title": "radio stations"
|
||||
},
|
||||
"favorites": {
|
||||
"title": "$t(entity.favorite_other)"
|
||||
"title": "$t(entity.favorite, {\"count\": 2})"
|
||||
},
|
||||
"windowBar": {
|
||||
"paused": "(Paused) ",
|
||||
"privateMode": "(Private mode)"
|
||||
},
|
||||
"appMenu": {
|
||||
"collapseSidebar": "collapse sidebar",
|
||||
@@ -440,7 +466,7 @@
|
||||
"selectMusicFolder": "select music folder",
|
||||
"noMusicFolder": "no music folder selected",
|
||||
"multipleMusicFolders": "{{count}} music folders selected",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"version": "version {{version}}"
|
||||
},
|
||||
"manageServers": {
|
||||
@@ -475,8 +501,8 @@
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"shareItem": "share item",
|
||||
"goTo": "go to",
|
||||
"goToAlbum": "go to $t(entity.album_one)",
|
||||
"goToAlbumArtist": "go to $t(entity.albumArtist_one)",
|
||||
"goToAlbum": "go to $t(entity.album, {\"count\": 1})",
|
||||
"goToAlbumArtist": "go to $t(entity.albumArtist, {\"count\": 1})",
|
||||
"showDetails": "get info"
|
||||
},
|
||||
"fullscreenPlayer": {
|
||||
@@ -503,12 +529,12 @@
|
||||
"noLyrics": "no lyrics found"
|
||||
},
|
||||
"genreList": {
|
||||
"showAlbums": "show $t(entity.genre_one) $t(entity.album_other)",
|
||||
"showTracks": "show $t(entity.genre_one) $t(entity.track_other)",
|
||||
"title": "$t(entity.genre_other)"
|
||||
"showAlbums": "show $t(entity.genre, {\"count\": 1}) $t(entity.album, {\"count\": 2})",
|
||||
"showTracks": "show $t(entity.genre, {\"count\": 1}) $t(entity.track, {\"count\": 2})",
|
||||
"title": "$t(entity.genre, {\"count\": 2})"
|
||||
},
|
||||
"folderList": {
|
||||
"title": "$t(entity.folder_other)"
|
||||
"title": "$t(entity.folder, {\"count\": 2})"
|
||||
},
|
||||
"globalSearch": {
|
||||
"commands": {
|
||||
@@ -520,7 +546,7 @@
|
||||
},
|
||||
"home": {
|
||||
"explore": "explore from your library",
|
||||
"genres": "$t(entity.genre_other)",
|
||||
"genres": "$t(entity.genre, {\"count\": 2})",
|
||||
"mostPlayed": "most played",
|
||||
"newlyAdded": "newly added releases",
|
||||
"recentlyPlayed": "recently played",
|
||||
@@ -536,7 +562,11 @@
|
||||
"reorder": "reordering only enabled when sorting by id"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist_other)"
|
||||
"title": "$t(entity.playlist, {\"count\": 2})"
|
||||
},
|
||||
"collections": {
|
||||
"overrideExisting": "override existing",
|
||||
"saveAsCollection": "save as collection"
|
||||
},
|
||||
"setting": {
|
||||
"advanced": "advanced",
|
||||
@@ -557,32 +587,34 @@
|
||||
"scrobble": "scrobble",
|
||||
"audio": "audio",
|
||||
"lyrics": "lyrics",
|
||||
"lyricsDisplay": "lyrics display",
|
||||
"transcoding": "transcoding",
|
||||
"discord": "discord",
|
||||
"logger": "logger",
|
||||
"playerFilters": "player filters"
|
||||
},
|
||||
"sidebar": {
|
||||
"albumArtists": "$t(entity.albumArtist_other)",
|
||||
"albums": "$t(entity.album_other)",
|
||||
"artists": "$t(entity.artist_other)",
|
||||
"favorites": "$t(entity.favorite_other)",
|
||||
"folders": "$t(entity.folder_other)",
|
||||
"genres": "$t(entity.genre_other)",
|
||||
"albumArtists": "$t(entity.albumArtist, {\"count\": 2})",
|
||||
"albums": "$t(entity.album, {\"count\": 2})",
|
||||
"collections": "collections",
|
||||
"artists": "$t(entity.artist, {\"count\": 2})",
|
||||
"favorites": "$t(entity.favorite, {\"count\": 2})",
|
||||
"folders": "$t(entity.folder, {\"count\": 2})",
|
||||
"genres": "$t(entity.genre, {\"count\": 2})",
|
||||
"home": "$t(common.home)",
|
||||
"radio": "$t(entity.radioStation_other)",
|
||||
"radio": "$t(entity.radioStation, {\"count\": 2})",
|
||||
"myLibrary": "my library",
|
||||
"nowPlaying": "now playing",
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"search": "$t(common.search)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"shared": "shared $t(entity.playlist_other)",
|
||||
"tracks": "$t(entity.track_other)"
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"shared": "shared $t(entity.playlist, {\"count\": 2})",
|
||||
"tracks": "$t(entity.track, {\"count\": 2})"
|
||||
},
|
||||
"trackList": {
|
||||
"artistTracks": "tracks by {{artist}}",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track_other)",
|
||||
"title": "$t(entity.track_other)"
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track, {\"count\": 2})",
|
||||
"title": "$t(entity.track, {\"count\": 2})"
|
||||
}
|
||||
},
|
||||
"player": {
|
||||
@@ -590,6 +622,7 @@
|
||||
"addNext": "next",
|
||||
"addLastShuffled": "last (shuffled)",
|
||||
"addNextShuffled": "next (shuffled)",
|
||||
"artistRadio": "artist radio",
|
||||
"holdToShuffle": "hold to shuffle",
|
||||
"favorite": "favorite",
|
||||
"lyrics": "lyrics",
|
||||
@@ -608,9 +641,6 @@
|
||||
"queue_moveToBottom": "move selected to top",
|
||||
"queue_moveToTop": "move selected to bottom",
|
||||
"queue_remove": "remove selected",
|
||||
"queueType": "queue type",
|
||||
"queueType_default": "default",
|
||||
"queueType_priority": "priority",
|
||||
"repeat": "repeat",
|
||||
"repeat_all": "repeat all",
|
||||
"repeat_off": "repeat disabled",
|
||||
@@ -625,6 +655,7 @@
|
||||
"skip_forward": "skip forwards",
|
||||
"stop": "stop",
|
||||
"toggleFullscreenPlayer": "toggle fullscreen player",
|
||||
"trackRadio": "track radio",
|
||||
"unfavorite": "unfavorite",
|
||||
"pause": "pause",
|
||||
"viewQueue": "view queue"
|
||||
@@ -635,7 +666,7 @@
|
||||
},
|
||||
"releaseType": {
|
||||
"primary": {
|
||||
"album": "$t(entity.album_one)",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"broadcast": "broadcast",
|
||||
"ep": "ep",
|
||||
"other": "other",
|
||||
@@ -681,6 +712,8 @@
|
||||
"artistBackgroundBlur_description": "adjusts the amount of blur applied to the artist background image",
|
||||
"artistConfiguration": "album artist page configuration",
|
||||
"artistConfiguration_description": "configure what items are shown, and in what order, on the album artist page",
|
||||
"artistReleaseTypeConfiguration": "artist release type configuration",
|
||||
"artistReleaseTypeConfiguration_description": "configure what release types are shown, and in what order, on the album artist page",
|
||||
"audioDevice_description": "select the audio device to use for playback (web player only)",
|
||||
"audioDevice": "audio device",
|
||||
"audioExclusiveMode_description": "enable exclusive output mode. In this mode, the system is usually locked out, and only mpv will be able to output audio",
|
||||
@@ -773,12 +806,21 @@
|
||||
"homeConfiguration": "home page configuration",
|
||||
"homeFeature_description": "controls whether to show the large featured carousel on the home page",
|
||||
"homeFeature": "home featured carousel",
|
||||
"homeFeatureStyle_description": "controls the style of the home featured carousel",
|
||||
"homeFeatureStyle": "home featured carousel style",
|
||||
"homeFeatureStyle_optionMultiple": "multiple",
|
||||
"homeFeatureStyle_optionSingle": "single",
|
||||
"hotkey_browserBack": "browser back",
|
||||
"hotkey_browserForward": "browser forward",
|
||||
"hotkey_favoriteCurrentSong": "favorite $t(common.currentSong)",
|
||||
"hotkey_favoritePreviousSong": "favorite $t(common.previousSong)",
|
||||
"hotkey_globalSearch": "global search",
|
||||
"hotkey_localSearch": "in-page search",
|
||||
"hotkey_listNavigateToPage": "list navigate to item page",
|
||||
"hotkey_listPlayDefault": "list play",
|
||||
"hotkey_listPlayLast": "list play last",
|
||||
"hotkey_listPlayNext": "list play next",
|
||||
"hotkey_listPlayNow": "list play now",
|
||||
"hotkey_navigateHome": "navigate to home",
|
||||
"hotkey_playbackNext": "next track",
|
||||
"hotkey_playbackPause": "pause",
|
||||
@@ -817,7 +859,7 @@
|
||||
"lastfmApiKey": "{{lastfm}} API key",
|
||||
"lyricFetch_description": "fetch lyrics from various internet sources",
|
||||
"lyricFetch": "fetch lyrics from the internet",
|
||||
"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",
|
||||
"lyricFetchProvider": "providers to fetch lyrics from",
|
||||
"lyricOffset_description": "offset the lyric by the specified amount of milliseconds",
|
||||
"lyricOffset": "lyric offset (ms)",
|
||||
@@ -835,6 +877,8 @@
|
||||
"minimumScrobbleSeconds": "minimum scrobble (seconds)",
|
||||
"mpvExecutablePath_description": "sets the path to the mpv executable. if left empty, the default path will be used",
|
||||
"mpvExecutablePath": "mpv executable path",
|
||||
"mpvExtraParameters": "mpv extra parameters",
|
||||
"mpvExtraParameters_description": "extra arguments to pass to mpv",
|
||||
"mpvExtraParameters_help": "one per line",
|
||||
"musicbrainz_description": "show links to MusicBrainz on artist/album pages, where MusicBrainz ID exists",
|
||||
"musicbrainz": "show MusicBrainz links",
|
||||
@@ -842,6 +886,10 @@
|
||||
"neteaseTranslation": "Enable NetEase translations",
|
||||
"notify": "enable song notifications",
|
||||
"notify_description": "show notifications when changing the current song",
|
||||
"pathReplace": "file path replacement",
|
||||
"pathReplace_description": "replace your server's default filepath",
|
||||
"pathReplace_optionRemovePrefix": "remove prefix",
|
||||
"pathReplace_optionAddPrefix": "add prefix",
|
||||
"passwordStore_description": "what password/secret store to use. change this if you are having issues storing passwords",
|
||||
"passwordStore": "passwords/secret store",
|
||||
"playerFilters": "Filter songs from the queue",
|
||||
@@ -856,8 +904,15 @@
|
||||
"playButtonBehavior_optionPlay": "$t(player.play)",
|
||||
"playButtonBehavior_optionPlayShuffled": "$t(player.shuffle)",
|
||||
"playButtonBehavior": "play button behavior",
|
||||
"playerAlbumArtResolution_description": "the resolution for the large player's album art preview. larger makes it look more crisp, but may slow loading down. defaults to 0, meaning auto",
|
||||
"playerAlbumArtResolution": "player album art resolution",
|
||||
"artistRadioCount_description": "sets the number of songs to fetch for artist radio and track radio",
|
||||
"artistRadioCount": "artist/track radio count",
|
||||
"imageResolution": "image resolution",
|
||||
"imageResolution_description": "the resolution for the images used around the app. using a value of 0 will default to the native image resolution",
|
||||
"imageResolution_optionTable": "table",
|
||||
"imageResolution_optionItemCard": "item card",
|
||||
"imageResolution_optionSidebar": "sidebar",
|
||||
"imageResolution_optionHeader": "header",
|
||||
"imageResolution_optionFullScreenPlayer": "fullscreen player",
|
||||
"playerbarOpenDrawer_description": "allows clicking of the playerbar to open the full screen player",
|
||||
"playerbarOpenDrawer": "playerbar fullscreen toggle",
|
||||
"playerbarSlider": "playerbar slider",
|
||||
@@ -875,8 +930,14 @@
|
||||
"preferLocalLyrics": "prefer local lyrics",
|
||||
"showLyricsInSidebar_description": "a panel will be added to the attached play queue that displays the lyrics",
|
||||
"showLyricsInSidebar": "show lyrics in player sidebar",
|
||||
"showRatings_description": "controls if the star ratings feature shows up in the interface",
|
||||
"showRatings": "show star ratings",
|
||||
"enableGridMultiSelect": "enable grid multi-select",
|
||||
"enableGridMultiSelect_description": "when enabled, allows selecting multiple items in grid views. when disabled, clicking grid item images will navigate to the item page",
|
||||
"showVisualizerInSidebar_description": "a panel will be added to the player sidebar that displays the visualizer",
|
||||
"showVisualizerInSidebar": "show visualizer in player sidebar",
|
||||
"combinedLyricsAndVisualizer_description": "combine lyrics and visualizer into the same panel",
|
||||
"combinedLyricsAndVisualizer": "combine lyrics and visualizer in player sidebar",
|
||||
"preservePitch_description": "preserves pitch when modifying playback speed",
|
||||
"preservePitch": "preserve pitch",
|
||||
"audioFadeOnStatusChange": "audio fade on status change",
|
||||
@@ -894,9 +955,9 @@
|
||||
"replayGainFallback_description": "gain in db to apply if the file has no {{ReplayGain}} tags",
|
||||
"replayGainFallback": "{{ReplayGain}} fallback",
|
||||
"replayGainMode_description": "adjust volume gain according to {{ReplayGain}} values stored in the file metadata",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album_one)",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album, {\"count\": 1})",
|
||||
"replayGainMode_optionNone": "$t(common.none)",
|
||||
"replayGainMode_optionTrack": "$t(entity.track_one)",
|
||||
"replayGainMode_optionTrack": "$t(entity.track, {\"count\": 1})",
|
||||
"replayGainMode": "{{ReplayGain}} mode",
|
||||
"replayGainPreamp_description": "adjust the preamp gain applied to the {{ReplayGain}} values",
|
||||
"replayGainPreamp": "{{ReplayGain}} preamp (dB)",
|
||||
@@ -916,10 +977,15 @@
|
||||
"sidebarConfiguration": "sidebar configuration",
|
||||
"sidebarPlaylistList_description": "show or hide the playlist list in the sidebar",
|
||||
"sidebarPlaylistList": "sidebar playlist list",
|
||||
"sidebarPlaylistSorting_description": "allows manual playlist sorting in the sidebar using drag and drop instead of the default server order",
|
||||
"sidebarPlaylistSorting": "sidebar playlist sorting",
|
||||
"sidebarPlaylistListFilterRegex_description": "hide playlists in the sidebar that match this regular expression",
|
||||
"sidebarPlaylistListFilterRegex_placeholder": "e.g. ^Daily Mix.*",
|
||||
"sidebarPlaylistListFilterRegex": "playlist filter regex",
|
||||
"sidePlayQueueStyle_description": "sets the style of the side play queue",
|
||||
"sidePlayQueueStyle_optionAttached": "attached",
|
||||
"sidePlayQueueStyle_optionDetached": "detached",
|
||||
"mediaSession_description": "enables Windows Media Session integration, displaying media controls and metadata in the system volume overlay and lock screen (Windows only)",
|
||||
"mediaSession_description": "enables Media Session integration, displaying media controls and metadata in the system volume overlay and lock screen",
|
||||
"mediaSession": "enable media session",
|
||||
"sidePlayQueueStyle": "side play queue style",
|
||||
"skipDuration_description": "sets the duration to skip when using the skip buttons on the player bar",
|
||||
@@ -970,19 +1036,19 @@
|
||||
"column": {
|
||||
"album": "album",
|
||||
"albumArtist": "album artist",
|
||||
"albumCount": "$t(entity.album_other)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2})",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"biography": "biography",
|
||||
"bitDepth": "$t(common.bitDepth)",
|
||||
"bitrate": "bitrate",
|
||||
"bpm": "bpm",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"channels": "$t(common.channel, {\"count\": 2})",
|
||||
"codec": "$t(common.codec)",
|
||||
"comment": "comment",
|
||||
"dateAdded": "date added",
|
||||
"discNumber": "disc",
|
||||
"favorite": "favorite",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"lastPlayed": "last played",
|
||||
"path": "path",
|
||||
"playCount": "plays",
|
||||
@@ -991,7 +1057,7 @@
|
||||
"releaseYear": "year",
|
||||
"sampleRate": "$t(common.sampleRate)",
|
||||
"size": "$t(common.size)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"songCount": "$t(entity.track, {\"count\": 2})",
|
||||
"title": "title",
|
||||
"trackNumber": "track",
|
||||
"owner": "owner"
|
||||
@@ -1026,26 +1092,28 @@
|
||||
"alternateRowColors": "alternate row colors",
|
||||
"horizontalBorders": "row borders",
|
||||
"rowHoverHighlight": "row hover highlight",
|
||||
"showHeader": "show header",
|
||||
"verticalBorders": "column borders"
|
||||
},
|
||||
"label": {
|
||||
"actions": "$t(common.action_other)",
|
||||
"album": "$t(entity.album_one)",
|
||||
"albumCount": "$t(entity.album_other)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"actions": "$t(common.action, {\"count\": 2})",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2})",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"biography": "$t(common.biography)",
|
||||
"bitDepth": "$t(common.bitDepth)",
|
||||
"bitrate": "$t(common.bitrate)",
|
||||
"bpm": "$t(common.bpm)",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"channels": "$t(common.channel, {\"count\": 2})",
|
||||
"codec": "$t(common.codec)",
|
||||
"composer": "composer",
|
||||
"dateAdded": "date added",
|
||||
"discNumber": "disc number",
|
||||
"duration": "$t(common.duration)",
|
||||
"favorite": "$t(common.favorite)",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genreBadge": "$t(entity.genre_one) (badges)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"genreBadge": "$t(entity.genre, {\"count\": 1}) (badges)",
|
||||
"image": "image",
|
||||
"lastPlayed": "last played",
|
||||
"note": "$t(common.note)",
|
||||
@@ -1057,8 +1125,9 @@
|
||||
"rowIndex": "row index",
|
||||
"sampleRate": "$t(common.sampleRate)",
|
||||
"size": "$t(common.size)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"songCount": "$t(entity.track, {\"count\": 2})",
|
||||
"title": "$t(common.title)",
|
||||
"titleArtist": "$t(common.title) (artist)",
|
||||
"titleCombined": "$t(common.title) (combined)",
|
||||
"trackNumber": "track number",
|
||||
"year": "$t(common.year)"
|
||||
@@ -1074,5 +1143,154 @@
|
||||
"error_oneFileOnly": "Please only select 1 file",
|
||||
"error_readingFile": "there has been an issue reading the file: {{errorMessage}}",
|
||||
"mainText": "drop a file here"
|
||||
},
|
||||
"visualizer": {
|
||||
"visualizerType": "Visualizer Type",
|
||||
"cyclePresets": "Cycle Presets",
|
||||
"cycleTime": "Cycle Time (seconds)",
|
||||
"includeAllPresets": "Include All Presets",
|
||||
"ignoredPresets": "Ignored Presets",
|
||||
"selectedPresets": "Selected Presets",
|
||||
"randomizeNextPreset": "Randomize Next Preset",
|
||||
"blendTime": "Blend Time",
|
||||
"presets": "Presets",
|
||||
"selectPreset": "Select Preset",
|
||||
"applyPreset": "Apply Preset",
|
||||
"saveAsPreset": "Save as Preset",
|
||||
"updatePreset": "Update Preset",
|
||||
"copyConfiguration": "Copy Configuration",
|
||||
"pasteConfiguration": "Paste Configuration",
|
||||
"pasteConfigurationPlaceholder": "Paste JSON configuration here...",
|
||||
"pasteFromClipboard": "Paste from Clipboard",
|
||||
"applyConfiguration": "Apply Configuration",
|
||||
"configCopied": "Configuration copied to clipboard",
|
||||
"configCopyFailed": "Failed to copy configuration",
|
||||
"configPasted": "Configuration applied successfully",
|
||||
"configPasteFailed": "Failed to apply configuration. Please check the format.",
|
||||
"configPasteReadFailed": "Failed to read from clipboard",
|
||||
"presetName": "Preset Name",
|
||||
"presetNamePlaceholder": "Enter preset name",
|
||||
"general": "General",
|
||||
"mode": "Mode",
|
||||
"mode1To8": "Mode 1 - 8",
|
||||
"mode10": "Mode 10",
|
||||
"barSpace": "Bar Space",
|
||||
"lineWidth": "Line Width",
|
||||
"fillAlpha": "Fill Alpha",
|
||||
"channelLayout": "Channel Layout",
|
||||
"maxFPS": "Max FPS",
|
||||
"opacity": "Opacity",
|
||||
"customGradients": "Custom Gradients",
|
||||
"addCustomGradient": "Add Custom Gradient",
|
||||
"gradientName": "Gradient Name",
|
||||
"gradientNamePlaceholder": "Gradient Name",
|
||||
"vertical": "Vertical",
|
||||
"horizontal": "Horizontal",
|
||||
"colorStops": "Color Stops",
|
||||
"addColor": "Add Color",
|
||||
"position": "Position",
|
||||
"level": "Level",
|
||||
"remove": "Remove",
|
||||
"pasteGradient": "Paste Gradient",
|
||||
"pasteGradientPlaceholder": "Paste gradient JSON here...",
|
||||
"custom": "Custom",
|
||||
"builtIn": "Built-in",
|
||||
"colors": "Colors",
|
||||
"colorMode": "Color Mode",
|
||||
"gradient": "Gradient",
|
||||
"gradientLeft": "Gradient Left",
|
||||
"gradientRight": "Gradient Right",
|
||||
"fft": "FFT",
|
||||
"fftSize": "FFT Size",
|
||||
"smoothing": "Smoothing",
|
||||
"frequencyRangeAndScaling": "Frequency range and scaling",
|
||||
"minimumFrequency": "Minimum Frequency",
|
||||
"maximumFrequency": "Maximum Frequency",
|
||||
"frequencyScale": "Frequency Scale",
|
||||
"sensitivity": "Sensitivity",
|
||||
"weightingFilter": "Weighting Filter",
|
||||
"minimumDecibels": "Minimum Decibels",
|
||||
"maximumDecibels": "Maximum Decibels",
|
||||
"linearAmplitude": "Linear Amplitude",
|
||||
"linearBoost": "Linear Boost",
|
||||
"peakBehavior": "Peak Behavior",
|
||||
"showPeaks": "Show Peaks",
|
||||
"fadePeaks": "Fade Peaks",
|
||||
"peakLine": "Peak Line",
|
||||
"gravity": "Gravity",
|
||||
"peakFadeTime": "Peak Fade Time (ms)",
|
||||
"peakHoldTime": "Peak Hold Time (ms)",
|
||||
"radialSpectrum": "Radial Spectrum",
|
||||
"radial": "Radial",
|
||||
"radialInvert": "Radial Invert",
|
||||
"spinSpeed": "Spin Speed",
|
||||
"radius": "Radius",
|
||||
"reflexMirror": "Reflex Mirror",
|
||||
"reflexFit": "Reflex Fit",
|
||||
"reflexRatio": "Reflex Ratio",
|
||||
"reflexAlpha": "Reflex Alpha",
|
||||
"reflexBrightness": "Reflex Brightness",
|
||||
"mirror": "Mirror",
|
||||
"miscellaneousSettings": "Miscellaneous Settings",
|
||||
"alphaBars": "Alpha Bars",
|
||||
"ansiBands": "ANSI Bands",
|
||||
"ledBars": "LED Bars",
|
||||
"trueLeds": "True LEDs",
|
||||
"lumiBars": "Lumi Bars",
|
||||
"outlineBars": "Outline Bars",
|
||||
"roundBars": "Round Bars",
|
||||
"lowResolution": "Low Resolution",
|
||||
"splitGradient": "Split Gradient",
|
||||
"showFPS": "Show FPS",
|
||||
"showScaleX": "Show Scale X",
|
||||
"noteLabels": "Note Labels",
|
||||
"showScaleY": "Show Scale Y",
|
||||
"options": {
|
||||
"mode": {
|
||||
"0": "[0] Discrete Frequencies",
|
||||
"1": "[1] 1/24th octave / 240 bands",
|
||||
"2": "[2] 1/12th octave / 120 bands",
|
||||
"3": "[3] 1/8th octave / 80 bands",
|
||||
"4": "[4] 1/6th octave / 60 bands",
|
||||
"5": "[5] 1/4th octave / 40 bands",
|
||||
"6": "[6] 1/3rd octave / 30 bands",
|
||||
"7": "[7] Half octave / 20 bands",
|
||||
"8": "[8] Full octave / 10 bands",
|
||||
"10": "[10] Line / Area graph"
|
||||
},
|
||||
"colorMode": {
|
||||
"gradient": "Gradient",
|
||||
"barIndex": "Bar-Index",
|
||||
"barLevel": "Bar-Level"
|
||||
},
|
||||
"gradient": {
|
||||
"classic": "Classic",
|
||||
"prism": "Prism",
|
||||
"rainbow": "Rainbow",
|
||||
"steelblue": "Steelblue",
|
||||
"orangered": "Orangered"
|
||||
},
|
||||
"channelLayout": {
|
||||
"single": "Single",
|
||||
"dualCombined": "Dual-Combined",
|
||||
"dualHorizontal": "Dual-Horizontal",
|
||||
"dualVertical": "Dual-Vertical"
|
||||
},
|
||||
"frequencyScale": {
|
||||
"none": "None",
|
||||
"bark": "Bark Scale",
|
||||
"linear": "Linear Scale",
|
||||
"log": "Log Scale",
|
||||
"mel": "Mel Scale"
|
||||
},
|
||||
"weightingFilter": {
|
||||
"none": "None",
|
||||
"a": "A",
|
||||
"b": "B",
|
||||
"c": "C",
|
||||
"d": "D",
|
||||
"z": "Z"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,13 +33,12 @@
|
||||
"viewQueue": "ver cola",
|
||||
"addLastShuffled": "Al final (mezclado)",
|
||||
"addNextShuffled": "Al siguiente (mezclado)",
|
||||
"queueType": "Tipo de cola",
|
||||
"queueType_default": "Predeterminado",
|
||||
"queueType_priority": "Prioridad",
|
||||
"holdToShuffle": "Mantener para mezclar",
|
||||
"lyrics": "Letras",
|
||||
"restoreQueueFromServer": "Restaurar cola del servidor",
|
||||
"saveQueueToServer": "Guardar cola en el servidor"
|
||||
"saveQueueToServer": "Guardar cola en el servidor",
|
||||
"artistRadio": "Radio de artista",
|
||||
"trackRadio": "Radio de pista"
|
||||
},
|
||||
"setting": {
|
||||
"crossfadeStyle_description": "selecciona el estilo de crossfade a usar por el reproductor de audio",
|
||||
@@ -50,7 +49,7 @@
|
||||
"theme_description": "establece el tema a usar por la aplicación",
|
||||
"hotkey_playbackPause": "pausa",
|
||||
"replayGainFallback": "{{ReplayGain}} alternativa",
|
||||
"sidebarCollapsedNavigation_description": "mostrar u ocultar la navegación en la barra lateral contraída",
|
||||
"sidebarCollapsedNavigation_description": "Muestra u oculta la navegación en la barra lateral contraída",
|
||||
"hotkey_volumeUp": "subir volumen",
|
||||
"skipDuration": "duración de salto",
|
||||
"discordIdleStatus_description": "cuando se activa, actualiza el estado mientras el reproductor está inactivo",
|
||||
@@ -100,7 +99,7 @@
|
||||
"exitToTray_description": "sale de la aplicación a la bandeja del sistema",
|
||||
"followLyric_description": "desplaza la letra a la posición de reproducción actual",
|
||||
"hotkey_favoritePreviousSong": "$t(common.previousSong) favorita",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album_one)",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album, {\"count\": 1})",
|
||||
"lyricOffset": "desfase de letra (ms)",
|
||||
"discordUpdateInterval_description": "el tiempo en segundos entre cada actualización (mínimo 15 segundos)",
|
||||
"fontType_optionCustom": "fuente personalizada",
|
||||
@@ -112,7 +111,7 @@
|
||||
"playbackStyle_optionCrossFade": "crossfade",
|
||||
"hotkey_rate3": "calificar con 3 estrellas",
|
||||
"font": "fuente",
|
||||
"replayGainMode_optionTrack": "$t(entity.track_one)",
|
||||
"replayGainMode_optionTrack": "$t(entity.track, {\"count\": 1})",
|
||||
"themeLight_description": "establece el tema claro a usar por la aplicación",
|
||||
"hotkey_toggleFullScreenPlayer": "cambia el reproductor a pantalla completa",
|
||||
"hotkey_localSearch": "búsqueda en la página",
|
||||
@@ -120,7 +119,7 @@
|
||||
"remotePassword_description": "establece la contraseña para el control remoto del servidor. Esas credenciales son transferidas de forma insegura por defecto, por lo que deberías usar una contraseña única para que no tengas nada de lo que preocuparte",
|
||||
"hotkey_rate5": "calificar con 5 estrellas",
|
||||
"hotkey_playbackPrevious": "pista anterior",
|
||||
"showSkipButtons_description": "muestra o esconde los botones de saltar en la barra del reproductor",
|
||||
"showSkipButtons_description": "Muestra u oculta los botones de saltar en la barra del reproductor",
|
||||
"crossfadeDuration_description": "establece la duración del efecto de crossfade",
|
||||
"playbackStyle": "estilo de reproducción",
|
||||
"hotkey_toggleShuffle": "alterna aleatorio",
|
||||
@@ -135,12 +134,12 @@
|
||||
"exitToTray": "salir a la bandeja",
|
||||
"hotkey_rate4": "calificar con 4 estrellas",
|
||||
"enableRemote": "activar control remoto del servidor",
|
||||
"showSkipButton_description": "muestra o esconde los botones de saltar en la barra del reproductor",
|
||||
"showSkipButton_description": "Muestra u oculta los botones de saltar en la barra del reproductor",
|
||||
"savePlayQueue": "guardar cola de reproducción",
|
||||
"minimumScrobbleSeconds_description": "la duración mínima en segundos de la canción que debe ser reproducida antes de hacer scrobble",
|
||||
"fontType_description": "Fuente incorporada selecciona una de las fuentes proporcionadas por feishin. Fuente del sistema te permite seleccionar cualquier fuente proporcionada por tu sistema operativo. Personalizada te permite proporcionar tu propia fuente",
|
||||
"playButtonBehavior": "comportamiento del botón de reproducción",
|
||||
"sidebarPlaylistList_description": "muestra o esconde las listas de reproducción en la barra lateral",
|
||||
"sidebarPlaylistList_description": "Muestra u oculta las listas de reproducción en la barra lateral",
|
||||
"sidePlayQueueStyle_description": "establece el estilo de la cola de reproducción lateral",
|
||||
"replayGainMode": "modo de {{ReplayGain}}",
|
||||
"playbackStyle_optionNormal": "normal",
|
||||
@@ -156,7 +155,7 @@
|
||||
"useSystemTheme_description": "sigue la preferencia clara u oscura definida por el sistema",
|
||||
"playButtonBehavior_optionAddNext": "$t(player.addNext)",
|
||||
"lyricFetch_description": "busca letras en varias fuentes de Internet",
|
||||
"lyricFetchProvider_description": "selecciona los proveedores para buscar letras. el orden de los proveedores es el orden en el que se consultarán",
|
||||
"lyricFetchProvider_description": "Selecciona los proveedores para buscar letras",
|
||||
"globalMediaHotkeys_description": "activa o desactiva el uso de las teclas de acceso rápidas del sistema a medios para controlar la reproducción",
|
||||
"customFontPath": "ruta de fuente personalizada",
|
||||
"followLyric": "seguir la letra actual",
|
||||
@@ -206,8 +205,6 @@
|
||||
"startMinimized_description": "inicia la aplicación en la bandeja del sistema",
|
||||
"startMinimized": "iniciar minimizado",
|
||||
"passwordStore": "contraseñas/almacenamiento secreto",
|
||||
"playerAlbumArtResolution_description": "la resolución para la vista previa de la carátula del álbum del reproductor grande. más grande hace que parezca más nítido, pero puede ralentizar la carga. El valor predeterminado es 0, lo que significa automático",
|
||||
"playerAlbumArtResolution": "resolución de la carátula del álbum del reproductor",
|
||||
"homeConfiguration": "Configuración de la página de inicio",
|
||||
"mpvExtraParameters_help": "Uno por línea",
|
||||
"externalLinks_description": "Permite mostrar enlaces externos (Last.fm, MusicBrainz) en las páginas del artista/álbum",
|
||||
@@ -223,7 +220,7 @@
|
||||
"discordListening_description": "muestra el estado como Escuchando en lugar de Jugando a",
|
||||
"discordListening": "Mostrar estado como escuchando",
|
||||
"contextMenu": "Configuración del menú de contexto (clic derecho)",
|
||||
"contextMenu_description": "Te permite esconder elementos que son mostrados en el menú cuando haces clic derecho en un elemento. Los elementos que no estén seleccionados serán escondidos",
|
||||
"contextMenu_description": "Te permite ocultar elementos que son mostrados en el menú cuando haces clic derecho en un elemento. Los elementos que no estén seleccionados se ocultarán",
|
||||
"customCssEnable": "Habilitar CSS personalizado",
|
||||
"customCssEnable_description": "Permite escribir CSS personalizado",
|
||||
"customCss": "CSS personalizado",
|
||||
@@ -289,7 +286,7 @@
|
||||
"releaseChannel_description": "Elige entre lanzamientos estables o beta para las actualizaciones automáticas",
|
||||
"artistBackground_description": "Añade una imagen de fondo para las páginas de artista que contienen el arte del artista",
|
||||
"mediaSession": "Activar sesión de medios",
|
||||
"mediaSession_description": "Activa la integración de la sesión de medios de Windows, mostrando los controles de medios y los metadatos en la superposición del volumen del sistema y en la pantalla de bloqueo (solo en Windows)",
|
||||
"mediaSession_description": "Activa la integración de la sesión de medios, mostrando los controles de medios y los metadatos en la superposición del volumen del sistema y en la pantalla de bloqueo",
|
||||
"exportImportSettings_control_description": "Exporta e importa la configuración a través de JSON",
|
||||
"exportImportSettings_control_exportText": "exportar configuración",
|
||||
"exportImportSettings_control_importText": "importar configuración",
|
||||
@@ -349,26 +346,60 @@
|
||||
"logLevel_optionInfo": "Información",
|
||||
"logLevel_optionWarn": "Advertencia",
|
||||
"useThemeAccentColor": "Usar color de acentuación de tema",
|
||||
"useThemeAccentColor_description": "Usa el color principal definido en el tema seleccionado en lugar del color de acentuación personalizado"
|
||||
"useThemeAccentColor_description": "Usa el color principal definido en el tema seleccionado en lugar del color de acentuación personalizado",
|
||||
"artistRadioCount_description": "Establece el número de canciones a buscar para la radio de artista y de pista",
|
||||
"artistRadioCount": "Recuento de radio de artista/pista",
|
||||
"imageResolution": "Resolución de imagen",
|
||||
"imageResolution_description": "La resolución de las imágenes usadas en la aplicación. Usar un valor de 0 lo dejará de forma predeterminada a la resolución nativa de la imagen",
|
||||
"imageResolution_optionTable": "Tabla",
|
||||
"imageResolution_optionItemCard": "Tarjeta de elemento",
|
||||
"imageResolution_optionSidebar": "Barra lateral",
|
||||
"imageResolution_optionHeader": "Cabecera",
|
||||
"imageResolution_optionFullScreenPlayer": "Reproductor a pantalla completa",
|
||||
"showRatings_description": "Controla si la característica de calificación de estrellas aparece en la interfaz",
|
||||
"showRatings": "Mostrar calificación de estrellas",
|
||||
"combinedLyricsAndVisualizer_description": "Combina letras y visualizador en el mismo panel",
|
||||
"combinedLyricsAndVisualizer": "Combinar letras y visualizador en la barra lateral del reproductor",
|
||||
"artistReleaseTypeConfiguration": "Configuración de tipo de lanzamiento de artista",
|
||||
"artistReleaseTypeConfiguration_description": "Configura qué tipos de lanzamiento son mostrados, y en qué orden, en la página del artista del álbum",
|
||||
"mpvExtraParameters": "Parámetros adicionales de MPV",
|
||||
"mpvExtraParameters_description": "Argumentos adicionales a pasar a MPV",
|
||||
"hotkey_listPlayDefault": "Reproducir lista",
|
||||
"hotkey_listPlayLast": "Reproducir lista al final",
|
||||
"hotkey_listPlayNext": "Reproducir lista a continuación",
|
||||
"hotkey_listPlayNow": "Reproducir lista ahora",
|
||||
"hotkey_listNavigateToPage": "Navegar por la lista hasta la página del elemento",
|
||||
"pathReplace_description": "Reemplaza la ruta de archivo predeterminada de tu servidor",
|
||||
"pathReplace": "Reemplazo de la ruta de archivo",
|
||||
"pathReplace_optionRemovePrefix": "Eliminar prefijo",
|
||||
"pathReplace_optionAddPrefix": "Añadir prefijo",
|
||||
"homeFeatureStyle": "Estilo del carrusel de destacados del inicio",
|
||||
"homeFeatureStyle_description": "Controla el estilo del carrusel de destacados del inicio",
|
||||
"homeFeatureStyle_optionMultiple": "Múltiple",
|
||||
"homeFeatureStyle_optionSingle": "Simple",
|
||||
"enableGridMultiSelect": "Activar selección múltiple de rejilla",
|
||||
"enableGridMultiSelect_description": "Cuando está activo, permite seleccionar múltiples elementos en las vistas de rejilla. Cuando está desactivado, hacer clic en las imágenes de los elementos de la rejilla navegará a la página del elemento",
|
||||
"sidebarPlaylistSorting": "Ordenación de la lista de reproducción de la barra lateral",
|
||||
"sidebarPlaylistSorting_description": "Permite la ordenación manual de la lista de reproducción en la barra lateral usando arrastrar y soltar en lugar del orden predeterminado del servidor"
|
||||
},
|
||||
"action": {
|
||||
"editPlaylist": "editar $t(entity.playlist_one)",
|
||||
"editPlaylist": "editar $t(entity.playlist, {\"count\": 1})",
|
||||
"goToPage": "ir a la página",
|
||||
"moveToTop": "mover al principio",
|
||||
"clearQueue": "limpiar cola",
|
||||
"addToFavorites": "añadir a $t(entity.favorite_other)",
|
||||
"addToPlaylist": "añadir a $t(entity.playlist_one)",
|
||||
"createPlaylist": "crear $t(entity.playlist_one)",
|
||||
"removeFromPlaylist": "eliminar de $t(entity.playlist_one)",
|
||||
"viewPlaylists": "ver $t(entity.playlist_other)",
|
||||
"addToFavorites": "añadir a $t(entity.favorite, {\"count\": 2})",
|
||||
"addToPlaylist": "añadir a $t(entity.playlist, {\"count\": 1})",
|
||||
"createPlaylist": "crear $t(entity.playlist, {\"count\": 1})",
|
||||
"removeFromPlaylist": "eliminar de $t(entity.playlist, {\"count\": 1})",
|
||||
"viewPlaylists": "ver $t(entity.playlist, {\"count\": 2})",
|
||||
"refresh": "$t(common.refresh)",
|
||||
"deletePlaylist": "eliminar $t(entity.playlist_one)",
|
||||
"deletePlaylist": "eliminar $t(entity.playlist, {\"count\": 1})",
|
||||
"removeFromQueue": "eliminar de la cola",
|
||||
"deselectAll": "desmarcar todo",
|
||||
"moveToBottom": "mover al final",
|
||||
"setRating": "establecer calificación",
|
||||
"toggleSmartPlaylistEditor": "cambiar editor $t(entity.smartPlaylist)",
|
||||
"removeFromFavorites": "eliminar de $t(entity.favorite_other)",
|
||||
"removeFromFavorites": "eliminar de $t(entity.favorite, {\"count\": 2})",
|
||||
"openIn": {
|
||||
"lastfm": "Abrir en Last.fm",
|
||||
"musicbrainz": "Abrir en MusicBrainz"
|
||||
@@ -384,8 +415,12 @@
|
||||
"holdToMoveToTop": "Mantener pulsado para desplazar hacia arriba",
|
||||
"moveUp": "Desplazar hacia arriba",
|
||||
"moveDown": "Desplazar hacia abajo",
|
||||
"createRadioStation": "Crear $t(entity.radioStation_one)",
|
||||
"deleteRadioStation": "Borrar $t(entity.radioStation_one)"
|
||||
"createRadioStation": "Crear $t(entity.radioStation, {\"count\": 1})",
|
||||
"deleteRadioStation": "Borrar $t(entity.radioStation, {\"count\": 1})",
|
||||
"openApplicationDirectory": "Abrir directorio de la aplicación",
|
||||
"addOrRemoveFromSelection": "Añadir o quitar de la selección",
|
||||
"selectRangeOfItems": "Seleccionar un intervalo de elementos",
|
||||
"selectAll": "Seleccionar todo"
|
||||
},
|
||||
"common": {
|
||||
"backward": "hacia atrás",
|
||||
@@ -400,7 +435,7 @@
|
||||
"left": "izquierda",
|
||||
"save": "guardar",
|
||||
"right": "derecha",
|
||||
"currentSong": "$t(entity.track_one) actual",
|
||||
"currentSong": "$t(entity.track, {\"count\": 1}) actual",
|
||||
"collapse": "contraer",
|
||||
"trackNumber": "pista",
|
||||
"descending": "descendiente",
|
||||
@@ -429,7 +464,9 @@
|
||||
"delete": "eliminar",
|
||||
"cancel": "cancelar",
|
||||
"forceRestartRequired": "reiniciar para aplicar cambios... cerrar la notificación para reiniciar",
|
||||
"setting": "configuración",
|
||||
"setting_one": "configuración",
|
||||
"setting_many": "configuraciones",
|
||||
"setting_other": "configuraciones",
|
||||
"version": "versión",
|
||||
"title": "título",
|
||||
"filters": "filtros",
|
||||
@@ -447,7 +484,7 @@
|
||||
"none": "ninguno",
|
||||
"menu": "menú",
|
||||
"restartRequired": "reinicio requerido",
|
||||
"previousSong": "anterior $t(entity.track_one)",
|
||||
"previousSong": "$t(entity.track, {\"count\": 1}) anterior",
|
||||
"noResultsFromQuery": "la petición no devolvió resultados",
|
||||
"quit": "salir",
|
||||
"expand": "expandir",
|
||||
@@ -502,7 +539,14 @@
|
||||
"tableColumns": "Columnas de la tabla",
|
||||
"itemsMore": "{{count}} más",
|
||||
"noFilters": "Ningún filtro configurado",
|
||||
"view": "Vista"
|
||||
"view": "Vista",
|
||||
"countSelected": "{{count}} seleccionados",
|
||||
"retry": "Reintentar",
|
||||
"mood": "Estado de ánimo",
|
||||
"example": "Ejemplo",
|
||||
"filter_single": "simple",
|
||||
"filter_multiple": "multi",
|
||||
"rename": "Renombrar"
|
||||
},
|
||||
"error": {
|
||||
"remotePortWarning": "reiniciar el servidor para aplicar el nuevo puerto",
|
||||
@@ -530,7 +574,10 @@
|
||||
"badValue": "Opción inválida \"{{value}}\". Este valor ya no existe",
|
||||
"notificationDenied": "Se denegaron los permisos para notificaciones. Esta configuración no tiene efecto",
|
||||
"saveQueueFailed": "Error al guardar la cola",
|
||||
"multipleServerSaveQueueError": "La cola de reproducción tiene una o más canciones que no son del servidor actual. Esto no está soportado"
|
||||
"multipleServerSaveQueueError": "La cola de reproducción tiene una o más canciones que no son del servidor actual. Esto no está soportado",
|
||||
"settingsSyncError": "Se encontraron discrepancias entre las opciones del renderizador y el proceso principal. Reinicia la aplicación para aplicar los cambios",
|
||||
"noNetwork": "Servidor no disponible",
|
||||
"noNetworkDescription": "No se pudo conectar a este servidor"
|
||||
},
|
||||
"filter": {
|
||||
"mostPlayed": "más reproducido",
|
||||
@@ -549,14 +596,14 @@
|
||||
"communityRating": "calificación de la comunidad",
|
||||
"path": "ruta",
|
||||
"favorited": "favoritos",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"isRecentlyPlayed": "reproducido recientemente",
|
||||
"isFavorited": "es favorito",
|
||||
"bpm": "lpm",
|
||||
"releaseYear": "año de lanzamiento",
|
||||
"disc": "disco",
|
||||
"biography": "biografía",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"duration": "duración",
|
||||
"random": "aleatorio",
|
||||
"lastPlayed": "última reproducción",
|
||||
@@ -567,38 +614,40 @@
|
||||
"comment": "comentarios",
|
||||
"playCount": "número de reproducciones",
|
||||
"recentlyUpdated": "actualizado recientemente",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"channels": "$t(common.channel, {\"count\": 2})",
|
||||
"owner": "$t(common.owner)",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"id": "id",
|
||||
"songCount": "número de canción",
|
||||
"isPublic": "es público",
|
||||
"album": "$t(entity.album_one)",
|
||||
"albumCount": "Contar $t(entity.album_other)",
|
||||
"explicitStatus": "$t(common.explicitStatus)"
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"albumCount": "Contar $t(entity.album, {\"count\": 2})",
|
||||
"explicitStatus": "$t(common.explicitStatus)",
|
||||
"sortName": "Ordenar por nombre"
|
||||
},
|
||||
"page": {
|
||||
"sidebar": {
|
||||
"nowPlaying": "reproduciendo",
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"search": "$t(common.search)",
|
||||
"tracks": "$t(entity.track_other)",
|
||||
"albums": "$t(entity.album_other)",
|
||||
"genres": "$t(entity.genre_other)",
|
||||
"folders": "$t(entity.folder_other)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"tracks": "$t(entity.track, {\"count\": 2})",
|
||||
"albums": "$t(entity.album, {\"count\": 2})",
|
||||
"genres": "$t(entity.genre, {\"count\": 2})",
|
||||
"folders": "$t(entity.folder, {\"count\": 2})",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"home": "$t(common.home)",
|
||||
"artists": "$t(entity.artist_other)",
|
||||
"albumArtists": "$t(entity.albumArtist_other)",
|
||||
"shared": "compartido $t(entity.playlist_other)",
|
||||
"artists": "$t(entity.artist, {\"count\": 2})",
|
||||
"albumArtists": "$t(entity.albumArtist, {\"count\": 2})",
|
||||
"shared": "compartido $t(entity.playlist, {\"count\": 2})",
|
||||
"myLibrary": "Mi biblioteca",
|
||||
"favorites": "$t(entity.favorite_other)",
|
||||
"radio": "$t(entity.radioStation_other)"
|
||||
"favorites": "$t(entity.favorite, {\"count\": 2})",
|
||||
"radio": "$t(entity.radioStation, {\"count\": 2})",
|
||||
"collections": "Colecciones"
|
||||
},
|
||||
"appMenu": {
|
||||
"selectServer": "seleccionar servidor",
|
||||
"version": "versión {{version}}",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"manageServers": "gestionar servidores",
|
||||
"expandSidebar": "ampliar barra lateral",
|
||||
"collapseSidebar": "contraer barra lateral",
|
||||
@@ -636,8 +685,8 @@
|
||||
"download": "descargar",
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"moveToNext": "$t(action.moveToNext)",
|
||||
"goToAlbum": "Ir a $t(entity.album_one)",
|
||||
"goToAlbumArtist": "Ir a $t(entity.albumArtist_one)",
|
||||
"goToAlbum": "Ir a $t(entity.album, {\"count\": 1})",
|
||||
"goToAlbumArtist": "Ir a $t(entity.albumArtist, {\"count\": 1})",
|
||||
"moveItems": "$t(action.moveItems)",
|
||||
"goTo": "Ir a"
|
||||
},
|
||||
@@ -648,7 +697,7 @@
|
||||
"explore": "explora desde tu biblioteca",
|
||||
"recentlyPlayed": "reproducidos recientemente",
|
||||
"recentlyReleased": "Lanzado recientemente",
|
||||
"genres": "$t(entity.genre_other)"
|
||||
"genres": "$t(entity.genre, {\"count\": 2})"
|
||||
},
|
||||
"fullscreenPlayer": {
|
||||
"upNext": "siguiente",
|
||||
@@ -674,7 +723,7 @@
|
||||
"noLyrics": "sin letras"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "más de este $t(entity.artist_one)",
|
||||
"moreFromArtist": "más de este $t(entity.artist, {\"count\": 1})",
|
||||
"moreFromGeneric": "más de {{item}}",
|
||||
"released": "publicado el"
|
||||
},
|
||||
@@ -700,19 +749,20 @@
|
||||
"discord": "Discord",
|
||||
"sidebar": "Barra lateral",
|
||||
"playerFilters": "Filtros del reproductor",
|
||||
"logger": "Registrador"
|
||||
"logger": "Registrador",
|
||||
"lyricsDisplay": "Mostrar letras"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
"title": "$t(entity.albumArtist, {\"count\": 2})"
|
||||
},
|
||||
"genreList": {
|
||||
"title": "$t(entity.genre_other)",
|
||||
"showAlbums": "Mostrar $t(entity.genre_one) $t(entity.album_other)",
|
||||
"showTracks": "Mostrar $t(entity.genre_one) $t(entity.track_other)"
|
||||
"title": "$t(entity.genre, {\"count\": 2})",
|
||||
"showAlbums": "Mostrar $t(entity.genre, {\"count\": 1}) $t(entity.album, {\"count\": 2})",
|
||||
"showTracks": "Mostrar $t(entity.genre, {\"count\": 1}) $t(entity.track, {\"count\": 2})"
|
||||
},
|
||||
"trackList": {
|
||||
"title": "$t(entity.track_other)",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track_other)",
|
||||
"title": "$t(entity.track, {\"count\": 2})",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track, {\"count\": 2})",
|
||||
"artistTracks": "Pistas de {{artist}}"
|
||||
},
|
||||
"globalSearch": {
|
||||
@@ -724,23 +774,25 @@
|
||||
"title": "comandos"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist_other)"
|
||||
"title": "$t(entity.playlist, {\"count\": 2})"
|
||||
},
|
||||
"albumList": {
|
||||
"title": "$t(entity.album_other)",
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)",
|
||||
"title": "$t(entity.album, {\"count\": 2})",
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album, {\"count\": 2})",
|
||||
"artistAlbums": "Álbumes de {{artist}}"
|
||||
},
|
||||
"albumArtistDetail": {
|
||||
"viewAllTracks": "ver todas las $t(entity.track_other)",
|
||||
"relatedArtists": "$t(entity.artist_other) similares",
|
||||
"viewAllTracks": "ver todas las $t(entity.track, {\"count\": 2})",
|
||||
"relatedArtists": "$t(entity.artist, {\"count\": 2}) similares",
|
||||
"topSongs": "mejores canciones",
|
||||
"topSongsFrom": "las mejores canciones de {{title}}",
|
||||
"viewAll": "Ver todo",
|
||||
"recentReleases": "Lanzamientos recientes",
|
||||
"viewDiscography": "Ver discografía",
|
||||
"about": "Sobre {{artist}}",
|
||||
"appearsOn": "Aparece en"
|
||||
"appearsOn": "Aparece en",
|
||||
"groupingTypeAll": "Todos los tipos de lanzamiento",
|
||||
"groupingTypePrimary": "Tipos de lanzamiento principales"
|
||||
},
|
||||
"itemDetail": {
|
||||
"copiedPath": "Ruta copiada correctamente",
|
||||
@@ -759,27 +811,35 @@
|
||||
"url": "URL"
|
||||
},
|
||||
"favorites": {
|
||||
"title": "$t(entity.favorite_other)"
|
||||
"title": "$t(entity.favorite, {\"count\": 2})"
|
||||
},
|
||||
"folderList": {
|
||||
"title": "$t(entity.folder_other)"
|
||||
"title": "$t(entity.folder, {\"count\": 2})"
|
||||
},
|
||||
"radioList": {
|
||||
"title": "Estaciones de radio"
|
||||
},
|
||||
"windowBar": {
|
||||
"privateMode": "(Modo privado)",
|
||||
"paused": "(Pausado) "
|
||||
},
|
||||
"collections": {
|
||||
"overrideExisting": "Sobreescribir existente",
|
||||
"saveAsCollection": "Guardar como colección"
|
||||
}
|
||||
},
|
||||
"form": {
|
||||
"deletePlaylist": {
|
||||
"title": "eliminar $t(entity.playlist_one)",
|
||||
"success": "$t(entity.playlist_one) eliminado correctamente",
|
||||
"input_confirm": "escribe el nombre de $t(entity.playlist_one) para confirmar"
|
||||
"title": "eliminar $t(entity.playlist, {\"count\": 1})",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) eliminado correctamente",
|
||||
"input_confirm": "escribe el nombre de $t(entity.playlist, {\"count\": 1}) para confirmar"
|
||||
},
|
||||
"createPlaylist": {
|
||||
"input_description": "$t(common.description)",
|
||||
"title": "crear $t(entity.playlist_one)",
|
||||
"title": "crear $t(entity.playlist, {\"count\": 1})",
|
||||
"input_public": "público",
|
||||
"input_name": "$t(common.name)",
|
||||
"success": "$t(entity.playlist_one) creado correctamente",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) creado correctamente",
|
||||
"input_owner": "$t(common.owner)"
|
||||
},
|
||||
"addServer": {
|
||||
@@ -795,15 +855,18 @@
|
||||
"ignoreCors": "ignorar cors ($t(common.restartRequired))",
|
||||
"error_savePassword": "un error ocurrió cuando se intentó guardar la contraseña",
|
||||
"input_preferInstantMix": "Preferir mix instantáneo",
|
||||
"input_preferInstantMixDescription": "Usa solo el mix instantáneo para obtener canciones similares. Útil si tienes complementos que modifican este comportamiento"
|
||||
"input_preferInstantMixDescription": "Usa solo el mix instantáneo para obtener canciones similares. Útil si tienes complementos que modifican este comportamiento",
|
||||
"input_remoteUrl": "URL pública",
|
||||
"input_preferRemoteUrl": "Preferir URL pública",
|
||||
"input_remoteUrlPlaceholder": "Opcional: URL pública para características externas"
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"success": "añadido $t(entity.trackWithCount, {\"count\": {{message}} }) a $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })",
|
||||
"title": "añadir a $t(entity.playlist_one)",
|
||||
"title": "añadir a $t(entity.playlist, {\"count\": 1})",
|
||||
"input_skipDuplicates": "saltar duplicados",
|
||||
"input_playlists": "$t(entity.playlist_other)",
|
||||
"create": "Crear $t(entity.playlist_one) {{playlist}}",
|
||||
"searchOrCreate": "Buscar $t(entity.playlist_other) o tipo para crear uno nuevo"
|
||||
"input_playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"create": "Crear $t(entity.playlist, {\"count\": 1}) {{playlist}}",
|
||||
"searchOrCreate": "Buscar $t(entity.playlist, {\"count\": 2}) o escribir para crear uno nuevo"
|
||||
},
|
||||
"updateServer": {
|
||||
"title": "actualizar servidor",
|
||||
@@ -811,12 +874,12 @@
|
||||
},
|
||||
"lyricSearch": {
|
||||
"input_name": "$t(common.name)",
|
||||
"input_artist": "$t(entity.artist_one)",
|
||||
"input_artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"title": "buscar letras"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"title": "editar $t(entity.playlist_one)",
|
||||
"success": "$t(entity.playlist_one) actualizada correctamente",
|
||||
"title": "editar $t(entity.playlist, {\"count\": 1})",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) actualizada correctamente",
|
||||
"publicJellyfinNote": "Jellyfin por alguna razón no expone si una lista de reproducción es pública o no. Si deseas que ésta siga siendo pública, por favor ten seleccionada la siguiente entrada",
|
||||
"editNote": "No se recomiendan las ediciones manuales para grandes listas de reproducción. ¿Seguro que aceptas el riesgo de pérdida de información incurrido por sobrescribir la lista de reproducción existente?"
|
||||
},
|
||||
@@ -848,7 +911,7 @@
|
||||
},
|
||||
"shuffleAll": {
|
||||
"title": "Reproducir aleatorio",
|
||||
"input_genre": "$t(entity.genre_one)",
|
||||
"input_genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"input_limit": "¿Cuántas canciones?",
|
||||
"input_minYear": "Del año",
|
||||
"input_maxYear": "Hasta el año",
|
||||
@@ -866,6 +929,11 @@
|
||||
"input_homepageUrl": "URL de la página de inicio",
|
||||
"input_name": "Nombre",
|
||||
"input_streamUrl": "URL de la transmisión"
|
||||
},
|
||||
"lyricsExport": {
|
||||
"export": "Exportar letras",
|
||||
"input_synced": "Exportar letras sincronizadas",
|
||||
"input_offset": "$t(setting.lyricOffset)"
|
||||
}
|
||||
},
|
||||
"table": {
|
||||
@@ -875,7 +943,7 @@
|
||||
"album": "álbum",
|
||||
"favorite": "favorito",
|
||||
"playCount": "reproducciones",
|
||||
"albumCount": "$t(entity.album_other)",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2})",
|
||||
"releaseYear": "año",
|
||||
"lastPlayed": "última reproducción",
|
||||
"biography": "biografía",
|
||||
@@ -884,14 +952,14 @@
|
||||
"title": "título",
|
||||
"bpm": "lpm",
|
||||
"dateAdded": "fecha de adición",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"songCount": "$t(entity.track, {\"count\": 2})",
|
||||
"trackNumber": "pista",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"albumArtist": "artista del álbum",
|
||||
"path": "ruta",
|
||||
"discNumber": "disco",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"channels": "$t(common.channel, {\"count\": 2})",
|
||||
"size": "$t(common.size)",
|
||||
"codec": "$t(common.codec)",
|
||||
"owner": "Propietario",
|
||||
@@ -904,13 +972,13 @@
|
||||
"dateAdded": "fecha de adición",
|
||||
"bpm": "$t(common.bpm)",
|
||||
"lastPlayed": "última reproducción",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"album": "$t(entity.album_one)",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"biography": "$t(common.biography)",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"channels": "$t(common.channel, {\"count\": 2})",
|
||||
"bitrate": "$t(common.bitrate)",
|
||||
"actions": "$t(common.action_other)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"actions": "$t(common.action, {\"count\": 2})",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"discNumber": "número de disco",
|
||||
"releaseDate": "fecha de lanzamiento",
|
||||
"title": "$t(common.title)",
|
||||
@@ -923,16 +991,18 @@
|
||||
"owner": "$t(common.owner)",
|
||||
"path": "$t(common.path)",
|
||||
"playCount": "número de reproducciones",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"favorite": "$t(common.favorite)",
|
||||
"year": "$t(common.year)",
|
||||
"codec": "$t(common.codec)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"albumCount": "$t(entity.album_other)",
|
||||
"genreBadge": "$t(entity.genre_one) (insignias)",
|
||||
"songCount": "$t(entity.track, {\"count\": 2})",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2})",
|
||||
"genreBadge": "$t(entity.genre, {\"count\": 1}) (insignias)",
|
||||
"image": "Imagen",
|
||||
"bitDepth": "$t(common.bitDepth)",
|
||||
"sampleRate": "$t(common.sampleRate)"
|
||||
"sampleRate": "$t(common.sampleRate)",
|
||||
"titleArtist": "$t(common.title) (artista)",
|
||||
"composer": "Compositor"
|
||||
},
|
||||
"general": {
|
||||
"gap": "$t(common.gap)",
|
||||
@@ -963,7 +1033,8 @@
|
||||
"alternateRowColors": "Colores de fila alternativos",
|
||||
"horizontalBorders": "Bordes de fila",
|
||||
"verticalBorders": "Bordes de columna",
|
||||
"rowHoverHighlight": "Resaltar al pasar el cursor por la fila"
|
||||
"rowHoverHighlight": "Resaltar al pasar el cursor por la fila",
|
||||
"showHeader": "Mostrar cabecera"
|
||||
},
|
||||
"view": {
|
||||
"table": "tabla",
|
||||
@@ -973,7 +1044,7 @@
|
||||
}
|
||||
},
|
||||
"entity": {
|
||||
"smartPlaylist": "$t(entity.playlist_one) inteligente",
|
||||
"smartPlaylist": "$t(entity.playlist, {\"count\": 1}) inteligente",
|
||||
"genre_one": "género",
|
||||
"genre_many": "géneros",
|
||||
"genre_other": "géneros",
|
||||
@@ -1039,7 +1110,7 @@
|
||||
},
|
||||
"releaseType": {
|
||||
"primary": {
|
||||
"album": "$t(entity.album_one)",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"broadcast": "Emisión",
|
||||
"ep": "EP",
|
||||
"other": "Otro",
|
||||
@@ -1084,5 +1155,160 @@
|
||||
"notInTheLast": "no está en el último",
|
||||
"startsWith": "empieza con",
|
||||
"matchesRegex": "coincide con expresión regular"
|
||||
},
|
||||
"datetime": {
|
||||
"minuteShort": "m",
|
||||
"secondShort": "s",
|
||||
"hourShort": "h",
|
||||
"dayShort": "d"
|
||||
},
|
||||
"visualizer": {
|
||||
"visualizerType": "Tipo de visualizador",
|
||||
"copyConfiguration": "Copiar configuración",
|
||||
"pasteConfiguration": "Pegar configuración",
|
||||
"pasteConfigurationPlaceholder": "Pegar configuración de JSON aquí...",
|
||||
"pasteFromClipboard": "Pegar desde el portapapeles",
|
||||
"applyConfiguration": "Aplicar configuración",
|
||||
"configCopied": "Configuración copiada al portapapeles",
|
||||
"configCopyFailed": "Error al copiar la configuración",
|
||||
"configPasted": "Configuración aplicada con éxito",
|
||||
"configPasteFailed": "Error al aplicar la configuración. Por favor revisa el formato.",
|
||||
"configPasteReadFailed": "Error al leer del portapapeles",
|
||||
"general": "General",
|
||||
"mode": "Modo",
|
||||
"mode1To8": "Modo 1 - 8",
|
||||
"mode10": "Modo 10",
|
||||
"barSpace": "Espacio de barra",
|
||||
"lineWidth": "Ancho de línea",
|
||||
"maxFPS": "FPS máximos",
|
||||
"opacity": "Opacidad",
|
||||
"channelLayout": "Diseño del canal",
|
||||
"fillAlpha": "Rellenar alfa",
|
||||
"customGradients": "Degradados personalizados",
|
||||
"addCustomGradient": "Añadir degradado personalizado",
|
||||
"gradientName": "Nombre del degradado",
|
||||
"gradientNamePlaceholder": "Nombre del degradado",
|
||||
"vertical": "Vertical",
|
||||
"horizontal": "Horizontal",
|
||||
"addColor": "Añadir color",
|
||||
"colorStops": "Paradas de color",
|
||||
"position": "Posición",
|
||||
"level": "Nivel",
|
||||
"remove": "Eliminar",
|
||||
"custom": "Personalizado",
|
||||
"builtIn": "Integrado",
|
||||
"colors": "Colores",
|
||||
"colorMode": "Modo de color",
|
||||
"gradient": "Degradado",
|
||||
"gradientLeft": "Izquierda del degradado",
|
||||
"gradientRight": "Derecha del degradado",
|
||||
"fft": "FFT",
|
||||
"fftSize": "Tamaño del FFT",
|
||||
"smoothing": "Suavizado",
|
||||
"frequencyRangeAndScaling": "Rango de frecuencia y escala",
|
||||
"minimumFrequency": "Frecuencia mínima",
|
||||
"maximumFrequency": "Frecuencia máxima",
|
||||
"frequencyScale": "Escala de frecuencia",
|
||||
"sensitivity": "Sensibilidad",
|
||||
"weightingFilter": "Filtro de ponderación",
|
||||
"minimumDecibels": "Decibelios mínimos",
|
||||
"maximumDecibels": "Decibelios máximos",
|
||||
"linearAmplitude": "Amplitud lineal",
|
||||
"linearBoost": "Aumento lineal",
|
||||
"peakBehavior": "Comportamiento del pico",
|
||||
"showPeaks": "Mostrar picos",
|
||||
"fadePeaks": "Picos desvanecidos",
|
||||
"peakLine": "Línea del pico",
|
||||
"gravity": "Gravedad",
|
||||
"peakFadeTime": "Tiempo de desvanecimiento del pico (ms)",
|
||||
"peakHoldTime": "Tiempo de espera del pico (ms)",
|
||||
"radialSpectrum": "Espectro radial",
|
||||
"radial": "Radial",
|
||||
"radialInvert": "Invertir radial",
|
||||
"spinSpeed": "Velocidad de giro",
|
||||
"radius": "Radio",
|
||||
"reflexMirror": "Espejo del reflejo",
|
||||
"reflexFit": "Ajuste del reflejo",
|
||||
"reflexRatio": "Proporción del reflejo",
|
||||
"reflexAlpha": "Alfa del reflejo",
|
||||
"reflexBrightness": "Brillo del reflejo",
|
||||
"mirror": "Espejo",
|
||||
"miscellaneousSettings": "Miscelánea",
|
||||
"alphaBars": "Barras alfa",
|
||||
"ansiBands": "Bandas ANSI",
|
||||
"ledBars": "Barras LED",
|
||||
"trueLeds": "True LED",
|
||||
"options": {
|
||||
"colorMode": {
|
||||
"gradient": "Degradado",
|
||||
"barLevel": "Nivel de barra",
|
||||
"barIndex": "Índice de barra"
|
||||
},
|
||||
"gradient": {
|
||||
"classic": "Clásico",
|
||||
"prism": "Prisma",
|
||||
"rainbow": "Arcoíris",
|
||||
"steelblue": "Azul acero",
|
||||
"orangered": "Naranja rojizo"
|
||||
},
|
||||
"channelLayout": {
|
||||
"single": "Sencillo",
|
||||
"dualCombined": "Doble combinado",
|
||||
"dualHorizontal": "Doble horizontal",
|
||||
"dualVertical": "Doble vertical"
|
||||
},
|
||||
"frequencyScale": {
|
||||
"linear": "Escala lineal",
|
||||
"none": "Ninguna",
|
||||
"log": "Escala de registro",
|
||||
"bark": "Escala Bark",
|
||||
"mel": "Escala Mel"
|
||||
},
|
||||
"weightingFilter": {
|
||||
"none": "Ninguno",
|
||||
"a": "A",
|
||||
"b": "B",
|
||||
"c": "C",
|
||||
"d": "D",
|
||||
"z": "Z"
|
||||
},
|
||||
"mode": {
|
||||
"0": "[0] Frecuencias discretas",
|
||||
"1": "[1] 1/24ª octava / 240 bandas",
|
||||
"2": "[1] 1/12ª octava / 120 bandas",
|
||||
"3": "[3] 1/8ª octava / 80 bandas",
|
||||
"4": "[4] 1/6ª octava / 60 bandas",
|
||||
"5": "[5] 1/4ª octava / 40 bandas",
|
||||
"6": "[6] 1/3ª octava / 30 bandas",
|
||||
"7": "[7] Media octava / 20 bandas",
|
||||
"8": "[8] Octava completa / 10 bandas",
|
||||
"10": "[10] Línea / Gráfico de área"
|
||||
}
|
||||
},
|
||||
"showFPS": "Mostrar FPS",
|
||||
"showScaleX": "Mostrar escala X",
|
||||
"showScaleY": "Mostrar escala Y",
|
||||
"cyclePresets": "Ajustes preestablecidos del ciclo",
|
||||
"cycleTime": "Tiempo del ciclo (segundos)",
|
||||
"includeAllPresets": "Incluir todos los ajustes preestablecidos",
|
||||
"ignoredPresets": "Ajustes preestablecidos ignorados",
|
||||
"selectedPresets": "Ajustes preestablecidos seleccionados",
|
||||
"randomizeNextPreset": "Aleatorizar el siguiente ajuste preestablecido",
|
||||
"blendTime": "Tiempo de mezcla",
|
||||
"presets": "Ajustes preestablecidos",
|
||||
"selectPreset": "Seleccionar ajuste preestablecido",
|
||||
"applyPreset": "Aplicar ajuste preestablecido",
|
||||
"saveAsPreset": "Guardar como ajuste preestablecido",
|
||||
"updatePreset": "Actualizar ajuste preestablecido",
|
||||
"presetName": "Nombre del ajuste preestablecido",
|
||||
"presetNamePlaceholder": "Introduce el nombre del ajuste preestablecido",
|
||||
"pasteGradient": "Pegar degradado",
|
||||
"pasteGradientPlaceholder": "Pegar JSON del degradado aquí...",
|
||||
"outlineBars": "Barras de contorno",
|
||||
"roundBars": "Barras redondeadas",
|
||||
"lowResolution": "Baja resolución",
|
||||
"splitGradient": "Dividir degradado",
|
||||
"noteLabels": "Etiquetas de notas",
|
||||
"lumiBars": "Barras luminiscentes"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,27 +1,39 @@
|
||||
{
|
||||
"action": {
|
||||
"deselectAll": "deshautatu dena",
|
||||
"editPlaylist": "editatu $t(entity.playlist_one)",
|
||||
"editPlaylist": "editatu $t(entity.playlist, {\"count\": 1})",
|
||||
"goToPage": "joan orrira",
|
||||
"moveToNext": "mugitu hurrengora",
|
||||
"moveToBottom": "mugitu behera",
|
||||
"moveToTop": "mugitu gora",
|
||||
"refresh": "$t(common.refresh)",
|
||||
"removeFromFavorites": "kendu $t(entity.favorite_other)-(e)tik",
|
||||
"removeFromPlaylist": "kendu $t(entity.playlist_one)-(e)tik",
|
||||
"removeFromFavorites": "kendu gogokoetatik",
|
||||
"removeFromPlaylist": "kendu $t(entity.playlist, {\"count\": 1})-(e)tik",
|
||||
"removeFromQueue": "kendu ilaratik",
|
||||
"setRating": "ezarri balorazioa",
|
||||
"toggleSmartPlaylistEditor": "txandakatu $t(entity.smartPlaylist) editorea",
|
||||
"viewPlaylists": "ikusi $t(entity.playlist_other)",
|
||||
"viewPlaylists": "ikusi $t(entity.playlist, {\"count\": 2})",
|
||||
"openIn": {
|
||||
"lastfm": "Ireki Last.fm-n",
|
||||
"musicbrainz": "Ireki MusicBrainz-en"
|
||||
},
|
||||
"clearQueue": "garbitu ilara",
|
||||
"createPlaylist": "sortu $t(entity.playlist_one)",
|
||||
"deletePlaylist": "ezabatu $t(entity.playlist_one)",
|
||||
"addToFavorites": "gehitu $t(entity.favorite_other)-(e)ra",
|
||||
"addToPlaylist": "gehitu $t(entity.playlist_one)-(e)ra"
|
||||
"createPlaylist": "sortu $t(entity.playlist, {\"count\": 1})",
|
||||
"deletePlaylist": "ezabatu $t(entity.playlist, {\"count\": 1})",
|
||||
"addToFavorites": "gehitu gogokoetara",
|
||||
"addToPlaylist": "gehitu $t(entity.playlist, {\"count\": 1})ra",
|
||||
"createRadioStation": "sortu $t(entity.radioStation, {\"count\": 1})",
|
||||
"deleteRadioStation": "ezabatu $t(entity.radioStation, {\"count\": 1})",
|
||||
"viewMore": "ikusi gehiago",
|
||||
"shuffle": "nahastu",
|
||||
"selectAll": "aukeratu guztiak",
|
||||
"downloadStarted": "{{count}} elementuren deskarga hasi da",
|
||||
"addOrRemoveFromSelection": "gehitu edo kendu hautapenetik",
|
||||
"selectRangeOfItems": "aukeratu elementu sorta bat",
|
||||
"shuffleAll": "nahastu dena",
|
||||
"shuffleSelected": "nahastu aukeratutak",
|
||||
"moveItems": "elementuak mugitu",
|
||||
"openApplicationDirectory": "ireki aplikazioaren direktorioa"
|
||||
},
|
||||
"common": {
|
||||
"add": "gehitu",
|
||||
@@ -38,7 +50,7 @@
|
||||
"configure": "konfiguratu",
|
||||
"confirm": "berretsi",
|
||||
"create": "sortu",
|
||||
"currentSong": "uneko $t(entity.track_one)",
|
||||
"currentSong": "uneko $t(entity.track, {\"count\": 1})",
|
||||
"decrease": "gutxitu",
|
||||
"delete": "ezabatu",
|
||||
"descending": "beheranzkoa",
|
||||
@@ -55,7 +67,8 @@
|
||||
"filter_other": "iragazkiak",
|
||||
"filters": "iragazkiak",
|
||||
"forceRestartRequired": "berreabiarazi aldaketak aplikatzeko... itxi notifikazioa berreabiarazteko",
|
||||
"setting": "ezarpena",
|
||||
"setting_one": "ezarpenak",
|
||||
"setting_other": "",
|
||||
"share": "partekatu",
|
||||
"action_one": "ekintza",
|
||||
"action_other": "ekintzak",
|
||||
@@ -91,7 +104,7 @@
|
||||
"path": "bidea",
|
||||
"playerMustBePaused": "erreproduzitzailea pausatuta egon behar da",
|
||||
"preview": "aurrebista",
|
||||
"previousSong": "aurreko $t(entity.track_one)",
|
||||
"previousSong": "aurreko $t(entity.track, {\"count\": 1})",
|
||||
"quit": "irten",
|
||||
"random": "ausazkoa",
|
||||
"rating": "balorazioa",
|
||||
@@ -124,7 +137,20 @@
|
||||
"clean": "garbia",
|
||||
"private": "pribatua",
|
||||
"public": "publikoa",
|
||||
"releaseType": "argitalpen mota"
|
||||
"releaseType": "argitalpen mota",
|
||||
"countSelected": "{{count}} hautatuta",
|
||||
"view": "ikuspegia",
|
||||
"externalLinks": "kanpoko estekak",
|
||||
"faster": "azkarrago",
|
||||
"noFilters": "ez dago iragazkirik konfiguratuta",
|
||||
"retry": "saiatu berriro",
|
||||
"slower": "motelago",
|
||||
"itemsMore": "{{count}} gehiago",
|
||||
"sort": "ordenatu",
|
||||
"recordLabel": "diskoetxea",
|
||||
"example": "adibidea",
|
||||
"tableColumns": "taulako zutabeak",
|
||||
"doNotShowAgain": "ez erakutsi hau berriro"
|
||||
},
|
||||
"player": {
|
||||
"repeat": "errepikatu",
|
||||
@@ -151,13 +177,20 @@
|
||||
"queue_remove": "kendu hautatutakoak",
|
||||
"repeat_all": "errepikatu dena",
|
||||
"repeat_off": "errepikapena desgaituta",
|
||||
"shuffle": "erreproduzitu ausaz",
|
||||
"shuffle": "erreproduzitu (ausaz)",
|
||||
"shuffle_off": "auza desgaituta",
|
||||
"skip_back": "saltatu atzeraka",
|
||||
"skip_forward": "saltatu aurreraka",
|
||||
"toggleFullscreenPlayer": "txandakatu pantaila osoko erreproduzitzailea",
|
||||
"viewQueue": "ikusi ilara",
|
||||
"playbackFetchCancel": "honek denbora pixka bat behar du... itxi jakinarazpena bertan behera uzteko"
|
||||
"playbackFetchCancel": "honek denbora pixka bat behar du... itxi jakinarazpena bertan behera uzteko",
|
||||
"lyrics": "letrak",
|
||||
"restoreQueueFromServer": "berrezarri ilara zerbitzaritik",
|
||||
"saveQueueToServer": "gorde ilara zerbitzarira",
|
||||
"addLastShuffled": "azkena (ausaz)",
|
||||
"addNextShuffled": "hurrengoa (ausaz)",
|
||||
"artistRadio": "artista irratia",
|
||||
"trackRadio": "pista irratia"
|
||||
},
|
||||
"table": {
|
||||
"config": {
|
||||
@@ -171,13 +204,26 @@
|
||||
"size": "$t(common.size)",
|
||||
"tableColumns": "taula zutabeak",
|
||||
"itemSize": "elementuaren tamaina (px)",
|
||||
"followCurrentSong": "jarraitu uneko abestia"
|
||||
"followCurrentSong": "jarraitu uneko abestia",
|
||||
"size_default": "lehenetsia",
|
||||
"advancedSettings": "ezarpen aurreratuak",
|
||||
"autoFitColumns": "zutabeak automatikoki doitu",
|
||||
"pinToLeft": "ezkerrera finkatu",
|
||||
"pinToRight": "eskuinera finkatu",
|
||||
"alignLeft": "ezkerrean lerrokatu",
|
||||
"alignCenter": "lerrokatu erdian",
|
||||
"alignRight": "eskuinean lerrokatu",
|
||||
"itemGap": "elementuen arteko tartea (px)",
|
||||
"itemsPerRow": "elementuak errenkada bakoitzeko",
|
||||
"size_large": "handia",
|
||||
"pagination_itemsPerPage": "elementuak orrialde bakoitzeko",
|
||||
"pagination_infinite": "infinitua"
|
||||
},
|
||||
"label": {
|
||||
"actions": "$t(common.action_other)",
|
||||
"album": "$t(entity.album_one)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"biography": "$t(common.biography)",
|
||||
"bitrate": "$t(common.bitrate)",
|
||||
"bpm": "$t(common.bpm)",
|
||||
@@ -185,13 +231,13 @@
|
||||
"codec": "$t(common.codec)",
|
||||
"duration": "$t(common.duration)",
|
||||
"favorite": "$t(common.favorite)",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"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)",
|
||||
"songCount": "$t(entity.track, {\"count\": 2})",
|
||||
"title": "$t(common.title)",
|
||||
"year": "$t(common.year)",
|
||||
"titleCombined": "$t(common.title) (batuta)",
|
||||
@@ -199,25 +245,29 @@
|
||||
"playCount": "erreprodukzio kopurua",
|
||||
"lastPlayed": "azken aldiz entzunda",
|
||||
"discNumber": "disko zenbakia",
|
||||
"dateAdded": "gehitze data"
|
||||
"dateAdded": "gehitze data",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2})",
|
||||
"image": "irudia",
|
||||
"bitDepth": "$t(common.bitDepth)",
|
||||
"sampleRate": "$t(common.sampleRate)"
|
||||
}
|
||||
},
|
||||
"column": {
|
||||
"album": "albuma",
|
||||
"albumCount": "$t(entity.album_other)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2})",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"biography": "biografia",
|
||||
"bitrate": "bit-emaria",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"codec": "$t(common.codec)",
|
||||
"discNumber": "diskoa",
|
||||
"favorite": "gogokoa",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"path": "bidea",
|
||||
"rating": "balorazioa",
|
||||
"releaseYear": "urtea",
|
||||
"size": "$t(common.size)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"songCount": "$t(entity.track, {\"count\": 2})",
|
||||
"title": "tituloa",
|
||||
"trackNumber": "pista",
|
||||
"bpm": "bpm",
|
||||
@@ -226,7 +276,10 @@
|
||||
"releaseDate": "argitalpen data",
|
||||
"lastPlayed": "azken aldiz entzundakoa",
|
||||
"dateAdded": "gehitutako data",
|
||||
"albumArtist": "albumeko artista"
|
||||
"albumArtist": "albumeko artista",
|
||||
"owner": "jabea",
|
||||
"bitDepth": "$t(common.bitDepth)",
|
||||
"sampleRate": "$t(common.sampleRate)"
|
||||
}
|
||||
},
|
||||
"entity": {
|
||||
@@ -258,13 +311,17 @@
|
||||
"play_other": "{{count}} erreprodukzio",
|
||||
"playlistWithCount_one": "erreprodukzio-zerrenda {{count}}",
|
||||
"playlistWithCount_other": "{{count}} erreprodukzio-zerrenda",
|
||||
"smartPlaylist": "$t(entity.playlist_one) adimentsua",
|
||||
"smartPlaylist": "$t(entity.playlist, {\"count\": 1}) adimentsua",
|
||||
"track_one": "pista",
|
||||
"track_other": "pistak",
|
||||
"song_one": "abestia",
|
||||
"song_other": "abestiak",
|
||||
"trackWithCount_one": "pista {{count}}",
|
||||
"trackWithCount_other": "{{count}} pista"
|
||||
"trackWithCount_other": "{{count}} pista",
|
||||
"radioStation_one": "irrati-katea",
|
||||
"radioStation_other": "irrati-kateak",
|
||||
"radioStationWithCount_one": "irrati-kate {{count}}",
|
||||
"radioStationWithCount_other": "{{count}} irrati-kate"
|
||||
},
|
||||
"error": {
|
||||
"apiRouteError": "ezin izan da eskaera bideratu",
|
||||
@@ -290,7 +347,11 @@
|
||||
"badAlbum": "Orrialde hau ikusten ari zara abesti hau album batekoa ez delako. Ziurrenik arazo hau ikusten ari zara zure musika karpetaren goiko mailan abesti bat baduzu. Jellyfinek abestiak karpeta batean badaude taldekatzen ditu bakarrik",
|
||||
"loginRateError": "Saioa hasteko saiakera gehiegi egin dira, saiatu berriro segundo batzuk barru",
|
||||
"notificationDenied": "jakinarazpenetarako baimenak ukatu dira. Ezarpen honek ez du eraginik",
|
||||
"systemFontError": "errore bat gertatu da sistemaren letra-tipoak lortzen saiatzean"
|
||||
"systemFontError": "errore bat gertatu da sistemaren letra-tipoak lortzen saiatzean",
|
||||
"noNetwork": "zerbitzaria ez dago erabilgarri",
|
||||
"noNetworkDescription": "ezin izan da zerbitzari honetara konektatu",
|
||||
"saveQueueFailed": "huts egin du ilara gordetzean",
|
||||
"multipleServerSaveQueueError": "erreprodukzio-ilarak zerbitzarikoak ez diren abesti bat edo gehiago ditu. hau ez da onartzen"
|
||||
},
|
||||
"filter": {
|
||||
"disc": "diskoa",
|
||||
@@ -304,19 +365,19 @@
|
||||
"random": "ausazkoa",
|
||||
"rating": "balorazioa",
|
||||
"trackNumber": "pista",
|
||||
"album": "$t(entity.album_one)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"biography": "biografia",
|
||||
"bitrate": "bit-emaria",
|
||||
"bpm": "bpm-ak",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"comment": "iruzkina",
|
||||
"favorited": "gogoko gisa markatua",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"search": "bilatu",
|
||||
"title": "tituloa",
|
||||
"albumCount": "$t(entity.album_other) kopurua",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2}) kopurua",
|
||||
"communityRating": "komunitatearen balorazioa",
|
||||
"criticRating": "kritikarien balorazioa",
|
||||
"dateAdded": "gehitutako data",
|
||||
@@ -343,9 +404,9 @@
|
||||
"playbackStyle_optionNormal": "normala",
|
||||
"playButtonBehavior_optionPlay": "$t(player.play)",
|
||||
"playButtonBehavior_optionPlayShuffled": "$t(player.shuffle)",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album_one)",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album, {\"count\": 1})",
|
||||
"replayGainMode_optionNone": "$t(common.none)",
|
||||
"replayGainMode_optionTrack": "$t(entity.track_one)",
|
||||
"replayGainMode_optionTrack": "$t(entity.track, {\"count\": 1})",
|
||||
"font": "letra-tipoa",
|
||||
"hotkey_playbackStop": "gelditu",
|
||||
"buttonSize_description": "erreproduzitzailearen barrako botoien tamaina",
|
||||
@@ -519,7 +580,6 @@
|
||||
"playbackStyle_description": "aukeratu audio erreproduzitzailearentzat erabiliko den erreprodukzio estiloa",
|
||||
"playButtonBehavior": "erreprodukzio botoiaren portaera",
|
||||
"playButtonBehavior_description": "ezartzen du erreprodukzio botoiaren portaera lehenetsia abestiak ilaran gehitzean",
|
||||
"playerAlbumArtResolution": "erreproduzitzailearen albumaren arte-azalaren erresoluzioa",
|
||||
"gaplessAudio": "hutsune gabeko audioa",
|
||||
"gaplessAudio_description": "ezartzen du hutsunik gabeko audio ezarpena mpv-rako",
|
||||
"passwordStore": "pasahitzak/biltegi sekretua",
|
||||
@@ -537,7 +597,86 @@
|
||||
"exportImportSettings_control_importText": "inportatu ezarpenak",
|
||||
"exportImportSettings_control_title": "inportatu / esportatu ezarpenak",
|
||||
"exportImportSettings_importBtn": "inportatu ezarpenak",
|
||||
"exportImportSettings_importModalTitle": "inportatu feishin ezarpenak"
|
||||
"exportImportSettings_importModalTitle": "inportatu feishin ezarpenak",
|
||||
"autoDJ_itemCount": "elementu kopurua",
|
||||
"language": "hizkuntza",
|
||||
"queryBuilderCustomFields_inputTag": "etiketa",
|
||||
"logLevel_optionError": "errore bat",
|
||||
"logLevel_optionInfo": "informazioa",
|
||||
"imageResolution_optionTable": "taula",
|
||||
"imageResolution_optionSidebar": "alboko barra",
|
||||
"replayGainClipping": "{{ReplayGain}} mozketa",
|
||||
"replayGainFallback": "{{ReplayGain}} ordezko aukera",
|
||||
"trayEnabled": "erakutsi erretilua",
|
||||
"artistReleaseTypeConfiguration": "artistaren argitalpen motaren konfigurazioa",
|
||||
"artistReleaseTypeConfiguration_description": "konfiguratu zein argitalpen mota erakusten diren, eta zein ordenatan, albumaren artistaren orrian",
|
||||
"useThemeAccentColor": "erabili gaiaren azentu-kolorea",
|
||||
"useThemeAccentColor_description": "erabili hautatutako gaian definitutako kolore nagusia azentu-kolore pertsonalizatuaren ordez",
|
||||
"showRatings": "erakutsi izarren balorazioak",
|
||||
"showRatings_description": "izarren balorazioen funtzioa interfazean agertzen den ala ez kontrolatzen du",
|
||||
"imageResolution": "irudiaren erresoluzioa",
|
||||
"imageResolution_description": "aplikazioan erabilitako irudien erresoluzioa. 0 balioa erabiliz gero, jatorrizko irudiaren erresoluzioa erabiliko da lehenespenez",
|
||||
"followCurrentSong_description": "automatikoki korritu erreprodukzio-ilara uneko abestira",
|
||||
"followCurrentSong": "jarraitu uneko abestia",
|
||||
"lyricOffset_description": "letra zehaztutako milisegundo kopuruarekin desplazatu",
|
||||
"lyricOffset": "letraren desplazamendua (ms)",
|
||||
"mpvExtraParameters": "mpv parametro gehigarriak",
|
||||
"mpvExtraParameters_description": "mpv-ri pasatzeko argumentu gehigarriak",
|
||||
"notify": "abestien jakinarazpenak gaitu",
|
||||
"notify_description": "erakutsi jakinarazpenak uneko abestia aldatzean",
|
||||
"pathReplace": "fitxategiaren bidearen ordezkapena",
|
||||
"pathReplace_description": "ordezkatu zure zerbitzariaren fitxategi-bide lehenetsia",
|
||||
"pathReplace_optionRemovePrefix": "kendu aurrizkia",
|
||||
"pathReplace_optionAddPrefix": "gehitu aurrizkia",
|
||||
"passwordStore_description": "zein pasahitz/sekretu biltegi erabili. aldatu hau pasahitzak gordetzeko arazoak badituzu",
|
||||
"playerFilters": "Iragazi ilarako abestiak",
|
||||
"sidePlayQueueStyle_description": "alboko erreprodukzio-ilararen estiloa ezartzen du",
|
||||
"mediaSession_description": "Windows Media Session integrazioa gaitzen du, multimedia kontrolak eta metadatuak sistemaren bolumenaren gainjartzean eta blokeo pantailan bistaratuz (Windows bakarrik)",
|
||||
"sidePlayQueueStyle": "alboko erreprodukzio-ilarako estiloa",
|
||||
"skipPlaylistPage": "saltatu erreprodukzio-zerrenda orria",
|
||||
"startMinimized_description": "abiarazi aplikazioa sistemaren erretiluan",
|
||||
"startMinimized": "hasi minimizatuta",
|
||||
"transcode": "gaitu transkodetzea",
|
||||
"transcode_description": "formatu ezberdinetara transkodetzea ahalbidetzen du",
|
||||
"transcodeBitrate_description": "transkodetzeko bit-emaria hautatzen du. 0k zerbitzariari aukeratzen uzten diola esan nahi du",
|
||||
"transcodeBitrate": "transkodetzeko bit-emaria",
|
||||
"transcodeFormat_description": "transkodetzeko formatua hautatzen du. utzi hutsik zerbitzariak erabaki dezan",
|
||||
"transcodeFormat": "transkodetzeko formatua",
|
||||
"queryBuilderCustomFields_inputLabel": "etiketa",
|
||||
"autoDJ": "DJ automatikoa",
|
||||
"autoDJ_description": "automatikoki gehitu antzeko abestiak ilaran",
|
||||
"autoDJ_itemCount_description": "DJ automatikoa gaituta dagoenean ilaran gehitzen saiatu diren elementuen kopurua",
|
||||
"autoDJ_timing_description": "DJ automatikoa aktibatu aurretik ilaran geratzen diren abestien kopurua",
|
||||
"analyticsDisable": "Erabileran oinarritutako analisiei uko egin",
|
||||
"analyticsDisable_description": "Erabilera-datu anonimoak garatzaileari bidaltzen zaizkio aplikazioa hobetzen laguntzeko",
|
||||
"contextMenu_description": "elementu batean eskuineko botoiarekin klik egitean menuan agertzen diren elementuak ezkutatzeko aukera ematen dizu. hautatuta ez dauden elementuak ezkutatuta egongo dira",
|
||||
"enableAutoTranslation_description": "Gaitu itzulpena automatikoki letra kargatzen denean",
|
||||
"exportImportSettings_control_description": "JSON bidez ezarpenak esportatu eta inportatu",
|
||||
"exportImportSettings_destructiveWarning": "Ezarpenak inportatzea arriskutsua da, mesedez, berrikusi goikoa beheko \"inportatu\" klikatu aurretik!",
|
||||
"exportImportSettings_importSuccess": "ezarpenak behar bezala inportatu dira!",
|
||||
"exportImportSettings_offendingKeyError": "\"{{offendingKey}}\" okerra da - {{reason}}",
|
||||
"hotkey_listPlayDefault": "zerrenda erreproduzitu",
|
||||
"hotkey_listPlayLast": "zerrenda erreproduzitu amaieran",
|
||||
"hotkey_listPlayNow": "zerrenda erreproduzitu orain",
|
||||
"logLevel": "erregistro maila",
|
||||
"logLevel_description": "Bistaratzeko erregistroen gutxieneko maila ezartzen du. Debug-ek erregistro guztiak erakusten ditu, «erroreak» erroreak bakarrik erakusten ditu",
|
||||
"logLevel_optionDebug": "arazketa",
|
||||
"playerFilters_description": "saltatu abestiak ilaran gehitzea irizpide hauen arabera",
|
||||
"artistRadioCount_description": "artista eta abestien irratian bilatu beharreko abesti kopurua ezartzen du",
|
||||
"artistRadioCount": "artista/abesti irratiko kopurua",
|
||||
"imageResolution_optionItemCard": "elementu txartela",
|
||||
"imageResolution_optionHeader": "goiburua",
|
||||
"imageResolution_optionFullScreenPlayer": "pantaila osoko erreproduzitzailea",
|
||||
"showVisualizerInSidebar": "erakutsi bistaratzailea erreproduzitzailearen alboko barran",
|
||||
"combinedLyricsAndVisualizer_description": "konbinatu letrak eta bistaratzailea panel berean",
|
||||
"combinedLyricsAndVisualizer": "konbinatu letrak eta bistaratzailea erreproduzitzailearen alboko barran",
|
||||
"preventSleepOnPlayback_description": "saihestu pantaila lotan jartzea musika erreproduzitzen ari den bitartean",
|
||||
"remotePassword_description": "urruneko kontrol zerbitzariaren pasahitza ezartzen du. Kredentzial hauek modu ez-seguruan transferitzen dira lehenespenez, beraz, axola ez zaizun pasahitz bakarra erabili beharko zenuke",
|
||||
"remotePassword": "urruneko kontrol zerbitzariaren pasahitza",
|
||||
"remotePort_description": "urruneko kontrol zerbitzariaren portua ezartzen du",
|
||||
"remotePort": "urruneko kontrol zerbitzariaren ataka",
|
||||
"remoteUsername_description": "urruneko kontrol zerbitzariaren erabiltzaile-izena ezartzen du. Erabiltzaile-izena eta pasahitza hutsik badaude, autentifikazioa desgaituta egongo da",
|
||||
"remoteUsername": "urruneko kontrol zerbitzariaren erabiltzaile-izena"
|
||||
},
|
||||
"form": {
|
||||
"addServer": {
|
||||
@@ -553,26 +692,27 @@
|
||||
"input_legacyAuthentication": "gaitu zaharkitutako autentifikazioa",
|
||||
"success": "zerbitzaria behar bezala gehitu da",
|
||||
"input_preferInstantMix": "nahiago izan berehalako nahasketa",
|
||||
"input_preferInstantMixDescription": "erabili berehalako nahasketa soilik antzeko abestiak lortzeko. erabilgarria portaera hau aldatzen duten pluginak badituzu"
|
||||
"input_preferInstantMixDescription": "erabili berehalako nahasketa soilik antzeko abestiak lortzeko. erabilgarria portaera hau aldatzen duten pluginak badituzu",
|
||||
"input_remoteUrl": "URL publikoa"
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"input_playlists": "$t(entity.playlist_other)",
|
||||
"input_playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"success": "$t(entity.trackWithCount, {\"count\": {{message}} }) gehitu da $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })-ra",
|
||||
"input_skipDuplicates": "saltatu bikoiztuak",
|
||||
"title": "gehitu $t(entity.playlist_one)-(a)ri",
|
||||
"create": "sortu $t(entity.playlist_one) {{playlist}}",
|
||||
"searchOrCreate": "bilatu $t(entity.playlist_other) edo idatzi berri bat sortzeko"
|
||||
"title": "gehitu $t(entity.playlist, {\"count\": 1})-(a)ri",
|
||||
"create": "sortu $t(entity.playlist, {\"count\": 1}) {{playlist}}",
|
||||
"searchOrCreate": "bilatu $t(entity.playlist, {\"count\": 2}) edo idatzi berri bat sortzeko"
|
||||
},
|
||||
"createPlaylist": {
|
||||
"input_description": "$t(common.description)",
|
||||
"input_name": "$t(common.name)",
|
||||
"input_owner": "$t(common.owner)",
|
||||
"input_public": "publikoa",
|
||||
"title": "$t(entity.playlist_one) sortu",
|
||||
"success": "$t(entity.playlist_one) behar bezala sortu da"
|
||||
"title": "$t(entity.playlist, {\"count\": 1}) sortu",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) behar bezala sortu da"
|
||||
},
|
||||
"lyricSearch": {
|
||||
"input_artist": "$t(entity.artist_one)",
|
||||
"input_artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"input_name": "$t(common.name)",
|
||||
"title": "letra bilatu"
|
||||
},
|
||||
@@ -585,19 +725,22 @@
|
||||
"createFailed": "partekatzea sortzeak huts egin du (partekatzea gaituta al dago?)"
|
||||
},
|
||||
"deletePlaylist": {
|
||||
"success": "$t(entity.playlist_one) behar bezala ezabatu da",
|
||||
"title": "$t(entity.playlist_one) ezabatu",
|
||||
"input_confirm": "idatzi $t(entity.playlist_one)-(a)ren izena berresteko"
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) behar bezala ezabatu da",
|
||||
"title": "$t(entity.playlist, {\"count\": 1}) ezabatu",
|
||||
"input_confirm": "idatzi $t(entity.playlist, {\"count\": 1})-(a)ren izena berresteko"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"success": "$t(entity.playlist_one) behar bezala eguneratu da",
|
||||
"title": "$t(entity.playlist_one) editatu",
|
||||
"publicJellyfinNote": "Arrazoiren batengatik, Jellyfin ez du erakusten erreprodukzio-zerrendak publikoak diren edo ez. Hau publiko izaten jarraitzea nahi baduzu, hautatu sarrera hau"
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) behar bezala eguneratu da",
|
||||
"title": "$t(entity.playlist, {\"count\": 1}) editatu",
|
||||
"publicJellyfinNote": "Arrazoiren batengatik, Jellyfin ez du erakusten erreprodukzio-zerrendak publikoak diren edo ez. Hau publiko izaten jarraitzea nahi baduzu, hautatu sarrera hau",
|
||||
"editNote": "ez da gomendatzen eskuzko edizioak egitea erreprodukzio-zerrenda handietarako. ziur zaude onartzen duzula lehendik dagoen erreprodukzio-zerrenda gainidazteagatik datuak galtzeko arriskua?"
|
||||
},
|
||||
"queryEditor": {
|
||||
"title": "kontsulta editorea",
|
||||
"input_optionMatchAll": "guztiak bat etorri",
|
||||
"input_optionMatchAny": "edozeinekin bat etorri"
|
||||
"input_optionMatchAny": "edozeinekin bat etorri",
|
||||
"resetToDefault": "lehenetsitako egoerara berrezarri",
|
||||
"clearFilters": "garbitu iragazkiak"
|
||||
},
|
||||
"updateServer": {
|
||||
"success": "zerbitzaria behar bezala eguneratu da",
|
||||
@@ -607,25 +750,50 @@
|
||||
"title": "modu pribatua",
|
||||
"enabled": "modu pribatua gaituta, erreprodukzio egoera kanpoko integrazioetatik ezkutatuta dago orain",
|
||||
"disabled": "modu pribatua desgaituta, erreprodukzio egoera ikusgai dago orain gaitutako kanpoko integrazioentzat"
|
||||
},
|
||||
"largeFetchConfirmation": {
|
||||
"title": "gehitu elementuak ilaran"
|
||||
},
|
||||
"createRadioStation": {
|
||||
"input_homepageUrl": "hasierako orriaren URLa",
|
||||
"input_name": "izena",
|
||||
"title": "irrati-katea sortu",
|
||||
"success": "irrati-katea behar bezala sortu da"
|
||||
},
|
||||
"lyricsExport": {
|
||||
"export": "esportatu letrak",
|
||||
"input_synced": "esportatu sinkronizatutako letrak",
|
||||
"input_offset": "$t(setting.lyricOffset)"
|
||||
},
|
||||
"shuffleAll": {
|
||||
"input_genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"title": "ausaz erreproduzitu",
|
||||
"input_limit": "zenbat abesti?",
|
||||
"input_played_optionAll": "pista guztiak",
|
||||
"input_played_optionUnplayed": "erreproduzitu gabeko pistak bakarrik",
|
||||
"input_played_optionPlayed": "erreproduzitutako pistak bakarrik"
|
||||
},
|
||||
"saveQueue": {
|
||||
"success": "erreprodukzio-ilara zerbitzarian gordeta"
|
||||
}
|
||||
},
|
||||
"page": {
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
"title": "$t(entity.albumArtist, {\"count\": 2})"
|
||||
},
|
||||
"albumDetail": {
|
||||
"released": "argitaratuta",
|
||||
"moreFromArtist": "$t(entity.artist_one) honetatik gehiago",
|
||||
"moreFromArtist": "$t(entity.artist, {\"count\": 1}) honetatik gehiago",
|
||||
"moreFromGeneric": "{{item}}-(e)tik gehiago"
|
||||
},
|
||||
"albumList": {
|
||||
"title": "$t(entity.album_other)",
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)",
|
||||
"title": "$t(entity.album, {\"count\": 2})",
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album, {\"count\": 2})",
|
||||
"artistAlbums": "{{artist}}-(a)ren albumak"
|
||||
},
|
||||
"appMenu": {
|
||||
"quit": "$t(common.quit)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"collapseSidebar": "tolestu alboko barra",
|
||||
"expandSidebar": "zabaldu alboko barra",
|
||||
"goBack": "atzera",
|
||||
@@ -635,7 +803,11 @@
|
||||
"privateModeOn": "aktibatu modu pribatua",
|
||||
"selectServer": "aukeratu zerbitzaria",
|
||||
"version": "bertsioa {{version}}",
|
||||
"openBrowserDevtools": "ireki nabigatzailearen garapen tresnak"
|
||||
"openBrowserDevtools": "ireki nabigatzailearen garapen tresnak",
|
||||
"commandPalette": "ireki komando-paleta",
|
||||
"noMusicFolder": "ez da musika karpetarik hautatu",
|
||||
"selectMusicFolder": "aukeratu musika karpeta",
|
||||
"multipleMusicFolders": "{{count}} musika karpeta aukeratuta"
|
||||
},
|
||||
"manageServers": {
|
||||
"url": "URLa",
|
||||
@@ -667,9 +839,10 @@
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"numberSelected": "{{count}} hautatuta",
|
||||
"shareItem": "partekatu elementua",
|
||||
"goToAlbum": "joan $t(entity.album_one)-(e)ra",
|
||||
"goToAlbum": "joan $t(entity.album, {\"count\": 1})-(e)ra",
|
||||
"goToAlbumArtist": "joan albumera",
|
||||
"showDetails": "informazioa lortu"
|
||||
"showDetails": "informazioa lortu",
|
||||
"moveItems": "$t(action.moveItems)"
|
||||
},
|
||||
"fullscreenPlayer": {
|
||||
"config": {
|
||||
@@ -695,9 +868,9 @@
|
||||
"noLyrics": "ez da letrarik aurkitu"
|
||||
},
|
||||
"genreList": {
|
||||
"title": "$t(entity.genre_other)",
|
||||
"showAlbums": "erakutsi $t(entity.genre_one) $t(entity.album_other)",
|
||||
"showTracks": "erakutsi $t(entity.genre_one) $t(entity.track_other)"
|
||||
"title": "$t(entity.genre, {\"count\": 2})",
|
||||
"showAlbums": "erakutsi $t(entity.genre, {\"count\": 1}) $t(entity.album, {\"count\": 2})",
|
||||
"showTracks": "erakutsi $t(entity.genre, {\"count\": 1}) $t(entity.track, {\"count\": 2})"
|
||||
},
|
||||
"globalSearch": {
|
||||
"title": "komandoak",
|
||||
@@ -713,48 +886,68 @@
|
||||
"newlyAdded": "azken aldian gehitutako argitalpenak",
|
||||
"recentlyPlayed": "azken aldian entzundakoak",
|
||||
"recentlyReleased": "azken aldian argitaratutak",
|
||||
"explore": "arakatu zure liburutegitik"
|
||||
"explore": "arakatu zure liburutegitik",
|
||||
"genres": "$t(entity.genre, {\"count\": 2})"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist_other)"
|
||||
"title": "$t(entity.playlist, {\"count\": 2})"
|
||||
},
|
||||
"setting": {
|
||||
"advanced": "aurreratua",
|
||||
"generalTab": "orokorra",
|
||||
"playbackTab": "erreprodukzioa",
|
||||
"windowTab": "leihoa",
|
||||
"hotkeysTab": "laster-teklak"
|
||||
"hotkeysTab": "laster-teklak",
|
||||
"cache": "katxea",
|
||||
"application": "aplikazioa",
|
||||
"theme": "gaia",
|
||||
"sidebar": "alboko barra",
|
||||
"exportImport": "inportatu/esportatu",
|
||||
"scrobble": "scrobble",
|
||||
"audio": "audioa",
|
||||
"lyrics": "letrak",
|
||||
"discord": "discord",
|
||||
"playerFilters": "erreproduzitzailearen iragazkiak",
|
||||
"updates": "eguneraketa",
|
||||
"queryBuilder": "kontsulta-sortzailea",
|
||||
"controls": "kontrolak",
|
||||
"remote": "urrunekoa",
|
||||
"lyricsDisplay": "erakutsi letrak"
|
||||
},
|
||||
"sidebar": {
|
||||
"albumArtists": "$t(entity.albumArtist_other)",
|
||||
"albums": "$t(entity.album_other)",
|
||||
"artists": "$t(entity.artist_other)",
|
||||
"folders": "$t(entity.folder_other)",
|
||||
"genres": "$t(entity.genre_other)",
|
||||
"albumArtists": "$t(entity.albumArtist, {\"count\": 2})",
|
||||
"albums": "$t(entity.album, {\"count\": 2})",
|
||||
"artists": "$t(entity.artist, {\"count\": 2})",
|
||||
"folders": "$t(entity.folder, {\"count\": 2})",
|
||||
"genres": "$t(entity.genre, {\"count\": 2})",
|
||||
"home": "$t(common.home)",
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"search": "$t(common.search)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"tracks": "$t(entity.track_other)",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"tracks": "$t(entity.track, {\"count\": 2})",
|
||||
"myLibrary": "nire liburutegia",
|
||||
"nowPlaying": "orain erreproduzitzen",
|
||||
"shared": "partekatutako $t(entity.playlist_other)"
|
||||
"shared": "partekatutako $t(entity.playlist, {\"count\": 2})",
|
||||
"favorites": "$t(entity.favorite, {\"count\": 2})",
|
||||
"radio": "$t(entity.radioStation, {\"count\": 2})"
|
||||
},
|
||||
"trackList": {
|
||||
"title": "$t(entity.track_other)",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track_other)",
|
||||
"title": "$t(entity.track, {\"count\": 2})",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track, {\"count\": 2})",
|
||||
"artistTracks": "{{artist}}-(r)en abestiak"
|
||||
},
|
||||
"albumArtistDetail": {
|
||||
"about": "{{artist}}-(r)i buruz",
|
||||
"relatedArtists": "erlazionatutako $t(entity.artist_other)",
|
||||
"relatedArtists": "erlazionatutako $t(entity.artist, {\"count\": 2})",
|
||||
"topSongs": "abesti nagusiak",
|
||||
"topSongsFrom": "{{title}}-(a)ren abesti nagusiak",
|
||||
"viewAll": "ikusi guztiak",
|
||||
"viewAllTracks": "ikusi $t(entity.track_other) guztiak",
|
||||
"viewAllTracks": "ikusi $t(entity.track, {\"count\": 2}) guztiak",
|
||||
"appearsOn": "agertzen da hemen",
|
||||
"recentReleases": "azken argitalpenak",
|
||||
"viewDiscography": "ikusi diskografia"
|
||||
"viewDiscography": "ikusi diskografia",
|
||||
"groupingTypeAll": "argitalpen mota guztiak",
|
||||
"groupingTypePrimary": "argitalpen mota nagusiak"
|
||||
},
|
||||
"itemDetail": {
|
||||
"copyPath": "kopiatu bidea arbelean",
|
||||
@@ -763,18 +956,148 @@
|
||||
},
|
||||
"playlist": {
|
||||
"reorder": "berrantolaketa IDaren arabera ordenatzean bakarrik gaituta dago"
|
||||
},
|
||||
"folderList": {
|
||||
"title": "$t(entity.folder, {\"count\": 2})"
|
||||
},
|
||||
"favorites": {
|
||||
"title": "$t(entity.favorite, {\"count\": 2})"
|
||||
},
|
||||
"radioList": {
|
||||
"title": "irrati-kateak"
|
||||
}
|
||||
},
|
||||
"releaseType": {
|
||||
"primary": {
|
||||
"album": "$t(entity.album_one)",
|
||||
"other": "bestelakoa"
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"other": "bestelakoa",
|
||||
"ep": "ep"
|
||||
},
|
||||
"secondary": {
|
||||
"compilation": "konpilazioa",
|
||||
"audiobook": "audioliburua",
|
||||
"interview": "elkarrizketa",
|
||||
"remix": "nahasketa"
|
||||
"remix": "nahasketa",
|
||||
"djMix": "dj nahasketa"
|
||||
}
|
||||
},
|
||||
"datetime": {
|
||||
"minuteShort": "m",
|
||||
"secondShort": "s",
|
||||
"hourShort": "h",
|
||||
"dayShort": "d"
|
||||
},
|
||||
"queryBuilder": {
|
||||
"customTags": "etiketa pertsonalizatutak",
|
||||
"standardTags": "etiketa estandarrak"
|
||||
},
|
||||
"filterOperator": {
|
||||
"is": "da",
|
||||
"contains": "dauka",
|
||||
"notContains": "ez dauka",
|
||||
"startsWith": "honekin hasten da",
|
||||
"endsWith": "honekin amaitzen da",
|
||||
"isNot": "ez da"
|
||||
},
|
||||
"visualizer": {
|
||||
"general": "Orokorra",
|
||||
"mode": "Modua",
|
||||
"vertical": "Bertikala",
|
||||
"horizontal": "Horizontala",
|
||||
"position": "Posizioa",
|
||||
"level": "Maila",
|
||||
"remove": "Kendu",
|
||||
"custom": "Pertsonalizatua",
|
||||
"builtIn": "Barneratua",
|
||||
"colors": "Koloreak",
|
||||
"gradient": "Gradientea",
|
||||
"fft": "FFT",
|
||||
"sensitivity": "Sentikortasuna",
|
||||
"smoothing": "Leuntzea",
|
||||
"gravity": "Grabitatea",
|
||||
"radial": "Erradiala",
|
||||
"radius": "Erradioa",
|
||||
"mirror": "Ispilua",
|
||||
"options": {
|
||||
"colorMode": {
|
||||
"gradient": "Gradientea",
|
||||
"barIndex": "Barra-indizea",
|
||||
"barLevel": "Barra-maila"
|
||||
},
|
||||
"gradient": {
|
||||
"classic": "Klasikoa",
|
||||
"prism": "Prisma",
|
||||
"rainbow": "Ostadarra",
|
||||
"orangered": "Laranja-gorria"
|
||||
},
|
||||
"weightingFilter": {
|
||||
"none": "Bat ere ez",
|
||||
"a": "A",
|
||||
"b": "B",
|
||||
"c": "C",
|
||||
"d": "D",
|
||||
"z": "Z"
|
||||
},
|
||||
"mode": {
|
||||
"0": "[0] Maiztasun Diskretuak",
|
||||
"1": "[1] 1/24 oktaba / 240 banda",
|
||||
"2": "[2] 1/12 oktaba / 120 banda",
|
||||
"3": "[3] 1/8 oktaba / 80 banda",
|
||||
"4": "[4] 1/6ko oktaba / 60 banda",
|
||||
"5": "[5] 1/4 oktaba / 40 banda",
|
||||
"6": "[6] 1/3 oktaba / 30 banda",
|
||||
"7": "[7] Oktaba erdi / 20 banda",
|
||||
"8": "[8] Oktaba osoa / 10 banda",
|
||||
"10": "[10] Lerroa / Azalera grafikoa"
|
||||
},
|
||||
"frequencyScale": {
|
||||
"none": "Bat ere ez",
|
||||
"linear": "Eskala Lineala",
|
||||
"bark": "Bark Eskala",
|
||||
"mel": "Mel Eskala"
|
||||
}
|
||||
},
|
||||
"opacity": "Opakotasuna",
|
||||
"minimumFrequency": "Gutxieneko Maiztasuna",
|
||||
"maximumFrequency": "Gehienezko Maiztasuna",
|
||||
"frequencyScale": "Maiztasun Eskala",
|
||||
"weightingFilter": "Ponderazio-iragazkia",
|
||||
"minimumDecibels": "Gutxieneko Dezibelioak",
|
||||
"maximumDecibels": "Gehienezko Dezibelioak",
|
||||
"linearAmplitude": "Anplitude Lineala",
|
||||
"linearBoost": "Bultzada Lineala",
|
||||
"showPeaks": "Erakutsi Gailurrak",
|
||||
"configCopied": "Konfigurazioa arbelean kopiatu da",
|
||||
"configCopyFailed": "Konfigurazioa kopiatzeak huts egin du",
|
||||
"configPasted": "Konfigurazioa behar bezala aplikatu da",
|
||||
"configPasteFailed": "Konfigurazioa aplikatzeak huts egin du. Mesedez, egiaztatu formatua.",
|
||||
"configPasteReadFailed": "Arbelatik irakurtzeak huts egin du",
|
||||
"colorMode": "Kolore Modua",
|
||||
"fftSize": "FFT tamaina",
|
||||
"frequencyRangeAndScaling": "Maiztasun-tartea eta eskalatzea",
|
||||
"showScaleY": "Erakutsi Y Eskala",
|
||||
"pasteGradientPlaceholder": "Itsatsi JSON gradientea hemen...",
|
||||
"pasteGradient": "Itsatsi Gradientea",
|
||||
"addColor": "Gehitu Kolorea",
|
||||
"colorStops": "Kolore Geldialdiak",
|
||||
"gradientNamePlaceholder": "Gradientearen Izena",
|
||||
"gradientName": "Gradientearen Izena",
|
||||
"addCustomGradient": "Gehitu Gradiente Pertsonalizatua",
|
||||
"customGradients": "Gradiente Pertsonalizatuak",
|
||||
"maxFPS": "FPS maximoak",
|
||||
"channelLayout": "Kanalaren Diseinua",
|
||||
"lineWidth": "Lerroaren Zabalera",
|
||||
"presetNamePlaceholder": "Sartu aurrezarpenaren izena",
|
||||
"presetName": "Aurrezarpenaren Izena",
|
||||
"applyConfiguration": "Aplikatu konfigurazioa",
|
||||
"pasteFromClipboard": "Itsatsi Arbeletik",
|
||||
"pasteConfigurationPlaceholder": "Itsatsi JSON konfigurazioa hemen...",
|
||||
"pasteConfiguration": "Itsatsi Konfigurazioa",
|
||||
"copyConfiguration": "Kopiatu Konfigurazioa",
|
||||
"updatePreset": "Aurrezarpena Eguneratu",
|
||||
"saveAsPreset": "Aurrezarpen gisa gorde",
|
||||
"applyPreset": "Aurrezarpena Aplikatu",
|
||||
"selectPreset": "Aukeratu Aurrezarpena",
|
||||
"presets": "Aurrezarpenak"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,23 +33,23 @@
|
||||
"muted": "بیصدا"
|
||||
},
|
||||
"action": {
|
||||
"editPlaylist": "ویرایش $t(entity.playlist_one)",
|
||||
"editPlaylist": "ویرایش $t(entity.playlist, {\"count\": 1})",
|
||||
"goToPage": "برو به صفحهٔ",
|
||||
"moveToTop": "انتقال به بالا",
|
||||
"clearQueue": "خالی کردن صف",
|
||||
"addToFavorites": "افزودن به $t(entity.favorite_other)",
|
||||
"addToPlaylist": "افزودن به $t(entity.playlist_one)",
|
||||
"createPlaylist": "ساخت $t(entity.playlist_one)",
|
||||
"removeFromPlaylist": "حذف از $t(entity.playlist_one)",
|
||||
"viewPlaylists": "نمایش $t(entity.playlist_other)",
|
||||
"addToFavorites": "افزودن به $t(entity.favorite, {\"count\": 2})",
|
||||
"addToPlaylist": "افزودن به $t(entity.playlist, {\"count\": 1})",
|
||||
"createPlaylist": "ساخت $t(entity.playlist, {\"count\": 1})",
|
||||
"removeFromPlaylist": "حذف از $t(entity.playlist, {\"count\": 1})",
|
||||
"viewPlaylists": "نمایش $t(entity.playlist, {\"count\": 2})",
|
||||
"refresh": "$t(common.refresh)",
|
||||
"deletePlaylist": "حذف $t(entity.playlist_one)",
|
||||
"deletePlaylist": "حذف $t(entity.playlist, {\"count\": 1})",
|
||||
"removeFromQueue": "حذف از صف",
|
||||
"deselectAll": "لغو انتخاب همه",
|
||||
"moveToBottom": "انتقال به پایین",
|
||||
"setRating": "تعیین امتیاز",
|
||||
"toggleSmartPlaylistEditor": "تغییر ویرایشگر $t(entity.smartPlaylist)",
|
||||
"removeFromFavorites": "حذف از $t(entity.favorite_other)",
|
||||
"removeFromFavorites": "حذف از $t(entity.favorite, {\"count\": 2})",
|
||||
"openIn": {
|
||||
"lastfm": "باز کردن در Last.fm",
|
||||
"musicbrainz": "باز کردن در MusicBranz"
|
||||
@@ -78,14 +78,14 @@
|
||||
"hotkey_globalSearch": "جست و جوی سراسری",
|
||||
"disableAutomaticUpdates": "غیرفعال کردن بهروزرسانی خودکار",
|
||||
"exitToTray_description": "خروج از اپلیکیشن به system tray",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album_one)",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album, {\"count\": 1})",
|
||||
"discordUpdateInterval_description": "فاصلهٔ بین هر به روزرسانی به ثانیه (حداقل ۱۵ ثانیه)",
|
||||
"audioExclusiveMode": "حالت اختصاصی صدا",
|
||||
"remotePassword": "رمز عبور کنترل از راه دور",
|
||||
"language_description": "زبان اپلیکیشن را معین میکند $t(common.restartRequired)",
|
||||
"hotkey_rate3": "امتیاز ۳ ستاره",
|
||||
"font": "قلم",
|
||||
"replayGainMode_optionTrack": "$t(entity.track_one)",
|
||||
"replayGainMode_optionTrack": "$t(entity.track, {\"count\": 1})",
|
||||
"hotkey_toggleFullScreenPlayer": "تغییر به پخشکنندهٔ تمامصفحه",
|
||||
"hotkey_localSearch": "جست و جو در صفحه",
|
||||
"hotkey_toggleQueue": "تغییر صف",
|
||||
@@ -186,7 +186,7 @@
|
||||
"left": "چپ",
|
||||
"save": "ذخیره",
|
||||
"right": "راست",
|
||||
"currentSong": "فعلی $t(entity.track_one)",
|
||||
"currentSong": "فعلی $t(entity.track, {\"count\": 1})",
|
||||
"collapse": "بستن",
|
||||
"trackNumber": "قطعه",
|
||||
"descending": "نزولی",
|
||||
@@ -239,7 +239,7 @@
|
||||
"none": "هیچ",
|
||||
"menu": "منو",
|
||||
"restartRequired": "راهاندازی دوباره لازم است",
|
||||
"previousSong": "$t(entity.track_one) پیشین",
|
||||
"previousSong": "$t(entity.track, {\"count\": 1}) پیشین",
|
||||
"noResultsFromQuery": "جستوجو نتیجهای نداشت",
|
||||
"quit": "خروج",
|
||||
"expand": "گسترش",
|
||||
@@ -256,7 +256,8 @@
|
||||
"albumPeak": "اوج آلبوم",
|
||||
"mbid": "شناسهی MusicBrainz",
|
||||
"reload": "بارگذاری مجدد",
|
||||
"setting": "پیکربندی",
|
||||
"setting_one": "پیکربندی",
|
||||
"setting_other": "",
|
||||
"trackGain": "گین قطعه",
|
||||
"trackPeak": "اوج قطعه",
|
||||
"translation": "ترجمه",
|
||||
@@ -301,16 +302,16 @@
|
||||
"rating": "امتیاز",
|
||||
"search": "جستوجو",
|
||||
"bitrate": "بیتریت",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"recentlyAdded": "به تازگی افزوده شده",
|
||||
"note": "توجه",
|
||||
"name": "نام",
|
||||
"dateAdded": "تاریخ افزوده شدن",
|
||||
"releaseDate": "تاریخ انتشار",
|
||||
"albumCount": "$t(entity.album_other) عدد",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2}) عدد",
|
||||
"path": "مسیر",
|
||||
"favorited": "موردعلاقه",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"isRecentlyPlayed": "به تازگی پخش شده است",
|
||||
"isFavorited": "موردعلاقه است",
|
||||
"bpm": "bpm",
|
||||
@@ -319,7 +320,7 @@
|
||||
"disc": "دیسک",
|
||||
"biography": "زندگینامه",
|
||||
"songCount": "تعداد ترانه",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"duration": "مدت",
|
||||
"isPublic": "عمومی است",
|
||||
"random": "تصادفی",
|
||||
@@ -327,23 +328,23 @@
|
||||
"toYear": "تا سال",
|
||||
"fromYear": "از سال",
|
||||
"criticRating": "امتیاز منتقدین",
|
||||
"album": "$t(entity.album_one)",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"trackNumber": "قطعه",
|
||||
"communityRating": "رتبه بندی جامعه",
|
||||
"isCompilation": "مخلوط است"
|
||||
},
|
||||
"form": {
|
||||
"deletePlaylist": {
|
||||
"title": "حذف $t(entity.playlist_one)",
|
||||
"success": "$t(entity.playlist_one) حذف شد",
|
||||
"input_confirm": "برای تایید، نام $t(entity.playlist_one) را وارد کنید"
|
||||
"title": "حذف $t(entity.playlist, {\"count\": 1})",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) حذف شد",
|
||||
"input_confirm": "برای تایید، نام $t(entity.playlist, {\"count\": 1}) را وارد کنید"
|
||||
},
|
||||
"createPlaylist": {
|
||||
"input_description": "$t(common.description)",
|
||||
"title": "ساخت $t(entity.playlist_one)",
|
||||
"title": "ساخت $t(entity.playlist, {\"count\": 1})",
|
||||
"input_public": "عمومی",
|
||||
"input_name": "$t(common.name)",
|
||||
"success": "$t(entity.playlist_one) ساخته شد",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) ساخته شد",
|
||||
"input_owner": "$t(common.owner)"
|
||||
},
|
||||
"addServer": {
|
||||
@@ -360,19 +361,19 @@
|
||||
"ignoreSsl": "نادیده گرفتن ssl ($t(common.restartRequired))"
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"success": "$t(entity.song_other) به {{numOfPlaylists}}$t(entity.playlist_other) افزوده شد",
|
||||
"title": "افزودن به $t(entity.playlist_one)",
|
||||
"input_playlists": "$t(entity.playlist_other)",
|
||||
"success": "$t(entity.song, {\"count\": 2}) به {{numOfPlaylists}}$t(entity.playlist, {\"count\": 2}) افزوده شد",
|
||||
"title": "افزودن به $t(entity.playlist, {\"count\": 1})",
|
||||
"input_playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"input_skipDuplicates": "پرش از تکراریها"
|
||||
},
|
||||
"lyricSearch": {
|
||||
"input_name": "$t(common.name)",
|
||||
"input_artist": "$t(entity.artist_one)",
|
||||
"input_artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"title": "جستوجو در متن شعر"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"title": "ویرایش $t(entity.playlist_one)",
|
||||
"success": "$t(entity.playlist_one) با موفقیت بروزرسانی شد",
|
||||
"title": "ویرایش $t(entity.playlist, {\"count\": 1})",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) با موفقیت بروزرسانی شد",
|
||||
"publicJellyfinNote": "جلیفین به دلیلی اینکه فهرست پخش عمومیست یا خصوصی را فاش نمیکند. اگر میخواهید این عمومی باقی بماند، لطفاٌ ورودی پیشرو را منتخب داشته باشید"
|
||||
},
|
||||
"queryEditor": {
|
||||
@@ -417,7 +418,7 @@
|
||||
"artistWithCount_other": "{{count}} هنرمند",
|
||||
"folder_one": "پوشه",
|
||||
"folder_other": "پوشهها",
|
||||
"smartPlaylist": "$t(entity.playlist_one) هوشمند",
|
||||
"smartPlaylist": "$t(entity.playlist, {\"count\": 1}) هوشمند",
|
||||
"album_one": "آلبوم",
|
||||
"album_other": "آلبومها",
|
||||
"genreWithCount_one": "{{count}} ژانر",
|
||||
@@ -431,12 +432,12 @@
|
||||
},
|
||||
"page": {
|
||||
"albumList": {
|
||||
"title": "$t(entity.album_other)",
|
||||
"title": "$t(entity.album, {\"count\": 2})",
|
||||
"artistAlbums": "آلبومهای {{artist}}",
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)"
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album, {\"count\": 2})"
|
||||
},
|
||||
"appMenu": {
|
||||
"settings": "$t(common.setting_other)",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"selectServer": "گزینش سرویسدهنده",
|
||||
"expandSidebar": "گسترش نوار کناری",
|
||||
"collapseSidebar": "فروکش نوار کناری",
|
||||
@@ -451,11 +452,11 @@
|
||||
"appearsOn": "مشاهده میشود در",
|
||||
"about": "دربارهی {{artist}}",
|
||||
"recentReleases": "عرضههای اخیر",
|
||||
"viewAllTracks": "نمایش همهی $t(entity.track_other)",
|
||||
"viewAllTracks": "نمایش همهی $t(entity.track, {\"count\": 2})",
|
||||
"topSongsFrom": "قطعههای برتر از {{title}}",
|
||||
"viewAll": "نمایش همه",
|
||||
"viewDiscography": "نمایش کاتالوگ",
|
||||
"relatedArtists": "$t(entity.artist_other) مربوطه",
|
||||
"relatedArtists": "$t(entity.artist, {\"count\": 2}) مربوطه",
|
||||
"topSongs": "قطعههای برتر"
|
||||
},
|
||||
"contextMenu": {
|
||||
@@ -523,21 +524,21 @@
|
||||
"playbackTab": "پخش"
|
||||
},
|
||||
"sidebar": {
|
||||
"genres": "$t(entity.genre_other)",
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"genres": "$t(entity.genre, {\"count\": 2})",
|
||||
"playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"search": "$t(common.search)",
|
||||
"albumArtists": "$t(entity.albumArtist_other)",
|
||||
"albums": "$t(entity.album_other)",
|
||||
"folders": "$t(entity.folder_other)",
|
||||
"artists": "$t(entity.artist_other)",
|
||||
"albumArtists": "$t(entity.albumArtist, {\"count\": 2})",
|
||||
"albums": "$t(entity.album, {\"count\": 2})",
|
||||
"folders": "$t(entity.folder, {\"count\": 2})",
|
||||
"artists": "$t(entity.artist, {\"count\": 2})",
|
||||
"home": "$t(common.home)",
|
||||
"nowPlaying": "پخش کنونی",
|
||||
"tracks": "$t(entity.track_other)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"shared": "$t(entity.playlist_other) اشتراکگذاری شده"
|
||||
"tracks": "$t(entity.track, {\"count\": 2})",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"shared": "$t(entity.playlist, {\"count\": 2}) اشتراکگذاری شده"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "موارد بیشتر از این $t(entity.artist_one)",
|
||||
"moreFromArtist": "موارد بیشتر از این $t(entity.artist, {\"count\": 1})",
|
||||
"moreFromGeneric": "موارد بیشتر از {{item}}",
|
||||
"released": "عرضه شده"
|
||||
},
|
||||
@@ -550,9 +551,9 @@
|
||||
"editServerDetailsTooltip": "ویرایش ریزگان سرویسدهنده"
|
||||
},
|
||||
"genreList": {
|
||||
"showAlbums": "نمایش $t(entity.genre_one) $t(entity.album_other)",
|
||||
"title": "$t(entity.genre_other)",
|
||||
"showTracks": "نمایش $t(entity.genre_one) $t(entity.track_other)"
|
||||
"showAlbums": "نمایش $t(entity.genre, {\"count\": 1}) $t(entity.album, {\"count\": 2})",
|
||||
"title": "$t(entity.genre, {\"count\": 2})",
|
||||
"showTracks": "نمایش $t(entity.genre, {\"count\": 1}) $t(entity.track, {\"count\": 2})"
|
||||
},
|
||||
"globalSearch": {
|
||||
"commands": {
|
||||
@@ -563,15 +564,15 @@
|
||||
"title": "فرمانها"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist_other)"
|
||||
"title": "$t(entity.playlist, {\"count\": 2})"
|
||||
},
|
||||
"trackList": {
|
||||
"title": "$t(entity.track_other)",
|
||||
"title": "$t(entity.track, {\"count\": 2})",
|
||||
"artistTracks": "قطعههای {{artist}}",
|
||||
"genreTracks": "$t(entity.track_other) \"{{genre}}\""
|
||||
"genreTracks": "$t(entity.track, {\"count\": 2}) \"{{genre}}\""
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
"title": "$t(entity.albumArtist, {\"count\": 2})"
|
||||
},
|
||||
"itemDetail": {
|
||||
"copyPath": "کپی کردن مسیر در کلیپبورد",
|
||||
@@ -584,11 +585,11 @@
|
||||
"size": "$t(common.size)",
|
||||
"lastPlayed": "آخرین بار پخش شده",
|
||||
"discNumber": "دیسک",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"songCount": "$t(entity.track, {\"count\": 2})",
|
||||
"title": "عنوان",
|
||||
"trackNumber": "قطعه",
|
||||
"favorite": "مورد علاقه",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"comment": "دیدگاه",
|
||||
"playCount": "تعداد پخش",
|
||||
"rating": "امتیاز",
|
||||
|
||||
@@ -3,7 +3,8 @@
|
||||
"size": "koko",
|
||||
"search": "etsi",
|
||||
"sortOrder": "järjestys",
|
||||
"setting": "asetus",
|
||||
"setting_one": "asetus",
|
||||
"setting_other": "",
|
||||
"title": "otsikko",
|
||||
"trackNumber": "raita",
|
||||
"action_one": "toiminto",
|
||||
@@ -44,7 +45,7 @@
|
||||
"owner": "omistaja",
|
||||
"path": "polku",
|
||||
"preview": "esikatsele",
|
||||
"previousSong": "edellinen $t(entity.track_one)",
|
||||
"previousSong": "edellinen $t(entity.track, {\"count\": 1})",
|
||||
"resetToDefault": "palauta oletusarvoihin",
|
||||
"restartRequired": "vaatii uudelleenkäynnistyksen",
|
||||
"right": "oikea",
|
||||
@@ -66,7 +67,7 @@
|
||||
"codec": "koodekki",
|
||||
"create": "luo",
|
||||
"description": "kuvaus",
|
||||
"currentSong": "nykyinen $t(entity.track_one)",
|
||||
"currentSong": "nykyinen $t(entity.track, {\"count\": 1})",
|
||||
"delete": "poista",
|
||||
"duration": "kesto",
|
||||
"edit": "muokkaa",
|
||||
@@ -130,7 +131,7 @@
|
||||
"genre_other": "genret",
|
||||
"genreWithCount_one": "{{count}} genre",
|
||||
"genreWithCount_other": "{{count}} genreä",
|
||||
"smartPlaylist": "älykäs $t(entity.playlist_one)",
|
||||
"smartPlaylist": "älykäs $t(entity.playlist, {\"count\": 1})",
|
||||
"track_one": "raita",
|
||||
"track_other": "raidat",
|
||||
"trackWithCount_one": "{{count}} raita",
|
||||
@@ -142,11 +143,11 @@
|
||||
},
|
||||
"action": {
|
||||
"clearQueue": "tyhjennä jono",
|
||||
"createPlaylist": "luo $t(entity.playlist_one)",
|
||||
"createPlaylist": "luo $t(entity.playlist, {\"count\": 1})",
|
||||
"deselectAll": "poista kaikkien valinta",
|
||||
"editPlaylist": "muokkaa $t(entity.playlist_one)",
|
||||
"editPlaylist": "muokkaa $t(entity.playlist, {\"count\": 1})",
|
||||
"removeFromQueue": "poista jonosta",
|
||||
"viewPlaylists": "katsele $t(entity.playlist_other)",
|
||||
"viewPlaylists": "katsele $t(entity.playlist, {\"count\": 2})",
|
||||
"openIn": {
|
||||
"lastfm": "Avaa Last.fm:ssä",
|
||||
"musicbrainz": "Avaa MusicBrainz:ssä"
|
||||
@@ -154,13 +155,13 @@
|
||||
"goToPage": "mene sivulle",
|
||||
"moveToBottom": "siirry pohjalle",
|
||||
"moveToTop": "siirry ylös",
|
||||
"addToFavorites": "lisää kohteeseen $t(entity.favorite_other)",
|
||||
"addToPlaylist": "lisää kohteeseen $t(entity.playlist_one)",
|
||||
"addToFavorites": "lisää kohteeseen $t(entity.favorite, {\"count\": 2})",
|
||||
"addToPlaylist": "lisää kohteeseen $t(entity.playlist, {\"count\": 1})",
|
||||
"refresh": "$t(common.refresh)",
|
||||
"removeFromFavorites": "poista kohteesta $t(entity.favorite_other)",
|
||||
"removeFromFavorites": "poista kohteesta $t(entity.favorite, {\"count\": 2})",
|
||||
"toggleSmartPlaylistEditor": "kytke $t(entity.smartPlaylist) editori",
|
||||
"deletePlaylist": "poista $t(entity.playlist_one)",
|
||||
"removeFromPlaylist": "poista kohteesta $t(entity.playlist_one)",
|
||||
"deletePlaylist": "poista $t(entity.playlist, {\"count\": 1})",
|
||||
"removeFromPlaylist": "poista kohteesta $t(entity.playlist, {\"count\": 1})",
|
||||
"setRating": "aseta arvostelu",
|
||||
"moveToNext": "siirry seuraavaan"
|
||||
},
|
||||
@@ -191,9 +192,9 @@
|
||||
"notificationDenied": "luvat ilmouilmoituksia varten evättiin. tällä asetuksella ei ole vaikutusta"
|
||||
},
|
||||
"filter": {
|
||||
"album": "$t(entity.album_one)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"biography": "biografia",
|
||||
"bitrate": "bittinopeus",
|
||||
"bpm": "lyöntiä minuutissa (bpm)",
|
||||
@@ -213,12 +214,12 @@
|
||||
"search": "haku",
|
||||
"trackNumber": "raita",
|
||||
"isPublic": "on julkinen",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"favorited": "suosikeissa",
|
||||
"fromYear": "vuodelta",
|
||||
"isRated": "on arvosteltu",
|
||||
"recentlyPlayed": "äskettäin toistetut",
|
||||
"albumCount": "$t(entity.album_other) määrä",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2}) määrä",
|
||||
"disc": "levy",
|
||||
"duration": "kesto",
|
||||
"id": "tunnus",
|
||||
@@ -255,34 +256,34 @@
|
||||
"input_public": "julkinen",
|
||||
"input_name": "$t(common.name)",
|
||||
"input_owner": "$t(common.owner)",
|
||||
"success": "$t(entity.playlist_one) luotu onnistuneesti",
|
||||
"title": "luo $t(entity.playlist_one)",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) luotu onnistuneesti",
|
||||
"title": "luo $t(entity.playlist, {\"count\": 1})",
|
||||
"input_description": "$t(common.description)"
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"input_skipDuplicates": "ohita kaksoiskappaleet",
|
||||
"success": "$t(entity.trackWithCount, {\"count\": {{message}} }) lisätty $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })",
|
||||
"title": "lisää soittolistalle $t(entity.playlist_one)",
|
||||
"input_playlists": "$t(entity.playlist_other)",
|
||||
"create": "luo $t(entity.playlist_one) {{playlist}}",
|
||||
"searchOrCreate": "hae $t(entity.playlist_other) tai tyyppiä luodaksesi uuden"
|
||||
"title": "lisää soittolistalle $t(entity.playlist, {\"count\": 1})",
|
||||
"input_playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"create": "luo $t(entity.playlist, {\"count\": 1}) {{playlist}}",
|
||||
"searchOrCreate": "hae $t(entity.playlist, {\"count\": 2}) tai tyyppiä luodaksesi uuden"
|
||||
},
|
||||
"updateServer": {
|
||||
"success": "palvelin on päivitetty onnistuneesti",
|
||||
"title": "päivitä palvelin"
|
||||
},
|
||||
"deletePlaylist": {
|
||||
"success": "$t(entity.playlist_one) poistettu onnistuneesti",
|
||||
"title": "poista $t(entity.playlist_one)",
|
||||
"input_confirm": "kirjoita soittolistan $t(entity.playlist_one) nimi vahvistaaksesi"
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) poistettu onnistuneesti",
|
||||
"title": "poista $t(entity.playlist, {\"count\": 1})",
|
||||
"input_confirm": "kirjoita soittolistan $t(entity.playlist, {\"count\": 1}) nimi vahvistaaksesi"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"success": "$t(entity.playlist_one) päivitetty onnistuneesti",
|
||||
"title": "muokkaa $t(entity.playlist_one)",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) päivitetty onnistuneesti",
|
||||
"title": "muokkaa $t(entity.playlist, {\"count\": 1})",
|
||||
"publicJellyfinNote": "Jellyfin ei jostain syystä kerro onko soittolista julkinen vai ei. Jos haluat sen pysyvän julkisena, pidä seuraava valinta valittuna"
|
||||
},
|
||||
"lyricSearch": {
|
||||
"input_artist": "$t(entity.artist_one)",
|
||||
"input_artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"input_name": "$t(common.name)",
|
||||
"title": "sanojen haku"
|
||||
},
|
||||
@@ -437,7 +438,7 @@
|
||||
"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)",
|
||||
"replayGainMode_optionTrack": "$t(entity.track, {\"count\": 1})",
|
||||
"themeDark": "teema (tumma)",
|
||||
"translationApiKey_description": "API-avain käännöstä varten (tukee vain globaalia palvelun palvelupistettä)",
|
||||
"playbackStyle_description": "valitse toiston tyyli, jota käytetään soittimessa",
|
||||
@@ -474,8 +475,7 @@
|
||||
"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)",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album, {\"count\": 1})",
|
||||
"replayGainPreamp": "{{ReplayGain}} esivahvistus (dB)",
|
||||
"scrobble_description": "skrobblaa toistot mediapalvelimellesi",
|
||||
"replayGainPreamp_description": "säätää esivahvistuksen määrää {{ReplayGain}} arvoon",
|
||||
@@ -490,7 +490,6 @@
|
||||
"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",
|
||||
@@ -551,24 +550,24 @@
|
||||
"openFile": "näytä kappale tiedostonhallinnassa"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
"title": "$t(entity.albumArtist, {\"count\": 2})"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "siirrä kohteesta $t(entity.artist_one)",
|
||||
"moreFromArtist": "siirrä kohteesta $t(entity.artist, {\"count\": 1})",
|
||||
"moreFromGeneric": "listää kohteesta {{item}}",
|
||||
"released": "julkaistu"
|
||||
},
|
||||
"albumList": {
|
||||
"artistAlbums": "artistin {{artist}} albumit",
|
||||
"genreAlbums": "\"{{genre}}\"$t(entity.album_other)",
|
||||
"title": "$t(entity.album_other)"
|
||||
"genreAlbums": "\"{{genre}}\"$t(entity.album, {\"count\": 2})",
|
||||
"title": "$t(entity.album, {\"count\": 2})"
|
||||
},
|
||||
"appMenu": {
|
||||
"goBack": "mene takaisin",
|
||||
"openBrowserDevtools": "avaa selaimen kehitystyökalut",
|
||||
"quit": "$t(common.quit)",
|
||||
"selectServer": "valitse palvelin",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"expandSidebar": "laajenna sivupalkki",
|
||||
"goForward": "mene eteenpäin",
|
||||
"manageServers": "hallitse palvelimia",
|
||||
@@ -600,21 +599,21 @@
|
||||
"addLast": "$t(player.addLast)",
|
||||
"moveToNext": "$t(action.moveToNext)",
|
||||
"removeFromQueue": "$t(action.removeFromQueue)",
|
||||
"goToAlbum": "mene $t(entity.album_one)",
|
||||
"goToAlbumArtist": "mene $t(entity.albumArtist_one)"
|
||||
"goToAlbum": "mene $t(entity.album, {\"count\": 1})",
|
||||
"goToAlbumArtist": "mene $t(entity.albumArtist, {\"count\": 1})"
|
||||
},
|
||||
"sidebar": {
|
||||
"albumArtists": "$t(entity.albumArtist_other)",
|
||||
"albums": "$t(entity.album_other)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"shared": "$t(entity.playlist_other) jaettu",
|
||||
"tracks": "$t(entity.track_other)",
|
||||
"artists": "$t(entity.artist_other)",
|
||||
"folders": "$t(entity.folder_other)",
|
||||
"genres": "$t(entity.genre_other)",
|
||||
"albumArtists": "$t(entity.albumArtist, {\"count\": 2})",
|
||||
"albums": "$t(entity.album, {\"count\": 2})",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"shared": "$t(entity.playlist, {\"count\": 2}) jaettu",
|
||||
"tracks": "$t(entity.track, {\"count\": 2})",
|
||||
"artists": "$t(entity.artist, {\"count\": 2})",
|
||||
"folders": "$t(entity.folder, {\"count\": 2})",
|
||||
"genres": "$t(entity.genre, {\"count\": 2})",
|
||||
"home": "$t(common.home)",
|
||||
"nowPlaying": "nyt soi",
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"search": "$t(common.search)",
|
||||
"myLibrary": "oma kirjasto"
|
||||
},
|
||||
@@ -649,9 +648,9 @@
|
||||
"related": "liittyvät"
|
||||
},
|
||||
"genreList": {
|
||||
"showAlbums": "näytä $t(entity.genre_one) $t(entity.album_other)",
|
||||
"showTracks": "näytä $t(entity.genre_one) $t(entity.track_other)",
|
||||
"title": "$t(entity.genre_other)"
|
||||
"showAlbums": "näytä $t(entity.genre, {\"count\": 1}) $t(entity.album, {\"count\": 2})",
|
||||
"showTracks": "näytä $t(entity.genre, {\"count\": 1}) $t(entity.track, {\"count\": 2})",
|
||||
"title": "$t(entity.genre, {\"count\": 2})"
|
||||
},
|
||||
"globalSearch": {
|
||||
"commands": {
|
||||
@@ -672,16 +671,16 @@
|
||||
"albumArtistDetail": {
|
||||
"about": "{{artist}}{sta/stä",
|
||||
"viewDiscography": "katsele diskografiaa",
|
||||
"relatedArtists": "liittyvät $t(entity.artist_other)",
|
||||
"relatedArtists": "liittyvät $t(entity.artist, {\"count\": 2})",
|
||||
"appearsOn": "esiintyy",
|
||||
"topSongs": "parhaat kappaleet",
|
||||
"topSongsFrom": "parhaat kappaleet albumilta {{title}}",
|
||||
"recentReleases": "hiljattaiset julkaisut",
|
||||
"viewAll": "katsele kaikkia",
|
||||
"viewAllTracks": "katsele kaikkia $t(entity.track_other)"
|
||||
"viewAllTracks": "katsele kaikkia $t(entity.track, {\"count\": 2})"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist_other)"
|
||||
"title": "$t(entity.playlist, {\"count\": 2})"
|
||||
},
|
||||
"manageServers": {
|
||||
"title": "hallitse palvelimia",
|
||||
@@ -696,8 +695,8 @@
|
||||
},
|
||||
"trackList": {
|
||||
"artistTracks": "artistin {{artist}} kappaleet",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track_other)",
|
||||
"title": "$t(entity.track_other)"
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track, {\"count\": 2})",
|
||||
"title": "$t(entity.track, {\"count\": 2})"
|
||||
}
|
||||
},
|
||||
"player": {
|
||||
@@ -748,14 +747,14 @@
|
||||
"label": {
|
||||
"channels": "$t(common.channel_other)",
|
||||
"trackNumber": "raidan numero",
|
||||
"album": "$t(entity.album_one)",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"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)",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"discNumber": "levyn numero",
|
||||
"duration": "$t(common.duration)",
|
||||
"favorite": "$t(common.favorite)",
|
||||
@@ -766,12 +765,12 @@
|
||||
"biography": "$t(common.biography)",
|
||||
"bitrate": "$t(common.bitrate)",
|
||||
"bpm": "$t(common.bpm)",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"playCount": "toistojen lukumäärä",
|
||||
"rating": "$t(common.rating)",
|
||||
"releaseDate": "julkaisupäivämäärä",
|
||||
"size": "$t(common.size)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"songCount": "$t(entity.track, {\"count\": 2})",
|
||||
"title": "$t(common.title)",
|
||||
"year": "$t(common.year)"
|
||||
},
|
||||
@@ -784,7 +783,7 @@
|
||||
"column": {
|
||||
"releaseYear": "vuosi",
|
||||
"bpm": "bpm",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"biography": "biografia",
|
||||
"dateAdded": "lisäyspäivämäärä",
|
||||
"album": "albumi",
|
||||
@@ -792,17 +791,17 @@
|
||||
"lastPlayed": "viimeksi toistettu",
|
||||
"path": "polku",
|
||||
"size": "$t(common.size)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"songCount": "$t(entity.track, {\"count\": 2})",
|
||||
"title": "nimi",
|
||||
"trackNumber": "raita",
|
||||
"codec": "$t(common.codec)",
|
||||
"comment": "kommentti",
|
||||
"albumCount": "$t(entity.album_other)",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2})",
|
||||
"bitrate": "bittinopeus",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"discNumber": "levy",
|
||||
"favorite": "suosikki",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"playCount": "toistoja",
|
||||
"rating": "arvostelu",
|
||||
"releaseDate": "julkaisupäivämäärä"
|
||||
@@ -810,7 +809,7 @@
|
||||
},
|
||||
"releaseType": {
|
||||
"primary": {
|
||||
"album": "$t(entity.album_one)",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"broadcast": "lähetys",
|
||||
"ep": "EP",
|
||||
"other": "muu",
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
"shuffle": "lecture (mélangé)",
|
||||
"playbackFetchNoResults": "aucun titre trouvé",
|
||||
"playbackFetchInProgress": "chargement des titres…",
|
||||
"addNext": "ajouter ensuite",
|
||||
"addNext": "prochain",
|
||||
"playbackSpeed": "vitesse de lecture",
|
||||
"playbackFetchCancel": "cela prend du temps… fermez la notification pour annuler",
|
||||
"play": "lecture",
|
||||
@@ -24,41 +24,40 @@
|
||||
"queue_moveToTop": "déplacer la sélection vers le bas",
|
||||
"queue_moveToBottom": "déplacer la sélection vers le haut",
|
||||
"shuffle_off": "aléatoire désactivée",
|
||||
"addLast": "ajouter en dernier",
|
||||
"addLast": "dernier",
|
||||
"mute": "muet",
|
||||
"skip_forward": "avancer",
|
||||
"pause": "pause",
|
||||
"unfavorite": "retirer des favoris",
|
||||
"playSimilarSongs": "jouer des titres similaires",
|
||||
"viewQueue": "voir la file d'attente",
|
||||
"addLastShuffled": "ajouter en dernier (mélangé)",
|
||||
"addNextShuffled": "ajouter ensuite (mélangé)",
|
||||
"queueType": "type de file d'attente",
|
||||
"queueType_default": "défaut",
|
||||
"queueType_priority": "priorité",
|
||||
"addLastShuffled": "dernier (mélangé)",
|
||||
"addNextShuffled": "prochain (mélangé)",
|
||||
"holdToShuffle": "maintenir pour mélanger",
|
||||
"lyrics": "paroles",
|
||||
"restoreQueueFromServer": "restaurer la file d'attente depuis le serveur",
|
||||
"saveQueueToServer": "enregistrer la file d'attente sur le serveur"
|
||||
"saveQueueToServer": "enregistrer la file d'attente sur le serveur",
|
||||
"artistRadio": "radio de l'artiste",
|
||||
"trackRadio": "radio du titre"
|
||||
},
|
||||
"action": {
|
||||
"editPlaylist": "éditer $t(entity.playlist_one)",
|
||||
"editPlaylist": "éditer $t(entity.playlist, {\"count\": 1})",
|
||||
"goToPage": "aller à la page",
|
||||
"moveToTop": "déplacer en haut",
|
||||
"clearQueue": "vider la file d'attente",
|
||||
"addToFavorites": "ajouter aux $t(entity.favorite_other)",
|
||||
"addToPlaylist": "ajouter à $t(entity.playlist_one)",
|
||||
"createPlaylist": "créer $t(entity.playlist_one)",
|
||||
"removeFromPlaylist": "supprimer des $t(entity.playlist_one)",
|
||||
"viewPlaylists": "voir $t(entity.playlist_other)",
|
||||
"addToFavorites": "ajouter aux $t(entity.favorite, {\"count\": 2})",
|
||||
"addToPlaylist": "ajouter à $t(entity.playlist, {\"count\": 1})",
|
||||
"createPlaylist": "créer $t(entity.playlist, {\"count\": 1})",
|
||||
"removeFromPlaylist": "supprimer des $t(entity.playlist, {\"count\": 1})",
|
||||
"viewPlaylists": "voir $t(entity.playlist, {\"count\": 2})",
|
||||
"refresh": "$t(common.refresh)",
|
||||
"deletePlaylist": "supprimer de $t(entity.playlist_one)",
|
||||
"deletePlaylist": "supprimer de $t(entity.playlist, {\"count\": 1})",
|
||||
"removeFromQueue": "retirer de la file d'attente",
|
||||
"deselectAll": "désélectionner tout",
|
||||
"moveToBottom": "déplacer en bas",
|
||||
"setRating": "noter",
|
||||
"toggleSmartPlaylistEditor": "basculer l'éditeur de $t(entity.smartPlaylist)",
|
||||
"removeFromFavorites": "retirer des $t(entity.favorite_other)",
|
||||
"removeFromFavorites": "retirer des $t(entity.favorite, {\"count\": 2})",
|
||||
"openIn": {
|
||||
"lastfm": "Ouvrir dans Last.fm",
|
||||
"musicbrainz": "Ouvrir dans MusicBrainz"
|
||||
@@ -74,8 +73,12 @@
|
||||
"moveDown": "descendre",
|
||||
"holdToMoveToTop": "Maintenir pour déplacer en haut",
|
||||
"holdToMoveToBottom": "Maintenir pour déplacer en bas",
|
||||
"createRadioStation": "créer $t(entity.radioStation_one)",
|
||||
"deleteRadioStation": "supprimer $t(entity.radioStation_one)"
|
||||
"createRadioStation": "créer $t(entity.radioStation, {\"count\": 1})",
|
||||
"deleteRadioStation": "supprimer $t(entity.radioStation, {\"count\": 1})",
|
||||
"addOrRemoveFromSelection": "ajouter ou supprimer de la sélection",
|
||||
"selectRangeOfItems": "sélectionner une plage d'entrées",
|
||||
"selectAll": "tout sélectionner",
|
||||
"openApplicationDirectory": "ouvrir le répertoire de l'application"
|
||||
},
|
||||
"common": {
|
||||
"backward": "en arrière",
|
||||
@@ -90,7 +93,7 @@
|
||||
"left": "gauche",
|
||||
"save": "enregistrer",
|
||||
"right": "droite",
|
||||
"currentSong": "$t(entity.track_one) actuelle",
|
||||
"currentSong": "$t(entity.track, {\"count\": 1}) actuelle",
|
||||
"collapse": "réduire",
|
||||
"trackNumber": "piste",
|
||||
"descending": "décroisant",
|
||||
@@ -150,7 +153,7 @@
|
||||
"none": "aucun",
|
||||
"menu": "menu",
|
||||
"restartRequired": "redémarrage requis",
|
||||
"previousSong": "$t(entity.track_one) précédente",
|
||||
"previousSong": "$t(entity.track, {\"count\": 1}) précédente",
|
||||
"noResultsFromQuery": "la requête n'a retourné aucun résultat",
|
||||
"quit": "quitter",
|
||||
"expand": "étendre",
|
||||
@@ -195,7 +198,11 @@
|
||||
"tableColumns": "colonnes du tableau",
|
||||
"itemsMore": "plus {{count}}",
|
||||
"view": "vue",
|
||||
"noFilters": "aucun filtre configuré"
|
||||
"noFilters": "aucun filtre configuré",
|
||||
"countSelected": "{{count}} sélectionnée",
|
||||
"example": "exemple",
|
||||
"mood": "humeur",
|
||||
"retry": "réessayer"
|
||||
},
|
||||
"error": {
|
||||
"remotePortWarning": "redémarrer le serveur pour appliquer le nouveau port",
|
||||
@@ -223,7 +230,10 @@
|
||||
"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",
|
||||
"multipleServerSaveQueueError": "la file d'attente de lecture contient un ou plusieurs morceaux qui ne proviennent pas du serveur actuel. Ceci n'est pas prise en charge",
|
||||
"saveQueueFailed": "échec de l'enregistrement de la file d'attente"
|
||||
"saveQueueFailed": "échec de l'enregistrement de la file d'attente",
|
||||
"settingsSyncError": "des incohérences ont été détectées entre les paramètres du moteur de rendu et ceux du processus principal. redémarrez l'application pour appliquer les modifications",
|
||||
"noNetwork": "serveur indisponible",
|
||||
"noNetworkDescription": "impossible de se connecter à ce serveur"
|
||||
},
|
||||
"filter": {
|
||||
"mostPlayed": "plus joués",
|
||||
@@ -257,36 +267,36 @@
|
||||
"fromYear": "depuis l'année",
|
||||
"criticRating": "note des critiques",
|
||||
"trackNumber": "piste",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"comment": "commentaire",
|
||||
"recentlyUpdated": "mis à jour récemment",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"owner": "$t(common.owner)",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"albumCount": "$t(entity.album_other) total",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2}) total",
|
||||
"id": "id",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"isPublic": "est public",
|
||||
"album": "$t(entity.album_one)",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"explicitStatus": "$t(common.explicitStatus)"
|
||||
},
|
||||
"page": {
|
||||
"sidebar": {
|
||||
"nowPlaying": "lecture en cours",
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"search": "$t(common.search)",
|
||||
"tracks": "$t(entity.track_other)",
|
||||
"albums": "$t(entity.album_other)",
|
||||
"genres": "$t(entity.genre_other)",
|
||||
"folders": "$t(entity.folder_other)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"tracks": "$t(entity.track, {\"count\": 2})",
|
||||
"albums": "$t(entity.album, {\"count\": 2})",
|
||||
"genres": "$t(entity.genre, {\"count\": 2})",
|
||||
"folders": "$t(entity.folder, {\"count\": 2})",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"home": "$t(common.home)",
|
||||
"artists": "$t(entity.artist_other)",
|
||||
"albumArtists": "$t(entity.albumArtist_other)",
|
||||
"shared": "partagé $t(entity.playlist_other)",
|
||||
"artists": "$t(entity.artist, {\"count\": 2})",
|
||||
"albumArtists": "$t(entity.albumArtist, {\"count\": 2})",
|
||||
"shared": "partagé $t(entity.playlist, {\"count\": 2})",
|
||||
"myLibrary": "Bibliothèque",
|
||||
"favorites": "$t(entity.favorite_other)",
|
||||
"radio": "$t(entity.radioStation_other)"
|
||||
"favorites": "$t(entity.favorite, {\"count\": 2})",
|
||||
"radio": "$t(entity.radioStation, {\"count\": 2})"
|
||||
},
|
||||
"fullscreenPlayer": {
|
||||
"config": {
|
||||
@@ -320,7 +330,7 @@
|
||||
"goBack": "retour arrière",
|
||||
"goForward": "avancer",
|
||||
"version": "version {{version}}",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"quit": "$t(common.quit)",
|
||||
"privateModeOff": "désactiver le mode privé",
|
||||
"privateModeOn": "activer le mode privé",
|
||||
@@ -336,10 +346,10 @@
|
||||
"recentlyPlayed": "Joués récemment",
|
||||
"title": "$t(common.home)",
|
||||
"recentlyReleased": "Sortis récemment",
|
||||
"genres": "$t(entity.genre_other)"
|
||||
"genres": "$t(entity.genre, {\"count\": 2})"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "plus de $t(entity.artist_one)",
|
||||
"moreFromArtist": "plus de $t(entity.artist, {\"count\": 1})",
|
||||
"moreFromGeneric": "plus de {{item}}",
|
||||
"released": "publié"
|
||||
},
|
||||
@@ -365,7 +375,8 @@
|
||||
"transcoding": "transcodage",
|
||||
"discord": "discord",
|
||||
"logger": "logger",
|
||||
"playerFilters": "filtres du lecteur"
|
||||
"playerFilters": "filtres du lecteur",
|
||||
"lyricsDisplay": "affichage des paroles"
|
||||
},
|
||||
"globalSearch": {
|
||||
"commands": {
|
||||
@@ -398,42 +409,43 @@
|
||||
"download": "télécharger",
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"moveToNext": "$t(action.moveToNext)",
|
||||
"goToAlbumArtist": "aller à l'$t(entity.albumArtist_one)",
|
||||
"goToAlbum": "aller à l'$t(entity.album_one)",
|
||||
"goToAlbumArtist": "aller à l'$t(entity.albumArtist, {\"count\": 1})",
|
||||
"goToAlbum": "aller à l'$t(entity.album, {\"count\": 1})",
|
||||
"moveItems": "$t(action.moveItems)",
|
||||
"goTo": "aller à"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
"title": "$t(entity.albumArtist, {\"count\": 2})"
|
||||
},
|
||||
"genreList": {
|
||||
"title": "$t(entity.genre_other)",
|
||||
"showAlbums": "afficher $t(entity.genre_one) $t(entity.album_other)",
|
||||
"showTracks": "afficher $t(entity.genre_one) $t(entity.track_other)"
|
||||
"title": "$t(entity.genre, {\"count\": 2})",
|
||||
"showAlbums": "afficher $t(entity.genre, {\"count\": 1}) $t(entity.album, {\"count\": 2})",
|
||||
"showTracks": "afficher $t(entity.genre, {\"count\": 1}) $t(entity.track, {\"count\": 2})"
|
||||
},
|
||||
"trackList": {
|
||||
"title": "$t(entity.track_other)",
|
||||
"title": "$t(entity.track, {\"count\": 2})",
|
||||
"artistTracks": "pistes par {{artist}}",
|
||||
"genreTracks": "'{{genre}}' $t(entity.track_other)"
|
||||
"genreTracks": "'{{genre}}' $t(entity.track, {\"count\": 2})"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist_other)"
|
||||
"title": "$t(entity.playlist, {\"count\": 2})"
|
||||
},
|
||||
"albumList": {
|
||||
"title": "$t(entity.album_other)",
|
||||
"title": "$t(entity.album, {\"count\": 2})",
|
||||
"artistAlbums": "albums par {{artist}}",
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)"
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album, {\"count\": 2})"
|
||||
},
|
||||
"albumArtistDetail": {
|
||||
"about": "À propos de {{artist}}",
|
||||
"appearsOn": "apparaît sur",
|
||||
"topSongsFrom": "meilleurs titres de {{title}}",
|
||||
"viewAll": "voir tout",
|
||||
"viewAllTracks": "voir tout $t(entity.track_other)",
|
||||
"viewAllTracks": "voir tout $t(entity.track, {\"count\": 2})",
|
||||
"recentReleases": "sorties récentes",
|
||||
"viewDiscography": "voir la discographie",
|
||||
"relatedArtists": "$t(entity.artist_other) similaires",
|
||||
"topSongs": "meilleurs titres"
|
||||
"relatedArtists": "$t(entity.artist, {\"count\": 2}) similaires",
|
||||
"topSongs": "meilleurs titres",
|
||||
"groupingTypeAll": "toutes les types de sortie"
|
||||
},
|
||||
"itemDetail": {
|
||||
"copyPath": "copier le chemin dans le presse-papiers",
|
||||
@@ -452,10 +464,10 @@
|
||||
"editServerDetailsTooltip": "modifier les détails du serveur"
|
||||
},
|
||||
"favorites": {
|
||||
"title": "$t(entity.favorite_other)"
|
||||
"title": "$t(entity.favorite, {\"count\": 2})"
|
||||
},
|
||||
"folderList": {
|
||||
"title": "$t(entity.folder_other)"
|
||||
"title": "$t(entity.folder, {\"count\": 2})"
|
||||
},
|
||||
"radioList": {
|
||||
"title": "stations radio"
|
||||
@@ -553,7 +565,7 @@
|
||||
"remotePort": "port du serveur de contrôle à distance",
|
||||
"hotkey_playbackNext": "piste suivante",
|
||||
"lyricFetch_description": "récupère les paroles depuis divers source d'internet",
|
||||
"lyricFetchProvider_description": "sélectionnez le fournisseur auprès desquels récupérer les paroles. l'ordre des fournisseurs et l'ordre dans lequel ils seront interrogés",
|
||||
"lyricFetchProvider_description": "sélectionnez les fournisseurs auprès desquels récupérer les paroles",
|
||||
"globalMediaHotkeys_description": "active ou désactive l'utilisation des raccourcis clavier multimédia système pour contrôler la lecture",
|
||||
"followLyric": "suivre les paroles actuelles",
|
||||
"discordIdleStatus": "afficher l'état d'inactivité dans le statut de l'activité",
|
||||
@@ -605,8 +617,8 @@
|
||||
"playButtonBehavior_optionPlay": "$t(player.play)",
|
||||
"replayGainMode_optionNone": "$t(common.none)",
|
||||
"playButtonBehavior_optionAddLast": "$t(player.addLast)",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album_one)",
|
||||
"replayGainMode_optionTrack": "$t(entity.track_one)",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album, {\"count\": 1})",
|
||||
"replayGainMode_optionTrack": "$t(entity.track, {\"count\": 1})",
|
||||
"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",
|
||||
"replayGainFallback": "valeur de repli {{ReplayGain}}",
|
||||
@@ -633,9 +645,7 @@
|
||||
"imageAspectRatio_description": "si cette option est activée, les pochettes d'album seront affichées en utilisant leur rapport hauteur/largeur natif. pour les pochettes qui n'ont pas un rapport 1:1 (carré), l'espace restant sera vide",
|
||||
"mpvExtraParameters_help": "un par ligne",
|
||||
"passwordStore_description": "quel mot de passe utiliser. changez cela si vous rencontrez des problèmes pour stocker les mots de passe",
|
||||
"playerAlbumArtResolution": "résolution de la pochette d'album du lecteur",
|
||||
"passwordStore": "mots de passe",
|
||||
"playerAlbumArtResolution_description": "résolution pour l'aperçu de la pochette d'album agrandie du lecteur. plus grand le rend plus net, mais peut ralentir le chargement. la valeur par défaut est 0 (automatique)",
|
||||
"homeConfiguration_description": "configurer quels éléments sont affichés sur la page d'accueil, et dans quel ordre",
|
||||
"startMinimized": "démarrer l'application en mode réduit",
|
||||
"transcode_description": "permet le transcodage vers différents formats",
|
||||
@@ -709,7 +719,7 @@
|
||||
"releaseChannel": "canal de diffusion",
|
||||
"releaseChannel_description": "choisissez entre les versions stables ou les versions bêta pour les mises à jour automatiques",
|
||||
"mediaSession": "activer media session",
|
||||
"mediaSession_description": "active l'intégration de la session Windows Media, affichant les commandes multimédias et les métadonnées dans la superposition du volume du système et l'écran de verrouillage (Windows uniquement)",
|
||||
"mediaSession_description": "active l'intégration Media Session, affichant les commandes multimédias et les métadonnées dans la superposition du volume du système et l'écran de verrouillage",
|
||||
"enableAutoTranslation_description": "activer la traduction automatiquement lorsque les paroles sont chargées",
|
||||
"enableAutoTranslation": "activer la traduction automatique",
|
||||
"exportImportSettings_control_description": "exporter et importer les paramètres en JSON",
|
||||
@@ -730,8 +740,8 @@
|
||||
"notify": "activer les notifications de chansons",
|
||||
"analyticsDisable": "Désactiver l'analytique basée sur l'utilisation",
|
||||
"analyticsDisable_description": "les données d'utilisation anonymisées sont envoyées au développeur afin de contribuer à l'amélioration de l'application",
|
||||
"playerbarSlider": "curseur de la barre de lecture",
|
||||
"playerbarSliderType_optionSlider": "curseur",
|
||||
"playerbarSlider": "barre de lecture",
|
||||
"playerbarSliderType_optionSlider": "pleine",
|
||||
"playerbarSliderType_optionWaveform": "forme d'onde",
|
||||
"playerbarWaveformAlign": "forme d'onde alignée",
|
||||
"playerbarWaveformAlign_optionTop": "haut",
|
||||
@@ -765,17 +775,38 @@
|
||||
"logLevel_optionError": "erreur",
|
||||
"logLevel_optionInfo": "info",
|
||||
"logLevel_optionWarn": "avertissement",
|
||||
"playerFilters": "filtrer les tires de la file d'attente",
|
||||
"playerFilters": "filtrer les titres de la file d'attente",
|
||||
"playerFilters_description": "exclure les titres de la file d'attente selon les critères suivants",
|
||||
"playerbarSlider_description": "la forme d'onde n'est pas recommandée sur une connexion lente ou limitée",
|
||||
"useThemeAccentColor": "utiliser la couleur d'accent du thème",
|
||||
"useThemeAccentColor_description": "utiliser la couleur principale définie dans le thème sélectionné au lieu de la couleur d'accent personnalisée"
|
||||
"useThemeAccentColor_description": "utiliser la couleur principale définie dans le thème sélectionné au lieu de la couleur d'accent personnalisée",
|
||||
"artistReleaseTypeConfiguration": "configuration du type de sortie de l'artiste",
|
||||
"artistReleaseTypeConfiguration_description": "configure quel type de sortie est affiché, et dans quel ordre, sur la page artiste de l'album",
|
||||
"mpvExtraParameters": "paramètres supplémentaires de mpv",
|
||||
"mpvExtraParameters_description": "arguments supplémentaires à transmettre à mpv",
|
||||
"pathReplace": "remplacement du chemin de fichier",
|
||||
"pathReplace_description": "remplacez le chemin de fichier par défaut de votre serveur",
|
||||
"pathReplace_optionRemovePrefix": "supprimer un prefix",
|
||||
"pathReplace_optionAddPrefix": "ajouter un prefix",
|
||||
"artistRadioCount_description": "définit le nombre de titres à récupérer pour la radio d'artiste et la radio de titre",
|
||||
"artistRadioCount": "nombre de radio d'artiste/titre",
|
||||
"imageResolution": "résolution d'image",
|
||||
"imageResolution_description": "la résolution d'image utilisée dans l'application. définir une valeur à 0 utilisera la résolution native de l'image",
|
||||
"imageResolution_optionTable": "tableau",
|
||||
"imageResolution_optionItemCard": "entrée de carte",
|
||||
"imageResolution_optionSidebar": "barre latérale",
|
||||
"imageResolution_optionHeader": "en-tête",
|
||||
"imageResolution_optionFullScreenPlayer": "lecteur en plein écran",
|
||||
"showRatings_description": "contrôle si la notation à étoiles s'affiche dans l'interface",
|
||||
"showRatings": "affiche la notation à étoiles",
|
||||
"combinedLyricsAndVisualizer_description": "combine les paroles et le visualisateur dans le même panneau",
|
||||
"combinedLyricsAndVisualizer": "combine les paroles et le visualisateur dans la barre latérale"
|
||||
},
|
||||
"form": {
|
||||
"deletePlaylist": {
|
||||
"title": "supprimer de $t(entity.playlist_one)",
|
||||
"success": "$t(entity.playlist_one) supprimée avec succès",
|
||||
"input_confirm": "taper le nom de la $t(entity.playlist_one) pour confirmer"
|
||||
"title": "supprimer de $t(entity.playlist, {\"count\": 1})",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) supprimée avec succès",
|
||||
"input_confirm": "taper le nom de la $t(entity.playlist, {\"count\": 1}) pour confirmer"
|
||||
},
|
||||
"addServer": {
|
||||
"title": "ajouter un serveur",
|
||||
@@ -790,20 +821,23 @@
|
||||
"ignoreCors": "ignorer cors $t(common.restartRequired)",
|
||||
"error_savePassword": "une erreur s’est produite lors de la tentative de sauvegarde du mot de passe",
|
||||
"input_preferInstantMix": "Préférer le mix instantané",
|
||||
"input_preferInstantMixDescription": "Utiliser uniquement le mix instantané pour jouer des pistes similaires. Activez cette option si vous avez des plugins qui modifient ce comportement"
|
||||
"input_preferInstantMixDescription": "Utiliser uniquement le mix instantané pour jouer des pistes similaires. Activez cette option si vous avez des plugins qui modifient ce comportement",
|
||||
"input_preferRemoteUrl": "préférer une URL publique",
|
||||
"input_remoteUrl": "URL publique",
|
||||
"input_remoteUrlPlaceholder": "optionnel : URL publique pour les fonctionnalités externes"
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"success": "$t(entity.trackWithCount, {\"count\" : {{message}} }) ajouté à $t(entity.playlistWithCount, {\"count\" : {{numOfPlaylists}} })",
|
||||
"title": "ajouter à $t(entity.playlist_one)",
|
||||
"title": "ajouter à $t(entity.playlist, {\"count\": 1})",
|
||||
"input_skipDuplicates": "sauter les doublons",
|
||||
"input_playlists": "$t(entity.playlist_other)",
|
||||
"create": "créer $t(entity.playlist_one) {{playlist}}",
|
||||
"searchOrCreate": "rechercher $t(entity.playlist_other) ou tapez pour en créer une nouvelle"
|
||||
"input_playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"create": "créer $t(entity.playlist, {\"count\": 1}) {{playlist}}",
|
||||
"searchOrCreate": "rechercher $t(entity.playlist, {\"count\": 2}) ou tapez pour en créer une nouvelle"
|
||||
},
|
||||
"createPlaylist": {
|
||||
"title": "créer une $t(entity.playlist_one)",
|
||||
"title": "créer une $t(entity.playlist, {\"count\": 1})",
|
||||
"input_public": "publique",
|
||||
"success": "$t(entity.playlist_one) créée avec succès",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) créée avec succès",
|
||||
"input_description": "$t(common.description)",
|
||||
"input_name": "$t(common.name)",
|
||||
"input_owner": "$t(common.owner)"
|
||||
@@ -822,15 +856,15 @@
|
||||
"clearFilters": "réinitialiser les filtres"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"title": "modifier $t(entity.playlist_one)",
|
||||
"title": "modifier $t(entity.playlist, {\"count\": 1})",
|
||||
"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, {\"count\": 1}) mis à jour avec succès",
|
||||
"editNote": "les modifications manuelles ne sont pas recommandées pour les listes de lecture volumineuses. êtes-vous sûre d'accepter le risque d'une perte de données en écrasant la liste de lecture existante ?"
|
||||
},
|
||||
"lyricSearch": {
|
||||
"title": "recherche de paroles",
|
||||
"input_name": "$t(common.name)",
|
||||
"input_artist": "$t(entity.artist_one)"
|
||||
"input_artist": "$t(entity.artist, {\"count\": 1})"
|
||||
},
|
||||
"shareItem": {
|
||||
"allowDownloading": "autoriser le téléchargement",
|
||||
@@ -851,7 +885,7 @@
|
||||
},
|
||||
"shuffleAll": {
|
||||
"title": "jouer aléatoirement",
|
||||
"input_genre": "$t(entity.genre_one)",
|
||||
"input_genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"input_limit": "combien de titres ?",
|
||||
"input_minYear": "à partir de l'année",
|
||||
"input_maxYear": "à l'année",
|
||||
@@ -869,6 +903,11 @@
|
||||
},
|
||||
"saveQueue": {
|
||||
"success": "file d'attente de lecture enregistrée sur le serveur"
|
||||
},
|
||||
"lyricsExport": {
|
||||
"export": "exporter les paroles",
|
||||
"input_synced": "exporter les paroles synchronisées",
|
||||
"input_offset": "$t(setting.lyricOffset)"
|
||||
}
|
||||
},
|
||||
"entity": {
|
||||
@@ -908,7 +947,7 @@
|
||||
"folder_one": "dossier",
|
||||
"folder_many": "dossiers",
|
||||
"folder_other": "dossiers",
|
||||
"smartPlaylist": "$t(entity.playlist_one) intelligente",
|
||||
"smartPlaylist": "$t(entity.playlist, {\"count\": 1}) intelligente",
|
||||
"album_one": "album",
|
||||
"album_many": "albums",
|
||||
"album_other": "albums",
|
||||
@@ -925,11 +964,11 @@
|
||||
"song_many": "titres",
|
||||
"song_other": "titres",
|
||||
"radioStation_one": "station radio",
|
||||
"radioStation_many": "stations radios",
|
||||
"radioStation_other": "",
|
||||
"radioStation_many": "stations radio",
|
||||
"radioStation_other": "stations radio",
|
||||
"radioStationWithCount_one": "{{count}} station radio",
|
||||
"radioStationWithCount_many": "{{count}} stations radios",
|
||||
"radioStationWithCount_other": ""
|
||||
"radioStationWithCount_many": "{{count}} stations radio",
|
||||
"radioStationWithCount_other": "{{count}} stations radio"
|
||||
},
|
||||
"table": {
|
||||
"config": {
|
||||
@@ -980,26 +1019,26 @@
|
||||
"discNumber": "disque n°",
|
||||
"duration": "$t(common.duration)",
|
||||
"bpm": "$t(common.bpm)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"album": "$t(entity.album_one)",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"biography": "$t(common.biography)",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"bitrate": "$t(common.bitrate)",
|
||||
"actions": "$t(common.action_other)",
|
||||
"favorite": "$t(common.favorite)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"rating": "$t(common.rating)",
|
||||
"note": "$t(common.note)",
|
||||
"owner": "$t(common.owner)",
|
||||
"path": "$t(common.path)",
|
||||
"title": "$t(common.title)",
|
||||
"size": "$t(common.size)",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"year": "$t(common.year)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"songCount": "$t(entity.track, {\"count\": 2})",
|
||||
"codec": "$t(common.codec)",
|
||||
"albumCount": "$t(entity.album_other)",
|
||||
"genreBadge": "$t(entity.genre_one) (badges)",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2})",
|
||||
"genreBadge": "$t(entity.genre, {\"count\": 1}) (badges)",
|
||||
"image": "image",
|
||||
"bitDepth": "$t(common.bitDepth)",
|
||||
"sampleRate": "$t(common.sampleRate)"
|
||||
@@ -1022,11 +1061,11 @@
|
||||
"albumArtist": "artiste de l'album",
|
||||
"path": "chemin",
|
||||
"discNumber": "disque",
|
||||
"albumCount": "$t(entity.album_other)",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2})",
|
||||
"lastPlayed": "écouté récemment",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"songCount": "$t(entity.track, {\"count\": 2})",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"size": "$t(common.size)",
|
||||
"codec": "$t(common.codec)",
|
||||
@@ -1042,7 +1081,7 @@
|
||||
},
|
||||
"releaseType": {
|
||||
"primary": {
|
||||
"album": "$t(entity.album_one)",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"broadcast": "diffuser",
|
||||
"ep": "ep",
|
||||
"other": "autre",
|
||||
@@ -1087,5 +1126,81 @@
|
||||
"notInPlaylist": "n'est pas dans",
|
||||
"notInTheLast": "n'est pas dans le dernier",
|
||||
"startsWith": "commence par"
|
||||
},
|
||||
"datetime": {
|
||||
"minuteShort": "m",
|
||||
"secondShort": "s",
|
||||
"hourShort": "h",
|
||||
"dayShort": "j"
|
||||
},
|
||||
"visualizer": {
|
||||
"visualizerType": "type de visualisateur",
|
||||
"cyclePresets": "cycle les préréglages",
|
||||
"cycleTime": "temps de cycle (secondes)",
|
||||
"includeAllPresets": "inclure tous les préréglages",
|
||||
"ignoredPresets": "préréglages ignorés",
|
||||
"selectedPresets": "préréglages sélectionné",
|
||||
"randomizeNextPreset": "randomiser le préréglage suivant",
|
||||
"blendTime": "temps de mélange",
|
||||
"presets": "préréglages",
|
||||
"selectPreset": "sélectionner un préréglage",
|
||||
"applyPreset": "appliquer le préréglage",
|
||||
"saveAsPreset": "enregistrer en tant que préréglage",
|
||||
"updatePreset": "mettre à jour le préréglage",
|
||||
"copyConfiguration": "copier la configuration",
|
||||
"pasteConfiguration": "coller la configuration",
|
||||
"pasteConfigurationPlaceholder": "coller ici la configuration JSON...",
|
||||
"pasteFromClipboard": "coller depuis le presse-papier",
|
||||
"applyConfiguration": "appliquer la configuration",
|
||||
"configCopied": "configuration copiée dans le presse-papiers",
|
||||
"configCopyFailed": "échec de la copie de la configuration",
|
||||
"configPasted": "configuration appliquée avec succès",
|
||||
"configPasteFailed": "échec de l'application de la configuration. Merci de vérifier le format.",
|
||||
"configPasteReadFailed": "échec de la lecture du presse-papiers",
|
||||
"presetName": "nom du préréglage",
|
||||
"presetNamePlaceholder": "saisissez le nom du préréglage",
|
||||
"general": "générale",
|
||||
"mode": "mode",
|
||||
"mode1To8": "Mode 1 - 8",
|
||||
"mode10": "Mode 10",
|
||||
"barSpace": "espacement des barres",
|
||||
"lineWidth": "Largeur des traits",
|
||||
"fillAlpha": "remplissage alpha",
|
||||
"channelLayout": "disposition des canaux",
|
||||
"maxFPS": "FPS Maximum",
|
||||
"opacity": "opacité",
|
||||
"customGradients": "dégradés personnalisés",
|
||||
"addCustomGradient": "ajouter un dégradés personnalisés",
|
||||
"gradientName": "nom du dégradé",
|
||||
"gradientNamePlaceholder": "nom du dégradé",
|
||||
"vertical": "verticale",
|
||||
"horizontal": "horizontale",
|
||||
"colorStops": "couleur d'arrêts",
|
||||
"addColor": "ajouter un couleur",
|
||||
"position": "position",
|
||||
"level": "niveau",
|
||||
"remove": "supprimer",
|
||||
"pasteGradient": "coller le dégradé",
|
||||
"pasteGradientPlaceholder": "coller ici le dégradé JSON...",
|
||||
"custom": "personnalisé",
|
||||
"builtIn": "intégré",
|
||||
"colors": "couleurs",
|
||||
"colorMode": "mode de couleur",
|
||||
"gradient": "dégradé",
|
||||
"gradientLeft": "dégradé gauche",
|
||||
"gradientRight": "dégradé droite",
|
||||
"smoothing": "lissage",
|
||||
"frequencyRangeAndScaling": "plage de fréquence et mise à l'échelle",
|
||||
"minimumFrequency": "fréquence minimum",
|
||||
"maximumFrequency": "fréquence maximum",
|
||||
"frequencyScale": "mise à l'échelle de fréquence",
|
||||
"sensitivity": "sensibilité",
|
||||
"weightingFilter": "filter de pondérage",
|
||||
"minimumDecibels": "décibels minimum",
|
||||
"maximumDecibels": "décibels maximum",
|
||||
"linearAmplitude": "amplitude linéaire",
|
||||
"linearBoost": "boost linéaire",
|
||||
"peakBehavior": "comportement des piques",
|
||||
"showPeaks": "afficher les piques"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,26 +1,26 @@
|
||||
{
|
||||
"action": {
|
||||
"moveToNext": "ugrás a következőre",
|
||||
"deletePlaylist": "$t(entity.playlist_one) törlése",
|
||||
"removeFromFavorites": "eltávolítás innen $t(entity.favorite_other)",
|
||||
"deletePlaylist": "$t(entity.playlist, {\"count\": 1}) törlése",
|
||||
"removeFromFavorites": "eltávolítás innen $t(entity.favorite, {\"count\": 2})",
|
||||
"setRating": "értékelés",
|
||||
"viewPlaylists": "$t(entity.playlist_other) megtekintése",
|
||||
"viewPlaylists": "$t(entity.playlist, {\"count\": 2}) megtekintése",
|
||||
"openIn": {
|
||||
"lastfm": "Megnyitás Last.fm-ben",
|
||||
"musicbrainz": "Megnyitás MusicBrainz-ben"
|
||||
},
|
||||
"clearQueue": "műsorlista kiürítése",
|
||||
"createPlaylist": "$t(entity.playlist_one) létrehozása",
|
||||
"createPlaylist": "$t(entity.playlist, {\"count\": 1}) létrehozása",
|
||||
"deselectAll": "kijelölés törlése",
|
||||
"editPlaylist": "$t(entity.playlist_one) szerkesztése",
|
||||
"editPlaylist": "$t(entity.playlist, {\"count\": 1}) szerkesztése",
|
||||
"goToPage": "menj az oldalra",
|
||||
"moveToBottom": "ugrás az aljára",
|
||||
"moveToTop": "ugrás a tetejére",
|
||||
"removeFromPlaylist": "eltávolítás innen $t(entity.playlist_one)",
|
||||
"removeFromPlaylist": "eltávolítás innen $t(entity.playlist, {\"count\": 1})",
|
||||
"removeFromQueue": "eltávolítás a műsorlistáról",
|
||||
"toggleSmartPlaylistEditor": "$t(entity.smartPlaylist) szerkesztője",
|
||||
"addToFavorites": "$t(entity.favorite_other) kedvelése",
|
||||
"addToPlaylist": "hozzáadás lejátszási listához: $t(entity.playlist_one)",
|
||||
"addToFavorites": "$t(entity.favorite, {\"count\": 2}) kedvelése",
|
||||
"addToPlaylist": "hozzáadás lejátszási listához: $t(entity.playlist, {\"count\": 1})",
|
||||
"refresh": "$t(common.refresh)",
|
||||
"downloadStarted": "megkezdődött {{count}} elem letöltése",
|
||||
"moveItems": "elemek mozgatása",
|
||||
@@ -31,11 +31,17 @@
|
||||
"moveUp": "ugrás fel",
|
||||
"moveDown": "ugrás le",
|
||||
"holdToMoveToTop": "hosszan nyomva felülre mozgat",
|
||||
"holdToMoveToBottom": "hosszan nyomva lejjebb mozgat"
|
||||
"holdToMoveToBottom": "hosszan nyomva lejjebb mozgat",
|
||||
"selectAll": "összes kijelölése",
|
||||
"deleteRadioStation": "$t(entity.radioStation, {\"count\": 1}) törlése",
|
||||
"createRadioStation": "$t(entity.radioStation, {\"count\": 1}) létrehozása",
|
||||
"openApplicationDirectory": "app könyvtár megnyitása",
|
||||
"addOrRemoveFromSelection": "hozzáadás vagy eltávolítás a kiválasztásból",
|
||||
"selectRangeOfItems": "válaszd ki a tartományt"
|
||||
},
|
||||
"common": {
|
||||
"collapse": "összecsukás",
|
||||
"currentSong": "jelenlegi: $t(entity.track_one)",
|
||||
"currentSong": "jelenlegi: $t(entity.track, {\"count\": 1})",
|
||||
"no": "nem",
|
||||
"close": "bezárás",
|
||||
"confirm": "rendben",
|
||||
@@ -94,7 +100,7 @@
|
||||
"path": "elérési út",
|
||||
"playerMustBePaused": "a lejátszónak szüneteltetve kell lennie",
|
||||
"preview": "előnézet",
|
||||
"previousSong": "előző $t(entity.track_one)",
|
||||
"previousSong": "előző $t(entity.track, {\"count\": 1})",
|
||||
"quit": "kilépés",
|
||||
"random": "véletlenszerű",
|
||||
"refresh": "frissítés",
|
||||
@@ -110,7 +116,8 @@
|
||||
"yes": "igen",
|
||||
"none": "egyik sem",
|
||||
"restartRequired": "újraindítás szükséges",
|
||||
"setting": "beállítás",
|
||||
"setting_one": "beállítás",
|
||||
"setting_other": "",
|
||||
"translation": "fordítás",
|
||||
"rating": "értékelés",
|
||||
"reload": "újratöltés",
|
||||
@@ -145,7 +152,9 @@
|
||||
"tableColumns": "táblázat oszlopok",
|
||||
"itemsMore": "{{count}} még több",
|
||||
"view": "nézet",
|
||||
"noFilters": "nincs konfigurált szűrő"
|
||||
"noFilters": "nincs konfigurált szűrő",
|
||||
"countSelected": "{{count}} kiválasztott",
|
||||
"retry": "újra"
|
||||
},
|
||||
"entity": {
|
||||
"albumArtist_one": "Zenész",
|
||||
@@ -168,7 +177,7 @@
|
||||
"song_other": "dalok",
|
||||
"album_one": "album",
|
||||
"album_other": "albumok",
|
||||
"smartPlaylist": "intelligens $t(entity.playlist_one)",
|
||||
"smartPlaylist": "intelligens $t(entity.playlist, {\"count\": 1})",
|
||||
"artistWithCount_one": "{{count}} előadó",
|
||||
"artistWithCount_other": "{{count}} előadók",
|
||||
"playlist_one": "lejátszási lista",
|
||||
@@ -184,7 +193,9 @@
|
||||
"trackWithCount_one": "{{count}} sáv",
|
||||
"trackWithCount_other": "{{count}} sávok",
|
||||
"radioStation_one": "rádió állomás",
|
||||
"radioStation_other": "rádió állomások"
|
||||
"radioStation_other": "rádió állomások",
|
||||
"radioStationWithCount_one": "{{count}} rádióállomás",
|
||||
"radioStationWithCount_other": "{{count}} rádióállomások"
|
||||
},
|
||||
"error": {
|
||||
"apiRouteError": "a kérést nem sikerült célba juttatni",
|
||||
@@ -210,10 +221,15 @@
|
||||
"serverRequired": "szerver szükséges",
|
||||
"serverNotSelectedError": "nincs szerver kiválasztva",
|
||||
"notificationDenied": "Az értesítések engedélyezése megtagadva. Ez a beállítás hatástalan",
|
||||
"badValue": "érvénytelen opció \"{{value}}\". ez az érték már nem létezik"
|
||||
"badValue": "érvénytelen opció \"{{value}}\". ez az érték már nem létezik",
|
||||
"noNetwork": "Szerver nem elérhető",
|
||||
"noNetworkDescription": "Nem tudok csatlakozni a szerverhez",
|
||||
"saveQueueFailed": "műsorlista mentése sikertelen",
|
||||
"settingsSyncError": "Eltéréseket találtam a leképző és a fő folyamat beállításai között. Indítsd újra az alkalmazást",
|
||||
"multipleServerSaveQueueError": "a műsorlistában egy vagy több olyan dal található, amely nem az aktuális szerverről származik. Ez nem támogatott"
|
||||
},
|
||||
"filter": {
|
||||
"albumCount": "$t(entity.album_other) darab",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2}) darab",
|
||||
"bitrate": "bitráta",
|
||||
"comment": "megjegyzés",
|
||||
"dateAdded": "hozzáadás ideje",
|
||||
@@ -234,9 +250,9 @@
|
||||
"disc": "lemez",
|
||||
"criticRating": "kritikusok értékelése",
|
||||
"communityRating": "közösségi értékelés",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"biography": "életrajz",
|
||||
"album": "$t(entity.album_one)",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"favorited": "kedvelt",
|
||||
"isRecentlyPlayed": "mostanában lejátszott",
|
||||
"name": "név",
|
||||
@@ -251,10 +267,10 @@
|
||||
"path": "elérési út",
|
||||
"toYear": "évhez",
|
||||
"trackNumber": "sáv",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"bpm": "bpm",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"explicitStatus": "$t(common.explicitStatus)"
|
||||
},
|
||||
"form": {
|
||||
@@ -275,33 +291,33 @@
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"input_skipDuplicates": "duplikátumok átugrása",
|
||||
"input_playlists": "$t(entity.playlist_other)",
|
||||
"input_playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"success": "hozzáadtuk ezt: $t(entity.trackWithCount, {\"count\": {{message}} }) a következőhöz: $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })",
|
||||
"title": "hozzáadás a következőhöz: $t(entity.playlist_one)",
|
||||
"create": "létrehoz $t(entity.playlist_one) {{playlist}}",
|
||||
"searchOrCreate": "keresés $t(entity.playlist_other) vagy új létrehozása"
|
||||
"title": "hozzáadás a következőhöz: $t(entity.playlist, {\"count\": 1})",
|
||||
"create": "létrehoz $t(entity.playlist, {\"count\": 1}) {{playlist}}",
|
||||
"searchOrCreate": "keresés $t(entity.playlist, {\"count\": 2}) vagy új létrehozása"
|
||||
},
|
||||
"createPlaylist": {
|
||||
"input_description": "$t(common.description)",
|
||||
"input_name": "$t(common.name)",
|
||||
"input_owner": "$t(common.owner)",
|
||||
"input_public": "publikus",
|
||||
"title": "$t(entity.playlist_one) létrehozása",
|
||||
"success": "$t(entity.playlist_one) sikeresen létrehozva"
|
||||
"title": "$t(entity.playlist, {\"count\": 1}) létrehozása",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) sikeresen létrehozva"
|
||||
},
|
||||
"deletePlaylist": {
|
||||
"input_confirm": "a megerősítéshez írd be a(z) $t(entity.playlist_one) nevét",
|
||||
"success": "$t(entity.playlist_one) sikeresen törölve",
|
||||
"title": "$t(entity.playlist_one) törlése"
|
||||
"input_confirm": "a megerősítéshez írd be a(z) $t(entity.playlist, {\"count\": 1}) nevét",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) sikeresen törölve",
|
||||
"title": "$t(entity.playlist, {\"count\": 1}) törlése"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"success": "$t(entity.playlist_one) sikeresen módosítva",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) sikeresen módosítva",
|
||||
"publicJellyfinNote": "A Jellyfin valamiért nem teszi közzé, hogy egy lejátszási lista publikus-e vagy sem. Amennyiben azt szeretnéd, hogy publikus maradjon, válaszd ki az alábbi beviteli mezőt",
|
||||
"title": "szerkesztés $t(entity.playlist_one)",
|
||||
"title": "szerkesztés $t(entity.playlist, {\"count\": 1})",
|
||||
"editNote": "A kézi szerkesztés nem ajánlott nagy lejátszási listák esetén. Biztosan vállalod a meglévő lejátszási lista felülírásával járó adatvesztés kockázatát?"
|
||||
},
|
||||
"lyricSearch": {
|
||||
"input_artist": "$t(entity.artist_one)",
|
||||
"input_artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"input_name": "$t(common.name)",
|
||||
"title": "dalszöveg kereső"
|
||||
},
|
||||
@@ -337,7 +353,7 @@
|
||||
},
|
||||
"shuffleAll": {
|
||||
"title": "véletlenszerű lejátszás",
|
||||
"input_genre": "$t(entity.genre_one)",
|
||||
"input_genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"input_limit": "Hány dal?",
|
||||
"input_minYear": "ettől az évtől",
|
||||
"input_maxYear": "eddig az évig",
|
||||
@@ -345,6 +361,16 @@
|
||||
"input_played": "csak szűrt zenék",
|
||||
"input_played_optionUnplayed": "Csak a még nem lejátszottak",
|
||||
"input_played_optionPlayed": "Csak a játszottak számok"
|
||||
},
|
||||
"createRadioStation": {
|
||||
"success": "rádió állomás sikeresen létrehozva",
|
||||
"title": "rádió állomás létrehozása",
|
||||
"input_homepageUrl": "oldal url",
|
||||
"input_name": "név",
|
||||
"input_streamUrl": "stream url"
|
||||
},
|
||||
"saveQueue": {
|
||||
"success": "mentett lejátszási műsorlista a szerverre"
|
||||
}
|
||||
},
|
||||
"dragDropZone": {
|
||||
@@ -358,24 +384,24 @@
|
||||
"appearsOn": "megjelenik",
|
||||
"recentReleases": "legújabb kiadványok",
|
||||
"viewDiscography": "Diszkográfia megtekintése",
|
||||
"relatedArtists": "kapcsolódik $t(entity.artist_other)",
|
||||
"relatedArtists": "kapcsolódik $t(entity.artist, {\"count\": 2})",
|
||||
"topSongs": "sláger dalok",
|
||||
"topSongsFrom": "sláger dalok tőle {{title}}",
|
||||
"viewAll": "mindet megtekint",
|
||||
"viewAllTracks": "mindet megtekint $t(entity.track_other)"
|
||||
"viewAllTracks": "mindet megtekint $t(entity.track, {\"count\": 2})"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
"title": "$t(entity.albumArtist, {\"count\": 2})"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "még több ettől $t(entity.artist_one)",
|
||||
"moreFromArtist": "még több ettől $t(entity.artist, {\"count\": 1})",
|
||||
"moreFromGeneric": "Még több {{item}}",
|
||||
"released": "megjelent"
|
||||
},
|
||||
"albumList": {
|
||||
"artistAlbums": "albumok tőle {{artist}}",
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)",
|
||||
"title": "$t(entity.album_other)"
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album, {\"count\": 2})",
|
||||
"title": "$t(entity.album, {\"count\": 2})"
|
||||
},
|
||||
"appMenu": {
|
||||
"collapseSidebar": "oldalsáv",
|
||||
@@ -388,7 +414,7 @@
|
||||
"openBrowserDevtools": "Fejlesztői eszközök",
|
||||
"quit": "$t(common.quit)",
|
||||
"selectServer": "Szerver választása",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"version": "verzió {{version}}",
|
||||
"selectMusicFolder": "zene mappa kiválasztása",
|
||||
"noMusicFolder": "nincs zene mappa kiválasztva",
|
||||
@@ -425,8 +451,8 @@
|
||||
"setRating": "$t(action.setRating)",
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"shareItem": "Megosztás",
|
||||
"goToAlbum": "menj az $t(entity.album_one)",
|
||||
"goToAlbumArtist": "menj a $t(entity.albumArtist_one)",
|
||||
"goToAlbum": "menj az $t(entity.album, {\"count\": 1})",
|
||||
"goToAlbumArtist": "menj a $t(entity.albumArtist, {\"count\": 1})",
|
||||
"showDetails": "info",
|
||||
"moveItems": "$t(action.moveItems)",
|
||||
"goTo": "menj"
|
||||
@@ -455,9 +481,9 @@
|
||||
"noLyrics": "nem található dalszöveg"
|
||||
},
|
||||
"genreList": {
|
||||
"showAlbums": "mutasd a $t(entity.genre_one) $t(entity.album_other)",
|
||||
"showTracks": "mutasd a $t(entity.genre_one) $t(entity.track_other)",
|
||||
"title": "$t(entity.genre_other)"
|
||||
"showAlbums": "mutasd a $t(entity.genre, {\"count\": 1}) $t(entity.album, {\"count\": 2})",
|
||||
"showTracks": "mutasd a $t(entity.genre, {\"count\": 1}) $t(entity.track, {\"count\": 2})",
|
||||
"title": "$t(entity.genre, {\"count\": 2})"
|
||||
},
|
||||
"globalSearch": {
|
||||
"commands": {
|
||||
@@ -474,7 +500,7 @@
|
||||
"recentlyPlayed": "nemrég játszott",
|
||||
"recentlyReleased": "nemrég megjelent",
|
||||
"title": "$t(common.home)",
|
||||
"genres": "$t(entity.genre_other)"
|
||||
"genres": "$t(entity.genre, {\"count\": 2})"
|
||||
},
|
||||
"itemDetail": {
|
||||
"copyPath": "másolja az útvonalat a vágólapra",
|
||||
@@ -485,7 +511,7 @@
|
||||
"reorder": "átrendezés csak ID szerinti rendezés esetén engedélyezett"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist_other)"
|
||||
"title": "$t(entity.playlist, {\"count\": 2})"
|
||||
},
|
||||
"setting": {
|
||||
"advanced": "haladó",
|
||||
@@ -512,36 +538,40 @@
|
||||
"logger": "naplózó"
|
||||
},
|
||||
"sidebar": {
|
||||
"albumArtists": "$t(entity.albumArtist_other)",
|
||||
"albums": "$t(entity.album_other)",
|
||||
"artists": "$t(entity.artist_other)",
|
||||
"folders": "$t(entity.folder_other)",
|
||||
"genres": "$t(entity.genre_other)",
|
||||
"albumArtists": "$t(entity.albumArtist, {\"count\": 2})",
|
||||
"albums": "$t(entity.album, {\"count\": 2})",
|
||||
"artists": "$t(entity.artist, {\"count\": 2})",
|
||||
"folders": "$t(entity.folder, {\"count\": 2})",
|
||||
"genres": "$t(entity.genre, {\"count\": 2})",
|
||||
"home": "$t(common.home)",
|
||||
"myLibrary": "Könyvtáram",
|
||||
"nowPlaying": "most játszott",
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"search": "$t(common.search)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"shared": "megosztott $t(entity.playlist_other)",
|
||||
"tracks": "$t(entity.track_other)",
|
||||
"favorites": "$t(entity.favorite_other)"
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"shared": "megosztott $t(entity.playlist, {\"count\": 2})",
|
||||
"tracks": "$t(entity.track, {\"count\": 2})",
|
||||
"favorites": "$t(entity.favorite, {\"count\": 2})",
|
||||
"radio": "$t(entity.radioStation, {\"count\": 2})"
|
||||
},
|
||||
"trackList": {
|
||||
"artistTracks": "dalok tőle {{artist}}",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track_other)",
|
||||
"title": "$t(entity.track_other)"
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track, {\"count\": 2})",
|
||||
"title": "$t(entity.track, {\"count\": 2})"
|
||||
},
|
||||
"favorites": {
|
||||
"title": "$t(entity.favorite_other)"
|
||||
"title": "$t(entity.favorite, {\"count\": 2})"
|
||||
},
|
||||
"folderList": {
|
||||
"title": "$t(entity.folder_other)"
|
||||
"title": "$t(entity.folder, {\"count\": 2})"
|
||||
},
|
||||
"radioList": {
|
||||
"title": "rádió állomások"
|
||||
}
|
||||
},
|
||||
"player": {
|
||||
"addLast": "utoljára hozzáadva",
|
||||
"addNext": "következő hozzáadása",
|
||||
"addLast": "utolsónak",
|
||||
"addNext": "következő",
|
||||
"favorite": "kedvenc",
|
||||
"mute": "némítás",
|
||||
"muted": "némítva",
|
||||
@@ -571,17 +601,16 @@
|
||||
"pause": "szünet",
|
||||
"viewQueue": "műsorlista megtekintése",
|
||||
"shuffle_off": "kevert lejátszás ki",
|
||||
"addLastShuffled": "Hozzáadás a végére (keverve)",
|
||||
"addNextShuffled": "Hozzáadás következőnek (keverve)",
|
||||
"queueType": "lekérdezés típus",
|
||||
"queueType_default": "alapértelmezett",
|
||||
"queueType_priority": "prioritás",
|
||||
"addLastShuffled": "végére (keverve)",
|
||||
"addNextShuffled": "következő (keverve)",
|
||||
"holdToShuffle": "tartsd lenyomva a keveréshez",
|
||||
"lyrics": "dalszöveg"
|
||||
"lyrics": "dalszöveg",
|
||||
"saveQueueToServer": "műsorlista mentése a szerverre",
|
||||
"restoreQueueFromServer": "műsorlista visszaállítása a szerverről"
|
||||
},
|
||||
"releaseType": {
|
||||
"primary": {
|
||||
"album": "$t(entity.album_one)",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"broadcast": "sugárzás",
|
||||
"ep": "ep",
|
||||
"other": "más",
|
||||
@@ -766,7 +795,6 @@
|
||||
"playButtonBehavior_optionPlay": "$t(player.play)",
|
||||
"playButtonBehavior_optionPlayShuffled": "$t(player.shuffle)",
|
||||
"playButtonBehavior": "lejátszás gomb viselkedése",
|
||||
"playerAlbumArtResolution_description": "A nagy lejátszó albumborító-előnézetének felbontása. A nagyobb érték élesebb képet ad, de lassíthatja a betöltést. Alapértelmezés: 0, ami az automatikus módot jelenti",
|
||||
"minimumScrobblePercentage_description": "a szám lejátszásának minimális százaléka, amelynek el kell hangzania, mielőtt Scrobble-nak számít",
|
||||
"minimumScrobblePercentage": "Minimális Scrobble arány (százalék)",
|
||||
"minimumScrobbleSeconds": "Minimum Scrobble arány (mp)",
|
||||
@@ -780,7 +808,6 @@
|
||||
"notify": "bekapcsolja a dal értesítéseket",
|
||||
"notify_description": "értesítések megjelenítése az aktuális dal megváltoztatásakor",
|
||||
"playbackStyle_description": "válaszd ki az lejátszóhoz használni kívánt lejátszási stílust",
|
||||
"playerAlbumArtResolution": "lejátszó albumborító felbontás",
|
||||
"playerbarOpenDrawer_description": "lehetővé teszi a lejátszósávra kattintással a teljes képernyős lejátszó megnyitását",
|
||||
"playerbarOpenDrawer": "lejátszósáv teljes képernyőre váltás",
|
||||
"preferLocalLyrics_description": "ha elérhető, akkor a távoli dalszövegek helyett a helyi dalszövegeket részesítse előnyben",
|
||||
@@ -798,9 +825,9 @@
|
||||
"passwordStore_description": "jelszó/titkos tároló kiválasztása. Módosítsd, ha problémát tapasztalsz a jelszavak tárolásánál",
|
||||
"passwordStore": "jelszó/titkos tároló",
|
||||
"playbackStyle_optionCrossFade": "áthúzás",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album_one)",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album, {\"count\": 1})",
|
||||
"replayGainMode_optionNone": "$t(common.none)",
|
||||
"replayGainMode_optionTrack": "$t(entity.track_one)",
|
||||
"replayGainMode_optionTrack": "$t(entity.track, {\"count\": 1})",
|
||||
"replayGainMode": "{{ReplayGain}} mód",
|
||||
"replayGainClipping_description": "A {{ReplayGain}} által okozott torzítás megelőzése az erősítés automatikus csökkentésével",
|
||||
"replayGainClipping": "{{ReplayGain}} torzítás",
|
||||
@@ -908,7 +935,9 @@
|
||||
"playerFilters_description": "a következő kritériumok alapján kihagyja a dalokat a műsorlistából",
|
||||
"playerbarSlider_description": "a hullámforma nem ajánlott lassú vagy korlátozott internetkapcsolat esetén",
|
||||
"audioFadeOnStatusChange": "audio behúzás állapotváltozáskor",
|
||||
"audioFadeOnStatusChange_description": "lehetővé teszi a lehúzást és a behúzást, amikor a lejátszás/szünet állapot megváltozik"
|
||||
"audioFadeOnStatusChange_description": "lehetővé teszi a lehúzást és a behúzást, amikor a lejátszás/szünet állapot megváltozik",
|
||||
"useThemeAccentColor": "használd a téma kiemelő színét",
|
||||
"useThemeAccentColor_description": "a kiválasztott témában meghatározott alapszínt használja az egyéni kiemelő szín helyett"
|
||||
},
|
||||
"table": {
|
||||
"config": {
|
||||
@@ -919,17 +948,17 @@
|
||||
"releaseDate": "megjelenés dátuma",
|
||||
"rowIndex": "sor index",
|
||||
"size": "$t(common.size)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"songCount": "$t(entity.track, {\"count\": 2})",
|
||||
"title": "$t(common.title)",
|
||||
"titleCombined": "$t(common.title) (kombinált)",
|
||||
"trackNumber": "szám",
|
||||
"year": "$t(common.year)",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"lastPlayed": "utoljára játszott",
|
||||
"note": "$t(common.note)",
|
||||
"owner": "$t(common.owner)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"biography": "$t(common.biography)",
|
||||
"bitrate": "$t(common.bitrate)",
|
||||
"bpm": "$t(common.bpm)",
|
||||
@@ -940,9 +969,9 @@
|
||||
"duration": "$t(common.duration)",
|
||||
"favorite": "$t(common.favorite)",
|
||||
"actions": "$t(common.action_other)",
|
||||
"album": "$t(entity.album_one)",
|
||||
"albumCount": "$t(entity.album_other)",
|
||||
"genreBadge": "$t(entity.genre_one) (jelvények)",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2})",
|
||||
"genreBadge": "$t(entity.genre, {\"count\": 1}) (jelvények)",
|
||||
"image": "kép",
|
||||
"bitDepth": "$t(common.bitDepth)",
|
||||
"sampleRate": "$t(common.sampleRate)"
|
||||
@@ -985,8 +1014,8 @@
|
||||
}
|
||||
},
|
||||
"column": {
|
||||
"albumCount": "$t(entity.album_other)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2})",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"biography": "életrajz",
|
||||
"bitrate": "bitráta",
|
||||
"bpm": "bpm",
|
||||
@@ -996,7 +1025,7 @@
|
||||
"dateAdded": "hozzáadva",
|
||||
"discNumber": "lemez",
|
||||
"favorite": "kedvenc",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"lastPlayed": "utoljára játszott",
|
||||
"path": "elérési út",
|
||||
"playCount": "lejátszások",
|
||||
@@ -1004,7 +1033,7 @@
|
||||
"releaseDate": "megjelenés",
|
||||
"releaseYear": "év",
|
||||
"size": "$t(common.size)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"songCount": "$t(entity.track, {\"count\": 2})",
|
||||
"title": "cím",
|
||||
"trackNumber": "sáv",
|
||||
"album": "album",
|
||||
@@ -1038,5 +1067,11 @@
|
||||
"matchesRegex": "illeszkedik a regexre",
|
||||
"is": "van",
|
||||
"isNot": "nincs"
|
||||
},
|
||||
"datetime": {
|
||||
"minuteShort": "perc",
|
||||
"secondShort": "mp",
|
||||
"hourShort": "óra",
|
||||
"dayShort": "nap"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,20 +1,20 @@
|
||||
{
|
||||
"action": {
|
||||
"editPlaylist": "modifica $t(entity.playlist_one)",
|
||||
"editPlaylist": "modifica $t(entity.playlist, {\"count\": 1})",
|
||||
"goToPage": "vai alla pagina",
|
||||
"clearQueue": "cancella la coda",
|
||||
"addToFavorites": "aggiungi a $t(entity.favorite_other)",
|
||||
"addToPlaylist": "aggiungi a $t(entity.playlist_one)",
|
||||
"createPlaylist": "crea $t(entity.playlist_one)",
|
||||
"removeFromPlaylist": "rimuovi da $t(entity.playlist_one)",
|
||||
"viewPlaylists": "visualizza $t(entity.playlist_other)",
|
||||
"addToFavorites": "aggiungi a $t(entity.favorite, {\"count\": 2})",
|
||||
"addToPlaylist": "aggiungi a $t(entity.playlist, {\"count\": 1})",
|
||||
"createPlaylist": "crea $t(entity.playlist, {\"count\": 1})",
|
||||
"removeFromPlaylist": "rimuovi da $t(entity.playlist, {\"count\": 1})",
|
||||
"viewPlaylists": "visualizza $t(entity.playlist, {\"count\": 2})",
|
||||
"refresh": "$t(common.refresh)",
|
||||
"deletePlaylist": "elimina $t(entity.playlist_one)",
|
||||
"deletePlaylist": "elimina $t(entity.playlist, {\"count\": 1})",
|
||||
"removeFromQueue": "rimuovi dalla coda",
|
||||
"deselectAll": "deseleziona tutto",
|
||||
"setRating": "vota",
|
||||
"toggleSmartPlaylistEditor": "attiva/disattiva editor $t(entity.smartPlaylist)",
|
||||
"removeFromFavorites": "rimuovi da $t(entity.favorite_other)",
|
||||
"removeFromFavorites": "rimuovi da $t(entity.favorite, {\"count\": 2})",
|
||||
"moveToTop": "sposta in cima",
|
||||
"moveToBottom": "sposta in fondo",
|
||||
"moveToNext": "passa al successivo",
|
||||
@@ -51,7 +51,7 @@
|
||||
"left": "sinistra",
|
||||
"save": "salva",
|
||||
"right": "destra",
|
||||
"currentSong": "$t(entity.track_one) corrente",
|
||||
"currentSong": "$t(entity.track, {\"count\": 1}) corrente",
|
||||
"trackNumber": "traccia",
|
||||
"descending": "decrescente",
|
||||
"gap": "gap",
|
||||
@@ -75,7 +75,9 @@
|
||||
"forward": "successivo",
|
||||
"delete": "elimina",
|
||||
"forceRestartRequired": "riavvia per applicare le modifiche... chiudi la notifica per riavviare",
|
||||
"setting": "impostazione",
|
||||
"setting_one": "impostazione",
|
||||
"setting_many": "",
|
||||
"setting_other": "",
|
||||
"version": "versione",
|
||||
"title": "titolo",
|
||||
"filter_one": "filtro",
|
||||
@@ -94,7 +96,7 @@
|
||||
"none": "nessuno",
|
||||
"menu": "menù",
|
||||
"restartRequired": "riavvio richiesto",
|
||||
"previousSong": "$t(entity.track_one) precedente",
|
||||
"previousSong": "$t(entity.track, {\"count\": 1}) precedente",
|
||||
"noResultsFromQuery": "la query non ha ritornato risultati",
|
||||
"quit": "esci",
|
||||
"expand": "espandi",
|
||||
@@ -204,7 +206,7 @@
|
||||
"exitToTray_description": "riduce a icona nella barra di sistema all'uscita",
|
||||
"followLyric_description": "scorre il testo alla posizione di riproduzione corrente",
|
||||
"hotkey_favoritePreviousSong": "$t(common.previousSong) preferita",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album_one)",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album, {\"count\": 1})",
|
||||
"lyricOffset": "offset testi (ms)",
|
||||
"discordUpdateInterval_description": "il tempo in secondi tra ogni aggiornamento (minimo 15 secondi)",
|
||||
"fontType_optionCustom": "font personalizzato",
|
||||
@@ -216,7 +218,7 @@
|
||||
"playbackStyle_optionCrossFade": "dissolvenza",
|
||||
"hotkey_rate3": "voto 3 stelle",
|
||||
"font": "font",
|
||||
"replayGainMode_optionTrack": "$t(entity.track_one)",
|
||||
"replayGainMode_optionTrack": "$t(entity.track, {\"count\": 1})",
|
||||
"themeLight_description": "imposta il tema chiaro da usare per l'applicazione",
|
||||
"hotkey_toggleFullScreenPlayer": "attiva/disattiva player a schermo intero",
|
||||
"hotkey_localSearch": "ricerca in-pagina",
|
||||
@@ -355,8 +357,6 @@
|
||||
"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 dell’anteprima 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",
|
||||
@@ -436,17 +436,17 @@
|
||||
"rating": "voto",
|
||||
"search": "cerca",
|
||||
"bitrate": "bitrate",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"recentlyAdded": "aggiunti recentemente",
|
||||
"note": "nota",
|
||||
"name": "nome",
|
||||
"dateAdded": "data aggiunta",
|
||||
"releaseDate": "data di rilascio",
|
||||
"albumCount": "numero $t(entity.album_other)",
|
||||
"albumCount": "numero $t(entity.album, {\"count\": 2})",
|
||||
"communityRating": "voto della community",
|
||||
"path": "percorso",
|
||||
"favorited": "preferito",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"isRecentlyPlayed": "è stato recentemente riprodotto",
|
||||
"isFavorited": "è preferito",
|
||||
"bpm": "bpm",
|
||||
@@ -455,7 +455,7 @@
|
||||
"disc": "disco",
|
||||
"biography": "biografia",
|
||||
"songCount": "conteggio canzoni",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"duration": "durata",
|
||||
"isPublic": "è pubblico",
|
||||
"random": "casuale",
|
||||
@@ -463,24 +463,24 @@
|
||||
"toYear": "fino all'anno",
|
||||
"fromYear": "dall'anno",
|
||||
"criticRating": "voto della critica",
|
||||
"album": "$t(entity.album_one)",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"trackNumber": "traccia"
|
||||
},
|
||||
"page": {
|
||||
"sidebar": {
|
||||
"nowPlaying": "in riproduzione",
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"search": "$t(common.search)",
|
||||
"tracks": "$t(entity.track_other)",
|
||||
"albums": "$t(entity.album_other)",
|
||||
"genres": "$t(entity.genre_other)",
|
||||
"folders": "$t(entity.folder_other)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"tracks": "$t(entity.track, {\"count\": 2})",
|
||||
"albums": "$t(entity.album, {\"count\": 2})",
|
||||
"genres": "$t(entity.genre, {\"count\": 2})",
|
||||
"folders": "$t(entity.folder, {\"count\": 2})",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"home": "$t(common.home)",
|
||||
"artists": "$t(entity.artist_other)",
|
||||
"albumArtists": "$t(entity.albumArtist_other)",
|
||||
"artists": "$t(entity.artist, {\"count\": 2})",
|
||||
"albumArtists": "$t(entity.albumArtist, {\"count\": 2})",
|
||||
"myLibrary": "la mia libreria",
|
||||
"shared": "condivisa $t(entity.playlist_other)"
|
||||
"shared": "condivisa $t(entity.playlist, {\"count\": 2})"
|
||||
},
|
||||
"fullscreenPlayer": {
|
||||
"config": {
|
||||
@@ -508,7 +508,7 @@
|
||||
"appMenu": {
|
||||
"selectServer": "seleziona server",
|
||||
"version": "versione {{version}}",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"manageServers": "gestisci server",
|
||||
"expandSidebar": "espandi barra laterale",
|
||||
"collapseSidebar": "collassa barra laterale",
|
||||
@@ -542,8 +542,8 @@
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"shareItem": "condividi elemento",
|
||||
"showDetails": "mostra info",
|
||||
"goToAlbum": "vai a $t(entity.album_one)",
|
||||
"goToAlbumArtist": "vai a $t(entity.albumArtist_one)"
|
||||
"goToAlbum": "vai a $t(entity.album, {\"count\": 1})",
|
||||
"goToAlbumArtist": "vai a $t(entity.albumArtist, {\"count\": 1})"
|
||||
},
|
||||
"home": {
|
||||
"mostPlayed": "più riprodotti",
|
||||
@@ -554,7 +554,7 @@
|
||||
"recentlyReleased": "appena pubblicato"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "di più da questo $t(entity.artist_one)",
|
||||
"moreFromArtist": "di più da questo $t(entity.artist, {\"count\": 1})",
|
||||
"moreFromGeneric": "di più da {{item}}",
|
||||
"released": "rilasciato"
|
||||
},
|
||||
@@ -566,17 +566,17 @@
|
||||
"advanced": "avanzate"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
"title": "$t(entity.albumArtist, {\"count\": 2})"
|
||||
},
|
||||
"genreList": {
|
||||
"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)"
|
||||
"title": "$t(entity.genre, {\"count\": 2})",
|
||||
"showAlbums": "mostra $t(entity.genre, {\"count\": 1}) $t(entity.album, {\"count\": 2})",
|
||||
"showTracks": "mostra $t(entity.genre, {\"count\": 1}) $t(entity.track, {\"count\": 2})"
|
||||
},
|
||||
"trackList": {
|
||||
"title": "$t(entity.track_other)",
|
||||
"title": "$t(entity.track, {\"count\": 2})",
|
||||
"artistTracks": "tracce di {{artist}}",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track_other)"
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track, {\"count\": 2})"
|
||||
},
|
||||
"globalSearch": {
|
||||
"commands": {
|
||||
@@ -587,23 +587,23 @@
|
||||
"title": "comandi"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist_other)"
|
||||
"title": "$t(entity.playlist, {\"count\": 2})"
|
||||
},
|
||||
"albumList": {
|
||||
"title": "$t(entity.album_other)",
|
||||
"title": "$t(entity.album, {\"count\": 2})",
|
||||
"artistAlbums": "albums di {{artist}}",
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)"
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album, {\"count\": 2})"
|
||||
},
|
||||
"albumArtistDetail": {
|
||||
"about": "Info {{artist}}",
|
||||
"appearsOn": "compare su",
|
||||
"recentReleases": "uscite recenti",
|
||||
"viewDiscography": "mostra discografia",
|
||||
"relatedArtists": "correlati $t(entity.artist_other)",
|
||||
"relatedArtists": "correlati $t(entity.artist, {\"count\": 2})",
|
||||
"topSongs": "brani migliori",
|
||||
"topSongsFrom": "brani migliori da {{title}}",
|
||||
"viewAll": "mostra tutto",
|
||||
"viewAllTracks": "mostra tutto $t(entity.track_other)"
|
||||
"viewAllTracks": "mostra tutto $t(entity.track, {\"count\": 2})"
|
||||
},
|
||||
"manageServers": {
|
||||
"title": "gestisci servers",
|
||||
@@ -624,16 +624,16 @@
|
||||
},
|
||||
"form": {
|
||||
"deletePlaylist": {
|
||||
"title": "elimina $t(entity.playlist_one)",
|
||||
"success": "$t(entity.playlist_one) eliminata correttamente",
|
||||
"input_confirm": "digita il nome della $t(entity.playlist_one) per confermare"
|
||||
"title": "elimina $t(entity.playlist, {\"count\": 1})",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) eliminata correttamente",
|
||||
"input_confirm": "digita il nome della $t(entity.playlist, {\"count\": 1}) per confermare"
|
||||
},
|
||||
"createPlaylist": {
|
||||
"input_description": "$t(common.description)",
|
||||
"title": "crea $t(entity.playlist_one)",
|
||||
"title": "crea $t(entity.playlist, {\"count\": 1})",
|
||||
"input_public": "publico",
|
||||
"input_name": "$t(common.name)",
|
||||
"success": "$t(entity.playlist_one) creata con successo",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) creata con successo",
|
||||
"input_owner": "$t(common.owner)"
|
||||
},
|
||||
"addServer": {
|
||||
@@ -653,9 +653,9 @@
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"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, {\"count\": 1})",
|
||||
"input_skipDuplicates": "salta duplicati",
|
||||
"input_playlists": "$t(entity.playlist_other)"
|
||||
"input_playlists": "$t(entity.playlist, {\"count\": 2})"
|
||||
},
|
||||
"updateServer": {
|
||||
"title": "aggiorna server",
|
||||
@@ -668,13 +668,13 @@
|
||||
},
|
||||
"lyricSearch": {
|
||||
"input_name": "$t(common.name)",
|
||||
"input_artist": "$t(entity.artist_one)",
|
||||
"input_artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"title": "cerca testi"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"title": "modifica $t(entity.playlist_one)",
|
||||
"title": "modifica $t(entity.playlist, {\"count\": 1})",
|
||||
"publicJellyfinNote": "Jellyfin non mostra se una playlist è pubblica o meno. Se vuoi che rimanga pubblica, assicurati di selezionare l’opzione seguente",
|
||||
"success": "$t(entity.playlist_one) aggiornato con successo"
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) aggiornato con successo"
|
||||
},
|
||||
"shareItem": {
|
||||
"allowDownloading": "consentire il download",
|
||||
@@ -719,8 +719,8 @@
|
||||
"trackNumber": "numero traccia",
|
||||
"rowIndex": "indice riga",
|
||||
"rating": "$t(common.rating)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"album": "$t(entity.album_one)",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"note": "$t(common.note)",
|
||||
"biography": "$t(common.biography)",
|
||||
"owner": "$t(common.owner)",
|
||||
@@ -729,13 +729,13 @@
|
||||
"playCount": "numero riproduzioni",
|
||||
"bitrate": "$t(common.bitrate)",
|
||||
"actions": "$t(common.action_other)",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"discNumber": "numero disco",
|
||||
"favorite": "$t(common.favorite)",
|
||||
"year": "$t(common.year)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"codec": "$t(common.codec)",
|
||||
"songCount": "$t(entity.track_other)"
|
||||
"songCount": "$t(entity.track, {\"count\": 2})"
|
||||
}
|
||||
},
|
||||
"column": {
|
||||
@@ -744,7 +744,7 @@
|
||||
"rating": "voto",
|
||||
"favorite": "preferito",
|
||||
"playCount": "riproduzioni",
|
||||
"albumCount": "$t(entity.album_other)",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2})",
|
||||
"releaseYear": "anno",
|
||||
"lastPlayed": "ultima riproduzione",
|
||||
"biography": "biografia",
|
||||
@@ -753,10 +753,10 @@
|
||||
"title": "titolo",
|
||||
"bpm": "bpm",
|
||||
"dateAdded": "data aggiunta",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"songCount": "$t(entity.track, {\"count\": 2})",
|
||||
"trackNumber": "traccia",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"albumArtist": "artista album",
|
||||
"path": "percorso",
|
||||
"discNumber": "disco",
|
||||
@@ -802,7 +802,7 @@
|
||||
"folder_one": "cartella",
|
||||
"folder_many": "cartelle",
|
||||
"folder_other": "cartelle",
|
||||
"smartPlaylist": "$t(entity.playlist_one) smart",
|
||||
"smartPlaylist": "$t(entity.playlist, {\"count\": 1}) smart",
|
||||
"album_one": "album",
|
||||
"album_many": "album",
|
||||
"album_other": "album",
|
||||
|
||||
@@ -11,10 +11,10 @@
|
||||
"skip_back": "前へスキップ",
|
||||
"favorite": "お気に入り",
|
||||
"next": "次へ",
|
||||
"shuffle": "シャッフル",
|
||||
"shuffle": "再生 (シャッフル)",
|
||||
"playbackFetchNoResults": "曲が見つかりません",
|
||||
"playbackFetchInProgress": "曲を読み込み中…",
|
||||
"addNext": "次へ追加",
|
||||
"addNext": "次",
|
||||
"playbackSpeed": "再生速度",
|
||||
"playbackFetchCancel": "処理に時間がかかります… 通知を閉じるとキャンセルします",
|
||||
"play": "再生",
|
||||
@@ -25,12 +25,17 @@
|
||||
"queue_moveToTop": "選択項目を一番下に移動",
|
||||
"queue_moveToBottom": "選択項目を先頭に移動",
|
||||
"shuffle_off": "シャッフル無効",
|
||||
"addLast": "最後へ追加",
|
||||
"addLast": "最後",
|
||||
"mute": "ミュート",
|
||||
"skip_forward": "次へスキップ",
|
||||
"pause": "一時停止",
|
||||
"playSimilarSongs": "似たような曲を再生する",
|
||||
"viewQueue": "キューを表示する"
|
||||
"viewQueue": "キューを表示する",
|
||||
"lyrics": "歌詞",
|
||||
"restoreQueueFromServer": "サーバーからキューを復元",
|
||||
"saveQueueToServer": "サーバーにキューを保存",
|
||||
"addLastShuffled": "最後 (シャッフル)",
|
||||
"addNextShuffled": "次 (シャッフル)"
|
||||
},
|
||||
"setting": {
|
||||
"crossfadeStyle_description": "オーディオプレーヤーが使用するクロスフェードのスタイルを選択します",
|
||||
@@ -94,7 +99,7 @@
|
||||
"exitToTray_description": "アプリケーション終了ボタンが押された際、システムトレイに格納します",
|
||||
"followLyric_description": "現在の再生位置に歌詞をスクロールします",
|
||||
"hotkey_favoritePreviousSong": "$t(common.previousSong) をお気に入り",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album_one)",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album, {\"count\": 1})",
|
||||
"lyricOffset": "歌詞のオフセット (ミリ秒)",
|
||||
"discordUpdateInterval_description": "更新間隔 (秒単位, 最小15秒)",
|
||||
"fontType_optionCustom": "カスタムフォント",
|
||||
@@ -106,7 +111,7 @@
|
||||
"playbackStyle_optionCrossFade": "クロスフェード",
|
||||
"hotkey_rate3": "3つ星で評価",
|
||||
"font": "フォント",
|
||||
"replayGainMode_optionTrack": "$t(entity.track_one)",
|
||||
"replayGainMode_optionTrack": "$t(entity.track, {\"count\": 1})",
|
||||
"themeLight_description": "アプリケーションに使用するライトテーマを設定します",
|
||||
"hotkey_toggleFullScreenPlayer": "フルスクリーンプレーヤーの切り替え",
|
||||
"hotkey_localSearch": "ページ内検索",
|
||||
@@ -115,7 +120,7 @@
|
||||
"remotePassword_description": "リモートコントロール サーバーのパスワードを設定します。 ログイン情報はデフォルトでセキュアな通信がされないため、個人情報と関係ないランダムなパスワードを利用してください",
|
||||
"hotkey_rate5": "5つ星で評価",
|
||||
"hotkey_playbackPrevious": "前のトラック",
|
||||
"showSkipButtons_description": "プレーヤーバーのスキップボタンを表示/非表示にします",
|
||||
"showSkipButtons_description": "プレーヤーバーのスキップボタンを表示または非表示にします",
|
||||
"crossfadeDuration_description": "クロスフェード効果の時間を設定します",
|
||||
"playbackStyle": "再生スタイル",
|
||||
"hotkey_toggleShuffle": "シャッフルの切り替え",
|
||||
@@ -130,7 +135,7 @@
|
||||
"exitToTray": "終了時にシステムトレイに格納",
|
||||
"hotkey_rate4": "4つ星で評価",
|
||||
"enableRemote": "リモートコントロール サーバーを有効化",
|
||||
"showSkipButton_description": "プレーヤーバーのスキップボタンを表示/非表示にします",
|
||||
"showSkipButton_description": "プレーヤーバーのスキップボタンを表示または非表示にします",
|
||||
"savePlayQueue": "再生キューを保存",
|
||||
"minimumScrobbleSeconds_description": "Scrobble されるために必要な最短の再生時間 (秒)",
|
||||
"skipPlaylistPage_description": "プレイリストに移動するときに、デフォルトページではなくプレイリストの曲リストページに移動します",
|
||||
@@ -156,7 +161,7 @@
|
||||
"useSystemTheme_description": "システム設定のライト/ダークテーマに従います",
|
||||
"playButtonBehavior_optionAddNext": "$t(player.addNext)",
|
||||
"lyricFetch_description": "様々なインターネットソースから歌詞を取得します",
|
||||
"lyricFetchProvider_description": "歌詞を取得するサービスを選択します。サービスの並び順に検索されます",
|
||||
"lyricFetchProvider_description": "歌詞を取得するプロバイダーを選択します",
|
||||
"globalMediaHotkeys_description": "システムのメディアホットキーでの再生コントロールを有効/無効化します",
|
||||
"customFontPath": "カスタムフォントパス",
|
||||
"followLyric": "歌詞を再生位置に追従",
|
||||
@@ -188,7 +193,7 @@
|
||||
"savePlayQueue_description": "アプリケーション終了時に再生キューを保存し、アプリケーション開始時に復元します",
|
||||
"useSystemTheme": "システムテーマを使用",
|
||||
"webAudio": "Web Audio を使用する",
|
||||
"mediaSession_description": "Windows Media Session の統合を有効にし、システムボリュームオーバーレイとロック画面にメディアコントロールとメタデータを表示します (Windows のみ)",
|
||||
"mediaSession_description": "Media Session の統合を有効にし、システムボリュームオーバーレイとロック画面にメディアコントロールとメタデータを表示します",
|
||||
"mediaSession": "Media Session を有効にする",
|
||||
"startMinimized_description": "システムトレイでアプリケーションを起動する",
|
||||
"startMinimized": "最小化して起動する",
|
||||
@@ -203,15 +208,13 @@
|
||||
"volumeWidth_description": "音量スライダーの幅",
|
||||
"volumeWidth": "音量スライダーの幅",
|
||||
"webAudio_description": "Web Audio を使用します。これにより、リプレイゲインなどの高度な機能が有効になります。それ以外の場合は無効にしてください",
|
||||
"playerAlbumArtResolution_description": "大画面プレーヤーのアルバムアートプレビューの解像度。解像度が高いほど鮮明になりますが、読み込みが遅くなる可能性があります。デフォルトは 0 (自動設定) です",
|
||||
"mpvExtraParameters_help": "1 行に 1 つずつ",
|
||||
"musicbrainz_description": "MusicBrainz ID が存在するアーティスト/アルバムページに MusicBrainz へのリンクを表示します",
|
||||
"musicbrainz": "MusicBrainz リンクを表示する",
|
||||
"neteaseTranslation_description": "有効にすると、利用可能な場合は NetEase から翻訳された歌詞を取得して表示します",
|
||||
"neteaseTranslation": "NetEase 翻訳歌詞を有効にする",
|
||||
"passwordStore_description": "使用するパスワード/シークレットストア。パスワードの保存に問題がある場合はこれを変更してください",
|
||||
"passwordStore": "パスワード/シークレットストア",
|
||||
"playerAlbumArtResolution": "プレーヤーのアルバムアートの解像度",
|
||||
"passwordStore_description": "使用するパスワード / シークレットストア。パスワードの保存に問題がある場合はこれを変更してください",
|
||||
"passwordStore": "パスワード / シークレットストア",
|
||||
"playerbarOpenDrawer_description": "プレーヤーバーをクリックすると全画面プレーヤーが開きます",
|
||||
"preferLocalLyrics_description": "利用可能な場合は、リモート歌詞よりもローカル歌詞を優先します",
|
||||
"preferLocalLyrics": "ローカル歌詞を優先する",
|
||||
@@ -293,31 +296,90 @@
|
||||
"discordDisplayType_description": "ステータスで聴いている内容を変更します",
|
||||
"discordLinkType": "{{discord}} Presence リンク",
|
||||
"discordLinkType_mbz_lastfm": "{{musicbrainz}} と {{lastfm}} のフォールバック",
|
||||
"homeFeature": "ホーム画面の注目カルーセル",
|
||||
"homeFeature_description": "ホーム画面に大きな注目カルーセルを表示するかどうかを制御します",
|
||||
"homeFeature": "ホーム画面のカルーセル",
|
||||
"homeFeature_description": "ホーム画面に大きなカルーセルを表示するかどうかを制御します",
|
||||
"exportImportSettings_notValidJSON": "渡されたファイルは有効な JSON ではありません",
|
||||
"exportImportSettings_importSuccess": "設定が正常にインポートされました!",
|
||||
"exportImportSettings_importModalTitle": "Feishin 設定をインポート",
|
||||
"exportImportSettings_importBtn": "設定をインポート"
|
||||
"exportImportSettings_importBtn": "設定をインポート",
|
||||
"autoDJ_description": "類似の曲を自動でキューに追加します",
|
||||
"autoDJ": "自動 DJ",
|
||||
"autoDJ_itemCount_description": "自動 DJ が有効なときにキューに追加しようとした曲数",
|
||||
"autoDJ_itemCount": "曲数",
|
||||
"autoDJ_timing": "タイミング",
|
||||
"autoDJ_timing_description": "自動 DJ が作動するまでのキューに残っている曲数",
|
||||
"analyticsDisable": "使用状況に基づく分析のオプトアウト",
|
||||
"analyticsDisable_description": "匿名化された利用データは、アプリケーションの改善のために開発者に送信されます",
|
||||
"useThemeAccentColor": "テーマのアクセントカラーを使用",
|
||||
"useThemeAccentColor_description": "カスタムアクセントカラーの代わりに、選択したテーマで定義されたプライマリカラーを使用します",
|
||||
"artistReleaseTypeConfiguration": "アーティストリリースタイプの設定",
|
||||
"artistReleaseTypeConfiguration_description": "アルバムアーティストページでどのリリースタイプをどのような順序で表示するかを設定します",
|
||||
"followCurrentSong": "現在の曲をフォロー",
|
||||
"followCurrentSong_description": "再生キューを現在再生中の曲まで自動的にスクロールします",
|
||||
"logLevel": "ログレベル",
|
||||
"logLevel_description": "表示するログの最小レベルを設定します。debug はすべてのログを表示し、error はエラーのみを表示します",
|
||||
"logLevel_optionDebug": "debug",
|
||||
"logLevel_optionError": "error",
|
||||
"logLevel_optionInfo": "info",
|
||||
"logLevel_optionWarn": "warn",
|
||||
"playerFilters": "キューから曲をフィルタリング",
|
||||
"playerFilters_description": "以下の基準に基づいて曲をキューに追加しないようにします",
|
||||
"artistRadioCount": "アーティスト / トラックのラジオカウント",
|
||||
"artistRadioCount_description": "アーティストラジオとトラックラジオで取得する曲数を設定します",
|
||||
"imageResolution": "画像の解像度",
|
||||
"imageResolution_description": "アプリ内で使用される画像の解像度。値を 0 に設定すると、デフォルトでネイティブ画像解像度が適用されます",
|
||||
"showLyricsInSidebar_description": "添付の再生キューに歌詞を表示するパネルが追加されます",
|
||||
"showLyricsInSidebar": "プレーヤーのサイドバーに歌詞を表示する",
|
||||
"showRatings": "星評価を表示する",
|
||||
"imageResolution_optionSidebar": "サイドバー",
|
||||
"imageResolution_optionHeader": "ヘッダー",
|
||||
"imageResolution_optionFullScreenPlayer": "全画面プレーヤー",
|
||||
"playerbarSlider": "プレーヤーバースライダー",
|
||||
"playerbarSlider_description": "低速または従量制のインターネット接続の場合は、波形は推奨されません",
|
||||
"playerbarSliderType_optionSlider": "スライダー",
|
||||
"playerbarSliderType_optionWaveform": "波形",
|
||||
"playerbarWaveformAlign": "波形アライメント",
|
||||
"showRatings_description": "インターフェースに星評価機能を表示するかどうかを制御します",
|
||||
"showVisualizerInSidebar": "プレーヤーのサイドバーにビジュアライザーを表示する",
|
||||
"combinedLyricsAndVisualizer": "プレーヤーのサイドバーに歌詞とビジュアライザーを統合する",
|
||||
"audioFadeOnStatusChange_description": "再生 / 一時停止の状態が変わったときにフェードアウトとフェードインを有効にします",
|
||||
"audioFadeOnStatusChange": "ステータス変更時の音声フェード",
|
||||
"combinedLyricsAndVisualizer_description": "歌詞とビジュアライザーを同じパネルに統合します",
|
||||
"showVisualizerInSidebar_description": "プレーヤーのサイドバーにビジュアライザーを表示するパネルが追加されます",
|
||||
"queryBuilderCustomFields": "カスタムフィールド",
|
||||
"queryBuilderCustomFields_inputLabel": "ラベル",
|
||||
"queryBuilderCustomFields_inputTag": "タグ",
|
||||
"queryBuilderCustomFields_description": "クエリビルダーで使用するカスタムフィールドを追加します",
|
||||
"queryBuilder": "クエリビルダー",
|
||||
"homeFeatureStyle_description": "ホーム画面のカルーセルのスタイルを制御します",
|
||||
"homeFeatureStyle": "ホーム画面のカルーセルのスタイル",
|
||||
"homeFeatureStyle_optionMultiple": "複数",
|
||||
"homeFeatureStyle_optionSingle": "単数",
|
||||
"mpvExtraParameters": "MPV の追加パラメータ",
|
||||
"mpvExtraParameters_description": "MPV に渡す追加の引数を設定します",
|
||||
"pathReplace": "ファイルパスの置換",
|
||||
"pathReplace_description": "サーバーのデフォルトのファイルパスを置き換えます",
|
||||
"pathReplace_optionRemovePrefix": "接頭辞を削除",
|
||||
"pathReplace_optionAddPrefix": "接頭辞を追加"
|
||||
},
|
||||
"action": {
|
||||
"editPlaylist": "$t(entity.playlist_one) を編集",
|
||||
"editPlaylist": "$t(entity.playlist, {\"count\": 1}) を編集",
|
||||
"goToPage": "ページへ移動",
|
||||
"moveToTop": "先頭に移動",
|
||||
"clearQueue": "キューをクリア",
|
||||
"addToFavorites": "$t(entity.favorite_other) に追加",
|
||||
"addToPlaylist": "$t(entity.playlist_one) に追加",
|
||||
"createPlaylist": "$t(entity.playlist_one) を作成",
|
||||
"removeFromPlaylist": "$t(entity.playlist_one) から削除",
|
||||
"viewPlaylists": "$t(entity.playlist_other) を表示",
|
||||
"addToFavorites": "$t(entity.favorite, {\"count\": 2}) に追加",
|
||||
"addToPlaylist": "$t(entity.playlist, {\"count\": 1}) に追加",
|
||||
"createPlaylist": "$t(entity.playlist, {\"count\": 1}) を作成",
|
||||
"removeFromPlaylist": "$t(entity.playlist, {\"count\": 1}) から削除",
|
||||
"viewPlaylists": "$t(entity.playlist, {\"count\": 2}) を表示",
|
||||
"refresh": "$t(common.refresh)",
|
||||
"deletePlaylist": "$t(entity.playlist_one) を削除",
|
||||
"deletePlaylist": "$t(entity.playlist, {\"count\": 1}) を削除",
|
||||
"removeFromQueue": "キューから削除",
|
||||
"deselectAll": "すべて選択解除",
|
||||
"moveToBottom": "末尾に移動",
|
||||
"setRating": "評価を設定する",
|
||||
"toggleSmartPlaylistEditor": "$t(entity.smartPlaylist) エディタの切り替え",
|
||||
"removeFromFavorites": "$t(entity.favorite_other) から削除",
|
||||
"removeFromFavorites": "$t(entity.favorite, {\"count\": 2}) から削除",
|
||||
"openIn": {
|
||||
"lastfm": "Last.fm で開く",
|
||||
"musicbrainz": "MusicBrainz で開く"
|
||||
@@ -328,7 +390,17 @@
|
||||
"shuffle": "シャッフル",
|
||||
"shuffleAll": "すべてシャッフル",
|
||||
"shuffleSelected": "選択した曲をシャッフル",
|
||||
"viewMore": "さらに表示"
|
||||
"viewMore": "さらに表示",
|
||||
"createRadioStation": "$t(entity.radioStation, {\"count\": 1}) を作成",
|
||||
"deleteRadioStation": "$t(entity.radioStation, {\"count\": 1}) を削除",
|
||||
"selectAll": "すべて選択",
|
||||
"moveUp": "上に移動",
|
||||
"moveDown": "下に移動",
|
||||
"holdToMoveToTop": "押し続けると一番上に移動します",
|
||||
"holdToMoveToBottom": "押し続けると一番下に移動します",
|
||||
"openApplicationDirectory": "アプリケーションディレクトリを開く",
|
||||
"selectRangeOfItems": "項目の範囲を選択",
|
||||
"addOrRemoveFromSelection": "選択に追加または削除"
|
||||
},
|
||||
"common": {
|
||||
"backward": "戻る",
|
||||
@@ -343,7 +415,7 @@
|
||||
"left": "左側",
|
||||
"save": "保存",
|
||||
"right": "右側",
|
||||
"currentSong": "現在の $t(entity.track_one)",
|
||||
"currentSong": "現在の $t(entity.track, {\"count\": 1})",
|
||||
"collapse": "折りたたみ",
|
||||
"trackNumber": "トラック",
|
||||
"descending": "降順",
|
||||
@@ -373,7 +445,7 @@
|
||||
"delete": "削除",
|
||||
"cancel": "キャンセル",
|
||||
"forceRestartRequired": "変更を適用するために再起動が必要です… 通知を閉じると再起動します",
|
||||
"setting": "設定",
|
||||
"setting_other": "設定",
|
||||
"version": "バージョン",
|
||||
"title": "タイトル",
|
||||
"filter_other": "フィルタ",
|
||||
@@ -394,7 +466,7 @@
|
||||
"none": "なし",
|
||||
"menu": "メニュー",
|
||||
"restartRequired": "再起動が必要です",
|
||||
"previousSong": "前の $t(entity.track_one)",
|
||||
"previousSong": "前の $t(entity.track, {\"count\": 1})",
|
||||
"noResultsFromQuery": "条件にマッチするものがありません",
|
||||
"quit": "終了",
|
||||
"expand": "展開",
|
||||
@@ -431,7 +503,22 @@
|
||||
"doNotShowAgain": "再度表示しない",
|
||||
"externalLinks": "外部リンク",
|
||||
"sort": "分類",
|
||||
"gridRows": "グリッド行"
|
||||
"gridRows": "グリッド行",
|
||||
"countSelected": "{{count}} 個選択されました",
|
||||
"view": "表示",
|
||||
"noFilters": "フィルターが設定されていません",
|
||||
"retry": "再試行",
|
||||
"itemsMore": "{{count}} 個以上",
|
||||
"faster": "より速く",
|
||||
"slower": "より遅く",
|
||||
"example": "例",
|
||||
"mood": "気分",
|
||||
"recordLabel": "レコードレーベル",
|
||||
"tableColumns": "テーブル列",
|
||||
"clean": "クリーン",
|
||||
"filter_single": "シングル",
|
||||
"filter_multiple": "複数枚組",
|
||||
"rename": "名前を変更"
|
||||
},
|
||||
"table": {
|
||||
"config": {
|
||||
@@ -448,37 +535,59 @@
|
||||
"size": "$t(common.size)",
|
||||
"itemSize": "項目のサイズ (px)",
|
||||
"itemGap": "項目の間隔 (px)",
|
||||
"followCurrentSong": "現在の曲をフォロー"
|
||||
"followCurrentSong": "現在の曲をフォロー",
|
||||
"advancedSettings": "詳細設定",
|
||||
"autosize": "自動サイズ調整",
|
||||
"moveUp": "上に移動",
|
||||
"moveDown": "下に移動",
|
||||
"alignLeft": "左揃え",
|
||||
"alignCenter": "中央揃え",
|
||||
"alignRight": "右揃え",
|
||||
"itemsPerRow": "行あたりの項目数",
|
||||
"size_default": "デフォルト",
|
||||
"pinToLeft": "左にピン留め",
|
||||
"pinToRight": "右にピン留め",
|
||||
"size_compact": "コンパクト",
|
||||
"size_large": "大きい",
|
||||
"pagination_itemsPerPage": "ページあたりの項目数",
|
||||
"pagination_infinite": "無限"
|
||||
},
|
||||
"label": {
|
||||
"releaseDate": "リリース日時",
|
||||
"releaseDate": "発売日",
|
||||
"title": "$t(common.title)",
|
||||
"duration": "$t(common.duration)",
|
||||
"titleCombined": "$t(common.title) (結合)",
|
||||
"dateAdded": "追加された日時",
|
||||
"dateAdded": "追加日",
|
||||
"size": "$t(common.size)",
|
||||
"bpm": "$t(common.bpm)",
|
||||
"lastPlayed": "最後に再生",
|
||||
"trackNumber": "トラック番号",
|
||||
"rowIndex": "行インデックス",
|
||||
"rating": "$t(common.rating)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"album": "$t(entity.album_one)",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"note": "$t(common.note)",
|
||||
"biography": "$t(common.biography)",
|
||||
"owner": "$t(common.owner)",
|
||||
"path": "$t(common.path)",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"channels": "$t(common.channel, {\"count\": 2})",
|
||||
"playCount": "再生回数",
|
||||
"bitrate": "$t(common.bitrate)",
|
||||
"actions": "$t(common.action_other)",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"actions": "$t(common.action, {\"count\": 2})",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"discNumber": "ディスク番号",
|
||||
"favorite": "$t(common.favorite)",
|
||||
"year": "$t(common.year)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"codec": "$t(common.codec)",
|
||||
"songCount": "$t(entity.track_other)"
|
||||
"songCount": "$t(entity.track, {\"count\": 2})",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2})",
|
||||
"bitDepth": "$t(common.bitDepth)",
|
||||
"genreBadge": "$t(entity.genre, {\"count\": 1}) (バッジ)",
|
||||
"image": "画像",
|
||||
"sampleRate": "$t(common.sampleRate)",
|
||||
"composer": "作曲家",
|
||||
"titleArtist": "$t(common.title) (アーティスト)"
|
||||
}
|
||||
},
|
||||
"column": {
|
||||
@@ -487,7 +596,7 @@
|
||||
"rating": "評価",
|
||||
"favorite": "お気に入り",
|
||||
"playCount": "再生回数",
|
||||
"albumCount": "$t(entity.album_other)",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2})",
|
||||
"releaseYear": "年",
|
||||
"lastPlayed": "最後に再生",
|
||||
"biography": "バイオグラフィー",
|
||||
@@ -495,17 +604,20 @@
|
||||
"bitrate": "ビットレート",
|
||||
"title": "タイトル",
|
||||
"bpm": "BPM",
|
||||
"dateAdded": "追加された日時",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"dateAdded": "追加日",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"songCount": "$t(entity.track, {\"count\": 2})",
|
||||
"trackNumber": "トラック",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"albumArtist": "アルバムアーティスト",
|
||||
"path": "パス",
|
||||
"discNumber": "ディスク",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"channels": "$t(common.channel, {\"count\": 2})",
|
||||
"size": "$t(common.size)",
|
||||
"codec": "$t(common.codec)"
|
||||
"codec": "$t(common.codec)",
|
||||
"bitDepth": "$t(common.bitDepth)",
|
||||
"sampleRate": "$t(common.sampleRate)",
|
||||
"owner": "所有者"
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
@@ -528,11 +640,16 @@
|
||||
"invalidServer": "無効なサーバー",
|
||||
"loginRateError": "ログイン試行回数が多すぎます。数秒後に再試行してください",
|
||||
"endpointNotImplementedError": "{{serverType}} にはエンドポイント {{endpoint}} が実装されていません",
|
||||
"badAlbum": "このページが表示されたのは、この曲がアルバムに含まれていないためです。この問題は、音楽フォルダの最上位に曲がある場合に発生する可能性が高くなります。Jellyfin は、トラックがフォルダ内にある場合にのみトラックをグループ化します",
|
||||
"badAlbum": "このページが表示されたのは、この曲がアルバムに含まれていないためです。この問題は、音楽フォルダーの最上位に曲がある場合に発生する可能性が高くなります。Jellyfin は、トラックがフォルダー内にある場合にのみトラックをグループ化します",
|
||||
"networkError": "ネットワークエラーが発生しました",
|
||||
"notificationDenied": "通知の許可が拒否されました。この設定は効果がありません",
|
||||
"openError": "ファイルを開けませんでした",
|
||||
"badValue": "無効なオプション「{{value}}」。この値は存在しません"
|
||||
"badValue": "無効なオプション「{{value}}」。この値は存在しません",
|
||||
"multipleServerSaveQueueError": "再生キューに現在のサーバーに存在しない曲が 1 曲以上あります。これはサポートされていません",
|
||||
"noNetwork": "サーバーが利用できません",
|
||||
"noNetworkDescription": "このサーバーに接続できませんでした",
|
||||
"saveQueueFailed": "キューを保存できませんでした",
|
||||
"settingsSyncError": "レンダラーとメインプロセスの設定に矛盾が見つかりました。変更を適用するにはアプリケーションを再起動してください"
|
||||
},
|
||||
"filter": {
|
||||
"mostPlayed": "最も多く再生",
|
||||
@@ -547,12 +664,12 @@
|
||||
"recentlyAdded": "最近の追加",
|
||||
"note": "ノート",
|
||||
"name": "名前",
|
||||
"dateAdded": "追加された日時",
|
||||
"dateAdded": "追加日",
|
||||
"releaseDate": "発売日",
|
||||
"communityRating": "コミュニティの評価",
|
||||
"path": "パス",
|
||||
"favorited": "お気に入り",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"isRecentlyPlayed": "最近再生済み",
|
||||
"isFavorited": "お気に入り済み",
|
||||
"bpm": "BPM",
|
||||
@@ -560,7 +677,7 @@
|
||||
"disc": "ディスク",
|
||||
"biography": "バイオグラフィー",
|
||||
"songCount": "曲数",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"duration": "長さ",
|
||||
"random": "ランダム",
|
||||
"lastPlayed": "最後に再生",
|
||||
@@ -571,29 +688,33 @@
|
||||
"comment": "コメント",
|
||||
"recentlyUpdated": "新規更新",
|
||||
"isPublic": "共有済み",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"channels": "$t(common.channel, {\"count\": 2})",
|
||||
"owner": "$t(common.owner)",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"albumCount": "$t(entity.album_other) 個",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2}) 枚",
|
||||
"id": "ID",
|
||||
"album": "$t(entity.album_one)",
|
||||
"explicitStatus": "$t(common.explicitStatus)"
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"explicitStatus": "$t(common.explicitStatus)",
|
||||
"sortName": "ソート名"
|
||||
},
|
||||
"page": {
|
||||
"sidebar": {
|
||||
"nowPlaying": "再生中",
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"search": "$t(common.search)",
|
||||
"tracks": "$t(entity.track_other)",
|
||||
"albums": "$t(entity.album_other)",
|
||||
"genres": "$t(entity.genre_other)",
|
||||
"folders": "$t(entity.folder_other)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"tracks": "$t(entity.track, {\"count\": 2})",
|
||||
"albums": "$t(entity.album, {\"count\": 2})",
|
||||
"genres": "$t(entity.genre, {\"count\": 2})",
|
||||
"folders": "$t(entity.folder, {\"count\": 2})",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"home": "$t(common.home)",
|
||||
"artists": "$t(entity.artist_other)",
|
||||
"albumArtists": "$t(entity.albumArtist_other)",
|
||||
"artists": "$t(entity.artist, {\"count\": 2})",
|
||||
"albumArtists": "$t(entity.albumArtist, {\"count\": 2})",
|
||||
"myLibrary": "マイライブラリ",
|
||||
"shared": "$t(entity.playlist_other) を共有"
|
||||
"shared": "$t(entity.playlist, {\"count\": 2}) を共有",
|
||||
"radio": "$t(entity.radioStation, {\"count\": 2})",
|
||||
"favorites": "$t(entity.favorite, {\"count\": 2})",
|
||||
"collections": "コレクション"
|
||||
},
|
||||
"fullscreenPlayer": {
|
||||
"config": {
|
||||
@@ -621,7 +742,7 @@
|
||||
"appMenu": {
|
||||
"selectServer": "サーバーを選択",
|
||||
"version": "バージョン {{version}}",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"manageServers": "サーバーの管理",
|
||||
"expandSidebar": "サイドバーを展開",
|
||||
"collapseSidebar": "サイドバーを折りたたむ",
|
||||
@@ -630,7 +751,11 @@
|
||||
"goBack": "戻る",
|
||||
"goForward": "進む",
|
||||
"privateModeOff": "プライベートモードをオフにする",
|
||||
"privateModeOn": "プライベートモードをオンにする"
|
||||
"privateModeOn": "プライベートモードをオンにする",
|
||||
"selectMusicFolder": "音楽フォルダーを選択",
|
||||
"noMusicFolder": "音楽フォルダーが選択されていません",
|
||||
"commandPalette": "コマンドパレットを開く",
|
||||
"multipleMusicFolders": "{{count}} 個の音楽フォルダーが選択されました"
|
||||
},
|
||||
"contextMenu": {
|
||||
"addToPlaylist": "$t(action.addToPlaylist)",
|
||||
@@ -653,10 +778,12 @@
|
||||
"moveToNext": "$t(action.moveToNext)",
|
||||
"playSimilarSongs": "$t(player.playSimilarSongs)",
|
||||
"shareItem": "アイテムを共有する",
|
||||
"goToAlbum": "$t(entity.album_one) に移動",
|
||||
"goToAlbumArtist": "$t(entity.albumArtist_one) に移動",
|
||||
"goToAlbum": "$t(entity.album, {\"count\": 1}) に移動",
|
||||
"goToAlbumArtist": "$t(entity.albumArtist, {\"count\": 1}) に移動",
|
||||
"showDetails": "情報を取得する",
|
||||
"playShuffled": "$t(player.shuffle)"
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"moveItems": "$t(action.moveItems)",
|
||||
"goTo": "移動"
|
||||
},
|
||||
"home": {
|
||||
"mostPlayed": "最も多く再生",
|
||||
@@ -664,10 +791,11 @@
|
||||
"title": "$t(common.home)",
|
||||
"explore": "ライブラリから検索",
|
||||
"recentlyPlayed": "最近の再生",
|
||||
"recentlyReleased": "最近のリリース"
|
||||
"recentlyReleased": "最近のリリース",
|
||||
"genres": "$t(entity.genre, {\"count\": 2})"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "$t(entity.artist_one) の他の項目",
|
||||
"moreFromArtist": "$t(entity.artist, {\"count\": 1}) の他の項目",
|
||||
"moreFromGeneric": "{{item}} の他の作品",
|
||||
"released": "リリース"
|
||||
},
|
||||
@@ -676,20 +804,38 @@
|
||||
"generalTab": "一般",
|
||||
"hotkeysTab": "ホットキー",
|
||||
"windowTab": "ウィンドウ",
|
||||
"advanced": "高度"
|
||||
"advanced": "高度",
|
||||
"analytics": "分析",
|
||||
"updates": "更新",
|
||||
"cache": "キャッシュ",
|
||||
"application": "アプリケーション",
|
||||
"queryBuilder": "クエリビルダー",
|
||||
"theme": "テーマ",
|
||||
"controls": "コントロール",
|
||||
"sidebar": "サイドバー",
|
||||
"remote": "リモート",
|
||||
"exportImport": "インポート / エクスポート",
|
||||
"scrobble": "Scrobble",
|
||||
"audio": "オーディオ",
|
||||
"lyrics": "歌詞",
|
||||
"lyricsDisplay": "歌詞表示",
|
||||
"transcoding": "トランスコーディング",
|
||||
"discord": "Discord",
|
||||
"logger": "ロガー",
|
||||
"playerFilters": "プレーヤーフィルター"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
"title": "$t(entity.albumArtist, {\"count\": 2})"
|
||||
},
|
||||
"genreList": {
|
||||
"title": "$t(entity.genre_other)",
|
||||
"showAlbums": "$t(entity.genre_one) $t(entity.album_other) を表示",
|
||||
"showTracks": "$t(entity.genre_one) $t(entity.track_other) を表示"
|
||||
"title": "$t(entity.genre, {\"count\": 2})",
|
||||
"showAlbums": "$t(entity.genre, {\"count\": 1}) $t(entity.album, {\"count\": 2}) を表示",
|
||||
"showTracks": "$t(entity.genre, {\"count\": 1}) $t(entity.track, {\"count\": 2}) を表示"
|
||||
},
|
||||
"trackList": {
|
||||
"title": "$t(entity.track_other)",
|
||||
"title": "$t(entity.track, {\"count\": 2})",
|
||||
"artistTracks": "{{artist}} のトラック",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track_other)"
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track, {\"count\": 2})"
|
||||
},
|
||||
"globalSearch": {
|
||||
"commands": {
|
||||
@@ -700,12 +846,12 @@
|
||||
"title": "コマンド"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist_other)"
|
||||
"title": "$t(entity.playlist, {\"count\": 2})"
|
||||
},
|
||||
"albumList": {
|
||||
"title": "$t(entity.album_other)",
|
||||
"title": "$t(entity.album, {\"count\": 2})",
|
||||
"artistAlbums": "{{artist}} のアルバム",
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)"
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album, {\"count\": 2})"
|
||||
},
|
||||
"albumArtistDetail": {
|
||||
"about": "{{artist}} について",
|
||||
@@ -715,8 +861,10 @@
|
||||
"topSongs": "人気曲",
|
||||
"topSongsFrom": "{{title}} からの人気曲",
|
||||
"viewAll": "すべて表示",
|
||||
"viewAllTracks": "$t(entity.track_other) をすべて表示",
|
||||
"relatedArtists": "関連の $t(entity.artist_other)"
|
||||
"viewAllTracks": "$t(entity.track, {\"count\": 2}) をすべて表示",
|
||||
"relatedArtists": "関連の $t(entity.artist, {\"count\": 2})",
|
||||
"groupingTypeAll": "すべてのリリースタイプ",
|
||||
"groupingTypePrimary": "主なリリースタイプ"
|
||||
},
|
||||
"manageServers": {
|
||||
"title": "サーバーの管理",
|
||||
@@ -733,20 +881,37 @@
|
||||
},
|
||||
"playlist": {
|
||||
"reorder": "ID によるソート時のみ並べ替えが可能です"
|
||||
},
|
||||
"radioList": {
|
||||
"title": "ラジオ局"
|
||||
},
|
||||
"favorites": {
|
||||
"title": "$t(entity.favorite, {\"count\": 2})"
|
||||
},
|
||||
"folderList": {
|
||||
"title": "$t(entity.folder, {\"count\": 2})"
|
||||
},
|
||||
"windowBar": {
|
||||
"paused": "(一時停止) ",
|
||||
"privateMode": "(プライベートモード)"
|
||||
},
|
||||
"collections": {
|
||||
"overrideExisting": "既存のものを上書き",
|
||||
"saveAsCollection": "コレクションとして保存"
|
||||
}
|
||||
},
|
||||
"form": {
|
||||
"deletePlaylist": {
|
||||
"title": "$t(entity.playlist_one) を削除",
|
||||
"success": "$t(entity.playlist_one) が削除されました",
|
||||
"input_confirm": "確認のため $t(entity.playlist_one) の名前を入力してください"
|
||||
"title": "$t(entity.playlist, {\"count\": 1}) を削除",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) が削除されました",
|
||||
"input_confirm": "確認のため $t(entity.playlist, {\"count\": 1}) の名前を入力してください"
|
||||
},
|
||||
"createPlaylist": {
|
||||
"input_description": "$t(common.description)",
|
||||
"title": "$t(entity.playlist_one) を作成",
|
||||
"title": "$t(entity.playlist, {\"count\": 1}) を作成",
|
||||
"input_public": "公開",
|
||||
"input_name": "$t(common.name)",
|
||||
"success": "$t(entity.playlist_one) を作成しました",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) を作成しました",
|
||||
"input_owner": "$t(common.owner)"
|
||||
},
|
||||
"addServer": {
|
||||
@@ -762,15 +927,18 @@
|
||||
"ignoreCors": "CORSを無視 ($t(common.restartRequired))",
|
||||
"error_savePassword": "パスワードを保存する際にエラーが発生しました",
|
||||
"input_preferInstantMixDescription": "類似曲を取得するにはインスタントミックスのみを使用してください。この動作を変更するプラグインがある場合に役立ちます",
|
||||
"input_preferInstantMix": "インスタントミックスを優先する"
|
||||
"input_preferInstantMix": "インスタントミックスを優先する",
|
||||
"input_preferRemoteUrl": "公開 URL を優先する",
|
||||
"input_remoteUrl": "公開 URL",
|
||||
"input_remoteUrlPlaceholder": "オプション: 外部機能用の公開 URL"
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"success": "$t(entity.trackWithCount, {\"count\": {{message}} }) を $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} }) に追加しました",
|
||||
"title": "$t(entity.playlist_one) に追加",
|
||||
"title": "$t(entity.playlist, {\"count\": 1}) に追加",
|
||||
"input_skipDuplicates": "重複をスキップ",
|
||||
"input_playlists": "$t(entity.playlist_other)",
|
||||
"create": "$t(entity.playlist_one) {{playlist}} を作成する",
|
||||
"searchOrCreate": "$t(entity.playlist_other) を検索するか、入力して新しいものを作成してください"
|
||||
"input_playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"create": "$t(entity.playlist, {\"count\": 1}) {{playlist}} を作成する",
|
||||
"searchOrCreate": "$t(entity.playlist, {\"count\": 2}) を検索するか、入力して新しいプレイリストを作成してください"
|
||||
},
|
||||
"updateServer": {
|
||||
"title": "サーバーをアップデート",
|
||||
@@ -779,17 +947,22 @@
|
||||
"queryEditor": {
|
||||
"input_optionMatchAll": "すべて一致",
|
||||
"input_optionMatchAny": "一部一致",
|
||||
"title": "クエリエディタ"
|
||||
"title": "クエリエディタ",
|
||||
"addRuleGroup": "ルールグループを追加",
|
||||
"removeRuleGroup": "ルールグループを削除",
|
||||
"resetToDefault": "デフォルトにリセット",
|
||||
"clearFilters": "フィルターを削除"
|
||||
},
|
||||
"lyricSearch": {
|
||||
"input_name": "$t(common.name)",
|
||||
"input_artist": "$t(entity.artist_one)",
|
||||
"input_artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"title": "歌詞検索"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"title": "$t(entity.playlist_one) を編集",
|
||||
"title": "$t(entity.playlist, {\"count\": 1}) を編集",
|
||||
"publicJellyfinNote": "Jellyfin では、何らかの理由でプレイリストが公開されているかどうかが表示されません。公開されたままにしたい場合は、以下の項目を選択してください",
|
||||
"success": "$t(entity.playlist_one) が正常に更新されました"
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) が正常に更新されました",
|
||||
"editNote": "大規模なプレイリストの場合、手動編集は推奨されません。既存のプレイリストを上書きすることでデータ損失が発生するリスクを許容しますか?"
|
||||
},
|
||||
"shareItem": {
|
||||
"allowDownloading": "ダウンロードを許可",
|
||||
@@ -807,6 +980,32 @@
|
||||
"largeFetchConfirmation": {
|
||||
"title": "キューにアイテムを追加する",
|
||||
"description": "このアクションは、現在のフィルターされたビュー内のすべてのアイテムを追加します"
|
||||
},
|
||||
"createRadioStation": {
|
||||
"success": "ラジオ局が正常に作成されました",
|
||||
"title": "ラジオ局を作成",
|
||||
"input_homepageUrl": "ホームページ URL",
|
||||
"input_name": "名前",
|
||||
"input_streamUrl": "Stream URL"
|
||||
},
|
||||
"lyricsExport": {
|
||||
"export": "歌詞をエクスポート",
|
||||
"input_synced": "同期歌詞をエクスポート",
|
||||
"input_offset": "$t(setting.lyricOffset)"
|
||||
},
|
||||
"shuffleAll": {
|
||||
"title": "ランダムに再生",
|
||||
"input_genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"input_limit": "曲が多すぎます",
|
||||
"input_minYear": "年から",
|
||||
"input_maxYear": "年まで",
|
||||
"input_played_optionAll": "すべてのトラック",
|
||||
"input_played_optionUnplayed": "未再生のトラックのみ",
|
||||
"input_played_optionPlayed": "再生されたトラックのみ",
|
||||
"input_played": "再生フィルター"
|
||||
},
|
||||
"saveQueue": {
|
||||
"success": "プレイキューをサーバーに保存しました"
|
||||
}
|
||||
},
|
||||
"entity": {
|
||||
@@ -814,20 +1013,22 @@
|
||||
"playlistWithCount_other": "{{count}} 個のプレイリスト",
|
||||
"playlist_other": "プレイリスト",
|
||||
"artist_other": "アーティスト",
|
||||
"folderWithCount_other": "{{count}} 個のフォルダ",
|
||||
"folderWithCount_other": "{{count}} 個のフォルダー",
|
||||
"albumArtist_other": "アルバムアーティスト",
|
||||
"track_other": "トラック",
|
||||
"albumArtistCount_other": "{{count}} アルバムアーティスト",
|
||||
"albumWithCount_other": "{{count}} 枚のアルバム",
|
||||
"favorite_other": "お気に入り",
|
||||
"artistWithCount_other": "{{count}} 人のアーティスト",
|
||||
"folder_other": "フォルダ",
|
||||
"smartPlaylist": "スマート $t(entity.playlist_one)",
|
||||
"folder_other": "フォルダー",
|
||||
"smartPlaylist": "スマート $t(entity.playlist, {\"count\": 1})",
|
||||
"album_other": "アルバム",
|
||||
"genreWithCount_other": "{{count}} 個のジャンル",
|
||||
"trackWithCount_other": "{{count}} 個のトラック",
|
||||
"play_other": "{{count}} 回再生",
|
||||
"song_other": "曲"
|
||||
"song_other": "曲",
|
||||
"radioStation_other": "ラジオ局",
|
||||
"radioStationWithCount_other": "{{count}} 局のラジオ局"
|
||||
},
|
||||
"dragDropZone": {
|
||||
"error_oneFileOnly": "1 つのファイルのみ選択してください",
|
||||
@@ -840,7 +1041,7 @@
|
||||
"ep": "EP",
|
||||
"other": "その他",
|
||||
"single": "シングル",
|
||||
"album": "$t(entity.album_one)"
|
||||
"album": "$t(entity.album, {\"count\": 1})"
|
||||
},
|
||||
"secondary": {
|
||||
"audiobook": "オーディオブック",
|
||||
@@ -850,5 +1051,39 @@
|
||||
"demo": "デモ",
|
||||
"soundtrack": "サウンドトラック"
|
||||
}
|
||||
},
|
||||
"datetime": {
|
||||
"minuteShort": "分",
|
||||
"secondShort": "秒",
|
||||
"hourShort": "時間",
|
||||
"dayShort": "日"
|
||||
},
|
||||
"queryBuilder": {
|
||||
"standardTags": "標準タグ",
|
||||
"customTags": "カスタムタグ"
|
||||
},
|
||||
"filterOperator": {
|
||||
"matchesRegex": "正規表現に一致",
|
||||
"notContains": "含まれていない",
|
||||
"after": "以降",
|
||||
"afterDate": "以降 (日付)",
|
||||
"before": "以前",
|
||||
"beforeDate": "以前 (日付)",
|
||||
"contains": "を含む",
|
||||
"endsWith": "で終わる",
|
||||
"inPlaylist": "いずれか",
|
||||
"inTheRange": "範囲内",
|
||||
"inTheRangeDate": "範囲内 (日付)",
|
||||
"is": "完全一致",
|
||||
"isNot": "不一致",
|
||||
"startsWith": "で始まる",
|
||||
"inTheLast": "以内",
|
||||
"isGreaterThan": "より大きい",
|
||||
"isLessThan": "より小さい",
|
||||
"notInPlaylist": "いずれでもない",
|
||||
"notInTheLast": "より前"
|
||||
},
|
||||
"visualizer": {
|
||||
"visualizerType": "ビジュアライザーの種類"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,27 +1,43 @@
|
||||
{
|
||||
"action": {
|
||||
"createPlaylist": "$t(entity.playlist_one) 생성",
|
||||
"addToFavorites": "$t(entity.favorite_other)에 추가",
|
||||
"addToPlaylist": "$t(entity.playlist_one)에 추가",
|
||||
"createPlaylist": "$t(entity.playlist, {\"count\": 1}) 생성",
|
||||
"addToFavorites": "$t(entity.favorite, {\"count\": 2})에 추가",
|
||||
"addToPlaylist": "$t(entity.playlist, {\"count\": 1})에 추가",
|
||||
"clearQueue": "대기열 지우기",
|
||||
"deletePlaylist": "$t(entity.playlist_one) 삭제",
|
||||
"deletePlaylist": "$t(entity.playlist, {\"count\": 1}) 삭제",
|
||||
"deselectAll": "모두 선택 해제",
|
||||
"editPlaylist": "$t(entity.playlist_one) 편집",
|
||||
"editPlaylist": "$t(entity.playlist, {\"count\": 1}) 편집",
|
||||
"goToPage": "페이지 이동",
|
||||
"moveToBottom": "맨 아래로 이동",
|
||||
"moveToTop": "맨 위로 이동",
|
||||
"moveToNext": "다음으로 이동",
|
||||
"removeFromQueue": "대기열에서 제거",
|
||||
"refresh": "$t(common.refresh)",
|
||||
"removeFromFavorites": "$t(entity.favorite_other)에서 제거",
|
||||
"removeFromPlaylist": "$t(entity.playlist_one)에서 제거",
|
||||
"removeFromFavorites": "$t(entity.favorite, {\"count\": 2})에서 제거",
|
||||
"removeFromPlaylist": "$t(entity.playlist, {\"count\": 1})에서 제거",
|
||||
"openIn": {
|
||||
"musicbrainz": "MusicBrainz에서 보기",
|
||||
"lastfm": "Last.fm에서 보기"
|
||||
},
|
||||
"viewPlaylists": "$t(entity.playlist_other) 보기",
|
||||
"viewPlaylists": "$t(entity.playlist, {\"count\": 2}) 보기",
|
||||
"setRating": "평점 지정",
|
||||
"toggleSmartPlaylistEditor": "$t(entity.smartPlaylist) 편집기 펼치기"
|
||||
"toggleSmartPlaylistEditor": "$t(entity.smartPlaylist) 편집기 펼치기",
|
||||
"addOrRemoveFromSelection": "선택항목에서 추가 또는 제거",
|
||||
"selectRangeOfItems": "항목의 범위 선택",
|
||||
"createRadioStation": "$t(entity.radioStation, {\"count\": 1}) 생성",
|
||||
"deleteRadioStation": "$t(entity.radioStation, {\"count\": 1}) 삭제",
|
||||
"selectAll": "전부 선택",
|
||||
"downloadStarted": "{{count}}개 항목 다운로드 시작했습니다",
|
||||
"moveUp": "위로 옮기기",
|
||||
"moveDown": "아래로 옮기기",
|
||||
"holdToMoveToTop": "맨 위로 옮기기 위해 끌기",
|
||||
"holdToMoveToBottom": "맨 아래로 옮기기 위해 끌기",
|
||||
"moveItems": "항목 옮기기",
|
||||
"shuffle": "섞기",
|
||||
"shuffleAll": "모두 섞기",
|
||||
"shuffleSelected": "선택항목 섞기",
|
||||
"viewMore": "더 보기",
|
||||
"openApplicationDirectory": "앱 디렉토리 열기"
|
||||
},
|
||||
"common": {
|
||||
"translation": "번역",
|
||||
@@ -43,7 +59,7 @@
|
||||
"backward": "뒤로",
|
||||
"saveAs": "(으)로 저장하기",
|
||||
"search": "검색",
|
||||
"setting": "설정",
|
||||
"setting_other": "설정",
|
||||
"share": "공유",
|
||||
"size": "크기",
|
||||
"sortOrder": "순서",
|
||||
@@ -58,7 +74,7 @@
|
||||
"comingSoon": "조만간…",
|
||||
"configure": "설정",
|
||||
"confirm": "확인",
|
||||
"currentSong": "현재 $t(entity.track_one)",
|
||||
"currentSong": "현재 $t(entity.track, {\"count\": 1})",
|
||||
"decrease": "감소",
|
||||
"delete": "삭제",
|
||||
"descending": "내림차순",
|
||||
@@ -80,7 +96,7 @@
|
||||
"path": "경로",
|
||||
"playerMustBePaused": "플레이어가 일시정지 되어야 합니다",
|
||||
"preview": "미리보기",
|
||||
"previousSong": "이전곡 $t(entity.track_one)",
|
||||
"previousSong": "이전곡 $t(entity.track, {\"count\": 1})",
|
||||
"quit": "종료",
|
||||
"refresh": "새로고침",
|
||||
"reload": "리로드",
|
||||
@@ -122,7 +138,18 @@
|
||||
"recordLabel": "레이블",
|
||||
"releaseType": "발매형태",
|
||||
"explicit": "성인컨텐츠",
|
||||
"clean": "클린"
|
||||
"clean": "클린",
|
||||
"countSelected": "{{count}}개 선택됨",
|
||||
"doNotShowAgain": "다시 보지 않기",
|
||||
"view": "보기",
|
||||
"externalLinks": "외부 링크",
|
||||
"faster": "빠르게",
|
||||
"noFilters": "필터 미설정",
|
||||
"slower": "천천히",
|
||||
"sort": "정렬",
|
||||
"gridRows": "행 그리드",
|
||||
"tableColumns": "테이블 열",
|
||||
"itemsMore": "{{count}}개 더"
|
||||
},
|
||||
"entity": {
|
||||
"albumWithCount_other": "{{count}} 앨범",
|
||||
@@ -141,8 +168,10 @@
|
||||
"song_other": "곡",
|
||||
"play_other": "{{count}} 재생",
|
||||
"playlistWithCount_other": "{{count}} 재생목록",
|
||||
"smartPlaylist": "스마트 $t(entity.playlist_one)",
|
||||
"track_other": "트랙"
|
||||
"smartPlaylist": "스마트 $t(entity.playlist, {\"count\": 1})",
|
||||
"track_other": "트랙",
|
||||
"radioStation_other": "라디오 방송국",
|
||||
"radioStationWithCount_other": "{{count}}개 라디오 방송국"
|
||||
},
|
||||
"error": {
|
||||
"systemFontError": "시스템 폰트를 가져오는데 실패하였습니다",
|
||||
@@ -185,9 +214,9 @@
|
||||
"dateAdded": "추가된 날짜",
|
||||
"lastPlayed": "마지막으로 재생한",
|
||||
"mostPlayed": "가장 많이 재생한",
|
||||
"album": "$t(entity.album_one)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"communityRating": "커뮤니티 평점",
|
||||
"criticRating": "비평가 평점",
|
||||
"disc": "디스크",
|
||||
@@ -196,11 +225,11 @@
|
||||
"channels": "$t(common.channel_other)",
|
||||
"duration": "길이",
|
||||
"bpm": "bpm",
|
||||
"albumCount": "$t(entity.album_other) 앨범수",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2}) 앨범수",
|
||||
"comment": "코멘트",
|
||||
"favorited": "즐겨찾기",
|
||||
"fromYear": "시작 년도",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"id": "아이디",
|
||||
"isCompilation": "편집앨범 여부",
|
||||
"isFavorited": "즐겨찾기 여부",
|
||||
@@ -233,16 +262,16 @@
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"input_skipDuplicates": "중복 건너뛰기",
|
||||
"title": "$t(entity.playlist_one) 에 추가",
|
||||
"input_playlists": "$t(entity.playlist_other)",
|
||||
"title": "$t(entity.playlist, {\"count\": 1}) 에 추가",
|
||||
"input_playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"success": "$t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })에 $t(entity.trackWithCount, {\"count\": {{message}} })가 추가되었습니다",
|
||||
"create": "$t(entity.playlist_one) {{playlist}} 생성",
|
||||
"searchOrCreate": "$t(entity.playlist_other) 검색 또는 입력하여 새로 만들기"
|
||||
"create": "$t(entity.playlist, {\"count\": 1}) {{playlist}} 생성",
|
||||
"searchOrCreate": "$t(entity.playlist, {\"count\": 2}) 검색 또는 입력하여 새로 만들기"
|
||||
},
|
||||
"lyricSearch": {
|
||||
"title": "가사 검색",
|
||||
"input_name": "$t(common.name)",
|
||||
"input_artist": "$t(entity.artist_one)"
|
||||
"input_artist": "$t(entity.artist, {\"count\": 1})"
|
||||
},
|
||||
"queryEditor": {
|
||||
"input_optionMatchAll": "모두 일치",
|
||||
@@ -250,9 +279,9 @@
|
||||
"title": "쿼리 편집기"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"title": "$t(entity.playlist_one) 편집",
|
||||
"title": "$t(entity.playlist, {\"count\": 1}) 편집",
|
||||
"publicJellyfinNote": "Jellyfin은 재생목록 공개 여부를 노출하지 않습니다. 만약 공개되길 원한다면 다음을 선택하세요",
|
||||
"success": "$t(entity.playlist_one) 업데이트 되었습니다"
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) 업데이트 되었습니다"
|
||||
},
|
||||
"shareItem": {
|
||||
"allowDownloading": "다운로드 허용",
|
||||
@@ -269,15 +298,15 @@
|
||||
"createPlaylist": {
|
||||
"input_description": "$t(common.description)",
|
||||
"input_name": "$t(common.name)",
|
||||
"success": "$t(entity.playlist_one)를 생성했습니다",
|
||||
"success": "$t(entity.playlist, {\"count\": 1})를 생성했습니다",
|
||||
"input_owner": "$t(common.owner)",
|
||||
"input_public": "공개",
|
||||
"title": "$t(entity.playlist_one) 생성"
|
||||
"title": "$t(entity.playlist, {\"count\": 1}) 생성"
|
||||
},
|
||||
"deletePlaylist": {
|
||||
"input_confirm": "확인을 위해 $t(entity.playlist_one)의 이름을 적어주세요",
|
||||
"success": "$t(entity.playlist_one)가 삭제되었습니다",
|
||||
"title": "$t(entity.playlist_one) 삭제"
|
||||
"input_confirm": "확인을 위해 $t(entity.playlist, {\"count\": 1})의 이름을 적어주세요",
|
||||
"success": "$t(entity.playlist, {\"count\": 1})가 삭제되었습니다",
|
||||
"title": "$t(entity.playlist, {\"count\": 1}) 삭제"
|
||||
},
|
||||
"privateMode": {
|
||||
"enabled": "프라이빗 모드가 활성화되었습니다. 재생상태가 외부 서비스에 지금부터 노출되지 않습니다",
|
||||
@@ -333,8 +362,8 @@
|
||||
"download": "다운로드",
|
||||
"numberSelected": "{{count}}개 선택됨",
|
||||
"shareItem": "공유",
|
||||
"goToAlbum": "$t(entity.album_one)으로 이동",
|
||||
"goToAlbumArtist": "$t(entity.albumArtist_one)으로 이동",
|
||||
"goToAlbum": "$t(entity.album, {\"count\": 1})으로 이동",
|
||||
"goToAlbumArtist": "$t(entity.albumArtist, {\"count\": 1})으로 이동",
|
||||
"showDetails": "추가정보"
|
||||
},
|
||||
"albumArtistDetail": {
|
||||
@@ -342,17 +371,17 @@
|
||||
"viewDiscography": "디스코그래피 보기",
|
||||
"appearsOn": "참여 앨범",
|
||||
"recentReleases": "최근 앨범",
|
||||
"relatedArtists": "연관 $t(entity.artist_other)",
|
||||
"relatedArtists": "연관 $t(entity.artist, {\"count\": 2})",
|
||||
"topSongs": "최고의 곡들",
|
||||
"topSongsFrom": "{{title}}이 포함된 최고의 곡들",
|
||||
"viewAll": "전부 보이기",
|
||||
"viewAllTracks": "$t(entity.track_other) 전부 보이기"
|
||||
"viewAllTracks": "$t(entity.track, {\"count\": 2}) 전부 보이기"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
"title": "$t(entity.albumArtist, {\"count\": 2})"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "$t(entity.artist_one) 더 보기",
|
||||
"moreFromArtist": "$t(entity.artist, {\"count\": 1}) 더 보기",
|
||||
"moreFromGeneric": "{{item}} 더 보기",
|
||||
"released": "발매"
|
||||
},
|
||||
@@ -360,8 +389,8 @@
|
||||
"artistAlbums": "{{artist}}의 앨범"
|
||||
},
|
||||
"genreList": {
|
||||
"showAlbums": "$t(entity.genre_one) $t(entity.album_other) 표시",
|
||||
"showTracks": "$t(entity.genre_one) $t(entity.track_other) 표시"
|
||||
"showAlbums": "$t(entity.genre, {\"count\": 1}) $t(entity.album, {\"count\": 2}) 표시",
|
||||
"showTracks": "$t(entity.genre, {\"count\": 1}) $t(entity.track, {\"count\": 2}) 표시"
|
||||
},
|
||||
"globalSearch": {
|
||||
"commands": {
|
||||
@@ -396,7 +425,7 @@
|
||||
"sidebar": {
|
||||
"myLibrary": "내 라이브러리",
|
||||
"nowPlaying": "재생중",
|
||||
"shared": "공유 $t(entity.playlist_other)"
|
||||
"shared": "공유 $t(entity.playlist, {\"count\": 2})"
|
||||
},
|
||||
"trackList": {
|
||||
"artistTracks": "{{artist}}의 음악"
|
||||
|
||||
@@ -5,22 +5,22 @@
|
||||
"musicbrainz": "Åpne i MusicBrainz"
|
||||
},
|
||||
"moveToBottom": "flytt til bunnen",
|
||||
"deletePlaylist": "slett $t(entity.playlist_one)",
|
||||
"deletePlaylist": "slett $t(entity.playlist, {\"count\": 1})",
|
||||
"deselectAll": "avmarker alle",
|
||||
"editPlaylist": "rediger $t(entity.playlist_one)",
|
||||
"addToFavorites": "legg til $t(entity.favorite_other)",
|
||||
"addToPlaylist": "legg til $t(entity.playlist_one)",
|
||||
"editPlaylist": "rediger $t(entity.playlist, {\"count\": 1})",
|
||||
"addToFavorites": "legg til $t(entity.favorite, {\"count\": 2})",
|
||||
"addToPlaylist": "legg til $t(entity.playlist, {\"count\": 1})",
|
||||
"clearQueue": "tøm kø",
|
||||
"createPlaylist": "opprett $t(entity.playlist_one)",
|
||||
"createPlaylist": "opprett $t(entity.playlist, {\"count\": 1})",
|
||||
"goToPage": "gå til side",
|
||||
"moveToTop": "flytt til toppen",
|
||||
"refresh": "$t(common.refresh)",
|
||||
"removeFromFavorites": "fjern fra $t(entity.favorite_other)",
|
||||
"removeFromFavorites": "fjern fra $t(entity.favorite, {\"count\": 2})",
|
||||
"moveToNext": "flytt til neste",
|
||||
"setRating": "angi vurdering",
|
||||
"removeFromQueue": "fjern fra kø",
|
||||
"removeFromPlaylist": "fjern fra $t(entity.playlist_one)",
|
||||
"viewPlaylists": "vise $t(entity.playlist_other)",
|
||||
"removeFromPlaylist": "fjern fra $t(entity.playlist, {\"count\": 1})",
|
||||
"viewPlaylists": "vise $t(entity.playlist, {\"count\": 2})",
|
||||
"toggleSmartPlaylistEditor": "bytt $t(entity.smartPlaylist) editor"
|
||||
},
|
||||
"common": {
|
||||
@@ -31,7 +31,7 @@
|
||||
"collapse": "slå sammen",
|
||||
"configure": "konfigurer",
|
||||
"confirm": "bekreft",
|
||||
"currentSong": "gjeldende $t(entity.track_one)",
|
||||
"currentSong": "gjeldende $t(entity.track, {\"count\": 1})",
|
||||
"version": "versjon",
|
||||
"areYouSure": "er du sikker?",
|
||||
"ascending": "stigende",
|
||||
@@ -69,7 +69,7 @@
|
||||
"owner": "eier",
|
||||
"playerMustBePaused": "spilleren må settes på pause",
|
||||
"path": "sti",
|
||||
"previousSong": "forrige $t(entity.track_one)",
|
||||
"previousSong": "forrige $t(entity.track, {\"count\": 1})",
|
||||
"refresh": "frisk opp",
|
||||
"rating": "vurdering",
|
||||
"random": "vilkårlig",
|
||||
@@ -87,7 +87,8 @@
|
||||
"share": "del",
|
||||
"quit": "avslutt",
|
||||
"size": "størrelse",
|
||||
"setting": "innstilling",
|
||||
"setting_one": "innstilling",
|
||||
"setting_other": "",
|
||||
"trackNumber": "spor",
|
||||
"title": "tittel",
|
||||
"channel_one": "kanal",
|
||||
@@ -121,7 +122,7 @@
|
||||
"sampleRate": "samplingsfrekvens"
|
||||
},
|
||||
"entity": {
|
||||
"smartPlaylist": "smart $t(entity.playlist_one)",
|
||||
"smartPlaylist": "smart $t(entity.playlist, {\"count\": 1})",
|
||||
"album_one": "album",
|
||||
"album_other": "album",
|
||||
"albumArtist_one": "albumartist",
|
||||
@@ -189,10 +190,10 @@
|
||||
"id": "id",
|
||||
"name": "navn",
|
||||
"bitrate": "bithastighet",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"biography": "biografi",
|
||||
"album": "$t(entity.album_one)",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"duration": "lengde",
|
||||
"favorited": "merket som favoritt",
|
||||
"comment": "kommentar",
|
||||
@@ -223,21 +224,21 @@
|
||||
"isFavorited": "er merket som favoritt",
|
||||
"recentlyAdded": "nylig lagt til",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"trackNumber": "spor",
|
||||
"albumCount": "$t(entity.album_other) opptelling"
|
||||
"albumCount": "$t(entity.album, {\"count\": 2}) opptelling"
|
||||
},
|
||||
"form": {
|
||||
"createPlaylist": {
|
||||
"input_description": "$t(common.description)",
|
||||
"input_owner": "$t(common.owner)",
|
||||
"input_public": "offentlig",
|
||||
"title": "opprett $t(entity.playlist_one)",
|
||||
"title": "opprett $t(entity.playlist, {\"count\": 1})",
|
||||
"input_name": "$t(common.name)",
|
||||
"success": "$t(entity.playlist_one) opprettet"
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) opprettet"
|
||||
},
|
||||
"lyricSearch": {
|
||||
"input_artist": "$t(entity.artist_one)",
|
||||
"input_artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"input_name": "$t(common.name)",
|
||||
"title": "sangtekstsøk"
|
||||
},
|
||||
@@ -256,18 +257,18 @@
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"success": "la $t(entity.trackWithCount, {\"count\": {{message}} }) til $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })",
|
||||
"title": "legg til i $t(entity.playlist_one)",
|
||||
"title": "legg til i $t(entity.playlist, {\"count\": 1})",
|
||||
"input_skipDuplicates": "hopp over duplikater",
|
||||
"input_playlists": "$t(entity.playlist_other)"
|
||||
"input_playlists": "$t(entity.playlist, {\"count\": 2})"
|
||||
},
|
||||
"deletePlaylist": {
|
||||
"title": "slett $t(entity.playlist_one)",
|
||||
"success": "$t(entity.playlist_one) er slettet",
|
||||
"input_confirm": "skrive inn navnet på $t(entity.playlist_one) for å bekrefte"
|
||||
"title": "slett $t(entity.playlist, {\"count\": 1})",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) er slettet",
|
||||
"input_confirm": "skrive inn navnet på $t(entity.playlist, {\"count\": 1}) for å bekrefte"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"title": "rediger $t(entity.playlist_one)",
|
||||
"success": "$t(entity.playlist_one) er oppdatert"
|
||||
"title": "rediger $t(entity.playlist, {\"count\": 1})",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) er oppdatert"
|
||||
},
|
||||
"shareItem": {
|
||||
"allowDownloading": "tillat nedlasting",
|
||||
@@ -296,7 +297,7 @@
|
||||
"manageServers": "administrere servere",
|
||||
"goBack": "gå tilbake",
|
||||
"openBrowserDevtools": "åpne utviklingsverktøy i nettleser",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"expandSidebar": "utvid sidefelt",
|
||||
"goForward": "gå fremover"
|
||||
},
|
||||
@@ -329,22 +330,22 @@
|
||||
"viewDiscography": "se diskografi",
|
||||
"recentReleases": "nylige utgivelser",
|
||||
"topSongsFrom": "beste sanger fra {{title}}",
|
||||
"viewAllTracks": "se alle $t(entity.track_other)",
|
||||
"viewAllTracks": "se alle $t(entity.track, {\"count\": 2})",
|
||||
"viewAll": "se alle",
|
||||
"about": "Om {{artist}}",
|
||||
"appearsOn": "opptrer på",
|
||||
"relatedArtists": "relatert $t(entity.artist_other)"
|
||||
"relatedArtists": "relatert $t(entity.artist, {\"count\": 2})"
|
||||
},
|
||||
"albumList": {
|
||||
"artistAlbums": "album av {{artist}}",
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)",
|
||||
"title": "$t(entity.album_other)"
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album, {\"count\": 2})",
|
||||
"title": "$t(entity.album, {\"count\": 2})"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
"title": "$t(entity.albumArtist, {\"count\": 2})"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "mer fra denne $t(entity.artist_one)",
|
||||
"moreFromArtist": "mer fra denne $t(entity.artist, {\"count\": 1})",
|
||||
"moreFromGeneric": "mer fra {{item}}",
|
||||
"released": "utgitt"
|
||||
},
|
||||
@@ -372,9 +373,9 @@
|
||||
"related": "relatert"
|
||||
},
|
||||
"genreList": {
|
||||
"title": "$t(entity.genre_other)",
|
||||
"showAlbums": "vis $t(entity.genre_one) $t(entity.album_other)",
|
||||
"showTracks": "vis $t(entity.genre_one) $t(entity.track_other)"
|
||||
"title": "$t(entity.genre, {\"count\": 2})",
|
||||
"showAlbums": "vis $t(entity.genre, {\"count\": 1}) $t(entity.album, {\"count\": 2})",
|
||||
"showTracks": "vis $t(entity.genre, {\"count\": 1}) $t(entity.track, {\"count\": 2})"
|
||||
},
|
||||
"globalSearch": {
|
||||
"title": "kommandoer",
|
||||
@@ -405,23 +406,23 @@
|
||||
"copyPath": "kopier stien til utklippstavlen"
|
||||
},
|
||||
"trackList": {
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track_other)",
|
||||
"title": "$t(entity.track_other)",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track, {\"count\": 2})",
|
||||
"title": "$t(entity.track, {\"count\": 2})",
|
||||
"artistTracks": "spor fra {{artist}}"
|
||||
},
|
||||
"sidebar": {
|
||||
"albumArtists": "$t(entity.albumArtist_other)",
|
||||
"tracks": "$t(entity.track_other)",
|
||||
"albumArtists": "$t(entity.albumArtist, {\"count\": 2})",
|
||||
"tracks": "$t(entity.track, {\"count\": 2})",
|
||||
"nowPlaying": "spilles nå",
|
||||
"folders": "$t(entity.folder_other)",
|
||||
"genres": "$t(entity.genre_other)",
|
||||
"folders": "$t(entity.folder, {\"count\": 2})",
|
||||
"genres": "$t(entity.genre, {\"count\": 2})",
|
||||
"home": "$t(common.home)",
|
||||
"albums": "$t(entity.album_other)",
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"albums": "$t(entity.album, {\"count\": 2})",
|
||||
"playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"search": "$t(common.search)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"shared": "delt $t(entity.playlist_other)",
|
||||
"artists": "$t(entity.artist_other)",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"shared": "delt $t(entity.playlist, {\"count\": 2})",
|
||||
"artists": "$t(entity.artist, {\"count\": 2})",
|
||||
"myLibrary": "mitt bibliotek"
|
||||
},
|
||||
"setting": {
|
||||
@@ -432,7 +433,7 @@
|
||||
"windowTab": "vindu"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist_other)"
|
||||
"title": "$t(entity.playlist, {\"count\": 2})"
|
||||
},
|
||||
"playlist": {
|
||||
"reorder": "omorganisering kun mulig ved sortering på id"
|
||||
|
||||
@@ -1,21 +1,21 @@
|
||||
{
|
||||
"action": {
|
||||
"editPlaylist": "pas $t(entity.playlist_one) aan",
|
||||
"editPlaylist": "pas $t(entity.playlist, {\"count\": 1}) aan",
|
||||
"goToPage": "ga naar pagina",
|
||||
"moveToTop": "verplaats naar boven",
|
||||
"addToFavorites": "toevoegen aan $t(entity.favorite_other)",
|
||||
"addToPlaylist": "toevoegen aan $t(entity.playlist_one)",
|
||||
"createPlaylist": "maak $t(entity.playlist_one)",
|
||||
"removeFromPlaylist": "verwijder van $t(entity.playlist_one)",
|
||||
"viewPlaylists": "bekijk $t(entity.playlist_other)",
|
||||
"moveToTop": "verplaats naar begin",
|
||||
"addToFavorites": "toevoegen aan $t(entity.favorite, {\"count\": 2})",
|
||||
"addToPlaylist": "toevoegen aan $t(entity.playlist, {\"count\": 1})",
|
||||
"createPlaylist": "maak $t(entity.playlist, {\"count\": 1})",
|
||||
"removeFromPlaylist": "verwijder uit $t(entity.playlist, {\"count\": 1})",
|
||||
"viewPlaylists": "bekijk $t(entity.playlist, {\"count\": 2})",
|
||||
"refresh": "$t(common.refresh)",
|
||||
"deletePlaylist": "verwijder $t(entity.playlist_one)",
|
||||
"removeFromQueue": "verwijder van lijst",
|
||||
"deletePlaylist": "verwijder $t(entity.playlist, {\"count\": 1})",
|
||||
"removeFromQueue": "verwijder uit wachtrij",
|
||||
"deselectAll": "deselecteer alles",
|
||||
"moveToBottom": "verplaats naar bodem",
|
||||
"setRating": "selecteer rating",
|
||||
"moveToBottom": "verplaats naar einde",
|
||||
"setRating": "kies beoordeling",
|
||||
"toggleSmartPlaylistEditor": "editor $t(entity.smartPlaylist) schakelen",
|
||||
"removeFromFavorites": "verwijder van $t(entity.favorite_other)",
|
||||
"removeFromFavorites": "verwijder uit $t(entity.favorite, {\"count\": 2})",
|
||||
"clearQueue": "verwijder lijst",
|
||||
"openIn": {
|
||||
"lastfm": "Open in Last.fm",
|
||||
@@ -27,7 +27,17 @@
|
||||
"shuffle": "shuffle",
|
||||
"shuffleAll": "shuffle alles",
|
||||
"shuffleSelected": "shuffle geselecteerde",
|
||||
"viewMore": "bekijk meer"
|
||||
"viewMore": "bekijk meer",
|
||||
"addOrRemoveFromSelection": "toevoegen aan of verwijderen uit selectie",
|
||||
"selectRangeOfItems": "selecteer een reeks van nummers",
|
||||
"createRadioStation": "maak $t(entity.radioStation, {\"count\": 1})",
|
||||
"deleteRadioStation": "verwijder $t(entity.radioStation, {\"count\": 1})",
|
||||
"selectAll": "selecteer alles",
|
||||
"moveUp": "verplaats omhoog",
|
||||
"moveDown": "verplaats omlaag",
|
||||
"holdToMoveToTop": "ingedrukt houden om naar begin te verplaatsen",
|
||||
"holdToMoveToBottom": "ingedrukt houden om naar einde te verplaatsen",
|
||||
"openApplicationDirectory": "applicatiemap openen"
|
||||
},
|
||||
"common": {
|
||||
"backward": "achteruit",
|
||||
@@ -38,7 +48,7 @@
|
||||
"edit": "aanpassen",
|
||||
"favorite": "favoriet",
|
||||
"left": "links",
|
||||
"currentSong": "huidig $t(entity.track_one)",
|
||||
"currentSong": "huidig $t(entity.track, {\"count\": 1})",
|
||||
"collapse": "samenvouwen",
|
||||
"descending": "aflopend",
|
||||
"add": "toevoegen",
|
||||
@@ -82,7 +92,7 @@
|
||||
"disable": "deactiveren",
|
||||
"none": "geen",
|
||||
"menu": "menu",
|
||||
"previousSong": "vorige $t(entity.track_one)",
|
||||
"previousSong": "vorige $t(entity.track, {\"count\": 1})",
|
||||
"noResultsFromQuery": "de zoekopdracht leverde geen resultaten op",
|
||||
"quit": "sluiten",
|
||||
"expand": "vergroten",
|
||||
@@ -108,11 +118,12 @@
|
||||
"yes": "ja",
|
||||
"size": "grootte",
|
||||
"reload": "herlaad",
|
||||
"setting": "instelling",
|
||||
"setting_one": "instelling",
|
||||
"setting_other": "",
|
||||
"close": "sluiten",
|
||||
"additionalParticipants": "andere deelnemers",
|
||||
"newVersion": "een nieuwe versie is geinstalleerd ({{version}})",
|
||||
"viewReleaseNotes": "zie release notes",
|
||||
"newVersion": "een nieuwe versie is geïnstalleerd ({{version}})",
|
||||
"viewReleaseNotes": "lees uitgavenotities",
|
||||
"albumGain": "album gain",
|
||||
"translation": "vertaling",
|
||||
"explicitStatus": "expliciete status",
|
||||
@@ -139,7 +150,14 @@
|
||||
"clean": "schoon",
|
||||
"gridRows": "rasterrijen",
|
||||
"tableColumns": "tabelkolommen",
|
||||
"itemsMore": "{{count}} meer"
|
||||
"itemsMore": "{{count}} meer",
|
||||
"countSelected": "{{count}} geselecteerd",
|
||||
"view": "bekijken",
|
||||
"noFilters": "geen filters ingesteld",
|
||||
"example": "voorbeeld",
|
||||
"mood": "stemming",
|
||||
"retry": "opnieuw proberen",
|
||||
"filter_single": "single"
|
||||
},
|
||||
"filter": {
|
||||
"rating": "rating",
|
||||
@@ -155,28 +173,28 @@
|
||||
"isRated": "is rated",
|
||||
"owner": "$t(common.owner)",
|
||||
"bitrate": "bitrate",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"recentlyAdded": "recentelijk toegevoegd",
|
||||
"note": "notitie",
|
||||
"name": "naam",
|
||||
"dateAdded": "datum toegevoegd",
|
||||
"albumCount": "$t(entity.album_other) totaal",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2}) totaal",
|
||||
"path": "pad",
|
||||
"favorited": "favoriet",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"isRecentlyPlayed": "is recentelijk afgespeeld",
|
||||
"isFavorited": "is favoriet",
|
||||
"bpm": "bpm",
|
||||
"id": "id",
|
||||
"disc": "disk",
|
||||
"biography": "biografie",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"duration": "duratie",
|
||||
"isPublic": "is publiek",
|
||||
"random": "willekeurig",
|
||||
"lastPlayed": "laatst gespeeld",
|
||||
"fromYear": "van jaar",
|
||||
"album": "$t(entity.album_one)",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"title": "titel",
|
||||
"search": "zoeken",
|
||||
"releaseDate": "releasedatum",
|
||||
@@ -206,8 +224,8 @@
|
||||
"removeFromQueue": "$t(action.removeFromQueue)",
|
||||
"download": "download",
|
||||
"shareItem": "deel item",
|
||||
"goToAlbum": "ga naar $t(entity.album_one)",
|
||||
"goToAlbumArtist": "ga naar $t(entity.albumArtist_one)",
|
||||
"goToAlbum": "ga naar $t(entity.album, {\"count\": 1})",
|
||||
"goToAlbumArtist": "ga naar $t(entity.albumArtist, {\"count\": 1})",
|
||||
"showDetails": "haal info op",
|
||||
"moveItems": "$t(action.moveItems)",
|
||||
"moveToNext": "$t(action.moveToNext)",
|
||||
@@ -218,7 +236,7 @@
|
||||
"appMenu": {
|
||||
"selectServer": "selecteer server",
|
||||
"version": "versie {{version}}",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"manageServers": "beheer servers",
|
||||
"expandSidebar": "sidebar uitklappen",
|
||||
"collapseSidebar": "sidebar inklappen",
|
||||
@@ -230,10 +248,11 @@
|
||||
"privateModeOn": "schakel private modus in",
|
||||
"selectMusicFolder": "selecteer muziekfolder",
|
||||
"noMusicFolder": "geen muziekfolder geselecteerd",
|
||||
"multipleMusicFolders": "{{count}} muziekfolders geselecteerd"
|
||||
"multipleMusicFolders": "{{count}} muziekfolders geselecteerd",
|
||||
"commandPalette": "open opdrachtvenster"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "meer van deze $t(entity.artist_one)",
|
||||
"moreFromArtist": "meer van deze $t(entity.artist, {\"count\": 1})",
|
||||
"moreFromGeneric": "meer van {{item}}",
|
||||
"released": "uitgebracht"
|
||||
},
|
||||
@@ -261,23 +280,25 @@
|
||||
"visualizer": "visualizer"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
"title": "$t(entity.albumArtist, {\"count\": 2})"
|
||||
},
|
||||
"albumList": {
|
||||
"title": "$t(entity.album_other)",
|
||||
"title": "$t(entity.album, {\"count\": 2})",
|
||||
"artistAlbums": "albums van {{artist}}",
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)"
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album, {\"count\": 2})"
|
||||
},
|
||||
"albumArtistDetail": {
|
||||
"about": "Over {{artist}}",
|
||||
"appearsOn": "verschijnt op",
|
||||
"viewDiscography": "bekijk discografie",
|
||||
"relatedArtists": "gerelateerd $t(entity.artist_other)",
|
||||
"relatedArtists": "gerelateerd $t(entity.artist, {\"count\": 2})",
|
||||
"topSongs": "top nummers",
|
||||
"topSongsFrom": "top nummers van {{title}}",
|
||||
"viewAll": "bekijk alle",
|
||||
"viewAllTracks": "bekijk alle $t(entity.track_other)",
|
||||
"recentReleases": "recente uitgaven"
|
||||
"viewAllTracks": "bekijk alle $t(entity.track, {\"count\": 2})",
|
||||
"recentReleases": "recente uitgaven",
|
||||
"groupingTypeAll": "alle soorten publicaties",
|
||||
"groupingTypePrimary": "primaire publicatiesoorten"
|
||||
},
|
||||
"manageServers": {
|
||||
"title": "beheer servers",
|
||||
@@ -288,9 +309,9 @@
|
||||
"removeServer": "verwijder server"
|
||||
},
|
||||
"genreList": {
|
||||
"showAlbums": "toon $t(entity.genre_one) $t(entity.album_other)",
|
||||
"showTracks": "toon $t(entity.genre_one) $t(entity.track_other)",
|
||||
"title": "$t(entity.genre_other)"
|
||||
"showAlbums": "toon $t(entity.genre, {\"count\": 1}) $t(entity.album, {\"count\": 2})",
|
||||
"showTracks": "toon $t(entity.genre, {\"count\": 1}) $t(entity.track, {\"count\": 2})",
|
||||
"title": "$t(entity.genre, {\"count\": 2})"
|
||||
},
|
||||
"globalSearch": {
|
||||
"commands": {
|
||||
@@ -306,10 +327,11 @@
|
||||
"newlyAdded": "nieuw toegevoegde uitgaven",
|
||||
"recentlyPlayed": "recent afgespeeld",
|
||||
"recentlyReleased": "recent uitgekomen",
|
||||
"title": "$t(common.home)"
|
||||
"title": "$t(common.home)",
|
||||
"genres": "$t(entity.genre, {\"count\": 2})"
|
||||
},
|
||||
"favorites": {
|
||||
"title": "$t(entity.favorite_other)"
|
||||
"title": "$t(entity.favorite, {\"count\": 2})"
|
||||
},
|
||||
"itemDetail": {
|
||||
"copyPath": "kopieer pad naar klembord",
|
||||
@@ -320,7 +342,7 @@
|
||||
"reorder": "herschikken is alleen ingeschakeld wanneer er op ID wordt gestorteerd"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist_other)"
|
||||
"title": "$t(entity.playlist, {\"count\": 2})"
|
||||
},
|
||||
"setting": {
|
||||
"advanced": "geavanceerd",
|
||||
@@ -342,28 +364,38 @@
|
||||
"audio": "geluid",
|
||||
"lyrics": "songtekst",
|
||||
"transcoding": "transcoderen",
|
||||
"discord": "discord"
|
||||
"discord": "discord",
|
||||
"lyricsDisplay": "songtekstweergave",
|
||||
"logger": "logger",
|
||||
"playerFilters": "spelerfilters"
|
||||
},
|
||||
"sidebar": {
|
||||
"albumArtists": "$t(entity.albumArtist_other)",
|
||||
"albums": "$t(entity.album_other)",
|
||||
"artists": "$t(entity.artist_other)",
|
||||
"favorites": "$t(entity.favorite_other)",
|
||||
"folders": "$t(entity.folder_other)",
|
||||
"genres": "$t(entity.genre_other)",
|
||||
"albumArtists": "$t(entity.albumArtist, {\"count\": 2})",
|
||||
"albums": "$t(entity.album, {\"count\": 2})",
|
||||
"artists": "$t(entity.artist, {\"count\": 2})",
|
||||
"favorites": "$t(entity.favorite, {\"count\": 2})",
|
||||
"folders": "$t(entity.folder, {\"count\": 2})",
|
||||
"genres": "$t(entity.genre, {\"count\": 2})",
|
||||
"home": "$t(common.home)",
|
||||
"myLibrary": "mijn bibliotheek",
|
||||
"nowPlaying": "nu aan het spelen",
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"search": "$t(common.search)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"shared": "$t(entity.playlist_other) gedeeld",
|
||||
"tracks": "$t(entity.track_other)"
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"shared": "$t(entity.playlist, {\"count\": 2}) gedeeld",
|
||||
"tracks": "$t(entity.track, {\"count\": 2})",
|
||||
"radio": "$t(entity.radioStation, {\"count\": 2})"
|
||||
},
|
||||
"trackList": {
|
||||
"artistTracks": "nummers van {{artist}}",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track_other)",
|
||||
"title": "$t(entity.track_other)"
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track, {\"count\": 2})",
|
||||
"title": "$t(entity.track, {\"count\": 2})"
|
||||
},
|
||||
"radioList": {
|
||||
"title": "radiostations"
|
||||
},
|
||||
"folderList": {
|
||||
"title": "$t(entity.folder, {\"count\": 2})"
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
@@ -390,7 +422,12 @@
|
||||
"networkError": "een netwerkfout heeft zich voorgedaan",
|
||||
"notificationDenied": "toestemming voor meldingen werd afgewezen. Deze instelling heeft geen effect",
|
||||
"openError": "kon het bestand niet openen",
|
||||
"badAlbum": "je ziet deze pagina omdat dit nummer niet onderdeel is van een album. je komt waarchijnlijk dit probleem tegen als je een nummer op het bovenste niveau van je muziekmap hebt staan. Jellyfin kan alleen nummers groeperen als ze in een folder zitten"
|
||||
"badAlbum": "je ziet deze pagina omdat dit nummer niet onderdeel is van een album. je komt waarchijnlijk dit probleem tegen als je een nummer op het bovenste niveau van je muziekmap hebt staan. Jellyfin kan alleen nummers groeperen als ze in een folder zitten",
|
||||
"multipleServerSaveQueueError": "De afspeellijst bevat een of meer nummers die niet afkomstig zijn van de huidige server. Dit wordt niet ondersteund",
|
||||
"noNetwork": "server niet beschikbaar",
|
||||
"noNetworkDescription": "kan geen verbinding maken met deze server",
|
||||
"saveQueueFailed": "kan wachtrij niet opslaan",
|
||||
"settingsSyncError": "Er zijn verschillen gevonden tussen de instellingen in de renderer en het hoofdproces. Start de applicatie opnieuw op om de wijzigingen toe te passen"
|
||||
},
|
||||
"entity": {
|
||||
"genre_one": "genre",
|
||||
@@ -417,7 +454,7 @@
|
||||
"artistWithCount_other": "{{count}} artiesten",
|
||||
"folder_one": "folder",
|
||||
"folder_other": "folders",
|
||||
"smartPlaylist": "smart $t(entity.playlist_one)",
|
||||
"smartPlaylist": "smart $t(entity.playlist, {\"count\": 1})",
|
||||
"album_one": "album",
|
||||
"album_other": "albums",
|
||||
"genreWithCount_one": "{{count}} genre",
|
||||
@@ -427,7 +464,11 @@
|
||||
"song_one": "lied",
|
||||
"song_other": "liedjes",
|
||||
"play_one": "{{count}} keer afgespeeld",
|
||||
"play_other": "{{count}} keren afgespeeld"
|
||||
"play_other": "{{count}} keren afgespeeld",
|
||||
"radioStation_one": "radiostation",
|
||||
"radioStation_other": "radiostations",
|
||||
"radioStationWithCount_one": "{{count}} radiostation",
|
||||
"radioStationWithCount_other": "{{count}} radiostations"
|
||||
},
|
||||
"table": {
|
||||
"column": {
|
||||
@@ -479,7 +520,247 @@
|
||||
"gaplessAudio_optionWeak": "zwak (aanbevolen)",
|
||||
"gaplessAudio": "gapless audio",
|
||||
"globalMediaHotkeys_description": "het gebruik van systeem mediahotkeys voor controle van afspelen aan-/uitzetten",
|
||||
"globalMediaHotkeys": "globale mediasneltoetsen"
|
||||
"globalMediaHotkeys": "globale mediasneltoetsen",
|
||||
"autoDJ": "auto-DJ",
|
||||
"autoDJ_description": "soortgelijke nummers automatisch aan wachtrij toevoegen",
|
||||
"autoDJ_itemCount": "aantal items",
|
||||
"autoDJ_itemCount_description": "het aantal items dat aan de wachtrij wordt geprobeerd toe te voegen als auto-DJ is ingeschakeld",
|
||||
"autoDJ_timing": "timing",
|
||||
"autoDJ_timing_description": "het aantal overgebleven nummers in de wachtrij voordat auto-DJ wordt aangeroepen",
|
||||
"accentColor_description": "stel de accentkleur voor de applicatie in",
|
||||
"accentColor": "accentkleur",
|
||||
"useThemeAccentColor": "gebruik accentkleur van thema",
|
||||
"useThemeAccentColor_description": "gebruik de primaire kleur zoals gedefinieerd in het gekozen thema in plaats van de aangepaste accentkleur",
|
||||
"albumBackground_description": "toon de albumhoes als achtergrond op albumpagina's",
|
||||
"albumBackground": "achtergrondafbeelding album",
|
||||
"albumBackgroundBlur_description": "de hoeveelheid vervaging die wordt toegepast op de achtergrondafbeelding van een album",
|
||||
"albumBackgroundBlur": "hoeveelheid vervaging achtergrondafbeelding",
|
||||
"analyticsDisable": "Opt-out van gebruiksgebaseerde gegevensverzameling",
|
||||
"analyticsDisable_description": "Geanonimiseerde gebruiksgegevens worden naar de ontwikkelaars gestuurd om te ondersteunen bij het verbeteren van de applicatie",
|
||||
"applicationHotkeys_description": "configureer sneltoetsen. vink aan om als globale sneltoets in te stellen (enkel voor desktop)",
|
||||
"applicationHotkeys": "applicatiesneltoetsen",
|
||||
"artistBackground": "achtergrondafbeelding artiest",
|
||||
"artistBackground_description": "gebruik de artiestafbeelding als achtergrond op artiestpagina's",
|
||||
"artistBackgroundBlur": "hoeveelheid vervaging van achtergrondafbeelding",
|
||||
"artistBackgroundBlur_description": "de hoeveelheid vervaging die wordt toegepast op de achtergrondafbeelding van een artiest",
|
||||
"artistConfiguration": "configuratie albumartiestpagina",
|
||||
"artistConfiguration_description": "configureer welke items worden getoond op de albumartiestpagina en in welke volgorde",
|
||||
"artistReleaseTypeConfiguration": "configuratie artiestuitgavesoorten",
|
||||
"artistReleaseTypeConfiguration_description": "configureer welke uitgavesoorten worden getoond op de albumartiestpagina en in welke volgorde",
|
||||
"audioDevice_description": "kies het audioapparaat dat wordt gebruikt om af te spelen (enkel voor de webspeler)",
|
||||
"audioDevice": "audioapparaat",
|
||||
"audioExclusiveMode_description": "schakel exclusieve uitvoermodus in. In deze modus wordt het systeem normaliter uitgesloten en zal enkel mpv audio kunnen uitvoeren",
|
||||
"audioExclusiveMode": "audio-exclusieve modus",
|
||||
"audioPlayer_description": "kies de audiospeler om te gebruiken bij het afspelen",
|
||||
"audioPlayer": "audiospeler",
|
||||
"buttonSize_description": "de grootte van de knoppen in de afspeelbalk",
|
||||
"buttonSize": "knopgrootte afspeelbalk",
|
||||
"clearCache_description": "een 'harde schoning' van feishin. naast het legen van feishin's cache wordt de browser-cache (opgeslagen afbeeldingen en andere gegevens) geleegd. inloggegevens en instellingen blijven bewaard",
|
||||
"clearCache": "browser-cache legen",
|
||||
"clearCacheSuccess": "cache succesvol geleegd",
|
||||
"clearQueryCache_description": "een 'zachte schoning' van feishin. dit zal afspeellijsten verversen, metadata volgen en opgeslagen songteksten herstellen. inloggegevens en gecachete afbeeldingen blijven bewaard",
|
||||
"clearQueryCache": "feishin's cache legen",
|
||||
"contextMenu_description": "maakt het mogelijk om items te verbergen in het menu dat verschijnt bij het rechts klikken op een item. uitgevinkte items worden verborgen",
|
||||
"contextMenu": "configuratie contextmenu (rechtermuisklik)",
|
||||
"crossfadeDuration_description": "bepaal de duur van het crossfade-effect",
|
||||
"crossfadeDuration": "duur crossfade",
|
||||
"crossfadeStyle": "crossfade-stijl",
|
||||
"crossfadeStyle_description": "kies de crossfade-stijl om te gebruiken met de audiospeler",
|
||||
"customCss": "aangepaste css",
|
||||
"customCss_description": "inhoud van de aangepastge css. Opmerking: content en niet-lokale urls zijn niet toegestaan. Een voorvertoning van de inhoud wordt hieronder getoond. Aanvullende velden die niet zijn ingesteld zijn aanwezig vanwege sanering",
|
||||
"customCssEnable_description": "sta toe aangepaste css te schrijven",
|
||||
"customCssEnable": "aangepaste css inschakelen",
|
||||
"customCssNotice": "Waarschuwing: ondanks sanering (het niet toestaan van url() en content:) brengt aangepaste css nog steeds risico's met zich mee omdat de interface wordt gewijzigd",
|
||||
"customFontPath_description": "bepaal het pad naar het aangepaste lettertype voor gebruik in de applicatie",
|
||||
"customFontPath": "aangepaste lettertypelocatie",
|
||||
"disableAutomaticUpdates": "automatische updates uitschakelen",
|
||||
"releaseChannel_optionBeta": "beta",
|
||||
"releaseChannel_optionLatest": "meest recente",
|
||||
"releaseChannel": "releasekanaal",
|
||||
"releaseChannel_description": "kies tussen stabiele releases of beta-releases voor automatische updates",
|
||||
"disableLibraryUpdateOnStartup": "niet controleren op nieuwe versies bij het opstarten",
|
||||
"discordApplicationId_description": "de applicatie-id voor {{discord}} rich presence (standaard is {{defaultId}})",
|
||||
"hotkey_listPlayNow": "nu in lijst spelen",
|
||||
"hotkey_navigateHome": "navigeer naar startpagina",
|
||||
"hotkey_playbackNext": "volgend nummer",
|
||||
"hotkey_playbackPause": "pauzeren",
|
||||
"hotkey_playbackPlay": "afspelen",
|
||||
"hotkey_playbackPlayPause": "afspelen / pauzeren",
|
||||
"hotkey_playbackPrevious": "vorig nummer",
|
||||
"hotkey_playbackStop": "stoppen",
|
||||
"hotkey_rate0": "wis beoordeling",
|
||||
"hotkey_rate1": "beoordeel 1 ster",
|
||||
"hotkey_rate2": "beoordeel 2 sterren",
|
||||
"hotkey_rate3": "beoordeel 3 sterren",
|
||||
"hotkey_skipBackward": "spring terug",
|
||||
"hotkey_skipForward": "spring vooruit",
|
||||
"hotkey_toggleCurrentSongFavorite": "schakel favorietstatus $t(common.currentSong)",
|
||||
"hotkey_toggleFullScreenPlayer": "schakel afspelen in volledig scherm",
|
||||
"hotkey_togglePreviousSongFavorite": "schakel favorietstatus $t(common.previousSong)",
|
||||
"hotkey_toggleQueue": "schakel wachtrij",
|
||||
"hotkey_toggleRepeat": "schakel herhalen",
|
||||
"hotkey_toggleShuffle": "schakel willekeurig afspelen",
|
||||
"hotkey_unfavoriteCurrentSong": "verwijder $t(common.currentSong) uit favorieten",
|
||||
"hotkey_unfavoritePreviousSong": "verwijder $t(common.previousSong) uit favorieten",
|
||||
"hotkey_volumeDown": "volume omlaag",
|
||||
"hotkey_volumeMute": "volume dempen",
|
||||
"hotkey_volumeUp": "volume omhoog",
|
||||
"hotkey_zoomIn": "inzoomen",
|
||||
"hotkey_zoomOut": "uitzoomen",
|
||||
"imageAspectRatio": "gebruik originele verhoudingen van albumhoes",
|
||||
"imageAspectRatio_description": "toon albumhoes in de originele verhoudingen, indien ingeschakeld. bij albumhoezen die geen 1:1-verhouding hebben zal de overige ruimte leeg blijven",
|
||||
"language": "taal",
|
||||
"language_description": "stel de taal voor applicatie in ($t(common.restartRequired))",
|
||||
"lastfm_description": "toon links naar Last.fm op artiest- en albumpagina's",
|
||||
"lastfm": "toon Last.fm-links",
|
||||
"lastfmApiKey_description": "de API-sleutel voor {{lastfm}}. vereist voor albumhoezen",
|
||||
"lastfmApiKey": "{{lastfm}}-API-sleutel",
|
||||
"lyricFetch_description": "bevraag verschillende bronnen op het internet voor songteksten",
|
||||
"lyricFetch": "haal songteksten op van het internet",
|
||||
"lyricFetchProvider_description": "kies de diensten die geraadpleegd worden voor songteksten. de volgorde van de diensten is tevens de volgorde waarop deze worden geraadpleegd",
|
||||
"lyricFetchProvider": "diensten voor songteksten",
|
||||
"lyricOffset_description": "compenseer de songtekst met het gegeven aantal milliseconden",
|
||||
"lyricOffset": "compensatie songtekst (ms)",
|
||||
"logLevel": "logniveau",
|
||||
"logLevel_description": "het laagste logniveau dat wordt getoond. debug toont alle logs, error toont enkel foutmeldingen",
|
||||
"logLevel_optionDebug": "debug",
|
||||
"logLevel_optionError": "fouten",
|
||||
"logLevel_optionInfo": "informatief",
|
||||
"logLevel_optionWarn": "waarschuwingen",
|
||||
"minimizeToTray_description": "minimaliseer de applicatie naar het systeemvak",
|
||||
"minimizeToTray": "minimaliseer naar systeemvak",
|
||||
"minimumScrobblePercentage_description": "het minimumpercentage dat van een nummer gespeeld om worden om deze te scrobblen",
|
||||
"minimumScrobblePercentage": "minimale duur voor scrobblen (percentage)",
|
||||
"minimumScrobbleSeconds_description": "de minimale duur in seconden dat van een nummer gespeeld moet zijn om deze te scrobblen",
|
||||
"minimumScrobbleSeconds": "minimale duur voor scrobblen (seconden)",
|
||||
"mpvExecutablePath_description": "bepaal het pad naar het uitvoerbare bestand van mpv. indien leeg wordt het standaard pad gebruikt",
|
||||
"showRatings": "toon beoordelingssterren",
|
||||
"showVisualizerInSidebar_description": "een paneel met de visualiseerder wordt aan de zijbalk toegevoegd",
|
||||
"showVisualizerInSidebar": "toon visualiseerder in zijbalk",
|
||||
"combinedLyricsAndVisualizer_description": "combineer songtekst en visualiseerder in hetzelfde paneel",
|
||||
"combinedLyricsAndVisualizer": "combineer songtekst en visualseerder in zijbalk",
|
||||
"preservePitch_description": "behoud toonhoogte bij het aanpassen van de afspeelsnelheid",
|
||||
"preservePitch": "behoud toonhoogte",
|
||||
"audioFadeOnStatusChange": "audio faseert uit bij statuswijziging",
|
||||
"audioFadeOnStatusChange_description": "past in- en uitfasering toe als de afspeelstatus verandert",
|
||||
"preventSleepOnPlayback_description": "voorkom slaapstand van het scherm als muziek afspeelt",
|
||||
"preventSleepOnPlayback": "voorkom slaapstand bij afspelen",
|
||||
"remotePassword_description": "bepaal het wachtwoord voor de externe-bedieningserver. Deze gegevens worden standaard onveilig verstuurd, dus gebruik bij voorkeur een uniek wachtwoord waar je niet om geeft",
|
||||
"remotePassword": "wachtwoord van externe-bedieningserver",
|
||||
"remotePort_description": "bepaal de poort voor de externe-bedieningserver",
|
||||
"remotePort": "poort van externe-bedieningserver",
|
||||
"remoteUsername": "gebruikersnaam van externe-bedieningserver",
|
||||
"remoteUsername_description": "bepaal de gebruikersnaam voor de externe-bedieningserver. Als zowel gebruikersnaam als wachtwoord leeg is wordt geen authenticatie toegepast",
|
||||
"replayGainClipping_description": "Voorkom clipping veroorzaakt door {{ReplayGain}} door automatisch het niveau te verlagen",
|
||||
"replayGainClipping": "{{ReplayGain}}-clipping",
|
||||
"replayGainFallback_description": "niveau in dB dat wordt toegepast als het bestand geen {{ReplayGain}}-tags bevat",
|
||||
"replayGainFallback": "{{ReplayGain}}-terugval",
|
||||
"replayGainMode_description": "pas het volumeniveau aan volgens {{ReplayGain}}-waarden opgeslagen in de metadata van het bestand",
|
||||
"replayGainMode": "{{ReplayGain}}-modus",
|
||||
"replayGainPreamp_description": "pas het voorverstekerniveau aan dat wordt toegepast op {{ReplayGain}}-waarden",
|
||||
"replayGainPreamp": "{{ReplayGain}}-voorversterker (dB)",
|
||||
"discordApplicationId": "{{discord}}-applicatie-id",
|
||||
"discordDisplayType_artistname": "artiestnamen",
|
||||
"discordDisplayType_description": "verandert waar je naar luistert in je status",
|
||||
"discordDisplayType_songname": "liednaam",
|
||||
"discordDisplayType": "weergavesoort {{discord}}-aanwezigheid",
|
||||
"discordIdleStatus_description": "Werk de status bij als de speler inactief is",
|
||||
"discordIdleStatus": "toon inactiviteit in rich presence",
|
||||
"discordRichPresence_description": "toon afspeelstatus in {{discord}} rich presence. Afbeeldingssleutelwoorden zijn {{icon}}, {{playing}} en {{paused}}",
|
||||
"discordServeImage": "deel afbeeldingen van de server met {{discord}}",
|
||||
"discordServeImage_description": "deel albumhoezen voor {{discord}} rich presence vanaf de server zelf. enkel beschikbaar voor Jellyfin en Navidrome. {{discord}} gebruikt een bot om afbeeldingen op te vragen, dus moet je server publiek toegankelijk zijn",
|
||||
"discordUpdateInterval": "verversinterval voor {{discord}} rich presence",
|
||||
"discordUpdateInterval_description": "de interval in seconden tussen elke update (minimaal 15 seconden)",
|
||||
"enableAutoTranslation_description": "schakel automatische vertaling in na het laden van songteksten",
|
||||
"enableAutoTranslation": "automatisch vertalen inschakelen",
|
||||
"enableRemote_description": "sta toe dat andere apparaten de applicatie kunnen bedienen via de externe-bedieningserver",
|
||||
"enableRemote": "externe-bedieningserver inschakelen",
|
||||
"followCurrentSong_description": "scroll de wachtrij automatisch naar het nummer dat momenteel wordt afgespeeld",
|
||||
"followCurrentSong": "volg actieve nummer",
|
||||
"homeConfiguration_description": "configureer welke items in welke volgorde getoond worden op de thuispagina",
|
||||
"homeConfiguration": "configuratie thuispagina",
|
||||
"homeFeature_description": "of de uitgelicht-carrousel op de thuispagina wordt getoond",
|
||||
"homeFeature": "uitgelicht-carrousel thuispagina",
|
||||
"hotkey_browserBack": "browser terug",
|
||||
"hotkey_browserForward": "browser vooruit",
|
||||
"hotkey_favoriteCurrentSong": "maak $t(common.currentSong) favoriet",
|
||||
"hotkey_favoritePreviousSong": "maak $t(common.previousSong) favoriet",
|
||||
"hotkey_globalSearch": "globaal zoeken",
|
||||
"hotkey_localSearch": "zoeken op pagina",
|
||||
"hotkey_listNavigateToPage": "navigeer naar lijst-item",
|
||||
"hotkey_listPlayDefault": "speel in lijst",
|
||||
"hotkey_listPlayLast": "speel laatste in lijst",
|
||||
"hotkey_listPlayNext": "speel volgende in lijst",
|
||||
"mpvExecutablePath": "pad uitvoerbaar bestand mpv",
|
||||
"mpvExtraParameters": "aanvullende parameters mpv",
|
||||
"mpvExtraParameters_description": "aanvullende parameters die aan mpv worden meegegeven",
|
||||
"mpvExtraParameters_help": "één per regel",
|
||||
"musicbrainz_description": "toon links naar MusicBrainz op artiest- en albumpagina's, als een MusicBrainz-ID aanwezig is",
|
||||
"musicbrainz": "toon MusicBrainz-links",
|
||||
"neteaseTranslation_description": "Haalt songteksten van NetEase op en toont deze, indien beschikbaar",
|
||||
"neteaseTranslation": "Gebruikt vertalingen van NetEase",
|
||||
"notify": "Nummerwisselnotificaties",
|
||||
"notify_description": "Toont een notificatie als het actieve nummer wisselt",
|
||||
"pathReplace": "bestandspadvervanging",
|
||||
"pathReplace_description": "vervang het standaard bestandspad van je server",
|
||||
"pathReplace_optionRemovePrefix": "verwijder voorvoegsel",
|
||||
"pathReplace_optionAddPrefix": "voeg voorvoegsel toe",
|
||||
"passwordStore_description": "welke wachtwoord- of secret-store gebruikt moet worden. wijzig dit als je problemen ervaart bij het opslaan van wachtwoorden",
|
||||
"passwordStore": "wachtwoord- / secret-store",
|
||||
"playerFilters": "Filter nummers uit de wachtrij",
|
||||
"playerFilters_description": "Voorkom dat nummers aan de wachtrij worden toegevoegd op basis van de volgende criteria",
|
||||
"playbackStyle_description": "kies de afspeelstijl om te gebruiken in de audiospeler",
|
||||
"playbackStyle_optionCrossFade": "crossfade",
|
||||
"playbackStyle_optionNormal": "normaal",
|
||||
"playbackStyle": "afspeelstijl",
|
||||
"playButtonBehavior_description": "het standaardgedrag van de afspelen-knop bij het toevoegen van nummers aan de wachtrij",
|
||||
"playButtonBehavior": "gedrag afspelen-knop",
|
||||
"artistRadioCount_description": "het aantal nummers dat moet worden opgehaald voor artiest- en nummer-radio",
|
||||
"artistRadioCount": "aantal nummers artiest- / nummer-radio",
|
||||
"imageResolution": "afbeeldingsgrootte",
|
||||
"imageResolution_description": "de afmetingen van de afbeeldingen die gebruikt worden in de app. door 0 op te geven worden de originele afmetingen gebruikt",
|
||||
"imageResolution_optionTable": "tabel",
|
||||
"imageResolution_optionItemCard": "item-kaart",
|
||||
"imageResolution_optionSidebar": "zijbalk",
|
||||
"imageResolution_optionHeader": "kop",
|
||||
"imageResolution_optionFullScreenPlayer": "schermvullende speler",
|
||||
"playerbarOpenDrawer_description": "open de schermvullende speler door te klikken op de afspeelbalk",
|
||||
"playerbarOpenDrawer": "volledig scherm via afspeelbalk",
|
||||
"playerbarSlider": "voortgangsindicator in afspeelbalk",
|
||||
"playerbarSlider_description": "golfvorm wordt afgeraden op een trage verbinding of bij een datalimiet",
|
||||
"playerbarSliderType_optionSlider": "voortgangsindicator",
|
||||
"playerbarSliderType_optionWaveform": "golfvorm",
|
||||
"playerbarWaveformAlign": "uitlijning golfvorm",
|
||||
"playerbarWaveformAlign_optionTop": "boven",
|
||||
"playerbarWaveformAlign_optionCenter": "midden",
|
||||
"playerbarWaveformAlign_optionBottom": "onder",
|
||||
"playerbarWaveformBarWidth": "breedte golfvormbalk",
|
||||
"playerbarWaveformGap": "tussenruimte golfvorm",
|
||||
"playerbarWaveformRadius": "straal golfvorm",
|
||||
"preferLocalLyrics_description": "geef de voorkeur aan lokale songteksten indien beschikbaar",
|
||||
"preferLocalLyrics": "prefereer lokale songteksten",
|
||||
"showLyricsInSidebar_description": "er zal een paneel worden toegevoegd aan de wachtrij waarin songteksten worden getoond",
|
||||
"showLyricsInSidebar": "toon songteksten in zijbalk",
|
||||
"showRatings_description": "toont beoordelingssterren in de interface",
|
||||
"sampleRate": "bemonsteringsfrequentie",
|
||||
"sampleRate_description": "de bemonsteringsfrequentie die wordt gebruikt als de gekozen bemonsteringsfrequentie afwijkt van die van de actieve media. bij een waarde lager dan 8000 wordt de standaard frequentie gebruikt",
|
||||
"savePlayQueue_description": "sla de wachtij op bij het afsluiten van de applicatie en herstel deze als de applicatie wordt geopend",
|
||||
"savePlayQueue": "sla wachtrij op",
|
||||
"scrobble_description": "scrobblet afgespeelde nummers naar de mediaserver",
|
||||
"scrobble": "scrobblen",
|
||||
"showSkipButton_description": "toont of verstopt de spoelknoppen op de afspeelbalk",
|
||||
"showSkipButton": "toon spoelknoppen",
|
||||
"showSkipButtons_description": "toont of verstopt de spoelknoppen op de afspeelbalk",
|
||||
"showSkipButtons": "toon spoelknoppen",
|
||||
"sidebarCollapsedNavigation_description": "toon of verstop de navigatie in de ingeklapte zijbalk",
|
||||
"sidebarCollapsedNavigation": "zijbalknavigatie (ingeklapt)",
|
||||
"sidebarConfiguration_description": "kies de items en hun volgorde voor in de zijbalk",
|
||||
"sidebarConfiguration": "configuratie zijbalk",
|
||||
"sidebarPlaylistList_description": "toon of verstop afspeellijsten in de zijbalk",
|
||||
"sidebarPlaylistList": "afspeellijsten zijbalk",
|
||||
"sidePlayQueueStyle_description": "de stijl van de wachtrij aan de zijkant",
|
||||
"sidePlayQueueStyle_optionAttached": "aangekoppeld",
|
||||
"sidePlayQueueStyle_optionDetached": "afgekoppeld"
|
||||
},
|
||||
"form": {
|
||||
"addServer": {
|
||||
@@ -495,28 +776,31 @@
|
||||
"ignoreCors": "negeer cors $t(common.restartRequired)",
|
||||
"error_savePassword": "er is iets mis gegaan met het opslaan van het wachtwoord",
|
||||
"input_preferInstantMix": "verkies directe mix",
|
||||
"input_preferInstantMixDescription": "gebruik alleen instant mix om vergelijkbare nummer te krijgen. handig wanneer je plugins hebt die dit gedrag aanpassen"
|
||||
"input_preferInstantMixDescription": "gebruik alleen instant mix om vergelijkbare nummer te krijgen. handig wanneer je plugins hebt die dit gedrag aanpassen",
|
||||
"input_preferRemoteUrl": "geef voorkeur aan openbare url",
|
||||
"input_remoteUrl": "publieke url",
|
||||
"input_remoteUrlPlaceholder": "optioneel: publieke url voor externe mogelijkheden"
|
||||
},
|
||||
"deletePlaylist": {
|
||||
"title": "verwijder $t(entity.playlist_one)",
|
||||
"success": "$t(entity.playlist_one) succesvol verwijdert",
|
||||
"input_confirm": "Typ de naam van $t(entity.playlist_one) om te bevestigen"
|
||||
"title": "verwijder $t(entity.playlist, {\"count\": 1})",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) succesvol verwijdert",
|
||||
"input_confirm": "Typ de naam van $t(entity.playlist, {\"count\": 1}) om te bevestigen"
|
||||
},
|
||||
"createPlaylist": {
|
||||
"input_description": "$t(common.description)",
|
||||
"title": "$t(entity.playlist_one) aanmaken",
|
||||
"title": "$t(entity.playlist, {\"count\": 1}) aanmaken",
|
||||
"input_public": "publiek",
|
||||
"input_name": "$t(common.name)",
|
||||
"success": "$t(entity.playlist_one) aangemaakt",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) aangemaakt",
|
||||
"input_owner": "$t(common.owner)"
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"success": "$t(entity.trackWithCount, {\"count\": {{message}} }) aan $t(entity.trackWithCount, {\"count\": {{message}} }) toegevoegd",
|
||||
"title": "aan $t(entity.playlist_one) toevoegen",
|
||||
"title": "aan $t(entity.playlist, {\"count\": 1}) toevoegen",
|
||||
"input_skipDuplicates": "duplicaten overslaan",
|
||||
"input_playlists": "$t(entity.playlist_other)",
|
||||
"create": "maak $t(entity.playlist_one) {{playlist}}",
|
||||
"searchOrCreate": "zoek $t(entity.playlist_other) of typ om een nieuwe te maken"
|
||||
"input_playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"create": "maak $t(entity.playlist, {\"count\": 1}) {{playlist}}",
|
||||
"searchOrCreate": "zoek $t(entity.playlist, {\"count\": 2}) of typ om een nieuwe te maken"
|
||||
},
|
||||
"queryEditor": {
|
||||
"input_optionMatchAll": "alles matchen",
|
||||
@@ -529,13 +813,14 @@
|
||||
},
|
||||
"lyricSearch": {
|
||||
"input_name": "$t(common.name)",
|
||||
"input_artist": "$t(entity.artist_one)",
|
||||
"input_artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"title": "tekst zoeken"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"title": "$t(entity.playlist_one) aanpassen",
|
||||
"title": "$t(entity.playlist, {\"count\": 1}) aanpassen",
|
||||
"publicJellyfinNote": "Jellyfin laat niet weten of een playlist publiek of privaat is. Als u wilt dat dit publiek blijft, selecteer de volgende invoer",
|
||||
"success": "$t(entity.playlist_one) succesvol geüpdatet"
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) succesvol geüpdatet",
|
||||
"editNote": "Handmatige bewerking wordt afgeraden voor grote afspeellijsten. Weet je zeker dat je het risico op dataverlies wilt accepteren door de bestaande afspeellijst te overschrijven?"
|
||||
},
|
||||
"updateServer": {
|
||||
"title": "update server",
|
||||
@@ -560,7 +845,7 @@
|
||||
},
|
||||
"shuffleAll": {
|
||||
"title": "willekeurig afspelen",
|
||||
"input_genre": "$t(entity.genre_one)",
|
||||
"input_genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"input_limit": "hoeveel nummers?",
|
||||
"input_minYear": "van jaar",
|
||||
"input_maxYear": "naar jaar",
|
||||
@@ -568,13 +853,28 @@
|
||||
"input_played_optionAll": "alle nummers",
|
||||
"input_played_optionUnplayed": "alleen ongespeelde nummers",
|
||||
"input_played_optionPlayed": "alleen gespeelde nummers"
|
||||
},
|
||||
"createRadioStation": {
|
||||
"success": "radiostation succesvol aangemaakt",
|
||||
"title": "radiostation aanmaken",
|
||||
"input_homepageUrl": "thuispagina-url",
|
||||
"input_name": "naam",
|
||||
"input_streamUrl": "stream-url"
|
||||
},
|
||||
"lyricsExport": {
|
||||
"export": "exporteer songtekst",
|
||||
"input_synced": "exporteer gesynchroniseerde songtekst",
|
||||
"input_offset": "$t(setting.lyricOffset)"
|
||||
},
|
||||
"saveQueue": {
|
||||
"success": "wachtrij opgeslagen op server"
|
||||
}
|
||||
},
|
||||
"player": {
|
||||
"addLast": "achteraan toevoegen",
|
||||
"addNext": "als volgende toevoegen",
|
||||
"addLastShuffled": "als laatste toevoegen (geschud)",
|
||||
"addNextShuffled": "als volgende toevoegen (geschud)",
|
||||
"addLast": "achteraan",
|
||||
"addNext": "volgende",
|
||||
"addLastShuffled": "als laatste toevoegen (willekeurig)",
|
||||
"addNextShuffled": "als volgende toevoegen (willekeurig)",
|
||||
"favorite": "favoriet",
|
||||
"mute": "dempen",
|
||||
"muted": "gedempt",
|
||||
@@ -589,6 +889,80 @@
|
||||
"previous": "vorige",
|
||||
"queue_clear": "wachtrij wissen",
|
||||
"queue_moveToBottom": "verplaats geselecteerde naar boven",
|
||||
"queue_moveToTop": "verplaats geselecteerde naar beneden"
|
||||
"queue_moveToTop": "verplaats geselecteerde naar beneden",
|
||||
"artistRadio": "artiestenradio",
|
||||
"holdToShuffle": "vasthouden om willekeurig af te spelen",
|
||||
"lyrics": "songtekst",
|
||||
"queue_remove": "verwijder geselecteerde",
|
||||
"repeat": "herhalen",
|
||||
"repeat_all": "alles herhalen",
|
||||
"repeat_off": "herhalen uitgeschakeld",
|
||||
"restoreQueueFromServer": "herstel wachtrij van server",
|
||||
"saveQueueToServer": "sla wachtrij op server op",
|
||||
"shuffle": "afspelen (willekeurig)",
|
||||
"shuffle_off": "willekeurig afspelen uitgeschakeld",
|
||||
"skip": "overslaan",
|
||||
"skip_back": "spring terug",
|
||||
"skip_forward": "spring vooruit",
|
||||
"stop": "stoppen",
|
||||
"toggleFullscreenPlayer": "schakel speler in volledig scherm",
|
||||
"trackRadio": "nummerradio",
|
||||
"unfavorite": "verwijder favoriet",
|
||||
"pause": "pauzeren",
|
||||
"viewQueue": "toon wachtrij"
|
||||
},
|
||||
"datetime": {
|
||||
"minuteShort": "m",
|
||||
"secondShort": "s",
|
||||
"hourShort": "h",
|
||||
"dayShort": "d"
|
||||
},
|
||||
"filterOperator": {
|
||||
"afterDate": "is na (datum)",
|
||||
"before": "is voor",
|
||||
"beforeDate": "is vóór (datum)",
|
||||
"contains": "bevat",
|
||||
"endsWith": "eindigt met",
|
||||
"inPlaylist": "is in",
|
||||
"inTheLast": "is in de laatste",
|
||||
"inTheRange": "ligt binnen het bereik",
|
||||
"inTheRangeDate": "ligt binnen het bereik (datum)",
|
||||
"is": "is",
|
||||
"isNot": "is niet",
|
||||
"isGreaterThan": "is groter dan",
|
||||
"isLessThan": "is minder dan",
|
||||
"matchesRegex": "komt overeen met regex",
|
||||
"notContains": "bevat geen",
|
||||
"notInPlaylist": "is niet in",
|
||||
"notInTheLast": "is niet in de laatste",
|
||||
"startsWith": "begint met",
|
||||
"after": "is na"
|
||||
},
|
||||
"queryBuilder": {
|
||||
"standardTags": "standaard tags",
|
||||
"customTags": "aangepaste tags"
|
||||
},
|
||||
"releaseType": {
|
||||
"primary": {
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"broadcast": "uitzending",
|
||||
"ep": "ep",
|
||||
"other": "overig",
|
||||
"single": "single"
|
||||
},
|
||||
"secondary": {
|
||||
"audiobook": "luisterboek",
|
||||
"audioDrama": "luisterdrama",
|
||||
"compilation": "compilatie",
|
||||
"djMix": "dj-mix",
|
||||
"demo": "demo",
|
||||
"fieldRecording": "veldopname",
|
||||
"interview": "interview",
|
||||
"live": "live",
|
||||
"mixtape": "mixtape",
|
||||
"remix": "remix",
|
||||
"soundtrack": "soundtrack",
|
||||
"spokenWord": "gesproken woord"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,20 +1,20 @@
|
||||
{
|
||||
"action": {
|
||||
"editPlaylist": "edytuj $t(entity.playlist_one)",
|
||||
"editPlaylist": "edytuj $t(entity.playlist, {\"count\": 1})",
|
||||
"goToPage": "idź do strony",
|
||||
"clearQueue": "wyczyść kolejkę",
|
||||
"addToFavorites": "dodaj do $t(entity.favorite_other)",
|
||||
"removeFromPlaylist": "usuń z $t(entity.playlist_one)",
|
||||
"viewPlaylists": "zobacz $t(entity.playlist_other)",
|
||||
"addToFavorites": "dodaj do $t(entity.favorite, {\"count\": 2})",
|
||||
"removeFromPlaylist": "usuń z $t(entity.playlist, {\"count\": 1})",
|
||||
"viewPlaylists": "zobacz $t(entity.playlist, {\"count\": 2})",
|
||||
"refresh": "$t(common.refresh)",
|
||||
"removeFromQueue": "usuń z kolejki",
|
||||
"deselectAll": "odznacz wszystko",
|
||||
"toggleSmartPlaylistEditor": "przełącz edytor $t(entity.smartPlaylist)",
|
||||
"removeFromFavorites": "usuń z $t(entity.favorite_other)",
|
||||
"removeFromFavorites": "usuń z $t(entity.favorite, {\"count\": 2})",
|
||||
"moveToTop": "przesuń na górę",
|
||||
"addToPlaylist": "dodaj do $t(entity.playlist_one)",
|
||||
"createPlaylist": "utwórz $t(entity.playlist_one)",
|
||||
"deletePlaylist": "usuń $t(entity.playlist_one)",
|
||||
"addToPlaylist": "dodaj do $t(entity.playlist, {\"count\": 1})",
|
||||
"createPlaylist": "utwórz $t(entity.playlist, {\"count\": 1})",
|
||||
"deletePlaylist": "usuń $t(entity.playlist, {\"count\": 1})",
|
||||
"moveToBottom": "przesuń na dół",
|
||||
"setRating": "oceń",
|
||||
"openIn": {
|
||||
@@ -32,8 +32,12 @@
|
||||
"moveDown": "przenieś niżej",
|
||||
"holdToMoveToTop": "przytrzymaj aby, przesunąć na górę",
|
||||
"holdToMoveToBottom": "przytrzymaj aby, przesunąć na dół",
|
||||
"createRadioStation": "utwórz $t(entity.radioStation_one)",
|
||||
"deleteRadioStation": "usuń $t(entity.radioStation_one)"
|
||||
"createRadioStation": "utwórz $t(entity.radioStation, {\"count\": 1})",
|
||||
"deleteRadioStation": "usuń $t(entity.radioStation, {\"count\": 1})",
|
||||
"addOrRemoveFromSelection": "dodaj lub usuń z wyboru",
|
||||
"selectRangeOfItems": "wybierz zakres elementów",
|
||||
"selectAll": "wybierz wszystkie",
|
||||
"openApplicationDirectory": "otwórz katalog aplikacji"
|
||||
},
|
||||
"common": {
|
||||
"increase": "zwiększ",
|
||||
@@ -69,7 +73,9 @@
|
||||
"delete": "usuń",
|
||||
"cancel": "anuluj",
|
||||
"forceRestartRequired": "zrestartuj aby zastosować zmiany... zamknij powiadomienie aby zrestartować",
|
||||
"setting": "ustawienie",
|
||||
"setting_one": "ustawienia",
|
||||
"setting_few": "",
|
||||
"setting_many": "",
|
||||
"version": "wersja",
|
||||
"title": "tytuł",
|
||||
"filter_one": "filtr",
|
||||
@@ -96,7 +102,7 @@
|
||||
"none": "żaden",
|
||||
"menu": "menu",
|
||||
"restartRequired": "wymagany restart",
|
||||
"previousSong": "poprzedni $t(entity.track_one)",
|
||||
"previousSong": "poprzedni $t(entity.track, {\"count\": 1})",
|
||||
"noResultsFromQuery": "kolejka zwróciła brak wyników",
|
||||
"quit": "wyjdź",
|
||||
"expand": "rozszerz",
|
||||
@@ -109,7 +115,7 @@
|
||||
"biography": "biografia",
|
||||
"backward": "wstecz",
|
||||
"left": "lewo",
|
||||
"currentSong": "obecnie $t(entity.track_one)",
|
||||
"currentSong": "obecnie $t(entity.track, {\"count\": 1})",
|
||||
"collapse": "zwiń",
|
||||
"gap": "luka",
|
||||
"manage": "zarządzaj",
|
||||
@@ -150,49 +156,56 @@
|
||||
"tableColumns": "tabela kolumn",
|
||||
"itemsMore": "{{count}} więcej",
|
||||
"noFilters": "nie skonfigurowano filtrów",
|
||||
"view": "wyświetl"
|
||||
"view": "wyświetl",
|
||||
"countSelected": "wybrano {{count}}",
|
||||
"retry": "spróbuj ponownie",
|
||||
"mood": "nastrój",
|
||||
"example": "przykład",
|
||||
"filter_multiple": "multi",
|
||||
"filter_single": "single",
|
||||
"rename": "zmień nazwę"
|
||||
},
|
||||
"entity": {
|
||||
"genre_one": "gatunek",
|
||||
"genre_few": "gatunki",
|
||||
"genre_many": "gatunków",
|
||||
"artist_one": "wykonawca",
|
||||
"artist_few": "wykonawców",
|
||||
"artist_many": "wykonawców",
|
||||
"albumArtist_one": "wykonawca albumu",
|
||||
"albumArtist_few": "wykonawców albumów",
|
||||
"albumArtist_many": "wykonawców albumów",
|
||||
"albumWithCount_one": "{{count}} album",
|
||||
"albumWithCount_few": "{{count}} albumy",
|
||||
"albumWithCount_many": "{{count}} albumów",
|
||||
"favorite_one": "ulubiony",
|
||||
"favorite_few": "ulubione",
|
||||
"favorite_many": "ulubione",
|
||||
"artistWithCount_one": "{{count}} wykonawca",
|
||||
"artistWithCount_few": "{{count}} wykonawców",
|
||||
"artistWithCount_many": "{{count}} wykonawców",
|
||||
"folder_one": "katalog",
|
||||
"folder_few": "katalogi",
|
||||
"folder_many": "katalogów",
|
||||
"album_one": "album",
|
||||
"album_few": "albumy",
|
||||
"album_many": "albumów",
|
||||
"playlistWithCount_one": "{{count}} playlista",
|
||||
"playlistWithCount_few": "{{count}} playlisty",
|
||||
"playlistWithCount_many": "{{count}} playlist",
|
||||
"playlist_one": "playlista",
|
||||
"playlist_few": "playlisty",
|
||||
"playlist_many": "playlist",
|
||||
"artist_one": "wykonawca",
|
||||
"artist_few": "wykonawców",
|
||||
"artist_many": "wykonawców",
|
||||
"folderWithCount_one": "{{count}} katalog",
|
||||
"folderWithCount_few": "{{count}} katalogi",
|
||||
"folderWithCount_many": "{{count}} katalogów",
|
||||
"albumArtist_one": "wykonawca albumu",
|
||||
"albumArtist_few": "wykonawcy albumu",
|
||||
"albumArtist_many": "wykonawców albumu",
|
||||
"track_one": "utwór",
|
||||
"track_few": "utwory",
|
||||
"track_many": "utworów",
|
||||
"albumArtistCount_one": "{{count}} wykonawca albumu",
|
||||
"albumArtistCount_few": "{{count}} wykonawców albumu",
|
||||
"albumArtistCount_many": "{{count}} wykonawców albumu",
|
||||
"smartPlaylist": "inteligentna $t(entity.playlist_one)",
|
||||
"albumWithCount_one": "{{count}} album",
|
||||
"albumWithCount_few": "{{count}} albumy",
|
||||
"albumWithCount_many": "{{count}} albumów",
|
||||
"favorite_one": "ulubiony",
|
||||
"favorite_few": "ulubione",
|
||||
"favorite_many": "ulubionych",
|
||||
"artistWithCount_one": "{{count}} wykonawca",
|
||||
"artistWithCount_few": "{{count}} wykonawców",
|
||||
"artistWithCount_many": "{{count}} wykonawców",
|
||||
"folder_one": "katalog",
|
||||
"folder_few": "katalogi",
|
||||
"folder_many": "katalogów",
|
||||
"smartPlaylist": "inteligentna $t(entity.playlist, {\"count\": 1})",
|
||||
"album_one": "album",
|
||||
"album_few": "albumy",
|
||||
"album_many": "albumów",
|
||||
"genreWithCount_one": "{{count}} gatunek",
|
||||
"genreWithCount_few": "{{count}} gatunki",
|
||||
"genreWithCount_many": "{{count}} gatunków",
|
||||
@@ -204,12 +217,12 @@
|
||||
"play_many": "{{count}} odtworzeń",
|
||||
"song_one": "piosenka",
|
||||
"song_few": "piosenki",
|
||||
"song_many": "piosenek",
|
||||
"song_many": "piosenek",
|
||||
"radioStation_one": "stacja radiowa",
|
||||
"radioStation_few": "stacje radiowe",
|
||||
"radioStation_many": "stacji radiowych",
|
||||
"radioStationWithCount_one": "{{count}} stacja radiowa",
|
||||
"radioStationWithCount_few": "{{count}} stacje radiowe",
|
||||
"radioStationWithCount_few": "{{count}} stacje radiowych",
|
||||
"radioStationWithCount_many": "{{count}} stacji radiowych"
|
||||
},
|
||||
"error": {
|
||||
@@ -238,7 +251,10 @@
|
||||
"badValue": "niewłaściwa opcja \"{{value}}\". ta wartość już nie istnieje",
|
||||
"notificationDenied": "odmówiono uprawnień dla powiadomień. to ustawienie nie będzie miało efektu",
|
||||
"multipleServerSaveQueueError": "kolejka odtwarzania ma jedną lub więcej piosenek które nie pochodzą z aktualnego serwera. to nie jest wspierane",
|
||||
"saveQueueFailed": "nie udało się zapisać kolejki"
|
||||
"saveQueueFailed": "nie udało się zapisać kolejki",
|
||||
"settingsSyncError": "zostały znalezione różnice pomiędzy ustawieniami w rendererze a głównym procesem. uruchom aplikację ponownie aby, zastosować zmiany",
|
||||
"noNetwork": "serwer niedostępny",
|
||||
"noNetworkDescription": "nie udało się połączyć z tym serwerem"
|
||||
},
|
||||
"filter": {
|
||||
"mostPlayed": "najczęściej odtwarzane",
|
||||
@@ -258,7 +274,7 @@
|
||||
"communityRating": "ocena społeczności",
|
||||
"path": "ścieżka",
|
||||
"favorited": "ulubione",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"isRecentlyPlayed": "było niedawno odtwarzane",
|
||||
"isFavorited": "jest ulubione",
|
||||
"bpm": "bpm",
|
||||
@@ -266,7 +282,7 @@
|
||||
"disc": "płyta",
|
||||
"biography": "biografia",
|
||||
"songCount": "liczba utworów",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"duration": "długość",
|
||||
"random": "losowy",
|
||||
"lastPlayed": "ostatnio odtwarzane",
|
||||
@@ -276,27 +292,28 @@
|
||||
"trackNumber": "utwór",
|
||||
"comment": "komentarz",
|
||||
"recentlyUpdated": "ostatnio aktualizowane",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"channels": "$t(common.channel, {\"count\": 2})",
|
||||
"owner": "$t(common.owner)",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"albumCount": "liczba $t(entity.album_other)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"albumCount": "liczba $t(entity.album, {\"count\": 2})",
|
||||
"id": "id",
|
||||
"isPublic": "jest publiczny",
|
||||
"album": "$t(entity.album_one)",
|
||||
"explicitStatus": "$t(common.explicitStatus)"
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"explicitStatus": "$t(common.explicitStatus)",
|
||||
"sortName": "sortowanie po nazwie"
|
||||
},
|
||||
"form": {
|
||||
"deletePlaylist": {
|
||||
"title": "usuń $t(entity.playlist_one)",
|
||||
"success": "$t(entity.playlist_one) usunięto pomyślnie",
|
||||
"input_confirm": "wpisz nazwę $t(entity.playlist_one) aby potwierdzić"
|
||||
"title": "usuń $t(entity.playlist, {\"count\": 1})",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) usunięta pomyślnie",
|
||||
"input_confirm": "wpisz nazwę $t(entity.playlist, {\"count\": 1}) aby potwierdzić"
|
||||
},
|
||||
"createPlaylist": {
|
||||
"input_description": "$t(common.description)",
|
||||
"title": "utwórz $t(entity.playlist_one)",
|
||||
"title": "utwórz $t(entity.playlist, {\"count\": 1})",
|
||||
"input_public": "publiczny",
|
||||
"input_name": "$t(common.name)",
|
||||
"success": "$t(entity.playlist_one) utworzono pomyślnie",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) utworzona pomyślnie",
|
||||
"input_owner": "$t(common.owner)"
|
||||
},
|
||||
"addServer": {
|
||||
@@ -312,15 +329,18 @@
|
||||
"ignoreCors": "zignoruj cors ($t(common.restartRequired))",
|
||||
"error_savePassword": "wystąpił błąd podczas próby zapisania hasła",
|
||||
"input_preferInstantMix": "preferuj natychmiastowy mix",
|
||||
"input_preferInstantMixDescription": "używaj tylko natychmiastowego mixu, by otrzymać podobne piosenki. przydatne gdy masz wtyczki które zmieniają to zachowanie"
|
||||
"input_preferInstantMixDescription": "używaj tylko natychmiastowego mixu, by otrzymać podobne piosenki. przydatne gdy masz wtyczki które zmieniają to zachowanie",
|
||||
"input_preferRemoteUrl": "preferuj publiczny url",
|
||||
"input_remoteUrl": "publiczny url",
|
||||
"input_remoteUrlPlaceholder": "opcjonalne: publiczny url dla funkcji zewnętrznych"
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"success": "dodano $t(entity.trackWithCount, {\"count\": {{message}} }) do $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })",
|
||||
"title": "dodano do $t(entity.playlist_one)",
|
||||
"title": "dodano do $t(entity.playlist, {\"count\": 1})",
|
||||
"input_skipDuplicates": "pomiń duplikaty",
|
||||
"input_playlists": "$t(entity.playlist_other)",
|
||||
"create": "utwórz $t(entity.playlist_one) {{playlist}}",
|
||||
"searchOrCreate": "wyszukaj $t(entity.playlist_other) lub wpisz, aby utworzyć nową"
|
||||
"input_playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"create": "utwórz $t(entity.playlist, {\"count\": 1}) {{playlist}}",
|
||||
"searchOrCreate": "wyszukaj $t(entity.playlist, {\"count\": 2}) lub wpisz, aby utworzyć nową"
|
||||
},
|
||||
"updateServer": {
|
||||
"title": "uaktualnij serwer",
|
||||
@@ -337,12 +357,12 @@
|
||||
},
|
||||
"lyricSearch": {
|
||||
"input_name": "$t(common.name)",
|
||||
"input_artist": "$t(entity.artist_one)",
|
||||
"input_artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"title": "wyszukiwanie tekstów"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"title": "edytuj $t(entity.playlist_one)",
|
||||
"success": "$t(entity.playlist_one) zaktualizowana pomyślnie",
|
||||
"title": "edytuj $t(entity.playlist, {\"count\": 1})",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) zaktualizowana pomyślnie",
|
||||
"publicJellyfinNote": "Z jakiegoś powodu Jellyfin nie udostępnia informacji na temat publiczności playlisty. Jeżeli chcesz, aby ta pozostała publiczna, mniej wybraną poniższą opcję",
|
||||
"editNote": "manualne edytowanie nie jest zalecane dla dużych playlist. czy na pewno zgadzasz się na ryzyko utraty danych wywołane przez nadpisanie istniejącej playlisty?"
|
||||
},
|
||||
@@ -365,7 +385,7 @@
|
||||
},
|
||||
"shuffleAll": {
|
||||
"title": "odtwarzaj losowo",
|
||||
"input_genre": "$t(entity.genre_one)",
|
||||
"input_genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"input_limit": "ile piosenek?",
|
||||
"input_minYear": "z roku",
|
||||
"input_maxYear": "do roku",
|
||||
@@ -383,6 +403,11 @@
|
||||
"input_homepageUrl": "url strony głównej",
|
||||
"input_name": "nazwa",
|
||||
"input_streamUrl": "url strumienia"
|
||||
},
|
||||
"lyricsExport": {
|
||||
"export": "eksportuj tekst",
|
||||
"input_synced": "eksportuj zsynchronizowany tekst",
|
||||
"input_offset": "$t(setting.lyricOffset)"
|
||||
}
|
||||
},
|
||||
"page": {
|
||||
@@ -412,7 +437,7 @@
|
||||
"appMenu": {
|
||||
"selectServer": "wybierz serwer",
|
||||
"version": "wersja {{version}}",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"manageServers": "zarządzaj serwerami",
|
||||
"expandSidebar": "rozwiń pasek boczny",
|
||||
"collapseSidebar": "zwiń pasek boczny",
|
||||
@@ -450,45 +475,46 @@
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"playSimilarSongs": "$t(player.playSimilarSongs)",
|
||||
"moveToNext": "$t(action.moveToNext)",
|
||||
"goToAlbum": "przejdź do $t(entity.album_one)",
|
||||
"goToAlbumArtist": "przejdź do $t(entity.albumArtist_one)",
|
||||
"goToAlbum": "przejdź do $t(entity.album, {\"count\": 1})",
|
||||
"goToAlbumArtist": "przejdź do $t(entity.albumArtist, {\"count\": 1})",
|
||||
"moveItems": "$t(action.moveItems)",
|
||||
"goTo": "przejdź do"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "więcej od $t(entity.artist_one)",
|
||||
"moreFromArtist": "więcej od $t(entity.artist, {\"count\": 1})",
|
||||
"moreFromGeneric": "więcej od {{item}}",
|
||||
"released": "wydany"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
"title": "$t(entity.albumArtist, {\"count\": 2})"
|
||||
},
|
||||
"genreList": {
|
||||
"title": "$t(entity.genre_other)",
|
||||
"showAlbums": "pokaż $t(entity.genre_one) $t(entity.album_other)",
|
||||
"showTracks": "pokaż $t(entity.genre_one) $t(entity.track_other)"
|
||||
"title": "$t(entity.genre, {\"count\": 2})",
|
||||
"showAlbums": "pokaż $t(entity.album, {\"count\": 2}) $t(entity.genre, {\"count\": 1})",
|
||||
"showTracks": "pokaż $t(entity.track, {\"count\": 2}) $t(entity.genre, {\"count\": 1})"
|
||||
},
|
||||
"albumList": {
|
||||
"title": "$t(entity.album_other)",
|
||||
"title": "$t(entity.album, {\"count\": 2})",
|
||||
"artistAlbums": "albumy wykonawcy {{artist}}",
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)"
|
||||
"genreAlbums": "$t(entity.album, {\"count\": 2}) \"{{genre}}\""
|
||||
},
|
||||
"sidebar": {
|
||||
"nowPlaying": "teraz odtwarzane",
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"search": "$t(common.search)",
|
||||
"tracks": "$t(entity.track_other)",
|
||||
"albums": "$t(entity.album_other)",
|
||||
"genres": "$t(entity.genre_other)",
|
||||
"folders": "$t(entity.folder_other)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"tracks": "$t(entity.track, {\"count\": 2})",
|
||||
"albums": "$t(entity.album, {\"count\": 2})",
|
||||
"genres": "$t(entity.genre, {\"count\": 2})",
|
||||
"folders": "$t(entity.folder, {\"count\": 2})",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"home": "$t(common.home)",
|
||||
"artists": "$t(entity.artist_other)",
|
||||
"albumArtists": "$t(entity.albumArtist_other)",
|
||||
"shared": "udostępnione $t(entity.playlist_other)",
|
||||
"artists": "$t(entity.artist, {\"count\": 2})",
|
||||
"albumArtists": "$t(entity.albumArtist, {\"count\": 2})",
|
||||
"shared": "udostępniono $t(entity.playlist, {\"count\": 2})",
|
||||
"myLibrary": "Moja biblioteka",
|
||||
"favorites": "$t(entity.favorite_other)",
|
||||
"radio": "$t(entity.radioStation_other)"
|
||||
"favorites": "$t(entity.favorite, {\"count\": 2})",
|
||||
"radio": "$t(entity.radioStation, {\"count\": 2})",
|
||||
"collections": "kolekcje"
|
||||
},
|
||||
"home": {
|
||||
"mostPlayed": "najczęściej odtwarzane",
|
||||
@@ -497,7 +523,7 @@
|
||||
"explore": "przeglądaj z biblioteki",
|
||||
"recentlyPlayed": "ostatnio odtwarzane",
|
||||
"recentlyReleased": "ostatnio wydane",
|
||||
"genres": "$t(entity.genre_other)"
|
||||
"genres": "$t(entity.genre, {\"count\": 2})"
|
||||
},
|
||||
"setting": {
|
||||
"playbackTab": "odtworzenia",
|
||||
@@ -521,12 +547,13 @@
|
||||
"transcoding": "transkodowanie",
|
||||
"discord": "discord",
|
||||
"playerFilters": "filtry odtwarzacza",
|
||||
"logger": "logger"
|
||||
"logger": "logger",
|
||||
"lyricsDisplay": "wyświetlanie tekstu"
|
||||
},
|
||||
"trackList": {
|
||||
"title": "$t(entity.track_other)",
|
||||
"title": "$t(entity.track, {\"count\": 2})",
|
||||
"artistTracks": "utwory przez {{artist}}",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track_other)"
|
||||
"genreTracks": "$t(entity.track, {\"count\": 2}) \"{{genre}}\""
|
||||
},
|
||||
"globalSearch": {
|
||||
"commands": {
|
||||
@@ -537,7 +564,7 @@
|
||||
"title": "komendy"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist_other)"
|
||||
"title": "$t(entity.playlist, {\"count\": 2})"
|
||||
},
|
||||
"albumArtistDetail": {
|
||||
"topSongs": "popularne utwory",
|
||||
@@ -546,9 +573,11 @@
|
||||
"recentReleases": "ostatnie wydania",
|
||||
"viewAll": "zobacz wszystko",
|
||||
"viewDiscography": "przeglądaj dyskografię",
|
||||
"relatedArtists": "powiązane z $t(entity.artist_other)",
|
||||
"relatedArtists": "powiązane z $t(entity.artist, {\"count\": 2})",
|
||||
"appearsOn": "pojawia się na",
|
||||
"viewAllTracks": "zobacz wszystko $t(entity.track_other)"
|
||||
"viewAllTracks": "zobacz wszystko $t(entity.track, {\"count\": 2})",
|
||||
"groupingTypeAll": "wszystkie typy wydań",
|
||||
"groupingTypePrimary": "główne typy wydań"
|
||||
},
|
||||
"itemDetail": {
|
||||
"copyPath": "kopiuj ścieżkę do schowka",
|
||||
@@ -567,13 +596,21 @@
|
||||
"reorder": "zmiana kolejności jest możliwa tylko podczas sortowania według id"
|
||||
},
|
||||
"favorites": {
|
||||
"title": "$t(entity.favorite_other)"
|
||||
"title": "$t(entity.favorite, {\"count\": 2})"
|
||||
},
|
||||
"folderList": {
|
||||
"title": "$t(entity.folder_other)"
|
||||
"title": "$t(entity.folder, {\"count\": 2})"
|
||||
},
|
||||
"radioList": {
|
||||
"title": "stacje radiowe"
|
||||
},
|
||||
"windowBar": {
|
||||
"paused": "(Wstrzymane) ",
|
||||
"privateMode": "(Tryb prywatny)"
|
||||
},
|
||||
"collections": {
|
||||
"overrideExisting": "nadpisz istniejące",
|
||||
"saveAsCollection": "zapisz jako kolekcję"
|
||||
}
|
||||
},
|
||||
"player": {
|
||||
@@ -610,13 +647,12 @@
|
||||
"playSimilarSongs": "odtwarzaj podobne",
|
||||
"addLastShuffled": "ostatnie (wylosowane)",
|
||||
"addNextShuffled": "następne (wylosowane)",
|
||||
"queueType": "typ kolejki",
|
||||
"queueType_default": "domyślna",
|
||||
"queueType_priority": "priorytetowa",
|
||||
"holdToShuffle": "przytrzymaj aby odtwarzać losowo",
|
||||
"lyrics": "tekst",
|
||||
"restoreQueueFromServer": "przywróć kolejkę z serwera",
|
||||
"saveQueueToServer": "zapisz kolejkę na serwerze"
|
||||
"saveQueueToServer": "zapisz kolejkę na serwerze",
|
||||
"artistRadio": "radio wykonawcy",
|
||||
"trackRadio": "radio utworu"
|
||||
},
|
||||
"setting": {
|
||||
"crossfadeStyle_description": "wybierz styl przenikania, który ma być używany do odtwarzania dźwięku",
|
||||
@@ -682,7 +718,7 @@
|
||||
"applicationHotkeys": "skróty klawiszowe aplikacji",
|
||||
"hotkey_playbackNext": "następny utwór",
|
||||
"lyricFetch_description": "pobierz teksty z rozmaitych źródeł internetowych",
|
||||
"lyricFetchProvider_description": "wybierz dostawców internetowych dla tekstów. zapytania będą wykonywane według podanej kolejności",
|
||||
"lyricFetchProvider_description": "wybierz dostawców od których pobierane będą teksty",
|
||||
"globalMediaHotkeys_description": "włącz lub wyłącz używanie systemowych skrótów klawiszowych do kontroli odtwarzania",
|
||||
"customFontPath": "niestandardowa ścieżka czcionki",
|
||||
"followLyric": "podążaj za tekstem",
|
||||
@@ -738,8 +774,8 @@
|
||||
"scrobble_description": "przekazywanie informacji o odtwarzaniu (scrobbling) do twojego serwera multimediów",
|
||||
"sidePlayQueueStyle": "boczny styl kolejki odtwarzania",
|
||||
"remoteUsername_description": "ustaw nazwę użytkownika dla serwera zdalnej kontroli. Jeśli nazwa użytkownika i hasło są puste, autoryzacja będzie wyłączona",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album_one)",
|
||||
"replayGainMode_optionTrack": "$t(entity.track_one)",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album, {\"count\": 1})",
|
||||
"replayGainMode_optionTrack": "$t(entity.track, {\"count\": 1})",
|
||||
"remotePassword_description": "ustawia hasło dla serwera zdalnego sterowania. Te poświadczenia są domyślnie przesyłane w sposób niezabezpieczony, dlatego należy użyć unikalnego hasła na którym ci nie zależy",
|
||||
"showSkipButtons_description": "pokaż lub ukryj przyciski pomijania na pasku odtwarzacza",
|
||||
"showSkipButton_description": "pokaż lub ukryj przyciski pomijania na pasku odtwarzacza",
|
||||
@@ -779,12 +815,10 @@
|
||||
"clearQueryCache_description": "\"miękkie wyczyszczenie\" feishin. spowoduje to odświeżenie playlist, metadanych utworów i zresetowanie zapisanych tekstów. ustawienia, dane uwierzytelniające serwera i obrazy w pamięci podręcznej zostaną zachowane",
|
||||
"buttonSize_description": "rozmiar przycisków paska odtwarzacza",
|
||||
"clearCache": "wyczyść pamięć podręczną przeglądarki",
|
||||
"playerAlbumArtResolution": "rozdzielczość okładki albumu odtwarzacza",
|
||||
"externalLinks": "pokaż zewnętrzne linki",
|
||||
"mpvExtraParameters_help": "po jednym na linię",
|
||||
"passwordStore": "hasła",
|
||||
"passwordStore_description": "jakie hasło ma być używane. zmień to, jeśli masz problemy z przechowywaniem haseł",
|
||||
"playerAlbumArtResolution_description": "rozdzielczość podglądu okładki albumu w dużym odtwarzaczu. większa sprawia, że wygląda bardziej wyraziście, ale może spowolnić ładowanie. domyślnie 0, czyli auto",
|
||||
"startMinimized": "uruchom zminimalizowany",
|
||||
"startMinimized_description": "uruchom aplikację w zasobniku systemowym",
|
||||
"clearCacheSuccess": "pamięć podręczna została wyczyszczona pomyślnie",
|
||||
@@ -898,7 +932,7 @@
|
||||
"preservePitch": "utrzymuj ton",
|
||||
"preventSleepOnPlayback_description": "powstrzymuje ekran przed uśpieniem, gdy muzyka jest odtwarzana",
|
||||
"preventSleepOnPlayback": "powstrzymuj uśpienie podczas odtwarzania",
|
||||
"mediaSession_description": "włącza integrację z Windows Media Session, wyświetlając sterowanie mediami i metadane w systemowym oknie zmiany głośności i na ekranie blokady (tylko Windows)",
|
||||
"mediaSession_description": "włącza integrację z Media Session, wyświetlając sterowanie mediami i metadane w systemowym oknie zmiany głośności i na ekranie blokady",
|
||||
"mediaSession": "włącz media session",
|
||||
"transcode": "włącz transkodowanie",
|
||||
"queryBuilder": "kreator zaptań",
|
||||
@@ -926,7 +960,44 @@
|
||||
"logLevel_optionInfo": "info",
|
||||
"logLevel_optionWarn": "ostrzeżenia",
|
||||
"useThemeAccentColor": "używaj koloru akcentu motywu",
|
||||
"useThemeAccentColor_description": "używaj głównego koloru ustawionego w wybranym motywie zamiast niestandardowego koloru akcentu"
|
||||
"useThemeAccentColor_description": "używaj głównego koloru ustawionego w wybranym motywie zamiast niestandardowego koloru akcentu",
|
||||
"artistRadioCount_description": "ustawia liczbę piosenek do załadowania dla radia wykonawcy i radia utworu",
|
||||
"artistRadioCount": "liczba radio wykonawców/utworów",
|
||||
"imageResolution": "rozdzielczość obrazu",
|
||||
"imageResolution_description": "rozdzielczość dla obrazów używanych w programie. użycie wartości 0 ustawi rozdzielczość na natywną",
|
||||
"imageResolution_optionTable": "tabela",
|
||||
"imageResolution_optionItemCard": "karta elementu",
|
||||
"imageResolution_optionSidebar": "pasek boczny",
|
||||
"imageResolution_optionHeader": "nagłówek",
|
||||
"imageResolution_optionFullScreenPlayer": "odtwarzacz pełnoekranowy",
|
||||
"combinedLyricsAndVisualizer_description": "połącz tekst i wizualizacje w tym samym panelu",
|
||||
"combinedLyricsAndVisualizer": "połącz tekst i wizualizacje w pasku bocznym odtwarzacza",
|
||||
"artistReleaseTypeConfiguration": "konfiguracja typu wydań wykonawcy",
|
||||
"artistReleaseTypeConfiguration_description": "skonfiguruj jakie typy wydań są pokazywane i w jakiej kolejności na stronie albumów wykonawcy",
|
||||
"showRatings_description": "kontroluje czy funkcja oceniania gwiazdkami jest pokazywana w interfejsie",
|
||||
"showRatings": "pokaż ocenianie gwiazdkami",
|
||||
"mpvExtraParameters": "dodatkowe parametry mpv",
|
||||
"mpvExtraParameters_description": "dodatkowe argumenty do przekazania mpv",
|
||||
"hotkey_listNavigateToPage": "lista nawigacja do strony elementu",
|
||||
"hotkey_listPlayDefault": "lista odtwarzaj",
|
||||
"hotkey_listPlayLast": "lista odtwarzaj ostatnie",
|
||||
"hotkey_listPlayNext": "lista odtwarzaj następne",
|
||||
"hotkey_listPlayNow": "lista odtwarzaj teraz",
|
||||
"pathReplace": "zamiana ścieżki pliku",
|
||||
"pathReplace_description": "zamień domyślną ścieżkę pliku twojego serwera",
|
||||
"pathReplace_optionRemovePrefix": "usuń prefix",
|
||||
"pathReplace_optionAddPrefix": "dodaj prefix",
|
||||
"homeFeatureStyle_description": "kontroluje styl karuzeli polecanych na stronie głównej",
|
||||
"homeFeatureStyle": "Styl karuzeli polecanych na stronie głównej",
|
||||
"homeFeatureStyle_optionMultiple": "wiele",
|
||||
"homeFeatureStyle_optionSingle": "jeden",
|
||||
"enableGridMultiSelect_description": "gdy włączone, pozwala na wybieranie wielu elementów w widokach siatki, gdy wyłączone, klikanie obrazów elementów siatki będzie przenosić na stronę elementu",
|
||||
"enableGridMultiSelect": "wybieranie wielu w siatce",
|
||||
"sidebarPlaylistSorting_description": "pozwala na ręczne sortowanie playlist w bocznym pasku używając przeciągania i upuszczania zamiast używania domyślnej kolejności serwera",
|
||||
"sidebarPlaylistSorting": "sortowanie playlist w bocznym pasku",
|
||||
"sidebarPlaylistListFilterRegex_description": "ukryj playlisty w pasku bocznym pasujące do wyrażenia regularnego",
|
||||
"sidebarPlaylistListFilterRegex_placeholder": "np. ^Miks codzienny.^",
|
||||
"sidebarPlaylistListFilterRegex": "filtr playlist regex"
|
||||
},
|
||||
"table": {
|
||||
"config": {
|
||||
@@ -964,7 +1035,8 @@
|
||||
"alternateRowColors": "naprzemienne kolory wierszy",
|
||||
"horizontalBorders": "obwódki wierszy",
|
||||
"rowHoverHighlight": "podświetlanie wierszy po najechaniu",
|
||||
"verticalBorders": "obwódki kolumn"
|
||||
"verticalBorders": "obwódki kolumn",
|
||||
"showHeader": "pokaż nagłówek"
|
||||
},
|
||||
"label": {
|
||||
"releaseDate": "data premiery",
|
||||
@@ -978,28 +1050,30 @@
|
||||
"trackNumber": "numer utworu",
|
||||
"rowIndex": "indeks wiersza",
|
||||
"rating": "$t(common.rating)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"album": "$t(entity.album_one)",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"note": "$t(common.note)",
|
||||
"biography": "$t(common.biography)",
|
||||
"owner": "$t(common.owner)",
|
||||
"path": "$t(common.path)",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"channels": "$t(common.channel, {\"count\": 2})",
|
||||
"playCount": "liczba odtworzeń",
|
||||
"bitrate": "$t(common.bitrate)",
|
||||
"actions": "$t(common.action_other)",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"actions": "$t(common.action, {\"count\": 2})",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"discNumber": "numer płyty",
|
||||
"favorite": "$t(common.favorite)",
|
||||
"year": "$t(common.year)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"codec": "$t(common.codec)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"albumCount": "$t(entity.album_other)",
|
||||
"genreBadge": "$t(entity.genre_one) (znaczki)",
|
||||
"songCount": "$t(entity.track, {\"count\": 2})",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2})",
|
||||
"genreBadge": "$t(entity.genre, {\"count\": 1}) (znaczki)",
|
||||
"image": "obraz",
|
||||
"bitDepth": "$t(common.bitDepth)",
|
||||
"sampleRate": "$t(common.sampleRate)"
|
||||
"sampleRate": "$t(common.sampleRate)",
|
||||
"composer": "kompozytor",
|
||||
"titleArtist": "$t(common.title) (wykonawca)"
|
||||
}
|
||||
},
|
||||
"column": {
|
||||
@@ -1008,7 +1082,7 @@
|
||||
"rating": "ocena",
|
||||
"favorite": "ulubione",
|
||||
"playCount": "odtwarzane",
|
||||
"albumCount": "$t(entity.album_other)",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2})",
|
||||
"releaseYear": "rok",
|
||||
"lastPlayed": "ostatnio odtwarzane",
|
||||
"biography": "biografia",
|
||||
@@ -1017,14 +1091,14 @@
|
||||
"title": "tytuł",
|
||||
"bpm": "bpm",
|
||||
"dateAdded": "data dodania",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"songCount": "$t(entity.track, {\"count\": 2})",
|
||||
"trackNumber": "utwór",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"albumArtist": "wykonawca albumu",
|
||||
"path": "ścieżka",
|
||||
"discNumber": "płyta",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"channels": "$t(common.channel, {\"count\": 2})",
|
||||
"size": "$t(common.size)",
|
||||
"codec": "$t(common.codec)",
|
||||
"owner": "właściciel",
|
||||
@@ -1038,7 +1112,7 @@
|
||||
},
|
||||
"releaseType": {
|
||||
"primary": {
|
||||
"album": "$t(entity.album_one)",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"broadcast": "broadcast",
|
||||
"ep": "ep",
|
||||
"other": "inne",
|
||||
@@ -1084,5 +1158,160 @@
|
||||
"notInPlaylist": "nie jest w",
|
||||
"notInTheLast": "nie jest w ostatnim",
|
||||
"startsWith": "zaczyna się od"
|
||||
},
|
||||
"datetime": {
|
||||
"minuteShort": "min",
|
||||
"secondShort": "sek",
|
||||
"hourShort": "godz",
|
||||
"dayShort": "dzień"
|
||||
},
|
||||
"visualizer": {
|
||||
"visualizerType": "Typ Wizualizacji",
|
||||
"cycleTime": "Czas cyklu (w sekundach)",
|
||||
"copyConfiguration": "Kopiuj Konfigurację",
|
||||
"pasteConfiguration": "Wklej Konfigurację",
|
||||
"pasteConfigurationPlaceholder": "Wklej konfigurację JSON tutaj...",
|
||||
"pasteFromClipboard": "Wklej z schowka",
|
||||
"applyConfiguration": "Zastosuj Konfigurację",
|
||||
"configCopied": "Konfiguracja skopiowana do schowka",
|
||||
"configCopyFailed": "Nie udało się skopiować konfiguracji",
|
||||
"configPasted": "Konfiguracja zastosowana pomyślnie",
|
||||
"configPasteFailed": "Nie udało się zastosować konfiguracji. Sprawdź jej format.",
|
||||
"configPasteReadFailed": "Nie udało się odczytać z schowka",
|
||||
"cyclePresets": "Cykl Ustawień",
|
||||
"includeAllPresets": "Uwzględnij wszystkie Ustawienia",
|
||||
"ignoredPresets": "Ignorowane Ustawienia",
|
||||
"selectedPresets": "Wybrane Ustawienia",
|
||||
"randomizeNextPreset": "Losuj Następne Ustawienie",
|
||||
"blendTime": "Czas Mieszania",
|
||||
"presets": "Ustawienia",
|
||||
"selectPreset": "Wybierz Ustawienie",
|
||||
"applyPreset": "Zastosuj Ustawienie",
|
||||
"saveAsPreset": "Zapisz jako Ustawienie",
|
||||
"updatePreset": "Uaktualnij Ustawienie",
|
||||
"presetName": "Nazwa Ustawienia",
|
||||
"presetNamePlaceholder": "Wpisz nazwę ustawienia",
|
||||
"general": "Ogólne",
|
||||
"mode": "Tryb",
|
||||
"mode1To8": "Tryb 1 - 8",
|
||||
"mode10": "Tryb 10",
|
||||
"barSpace": "Odstęp Pasków",
|
||||
"lineWidth": "Szerokość Linii",
|
||||
"fillAlpha": "Wypełnij Alpha",
|
||||
"channelLayout": "Układ Kanałów",
|
||||
"maxFPS": "Maks FPS",
|
||||
"opacity": "Nieprzezroczystość",
|
||||
"customGradients": "Niestandardowe Gradienty",
|
||||
"addCustomGradient": "Dodaj Niestandardowy Gradient",
|
||||
"gradientName": "Nazwa Gradientu",
|
||||
"gradientNamePlaceholder": "Nazwa Gradientu",
|
||||
"vertical": "Pionowy",
|
||||
"horizontal": "Poziomy",
|
||||
"colorStops": "Kroki Kolorów",
|
||||
"addColor": "Dodaj Kolor",
|
||||
"position": "Pozycja",
|
||||
"level": "Poziom",
|
||||
"remove": "Usuń",
|
||||
"custom": "Niestandardowy",
|
||||
"builtIn": "Wbudowany",
|
||||
"colors": "Kolory",
|
||||
"colorMode": "Tryb Koloru",
|
||||
"gradient": "Gradient",
|
||||
"gradientLeft": "Lewa Gradientu",
|
||||
"gradientRight": "Prawa Gradientu",
|
||||
"fft": "FFT",
|
||||
"fftSize": "Rozmiar FFT",
|
||||
"smoothing": "Wygładzanie",
|
||||
"frequencyRangeAndScaling": "Zakres częstotliwości i skalowanie",
|
||||
"minimumFrequency": "Minimalna Częstotliwość",
|
||||
"maximumFrequency": "Maksymalna Częstotliwość",
|
||||
"frequencyScale": "Skala Częstotliwości",
|
||||
"sensitivity": "Czułość",
|
||||
"weightingFilter": "Filtr Wagi",
|
||||
"minimumDecibels": "Minimum Decybeli",
|
||||
"maximumDecibels": "Maksimum Decybeli",
|
||||
"linearAmplitude": "Amplituda Linearna",
|
||||
"linearBoost": "Podbicie Linearne",
|
||||
"peakBehavior": "Zachowanie Szczytów",
|
||||
"showPeaks": "Pokaż Szczyty",
|
||||
"fadePeaks": "Zanikaj Sczyty",
|
||||
"peakLine": "Linia Szczytów",
|
||||
"gravity": "Grawitacja",
|
||||
"peakFadeTime": "Czas Zanikania Szczytów (ms)",
|
||||
"peakHoldTime": "Czas Utrzymywania Szczytu (ms)",
|
||||
"radialSpectrum": "Spektrum Promieniowe",
|
||||
"radial": "Promieniowe",
|
||||
"radialInvert": "Odwrócenie Promieniowe",
|
||||
"spinSpeed": "Prędkość Obrotu",
|
||||
"radius": "Promień",
|
||||
"reflexMirror": "Lustro refleksyjne",
|
||||
"reflexFit": "Dopasowanie Odbić",
|
||||
"reflexRatio": "Współczynnik Odbić",
|
||||
"reflexAlpha": "Alpha Odbić",
|
||||
"reflexBrightness": "Jasność Odbić",
|
||||
"mirror": "Odbij lustrzanie",
|
||||
"miscellaneousSettings": "Różne Ustawienia",
|
||||
"alphaBars": "Alpha Pasków",
|
||||
"ledBars": "Paski LED",
|
||||
"trueLeds": "Prawdziwe LEDy",
|
||||
"lumiBars": "Paski Lumi",
|
||||
"outlineBars": "Obwódki Pasków",
|
||||
"roundBars": "Zaokrąglone Paski",
|
||||
"lowResolution": "Niska Rozdzielczość",
|
||||
"splitGradient": "Rozdziel Gradient",
|
||||
"showFPS": "Pokaż FPS",
|
||||
"showScaleX": "Pokaż Skalę X",
|
||||
"noteLabels": "Etykiety Nut",
|
||||
"showScaleY": "Pokaż Skalę Y",
|
||||
"options": {
|
||||
"colorMode": {
|
||||
"gradient": "Gradient",
|
||||
"barIndex": "Indeks-Paska",
|
||||
"barLevel": "Poziom-Paska"
|
||||
},
|
||||
"gradient": {
|
||||
"classic": "Klasyczny",
|
||||
"prism": "Pryzmat",
|
||||
"rainbow": "Tęcza",
|
||||
"steelblue": "Stalowoniebieski",
|
||||
"orangered": "Pomarańczowo-czerwony"
|
||||
},
|
||||
"channelLayout": {
|
||||
"single": "Pojedynczy",
|
||||
"dualCombined": "Podwójne-Połączone",
|
||||
"dualHorizontal": "Podwójne-Poziome",
|
||||
"dualVertical": "Podwójne-Pionowe"
|
||||
},
|
||||
"frequencyScale": {
|
||||
"linear": "Skala linearna",
|
||||
"none": "Żadna",
|
||||
"bark": "Skala bark",
|
||||
"log": "Skala log",
|
||||
"mel": "Skala Mel"
|
||||
},
|
||||
"weightingFilter": {
|
||||
"none": "Żadne",
|
||||
"a": "A",
|
||||
"b": "B",
|
||||
"c": "C",
|
||||
"d": "D",
|
||||
"z": "Z"
|
||||
},
|
||||
"mode": {
|
||||
"0": "[0] Dyskretne częstotliwości",
|
||||
"1": "[1] 1/24 oktawy / 240 pasm",
|
||||
"2": "[2] 1/12 oktawy / 120 pasm",
|
||||
"3": "[3] 1/8 oktawy / 80 pasm",
|
||||
"4": "[4] 1/6 oktawy / 60 pasm",
|
||||
"5": "[5] 1/4 oktawy / 40 pasm",
|
||||
"6": "[6] 1/3 oktawy / 30 pasm",
|
||||
"7": "[7] Pół oktawy / 20 pasm",
|
||||
"8": "[8] Pełna oktawa / 10 pasm",
|
||||
"10": "[10] Linia / Wykres miejscowy"
|
||||
}
|
||||
},
|
||||
"pasteGradient": "Wklej Gradient",
|
||||
"pasteGradientPlaceholder": "Wklej tutaj JSON gradientu...",
|
||||
"ansiBands": "Paski ANSI"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
"bpm": "BPM",
|
||||
"edit": "editar",
|
||||
"favorite": "favorito",
|
||||
"currentSong": "$t(entity.track_one) atual",
|
||||
"currentSong": "$t(entity.track, {\"count\": 1}) atual",
|
||||
"descending": "abaixar",
|
||||
"dismiss": "liberar",
|
||||
"duration": "duração",
|
||||
@@ -58,7 +58,9 @@
|
||||
"owner": "dono",
|
||||
"forward": "para frente",
|
||||
"forceRestartRequired": "reinicie para aplicar as alterações… feche a notificação para reiniciar",
|
||||
"setting": "configuração",
|
||||
"setting_one": "configuração",
|
||||
"setting_many": "",
|
||||
"setting_other": "",
|
||||
"version": "versão",
|
||||
"filter_one": "filtro",
|
||||
"filter_many": "filtros",
|
||||
@@ -72,7 +74,7 @@
|
||||
"none": "nenhum",
|
||||
"menu": "menu",
|
||||
"restartRequired": "é necessário reiniciar",
|
||||
"previousSong": "anterior $t(entity.track_one)",
|
||||
"previousSong": "anterior $t(entity.track, {\"count\": 1})",
|
||||
"noResultsFromQuery": "a consulta não retornou resultados",
|
||||
"quit": "sair",
|
||||
"search": "procurar",
|
||||
@@ -101,21 +103,21 @@
|
||||
},
|
||||
"action": {
|
||||
"goToPage": "vá para página",
|
||||
"addToFavorites": "adicionar em $t(entity.favorite_other)",
|
||||
"viewPlaylists": "ver $t(entity.playlist_other)",
|
||||
"addToFavorites": "adicionar em $t(entity.favorite, {\"count\": 2})",
|
||||
"viewPlaylists": "ver $t(entity.playlist, {\"count\": 2})",
|
||||
"setRating": "definir classificação",
|
||||
"moveToTop": "mover para o topo",
|
||||
"refresh": "$t(common.refresh)",
|
||||
"removeFromQueue": "remover da fila",
|
||||
"moveToBottom": "mover para baixo",
|
||||
"editPlaylist": "editar $t(entity.playlist_one)",
|
||||
"editPlaylist": "editar $t(entity.playlist, {\"count\": 1})",
|
||||
"clearQueue": "Limpar fila",
|
||||
"addToPlaylist": "adicionar à $t(entity.playlist_one)",
|
||||
"createPlaylist": "Criar $t(entity.playlist_one)",
|
||||
"removeFromPlaylist": "remover da $t(entity.playlist_one)",
|
||||
"deletePlaylist": "deletar $t(entity.playlist_one)",
|
||||
"addToPlaylist": "adicionar à $t(entity.playlist, {\"count\": 1})",
|
||||
"createPlaylist": "Criar $t(entity.playlist, {\"count\": 1})",
|
||||
"removeFromPlaylist": "remover da $t(entity.playlist, {\"count\": 1})",
|
||||
"deletePlaylist": "deletar $t(entity.playlist, {\"count\": 1})",
|
||||
"deselectAll": "desmarcar todos",
|
||||
"removeFromFavorites": "remover de $t(entity.favorite_other)",
|
||||
"removeFromFavorites": "remover de $t(entity.favorite, {\"count\": 2})",
|
||||
"openIn": {
|
||||
"lastfm": "Abrir em Last.fm",
|
||||
"musicbrainz": "Abrir em MusicBrainz"
|
||||
@@ -125,9 +127,9 @@
|
||||
},
|
||||
"form": {
|
||||
"deletePlaylist": {
|
||||
"title": "deletar $t(entity.playlist_one)",
|
||||
"input_confirm": "escreva o nome da $t(entity.playlist_one) para confirmar",
|
||||
"success": "$t(entity.playlist_one) deletada com sucesso"
|
||||
"title": "deletar $t(entity.playlist, {\"count\": 1})",
|
||||
"input_confirm": "escreva o nome da $t(entity.playlist, {\"count\": 1}) para confirmar",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) deletada com sucesso"
|
||||
},
|
||||
"addServer": {
|
||||
"title": "adicionar servidor",
|
||||
@@ -145,10 +147,10 @@
|
||||
"input_preferInstantMixDescription": "Usar apenas a mixagem instantânea para obter músicas semelhantes. Útil se você tiver plugins que modificam esse comportamento"
|
||||
},
|
||||
"createPlaylist": {
|
||||
"title": "criar $t(entity.playlist_one)",
|
||||
"title": "criar $t(entity.playlist, {\"count\": 1})",
|
||||
"input_public": "público",
|
||||
"input_description": "$t(common.description)",
|
||||
"success": "$t(entity.playlist_one) criada com sucesso",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) criada com sucesso",
|
||||
"input_owner": "$t(common.owner)",
|
||||
"input_name": "$t(common.name)"
|
||||
},
|
||||
@@ -157,19 +159,19 @@
|
||||
"success": "servidor atualizado com sucesso"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"title": "editar $t(entity.playlist_one)",
|
||||
"title": "editar $t(entity.playlist, {\"count\": 1})",
|
||||
"publicJellyfinNote": "O Jellyfin por algum motivo não expõe se uma playlist é pública ou não. Se você deseja que ela permaneça pública, por favor selecione a seguinte entrada",
|
||||
"success": "$t(entity.playlist_one) atualizada com sucesso"
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) atualizada com sucesso"
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"title": "adicionar à $t(entity.playlist_one)",
|
||||
"input_playlists": "$t(entity.playlist_other)",
|
||||
"title": "adicionar à $t(entity.playlist, {\"count\": 1})",
|
||||
"input_playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"input_skipDuplicates": "pular duplicadas",
|
||||
"success": "adicionado $t(entity.trackWithCount, {\"count\": {{message}} }) para $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })"
|
||||
},
|
||||
"lyricSearch": {
|
||||
"title": "pesquisa de letras",
|
||||
"input_artist": "$t(entity.artist_one)",
|
||||
"input_artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"input_name": "$t(common.name)"
|
||||
},
|
||||
"shareItem": {
|
||||
@@ -356,8 +358,6 @@
|
||||
"playButtonBehavior_optionAddNext": "$t(player.addNext)",
|
||||
"playButtonBehavior_optionPlay": "$t(player.play)",
|
||||
"playButtonBehavior_optionPlayShuffled": "$t(player.shuffle)",
|
||||
"playerAlbumArtResolution": "resolução da capa do álbum no reprodutor",
|
||||
"playerAlbumArtResolution_description": "a resolução da pré-visualização da capa do álbum no reprodutor grande. Resoluções maiores deixam a imagem mais nítida, mas podem diminuir a velocidade de carregamento. O padrão é 0, ou seja, automático",
|
||||
"playerbarOpenDrawer": "alternar tela cheia na barra do reprodutor",
|
||||
"playerbarOpenDrawer_description": "permite clicar na barra do reprodutor para abrir o reprodutor em tela cheia",
|
||||
"remotePassword": "Senha do servidor de controle remoto",
|
||||
@@ -372,9 +372,9 @@
|
||||
"replayGainFallback_description": "Ganho em dB a ser aplicado se o arquivo não tiver tags de {{ReplayGain}}",
|
||||
"replayGainMode": "Modo {{ReplayGain}}",
|
||||
"replayGainMode_description": "Ajustar o ganho de volume de acordo com os valores de {{ReplayGain}} armazenados nos metadados do arquivo",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album_one)",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album, {\"count\": 1})",
|
||||
"replayGainMode_optionNone": "$t(common.none)",
|
||||
"replayGainMode_optionTrack": "$t(entity.track_one)",
|
||||
"replayGainMode_optionTrack": "$t(entity.track, {\"count\": 1})",
|
||||
"replayGainPreamp": "Pré-amplificador {{ReplayGain}} (dB)",
|
||||
"replayGainPreamp_description": "Ajustar o ganho do pré-amplificador aplicado aos valores de {{ReplayGain}}",
|
||||
"sampleRate": "Taxa de amostragem (sample rate)",
|
||||
@@ -383,6 +383,8 @@
|
||||
"savePlayQueue_description": "Salvar a fila de reprodução ao fechar a aplicação e restaurá-la ao abrir a aplicação",
|
||||
"scrobble": "Scrobblar",
|
||||
"scrobble_description": "Scrobblar reproduções para o seu servidor de mídia",
|
||||
"showRatings": "exibir avaliações por estrelas",
|
||||
"showRatings_description": "exibir ou ocultar as avaliações por estrelas",
|
||||
"showSkipButton": "Exibir botões de pular",
|
||||
"showSkipButton_description": "Exibir ou ocultar os botões de pular na barra do reprodutor",
|
||||
"showSkipButtons": "Exibir botões de pular",
|
||||
@@ -448,9 +450,9 @@
|
||||
"titleCombined": "$t(common.title) (combinado)",
|
||||
"discNumber": "numero do disco",
|
||||
"actions": "$t(common.action_other)",
|
||||
"album": "$t(entity.album_one)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"biography": "$t(common.biography)",
|
||||
"bitrate": "$t(common.bitrate)",
|
||||
"bpm": "$t(common.bpm)",
|
||||
@@ -459,7 +461,7 @@
|
||||
"dateAdded": "Data de adição",
|
||||
"duration": "$t(common.duration)",
|
||||
"favorite": "$t(common.favorite)",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"lastPlayed": "Última reprodução",
|
||||
"note": "$t(common.note)",
|
||||
"owner": "$t(common.owner)",
|
||||
@@ -469,7 +471,7 @@
|
||||
"releaseDate": "Data de lançamento",
|
||||
"rowIndex": "Índice da linha",
|
||||
"size": "$t(common.size)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"songCount": "$t(entity.track, {\"count\": 2})",
|
||||
"trackNumber": "Número da faixa",
|
||||
"year": "$t(common.year)"
|
||||
},
|
||||
@@ -495,8 +497,8 @@
|
||||
"size": "$t(common.size)",
|
||||
"album": "Álbum",
|
||||
"albumArtist": "Artista do álbum",
|
||||
"albumCount": "$t(entity.album_other)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2})",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"biography": "Biografia",
|
||||
"bitrate": "Taxa de bits",
|
||||
"bpm": "BPM",
|
||||
@@ -505,14 +507,14 @@
|
||||
"comment": "Comentário",
|
||||
"dateAdded": "Data adicionada",
|
||||
"favorite": "Favorito",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"lastPlayed": "Último tocado",
|
||||
"path": "Caminho",
|
||||
"playCount": "Tocados",
|
||||
"rating": "Avaliação",
|
||||
"releaseDate": "Data de lançamento",
|
||||
"releaseYear": "Ano",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"songCount": "$t(entity.track, {\"count\": 2})",
|
||||
"trackNumber": "Faixa"
|
||||
}
|
||||
},
|
||||
@@ -526,17 +528,17 @@
|
||||
"recentlyReleased": "Lançamentos recentes"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
"title": "$t(entity.albumArtist, {\"count\": 2})"
|
||||
},
|
||||
"genreList": {
|
||||
"title": "$t(entity.genre_other)",
|
||||
"showTracks": "mostrar $t(entity.genre_one) $t(entity.track_other)",
|
||||
"showAlbums": "mostrar $t(entity.genre_one) $t(entity.album_other)"
|
||||
"title": "$t(entity.genre, {\"count\": 2})",
|
||||
"showTracks": "mostrar $t(entity.genre, {\"count\": 1}) $t(entity.track, {\"count\": 2})",
|
||||
"showAlbums": "mostrar $t(entity.genre, {\"count\": 1}) $t(entity.album, {\"count\": 2})"
|
||||
},
|
||||
"trackList": {
|
||||
"title": "$t(entity.track_other)",
|
||||
"title": "$t(entity.track, {\"count\": 2})",
|
||||
"artistTracks": "faixas de {{artist}}",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track_other)"
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track, {\"count\": 2})"
|
||||
},
|
||||
"globalSearch": {
|
||||
"title": "comandos",
|
||||
@@ -548,26 +550,26 @@
|
||||
},
|
||||
"sidebar": {
|
||||
"home": "$t(common.home)",
|
||||
"tracks": "$t(entity.track_other)",
|
||||
"shared": "$t(entity.playlist_other) compartilhada",
|
||||
"albums": "$t(entity.album_other)",
|
||||
"genres": "$t(entity.genre_other)",
|
||||
"folders": "$t(entity.folder_other)",
|
||||
"albumArtists": "$t(entity.albumArtist_other)",
|
||||
"artists": "$t(entity.artist_other)",
|
||||
"tracks": "$t(entity.track, {\"count\": 2})",
|
||||
"shared": "$t(entity.playlist, {\"count\": 2}) compartilhada",
|
||||
"albums": "$t(entity.album, {\"count\": 2})",
|
||||
"genres": "$t(entity.genre, {\"count\": 2})",
|
||||
"folders": "$t(entity.folder, {\"count\": 2})",
|
||||
"albumArtists": "$t(entity.albumArtist, {\"count\": 2})",
|
||||
"artists": "$t(entity.artist, {\"count\": 2})",
|
||||
"nowPlaying": "tocando agora",
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"search": "$t(common.search)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"myLibrary": "minha biblioteca"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist_other)"
|
||||
"title": "$t(entity.playlist, {\"count\": 2})"
|
||||
},
|
||||
"albumList": {
|
||||
"title": "$t(entity.album_other)",
|
||||
"title": "$t(entity.album, {\"count\": 2})",
|
||||
"artistAlbums": "álbuns de {{artist}}",
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)"
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album, {\"count\": 2})"
|
||||
},
|
||||
"appMenu": {
|
||||
"openBrowserDevtools": "abrir ferramentas do desenvolvedor",
|
||||
@@ -579,7 +581,7 @@
|
||||
"goForward": "avançar",
|
||||
"version": "versão {{version}}",
|
||||
"manageServers": "gerenciar servidores",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"privateModeOff": "Desativar modo privado",
|
||||
"privateModeOn": "Ativar modo privado"
|
||||
},
|
||||
@@ -606,15 +608,15 @@
|
||||
"moveToNext": "$t(action.moveToNext)",
|
||||
"removeFromPlaylist": "$t(action.removeFromPlaylist)",
|
||||
"setRating": "$t(action.setRating)",
|
||||
"goToAlbum": "Ir para $t(entity.album_one)",
|
||||
"goToAlbumArtist": "Ir para $t(entity.albumArtist_one)"
|
||||
"goToAlbum": "Ir para $t(entity.album, {\"count\": 1})",
|
||||
"goToAlbumArtist": "Ir para $t(entity.albumArtist, {\"count\": 1})"
|
||||
},
|
||||
"albumArtistDetail": {
|
||||
"viewAllTracks": "ver todas as $t(entity.track_other)",
|
||||
"viewAllTracks": "ver todas as $t(entity.track, {\"count\": 2})",
|
||||
"appearsOn": "aparece em",
|
||||
"recentReleases": "lançamentos recentes",
|
||||
"viewDiscography": "ver discografia",
|
||||
"relatedArtists": "$t(entity.artist_other) relacionados",
|
||||
"relatedArtists": "$t(entity.artist, {\"count\": 2}) relacionados",
|
||||
"viewAll": "ver tudo",
|
||||
"topSongsFrom": "músicas mais tocadas de {{title}}",
|
||||
"topSongs": "músicas mais tocadas",
|
||||
@@ -644,7 +646,7 @@
|
||||
"noLyrics": "nenhuma letra encontrada"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "mais deste $t(entity.artist_one)",
|
||||
"moreFromArtist": "mais deste $t(entity.artist, {\"count\": 1})",
|
||||
"moreFromGeneric": "mais de {{item}}",
|
||||
"released": "lançado"
|
||||
},
|
||||
@@ -676,7 +678,7 @@
|
||||
"title": "titulo",
|
||||
"disc": "disco",
|
||||
"mostPlayed": "mais tocado",
|
||||
"album": "$t(entity.album_one)",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"name": "nome",
|
||||
"biography": "bibliografia",
|
||||
"duration": "duração",
|
||||
@@ -695,7 +697,7 @@
|
||||
"recentlyUpdated": "atualizado recentemente",
|
||||
"dateAdded": "data de adição",
|
||||
"isRecentlyPlayed": "foi tocado recentemente",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"recentlyAdded": "adicionado recentemente",
|
||||
"releaseDate": "data de lançamento",
|
||||
"recentlyPlayed": "tocado recentemente",
|
||||
@@ -703,7 +705,7 @@
|
||||
"isFavorited": "é favoritado",
|
||||
"releaseYear": "ano de lançamento",
|
||||
"rating": "avaliação",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"bpm": "bpm",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"comment": "comentário",
|
||||
@@ -713,8 +715,8 @@
|
||||
"bitrate": "bitrate",
|
||||
"isRated": "possui avaliação",
|
||||
"note": "nota",
|
||||
"albumCount": "número de $t(entity.album_other)",
|
||||
"genre": "$t(entity.genre_one)"
|
||||
"albumCount": "número de $t(entity.album, {\"count\": 2})",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})"
|
||||
},
|
||||
"player": {
|
||||
"playbackFetchNoResults": "nenhuma música encontrada",
|
||||
@@ -795,7 +797,7 @@
|
||||
"track_one": "faixa",
|
||||
"track_many": "faixas",
|
||||
"track_other": "faixas",
|
||||
"smartPlaylist": "$t(entity.playlist_one) inteligente",
|
||||
"smartPlaylist": "$t(entity.playlist, {\"count\": 1}) inteligente",
|
||||
"song_one": "música",
|
||||
"song_many": "músicas",
|
||||
"song_other": "músicas",
|
||||
|
||||
@@ -1,23 +1,23 @@
|
||||
{
|
||||
"action": {
|
||||
"addToFavorites": "adicionar a $t(entity.favorite_other)",
|
||||
"addToPlaylist": "adicionar a $t(entity.playlist_one)",
|
||||
"addToFavorites": "adicionar a $t(entity.favorite, {\"count\": 2})",
|
||||
"addToPlaylist": "adicionar a $t(entity.playlist, {\"count\": 1})",
|
||||
"clearQueue": "limpar fila",
|
||||
"createPlaylist": "criar $t(entity.playlist_one)",
|
||||
"deletePlaylist": "apagar $t(entity.playlist_one)",
|
||||
"createPlaylist": "criar $t(entity.playlist, {\"count\": 1})",
|
||||
"deletePlaylist": "apagar $t(entity.playlist, {\"count\": 1})",
|
||||
"deselectAll": "desmarcar todos",
|
||||
"editPlaylist": "editar $t(entity.playlist_one)",
|
||||
"editPlaylist": "editar $t(entity.playlist, {\"count\": 1})",
|
||||
"goToPage": "vá para página",
|
||||
"moveToNext": "mover para o próximo",
|
||||
"moveToBottom": "mover para baixo",
|
||||
"moveToTop": "mover para o topo",
|
||||
"refresh": "$t(common.refresh)",
|
||||
"removeFromFavorites": "remover de $t(entity.favorite_other)",
|
||||
"removeFromPlaylist": "remover da $t(entity.playlist_one)",
|
||||
"removeFromFavorites": "remover de $t(entity.favorite, {\"count\": 2})",
|
||||
"removeFromPlaylist": "remover da $t(entity.playlist, {\"count\": 1})",
|
||||
"removeFromQueue": "remover da fila",
|
||||
"setRating": "definir classificação",
|
||||
"toggleSmartPlaylistEditor": "alternar editor $t(entity.smartPlaylist)",
|
||||
"viewPlaylists": "ver $t(entity.playlist_other)",
|
||||
"viewPlaylists": "ver $t(entity.playlist, {\"count\": 2})",
|
||||
"openIn": {
|
||||
"lastfm": "Abrir em Last.fm",
|
||||
"musicbrainz": "Abrir em MusicBrainz"
|
||||
@@ -52,7 +52,7 @@
|
||||
"configure": "configurar",
|
||||
"confirm": "confirmar",
|
||||
"create": "criar",
|
||||
"currentSong": "$t(entity.track_one) atual",
|
||||
"currentSong": "$t(entity.track, {\"count\": 1}) atual",
|
||||
"decrease": "diminuir",
|
||||
"delete": "apagar",
|
||||
"descending": "abaixar",
|
||||
@@ -92,7 +92,7 @@
|
||||
"path": "caminho",
|
||||
"playerMustBePaused": "o player deve estar pausado",
|
||||
"preview": "pré-visualizar",
|
||||
"previousSong": "anterior $t(entity.track_one)",
|
||||
"previousSong": "anterior $t(entity.track, {\"count\": 1})",
|
||||
"quit": "sair",
|
||||
"random": "aleatório",
|
||||
"rating": "classificação",
|
||||
@@ -106,7 +106,9 @@
|
||||
"saveAndReplace": "gravar e substituir",
|
||||
"saveAs": "gravar como",
|
||||
"search": "procurar",
|
||||
"setting": "configuração",
|
||||
"setting_one": "configuração",
|
||||
"setting_many": "",
|
||||
"setting_other": "",
|
||||
"share": "partilhar",
|
||||
"size": "tamanho",
|
||||
"sortOrder": "ordem",
|
||||
@@ -164,7 +166,7 @@
|
||||
"playlistWithCount_one": "{{count}} playlist",
|
||||
"playlistWithCount_many": "{{count}} playlists",
|
||||
"playlistWithCount_other": "{{count}} playlists",
|
||||
"smartPlaylist": "$t(entity.playlist_one) inteligente",
|
||||
"smartPlaylist": "$t(entity.playlist, {\"count\": 1}) inteligente",
|
||||
"track_one": "faixa",
|
||||
"track_many": "faixas",
|
||||
"track_other": "faixas",
|
||||
@@ -201,10 +203,10 @@
|
||||
"systemFontError": "ocorreu um erro ao tentar obter fontes do sistema"
|
||||
},
|
||||
"filter": {
|
||||
"album": "$t(entity.album_one)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"albumCount": "número de $t(entity.album_other)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"albumCount": "número de $t(entity.album, {\"count\": 2})",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"biography": "bibliografia",
|
||||
"bitrate": "bitrate",
|
||||
"bpm": "bpm",
|
||||
@@ -217,7 +219,7 @@
|
||||
"duration": "duração",
|
||||
"favorited": "favoritado",
|
||||
"fromYear": "a partir do ano",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"id": "id",
|
||||
"isCompilation": "é compilação",
|
||||
"isFavorited": "é favoritado",
|
||||
@@ -259,31 +261,31 @@
|
||||
"title": "adicionar servidor"
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"input_playlists": "$t(entity.playlist_other)",
|
||||
"input_playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"input_skipDuplicates": "pular duplicadas",
|
||||
"success": "adicionado $t(entity.trackWithCount, {\"count\": {{message}} }) para $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })",
|
||||
"title": "adicionar à $t(entity.playlist_one)"
|
||||
"title": "adicionar à $t(entity.playlist, {\"count\": 1})"
|
||||
},
|
||||
"createPlaylist": {
|
||||
"input_description": "$t(common.description)",
|
||||
"input_name": "$t(common.name)",
|
||||
"input_owner": "$t(common.owner)",
|
||||
"input_public": "público",
|
||||
"success": "$t(entity.playlist_one) criada com sucesso",
|
||||
"title": "criar $t(entity.playlist_one)"
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) criada com sucesso",
|
||||
"title": "criar $t(entity.playlist, {\"count\": 1})"
|
||||
},
|
||||
"deletePlaylist": {
|
||||
"input_confirm": "escreva o nome da $t(entity.playlist_one) para confirmar",
|
||||
"success": "$t(entity.playlist_one) apagada com sucesso",
|
||||
"title": "apagar $t(entity.playlist_one)"
|
||||
"input_confirm": "escreva o nome da $t(entity.playlist, {\"count\": 1}) para confirmar",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) apagada com sucesso",
|
||||
"title": "apagar $t(entity.playlist, {\"count\": 1})"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"publicJellyfinNote": "O Jellyfin por algum motivo não expõe se uma playlist é pública ou não. Se deseja que ela permaneça pública, por favor selecione a seguinte entrada",
|
||||
"success": "$t(entity.playlist_one) atualizada com sucesso",
|
||||
"title": "editar $t(entity.playlist_one)"
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) atualizada com sucesso",
|
||||
"title": "editar $t(entity.playlist, {\"count\": 1})"
|
||||
},
|
||||
"lyricSearch": {
|
||||
"input_artist": "$t(entity.artist_one)",
|
||||
"input_artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"input_name": "$t(common.name)",
|
||||
"title": "pesquisa de letras"
|
||||
},
|
||||
@@ -310,24 +312,24 @@
|
||||
"appearsOn": "aparece em",
|
||||
"recentReleases": "lançamentos recentes",
|
||||
"viewDiscography": "ver discografia",
|
||||
"relatedArtists": "$t(entity.artist_other) relacionados",
|
||||
"relatedArtists": "$t(entity.artist, {\"count\": 2}) relacionados",
|
||||
"topSongs": "músicas mais tocadas",
|
||||
"topSongsFrom": "músicas mais tocadas de {{title}}",
|
||||
"viewAll": "ver tudo",
|
||||
"viewAllTracks": "ver todas as $t(entity.track_other)"
|
||||
"viewAllTracks": "ver todas as $t(entity.track, {\"count\": 2})"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
"title": "$t(entity.albumArtist, {\"count\": 2})"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "mais deste $t(entity.artist_one)",
|
||||
"moreFromArtist": "mais deste $t(entity.artist, {\"count\": 1})",
|
||||
"moreFromGeneric": "mais que {{item}}",
|
||||
"released": "lançado"
|
||||
},
|
||||
"albumList": {
|
||||
"artistAlbums": "álbuns de {{artist}}",
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)",
|
||||
"title": "$t(entity.album_other)"
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album, {\"count\": 2})",
|
||||
"title": "$t(entity.album, {\"count\": 2})"
|
||||
},
|
||||
"appMenu": {
|
||||
"collapseSidebar": "recolher barra lateral",
|
||||
@@ -338,7 +340,7 @@
|
||||
"openBrowserDevtools": "abrir ferramentas do programador",
|
||||
"quit": "$t(common.quit)",
|
||||
"selectServer": "selecionar servidor",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"version": "versão {{version}}"
|
||||
},
|
||||
"manageServers": {
|
||||
@@ -397,9 +399,9 @@
|
||||
"noLyrics": "nenhuma letra encontrada"
|
||||
},
|
||||
"genreList": {
|
||||
"showAlbums": "mostrar $t(entity.genre_one) $t(entity.album_other)",
|
||||
"showTracks": "mostrar $t(entity.genre_one) $t(entity.track_other)",
|
||||
"title": "$t(entity.genre_other)"
|
||||
"showAlbums": "mostrar $t(entity.genre, {\"count\": 1}) $t(entity.album, {\"count\": 2})",
|
||||
"showTracks": "mostrar $t(entity.genre, {\"count\": 1}) $t(entity.track, {\"count\": 2})",
|
||||
"title": "$t(entity.genre, {\"count\": 2})"
|
||||
},
|
||||
"globalSearch": {
|
||||
"commands": {
|
||||
@@ -425,7 +427,7 @@
|
||||
"reorder": "reordenar apenas disponível quando ordenado pelo id"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist_other)"
|
||||
"title": "$t(entity.playlist, {\"count\": 2})"
|
||||
},
|
||||
"setting": {
|
||||
"advanced": "avançado",
|
||||
@@ -435,24 +437,24 @@
|
||||
"windowTab": "janela"
|
||||
},
|
||||
"sidebar": {
|
||||
"albumArtists": "$t(entity.albumArtist_other)",
|
||||
"albums": "$t(entity.album_other)",
|
||||
"artists": "$t(entity.artist_other)",
|
||||
"folders": "$t(entity.folder_other)",
|
||||
"genres": "$t(entity.genre_other)",
|
||||
"albumArtists": "$t(entity.albumArtist, {\"count\": 2})",
|
||||
"albums": "$t(entity.album, {\"count\": 2})",
|
||||
"artists": "$t(entity.artist, {\"count\": 2})",
|
||||
"folders": "$t(entity.folder, {\"count\": 2})",
|
||||
"genres": "$t(entity.genre, {\"count\": 2})",
|
||||
"home": "$t(common.home)",
|
||||
"myLibrary": "a minha biblioteca",
|
||||
"nowPlaying": "agora a tocar",
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"search": "$t(common.search)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"shared": "$t(entity.playlist_other) partilhada",
|
||||
"tracks": "$t(entity.track_other)"
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"shared": "$t(entity.playlist, {\"count\": 2}) partilhada",
|
||||
"tracks": "$t(entity.track, {\"count\": 2})"
|
||||
},
|
||||
"trackList": {
|
||||
"artistTracks": "faixas de {{artist}}",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track_other)",
|
||||
"title": "$t(entity.track_other)"
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track, {\"count\": 2})",
|
||||
"title": "$t(entity.track, {\"count\": 2})"
|
||||
}
|
||||
},
|
||||
"player": {
|
||||
|
||||
@@ -1,27 +1,43 @@
|
||||
{
|
||||
"action": {
|
||||
"editPlaylist": "редактировать $t(entity.playlist_one)",
|
||||
"editPlaylist": "редактировать $t(entity.playlist, {\"count\": 1})",
|
||||
"goToPage": "перейти на страницу",
|
||||
"moveToTop": "вверх",
|
||||
"clearQueue": "очистить очередь",
|
||||
"addToFavorites": "добавить в $t(entity.favorite_other)",
|
||||
"addToPlaylist": "добавить в $t(entity.playlist_one)",
|
||||
"createPlaylist": "создать $t(entity.playlist_one)",
|
||||
"removeFromPlaylist": "удалить из $t(entity.playlist_one)",
|
||||
"viewPlaylists": "показать $t(entity.playlist_other)",
|
||||
"addToFavorites": "добавить в $t(entity.favorite, {\"count\": 2})",
|
||||
"addToPlaylist": "добавить в $t(entity.playlist, {\"count\": 1})",
|
||||
"createPlaylist": "создать $t(entity.playlist, {\"count\": 1})",
|
||||
"removeFromPlaylist": "удалить из $t(entity.playlist, {\"count\": 1})",
|
||||
"viewPlaylists": "показать $t(entity.playlist, {\"count\": 2})",
|
||||
"refresh": "$t(common.refresh)",
|
||||
"deletePlaylist": "удалить $t(entity.playlist_one)",
|
||||
"deletePlaylist": "удалить $t(entity.playlist, {\"count\": 1})",
|
||||
"removeFromQueue": "удалить из очереди",
|
||||
"deselectAll": "снять выделение",
|
||||
"moveToBottom": "вниз",
|
||||
"setRating": "оценить",
|
||||
"toggleSmartPlaylistEditor": "вкл./откл. редактор $t(entity.smartPlaylist)",
|
||||
"removeFromFavorites": "удалить из $t(entity.favorite_other)",
|
||||
"removeFromFavorites": "удалить из $t(entity.favorite, {\"count\": 2})",
|
||||
"openIn": {
|
||||
"lastfm": "открыть на Last.fm",
|
||||
"musicbrainz": "открыть на MusicBrainz"
|
||||
},
|
||||
"moveToNext": "следующий"
|
||||
"moveToNext": "следующий",
|
||||
"addOrRemoveFromSelection": "добавить или удалить из выделения",
|
||||
"createRadioStation": "создать $t(entity.radioStation, {\"count\": 1})",
|
||||
"deleteRadioStation": "удалить $t(entity.radioStation, {\"count\": 1})",
|
||||
"selectAll": "выделить все",
|
||||
"downloadStarted": "Начата загрузка {{count}} предметов",
|
||||
"moveUp": "перейти наверх",
|
||||
"moveDown": "Перейти вниз",
|
||||
"holdToMoveToTop": "Удержать для перехода на верх",
|
||||
"holdToMoveToBottom": "удержать для перехода вниз",
|
||||
"moveItems": "переместить предметы",
|
||||
"shuffle": "Перемешать",
|
||||
"shuffleAll": "перемешать все",
|
||||
"shuffleSelected": "Смешать выбранное",
|
||||
"viewMore": "Посмотреть больше",
|
||||
"openApplicationDirectory": "открыть папку приложения",
|
||||
"selectRangeOfItems": "выбрать диапазон элементов"
|
||||
},
|
||||
"common": {
|
||||
"backward": "назад",
|
||||
@@ -36,7 +52,7 @@
|
||||
"left": "лево",
|
||||
"save": "сохранить",
|
||||
"right": "право",
|
||||
"currentSong": "текущий $t(entity.track_one)",
|
||||
"currentSong": "текущий $t(entity.track, {\"count\": 1})",
|
||||
"collapse": "закрыть",
|
||||
"trackNumber": "трек",
|
||||
"descending": "по убыванию",
|
||||
@@ -68,8 +84,8 @@
|
||||
"forceRestartRequired": "перезапустите приложение, чтобы применить изменения... закройте уведомление для перезапуска",
|
||||
"setting": "настройка",
|
||||
"setting_one": "настройка",
|
||||
"setting_few": "",
|
||||
"setting_many": "",
|
||||
"setting_few": "настройки",
|
||||
"setting_many": "настроек",
|
||||
"version": "версия",
|
||||
"title": "название",
|
||||
"filter_one": "фильтр",
|
||||
@@ -95,7 +111,7 @@
|
||||
"sortOrder": "порядок",
|
||||
"menu": "меню",
|
||||
"restartRequired": "необходим перезапуск приложения",
|
||||
"previousSong": "предыдущий $t(entity.track_one)",
|
||||
"previousSong": "предыдущий $t(entity.track, {\"count\": 1})",
|
||||
"noResultsFromQuery": "ничего не найдено",
|
||||
"quit": "выйти",
|
||||
"expand": "раскрыть",
|
||||
@@ -124,7 +140,30 @@
|
||||
"viewReleaseNotes": "Список изменений",
|
||||
"bitDepth": "Разрядность",
|
||||
"sampleRate": "частота дискретизации",
|
||||
"tags": "теги"
|
||||
"tags": "теги",
|
||||
"countSelected": "{{count}} выбрано",
|
||||
"faster": "быстрее",
|
||||
"filter_single": "один",
|
||||
"filter_multiple": "несколько",
|
||||
"mood": "настроение",
|
||||
"noFilters": "фильтры не настроены",
|
||||
"private": "приватный",
|
||||
"public": "открытый",
|
||||
"retry": "повторить",
|
||||
"recordLabel": "лейбл звукозаписи",
|
||||
"releaseType": "тип выпуска",
|
||||
"slower": "медленее",
|
||||
"sort": "сортировать",
|
||||
"clean": "очистить",
|
||||
"gridRows": "Строки в сетке",
|
||||
"tableColumns": "Столбцы таблицы",
|
||||
"doNotShowAgain": "не показывать снова",
|
||||
"itemsMore": "{{count}} более",
|
||||
"view": "посмотреть",
|
||||
"example": "пример",
|
||||
"rename": "переименовать",
|
||||
"explicit": "нецензурная лексика",
|
||||
"externalLinks": "внешние ссылки"
|
||||
},
|
||||
"entity": {
|
||||
"album_one": "альбом",
|
||||
@@ -173,13 +212,19 @@
|
||||
"folder_one": "папка",
|
||||
"folder_few": "папки",
|
||||
"folder_many": "папок",
|
||||
"smartPlaylist": "умный $t(entity.playlist_one)",
|
||||
"smartPlaylist": "умный $t(entity.playlist, {\"count\": 1})",
|
||||
"genreWithCount_one": "{{count}} жанр",
|
||||
"genreWithCount_few": "{{count}} жанра",
|
||||
"genreWithCount_many": "{{count}} жанров",
|
||||
"trackWithCount_one": "{{count}} трек",
|
||||
"trackWithCount_few": "{{count}} трека",
|
||||
"trackWithCount_many": "{{count}} треков"
|
||||
"trackWithCount_many": "{{count}} треков",
|
||||
"radioStation_one": "радиостанция",
|
||||
"radioStation_few": "радиостанции",
|
||||
"radioStation_many": "радиостанции",
|
||||
"radioStationWithCount_one": "Радиостанция",
|
||||
"radioStationWithCount_few": "Радиостанций",
|
||||
"radioStationWithCount_many": "Радиостанции"
|
||||
},
|
||||
"table": {
|
||||
"config": {
|
||||
@@ -208,8 +253,8 @@
|
||||
"trackNumber": "номер трека",
|
||||
"rowIndex": "номер строки",
|
||||
"rating": "$t(common.rating)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"album": "$t(entity.album_one)",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"note": "$t(common.note)",
|
||||
"biography": "$t(common.biography)",
|
||||
"owner": "$t(common.owner)",
|
||||
@@ -218,13 +263,14 @@
|
||||
"playCount": "количество воспроизведений",
|
||||
"bitrate": "$t(common.bitrate)",
|
||||
"actions": "$t(common.action_other)",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"discNumber": "номер диска",
|
||||
"favorite": "$t(common.favorite)",
|
||||
"year": "$t(common.year)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"codec": "$t(common.codec)",
|
||||
"songCount": "$t(entity.track_other)"
|
||||
"songCount": "$t(entity.track, {\"count\": 2})",
|
||||
"titleArtist": "$t(common.title) (артист)"
|
||||
}
|
||||
},
|
||||
"column": {
|
||||
@@ -235,9 +281,9 @@
|
||||
"lastPlayed": "последний",
|
||||
"releaseDate": "дата выхода",
|
||||
"title": "название",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"songCount": "$t(entity.track, {\"count\": 2})",
|
||||
"trackNumber": "трек",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"path": "путь",
|
||||
"discNumber": "диск",
|
||||
"size": "$t(common.size)",
|
||||
@@ -247,8 +293,8 @@
|
||||
"biography": "биография",
|
||||
"codec": "$t(common.codec)",
|
||||
"comment": "комментарий",
|
||||
"albumCount": "$t(entity.album_other)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2})",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"bitrate": "битрейт",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"bpm": "bpm"
|
||||
@@ -278,7 +324,12 @@
|
||||
"badAlbum": "вы видите эту страницу из-за того, что эта песня не входит в альбом. скорее всего, вы видите эту ошибку, так как песня находится в корневой директории папки с музыкой. Jellyfin группирует треки только по папкам",
|
||||
"networkError": "возникла ошибка сети",
|
||||
"badValue": "Недопустимый параметр «{{value}}». Это значение больше не существует",
|
||||
"notificationDenied": "Доступ к уведомлениям запрещен. Настройка не работает"
|
||||
"notificationDenied": "Доступ к уведомлениям запрещен. Настройка не работает",
|
||||
"multipleServerSaveQueueError": "в очереди воспроизведения присутствует одна или несколько песен, которые не загружены с текущего сервера. это не поддерживается",
|
||||
"noNetwork": "сервер недоступен",
|
||||
"noNetworkDescription": "Не удалось подключиться к серверу",
|
||||
"saveQueueFailed": "Не удалось сохранить очередь",
|
||||
"settingsSyncError": "обнаружены несоответствия между настройками рендерера и основным процессом. перезапустите приложение, чтобы изменения вступили в силу"
|
||||
},
|
||||
"filter": {
|
||||
"isCompilation": "сборник",
|
||||
@@ -287,12 +338,12 @@
|
||||
"dateAdded": "дата добавления",
|
||||
"communityRating": "рейтинг сообщества",
|
||||
"favorited": "любимый",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"isFavorited": "любимые",
|
||||
"bpm": "уд./мин.",
|
||||
"disc": "диск",
|
||||
"biography": "биография",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"duration": "длительность",
|
||||
"fromYear": "год",
|
||||
"criticRating": "рейтинг критиков",
|
||||
@@ -306,12 +357,12 @@
|
||||
"title": "название",
|
||||
"rating": "рейтинг",
|
||||
"search": "поиск",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"recentlyAdded": "недавно добавленные",
|
||||
"note": "заметка",
|
||||
"name": "название",
|
||||
"releaseDate": "дата выхода",
|
||||
"albumCount": "количество $t(entity.album_other)",
|
||||
"albumCount": "количество $t(entity.album, {\"count\": 2})",
|
||||
"path": "путь",
|
||||
"isRecentlyPlayed": "недавно проигрывался",
|
||||
"releaseYear": "год выхода",
|
||||
@@ -321,7 +372,7 @@
|
||||
"random": "случайно",
|
||||
"lastPlayed": "последний раз проигрывалась",
|
||||
"toYear": "до года",
|
||||
"album": "$t(entity.album_one)",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"trackNumber": "трек"
|
||||
},
|
||||
"player": {
|
||||
@@ -352,26 +403,35 @@
|
||||
"queue_moveToTop": "переместить выделенное вниз",
|
||||
"queue_moveToBottom": "переместить выделенное вверх",
|
||||
"shuffle_off": "перемешивание выключено",
|
||||
"addLast": "воспроизвести после всех",
|
||||
"addLast": "последний",
|
||||
"mute": "отключить звук",
|
||||
"skip_forward": "вперёд",
|
||||
"viewQueue": "показать очередь"
|
||||
"viewQueue": "показать очередь",
|
||||
"addLastShuffled": "последний (смешанный)",
|
||||
"addNextShuffled": "следующий (смешанный)",
|
||||
"artistRadio": "Радио артист",
|
||||
"holdToShuffle": "удержать для смешивания",
|
||||
"lyrics": "тексты песен",
|
||||
"restoreQueueFromServer": "восстановить очередь с сервера",
|
||||
"saveQueueToServer": "сохранить очередь на сервер",
|
||||
"trackRadio": "трек радио"
|
||||
},
|
||||
"page": {
|
||||
"sidebar": {
|
||||
"nowPlaying": "сейчас играет",
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"search": "$t(common.search)",
|
||||
"tracks": "$t(entity.track_other)",
|
||||
"albums": "$t(entity.album_other)",
|
||||
"genres": "$t(entity.genre_other)",
|
||||
"folders": "$t(entity.folder_other)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"tracks": "$t(entity.track, {\"count\": 2})",
|
||||
"albums": "$t(entity.album, {\"count\": 2})",
|
||||
"genres": "$t(entity.genre, {\"count\": 2})",
|
||||
"folders": "$t(entity.folder, {\"count\": 2})",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"home": "$t(common.home)",
|
||||
"artists": "$t(entity.artist_other)",
|
||||
"albumArtists": "$t(entity.albumArtist_other)",
|
||||
"artists": "$t(entity.artist, {\"count\": 2})",
|
||||
"albumArtists": "$t(entity.albumArtist, {\"count\": 2})",
|
||||
"myLibrary": "Моя библиотека",
|
||||
"shared": "Публичные плейлисты $t(entity.playlist_other)"
|
||||
"shared": "Публичные плейлисты $t(entity.playlist, {\"count\": 2})",
|
||||
"collections": "коллекции"
|
||||
},
|
||||
"fullscreenPlayer": {
|
||||
"config": {
|
||||
@@ -399,7 +459,7 @@
|
||||
"appMenu": {
|
||||
"selectServer": "список серверов",
|
||||
"version": "версия {{version}}",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"manageServers": "редактировать список серверов",
|
||||
"expandSidebar": "развернуть боковую панель",
|
||||
"collapseSidebar": "Скрыть боковую панель",
|
||||
@@ -408,7 +468,11 @@
|
||||
"goBack": "назад",
|
||||
"goForward": "вперёд",
|
||||
"privateModeOff": "Выключить приватный режим",
|
||||
"privateModeOn": "Включить приватный режим"
|
||||
"privateModeOn": "Включить приватный режим",
|
||||
"selectMusicFolder": "выбрать папку с музыкой",
|
||||
"noMusicFolder": "папка с музыкой не выбрана",
|
||||
"multipleMusicFolders": "{{count}} выбрано музыкальных папок",
|
||||
"commandPalette": "открыть командную строку"
|
||||
},
|
||||
"manageServers": {
|
||||
"title": "сервера",
|
||||
@@ -438,8 +502,9 @@
|
||||
"removeFromQueue": "$t(action.removeFromQueue)",
|
||||
"showDetails": "получить информацию",
|
||||
"shareItem": "поделиться",
|
||||
"goToAlbum": "Перейти к $t(entity.album_one)",
|
||||
"goToAlbumArtist": "Перейти к $t(entity.albumArtist_one)"
|
||||
"goToAlbum": "Перейти к $t(entity.album, {\"count\": 1})",
|
||||
"goToAlbumArtist": "Перейти к $t(entity.albumArtist, {\"count\": 1})",
|
||||
"goTo": "перейти в"
|
||||
},
|
||||
"home": {
|
||||
"mostPlayed": "слушают чаще всего",
|
||||
@@ -450,7 +515,7 @@
|
||||
"recentlyReleased": "Новинки"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "больше от $t(entity.artist_one)",
|
||||
"moreFromArtist": "больше от $t(entity.artist, {\"count\": 1})",
|
||||
"moreFromGeneric": "больше из {{item}}",
|
||||
"released": "выпущен"
|
||||
},
|
||||
@@ -459,19 +524,35 @@
|
||||
"generalTab": "общее",
|
||||
"hotkeysTab": "горячие клавиши",
|
||||
"windowTab": "окно",
|
||||
"advanced": "расширенные"
|
||||
"advanced": "расширенные",
|
||||
"analytics": "аналитика",
|
||||
"updates": "обновить",
|
||||
"cache": "кэш",
|
||||
"application": "приложение",
|
||||
"theme": "тема",
|
||||
"controls": "элементы управления",
|
||||
"sidebar": "боковая панель",
|
||||
"remote": "удаленный",
|
||||
"exportImport": "импорт/экспорт",
|
||||
"audio": "аудио",
|
||||
"lyrics": "тексты песен",
|
||||
"lyricsDisplay": "отображение текстов песен",
|
||||
"transcoding": "транскодирование",
|
||||
"scrobble": "скробблер",
|
||||
"logger": "Отладка",
|
||||
"playerFilters": "фильтры проигрывателя"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
"title": "$t(entity.albumArtist, {\"count\": 2})"
|
||||
},
|
||||
"genreList": {
|
||||
"title": "$t(entity.genre_other)",
|
||||
"showAlbums": "показать $t(entity.genre_one) $t(entity.album_other)",
|
||||
"showTracks": "показать $t(entity.genre_one) $t(entity.track_other)"
|
||||
"title": "$t(entity.genre, {\"count\": 2})",
|
||||
"showAlbums": "показать $t(entity.genre, {\"count\": 1}) $t(entity.album, {\"count\": 2})",
|
||||
"showTracks": "показать $t(entity.genre, {\"count\": 1}) $t(entity.track, {\"count\": 2})"
|
||||
},
|
||||
"trackList": {
|
||||
"title": "$t(entity.track_other)",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track_other)",
|
||||
"title": "$t(entity.track, {\"count\": 2})",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track, {\"count\": 2})",
|
||||
"artistTracks": "Треки {{artist}}"
|
||||
},
|
||||
"globalSearch": {
|
||||
@@ -486,42 +567,53 @@
|
||||
"reorder": "сортировка доступна только по ID"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist_other)"
|
||||
"title": "$t(entity.playlist, {\"count\": 2})"
|
||||
},
|
||||
"albumList": {
|
||||
"title": "$t(entity.album_other)",
|
||||
"title": "$t(entity.album, {\"count\": 2})",
|
||||
"artistAlbums": "альбомы {{artist}}",
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)"
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album, {\"count\": 2})"
|
||||
},
|
||||
"albumArtistDetail": {
|
||||
"topSongs": "популярные треки",
|
||||
"viewAll": "посмотреть всё",
|
||||
"appearsOn": "появляется в",
|
||||
"viewDiscography": "посмотреть дискографию",
|
||||
"relatedArtists": "похож на $t(entity.artist_other)",
|
||||
"viewAllTracks": "посмотреть все $t(entity.track_other)",
|
||||
"relatedArtists": "похож на $t(entity.artist, {\"count\": 2})",
|
||||
"viewAllTracks": "посмотреть все $t(entity.track, {\"count\": 2})",
|
||||
"recentReleases": "недавние релизы",
|
||||
"about": "О {{artist}}",
|
||||
"topSongsFrom": "популярные треки из {{title}}"
|
||||
"topSongsFrom": "популярные треки из {{title}}",
|
||||
"groupingTypeAll": "все типы выпусков",
|
||||
"groupingTypePrimary": "основные типы выпусков"
|
||||
},
|
||||
"itemDetail": {
|
||||
"copyPath": "скопировать путь в буфер обмена",
|
||||
"openFile": "открыть трек в менеджере файлов",
|
||||
"copiedPath": "путь успешно скопирован"
|
||||
},
|
||||
"radioList": {
|
||||
"title": "радиостанции"
|
||||
},
|
||||
"windowBar": {
|
||||
"privateMode": "(Режим приватности)"
|
||||
},
|
||||
"collections": {
|
||||
"saveAsCollection": "сохранить коллекцией"
|
||||
}
|
||||
},
|
||||
"form": {
|
||||
"deletePlaylist": {
|
||||
"title": "удалить $t(entity.playlist_one)",
|
||||
"success": "$t(entity.playlist_one) успешно удалён",
|
||||
"input_confirm": "напишите название $t(entity.playlist_one) для подтверждения"
|
||||
"title": "удалить $t(entity.playlist, {\"count\": 1})",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) успешно удалён",
|
||||
"input_confirm": "напишите название $t(entity.playlist, {\"count\": 1}) для подтверждения"
|
||||
},
|
||||
"createPlaylist": {
|
||||
"input_description": "$t(common.description)",
|
||||
"title": "создать $t(entity.playlist_one)",
|
||||
"title": "создать $t(entity.playlist, {\"count\": 1})",
|
||||
"input_public": "публичный",
|
||||
"input_name": "$t(common.name)",
|
||||
"success": "$t(entity.playlist_one) успешно создан",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) успешно создан",
|
||||
"input_owner": "$t(common.owner)"
|
||||
},
|
||||
"addServer": {
|
||||
@@ -537,13 +629,18 @@
|
||||
"ignoreCors": "игнорировать CORS ($t(common.restartRequired))",
|
||||
"error_savePassword": "произошла ошибка при сохранении пароля",
|
||||
"input_preferInstantMix": "Предпочитать автоподборку",
|
||||
"input_preferInstantMixDescription": "Использовать быстрый микс только для поиска похожих композиций. Полезно, если у вас есть плагины, которые изменяют это поведение"
|
||||
"input_preferInstantMixDescription": "Использовать быстрый микс только для поиска похожих композиций. Полезно, если у вас есть плагины, которые изменяют это поведение",
|
||||
"input_preferRemoteUrl": "предпочитать публичный url",
|
||||
"input_remoteUrl": "публичный url",
|
||||
"input_remoteUrlPlaceholder": "необязательно: публичный гкд-адрес для доступа к внешним функциям"
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"success": "добавлено: $t(entity.trackWithCount, {\"count\": {{message}} }) в $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })",
|
||||
"title": "добавить в $t(entity.playlist_one)",
|
||||
"title": "добавить в $t(entity.playlist, {\"count\": 1})",
|
||||
"input_skipDuplicates": "не добавлять дубликаты",
|
||||
"input_playlists": "$t(entity.playlist_other)"
|
||||
"input_playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"create": "создать $t(entity.playlist, {\"count\": 1}) {{playlist}}",
|
||||
"searchOrCreate": "для создания нового списка выполните поиск по $t(entity.playlist, {\"count\": 2}) или введите соответствующий текст"
|
||||
},
|
||||
"updateServer": {
|
||||
"title": "обновление сервера",
|
||||
@@ -552,17 +649,22 @@
|
||||
"queryEditor": {
|
||||
"input_optionMatchAll": "сопоставить все",
|
||||
"input_optionMatchAny": "сопоставить любой",
|
||||
"title": "Редактор запросов"
|
||||
"title": "Редактор запросов",
|
||||
"addRuleGroup": "добавить группу правил",
|
||||
"removeRuleGroup": "удалить группу правил",
|
||||
"resetToDefault": "сбросить на настройки по умолчанию",
|
||||
"clearFilters": "очистить фильтры"
|
||||
},
|
||||
"lyricSearch": {
|
||||
"input_name": "$t(common.name)",
|
||||
"input_artist": "$t(entity.artist_one)",
|
||||
"input_artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"title": "поиск слов песни"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"title": "редактировать $t(entity.playlist_one)",
|
||||
"success": "$t(entity.playlist_one) обновлён успешно",
|
||||
"publicJellyfinNote": "Jellyfin по какой-то причине не предоставляет информацию о том, публичный плейлист или нет. Если вы хотите, чтобы он остался публичным, выберите следующую опцию"
|
||||
"title": "редактировать $t(entity.playlist, {\"count\": 1})",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) обновлён успешно",
|
||||
"publicJellyfinNote": "Jellyfin по какой-то причине не предоставляет информацию о том, публичный плейлист или нет. Если вы хотите, чтобы он остался публичным, выберите следующую опцию",
|
||||
"editNote": "редактирование больших плейлистов вручную не рекомендуется. Вы уверены, что готовы принять риск потери данных, который может возникнуть в результате перезаписи существующего плейлиста?"
|
||||
},
|
||||
"shareItem": {
|
||||
"success": "ссылка скопирована в буфер обмена (нажмите здесь, чтобы открыть)",
|
||||
@@ -576,6 +678,35 @@
|
||||
"enabled": "Приватный режим включен. Статус воспроизведения скрыт от внешних интеграций",
|
||||
"disabled": "Приватный режим отключен. Статус воспроизведения теперь виден внешним интеграциям",
|
||||
"title": "Приватный режим"
|
||||
},
|
||||
"largeFetchConfirmation": {
|
||||
"title": "добавить элементы в очередь",
|
||||
"description": "Это действие добавит все элементы в текущий отфильтрованный вид"
|
||||
},
|
||||
"createRadioStation": {
|
||||
"success": "радиостанция успешно создана",
|
||||
"title": "создать радиостанцию",
|
||||
"input_homepageUrl": "домашняя страница",
|
||||
"input_name": "имя",
|
||||
"input_streamUrl": "ссылка потока"
|
||||
},
|
||||
"lyricsExport": {
|
||||
"export": "экспортировать тексты песен",
|
||||
"input_synced": "экспорт синхронизированных текстов песен",
|
||||
"input_offset": "$t(setting.lyricOffset)"
|
||||
},
|
||||
"saveQueue": {
|
||||
"success": "сохранена очередь воспроизведения на сервере"
|
||||
},
|
||||
"shuffleAll": {
|
||||
"title": "Случайное воспроизведение",
|
||||
"input_limit": "сколько песен?",
|
||||
"input_minYear": "от года",
|
||||
"input_maxYear": "до года",
|
||||
"input_played": "воспроизвести фильтр",
|
||||
"input_played_optionAll": "все треки",
|
||||
"input_played_optionUnplayed": "только не игранные треки",
|
||||
"input_played_optionPlayed": "только игранные треки"
|
||||
}
|
||||
},
|
||||
"setting": {
|
||||
@@ -629,9 +760,9 @@
|
||||
"hotkey_zoomOut": "уменьшить масштаб",
|
||||
"playbackStyle_optionCrossFade": "затухание",
|
||||
"replayGainMode": "режим {{ReplayGain}}",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album_one)",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album, {\"count\": 1})",
|
||||
"replayGainMode_optionNone": "$t(common.none)",
|
||||
"replayGainMode_optionTrack": "$t(entity.track_one)",
|
||||
"replayGainMode_optionTrack": "$t(entity.track, {\"count\": 1})",
|
||||
"clearQueryCache_description": "так называемая \"мягкая очистка\" feishin: обновляются плейлисты, метаданные треков, но сохранённые тексты треков сбрасываются. настройки, учётные данные и кэшированные изображения сохраняются",
|
||||
"hotkey_favoriteCurrentSong": "добавить $t(common.currentSong) в избранное",
|
||||
"globalMediaHotkeys": "глобальные мультимедийные горячие клавиши",
|
||||
@@ -670,7 +801,6 @@
|
||||
"playButtonBehavior": "поведение кнопки воспроизведения",
|
||||
"playButtonBehavior_optionAddNext": "$t(player.addNext)",
|
||||
"playButtonBehavior_optionPlay": "$t(player.play)",
|
||||
"playerAlbumArtResolution_description": "разрешение большой версии обложки альбома в проигрывателе. при большем разрешении она выглядит более четкой, но может замедлить загрузку. по умолчанию равно 0 - устанавливает разрешение автоматически",
|
||||
"playerbarOpenDrawer": "полноэкранный переключатель по панели проигрывателя",
|
||||
"playerbarOpenDrawer_description": "позволяет перейти в полноэкранный режим воспроизведения нажатием на панель проигрывателя",
|
||||
"remotePort": "порт сервера удалённого управления",
|
||||
@@ -711,7 +841,6 @@
|
||||
"imageAspectRatio_description": "если эта опция включена, обложки будут отображаться в соответствии с их собственным соотношением сторон. для обложек не 1:1 оставшееся пространство будет пустым",
|
||||
"minimumScrobblePercentage": "минимальное время для скробблинга (в процентах)",
|
||||
"playbackStyle": "стиль воспроизведения",
|
||||
"playerAlbumArtResolution": "разрешение обложки альбома",
|
||||
"remotePassword_description": "задает пароль для сервера удалённого управления. По умолчанию эти учетные данные передаются небезопасным способом, поэтому следует использовать уникальный пароль, который вам неважен",
|
||||
"replayGainClipping_description": "Предотвращение клиппинга, вызванного {{ReplayGain}}, путём автоматического снижения усиления",
|
||||
"replayGainFallback_description": "усиление в db для применения, если у файла нет тегов {{ReplayGain}}",
|
||||
@@ -777,7 +906,28 @@
|
||||
"artistBackground": "Фоновое изображение исполнителя",
|
||||
"artistBackground_description": "Добавляет фоновое изображение для страниц исполнителя, содержащих обложку исполнителя",
|
||||
"artistBackgroundBlur": "процент размытия обложки исполнителя",
|
||||
"artistBackgroundBlur_description": "регулирует процент размытия к заднему фону исполнителя"
|
||||
"artistBackgroundBlur_description": "регулирует процент размытия к заднему фону исполнителя",
|
||||
"autoDJ_description": "автоматически добавлять похожие песни в очередь воспроизведения",
|
||||
"autoDJ_itemCount": "количество элементов",
|
||||
"autoDJ_itemCount_description": "количество элементов, которые пытаются добавить в очередь при включенной функции автоматического диджеинга",
|
||||
"autoDJ_timing": "расчетное время",
|
||||
"autoDJ_timing_description": "количество песен, оставшихся в очереди до срабатывания автоматического диджея",
|
||||
"useThemeAccentColor": "использовать цвет темы",
|
||||
"useThemeAccentColor_description": "используйте основной цвет определенный в выбранной теме вместо пользовательского акцентного цвета",
|
||||
"analyticsDisable": "Отказаться от аналитики на основе использования",
|
||||
"analyticsDisable_description": "Анонимизированные данные об использовании отправляются разработчику для улучшения приложения",
|
||||
"crossfadeStyle": "стиль перехода",
|
||||
"customCss_description": "пользовательский CSS-контент. Примечание: свойства content и remote urls не допускаются. Предварительный просмотр вашего контента показан ниже. Дополнительные поля, которые вы не задали, присутствуют из-за проверки на наличие ошибок",
|
||||
"customCss": "Пользовательский CSS",
|
||||
"customCssNotice": "Предупреждение: несмотря на некоторую очистку (запрет использования url() и content:), использование пользовательских CSS-стилей всё ещё может представлять риски, изменяя интерфейс",
|
||||
"releaseChannel_optionBeta": "Бета",
|
||||
"releaseChannel_optionLatest": "последний",
|
||||
"releaseChannel": "Тип релиза",
|
||||
"releaseChannel_description": "Выберите между стабильной или бета версией для автоматического обновления",
|
||||
"discordDisplayType_artistname": "Имя (имена) исполнителя",
|
||||
"discordDisplayType_description": "это меняет то, что вы слушаете в своем статусе",
|
||||
"discordDisplayType_songname": "имя песни",
|
||||
"discordDisplayType": "{{discord}} тип отображения"
|
||||
},
|
||||
"releaseType": {
|
||||
"secondary": {
|
||||
@@ -786,10 +936,68 @@
|
||||
"compilation": "подборка",
|
||||
"interview": "интервью",
|
||||
"remix": "ремикс",
|
||||
"live": "прямой эфир"
|
||||
"live": "прямой эфир",
|
||||
"soundtrack": "саундтрек",
|
||||
"spokenWord": "Художественная декламация",
|
||||
"audioDrama": "радиопостановка"
|
||||
},
|
||||
"primary": {
|
||||
"other": "другие"
|
||||
"other": "другие",
|
||||
"broadcast": "транслировать",
|
||||
"ep": "эп",
|
||||
"single": "сингл"
|
||||
}
|
||||
},
|
||||
"datetime": {
|
||||
"minuteShort": "м",
|
||||
"secondShort": "с",
|
||||
"hourShort": "ч",
|
||||
"dayShort": "д"
|
||||
},
|
||||
"filterOperator": {
|
||||
"after": "после",
|
||||
"afterDate": "после (дата)",
|
||||
"before": "это раньше",
|
||||
"beforeDate": "это раньше (дата)",
|
||||
"contains": "содержит",
|
||||
"endsWith": "заканчивается",
|
||||
"inPlaylist": "находится в",
|
||||
"inTheLast": "находится в последнем",
|
||||
"inTheRange": "находится в диапазоне",
|
||||
"inTheRangeDate": "находится в диапазоне (дата)",
|
||||
"is": "является",
|
||||
"isNot": "не",
|
||||
"isGreaterThan": "больше чем",
|
||||
"isLessThan": "меньше чем",
|
||||
"matchesRegex": "соответствует выражению",
|
||||
"notContains": "не содержит",
|
||||
"notInPlaylist": "не в",
|
||||
"notInTheLast": "не в последнем",
|
||||
"startsWith": "начинается с"
|
||||
},
|
||||
"queryBuilder": {
|
||||
"standardTags": "стандартные теги",
|
||||
"customTags": "пользовательские теги"
|
||||
},
|
||||
"visualizer": {
|
||||
"presets": "Пресеты",
|
||||
"selectPreset": "Выбрать Пресет",
|
||||
"applyPreset": "Применить Пресет",
|
||||
"saveAsPreset": "Сохранить пресет",
|
||||
"updatePreset": "Обновить пресет",
|
||||
"copyConfiguration": "Копировать Конфигурацию",
|
||||
"pasteConfiguration": "Вставить Конфигурацию",
|
||||
"pasteConfigurationPlaceholder": "Вставить JSON конфигурацию",
|
||||
"pasteFromClipboard": "Вставить из буфера обмена",
|
||||
"applyConfiguration": "Применить Конфигурацию",
|
||||
"configCopied": "Конфигурация скопирована в буфер обмена",
|
||||
"configCopyFailed": "Ошибка применения конфигурации",
|
||||
"configPasted": "Конфигурация успешно установлена",
|
||||
"configPasteFailed": "Ошибка применения конфигурации. Проверьте формат.",
|
||||
"configPasteReadFailed": "Ошибка чтения из буфера обмена",
|
||||
"presetName": "Название пресета",
|
||||
"presetNamePlaceholder": "Введите название пресета",
|
||||
"general": "Главная",
|
||||
"lineWidth": "Ширина линии"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,27 +1,28 @@
|
||||
{
|
||||
"action": {
|
||||
"addToFavorites": "pridať do $t(entity.favorite_other)",
|
||||
"addToPlaylist": "pridať do $t(entity.playlist_one)",
|
||||
"addToFavorites": "pridať do $t(entity.favorite, {\"count\": 2})",
|
||||
"addToPlaylist": "pridať do $t(entity.playlist, {\"count\": 1})",
|
||||
"clearQueue": "vymazať frontu",
|
||||
"createPlaylist": "vytvoriť $t(entity.playlist_one)",
|
||||
"deletePlaylist": "odstrániť $t(entity.playlist_one)",
|
||||
"createPlaylist": "vytvoriť $t(entity.playlist, {\"count\": 1})",
|
||||
"deletePlaylist": "odstrániť $t(entity.playlist, {\"count\": 1})",
|
||||
"deselectAll": "odznačiť všetko",
|
||||
"editPlaylist": "upraviť $t(entity.playlist_one)",
|
||||
"editPlaylist": "upraviť $t(entity.playlist, {\"count\": 1})",
|
||||
"goToPage": "ísť na stránku",
|
||||
"moveToNext": "prejsť na ďalší",
|
||||
"moveToBottom": "presunúť sa na spodok",
|
||||
"moveToTop": "presunúť sa navrch",
|
||||
"refresh": "$t(common.refresh)",
|
||||
"removeFromFavorites": "odstrániť z $t(entity.favorite_other)",
|
||||
"removeFromPlaylist": "odstrániť z $t(entity.playlist_one)",
|
||||
"removeFromFavorites": "odstrániť z $t(entity.favorite, {\"count\": 2})",
|
||||
"removeFromPlaylist": "odstrániť z $t(entity.playlist, {\"count\": 1})",
|
||||
"removeFromQueue": "odstrániť z fronty",
|
||||
"setRating": "ohodnotiť",
|
||||
"toggleSmartPlaylistEditor": "prepnúť $t(entity.smartPlaylist) editor",
|
||||
"viewPlaylists": "zobraziť $t(entity.playlist_other)",
|
||||
"viewPlaylists": "zobraziť $t(entity.playlist, {\"count\": 2})",
|
||||
"openIn": {
|
||||
"lastfm": "Otvoriť v Last.fm",
|
||||
"musicbrainz": "Otvoriť v MusicBrainz"
|
||||
}
|
||||
},
|
||||
"addOrRemoveFromSelection": "pridať či odstrániť z vybranie"
|
||||
},
|
||||
"common": {
|
||||
"action_one": "akcia",
|
||||
@@ -53,7 +54,7 @@
|
||||
"configure": "nastaviť",
|
||||
"confirm": "potvrdiť",
|
||||
"create": "vytvoriť",
|
||||
"currentSong": "aktuálne $t(entity.track_one)",
|
||||
"currentSong": "aktuálne $t(entity.track, {\"count\": 1})",
|
||||
"decrease": "znížiť",
|
||||
"delete": "zmazať",
|
||||
"descending": "zostupne",
|
||||
@@ -93,7 +94,7 @@
|
||||
"path": "cesta",
|
||||
"playerMustBePaused": "prehrávač musí byť pozastavený",
|
||||
"preview": "náhľad",
|
||||
"previousSong": "predchádzajúca $t(entity.track_one)",
|
||||
"previousSong": "predchádzajúca $t(entity.track, {\"count\": 1})",
|
||||
"quit": "ukončiť",
|
||||
"random": "náhodne",
|
||||
"rating": "hodnotenie",
|
||||
@@ -108,7 +109,9 @@
|
||||
"saveAndReplace": "uložiť a nahradiť",
|
||||
"saveAs": "uložiť ako",
|
||||
"search": "vyhľadať",
|
||||
"setting": "nastavenie",
|
||||
"setting_one": "nastavenie",
|
||||
"setting_few": "",
|
||||
"setting_other": "",
|
||||
"share": "zdieľať",
|
||||
"size": "veľkosť",
|
||||
"sortOrder": "poradie",
|
||||
@@ -125,10 +128,10 @@
|
||||
},
|
||||
"filter": {
|
||||
"name": "meno",
|
||||
"album": "$t(entity.album_one)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"albumCount": "$t(entity.album_other) počet",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2}) počet",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"biography": "životopis",
|
||||
"bitrate": "bitrate",
|
||||
"bpm": "bpm",
|
||||
@@ -141,7 +144,7 @@
|
||||
"duration": "dĺžka",
|
||||
"favorited": "obľúbené",
|
||||
"fromYear": "od roku",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"id": "id",
|
||||
"isCompilation": "je kompilácia",
|
||||
"isFavorited": "je obľúbený",
|
||||
@@ -182,31 +185,31 @@
|
||||
"title": "pridať server"
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"input_playlists": "$t(entity.playlist_other)",
|
||||
"input_playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"input_skipDuplicates": "preskočiť duplicity",
|
||||
"success": "$t(entity.trackWithCount, {\"count\": {{message}} }) pridané do $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })",
|
||||
"title": "pridať do $t(entity.playlist_one)"
|
||||
"title": "pridať do $t(entity.playlist, {\"count\": 1})"
|
||||
},
|
||||
"createPlaylist": {
|
||||
"input_description": "$t(common.description)",
|
||||
"input_name": "$t(common.name)",
|
||||
"input_owner": "$t(common.owner)",
|
||||
"input_public": "verejný",
|
||||
"success": "$t(entity.playlist_one) úspešne vytvorený",
|
||||
"title": "vytvoriť $t(entity.playlist_one)"
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) úspešne vytvorený",
|
||||
"title": "vytvoriť $t(entity.playlist, {\"count\": 1})"
|
||||
},
|
||||
"deletePlaylist": {
|
||||
"input_confirm": "pre potvrdenie zadajte názov $t(entity.playlist_one)",
|
||||
"success": "$t(entity.playlist_one) bol úspešne odstránený",
|
||||
"title": "odstrániť $t(entity.playlist_one)"
|
||||
"input_confirm": "pre potvrdenie zadajte názov $t(entity.playlist, {\"count\": 1})",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) bol úspešne odstránený",
|
||||
"title": "odstrániť $t(entity.playlist, {\"count\": 1})"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"publicJellyfinNote": "Jellyfin z nejakého dôvodu neinformuje, či je playlist verejný alebo nie. Ak si ho želáte ponechať ako verejný, ponechajte nasledujúci vstup ako povolený",
|
||||
"success": "$t(entity.playlist_one) úspešne aktualizovaný",
|
||||
"title": "upraviť $t(entity.playlist_one)"
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) úspešne aktualizovaný",
|
||||
"title": "upraviť $t(entity.playlist, {\"count\": 1})"
|
||||
},
|
||||
"lyricSearch": {
|
||||
"input_artist": "$t(entity.artist_one)",
|
||||
"input_artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"input_name": "$t(common.name)",
|
||||
"title": "vyhľadať text skladby"
|
||||
},
|
||||
@@ -276,7 +279,7 @@
|
||||
"playlistWithCount_one": "{{count}} playlist",
|
||||
"playlistWithCount_few": "{{count}} playlisty",
|
||||
"playlistWithCount_other": "{{count}} playlistov",
|
||||
"smartPlaylist": "smart $t(entity.playlist_one)",
|
||||
"smartPlaylist": "smart $t(entity.playlist, {\"count\": 1})",
|
||||
"track_one": "stopa",
|
||||
"track_few": "stopy",
|
||||
"track_other": "stôp",
|
||||
@@ -319,24 +322,24 @@
|
||||
"appearsOn": "vyskytuje sa na",
|
||||
"recentReleases": "posledné vydania",
|
||||
"viewDiscography": "zobraziť diskografiu",
|
||||
"relatedArtists": "súvisiaci s $t(entity.artist_other)",
|
||||
"relatedArtists": "súvisiaci s $t(entity.artist, {\"count\": 2})",
|
||||
"topSongs": "top skladby",
|
||||
"topSongsFrom": "top skladby z {{title}}",
|
||||
"viewAll": "zobraziť všetko",
|
||||
"viewAllTracks": "zobraziť všetky $t(entity.track_other)"
|
||||
"viewAllTracks": "zobraziť všetky $t(entity.track, {\"count\": 2})"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
"title": "$t(entity.albumArtist, {\"count\": 2})"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "viac od $t(entity.artist_one)",
|
||||
"moreFromArtist": "viac od $t(entity.artist, {\"count\": 1})",
|
||||
"moreFromGeneric": "viac z {{item}}",
|
||||
"released": "vydané"
|
||||
},
|
||||
"albumList": {
|
||||
"artistAlbums": "albumy {{artist}}",
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)",
|
||||
"title": "$t(entity.album_other)"
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album, {\"count\": 2})",
|
||||
"title": "$t(entity.album, {\"count\": 2})"
|
||||
},
|
||||
"appMenu": {
|
||||
"collapseSidebar": "zbaliť bočnú lištu",
|
||||
@@ -349,7 +352,7 @@
|
||||
"openBrowserDevtools": "otvoriť vývojárske nástroje prehliadača",
|
||||
"quit": "$t(common.quit)",
|
||||
"selectServer": "vybrať server",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"version": "verzia {{version}}"
|
||||
},
|
||||
"manageServers": {
|
||||
@@ -383,8 +386,8 @@
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"shareItem": "zdieľať položku",
|
||||
"showDetails": "získať informácie",
|
||||
"goToAlbum": "choď na $t(entity.album_one)",
|
||||
"goToAlbumArtist": "choď na $t(entity.albumArtist_one)"
|
||||
"goToAlbum": "choď na $t(entity.album, {\"count\": 1})",
|
||||
"goToAlbumArtist": "choď na $t(entity.albumArtist, {\"count\": 1})"
|
||||
},
|
||||
"fullscreenPlayer": {
|
||||
"config": {
|
||||
@@ -410,9 +413,9 @@
|
||||
"noLyrics": "nenašli sa žiadne texty"
|
||||
},
|
||||
"genreList": {
|
||||
"showAlbums": "zobraziť $t(entity.genre_one) $t(entity.album_other)",
|
||||
"showTracks": "zobraziť $t(entity.genre_one) $t(entity.track_other)",
|
||||
"title": "$t(entity.genre_other)"
|
||||
"showAlbums": "zobraziť $t(entity.genre, {\"count\": 1}) $t(entity.album, {\"count\": 2})",
|
||||
"showTracks": "zobraziť $t(entity.genre, {\"count\": 1}) $t(entity.track, {\"count\": 2})",
|
||||
"title": "$t(entity.genre, {\"count\": 2})"
|
||||
},
|
||||
"globalSearch": {
|
||||
"commands": {
|
||||
@@ -438,7 +441,7 @@
|
||||
"reorder": "zmena poradia povolená len pri zoradení podľa id"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist_other)"
|
||||
"title": "$t(entity.playlist, {\"count\": 2})"
|
||||
},
|
||||
"setting": {
|
||||
"advanced": "pokročilé",
|
||||
@@ -448,24 +451,24 @@
|
||||
"windowTab": "okno"
|
||||
},
|
||||
"sidebar": {
|
||||
"albumArtists": "$t(entity.albumArtist_other)",
|
||||
"albums": "$t(entity.album_other)",
|
||||
"artists": "$t(entity.artist_other)",
|
||||
"folders": "$t(entity.folder_other)",
|
||||
"genres": "$t(entity.genre_other)",
|
||||
"albumArtists": "$t(entity.albumArtist, {\"count\": 2})",
|
||||
"albums": "$t(entity.album, {\"count\": 2})",
|
||||
"artists": "$t(entity.artist, {\"count\": 2})",
|
||||
"folders": "$t(entity.folder, {\"count\": 2})",
|
||||
"genres": "$t(entity.genre, {\"count\": 2})",
|
||||
"home": "$t(common.home)",
|
||||
"myLibrary": "moja knižnica",
|
||||
"nowPlaying": "teraz hrá",
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"search": "$t(common.search)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"shared": "zdieľaný $t(entity.playlist_other)",
|
||||
"tracks": "$t(entity.track_other)"
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"shared": "zdieľaný $t(entity.playlist, {\"count\": 2})",
|
||||
"tracks": "$t(entity.track, {\"count\": 2})"
|
||||
},
|
||||
"trackList": {
|
||||
"artistTracks": "skladby {{artist}}",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track_other)",
|
||||
"title": "$t(entity.track_other)"
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track, {\"count\": 2})",
|
||||
"title": "$t(entity.track, {\"count\": 2})"
|
||||
}
|
||||
},
|
||||
"player": {
|
||||
@@ -654,8 +657,6 @@
|
||||
"playButtonBehavior_optionAddNext": "$t(player.addNext)",
|
||||
"playButtonBehavior_optionPlay": "$t(player.play)",
|
||||
"playButtonBehavior_optionPlayShuffled": "$t(player.shuffle)",
|
||||
"playerAlbumArtResolution": "rozlíšenie obrázka albumu",
|
||||
"playerAlbumArtResolution_description": "rozlíšenie zobrazenia náhľadu veľkých obrázkov albumov. pri väčšom rozlíšení budú krajšie, ale môže sa spomaliť ich načítavanie. predvolené je 0, čo znamená automatické",
|
||||
"playerbarOpenDrawer": "zobrazenie na celú obrazovku panelom prehrávača",
|
||||
"playerbarOpenDrawer_description": "umožní kliknutím na panel prehrávača prepnúť zobrazenie prehrávača na celú obrazovku",
|
||||
"remotePassword": "heslo servera vzdialeného ovládania",
|
||||
@@ -670,9 +671,9 @@
|
||||
"replayGainFallback_description": "zosilenie v db, ktoré sa aplikuje, ak súbor nemá {{ReplayGain}} štítky",
|
||||
"replayGainMode": "{{ReplayGain}} režim",
|
||||
"replayGainMode_description": "pozmení zosilenie hlasitosti podľa hodnôt {{ReplayGain}} uložených v metadátach súboru",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album_one)",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album, {\"count\": 1})",
|
||||
"replayGainMode_optionNone": "$t(common.none)",
|
||||
"replayGainMode_optionTrack": "$t(entity.track_one)",
|
||||
"replayGainMode_optionTrack": "$t(entity.track, {\"count\": 1})",
|
||||
"replayGainPreamp": "predzosilenie {{ReplayGain}} dB",
|
||||
"replayGainPreamp_description": "pozmení predzosilenie použité na hodnoty {{ReplayGain}}",
|
||||
"sampleRate": "vzorkovacia frekvencia",
|
||||
@@ -741,8 +742,8 @@
|
||||
"column": {
|
||||
"album": "album",
|
||||
"albumArtist": "interpret albumu",
|
||||
"albumCount": "$t(entity.album_other)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2})",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"biography": "životopis",
|
||||
"bitrate": "bitrate",
|
||||
"bpm": "bpm",
|
||||
@@ -752,7 +753,7 @@
|
||||
"dateAdded": "dátum pridania",
|
||||
"discNumber": "disk",
|
||||
"favorite": "obľúbené",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"lastPlayed": "posledne hraný",
|
||||
"path": "cesta",
|
||||
"playCount": "prehratí",
|
||||
@@ -760,7 +761,7 @@
|
||||
"releaseDate": "dátum vydania",
|
||||
"releaseYear": "rok",
|
||||
"size": "$t(common.size)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"songCount": "$t(entity.track, {\"count\": 2})",
|
||||
"title": "názov",
|
||||
"trackNumber": "skladba"
|
||||
},
|
||||
@@ -777,9 +778,9 @@
|
||||
},
|
||||
"label": {
|
||||
"actions": "$t(common.action_other)",
|
||||
"album": "$t(entity.album_one)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"biography": "$t(common.biography)",
|
||||
"bitrate": "$t(common.bitrate)",
|
||||
"bpm": "$t(common.bpm)",
|
||||
@@ -789,7 +790,7 @@
|
||||
"discNumber": "číslo disku",
|
||||
"duration": "$t(common.duration)",
|
||||
"favorite": "$t(common.favorite)",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"lastPlayed": "posledne prehraté",
|
||||
"note": "$t(common.note)",
|
||||
"owner": "$t(common.owner)",
|
||||
@@ -799,7 +800,7 @@
|
||||
"releaseDate": "dátum vydania",
|
||||
"rowIndex": "číslo riadku",
|
||||
"size": "$t(common.size)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"songCount": "$t(entity.track, {\"count\": 2})",
|
||||
"title": "$t(common.title)",
|
||||
"titleCombined": "$t(common.title) (kombinovaný)",
|
||||
"trackNumber": "číslo skladby",
|
||||
|
||||
@@ -1,23 +1,23 @@
|
||||
{
|
||||
"action": {
|
||||
"addToFavorites": "dodaj na $t(entity.favorite_other)",
|
||||
"addToPlaylist": "dodaj na $t(entity.playlist_one)",
|
||||
"addToFavorites": "dodaj na $t(entity.favorite, {\"count\": 2})",
|
||||
"addToPlaylist": "dodaj na $t(entity.playlist, {\"count\": 1})",
|
||||
"clearQueue": "počisti čakalno vrsto",
|
||||
"createPlaylist": "ustvari $t(entity.playlist_one)",
|
||||
"deletePlaylist": "izbriši $t(entity.playlist_one)",
|
||||
"createPlaylist": "ustvari $t(entity.playlist, {\"count\": 1})",
|
||||
"deletePlaylist": "izbriši $t(entity.playlist, {\"count\": 1})",
|
||||
"deselectAll": "odizberi vse",
|
||||
"editPlaylist": "uredi $t(entity.playlist_one)",
|
||||
"editPlaylist": "uredi $t(entity.playlist, {\"count\": 1})",
|
||||
"goToPage": "pojdi na stran",
|
||||
"moveToNext": "pojdi na naslednjo",
|
||||
"moveToBottom": "pojdi na dno",
|
||||
"moveToTop": "pojdi na vrh",
|
||||
"refresh": "$t(common.refresh)",
|
||||
"removeFromFavorites": "odstrani iz $t(entity.favorite_other)",
|
||||
"removeFromPlaylist": "odstrani iz $t(entity.playlist_one)",
|
||||
"removeFromFavorites": "odstrani iz $t(entity.favorite, {\"count\": 2})",
|
||||
"removeFromPlaylist": "odstrani iz $t(entity.playlist, {\"count\": 1})",
|
||||
"removeFromQueue": "odstrani iz čakalne vrste",
|
||||
"setRating": "nastavi oceno",
|
||||
"toggleSmartPlaylistEditor": "preklopi urejevalnik $t(entity.smartPlaylist)",
|
||||
"viewPlaylists": "poglej $t(entity.playlist_other)",
|
||||
"viewPlaylists": "poglej $t(entity.playlist, {\"count\": 2})",
|
||||
"openIn": {
|
||||
"lastfm": "Odpri v Last.fm",
|
||||
"musicbrainz": "Odpri v MusicBrainz"
|
||||
@@ -54,7 +54,7 @@
|
||||
"configure": "prilagodi",
|
||||
"confirm": "potrdi",
|
||||
"create": "ustvari",
|
||||
"currentSong": "trenutna $t(entity.track_one)",
|
||||
"currentSong": "trenutna $t(entity.track, {\"count\": 1})",
|
||||
"decrease": "zmanjšaj",
|
||||
"delete": "izbriši",
|
||||
"descending": "padajoče",
|
||||
@@ -94,7 +94,7 @@
|
||||
"path": "pot",
|
||||
"playerMustBePaused": "predvajalnik mora biti ustavljen",
|
||||
"preview": "predogled",
|
||||
"previousSong": "prejšnja $t(entity.track_one)",
|
||||
"previousSong": "prejšnja $t(entity.track, {\"count\": 1})",
|
||||
"quit": "izhod",
|
||||
"random": "naključno",
|
||||
"rating": "ocena",
|
||||
@@ -108,7 +108,10 @@
|
||||
"saveAndReplace": "shrani in zamenjaj",
|
||||
"saveAs": "shrani kot",
|
||||
"search": "išči",
|
||||
"setting": "nastavitev",
|
||||
"setting_one": "nastavitev",
|
||||
"setting_two": "",
|
||||
"setting_few": "",
|
||||
"setting_other": "",
|
||||
"share": "deli",
|
||||
"size": "velikost",
|
||||
"sortOrder": "vrstni red",
|
||||
@@ -181,7 +184,7 @@
|
||||
"playlistWithCount_two": "{{count}} seznama predvajanja",
|
||||
"playlistWithCount_few": "{{count}} seznami predvajanja",
|
||||
"playlistWithCount_other": "{{count}} seznamov predvajanja",
|
||||
"smartPlaylist": "pametni $t(entity.playlist_one)",
|
||||
"smartPlaylist": "pametni $t(entity.playlist, {\"count\": 1})",
|
||||
"track_one": "skladba",
|
||||
"track_two": "skladbi",
|
||||
"track_few": "skladbe",
|
||||
@@ -221,10 +224,10 @@
|
||||
"systemFontError": "napaka pri pridobivanju sistemskih pisav"
|
||||
},
|
||||
"filter": {
|
||||
"album": "$t(entity.album_one)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"albumCount": "število $t(entity.album_other)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"albumCount": "število $t(entity.album, {\"count\": 2})",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"biography": "biografija",
|
||||
"bitrate": "bitna hitrost",
|
||||
"bpm": "bpm",
|
||||
@@ -237,7 +240,7 @@
|
||||
"duration": "trajanje",
|
||||
"favorited": "priljubljeno",
|
||||
"fromYear": "od leta",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"id": "identifikator",
|
||||
"isCompilation": "je kompilacija",
|
||||
"isFavorited": "je dodan med priljubljene",
|
||||
@@ -279,31 +282,31 @@
|
||||
"title": "dodaj strežnik"
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"input_playlists": "$t(entity.playlist_other)",
|
||||
"input_playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"input_skipDuplicates": "preskoči duplikate",
|
||||
"success": "$t(entity.trackWithCount, {\"count\": {{message}} }) dodan v $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })",
|
||||
"title": "dodaj v $t(entity.playlist_one)"
|
||||
"title": "dodaj v $t(entity.playlist, {\"count\": 1})"
|
||||
},
|
||||
"createPlaylist": {
|
||||
"input_description": "$t(common.description)",
|
||||
"input_name": "$t(common.name)",
|
||||
"input_owner": "$t(common.owner)",
|
||||
"input_public": "javno",
|
||||
"success": "$t(entity.playlist_one) je bil uspešno ustvarjen",
|
||||
"title": "ustvari $t(entity.playlist_one)"
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) je bil uspešno ustvarjen",
|
||||
"title": "ustvari $t(entity.playlist, {\"count\": 1})"
|
||||
},
|
||||
"deletePlaylist": {
|
||||
"input_confirm": "vpišite ime $t(entity.playlist_one) za potrditev",
|
||||
"success": "$t(entity.playlist_one) uspešno izbrisan",
|
||||
"title": "izbriši $t(entity.playlist_one)"
|
||||
"input_confirm": "vpišite ime $t(entity.playlist, {\"count\": 1}) za potrditev",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) uspešno izbrisan",
|
||||
"title": "izbriši $t(entity.playlist, {\"count\": 1})"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"publicJellyfinNote": "Jellyfin ne poda informacij o tem, ali gre za javni ali zasebni seznam predvajanja. Če želite, da seznam predvajanja ostane javen, izberite naslednji vnos",
|
||||
"success": "$t(entity.playlist_one) uspešno posodobljen",
|
||||
"title": "uredi $t(entity.playlist_one)"
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) uspešno posodobljen",
|
||||
"title": "uredi $t(entity.playlist, {\"count\": 1})"
|
||||
},
|
||||
"lyricSearch": {
|
||||
"input_artist": "$t(entity.artist_one)",
|
||||
"input_artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"input_name": "$t(common.name)",
|
||||
"title": "iskanje po besedilu"
|
||||
},
|
||||
@@ -331,24 +334,24 @@
|
||||
"appearsOn": "se pojavi na",
|
||||
"recentReleases": "zadnje izdaje",
|
||||
"viewDiscography": "poglej diskografijo",
|
||||
"relatedArtists": "sorodni $t(entity.artist_other)",
|
||||
"relatedArtists": "sorodni $t(entity.artist, {\"count\": 2})",
|
||||
"topSongs": "najboljše skladbe",
|
||||
"topSongsFrom": "najboljše skladbe iz {{title}}",
|
||||
"viewAll": "poglej vse",
|
||||
"viewAllTracks": "poglej vse $t(entity.track_other)"
|
||||
"viewAllTracks": "poglej vse $t(entity.track, {\"count\": 2})"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
"title": "$t(entity.albumArtist, {\"count\": 2})"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "več od $t(entity.artist_one)",
|
||||
"moreFromArtist": "več od $t(entity.artist, {\"count\": 1})",
|
||||
"moreFromGeneric": "več iz {{item}}",
|
||||
"released": "izdano"
|
||||
},
|
||||
"albumList": {
|
||||
"artistAlbums": "albumi izvajalca {{artist}}",
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)",
|
||||
"title": "$t(entity.album_other)"
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album, {\"count\": 2})",
|
||||
"title": "$t(entity.album, {\"count\": 2})"
|
||||
},
|
||||
"appMenu": {
|
||||
"collapseSidebar": "skrij stransko vrstico",
|
||||
@@ -359,7 +362,7 @@
|
||||
"openBrowserDevtools": "odpri orodja za razvijalce brskalnika",
|
||||
"quit": "$t(common.quit)",
|
||||
"selectServer": "izberi strežnik",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"version": "verzija {{version}}"
|
||||
},
|
||||
"manageServers": {
|
||||
@@ -418,9 +421,9 @@
|
||||
"noLyrics": "ni bilo najdenih besedil"
|
||||
},
|
||||
"genreList": {
|
||||
"showAlbums": "prikaži $t(entity.genre_one) $t(entity.album_other)",
|
||||
"showTracks": "prikaži $t(entity.genre_one) $t(entity.track_other)",
|
||||
"title": "$t(entity.genre_other)"
|
||||
"showAlbums": "prikaži $t(entity.genre, {\"count\": 1}) $t(entity.album, {\"count\": 2})",
|
||||
"showTracks": "prikaži $t(entity.genre, {\"count\": 1}) $t(entity.track, {\"count\": 2})",
|
||||
"title": "$t(entity.genre, {\"count\": 2})"
|
||||
},
|
||||
"globalSearch": {
|
||||
"commands": {
|
||||
@@ -446,7 +449,7 @@
|
||||
"reorder": "preurejanje je omogočeno samo pri razvrščanju po identifikatorju"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist_other)"
|
||||
"title": "$t(entity.playlist, {\"count\": 2})"
|
||||
},
|
||||
"setting": {
|
||||
"advanced": "napredno",
|
||||
@@ -456,24 +459,24 @@
|
||||
"windowTab": "okno"
|
||||
},
|
||||
"sidebar": {
|
||||
"albumArtists": "$t(entity.albumArtist_other)",
|
||||
"albums": "$t(entity.album_other)",
|
||||
"artists": "$t(entity.artist_other)",
|
||||
"folders": "$t(entity.folder_other)",
|
||||
"genres": "$t(entity.genre_other)",
|
||||
"albumArtists": "$t(entity.albumArtist, {\"count\": 2})",
|
||||
"albums": "$t(entity.album, {\"count\": 2})",
|
||||
"artists": "$t(entity.artist, {\"count\": 2})",
|
||||
"folders": "$t(entity.folder, {\"count\": 2})",
|
||||
"genres": "$t(entity.genre, {\"count\": 2})",
|
||||
"home": "$t(common.home)",
|
||||
"myLibrary": "moja knjižnica",
|
||||
"nowPlaying": "trenutno se predvaja",
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"search": "$t(common.search)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"shared": "deljen $t(entity.playlist_other)",
|
||||
"tracks": "$t(entity.track_other)"
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"shared": "deljen $t(entity.playlist, {\"count\": 2})",
|
||||
"tracks": "$t(entity.track, {\"count\": 2})"
|
||||
},
|
||||
"trackList": {
|
||||
"artistTracks": "skladbe po {{artist}}",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track_other)",
|
||||
"title": "$t(entity.track_other)"
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track, {\"count\": 2})",
|
||||
"title": "$t(entity.track, {\"count\": 2})"
|
||||
}
|
||||
},
|
||||
"player": {
|
||||
|
||||
@@ -92,7 +92,7 @@
|
||||
"exitToTray_description": "izlazak aplikacije u sistemsku traku",
|
||||
"followLyric_description": "pomera tekst pesme na trenutnu poziciju reprodukcije",
|
||||
"hotkey_favoritePreviousSong": "omiljena $t(common.previousSong)",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album_one)",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album, {\"count\": 1})",
|
||||
"lyricOffset": "pomeraj teksta (ms)",
|
||||
"discordUpdateInterval_description": "vreme u sekundama između svakog ažuriranja (minimum 15 sekundi)",
|
||||
"fontType_optionCustom": "prilagođeni font",
|
||||
@@ -104,7 +104,7 @@
|
||||
"playbackStyle_optionCrossFade": "prelazak sa preklapanjem",
|
||||
"hotkey_rate3": "oceni sa 3 zvezdice",
|
||||
"font": "font",
|
||||
"replayGainMode_optionTrack": "$t(entity.track_one)",
|
||||
"replayGainMode_optionTrack": "$t(entity.track, {\"count\": 1})",
|
||||
"themeLight_description": "postavlja svetlu temu za aplikaciju",
|
||||
"hotkey_toggleFullScreenPlayer": "prebaci na prikaz na celom ekranu",
|
||||
"hotkey_localSearch": "pretraživanje na stranici",
|
||||
@@ -187,23 +187,23 @@
|
||||
"useSystemTheme": "koristi sistemsku temu"
|
||||
},
|
||||
"action": {
|
||||
"editPlaylist": "izmeni $t(entity.playlist_one)",
|
||||
"editPlaylist": "izmeni $t(entity.playlist, {\"count\": 1})",
|
||||
"goToPage": "idi na stranu",
|
||||
"moveToTop": "idi na vrh",
|
||||
"clearQueue": "očisti listu",
|
||||
"addToFavorites": "dodaj u $t(entity.favorite_other)",
|
||||
"addToPlaylist": "dodaj u $t(entity.playlist_one)",
|
||||
"createPlaylist": "napravi $t(entity.playlist_one)",
|
||||
"removeFromPlaylist": "ukloni iz $t(entity.playlist_one)",
|
||||
"viewPlaylists": "vidi $t(entity.playlist_other)",
|
||||
"addToFavorites": "dodaj u $t(entity.favorite, {\"count\": 2})",
|
||||
"addToPlaylist": "dodaj u $t(entity.playlist, {\"count\": 1})",
|
||||
"createPlaylist": "napravi $t(entity.playlist, {\"count\": 1})",
|
||||
"removeFromPlaylist": "ukloni iz $t(entity.playlist, {\"count\": 1})",
|
||||
"viewPlaylists": "vidi $t(entity.playlist, {\"count\": 2})",
|
||||
"refresh": "$t(common.refresh)",
|
||||
"deletePlaylist": "obriši $t(entity.playlist_one)",
|
||||
"deletePlaylist": "obriši $t(entity.playlist, {\"count\": 1})",
|
||||
"removeFromQueue": "ukloni iz liste",
|
||||
"deselectAll": "deselektuj sve",
|
||||
"moveToBottom": "idi na dno",
|
||||
"setRating": "oceni",
|
||||
"toggleSmartPlaylistEditor": "pokreni $t(entity.smartPlaylist) editor",
|
||||
"removeFromFavorites": "ukloni iz $t(entity.favorite_other)",
|
||||
"removeFromFavorites": "ukloni iz $t(entity.favorite, {\"count\": 2})",
|
||||
"openIn": {
|
||||
"lastfm": "Otvori u Last.fm",
|
||||
"musicbrainz": "Otvori u MusicBrainz"
|
||||
@@ -222,7 +222,7 @@
|
||||
"left": "levo",
|
||||
"save": "sačuvaj",
|
||||
"right": "desno",
|
||||
"currentSong": "trenutno $t(entity.track_one)",
|
||||
"currentSong": "trenutno $t(entity.track, {\"count\": 1})",
|
||||
"collapse": "sklopi",
|
||||
"trackNumber": "pesma",
|
||||
"descending": "silazno",
|
||||
@@ -252,7 +252,9 @@
|
||||
"delete": "obriši",
|
||||
"cancel": "otkaži",
|
||||
"forceRestartRequired": "restartuj da primeniš izmene… zatvori notifikaciju za restart",
|
||||
"setting": "podešavanje",
|
||||
"setting_one": "podešavanje",
|
||||
"setting_few": "",
|
||||
"setting_other": "",
|
||||
"version": "verzija",
|
||||
"title": "naziv",
|
||||
"filter_one": "filter",
|
||||
@@ -279,7 +281,7 @@
|
||||
"none": "nijedan",
|
||||
"menu": "meni",
|
||||
"restartRequired": "restart potreban",
|
||||
"previousSong": "prethodna $t(entity.track_one)",
|
||||
"previousSong": "prethodna $t(entity.track, {\"count\": 1})",
|
||||
"noResultsFromQuery": "upit je bez rezultata",
|
||||
"quit": "izađi",
|
||||
"expand": "proširi",
|
||||
@@ -316,8 +318,8 @@
|
||||
"trackNumber": "broj pesme",
|
||||
"rowIndex": "indeks reda",
|
||||
"rating": "$t(common.rating)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"album": "$t(entity.album_one)",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"note": "$t(common.note)",
|
||||
"biography": "$t(common.biography)",
|
||||
"owner": "$t(common.owner)",
|
||||
@@ -326,11 +328,11 @@
|
||||
"playCount": "broj puštanja",
|
||||
"bitrate": "$t(common.bitrate)",
|
||||
"actions": "$t(common.action_other)",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"discNumber": "disk broj",
|
||||
"favorite": "$t(common.favorite)",
|
||||
"year": "$t(common.year)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)"
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})"
|
||||
}
|
||||
},
|
||||
"column": {
|
||||
@@ -339,7 +341,7 @@
|
||||
"rating": "rejting",
|
||||
"favorite": "favorit",
|
||||
"playCount": "puštanja",
|
||||
"albumCount": "$t(entity.album_other)",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2})",
|
||||
"releaseYear": "godina",
|
||||
"lastPlayed": "zadnje puštana",
|
||||
"biography": "biografija",
|
||||
@@ -348,10 +350,10 @@
|
||||
"title": "naziv",
|
||||
"bpm": "bpm",
|
||||
"dateAdded": "datum dodavanja",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"songCount": "$t(entity.track, {\"count\": 2})",
|
||||
"trackNumber": "pesma",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"albumArtist": "album artist",
|
||||
"path": "putanja",
|
||||
"discNumber": "disk",
|
||||
@@ -394,17 +396,17 @@
|
||||
"rating": "rejting",
|
||||
"search": "pretraga",
|
||||
"bitrate": "bitrejt",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"recentlyAdded": "skorije dodata",
|
||||
"note": "notacija",
|
||||
"name": "ime",
|
||||
"dateAdded": "datum dodavanja",
|
||||
"releaseDate": "datum izdavanja",
|
||||
"albumCount": "$t(entity.album_other) albuma",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2}) albuma",
|
||||
"communityRating": "ocena zajednice",
|
||||
"path": "putanja",
|
||||
"favorited": "favoriti",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"isRecentlyPlayed": "je skorije puštana",
|
||||
"isFavorited": "je favorit",
|
||||
"bpm": "bpm",
|
||||
@@ -413,7 +415,7 @@
|
||||
"disc": "disk",
|
||||
"biography": "biografija",
|
||||
"songCount": "broj pesama",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"duration": "trajanje",
|
||||
"isPublic": "je javna",
|
||||
"random": "nasumično",
|
||||
@@ -421,22 +423,22 @@
|
||||
"toYear": "do godine",
|
||||
"fromYear": "iz godine",
|
||||
"criticRating": "ocena kritičara",
|
||||
"album": "$t(entity.album_one)",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"trackNumber": "pesma"
|
||||
},
|
||||
"page": {
|
||||
"sidebar": {
|
||||
"nowPlaying": "trenutno pušta",
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"search": "$t(common.search)",
|
||||
"tracks": "$t(entity.track_other)",
|
||||
"albums": "$t(entity.album_other)",
|
||||
"genres": "$t(entity.genre_other)",
|
||||
"folders": "$t(entity.folder_other)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"tracks": "$t(entity.track, {\"count\": 2})",
|
||||
"albums": "$t(entity.album, {\"count\": 2})",
|
||||
"genres": "$t(entity.genre, {\"count\": 2})",
|
||||
"folders": "$t(entity.folder, {\"count\": 2})",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"home": "$t(common.home)",
|
||||
"artists": "$t(entity.artist_other)",
|
||||
"albumArtists": "$t(entity.albumArtist_other)"
|
||||
"artists": "$t(entity.artist, {\"count\": 2})",
|
||||
"albumArtists": "$t(entity.albumArtist, {\"count\": 2})"
|
||||
},
|
||||
"fullscreenPlayer": {
|
||||
"config": {
|
||||
@@ -459,7 +461,7 @@
|
||||
"appMenu": {
|
||||
"selectServer": "izaberi server",
|
||||
"version": "verzija {{version}}",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"manageServers": "upravljaj serverima",
|
||||
"expandSidebar": "proširi bočnu traku",
|
||||
"collapseSidebar": "skloni bočnu traku",
|
||||
@@ -494,7 +496,7 @@
|
||||
"recentlyPlayed": "nedavno puštane pesme"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "još od ovog $t(entity.artist_one)",
|
||||
"moreFromArtist": "još od ovog $t(entity.artist, {\"count\": 1})",
|
||||
"moreFromGeneric": "još od {{item}}"
|
||||
},
|
||||
"setting": {
|
||||
@@ -504,13 +506,13 @@
|
||||
"windowTab": "prozor"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
"title": "$t(entity.albumArtist, {\"count\": 2})"
|
||||
},
|
||||
"genreList": {
|
||||
"title": "$t(entity.genre_other)"
|
||||
"title": "$t(entity.genre, {\"count\": 2})"
|
||||
},
|
||||
"trackList": {
|
||||
"title": "$t(entity.track_other)"
|
||||
"title": "$t(entity.track, {\"count\": 2})"
|
||||
},
|
||||
"globalSearch": {
|
||||
"commands": {
|
||||
@@ -521,24 +523,24 @@
|
||||
"title": "komande"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist_other)"
|
||||
"title": "$t(entity.playlist, {\"count\": 2})"
|
||||
},
|
||||
"albumList": {
|
||||
"title": "$t(entity.album_other)"
|
||||
"title": "$t(entity.album, {\"count\": 2})"
|
||||
}
|
||||
},
|
||||
"form": {
|
||||
"deletePlaylist": {
|
||||
"title": "obriši $t(entity.playlist_one)",
|
||||
"success": "$t(entity.playlist_one) uspešno obrisan",
|
||||
"input_confirm": "unesite ime $t(entity.playlist_one) za potvrdu"
|
||||
"title": "obriši $t(entity.playlist, {\"count\": 1})",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) uspešno obrisan",
|
||||
"input_confirm": "unesite ime $t(entity.playlist, {\"count\": 1}) za potvrdu"
|
||||
},
|
||||
"createPlaylist": {
|
||||
"input_description": "$t(common.description)",
|
||||
"title": "kreiraj $t(entity.playlist_one)",
|
||||
"title": "kreiraj $t(entity.playlist, {\"count\": 1})",
|
||||
"input_public": "javno",
|
||||
"input_name": "$t(common.name)",
|
||||
"success": "$t(entity.playlist_one) uspešno kreiran",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) uspešno kreiran",
|
||||
"input_owner": "$t(common.owner)"
|
||||
},
|
||||
"addServer": {
|
||||
@@ -555,10 +557,10 @@
|
||||
"error_savePassword": "došlo je do greške prilikom pokušaja čuvanja lozinke"
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"success": "dodato {{message}} $t(entity.track_other) u {{numOfPlaylists}} $t(entity.playlist_other)",
|
||||
"title": "dodaj u $t(entity.playlist_one)",
|
||||
"success": "dodato {{message}} $t(entity.track, {\"count\": 2}) u {{numOfPlaylists}} $t(entity.playlist, {\"count\": 2})",
|
||||
"title": "dodaj u $t(entity.playlist, {\"count\": 1})",
|
||||
"input_skipDuplicates": "preskoči duplikate",
|
||||
"input_playlists": "$t(entity.playlist_other)"
|
||||
"input_playlists": "$t(entity.playlist, {\"count\": 2})"
|
||||
},
|
||||
"updateServer": {
|
||||
"title": "ažuriraj server",
|
||||
@@ -570,11 +572,11 @@
|
||||
},
|
||||
"lyricSearch": {
|
||||
"input_name": "$t(common.name)",
|
||||
"input_artist": "$t(entity.artist_one)",
|
||||
"input_artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"title": "pretraga teksta pesme"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"title": "izmeni $t(entity.playlist_one)"
|
||||
"title": "izmeni $t(entity.playlist, {\"count\": 1})"
|
||||
}
|
||||
},
|
||||
"entity": {
|
||||
@@ -614,7 +616,7 @@
|
||||
"folder_one": "folder",
|
||||
"folder_few": "foldera",
|
||||
"folder_other": "foldera",
|
||||
"smartPlaylist": "pametna $t(entity.playlist_one)",
|
||||
"smartPlaylist": "pametna $t(entity.playlist, {\"count\": 1})",
|
||||
"album_one": "album",
|
||||
"album_few": "albumi",
|
||||
"album_other": "albuma",
|
||||
|
||||
@@ -1,22 +1,22 @@
|
||||
{
|
||||
"action": {
|
||||
"editPlaylist": "redigera $t(entity.playlist_one)",
|
||||
"editPlaylist": "redigera $t(entity.playlist, {\"count\": 1})",
|
||||
"goToPage": "gå till sida",
|
||||
"moveToTop": "flytta till toppen",
|
||||
"clearQueue": "rensa kö",
|
||||
"addToFavorites": "lägg till $t(entity.favorite_other)",
|
||||
"addToPlaylist": "lägg till $t(entity.playlist_one)",
|
||||
"createPlaylist": "skapa $t(entity.playlist_one)",
|
||||
"removeFromPlaylist": "ta bort från $t(entity.playlist_one)",
|
||||
"viewPlaylists": "visa $t(entity.playlist_other)",
|
||||
"addToFavorites": "lägg till $t(entity.favorite, {\"count\": 2})",
|
||||
"addToPlaylist": "lägg till $t(entity.playlist, {\"count\": 1})",
|
||||
"createPlaylist": "skapa $t(entity.playlist, {\"count\": 1})",
|
||||
"removeFromPlaylist": "ta bort från $t(entity.playlist, {\"count\": 1})",
|
||||
"viewPlaylists": "visa $t(entity.playlist, {\"count\": 2})",
|
||||
"refresh": "$t(common.refresh)",
|
||||
"deletePlaylist": "ta bort $t(entity.playlist_one)",
|
||||
"deletePlaylist": "ta bort $t(entity.playlist, {\"count\": 1})",
|
||||
"removeFromQueue": "ta bort från kö",
|
||||
"deselectAll": "avmarkera alla",
|
||||
"moveToBottom": "flytta till botten",
|
||||
"setRating": "sätt betyg",
|
||||
"toggleSmartPlaylistEditor": "växla $t(entity.smartPlaylist) redigerare",
|
||||
"removeFromFavorites": "ta bort från $t(entity.favorite_other)",
|
||||
"removeFromFavorites": "ta bort från $t(entity.favorite, {\"count\": 2})",
|
||||
"downloadStarted": "startade nedladdning av {{count}} objekt",
|
||||
"moveToNext": "flytta till nästa",
|
||||
"moveUp": "flytta upp",
|
||||
@@ -32,8 +32,12 @@
|
||||
"lastfm": "Öppna i Last.fm",
|
||||
"musicbrainz": "Öppna i MusicBrainz"
|
||||
},
|
||||
"createRadioStation": "skapa $t(entity.radioStation_one)",
|
||||
"deleteRadioStation": "ta bort $t(entity.radioStation_one)"
|
||||
"createRadioStation": "skapa $t(entity.radioStation, {\"count\": 1})",
|
||||
"deleteRadioStation": "ta bort $t(entity.radioStation, {\"count\": 1})",
|
||||
"addOrRemoveFromSelection": "lägg till eller ta bort från markerade",
|
||||
"selectRangeOfItems": "välj en mängd objekt",
|
||||
"selectAll": "markera alla",
|
||||
"openApplicationDirectory": "öppna applikationskatalog"
|
||||
},
|
||||
"common": {
|
||||
"backward": "bakåt",
|
||||
@@ -48,7 +52,7 @@
|
||||
"left": "vänster",
|
||||
"save": "spara",
|
||||
"right": "höger",
|
||||
"currentSong": "aktuell $t(entity.track_one)",
|
||||
"currentSong": "aktuell $t(entity.track, {\"count\": 1})",
|
||||
"collapse": "kollaps",
|
||||
"trackNumber": "spår",
|
||||
"descending": "fallande",
|
||||
@@ -77,7 +81,8 @@
|
||||
"delete": "ta bort",
|
||||
"cancel": "avbryt",
|
||||
"forceRestartRequired": "starta om för att tillämpa ändringar... Stäng meddelandet för att starta om",
|
||||
"setting": "inställning",
|
||||
"setting_one": "inställning",
|
||||
"setting_other": "",
|
||||
"version": "version",
|
||||
"title": "titel",
|
||||
"filter_one": "filter",
|
||||
@@ -101,7 +106,7 @@
|
||||
"none": "ingen",
|
||||
"menu": "meny",
|
||||
"restartRequired": "omstart krävs",
|
||||
"previousSong": "föregående $t(entity.track_one)",
|
||||
"previousSong": "föregående $t(entity.track, {\"count\": 1})",
|
||||
"noResultsFromQuery": "frågan returnerade inga resultat",
|
||||
"quit": "avsluta",
|
||||
"expand": "expandera",
|
||||
@@ -143,7 +148,8 @@
|
||||
"clean": "städad",
|
||||
"gridRows": "rutnätsrader",
|
||||
"tableColumns": "tabellkolumner",
|
||||
"itemsMore": "{{count}} fler"
|
||||
"itemsMore": "{{count}} fler",
|
||||
"countSelected": "{{count}} markerade"
|
||||
},
|
||||
"error": {
|
||||
"remotePortWarning": "starta om servern för att tillämpa den nya porten",
|
||||
@@ -166,7 +172,12 @@
|
||||
"invalidServer": "ogiltig server",
|
||||
"loginRateError": "för många inloggningsförsök, försök igen om några sekunder",
|
||||
"badAlbum": "du ser denna sidan eftersom denna låten inte är en del av ett album. du ser troligtvis detta problemet för att du har en låt på toppnivån i din musikmapp. Jellyfin grupperar bara låtar om de finns i en mapp",
|
||||
"badValue": "felaktigt alternativ \"{{value}}\". detta värde existerar inte längre"
|
||||
"badValue": "felaktigt alternativ \"{{value}}\". detta värde existerar inte längre",
|
||||
"multipleServerSaveQueueError": "spelningskön har en eller flera låtar som inte är från den nuvarande valda servern. detta är inte stöttat",
|
||||
"networkError": "en nätverksfel uppstod",
|
||||
"notificationDenied": "åtkomst till notifieringarna var nekad. inställningen har ingen verkan",
|
||||
"openError": "kunde inte öppna filen",
|
||||
"settingsSyncError": "diskrepans hittades mellan inställningarna för renderingsprocessen och huvudprocessen. starta om applikationen för att ändringarna ska tillämpas"
|
||||
},
|
||||
"filter": {
|
||||
"mostPlayed": "mest spelade",
|
||||
@@ -182,7 +193,7 @@
|
||||
"rating": "betyg",
|
||||
"search": "sök",
|
||||
"bitrate": "bithastighet",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"recentlyAdded": "nyligen tillagda",
|
||||
"note": "anteckning",
|
||||
"name": "namn",
|
||||
@@ -191,7 +202,7 @@
|
||||
"communityRating": "betyg från communityn",
|
||||
"path": "sökväg",
|
||||
"favorited": "favoritmärkt",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"isRecentlyPlayed": "spelas nyligen",
|
||||
"isFavorited": "är favoritmärkt",
|
||||
"bpm": "bpm",
|
||||
@@ -199,30 +210,32 @@
|
||||
"id": "id",
|
||||
"disc": "skiva",
|
||||
"biography": "biografi",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"duration": "längd",
|
||||
"isPublic": "är offentlig",
|
||||
"random": "slumpmässig",
|
||||
"lastPlayed": "senast spelad",
|
||||
"toYear": "till år",
|
||||
"fromYear": "från år",
|
||||
"album": "$t(entity.album_one)",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"trackNumber": "spår",
|
||||
"songCount": "sångräkning",
|
||||
"criticRating": "kritikerbetyg"
|
||||
"criticRating": "kritikerbetyg",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2}) antal",
|
||||
"explicitStatus": "$t(common.explicitStatus)"
|
||||
},
|
||||
"form": {
|
||||
"deletePlaylist": {
|
||||
"title": "ta bort $t(entity.playlist_one)",
|
||||
"success": "$t(entity.playlist_one) har tagits bort",
|
||||
"input_confirm": "Skriv namnet på $t(entity.playlist_one) för att bekräfta"
|
||||
"title": "ta bort $t(entity.playlist, {\"count\": 1})",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) har tagits bort",
|
||||
"input_confirm": "Skriv namnet på $t(entity.playlist, {\"count\": 1}) för att bekräfta"
|
||||
},
|
||||
"createPlaylist": {
|
||||
"input_description": "$t(common.description)",
|
||||
"title": "skapa $t(entity.playlist_one)",
|
||||
"title": "skapa $t(entity.playlist, {\"count\": 1})",
|
||||
"input_public": "offentlig",
|
||||
"input_name": "$t(common.name)",
|
||||
"success": "$t(entity.playlist_one) skapad",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) skapad",
|
||||
"input_owner": "$t(common.owner)"
|
||||
},
|
||||
"addServer": {
|
||||
@@ -236,13 +249,17 @@
|
||||
"input_savePassword": "spara lösenord",
|
||||
"ignoreSsl": "ignorera ssl ($t(common.restartRequired))",
|
||||
"ignoreCors": "ignorera cors ($t(common.restartRequired))",
|
||||
"error_savePassword": "ett fel uppstod när lösenordet skulle sparas"
|
||||
"error_savePassword": "ett fel uppstod när lösenordet skulle sparas",
|
||||
"input_preferInstantMix": "föredra instant mixning",
|
||||
"input_preferInstantMixDescription": "använd bara instant mixning för att få liknande låtar. användbar om du har plugin för att förändra detta beteendet"
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"success": "tillade {{message}} $t(entity.track_other) til {{numOfPlaylists}} $t(entity.playlist_other)",
|
||||
"title": "lägg till i $t(entity.playlist_one)",
|
||||
"success": "lade till $t(entity.trackWithCount, {\"count\": {{message}} }) till $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })",
|
||||
"title": "lägg till i $t(entity.playlist, {\"count\": 1})",
|
||||
"input_skipDuplicates": "hoppa över dubbletter",
|
||||
"input_playlists": "$t(entity.playlist_other)"
|
||||
"input_playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"create": "skapa $t(entity.playlist, {\"count\": 1}) {{playlist}}",
|
||||
"searchOrCreate": "sök $t(entity.playlist, {\"count\": 2}) eller skriv för att skapa en ny"
|
||||
},
|
||||
"updateServer": {
|
||||
"title": "uppdatera server",
|
||||
@@ -254,11 +271,23 @@
|
||||
},
|
||||
"lyricSearch": {
|
||||
"input_name": "$t(common.name)",
|
||||
"input_artist": "$t(entity.artist_one)",
|
||||
"input_artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"title": "sångtext sök"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"title": "redigera $t(entity.playlist_one)"
|
||||
"title": "redigera $t(entity.playlist, {\"count\": 1})",
|
||||
"publicJellyfinNote": "Jellyfin visar av någon anledning inte om en spellista är publik eller inte. Om du önskar att denna ska förbli publik, så får du ha följande indata markerade"
|
||||
},
|
||||
"largeFetchConfirmation": {
|
||||
"title": "lägg till objekt till kön",
|
||||
"description": "Åtgärden kommer att lägga till alla objekt till den nuvarande filtrerade vyn"
|
||||
},
|
||||
"createRadioStation": {
|
||||
"success": "radiostation skapades",
|
||||
"title": "skapa radiostation",
|
||||
"input_homepageUrl": "hemside-URL",
|
||||
"input_name": "namn",
|
||||
"input_streamUrl": "stream url"
|
||||
}
|
||||
},
|
||||
"page": {
|
||||
@@ -281,7 +310,7 @@
|
||||
"appMenu": {
|
||||
"selectServer": "välj server",
|
||||
"version": "version {{version}}",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"manageServers": "hantera servrar",
|
||||
"expandSidebar": "expandera sidofältet",
|
||||
"openBrowserDevtools": "öppna webbläsarens utvecklingsverktyg",
|
||||
@@ -306,17 +335,27 @@
|
||||
"addFavorite": "$t(action.addToFavorites)",
|
||||
"play": "$t(player.play)",
|
||||
"numberSelected": "{{count}} vald",
|
||||
"removeFromQueue": "$t(action.removeFromQueue)"
|
||||
"removeFromQueue": "$t(action.removeFromQueue)",
|
||||
"download": "ladda ner",
|
||||
"moveItems": "$t(action.moveItems)",
|
||||
"moveToNext": "$t(action.moveToNext)",
|
||||
"playSimilarSongs": "$t(player.playSimilarSongs)",
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"shareItem": "dela objekt",
|
||||
"goTo": "gå till",
|
||||
"goToAlbum": "gå till $t(entity.album, {\"count\": 1})",
|
||||
"goToAlbumArtist": "gå till $t(entity.albumArtist, {\"count\": 1})",
|
||||
"showDetails": "hämta information"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "mer från $t(entity.artist_one)",
|
||||
"moreFromArtist": "mer från $t(entity.artist, {\"count\": 1})",
|
||||
"moreFromGeneric": "mer från {{item}}"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
"title": "$t(entity.albumArtist, {\"count\": 2})"
|
||||
},
|
||||
"albumList": {
|
||||
"title": "$t(entity.album_other)"
|
||||
"title": "$t(entity.album, {\"count\": 2})"
|
||||
},
|
||||
"sidebar": {
|
||||
"nowPlaying": "nu spelas"
|
||||
@@ -340,6 +379,12 @@
|
||||
"searchFor": "sök efter {{query}}"
|
||||
},
|
||||
"title": "kommandon"
|
||||
},
|
||||
"manageServers": {
|
||||
"url": "URL",
|
||||
"username": "användarnamn",
|
||||
"editServerDetailsTooltip": "redigera serverinställningar",
|
||||
"removeServer": "ta bort server"
|
||||
}
|
||||
},
|
||||
"entity": {
|
||||
@@ -375,7 +420,7 @@
|
||||
"genreWithCount_other": "{{count}} genrer",
|
||||
"play_one": "{{count}} spelning",
|
||||
"play_other": "{{count}} spelningar",
|
||||
"smartPlaylist": "smart $t(entity.playlist_one)",
|
||||
"smartPlaylist": "smart $t(entity.playlist, {\"count\": 1})",
|
||||
"song_one": "låt",
|
||||
"song_other": "låtar",
|
||||
"radioStation_one": "radiostation",
|
||||
@@ -405,5 +450,32 @@
|
||||
"queue_moveToBottom": "flytta markerad till toppen",
|
||||
"addLast": "lägg till sist",
|
||||
"mute": "muta"
|
||||
},
|
||||
"datetime": {
|
||||
"minuteShort": "min",
|
||||
"secondShort": "sek",
|
||||
"hourShort": "h",
|
||||
"dayShort": "dag"
|
||||
},
|
||||
"filterOperator": {
|
||||
"after": "är efter",
|
||||
"afterDate": "är efter (datum)",
|
||||
"before": "är före",
|
||||
"beforeDate": "är före (datum)",
|
||||
"contains": "innehåller",
|
||||
"endsWith": "slutar med",
|
||||
"inPlaylist": "är inom",
|
||||
"inTheLast": "är i den sista",
|
||||
"inTheRange": "är i spannet",
|
||||
"inTheRangeDate": "är i spannet (datum)",
|
||||
"is": "är",
|
||||
"isNot": "är inte",
|
||||
"isGreaterThan": "är större än",
|
||||
"isLessThan": "är mindre än",
|
||||
"matchesRegex": "matchar regex",
|
||||
"notContains": "innehåller inte",
|
||||
"notInPlaylist": "är inte inom",
|
||||
"notInTheLast": "är inte inom den sista",
|
||||
"startsWith": "startar med"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,22 +1,22 @@
|
||||
{
|
||||
"action": {
|
||||
"addToFavorites": "$t(entity.favorite_other) இல் சேர்க்கவும்",
|
||||
"addToFavorites": "$t(entity.favorite, {\"count\": 2}) இல் சேர்க்கவும்",
|
||||
"clearQueue": "தெளிவான வரிசை",
|
||||
"goToPage": "பக்கத்திற்குச் செல்லுங்கள்",
|
||||
"moveToBottom": "கீழே செல்லுங்கள்",
|
||||
"moveToTop": "மேலே செல்லுங்கள்",
|
||||
"refresh": "$t(common.refresh)",
|
||||
"removeFromFavorites": "$t(entity.favorite_other)இலிருந்து அகற்று",
|
||||
"removeFromPlaylist": "$t(entity.playlist_one) இலிருந்து அகற்று",
|
||||
"removeFromFavorites": "$t(entity.favorite, {\"count\": 2})இலிருந்து அகற்று",
|
||||
"removeFromPlaylist": "$t(entity.playlist, {\"count\": 1}) இலிருந்து அகற்று",
|
||||
"removeFromQueue": "வரிசையிலிருந்து அகற்று",
|
||||
"setRating": "மதிப்பீட்டை அமைக்கவும்",
|
||||
"toggleSmartPlaylistEditor": "மாற்று $t(entity.smartPlaylist) ஆசிரியர்",
|
||||
"viewPlaylists": "$t(entity.playlist_other) காண்க",
|
||||
"addToPlaylist": "$t(entity.playlist_one)இல் சேர்க்கவும்",
|
||||
"createPlaylist": "$t(entity.playlist_one)ஐ உருவாக்கவும்",
|
||||
"deletePlaylist": "$t(entity.playlist_one)ஐ நீக்கு",
|
||||
"viewPlaylists": "$t(entity.playlist, {\"count\": 2}) காண்க",
|
||||
"addToPlaylist": "$t(entity.playlist, {\"count\": 1})இல் சேர்க்கவும்",
|
||||
"createPlaylist": "$t(entity.playlist, {\"count\": 1})ஐ உருவாக்கவும்",
|
||||
"deletePlaylist": "$t(entity.playlist, {\"count\": 1})ஐ நீக்கு",
|
||||
"deselectAll": "அனைத்தையும் தேர்வு செய்யுங்கள்",
|
||||
"editPlaylist": "திருத்து $t(entity.playlist_one)",
|
||||
"editPlaylist": "திருத்து $t(entity.playlist, {\"count\": 1})",
|
||||
"moveToNext": "அடுத்து செல்லுங்கள்",
|
||||
"openIn": {
|
||||
"lastfm": "Last.fm இல் திறந்திருக்கும்",
|
||||
@@ -33,7 +33,7 @@
|
||||
"configure": "உள்ளமைக்கவும்",
|
||||
"confirm": "உறுதிப்படுத்தவும்",
|
||||
"create": "உருவாக்கு",
|
||||
"currentSong": "தற்போதைய $t(entity.track_one)",
|
||||
"currentSong": "தற்போதைய $t(entity.track, {\"count\": 1})",
|
||||
"decrease": "குறைவு",
|
||||
"action_one": "செயல்",
|
||||
"action_other": "செயல்கள்",
|
||||
@@ -87,7 +87,7 @@
|
||||
"path": "பாதை",
|
||||
"playerMustBePaused": "வீரர் இடைநிறுத்தப்பட வேண்டும்",
|
||||
"preview": "முன்னோட்டம்",
|
||||
"previousSong": "முந்தைய $t(entity.track_one)",
|
||||
"previousSong": "முந்தைய $t(entity.track, {\"count\": 1})",
|
||||
"quit": "வெளியேறு",
|
||||
"random": "சீரற்ற",
|
||||
"rating": "செயல்வரம்பு",
|
||||
@@ -100,7 +100,8 @@
|
||||
"save": "சேமி",
|
||||
"saveAndReplace": "சேமித்து மாற்றவும்",
|
||||
"search": "தேடல்",
|
||||
"setting": "அமைத்தல்",
|
||||
"setting_one": "அமைத்தல்",
|
||||
"setting_other": "",
|
||||
"share": "பங்கு",
|
||||
"size": "அளவு",
|
||||
"sortOrder": "ஒழுங்கு",
|
||||
@@ -149,7 +150,7 @@
|
||||
"play_other": "{{count}} நாடகங்கள்",
|
||||
"playlistWithCount_one": "{{count}} பிளேலிச்ட்",
|
||||
"playlistWithCount_other": "{{count}} பிளேலிச்ட்கள்",
|
||||
"smartPlaylist": "அறிவுள்ள $t(entity.playlist_one)",
|
||||
"smartPlaylist": "அறிவுள்ள $t(entity.playlist, {\"count\": 1})",
|
||||
"track_one": "மின்தடம்",
|
||||
"track_other": "தடங்கள்",
|
||||
"song_one": "பாடல்",
|
||||
@@ -184,9 +185,9 @@
|
||||
"notificationDenied": "அறிவிப்புகளுக்கான அனுமதிகள் மறுக்கப்பட்டன. இந்த அமைப்பு எந்த விளைவையும் ஏற்படுத்தாது"
|
||||
},
|
||||
"filter": {
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"albumCount": "$t(entity.album_other) எண்ணிக்கை",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2}) எண்ணிக்கை",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"biography": "சுயசரிதை",
|
||||
"bitrate": "பிட்ரேட்",
|
||||
"bpm": "பிபிஎம்",
|
||||
@@ -197,14 +198,14 @@
|
||||
"playCount": "விளையாட்டு எண்ணிக்கை",
|
||||
"random": "சீரற்ற",
|
||||
"rating": "செயல்வரம்பு",
|
||||
"album": "$t(entity.album_one)",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"criticRating": "விமர்சகர் மதிப்பீடு",
|
||||
"dateAdded": "தேதி சேர்க்கப்பட்டது",
|
||||
"disc": "வட்டு",
|
||||
"duration": "காலம்",
|
||||
"favorited": "பிடித்தது",
|
||||
"fromYear": "ஆண்டு முதல்",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"id": "ஐடி",
|
||||
"isCompilation": "தொகுப்பு",
|
||||
"isFavorited": "பிடித்தது",
|
||||
@@ -242,17 +243,17 @@
|
||||
"title": "சேவையகத்தைச் சேர்க்கவும்"
|
||||
},
|
||||
"deletePlaylist": {
|
||||
"input_confirm": "உறுதிப்படுத்த $t(entity.playlist_one) பெயரைத் தட்டச்சு செய்க",
|
||||
"success": "$t(entity.playlist_one) வெற்றிகரமாக நீக்கப்பட்டது",
|
||||
"title": "$t(entity.playlist_one)ஐ நீக்கு"
|
||||
"input_confirm": "உறுதிப்படுத்த $t(entity.playlist, {\"count\": 1}) பெயரைத் தட்டச்சு செய்க",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) வெற்றிகரமாக நீக்கப்பட்டது",
|
||||
"title": "$t(entity.playlist, {\"count\": 1})ஐ நீக்கு"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"title": "திருத்து $t(entity.playlist_one)",
|
||||
"title": "திருத்து $t(entity.playlist, {\"count\": 1})",
|
||||
"publicJellyfinNote": "சில காரணங்களால் செல்லிஃபின் ஒரு பிளேலிச்ட் பொதுவில் இல்லையா என்பதை அம்பலப்படுத்தவில்லை. இது பொதுவில் இருக்க விரும்பினால், தயவுசெய்து பின்வரும் உள்ளீட்டைத் தேர்ந்தெடுக்கவும்",
|
||||
"success": "$t(entity.playlist_one) வெற்றிகரமாகப் புதுப்பிக்கப்பட்டது"
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) வெற்றிகரமாகப் புதுப்பிக்கப்பட்டது"
|
||||
},
|
||||
"lyricSearch": {
|
||||
"input_artist": "$t(entity.artist_one)",
|
||||
"input_artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"input_name": "$t(common.name)",
|
||||
"title": "பாடல் தேடல்"
|
||||
},
|
||||
@@ -270,18 +271,18 @@
|
||||
"createFailed": "பங்கை உருவாக்கத் தவறிவிட்டது (பகிர்வு இயக்கப்பட்டதா?)"
|
||||
},
|
||||
"createPlaylist": {
|
||||
"success": "$t(entity.playlist_one) வெற்றிகரமாக உருவாக்கப்பட்டது",
|
||||
"title": "$t(entity.playlist_one) ஐ உருவாக்கவும்",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) வெற்றிகரமாக உருவாக்கப்பட்டது",
|
||||
"title": "$t(entity.playlist, {\"count\": 1}) ஐ உருவாக்கவும்",
|
||||
"input_description": "$t(common.description)",
|
||||
"input_name": "$t(common.name)",
|
||||
"input_owner": "$t(common.owner)",
|
||||
"input_public": "பொது"
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"input_playlists": "$t(entity.playlist_other)",
|
||||
"input_playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"input_skipDuplicates": "நகல்களைத் தவிர்க்கவும்",
|
||||
"success": "$t(entity.trackWithCount, {\"count\": {{message}} }) இதற்கு $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} }) சேர்க்கப்பட்டது",
|
||||
"title": "$t(entity.playlist_one) இல் சேர்"
|
||||
"title": "$t(entity.playlist, {\"count\": 1}) இல் சேர்"
|
||||
},
|
||||
"updateServer": {
|
||||
"success": "சேவையகம் வெற்றிகரமாக புதுப்பிக்கப்பட்டது",
|
||||
@@ -295,8 +296,8 @@
|
||||
"recentReleases": "அண்மைக் கால வெளியீடுகள்",
|
||||
"viewDiscography": "டிச்கோகிராஃபி காண்க",
|
||||
"topSongs": "சிறந்த பாடல்கள்",
|
||||
"viewAllTracks": "அனைத்தையும் காண்க $t(entity.track_other)",
|
||||
"relatedArtists": "தொடர்புடைய $t(entity.artist_other)",
|
||||
"viewAllTracks": "அனைத்தையும் காண்க $t(entity.track, {\"count\": 2})",
|
||||
"relatedArtists": "தொடர்புடைய $t(entity.artist, {\"count\": 2})",
|
||||
"topSongsFrom": "{{title}} இலிருந்து சிறந்த பாடல்கள்",
|
||||
"viewAll": "அனைத்தையும் காண்க"
|
||||
},
|
||||
@@ -309,7 +310,7 @@
|
||||
"openBrowserDevtools": "திறந்த உலாவி தேவ்டூல்கள்",
|
||||
"quit": "$t(common.quit)",
|
||||
"selectServer": "சேவையகத்தைத் தேர்ந்தெடுக்கவும்",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"version": "பதிப்பு {{version}}"
|
||||
},
|
||||
"manageServers": {
|
||||
@@ -368,9 +369,9 @@
|
||||
"related": "தொடர்புடைய"
|
||||
},
|
||||
"genreList": {
|
||||
"showAlbums": "காட்டு $t(entity.genre_one) $t(entity.album_other)",
|
||||
"showTracks": "காட்டு $t(entity.genre_one) $t(entity.track_other)",
|
||||
"title": "$t(entity.genre_other)"
|
||||
"showAlbums": "காட்டு $t(entity.genre, {\"count\": 1}) $t(entity.album, {\"count\": 2})",
|
||||
"showTracks": "காட்டு $t(entity.genre, {\"count\": 1}) $t(entity.track, {\"count\": 2})",
|
||||
"title": "$t(entity.genre, {\"count\": 2})"
|
||||
},
|
||||
"globalSearch": {
|
||||
"commands": {
|
||||
@@ -396,7 +397,7 @@
|
||||
"reorder": "ஐடியால் வரிசைப்படுத்தும்போது மட்டுமே மறுசீரமைப்பு இயக்கப்பட்டது"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist_other)"
|
||||
"title": "$t(entity.playlist, {\"count\": 2})"
|
||||
},
|
||||
"setting": {
|
||||
"advanced": "மேம்பட்ட",
|
||||
@@ -406,37 +407,37 @@
|
||||
"windowTab": "சாளரம்"
|
||||
},
|
||||
"sidebar": {
|
||||
"folders": "$t(entity.folder_other)",
|
||||
"genres": "$t(entity.genre_other)",
|
||||
"folders": "$t(entity.folder, {\"count\": 2})",
|
||||
"genres": "$t(entity.genre, {\"count\": 2})",
|
||||
"home": "$t(common.home)",
|
||||
"nowPlaying": "இப்போது விளையாடுகிறது",
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"search": "$t(common.search)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"albumArtists": "$t(entity.albumArtist_other)",
|
||||
"albums": "$t(entity.album_other)",
|
||||
"artists": "$t(entity.artist_other)",
|
||||
"shared": "$t(entity.playlist_other) பகிரப்பட்டது",
|
||||
"tracks": "$t(entity.track_other)",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"albumArtists": "$t(entity.albumArtist, {\"count\": 2})",
|
||||
"albums": "$t(entity.album, {\"count\": 2})",
|
||||
"artists": "$t(entity.artist, {\"count\": 2})",
|
||||
"shared": "$t(entity.playlist, {\"count\": 2}) பகிரப்பட்டது",
|
||||
"tracks": "$t(entity.track, {\"count\": 2})",
|
||||
"myLibrary": "எனது நூலகம்"
|
||||
},
|
||||
"trackList": {
|
||||
"title": "$t(entity.track_other)",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track_other)",
|
||||
"title": "$t(entity.track, {\"count\": 2})",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track, {\"count\": 2})",
|
||||
"artistTracks": "{{artist}}"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
"title": "$t(entity.albumArtist, {\"count\": 2})"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "இந்த $t(entity.artist_one) இலிருந்து மேலும்",
|
||||
"moreFromArtist": "இந்த $t(entity.artist, {\"count\": 1}) இலிருந்து மேலும்",
|
||||
"moreFromGeneric": "{{item}} இலிருந்து மேலும்",
|
||||
"released": "வெளியிடப்பட்டது"
|
||||
},
|
||||
"albumList": {
|
||||
"artistAlbums": "ஆல்பங்கள் {{artist}}",
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)",
|
||||
"title": "$t(entity.album_other)"
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album, {\"count\": 2})",
|
||||
"title": "$t(entity.album, {\"count\": 2})"
|
||||
}
|
||||
},
|
||||
"player": {
|
||||
@@ -550,8 +551,6 @@
|
||||
"playButtonBehavior_description": "வரிசையில் பாடல்களைச் சேர்க்கும்போது ப்ளே பொத்தானின் இயல்புநிலை நடத்தை அமைக்கிறது",
|
||||
"playButtonBehavior_optionAddLast": "$t(player.addLast)",
|
||||
"playButtonBehavior_optionAddNext": "$t(player.addNext)",
|
||||
"playerAlbumArtResolution": "பிளேயர் ஆல்பம் கலைத் தீர்மானம்",
|
||||
"playerAlbumArtResolution_description": "பெரிய வீரரின் ஆல்பம் கலை முன்னோட்டத்திற்கான தீர்மானம். பெரியது இது மிகவும் மிருதுவானதாக தோற்றமளிக்கிறது, ஆனால் மெதுவாக ஏற்றுவதை மெதுவாகக் கொண்டிருக்கலாம். இயல்புநிலை 0 க்கு, அதாவது ஆட்டோ",
|
||||
"playerbarOpenDrawer": "பிளேயர்பார் முழுத்திரை மாற்று",
|
||||
"playerbarOpenDrawer_description": "முழு திரை பிளேயரைத் திறக்க பிளேயர்பாரைக் சொடுக்கு செய்ய அனுமதிக்கிறது",
|
||||
"remotePassword": "ரிமோட் கண்ட்ரோல் சர்வர் கடவுச்சொல்",
|
||||
@@ -566,9 +565,9 @@
|
||||
"replayGainFallback_description": "கோப்பில் {{ReplayGain}} குறிச்சொற்கள் இல்லையென்றால் விண்ணப்பிக்க DB இல் ஆதாயம்",
|
||||
"replayGainMode": "{{ReplayGain}} பயன்முறை",
|
||||
"replayGainMode_description": "{{ReplayGain}}} மதிப்புகளின் படி தொகுதி ஆதாயத்தை சரிசெய்யவும் மேனிலை தரவு கோப்பு",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album_one)",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album, {\"count\": 1})",
|
||||
"replayGainMode_optionNone": "$t(common.none)",
|
||||
"replayGainMode_optionTrack": "$t(entity.track_one)",
|
||||
"replayGainMode_optionTrack": "$t(entity.track, {\"count\": 1})",
|
||||
"replayGainPreamp": "{{ReplayGain}} preamp (db)",
|
||||
"replayGainPreamp_description": "{{ReplayGain}}} மதிப்புகளுக்கு பயன்படுத்தப்படும் Preamp ஆதாயத்தை சரிசெய்யவும்",
|
||||
"sampleRate": "மாதிரி வீதம்",
|
||||
@@ -704,8 +703,8 @@
|
||||
"table": {
|
||||
"config": {
|
||||
"label": {
|
||||
"album": "$t(entity.album_one)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"biography": "$t(common.biography)",
|
||||
"bitrate": "$t(common.bitrate)",
|
||||
"bpm": "$t(common.bpm)",
|
||||
@@ -722,14 +721,14 @@
|
||||
"note": "$t(common.note)",
|
||||
"owner": "$t(common.owner)",
|
||||
"actions": "$t(common.action_other)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"discNumber": "வட்டு எண்",
|
||||
"duration": "$t(common.duration)",
|
||||
"favorite": "$t(common.favorite)",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"path": "$t(common.path)",
|
||||
"playCount": "விளையாட்டு எண்ணிக்கை",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"songCount": "$t(entity.track, {\"count\": 2})",
|
||||
"title": "$t(common.title)",
|
||||
"titleCombined": "$t(common.title) (இணைந்தது)"
|
||||
},
|
||||
@@ -752,8 +751,8 @@
|
||||
"column": {
|
||||
"album": "ஆல்பம்",
|
||||
"albumArtist": "ஆல்பம் கலைஞர்",
|
||||
"albumCount": "$t(entity.album_other)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2})",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"biography": "சுயசரிதை",
|
||||
"bitrate": "பிட்ரேட்",
|
||||
"bpm": "பிபிஎம்",
|
||||
@@ -763,7 +762,7 @@
|
||||
"dateAdded": "தேதி சேர்க்கப்பட்டது",
|
||||
"discNumber": "வட்டு",
|
||||
"favorite": "பிடித்த",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"lastPlayed": "கடைசியாக விளையாடியது",
|
||||
"path": "பாதை",
|
||||
"playCount": "நாடகங்கள்",
|
||||
@@ -771,7 +770,7 @@
|
||||
"releaseDate": "வெளியீட்டு தேதி",
|
||||
"releaseYear": "ஆண்டு",
|
||||
"size": "$t(common.size)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"songCount": "$t(entity.track, {\"count\": 2})",
|
||||
"title": "தலைப்பு",
|
||||
"trackNumber": "மின்தடம்"
|
||||
}
|
||||
|
||||
@@ -2,26 +2,34 @@
|
||||
"action": {
|
||||
"moveToBottom": "alttakine geç",
|
||||
"moveToTop": "başa dön",
|
||||
"removeFromFavorites": "$t(entity.favorite_other)lerden kaldır",
|
||||
"removeFromPlaylist": "$t(entity.playlist_one) listesinden kaldır",
|
||||
"removeFromFavorites": "$t(entity.favorite, {\"count\": 2})lerden kaldır",
|
||||
"removeFromPlaylist": "$t(entity.playlist, {\"count\": 1}) listesinden kaldır",
|
||||
"removeFromQueue": "sıradan kaldır",
|
||||
"setRating": "oyla",
|
||||
"viewPlaylists": "$t(entity.playlist_other) listesini görüntüle",
|
||||
"viewPlaylists": "$t(entity.playlist, {\"count\": 2}) listesini görüntüle",
|
||||
"openIn": {
|
||||
"lastfm": "Last.fm'de aç",
|
||||
"musicbrainz": "MusicBrainz'da aç"
|
||||
},
|
||||
"addToFavorites": "$t(entity.favorite_other) listesine ekle",
|
||||
"addToPlaylist": "$t(entity.playlist_one) listesine ekle",
|
||||
"addToFavorites": "$t(entity.favorite, {\"count\": 2}) listesine ekle",
|
||||
"addToPlaylist": "$t(entity.playlist, {\"count\": 1}) listesine ekle",
|
||||
"clearQueue": "sırayı temizle",
|
||||
"createPlaylist": "$t(entity.playlist_one) listesini oluştur",
|
||||
"deletePlaylist": "$t(entity.playlist_one) listesini sil",
|
||||
"createPlaylist": "$t(entity.playlist, {\"count\": 1}) listesini oluştur",
|
||||
"deletePlaylist": "$t(entity.playlist, {\"count\": 1}) listesini sil",
|
||||
"deselectAll": "seçimleri kaldır",
|
||||
"editPlaylist": "$t(entity.playlist_one) listesini düzenle",
|
||||
"editPlaylist": "$t(entity.playlist, {\"count\": 1}) listesini düzenle",
|
||||
"goToPage": "sayfaya git",
|
||||
"moveToNext": "sonrakine geç",
|
||||
"refresh": "$t(common.refresh)",
|
||||
"toggleSmartPlaylistEditor": "$t(entity.smartPlaylist) düzenleyiciye geç"
|
||||
"toggleSmartPlaylistEditor": "$t(entity.smartPlaylist) düzenleyiciye geç",
|
||||
"addOrRemoveFromSelection": "seçime ekle veya seçimi kaldır",
|
||||
"selectRangeOfItems": "bir dizi öğe seçin",
|
||||
"createRadioStation": "$t(entity.radioStation, {\"count\": 1}) oluştur",
|
||||
"deleteRadioStation": "$t(entity.radioStation, {\"count\": 1}) istasyonunu sil",
|
||||
"selectAll": "tümünü seç",
|
||||
"downloadStarted": "{{count}} öğenin indirilmesine başlandı",
|
||||
"moveUp": "yukarı kaydır",
|
||||
"moveDown": "aşağı kaydır"
|
||||
},
|
||||
"common": {
|
||||
"action_one": "eylem",
|
||||
@@ -47,7 +55,7 @@
|
||||
"configure": "yapılandır",
|
||||
"confirm": "onayla",
|
||||
"create": "oluştur",
|
||||
"currentSong": "şu anki parça $t(entity.track_one)",
|
||||
"currentSong": "şu anki parça $t(entity.track, {\"count\": 1})",
|
||||
"decrease": "azalt",
|
||||
"delete": "sil",
|
||||
"descending": "azalan",
|
||||
@@ -85,7 +93,7 @@
|
||||
"path": "yol",
|
||||
"playerMustBePaused": "oynatıcı duraklatılmalı",
|
||||
"preview": "önizleme",
|
||||
"previousSong": "önceki $t(entity.track_one)",
|
||||
"previousSong": "önceki $t(entity.track, {\"count\": 1})",
|
||||
"quit": "çık",
|
||||
"random": "rastgele",
|
||||
"rating": "oylama",
|
||||
@@ -100,7 +108,8 @@
|
||||
"saveAndReplace": "kaydet ve değiştir",
|
||||
"saveAs": "farklı kaydet",
|
||||
"search": "arama",
|
||||
"setting": "ayarlar",
|
||||
"setting_one": "ayarlar",
|
||||
"setting_other": "",
|
||||
"share": "paylaş",
|
||||
"size": "boyut",
|
||||
"sortOrder": "sıralama düzeni",
|
||||
@@ -120,7 +129,9 @@
|
||||
"trackGain": "parça kazancı",
|
||||
"trackPeak": "parça zirvesi",
|
||||
"private": "gizli",
|
||||
"clean": "temiz"
|
||||
"clean": "temiz",
|
||||
"countSelected": "{{count}} adet seçildi",
|
||||
"public": "herkese açık"
|
||||
},
|
||||
"entity": {
|
||||
"album_one": "albüm",
|
||||
@@ -151,13 +162,15 @@
|
||||
"play_other": "{{count}} oynatma",
|
||||
"playlistWithCount_one": "{{count}} oynatma listesi",
|
||||
"playlistWithCount_other": "{{count}} oynatma listesi",
|
||||
"smartPlaylist": "akıllı $t(entity.playlist_one)",
|
||||
"smartPlaylist": "akıllı $t(entity.playlist, {\"count\": 1})",
|
||||
"track_one": "parça",
|
||||
"track_other": "parçalar",
|
||||
"song_one": "şarkı",
|
||||
"song_other": "şarkılar",
|
||||
"trackWithCount_one": "{{count}} parça",
|
||||
"trackWithCount_other": "{{count}} parça"
|
||||
"trackWithCount_other": "{{count}} parça",
|
||||
"radioStation_one": "radyo istasyonu",
|
||||
"radioStation_other": "radyo istasyonları"
|
||||
},
|
||||
"error": {
|
||||
"apiRouteError": "istek yönlendirilemiyor",
|
||||
@@ -186,7 +199,7 @@
|
||||
"remoteEnableError": "uzak sunucuyu $t(common.enable) yapmaya çalışırken bir hata oluştu"
|
||||
},
|
||||
"filter": {
|
||||
"albumCount": "$t(entity.album_other) sayısı",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2}) sayısı",
|
||||
"biography": "biyografi",
|
||||
"bitrate": "bit hızı",
|
||||
"bpm": "bpm",
|
||||
@@ -201,7 +214,7 @@
|
||||
"id": "kimlik",
|
||||
"isCompilation": "derleme",
|
||||
"isFavorited": "favorilendi",
|
||||
"isPublic": "herkese açık",
|
||||
"isPublic": "halka açıktır",
|
||||
"isRated": "oylandı",
|
||||
"isRecentlyPlayed": "yakın zamanda çalındı",
|
||||
"lastPlayed": "son çalınan",
|
||||
@@ -223,10 +236,10 @@
|
||||
"title": "başlık",
|
||||
"toYear": "yılına kadar",
|
||||
"trackNumber": "parça",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"album": "$t(entity.album_one)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"channels": "$t(common.channel_other)"
|
||||
},
|
||||
"form": {
|
||||
@@ -246,9 +259,9 @@
|
||||
"input_preferInstantMixDescription": "sadece benzer şarkılari bulmak icin anında mix kullan. Bu davranışı değiştiren eklentilere sahipseniz faydalı"
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"input_playlists": "$t(entity.playlist_other)",
|
||||
"input_playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"input_skipDuplicates": "kopyaları atla",
|
||||
"title": "$t(entity.playlist_one) listesine ekle",
|
||||
"title": "$t(entity.playlist, {\"count\": 1}) listesine ekle",
|
||||
"success": "$t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} }) $t(entity.trackWithCount, {\"count\": {{message}} }) eklendi"
|
||||
},
|
||||
"createPlaylist": {
|
||||
@@ -256,21 +269,21 @@
|
||||
"input_name": "$t(common.name)",
|
||||
"input_owner": "$t(common.owner)",
|
||||
"input_public": "herkese açık",
|
||||
"success": "$t(entity.playlist_one) listesi başarıyla oluşturuldu",
|
||||
"title": "$t(entity.playlist_one) listesini oluştur"
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) listesi başarıyla oluşturuldu",
|
||||
"title": "$t(entity.playlist, {\"count\": 1}) listesini oluştur"
|
||||
},
|
||||
"deletePlaylist": {
|
||||
"input_confirm": "onaylamak için $t(entity.playlist_one) listesinin adını yazın",
|
||||
"success": "$t(entity.playlist_one) listesi başarıyla silindi",
|
||||
"title": "$t(entity.playlist_one) listesini sil"
|
||||
"input_confirm": "onaylamak için $t(entity.playlist, {\"count\": 1}) listesinin adını yazın",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) listesi başarıyla silindi",
|
||||
"title": "$t(entity.playlist, {\"count\": 1}) listesini sil"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"publicJellyfinNote": "Jellyfin bazı nedenlerden dolayı bir çalma listesinin herkese açık olup olmadığını göstermez. Bunun herkese açık kalmasını istiyorsanız, lütfen aşağıdaki girdiyi seçin",
|
||||
"success": "$t(entity.playlist_one) listesi başarıyla güncellendi",
|
||||
"title": "$t(entity.playlist_one) listesini düzenle"
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) listesi başarıyla güncellendi",
|
||||
"title": "$t(entity.playlist, {\"count\": 1}) listesini düzenle"
|
||||
},
|
||||
"lyricSearch": {
|
||||
"input_artist": "$t(entity.artist_one)",
|
||||
"input_artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"input_name": "$t(common.name)",
|
||||
"title": "şarkı sözü arama"
|
||||
},
|
||||
@@ -303,10 +316,10 @@
|
||||
"appearsOn": "üzerinde görünür",
|
||||
"recentReleases": "son sürümler",
|
||||
"viewDiscography": "diskografiyi görüntüle",
|
||||
"relatedArtists": "$t(entity.artist_other) ile benzer",
|
||||
"relatedArtists": "$t(entity.artist, {\"count\": 2}) ile benzer",
|
||||
"topSongs": "en iyi şarkılar",
|
||||
"viewAll": "tümünü görüntüle",
|
||||
"viewAllTracks": "tüm $t(entity.track_other) görüntüle",
|
||||
"viewAllTracks": "tüm $t(entity.track, {\"count\": 2}) görüntüle",
|
||||
"topSongsFrom": "{{title}} tarafından en iyi şarkılar"
|
||||
},
|
||||
"contextMenu": {
|
||||
@@ -332,8 +345,8 @@
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"shareItem": "öğeyi paylaş",
|
||||
"showDetails": "bilgi al",
|
||||
"goToAlbum": "$t(entity.album_one) sayfasına git",
|
||||
"goToAlbumArtist": "$t(entity.albumArtist_one) sayfasına git"
|
||||
"goToAlbum": "$t(entity.album, {\"count\": 1}) sayfasına git",
|
||||
"goToAlbumArtist": "$t(entity.albumArtist, {\"count\": 1}) sayfasına git"
|
||||
},
|
||||
"manageServers": {
|
||||
"url": "URL",
|
||||
@@ -367,9 +380,9 @@
|
||||
"noLyrics": "şarkı sözü bulunamadı"
|
||||
},
|
||||
"genreList": {
|
||||
"showAlbums": "$t(entity.genre_one) $t(entity.album_other) göster",
|
||||
"showTracks": "$t(entity.genre_one)$t(entity.track_other) göster",
|
||||
"title": "$t(entity.genre_other)"
|
||||
"showAlbums": "$t(entity.genre, {\"count\": 1}) $t(entity.album, {\"count\": 2}) göster",
|
||||
"showTracks": "$t(entity.genre, {\"count\": 1})$t(entity.track, {\"count\": 2}) göster",
|
||||
"title": "$t(entity.genre, {\"count\": 2})"
|
||||
},
|
||||
"globalSearch": {
|
||||
"commands": {
|
||||
@@ -395,7 +408,7 @@
|
||||
"reorder": "yeniden sıralama yalnızca kimliğe göre sıralama yapıldığında etkinleştirilir"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist_other)"
|
||||
"title": "$t(entity.playlist, {\"count\": 2})"
|
||||
},
|
||||
"setting": {
|
||||
"advanced": "gelişmiş",
|
||||
@@ -405,36 +418,36 @@
|
||||
"windowTab": "pencere"
|
||||
},
|
||||
"sidebar": {
|
||||
"albumArtists": "$t(entity.albumArtist_other)",
|
||||
"albums": "$t(entity.album_other)",
|
||||
"artists": "$t(entity.artist_other)",
|
||||
"folders": "$t(entity.folder_other)",
|
||||
"genres": "$t(entity.genre_other)",
|
||||
"albumArtists": "$t(entity.albumArtist, {\"count\": 2})",
|
||||
"albums": "$t(entity.album, {\"count\": 2})",
|
||||
"artists": "$t(entity.artist, {\"count\": 2})",
|
||||
"folders": "$t(entity.folder, {\"count\": 2})",
|
||||
"genres": "$t(entity.genre, {\"count\": 2})",
|
||||
"home": "$t(common.home)",
|
||||
"myLibrary": "kütüphanem",
|
||||
"nowPlaying": "şimdi oynatılıyor",
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"search": "$t(common.search)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"shared": "paylaşılan $t(entity.playlist_other)",
|
||||
"tracks": "$t(entity.track_other)"
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"shared": "paylaşılan $t(entity.playlist, {\"count\": 2})",
|
||||
"tracks": "$t(entity.track, {\"count\": 2})"
|
||||
},
|
||||
"trackList": {
|
||||
"artistTracks": "{{artist}} parçaları",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track_other)",
|
||||
"title": "$t(entity.track_other)"
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track, {\"count\": 2})",
|
||||
"title": "$t(entity.track, {\"count\": 2})"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
"title": "$t(entity.albumArtist, {\"count\": 2})"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "$t(entity.artist_one) sanatçısından daha fazla",
|
||||
"moreFromArtist": "$t(entity.artist, {\"count\": 1}) sanatçısından daha fazla",
|
||||
"moreFromGeneric": "{{item}} tarafından daha fazla",
|
||||
"released": "yayınlandı"
|
||||
},
|
||||
"albumList": {
|
||||
"title": "$t(entity.album_other)",
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)",
|
||||
"title": "$t(entity.album, {\"count\": 2})",
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album, {\"count\": 2})",
|
||||
"artistAlbums": "{{artist}} albümleri"
|
||||
},
|
||||
"appMenu": {
|
||||
@@ -446,7 +459,7 @@
|
||||
"openBrowserDevtools": "tarayıcı geliştirici araçlarını aç",
|
||||
"quit": "$t(common.quit)",
|
||||
"selectServer": "sunucu seç",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"version": "{{version}} sürümü",
|
||||
"privateModeOff": "gizli modu kapat",
|
||||
"privateModeOn": "gizli modu aç"
|
||||
@@ -604,8 +617,6 @@
|
||||
"playButtonBehavior_optionAddNext": "$t(player.addNext)",
|
||||
"playButtonBehavior_optionPlay": "$t(player.play)",
|
||||
"playButtonBehavior_optionPlayShuffled": "$t(player.shuffle)",
|
||||
"playerAlbumArtResolution": "oynatıcı albüm resmi çözünürlüğü",
|
||||
"playerAlbumArtResolution_description": "büyük oynatıcının albüm resmi önizlemesi için çözünürlük. daha büyük değerler daha net görünmesini sağlar, ancak yüklemeyi yavaşlatabilir. varsayılan değer 0, otomatik olarak çalışır",
|
||||
"playerbarOpenDrawer": "oynatma çubuğu tam ekran geçişi",
|
||||
"playerbarOpenDrawer_description": "tam ekran oynatıcıyı açmak için oynatma çubuğuna tıklamaya izin verir",
|
||||
"remotePassword": "uzaktan kontrol sunucusu şifresi",
|
||||
@@ -620,9 +631,9 @@
|
||||
"replayGainFallback_description": "dosyada {{ReplayGain}} etiketi yoksa db'e uygulanacak kazanç",
|
||||
"replayGainMode": "{{ReplayGain}} modu",
|
||||
"replayGainMode_description": "ses seviyesi kazancını dosya meta verilerinde saklanan {{ReplayGain}} değerlerine göre ayarlayın",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album_one)",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album, {\"count\": 1})",
|
||||
"replayGainMode_optionNone": "$t(common.none)",
|
||||
"replayGainMode_optionTrack": "$t(entity.track_one)",
|
||||
"replayGainMode_optionTrack": "$t(entity.track, {\"count\": 1})",
|
||||
"replayGainPreamp": "{{ReplayGain}} preamp (dB)",
|
||||
"replayGainPreamp_description": "{{ReplayGain}} değerlerine uygulanan preamp kazancını ayarlar",
|
||||
"sampleRate": "örnekleme hızı",
|
||||
@@ -729,8 +740,8 @@
|
||||
"column": {
|
||||
"album": "albüm",
|
||||
"albumArtist": "albüm sanatçısı",
|
||||
"albumCount": "$t(entity.album_other)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2})",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"biography": "biyografi",
|
||||
"bitrate": "bit hızı",
|
||||
"bpm": "bpm (dakika başına vuruş)",
|
||||
@@ -740,7 +751,7 @@
|
||||
"dateAdded": "tarih eklendi",
|
||||
"discNumber": "disk",
|
||||
"favorite": "favori",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"lastPlayed": "son çalınan",
|
||||
"path": "yol",
|
||||
"playCount": "oynatılıyor",
|
||||
@@ -748,7 +759,7 @@
|
||||
"releaseDate": "çıkış tarihi",
|
||||
"releaseYear": "yıl",
|
||||
"size": "$t(common.size)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"songCount": "$t(entity.track, {\"count\": 2})",
|
||||
"title": "başlık",
|
||||
"trackNumber": "parça"
|
||||
},
|
||||
@@ -765,9 +776,9 @@
|
||||
},
|
||||
"label": {
|
||||
"actions": "$t(common.action_other)",
|
||||
"album": "$t(entity.album_one)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"biography": "$t(common.biography)",
|
||||
"bitrate": "$t(common.bitrate)",
|
||||
"bpm": "$t(common.bpm)",
|
||||
@@ -777,7 +788,7 @@
|
||||
"discNumber": "disk numarası",
|
||||
"duration": "$t(common.duration)",
|
||||
"favorite": "$t(common.favorite)",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"lastPlayed": "son çalınan",
|
||||
"note": "$t(common.note)",
|
||||
"owner": "$t(common.owner)",
|
||||
@@ -787,7 +798,7 @@
|
||||
"releaseDate": "çıkış tarihi",
|
||||
"rowIndex": "satır indeksi",
|
||||
"size": "$t(common.size)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"songCount": "$t(entity.track, {\"count\": 2})",
|
||||
"title": "$t(common.title)",
|
||||
"titleCombined": "$t(common.title) (birleşik)",
|
||||
"trackNumber": "parça numarası",
|
||||
|
||||
@@ -1 +1,5 @@
|
||||
{}
|
||||
{
|
||||
"action": {
|
||||
"addToFavorites": "додати до $t(entity.favorite, {\"count\": 2})"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,21 +1,21 @@
|
||||
{
|
||||
"action": {
|
||||
"editPlaylist": "编辑 $t(entity.playlist_one)",
|
||||
"editPlaylist": "编辑 $t(entity.playlist, {\"count\": 1})",
|
||||
"moveToTop": "移至顶部",
|
||||
"clearQueue": "清空播放队列",
|
||||
"addToFavorites": "添加到 $t(entity.favorite_other)",
|
||||
"addToPlaylist": "添加到 $t(entity.playlist_one)",
|
||||
"createPlaylist": "创建 $t(entity.playlist_one)",
|
||||
"removeFromPlaylist": "从 $t(entity.playlist_one) 移除",
|
||||
"viewPlaylists": "查看 $t(entity.playlist_other)",
|
||||
"addToFavorites": "添加到 $t(entity.favorite, {\"count\": 2})",
|
||||
"addToPlaylist": "添加到 $t(entity.playlist, {\"count\": 1})",
|
||||
"createPlaylist": "创建 $t(entity.playlist, {\"count\": 1})",
|
||||
"removeFromPlaylist": "从 $t(entity.playlist, {\"count\": 1}) 移除",
|
||||
"viewPlaylists": "查看 $t(entity.playlist, {\"count\": 2})",
|
||||
"refresh": "$t(common.refresh)",
|
||||
"deletePlaylist": "删除 $t(entity.playlist_one)",
|
||||
"deletePlaylist": "删除 $t(entity.playlist, {\"count\": 1})",
|
||||
"removeFromQueue": "从播放队列中移除",
|
||||
"deselectAll": "取消全选",
|
||||
"moveToBottom": "移至底部",
|
||||
"setRating": "评分",
|
||||
"toggleSmartPlaylistEditor": "切换 $t(entity.smartPlaylist) 编辑器",
|
||||
"removeFromFavorites": "从 $t(entity.favorite_other) 移除",
|
||||
"removeFromFavorites": "从 $t(entity.favorite, {\"count\": 2}) 移除",
|
||||
"goToPage": "前往页面",
|
||||
"openIn": {
|
||||
"lastfm": "在 Last.fm 中打开",
|
||||
@@ -31,7 +31,13 @@
|
||||
"shuffle": "随机播放",
|
||||
"shuffleAll": "随机播放全部",
|
||||
"shuffleSelected": "随机播放选定的内容",
|
||||
"viewMore": "查看更多"
|
||||
"viewMore": "查看更多",
|
||||
"addOrRemoveFromSelection": "在所选内容中添加或移除",
|
||||
"selectRangeOfItems": "批量选择",
|
||||
"selectAll": "全选",
|
||||
"createRadioStation": "创建$t(entity.radioStation, {\"count\": 1})",
|
||||
"deleteRadioStation": "删除$t(entity.radioStation, {\"count\": 1})",
|
||||
"openApplicationDirectory": "打开应用程序目录"
|
||||
},
|
||||
"common": {
|
||||
"increase": "增高",
|
||||
@@ -44,7 +50,7 @@
|
||||
"left": "左",
|
||||
"save": "保存",
|
||||
"right": "右",
|
||||
"currentSong": "当前$t(entity.track_one)",
|
||||
"currentSong": "当前$t(entity.track, {\"count\": 1})",
|
||||
"collapse": "折叠",
|
||||
"trackNumber": "音轨编号",
|
||||
"descending": "降序",
|
||||
@@ -69,7 +75,7 @@
|
||||
"delete": "删除",
|
||||
"cancel": "取消",
|
||||
"forceRestartRequired": "重启应用使更改生效…关闭通知即可重启",
|
||||
"setting": "设置",
|
||||
"setting_other": "设置",
|
||||
"version": "版本",
|
||||
"title": "标题",
|
||||
"filter_other": "筛选",
|
||||
@@ -86,7 +92,7 @@
|
||||
"disable": "禁用",
|
||||
"menu": "菜单",
|
||||
"restartRequired": "需要重启应用",
|
||||
"previousSong": "上一首$t(entity.track_one)",
|
||||
"previousSong": "上一首$t(entity.track, {\"count\": 1})",
|
||||
"noResultsFromQuery": "未查询到匹配结果",
|
||||
"quit": "退出",
|
||||
"expand": "展开",
|
||||
@@ -142,7 +148,14 @@
|
||||
"sort": "排序",
|
||||
"gridRows": "网格行",
|
||||
"tableColumns": "表格列",
|
||||
"itemsMore": "{{count}} 更多"
|
||||
"itemsMore": "{{count}} 更多",
|
||||
"countSelected": "已选择{{count}}项",
|
||||
"retry": "重试",
|
||||
"example": "示例",
|
||||
"filter_single": "单项",
|
||||
"mood": "氛围",
|
||||
"rename": "重命名",
|
||||
"filter_multiple": "多项"
|
||||
},
|
||||
"entity": {
|
||||
"albumArtist_other": "专辑艺术家",
|
||||
@@ -158,11 +171,13 @@
|
||||
"favorite_other": "收藏",
|
||||
"artistWithCount_other": "{{count}} 位艺术家",
|
||||
"folder_other": "文件夹",
|
||||
"smartPlaylist": "智能$t(entity.playlist_one)",
|
||||
"smartPlaylist": "智能$t(entity.playlist, {\"count\": 1})",
|
||||
"genreWithCount_other": "{{count}} 种流派",
|
||||
"trackWithCount_other": "{{count}} 首曲目",
|
||||
"play_other": "{{count}} 次播放",
|
||||
"song_other": "歌曲"
|
||||
"song_other": "歌曲",
|
||||
"radioStation_other": "广播电台",
|
||||
"radioStationWithCount_other": "{{count}} 个广播电台"
|
||||
},
|
||||
"player": {
|
||||
"repeat_all": "循环全部",
|
||||
@@ -176,10 +191,10 @@
|
||||
"skip_back": "向后跳过",
|
||||
"favorite": "收藏",
|
||||
"next": "下一首",
|
||||
"shuffle": "随机播放",
|
||||
"shuffle": "播放(随机)",
|
||||
"playbackFetchNoResults": "未找到歌曲",
|
||||
"playbackFetchInProgress": "正在加载歌曲…",
|
||||
"addNext": "添加为播放列表下一首",
|
||||
"addNext": "下一个",
|
||||
"playbackFetchCancel": "请稍等…关闭通知以取消操作",
|
||||
"play": "播放",
|
||||
"repeat_off": "循环关闭",
|
||||
@@ -189,13 +204,21 @@
|
||||
"queue_moveToTop": "将所选项移至底部",
|
||||
"queue_moveToBottom": "将所选项移至顶部",
|
||||
"shuffle_off": "禁用随机播放",
|
||||
"addLast": "添加至播放列表末尾",
|
||||
"addLast": "最后",
|
||||
"mute": "静音",
|
||||
"skip_forward": "向前跳过",
|
||||
"playbackSpeed": "播放速度",
|
||||
"pause": "暂停",
|
||||
"playSimilarSongs": "播放类似的歌曲",
|
||||
"viewQueue": "查看播放队列"
|
||||
"viewQueue": "查看播放队列",
|
||||
"saveQueueToServer": "将播放队列保存到服务器",
|
||||
"restoreQueueFromServer": "从服务器恢复播放队列",
|
||||
"lyrics": "歌词",
|
||||
"addLastShuffled": "最后(随机)",
|
||||
"addNextShuffled": "下一个(随机)",
|
||||
"artistRadio": "艺术家电台",
|
||||
"holdToShuffle": "按住即可随机",
|
||||
"trackRadio": "追踪广播"
|
||||
},
|
||||
"setting": {
|
||||
"crossfadeStyle_description": "选择用于音频播放器的淡入淡出风格",
|
||||
@@ -272,7 +295,7 @@
|
||||
"remoteUsername_description": "设置远程控制服务器的用户名。如果用户名和密码都为空,则身份验证将被禁用",
|
||||
"exitToTray_description": "退出应用时最小化到系统托盘",
|
||||
"hotkey_favoritePreviousSong": "收藏$t(common.previousSong)",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album_one)",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album, {\"count\": 1})",
|
||||
"lyricOffset": "歌词偏移(毫秒)",
|
||||
"fontType_optionCustom": "自定义字体",
|
||||
"themeDark_description": "应用将使用深色主题",
|
||||
@@ -281,7 +304,7 @@
|
||||
"language_description": "设置应用的语言($t(common.restartRequired))",
|
||||
"playbackStyle_optionCrossFade": "淡入淡出",
|
||||
"hotkey_rate3": "评为 3 星",
|
||||
"replayGainMode_optionTrack": "$t(entity.track_one)",
|
||||
"replayGainMode_optionTrack": "$t(entity.track, {\"count\": 1})",
|
||||
"themeLight_description": "应用将使用浅色主题",
|
||||
"hotkey_toggleFullScreenPlayer": "全屏播放",
|
||||
"hotkey_localSearch": "页面内搜索",
|
||||
@@ -322,7 +345,7 @@
|
||||
"useSystemTheme_description": "使用系统定义的浅色或深色主题",
|
||||
"playButtonBehavior_optionAddNext": "$t(player.addNext)",
|
||||
"lyricFetch_description": "从多个互联网源获取歌词",
|
||||
"lyricFetchProvider_description": "选择歌词源。 歌词源顺序与查询顺序一致",
|
||||
"lyricFetchProvider_description": "选择要从中获取歌词的提供商",
|
||||
"sidePlayQueueStyle_optionDetached": "不吸附",
|
||||
"hotkey_zoomOut": "缩小",
|
||||
"hotkey_unfavoriteCurrentSong": "取消收藏$t(common.currentSong)",
|
||||
@@ -367,8 +390,6 @@
|
||||
"startMinimized_description": "在系统托盘中启动应用程序",
|
||||
"passwordStore_description": "使用什么密码/密钥存储。如果您在存储密码时遇到问题,请更改此设置",
|
||||
"clearCacheSuccess": "缓存清除成功",
|
||||
"playerAlbumArtResolution": "播放器专辑封面分辨率",
|
||||
"playerAlbumArtResolution_description": "大型播放器专辑封面预览的分辨率。较大使其看起来更清晰,但可能会减慢加载速度。默认为0,表示自动",
|
||||
"homeConfiguration": "主页配置",
|
||||
"homeConfiguration_description": "配置主页上显示的项目以及显示顺序",
|
||||
"passwordStore": "密码/密钥存储",
|
||||
@@ -445,7 +466,7 @@
|
||||
"releaseChannel": "发布通道",
|
||||
"releaseChannel_description": "选择稳定版本或测试版以进行自动更新",
|
||||
"mediaSession": "启用媒体会话",
|
||||
"mediaSession_description": "启用 Windows 媒体会话集成,在系统音量覆盖和锁定屏幕中显示媒体控件和元数据(仅限 Windows)",
|
||||
"mediaSession_description": "启用媒体会话集成,在系统音量叠加层和锁屏界面显示媒体控件和元数据",
|
||||
"exportImportSettings_control_description": "通过 JSON 导出和导入设置",
|
||||
"exportImportSettings_control_exportText": "导出设置",
|
||||
"exportImportSettings_control_importText": "导入设置",
|
||||
@@ -457,7 +478,92 @@
|
||||
"exportImportSettings_notValidJSON": "传递的文件不是有效的 JSON 文件",
|
||||
"exportImportSettings_offendingKeyError": "\"{{offendingKey}}\" 不正确 - {{reason}}",
|
||||
"enableAutoTranslation_description": "歌词加载时自动启用翻译",
|
||||
"enableAutoTranslation": "启用自动翻译"
|
||||
"enableAutoTranslation": "启用自动翻译",
|
||||
"imageResolution_description": "程序中使用的图片分辨率,设置为0时使用原始图片",
|
||||
"artistReleaseTypeConfiguration_description": "配置专辑艺术家页面上显示的发行类型及顺序",
|
||||
"logLevel_description": "设置显示的最低日志级别。debug显示所有日志,error仅显示错误日志",
|
||||
"showLyricsInSidebar_description": "在播放列表的附加面板中增加歌词显示页面",
|
||||
"playerbarSlider_description": "不建议在网络速度较慢或按流量计费情况下使用波形图",
|
||||
"showVisualizerInSidebar_description": "在播放侧边栏中增加可视化效果",
|
||||
"analyticsDisable_description": "发送匿名使用数据帮助开发者改进应用程序",
|
||||
"showRatings_description": "控制是否在界面上显示星级评分",
|
||||
"followCurrentSong_description": "自动滚动播放列表至当前播放的歌曲",
|
||||
"audioFadeOnStatusChange_description": "启用音乐淡入和淡出效果",
|
||||
"combinedLyricsAndVisualizer_description": "将歌词和可视化界面合并到同一面板中",
|
||||
"queryBuilderCustomFields_description": "在查询构建器添加自定义字段",
|
||||
"combinedLyricsAndVisualizer": "在播放器侧边栏合并歌词和可视化界面",
|
||||
"autoDJ_description": "自动添加相似歌曲到队列中",
|
||||
"notify_description": "歌曲变更时显示通知",
|
||||
"mpvExtraParameters_description": "向mpv传递额外参数",
|
||||
"audioFadeOnStatusChange": "音频改变时淡入淡出",
|
||||
"showVisualizerInSidebar": "在播放器侧边栏显示可视化效果",
|
||||
"showLyricsInSidebar": "在播放器侧边栏显示歌词",
|
||||
"analyticsDisable": "退出使用情况的分析",
|
||||
"artistReleaseTypeConfiguration": "艺术家发行类型设置",
|
||||
"useThemeAccentColor": "使用主题强调色",
|
||||
"mpvExtraParameters": "mpv额外参数",
|
||||
"showRatings": "显示星级评分",
|
||||
"followCurrentSong": "跟随当前歌曲",
|
||||
"logLevel": "日志等级",
|
||||
"playerbarWaveformAlign_optionTop": "顶部对齐",
|
||||
"playerbarWaveformAlign_optionCenter": "居中对齐",
|
||||
"playerbarWaveformAlign_optionBottom": "底部对齐",
|
||||
"queryBuilderCustomFields_inputLabel": "厂牌",
|
||||
"queryBuilderCustomFields_inputTag": "标签",
|
||||
"logLevel_optionDebug": "Debug",
|
||||
"logLevel_optionError": "Error",
|
||||
"logLevel_optionInfo": "Info",
|
||||
"logLevel_optionWarn": "Warn",
|
||||
"imageResolution_optionSidebar": "侧边栏",
|
||||
"imageResolution_optionHeader": "页首",
|
||||
"language": "语言",
|
||||
"notify": "启用歌曲通知",
|
||||
"imageResolution": "图像分辨率",
|
||||
"imageResolution_optionTable": "表格",
|
||||
"imageResolution_optionFullScreenPlayer": "全屏播放器",
|
||||
"playerbarSlider": "播放进度条",
|
||||
"playerbarSliderType_optionSlider": "滑块",
|
||||
"playerbarSliderType_optionWaveform": "波形",
|
||||
"playerbarWaveformAlign": "波形对齐方式",
|
||||
"playerbarWaveformBarWidth": "波形宽度",
|
||||
"playerbarWaveformGap": "波形间距",
|
||||
"transcode": "启用转码功能",
|
||||
"useThemeAccentColor_description": "使用所选主题中定义的主色,而不是自定义强调色",
|
||||
"homeFeatureStyle_optionSingle": "单项",
|
||||
"autoDJ": "自动DJ",
|
||||
"autoDJ_itemCount": "项目数量",
|
||||
"autoDJ_itemCount_description": "启用自动 DJ 功能后,尝试添加到队列中的项目数",
|
||||
"autoDJ_timing": "定时",
|
||||
"autoDJ_timing_description": "自动 DJ 触发前队列中剩余的歌曲数量",
|
||||
"crossfadeStyle": "交叉渐变风格",
|
||||
"discordRichPresence": "{{discord}} rich presence",
|
||||
"homeFeatureStyle_description": "控制首页特色轮播图的样式",
|
||||
"homeFeatureStyle": "首页特色旋转样式",
|
||||
"homeFeatureStyle_optionMultiple": "多样",
|
||||
"hotkey_listNavigateToPage": "列表导航至项目页面",
|
||||
"hotkey_listPlayDefault": "播放列表",
|
||||
"hotkey_listPlayLast": "播放列表最后",
|
||||
"hotkey_listPlayNext": "播放列表下一个",
|
||||
"hotkey_listPlayNow": "播放列表现在",
|
||||
"pathReplace": "文件路径替换",
|
||||
"pathReplace_description": "替换服务器的默认文件路径",
|
||||
"pathReplace_optionRemovePrefix": "移除前缀",
|
||||
"pathReplace_optionAddPrefix": "添加前缀",
|
||||
"playerFilters": "从队列中筛选歌曲",
|
||||
"playerFilters_description": "根据以下条件,忽略添加到队列中的歌曲",
|
||||
"artistRadioCount_description": "设置艺术家电台和曲目电台要获取的歌曲数量",
|
||||
"artistRadioCount": "艺术家/曲目电台数量",
|
||||
"imageResolution_optionItemCard": "项目卡",
|
||||
"playerbarWaveformRadius": "波形半径",
|
||||
"enableGridMultiSelect": "启用网格多选",
|
||||
"enableGridMultiSelect_description": "启用后,允许在网格视图中选择多个项目。禁用后,点击网格项目图像将跳转到项目页面",
|
||||
"sidebarPlaylistSorting_description": "允许在侧边栏中使用拖放操作手动对播放列表进行排序,而不是使用默认的服务器顺序",
|
||||
"sidebarPlaylistSorting": "侧边栏播放列表排序",
|
||||
"sidebarPlaylistListFilterRegex_description": "隐藏侧边栏中与此正则表达式匹配的播放列表",
|
||||
"sidebarPlaylistListFilterRegex_placeholder": "例如:^每日精选*",
|
||||
"sidebarPlaylistListFilterRegex": "播放列表筛选正则表达式",
|
||||
"queryBuilder": "查询构建器",
|
||||
"queryBuilderCustomFields": "自定义字段"
|
||||
},
|
||||
"error": {
|
||||
"remotePortWarning": "重启服务器使新端口生效",
|
||||
@@ -483,7 +589,12 @@
|
||||
"networkError": "发生网络错误",
|
||||
"openError": "无法打开文件",
|
||||
"badValue": "无效的选项 \"{{value}}\". 此值不再存在",
|
||||
"notificationDenied": "通知权限被拒绝。此设置无效"
|
||||
"notificationDenied": "通知权限被拒绝。此设置无效",
|
||||
"multipleServerSaveQueueError": "不支持此操作(播放列表中包含来自其他服务器的歌曲)",
|
||||
"noNetwork": "服务器不可用",
|
||||
"noNetworkDescription": "无法连接到该服务器",
|
||||
"saveQueueFailed": "播放列表保存失败",
|
||||
"settingsSyncError": "渲染器设置与主进程中存在差异,请重启程序以应用更改"
|
||||
},
|
||||
"filter": {
|
||||
"mostPlayed": "最多播放过",
|
||||
@@ -500,18 +611,18 @@
|
||||
"communityRating": "社区评分",
|
||||
"path": "路径",
|
||||
"favorited": "已收藏",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"releaseYear": "发布年份",
|
||||
"biography": "个人简介",
|
||||
"songCount": "歌曲数量",
|
||||
"random": "随机",
|
||||
"lastPlayed": "上次播放过",
|
||||
"toYear": "从年份",
|
||||
"fromYear": "从年份",
|
||||
"lastPlayed": "最后播放",
|
||||
"toYear": "截止年份",
|
||||
"fromYear": "起始年份",
|
||||
"criticRating": "评论家评分",
|
||||
"trackNumber": "曲目",
|
||||
"bpm": "bpm",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"comment": "评论",
|
||||
"isCompilation": "为合辑",
|
||||
"isFavorited": "已收藏",
|
||||
@@ -519,32 +630,36 @@
|
||||
"recentlyUpdated": "最近更新",
|
||||
"isRated": "已评分",
|
||||
"isRecentlyPlayed": "最近播放过",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"channels": "$t(common.channel, {\"count\": 2})",
|
||||
"owner": "$t(common.owner)",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"note": "注释",
|
||||
"albumCount": "$t(entity.album_other)数",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2})数",
|
||||
"id": "id",
|
||||
"disc": "碟片",
|
||||
"duration": "时长",
|
||||
"album": "$t(entity.album_one)",
|
||||
"explicitStatus": "$t(common.explicitStatus)"
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"explicitStatus": "$t(common.explicitStatus)",
|
||||
"sortName": "排序名称"
|
||||
},
|
||||
"page": {
|
||||
"sidebar": {
|
||||
"nowPlaying": "正在播放",
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"search": "$t(common.search)",
|
||||
"tracks": "$t(entity.track_other)",
|
||||
"albums": "$t(entity.album_other)",
|
||||
"genres": "$t(entity.genre_other)",
|
||||
"folders": "$t(entity.folder_other)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"tracks": "$t(entity.track, {\"count\": 2})",
|
||||
"albums": "$t(entity.album, {\"count\": 2})",
|
||||
"genres": "$t(entity.genre, {\"count\": 2})",
|
||||
"folders": "$t(entity.folder, {\"count\": 2})",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"home": "$t(common.home)",
|
||||
"artists": "$t(entity.artist_other)",
|
||||
"albumArtists": "$t(entity.albumArtist_other)",
|
||||
"shared": "共享$t(entity.playlist_other)",
|
||||
"myLibrary": "我的媒体库"
|
||||
"artists": "$t(entity.artist, {\"count\": 2})",
|
||||
"albumArtists": "$t(entity.albumArtist, {\"count\": 2})",
|
||||
"shared": "共享$t(entity.playlist, {\"count\": 2})",
|
||||
"myLibrary": "我的媒体库",
|
||||
"favorites": "$t(entity.favorite, {\"count\": 2})",
|
||||
"radio": "$t(entity.radioStation, {\"count\": 2})",
|
||||
"collections": "合集"
|
||||
},
|
||||
"fullscreenPlayer": {
|
||||
"config": {
|
||||
@@ -578,10 +693,14 @@
|
||||
"openBrowserDevtools": "打开浏览器开发者工具",
|
||||
"goBack": "返回",
|
||||
"goForward": "前进",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"quit": "$t(common.quit)",
|
||||
"privateModeOff": "关闭私人模式",
|
||||
"privateModeOn": "开启私人模式"
|
||||
"privateModeOn": "开启私人模式",
|
||||
"multipleMusicFolders": "已选择{{count}}个媒体库",
|
||||
"noMusicFolder": "未选择任何音乐库",
|
||||
"selectMusicFolder": "选择媒体库",
|
||||
"commandPalette": "打开命令面板"
|
||||
},
|
||||
"home": {
|
||||
"mostPlayed": "最多播放",
|
||||
@@ -589,10 +708,11 @@
|
||||
"explore": "从库中搜索",
|
||||
"recentlyPlayed": "最近播放",
|
||||
"title": "$t(common.home)",
|
||||
"recentlyReleased": "最近发布"
|
||||
"recentlyReleased": "最近发布",
|
||||
"genres": "$t(entity.genre, {\"count\": 2})"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "更多该$t(entity.artist_one)作品",
|
||||
"moreFromArtist": "更多该$t(entity.artist, {\"count\": 1})作品",
|
||||
"moreFromGeneric": "更多{{item}}作品",
|
||||
"released": "已发布"
|
||||
},
|
||||
@@ -601,7 +721,25 @@
|
||||
"generalTab": "通用",
|
||||
"hotkeysTab": "快捷键",
|
||||
"windowTab": "窗口",
|
||||
"advanced": "高级"
|
||||
"advanced": "高级",
|
||||
"updates": "更新",
|
||||
"cache": "缓存",
|
||||
"analytics": "分析",
|
||||
"application": "应用",
|
||||
"theme": "主题",
|
||||
"controls": "控制",
|
||||
"sidebar": "侧边栏",
|
||||
"remote": "远程服务",
|
||||
"exportImport": "导入/导出",
|
||||
"scrobble": "播放记录",
|
||||
"audio": "音频",
|
||||
"lyrics": "歌词",
|
||||
"transcoding": "转码",
|
||||
"discord": "Discord",
|
||||
"logger": "日志记录器",
|
||||
"queryBuilder": "查询构建器",
|
||||
"lyricsDisplay": "歌词显示",
|
||||
"playerFilters": "播放筛选器"
|
||||
},
|
||||
"globalSearch": {
|
||||
"commands": {
|
||||
@@ -634,40 +772,44 @@
|
||||
"download": "下载",
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"moveToNext": "$t(action.moveToNext)",
|
||||
"goToAlbum": "转到 $t(entity.album_one)",
|
||||
"goToAlbumArtist": "转到 $t(entity.albumArtist_one)"
|
||||
"goToAlbum": "转到 $t(entity.album, {\"count\": 1})",
|
||||
"goToAlbumArtist": "转到 $t(entity.albumArtist, {\"count\": 1})",
|
||||
"moveItems": "$t(action.moveItems)",
|
||||
"goTo": "前往"
|
||||
},
|
||||
"trackList": {
|
||||
"title": "$t(entity.track_other)",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track_other)",
|
||||
"title": "$t(entity.track, {\"count\": 2})",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track, {\"count\": 2})",
|
||||
"artistTracks": "{{artist}} 的曲目"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
"title": "$t(entity.albumArtist, {\"count\": 2})"
|
||||
},
|
||||
"albumList": {
|
||||
"title": "$t(entity.album_other)",
|
||||
"title": "$t(entity.album, {\"count\": 2})",
|
||||
"artistAlbums": "{{artist}}的专辑",
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)"
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album, {\"count\": 2})"
|
||||
},
|
||||
"genreList": {
|
||||
"title": "$t(entity.genre_other)",
|
||||
"showAlbums": "显示$t(entity.genre_one) $t(entity.album_other)",
|
||||
"showTracks": "显示$t(entity.genre_one) $t(entity.track_other)"
|
||||
"title": "$t(entity.genre, {\"count\": 2})",
|
||||
"showAlbums": "显示$t(entity.genre, {\"count\": 1}) $t(entity.album, {\"count\": 2})",
|
||||
"showTracks": "显示$t(entity.genre, {\"count\": 1}) $t(entity.track, {\"count\": 2})"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist_other)"
|
||||
"title": "$t(entity.playlist, {\"count\": 2})"
|
||||
},
|
||||
"albumArtistDetail": {
|
||||
"recentReleases": "最近发布",
|
||||
"viewDiscography": "查看唱片目录",
|
||||
"relatedArtists": "相关$t(entity.artist_other)",
|
||||
"relatedArtists": "相关$t(entity.artist, {\"count\": 2})",
|
||||
"topSongs": "热门歌曲",
|
||||
"topSongsFrom": "{{title}}的热门歌曲",
|
||||
"viewAllTracks": "查看所有$t(entity.track_other)",
|
||||
"viewAllTracks": "查看所有$t(entity.track, {\"count\": 2})",
|
||||
"about": "关于{{artist}}",
|
||||
"appearsOn": "出现在",
|
||||
"viewAll": "查看全部"
|
||||
"viewAll": "查看全部",
|
||||
"groupingTypeAll": "所有发行类型",
|
||||
"groupingTypePrimary": "首选发布类型"
|
||||
},
|
||||
"itemDetail": {
|
||||
"copyPath": "将路径复制到剪贴板",
|
||||
@@ -684,13 +826,30 @@
|
||||
"username": "用户名",
|
||||
"editServerDetailsTooltip": "编辑服务器详细信息",
|
||||
"removeServer": "移除服务器"
|
||||
},
|
||||
"favorites": {
|
||||
"title": "$t(entity.favorite, {\"count\": 2})"
|
||||
},
|
||||
"folderList": {
|
||||
"title": "$t(entity.folder, {\"count\": 2})"
|
||||
},
|
||||
"radioList": {
|
||||
"title": "广播电台"
|
||||
},
|
||||
"windowBar": {
|
||||
"paused": "(暂停) ",
|
||||
"privateMode": "(私人模式)"
|
||||
},
|
||||
"collections": {
|
||||
"overrideExisting": "覆盖现有",
|
||||
"saveAsCollection": "保存为集合"
|
||||
}
|
||||
},
|
||||
"form": {
|
||||
"deletePlaylist": {
|
||||
"title": "删除$t(entity.playlist_one)",
|
||||
"success": "$t(entity.playlist_one)已成功删除",
|
||||
"input_confirm": "输入$t(entity.playlist_one)的名称进行确认"
|
||||
"title": "删除$t(entity.playlist, {\"count\": 1})",
|
||||
"success": "$t(entity.playlist, {\"count\": 1})已成功删除",
|
||||
"input_confirm": "输入$t(entity.playlist, {\"count\": 1})的名称进行确认"
|
||||
},
|
||||
"addServer": {
|
||||
"title": "添加服务器",
|
||||
@@ -705,20 +864,23 @@
|
||||
"error_savePassword": "保存密码时出现错误",
|
||||
"input_url": "url",
|
||||
"input_preferInstantMixDescription": "仅使用即时混音来获取类似的歌曲。如果您有修改此行为的插件,则很有用",
|
||||
"input_preferInstantMix": "首选即时混音"
|
||||
"input_preferInstantMix": "首选即时混音",
|
||||
"input_preferRemoteUrl": "首选公共 url",
|
||||
"input_remoteUrl": "公共 url",
|
||||
"input_remoteUrlPlaceholder": "可选:对外功能的公共 url"
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"success": "添加$t(entity.trackWithCount, {\"count\": {{message}} })到$t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })",
|
||||
"title": "添加到$t(entity.playlist_one)",
|
||||
"title": "添加到$t(entity.playlist, {\"count\": 1})",
|
||||
"input_skipDuplicates": "跳过重复",
|
||||
"input_playlists": "$t(entity.playlist_other)",
|
||||
"create": "创建 $t(entity.playlist_one) {{playlist}}",
|
||||
"searchOrCreate": "搜索 $t(entity.playlist_other) 或键入以创建一个新的"
|
||||
"input_playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"create": "创建 $t(entity.playlist, {\"count\": 1}) {{playlist}}",
|
||||
"searchOrCreate": "搜索 $t(entity.playlist, {\"count\": 2}) 或键入以创建一个新的"
|
||||
},
|
||||
"createPlaylist": {
|
||||
"title": "创建$t(entity.playlist_one)",
|
||||
"title": "创建$t(entity.playlist, {\"count\": 1})",
|
||||
"input_public": "公开",
|
||||
"success": "已成功创建 $t(entity.playlist_one)",
|
||||
"success": "已成功创建 $t(entity.playlist, {\"count\": 1})",
|
||||
"input_description": "$t(common.description)",
|
||||
"input_name": "$t(common.name)",
|
||||
"input_owner": "$t(common.owner)"
|
||||
@@ -730,17 +892,22 @@
|
||||
"queryEditor": {
|
||||
"input_optionMatchAll": "匹配全部",
|
||||
"input_optionMatchAny": "匹配任何",
|
||||
"title": "查询编辑器"
|
||||
"title": "查询编辑器",
|
||||
"resetToDefault": "恢复默认值",
|
||||
"clearFilters": "清除筛选",
|
||||
"addRuleGroup": "添加规则组",
|
||||
"removeRuleGroup": "移除规则组"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"title": "编辑$t(entity.playlist_one)",
|
||||
"title": "编辑$t(entity.playlist, {\"count\": 1})",
|
||||
"publicJellyfinNote": "Jellyfin 出于某种原因不会显示播放列表是否公开。如果您希望保持公开,请选择以下输入",
|
||||
"success": "$t(entity.playlist_one)更新成功"
|
||||
"success": "$t(entity.playlist, {\"count\": 1})更新成功",
|
||||
"editNote": "不建议对大型播放列表进行手动编辑,你确定接受新播放列表覆盖已有播放列表可能导致的数据丢失风险吗?"
|
||||
},
|
||||
"lyricSearch": {
|
||||
"title": "搜索歌词",
|
||||
"input_name": "$t(common.name)",
|
||||
"input_artist": "$t(entity.artist_one)"
|
||||
"input_artist": "$t(entity.artist, {\"count\": 1})"
|
||||
},
|
||||
"shareItem": {
|
||||
"expireInvalid": "过期时间必须是将来的时间",
|
||||
@@ -754,6 +921,36 @@
|
||||
"enabled": "启用私人模式,播放状态现在对外部集成隐藏",
|
||||
"disabled": "私人模式已禁用,播放状态现在对启用的外部集成可见",
|
||||
"title": "私人模式"
|
||||
},
|
||||
"largeFetchConfirmation": {
|
||||
"title": "将项目加入到播放列表",
|
||||
"description": "此操作将添加当前筛选视图中的所有项目"
|
||||
},
|
||||
"createRadioStation": {
|
||||
"input_homepageUrl": "首页地址",
|
||||
"input_name": "名称",
|
||||
"input_streamUrl": "串流地址",
|
||||
"success": "电台创建成功",
|
||||
"title": "创建广播电台"
|
||||
},
|
||||
"lyricsExport": {
|
||||
"export": "导出歌词",
|
||||
"input_synced": "导出同步歌词",
|
||||
"input_offset": "$t(setting.lyricOffset)"
|
||||
},
|
||||
"saveQueue": {
|
||||
"success": "播放列表已保存至服务器"
|
||||
},
|
||||
"shuffleAll": {
|
||||
"title": "随机播放",
|
||||
"input_genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"input_played_optionAll": "所有曲目",
|
||||
"input_maxYear": "截止年份",
|
||||
"input_minYear": "起始年份",
|
||||
"input_played_optionUnplayed": "仅未播放的曲目",
|
||||
"input_played_optionPlayed": "仅已播放的曲目",
|
||||
"input_limit": "有多少首歌?",
|
||||
"input_played": "播放筛选器"
|
||||
}
|
||||
},
|
||||
"table": {
|
||||
@@ -766,7 +963,29 @@
|
||||
"size": "$t(common.size)",
|
||||
"itemGap": "项目间隙(px)",
|
||||
"itemSize": "项目大小 (px)",
|
||||
"followCurrentSong": "关注当前播放的歌曲"
|
||||
"followCurrentSong": "关注当前播放的歌曲",
|
||||
"rowHoverHighlight": "鼠标悬停时高亮",
|
||||
"pagination_itemsPerPage": "每页项目条数",
|
||||
"itemsPerRow": "每行项目条数",
|
||||
"pinToRight": "固定到右侧",
|
||||
"size_default": "默认",
|
||||
"size_compact": "紧凑",
|
||||
"size_large": "松散",
|
||||
"pagination": "分页",
|
||||
"pagination_infinite": "无限滚动",
|
||||
"pagination_paginate": "分页式",
|
||||
"moveUp": "上移",
|
||||
"moveDown": "下移",
|
||||
"pinToLeft": "固定在左侧",
|
||||
"alignLeft": "左对齐",
|
||||
"alignCenter": "居中对齐",
|
||||
"alignRight": "右对齐",
|
||||
"alternateRowColors": "隔行填色",
|
||||
"advancedSettings": "高级设置",
|
||||
"autosize": "自动调整大小",
|
||||
"horizontalBorders": "行边框",
|
||||
"verticalBorders": "列边框",
|
||||
"showHeader": "显示标题"
|
||||
},
|
||||
"view": {
|
||||
"table": "表格",
|
||||
@@ -784,24 +1003,31 @@
|
||||
"trackNumber": "音轨编号",
|
||||
"rowIndex": "行索引",
|
||||
"rating": "$t(common.rating)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"album": "$t(entity.album_one)",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"note": "$t(common.note)",
|
||||
"biography": "$t(common.biography)",
|
||||
"owner": "$t(common.owner)",
|
||||
"path": "$t(common.path)",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"channels": "$t(common.channel, {\"count\": 2})",
|
||||
"playCount": "播放次数",
|
||||
"bitrate": "$t(common.bitrate)",
|
||||
"actions": "$t(common.action_other)",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"actions": "$t(common.action, {\"count\": 2})",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"discNumber": "碟片编号",
|
||||
"favorite": "$t(common.favorite)",
|
||||
"year": "$t(common.year)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"titleCombined": "$t(common.title)(合并)",
|
||||
"codec": "$t(common.codec)",
|
||||
"songCount": "$t(entity.track_other)"
|
||||
"songCount": "$t(entity.track, {\"count\": 2})",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2})",
|
||||
"image": "图片",
|
||||
"bitDepth": "$t(common.bitDepth)",
|
||||
"sampleRate": "$t(common.sampleRate)",
|
||||
"genreBadge": "$t(entity.genre, {\"count\": 1})(徽章)",
|
||||
"composer": "作曲家",
|
||||
"titleArtist": "$t(common.title) (艺术家)"
|
||||
}
|
||||
},
|
||||
"column": {
|
||||
@@ -810,7 +1036,7 @@
|
||||
"rating": "评分",
|
||||
"favorite": "收藏",
|
||||
"playCount": "播放次数",
|
||||
"albumCount": "$t(entity.album_other)",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2})",
|
||||
"releaseYear": "年份",
|
||||
"lastPlayed": "最后播放",
|
||||
"biography": "简介",
|
||||
@@ -819,16 +1045,19 @@
|
||||
"title": "标题",
|
||||
"bpm": "bpm",
|
||||
"dateAdded": "添加日期",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"songCount": "$t(entity.track, {\"count\": 2})",
|
||||
"trackNumber": "音轨编号",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"albumArtist": "专辑艺术家",
|
||||
"path": "路径",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"channels": "$t(common.channel, {\"count\": 2})",
|
||||
"discNumber": "碟片",
|
||||
"size": "$t(common.size)",
|
||||
"codec": "$t(common.codec)"
|
||||
"codec": "$t(common.codec)",
|
||||
"owner": "所有者",
|
||||
"bitDepth": "$t(common.bitDepth)",
|
||||
"sampleRate": "$t(common.sampleRate)"
|
||||
}
|
||||
},
|
||||
"dragDropZone": {
|
||||
@@ -838,8 +1067,25 @@
|
||||
},
|
||||
"releaseType": {
|
||||
"primary": {
|
||||
"album": "$t(entity.album_one)",
|
||||
"broadcast": "播送"
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"broadcast": "播送",
|
||||
"ep": "迷你专辑(EP)",
|
||||
"single": "单曲",
|
||||
"other": "其他"
|
||||
},
|
||||
"secondary": {
|
||||
"audiobook": "有声读物",
|
||||
"compilation": "合辑",
|
||||
"demo": "样本唱片(Demo)",
|
||||
"interview": "访谈",
|
||||
"live": "现场表演(Live)",
|
||||
"mixtape": "混音专辑",
|
||||
"remix": "再混音(Remix)",
|
||||
"soundtrack": "原声带",
|
||||
"audioDrama": "广播剧",
|
||||
"djMix": "DJ混音",
|
||||
"fieldRecording": "现场录制",
|
||||
"spokenWord": "访谈"
|
||||
}
|
||||
},
|
||||
"filterOperator": {
|
||||
@@ -847,6 +1093,152 @@
|
||||
"afterDate": "晚于(日期)",
|
||||
"before": "之前",
|
||||
"beforeDate": "早于(日期)",
|
||||
"contains": "包含"
|
||||
"contains": "包含",
|
||||
"endsWith": "以…结尾",
|
||||
"inPlaylist": "在…中",
|
||||
"inTheRange": "在范围内",
|
||||
"inTheLast": "在最后",
|
||||
"is": "是",
|
||||
"isNot": "不是",
|
||||
"isGreaterThan": "大于",
|
||||
"isLessThan": "小于",
|
||||
"matchesRegex": "匹配正则表达式",
|
||||
"notContains": "不包含",
|
||||
"startsWith": "以…开头",
|
||||
"inTheRangeDate": "在(日期)范围内",
|
||||
"notInPlaylist": "不在…中",
|
||||
"notInTheLast": "不在最后"
|
||||
},
|
||||
"datetime": {
|
||||
"minuteShort": "分",
|
||||
"secondShort": "秒",
|
||||
"hourShort": "小时",
|
||||
"dayShort": "天"
|
||||
},
|
||||
"visualizer": {
|
||||
"configPasteFailed": "应用配置失败,请检查配置格式。",
|
||||
"configPasteReadFailed": "读取剪贴板失败",
|
||||
"configCopyFailed": "复制设置失败",
|
||||
"configCopied": "已复制设置到剪贴板",
|
||||
"pasteConfigurationPlaceholder": "将JSON配置粘贴到此处…",
|
||||
"addCustomGradient": "添加自定义渐变",
|
||||
"presetNamePlaceholder": "输入预设名称",
|
||||
"configPasted": "成功应用配置",
|
||||
"pasteFromClipboard": "从剪贴板粘贴",
|
||||
"saveAsPreset": "保存为预设",
|
||||
"customGradients": "自定义渐变",
|
||||
"showFPS": "显示帧率(FPS)",
|
||||
"presets": "预设",
|
||||
"general": "普通",
|
||||
"mode": "模式",
|
||||
"visualizerType": "可视化器效果类型",
|
||||
"selectPreset": "选择预设",
|
||||
"applyPreset": "应用预设",
|
||||
"updatePreset": "更新预设",
|
||||
"copyConfiguration": "复制配置",
|
||||
"pasteConfiguration": "粘贴配置",
|
||||
"applyConfiguration": "应用配置",
|
||||
"presetName": "预设名称",
|
||||
"mode1To8": "模式 1 - 8",
|
||||
"mode10": "模式 10",
|
||||
"fillAlpha": "填充透明度",
|
||||
"lineWidth": "线宽",
|
||||
"maxFPS": "最大帧率(FPS)",
|
||||
"opacity": "不透明度",
|
||||
"gradientName": "渐变名称",
|
||||
"gradientNamePlaceholder": "渐变名称",
|
||||
"vertical": "垂直",
|
||||
"horizontal": "水平",
|
||||
"addColor": "添加颜色",
|
||||
"position": "位置",
|
||||
"cycleTime": "循环时间(秒)",
|
||||
"channelLayout": "声道布局",
|
||||
"remove": "移除",
|
||||
"pasteGradientPlaceholder": "在此处粘贴颜色渐变的配置JSON…",
|
||||
"pasteGradient": "粘贴颜色渐变配置",
|
||||
"custom": "自定义",
|
||||
"builtIn": "内置",
|
||||
"colors": "颜色",
|
||||
"gradient": "渐变",
|
||||
"miscellaneousSettings": "杂项设置",
|
||||
"options": {
|
||||
"channelLayout": {
|
||||
"single": "单项"
|
||||
},
|
||||
"mode": {
|
||||
"0": "[0] 离散频率"
|
||||
},
|
||||
"colorMode": {
|
||||
"gradient": "渐变"
|
||||
},
|
||||
"gradient": {
|
||||
"classic": "经典",
|
||||
"prism": "棱镜",
|
||||
"rainbow": "彩虹"
|
||||
},
|
||||
"frequencyScale": {
|
||||
"none": "无"
|
||||
},
|
||||
"weightingFilter": {
|
||||
"none": "无",
|
||||
"a": "A",
|
||||
"b": "B",
|
||||
"c": "C",
|
||||
"d": "D",
|
||||
"z": "Z"
|
||||
}
|
||||
},
|
||||
"cyclePresets": "循环预设",
|
||||
"includeAllPresets": "包含所有预设",
|
||||
"ignoredPresets": "忽略预设",
|
||||
"selectedPresets": "已选预设",
|
||||
"randomizeNextPreset": "随机化下一个预设",
|
||||
"blendTime": "混合时间",
|
||||
"barSpace": "住间距",
|
||||
"colorStops": "颜色停止",
|
||||
"level": "等级",
|
||||
"colorMode": "颜色模式",
|
||||
"gradientLeft": "左侧渐变",
|
||||
"gradientRight": "右侧渐变",
|
||||
"fft": "FFT",
|
||||
"fftSize": "FFT 大小",
|
||||
"smoothing": "平滑",
|
||||
"frequencyRangeAndScaling": "频率范围和缩放",
|
||||
"minimumFrequency": "最低频率",
|
||||
"maximumFrequency": "最大频率",
|
||||
"frequencyScale": "频率尺度",
|
||||
"sensitivity": "灵敏度",
|
||||
"weightingFilter": "加权滤波器",
|
||||
"minimumDecibels": "最低分贝",
|
||||
"maximumDecibels": "最大分贝",
|
||||
"linearAmplitude": "线性振幅",
|
||||
"linearBoost": "线性增强",
|
||||
"peakBehavior": "峰值行为",
|
||||
"showPeaks": "显示峰值",
|
||||
"fadePeaks": "峰值淡出",
|
||||
"peakLine": "峰值线条",
|
||||
"gravity": "重力",
|
||||
"peakFadeTime": "峰值淡出时间(毫秒)",
|
||||
"peakHoldTime": "峰值保持时间(毫秒)",
|
||||
"radialSpectrum": "圆形频谱",
|
||||
"radial": "径向",
|
||||
"radialInvert": "径向反转",
|
||||
"spinSpeed": "旋转速度",
|
||||
"radius": "半径",
|
||||
"reflexMirror": "反射镜",
|
||||
"reflexFit": "反射贴合",
|
||||
"reflexRatio": "反射比率",
|
||||
"reflexAlpha": "反射Alpha",
|
||||
"reflexBrightness": "反射亮度",
|
||||
"mirror": "镜像",
|
||||
"lowResolution": "低分辨率",
|
||||
"splitGradient": "渐变分割",
|
||||
"showScaleX": "显示比例尺 X",
|
||||
"noteLabels": "笔记标签",
|
||||
"showScaleY": "显示比例尺 Y"
|
||||
},
|
||||
"queryBuilder": {
|
||||
"standardTags": "标准标签",
|
||||
"customTags": "自定义标签"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,10 +20,10 @@
|
||||
"ascending": "升冪",
|
||||
"disable": "禁用",
|
||||
"disc": "光碟",
|
||||
"dismiss": "忽略",
|
||||
"dismiss": "不再顯示",
|
||||
"duration": "時長",
|
||||
"edit": "編輯",
|
||||
"enable": "啓用",
|
||||
"enable": "啟用",
|
||||
"expand": "展開",
|
||||
"favorite": "收藏",
|
||||
"filter_other": "篩選",
|
||||
@@ -40,7 +40,7 @@
|
||||
"owner": "所有者",
|
||||
"path": "路徑",
|
||||
"playerMustBePaused": "播放器必須被暫停",
|
||||
"previousSong": "上一首$t(entity.track_one)",
|
||||
"previousSong": "上一首$t(entity.track, {\"count\": 1})",
|
||||
"quit": "退出",
|
||||
"random": "隨機",
|
||||
"rating": "評分",
|
||||
@@ -66,7 +66,7 @@
|
||||
"channel_other": "聲道",
|
||||
"configure": "配置",
|
||||
"create": "創建",
|
||||
"currentSong": "目前$t(entity.track_one)",
|
||||
"currentSong": "目前$t(entity.track, {\"count\": 1})",
|
||||
"minimize": "最小化",
|
||||
"modified": "已修改",
|
||||
"name": "名稱",
|
||||
@@ -86,7 +86,7 @@
|
||||
"preview": "預覽",
|
||||
"reload": "重新載入",
|
||||
"sampleRate": "取樣率",
|
||||
"setting": "設定",
|
||||
"setting_other": "設定",
|
||||
"share": "分享",
|
||||
"tags": "標籤",
|
||||
"trackGain": "曲目增益",
|
||||
@@ -106,7 +106,16 @@
|
||||
"explicitStatus": "Explicit狀態",
|
||||
"explicit": "Explicit",
|
||||
"gridRows": "網格行",
|
||||
"noFilters": "未設定任何過濾器"
|
||||
"noFilters": "未設定任何過濾器",
|
||||
"countSelected": "{{count}}個已選取",
|
||||
"retry": "重試",
|
||||
"example": "範例",
|
||||
"mood": "情緒",
|
||||
"view": "查看",
|
||||
"rename": "重新命名",
|
||||
"itemsMore": "{{count}} 更多",
|
||||
"filter_single": "單選",
|
||||
"filter_multiple": "複選"
|
||||
},
|
||||
"error": {
|
||||
"endpointNotImplementedError": "{{serverType}} 尚未實現端點 {{endpoint}}",
|
||||
@@ -134,7 +143,10 @@
|
||||
"notificationDenied": "通知權限被拒絕。此設定無效",
|
||||
"openError": "無法開啟檔案",
|
||||
"multipleServerSaveQueueError": "播放佇列中包含不是來自目前伺服器的歌曲,此操作不受支援",
|
||||
"saveQueueFailed": "儲存播放佇列失敗"
|
||||
"saveQueueFailed": "儲存播放佇列失敗",
|
||||
"settingsSyncError": "偵測到渲染器與主程序之間的設定不一致,請重新啟動應用程式以套用變更",
|
||||
"noNetwork": "伺服器無法連線",
|
||||
"noNetworkDescription": "無法連接到此伺服器"
|
||||
},
|
||||
"page": {
|
||||
"contextMenu": {
|
||||
@@ -160,8 +172,8 @@
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"shareItem": "分享項目",
|
||||
"showDetails": "取得資訊",
|
||||
"goToAlbum": "前往 $t(entity.album_one)",
|
||||
"goToAlbumArtist": "前往 $t(entity.albumArtist_one)",
|
||||
"goToAlbum": "前往 $t(entity.album, {\"count\": 1})",
|
||||
"goToAlbumArtist": "前往 $t(entity.albumArtist, {\"count\": 1})",
|
||||
"moveItems": "$t(action.moveItems)",
|
||||
"goTo": "前往"
|
||||
},
|
||||
@@ -174,13 +186,13 @@
|
||||
}
|
||||
},
|
||||
"home": {
|
||||
"explore": "從資料庫中搜尋",
|
||||
"explore": "從媒體庫中搜尋",
|
||||
"recentlyPlayed": "最近播放",
|
||||
"title": "$t(common.home)",
|
||||
"mostPlayed": "最多播放",
|
||||
"newlyAdded": "最近新增的發行",
|
||||
"recentlyReleased": "最近發佈",
|
||||
"genres": "$t(entity.genre_other)"
|
||||
"genres": "$t(entity.genre, {\"count\": 2})"
|
||||
},
|
||||
"appMenu": {
|
||||
"openBrowserDevtools": "打開瀏覽器開發者工具",
|
||||
@@ -190,7 +202,7 @@
|
||||
"goForward": "前進",
|
||||
"quit": "$t(common.quit)",
|
||||
"selectServer": "選擇伺服器",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"version": "版本 {{version}}",
|
||||
"manageServers": "管理伺服器",
|
||||
"privateModeOff": "關閉私人模式",
|
||||
@@ -224,7 +236,7 @@
|
||||
"noLyrics": "未找到歌詞"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist_other)"
|
||||
"title": "$t(entity.playlist, {\"count\": 2})"
|
||||
},
|
||||
"setting": {
|
||||
"hotkeysTab": "快捷鍵",
|
||||
@@ -248,58 +260,61 @@
|
||||
"discord": "Discord",
|
||||
"queryBuilder": "查詢建構器",
|
||||
"playerFilters": "播放過濾器",
|
||||
"logger": "日誌記錄器"
|
||||
"logger": "日誌記錄器",
|
||||
"lyricsDisplay": "歌詞顯示"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
"title": "$t(entity.albumArtist, {\"count\": 2})"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "更多來自 $t(entity.artist_one) 的作品",
|
||||
"moreFromArtist": "更多來自 $t(entity.artist, {\"count\": 1}) 的作品",
|
||||
"moreFromGeneric": "更多{{item}}作品",
|
||||
"released": "發行"
|
||||
},
|
||||
"albumList": {
|
||||
"title": "$t(entity.album_other)",
|
||||
"title": "$t(entity.album, {\"count\": 2})",
|
||||
"artistAlbums": "{{artist}} 的專輯",
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)"
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album, {\"count\": 2})"
|
||||
},
|
||||
"genreList": {
|
||||
"title": "$t(entity.genre_other)",
|
||||
"showAlbums": "顯示 $t(entity.genre_one) $t(entity.album_other)",
|
||||
"showTracks": "顯示 $t(entity.genre_one) $t(entity.track_other)"
|
||||
"title": "$t(entity.genre, {\"count\": 2})",
|
||||
"showAlbums": "顯示 $t(entity.genre, {\"count\": 1}) $t(entity.album, {\"count\": 2})",
|
||||
"showTracks": "顯示 $t(entity.genre, {\"count\": 1}) $t(entity.track, {\"count\": 2})"
|
||||
},
|
||||
"sidebar": {
|
||||
"albumArtists": "$t(entity.albumArtist_other)",
|
||||
"albums": "$t(entity.album_other)",
|
||||
"artists": "$t(entity.artist_other)",
|
||||
"folders": "$t(entity.folder_other)",
|
||||
"albumArtists": "$t(entity.albumArtist, {\"count\": 2})",
|
||||
"albums": "$t(entity.album, {\"count\": 2})",
|
||||
"artists": "$t(entity.artist, {\"count\": 2})",
|
||||
"folders": "$t(entity.folder, {\"count\": 2})",
|
||||
"search": "$t(common.search)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"tracks": "$t(entity.track_other)",
|
||||
"genres": "$t(entity.genre_other)",
|
||||
"settings": "$t(common.setting, {\"count\": 2})",
|
||||
"tracks": "$t(entity.track, {\"count\": 2})",
|
||||
"genres": "$t(entity.genre, {\"count\": 2})",
|
||||
"home": "$t(common.home)",
|
||||
"nowPlaying": "正在播放",
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"myLibrary": "我的資料庫",
|
||||
"shared": "已分享 $t(entity.playlist_other)",
|
||||
"favorites": "$t(entity.favorite_other)",
|
||||
"radio": "$t(entity.radioStation_other)"
|
||||
"playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"myLibrary": "我的媒體庫",
|
||||
"shared": "已分享 $t(entity.playlist, {\"count\": 2})",
|
||||
"favorites": "$t(entity.favorite, {\"count\": 2})",
|
||||
"radio": "$t(entity.radioStation, {\"count\": 2})"
|
||||
},
|
||||
"trackList": {
|
||||
"title": "$t(entity.track_other)",
|
||||
"title": "$t(entity.track, {\"count\": 2})",
|
||||
"artistTracks": "{{artist}} 的歌曲",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track_other)"
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track, {\"count\": 2})"
|
||||
},
|
||||
"albumArtistDetail": {
|
||||
"about": "關於{{artist}}",
|
||||
"appearsOn": "出現在",
|
||||
"recentReleases": "最近發行",
|
||||
"viewDiscography": "查看音樂作品",
|
||||
"relatedArtists": "關聯$t(entity.artist_other)",
|
||||
"relatedArtists": "關聯$t(entity.artist, {\"count\": 2})",
|
||||
"topSongs": "熱門歌曲",
|
||||
"topSongsFrom": "{{title}} 的熱門歌曲",
|
||||
"viewAll": "檢視所有",
|
||||
"viewAllTracks": "檢視所有$t(entity.track_other)"
|
||||
"viewAllTracks": "檢視所有$t(entity.track, {\"count\": 2})",
|
||||
"groupingTypeAll": "所有發佈類型",
|
||||
"groupingTypePrimary": "主要發佈類型"
|
||||
},
|
||||
"manageServers": {
|
||||
"title": "管理伺服器",
|
||||
@@ -318,13 +333,16 @@
|
||||
"reorder": "僅當按 ID 排序時才啟用重新排序"
|
||||
},
|
||||
"favorites": {
|
||||
"title": "$t(entity.favorite_other)"
|
||||
"title": "$t(entity.favorite, {\"count\": 2})"
|
||||
},
|
||||
"folderList": {
|
||||
"title": "$t(entity.folder_other)"
|
||||
"title": "$t(entity.folder, {\"count\": 2})"
|
||||
},
|
||||
"radioList": {
|
||||
"title": "電台"
|
||||
},
|
||||
"windowBar": {
|
||||
"paused": "(暫停) "
|
||||
}
|
||||
},
|
||||
"player": {
|
||||
@@ -361,13 +379,12 @@
|
||||
"viewQueue": "檢視佇列",
|
||||
"addLastShuffled": "新增至尾端 (隨機)",
|
||||
"addNextShuffled": "新增至下一首 (隨機)",
|
||||
"queueType": "佇列類型",
|
||||
"queueType_default": "預設",
|
||||
"queueType_priority": "優先",
|
||||
"holdToShuffle": "按住以隨機",
|
||||
"lyrics": "歌詞",
|
||||
"restoreQueueFromServer": "從伺服器還原播放佇列",
|
||||
"saveQueueToServer": "將播放佇列儲存至伺服器"
|
||||
"saveQueueToServer": "將播放佇列儲存至伺服器",
|
||||
"artistRadio": "藝人電台",
|
||||
"trackRadio": "曲目電台"
|
||||
},
|
||||
"setting": {
|
||||
"audioPlayer_description": "選擇用於播放的音訊播放器",
|
||||
@@ -403,7 +420,7 @@
|
||||
"discordUpdateInterval_description": "更新間隔秒數(至少 15 秒)",
|
||||
"enableRemote": "啟用遠端控制伺服器",
|
||||
"enableRemote_description": "啟用遠端控制伺服器,以允許其他設備控制此應用程式",
|
||||
"exitToTray": "退出時最小化到系統匣",
|
||||
"exitToTray": "關閉時到將視窗最小化",
|
||||
"followLyric": "跟隨目前歌詞",
|
||||
"font_description": "設定應用程式使用的字體",
|
||||
"fontType": "字體類型",
|
||||
@@ -447,8 +464,8 @@
|
||||
"lyricFetchProvider": "歌詞來源",
|
||||
"lyricOffset": "歌詞偏移(毫秒)",
|
||||
"lyricOffset_description": "將歌詞偏移指定的毫秒數",
|
||||
"lyricFetchProvider_description": "選擇歌詞來源。 來源順序即為搜尋的順序",
|
||||
"minimizeToTray": "最小化到匣",
|
||||
"lyricFetchProvider_description": "選擇歌詞來源",
|
||||
"minimizeToTray": "最小化到系統匣",
|
||||
"minimizeToTray_description": "將應用程式最小化到系統匣",
|
||||
"minimumScrobbleSeconds": "最小紀錄時間(秒)",
|
||||
"minimumScrobbleSeconds_description": "歌曲被記錄為已播放(scrobble)所需的最小播放時間",
|
||||
@@ -466,9 +483,9 @@
|
||||
"replayGainFallback_description": "歌曲沒有{{ReplayGain}}標簽時使用的增益(以分貝為單位)",
|
||||
"replayGainMode": "{{ReplayGain}}模式",
|
||||
"replayGainMode_description": "根據歌曲標籤中儲存的{{ReplayGain}}值調整音量增益",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album_one)",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album, {\"count\": 1})",
|
||||
"replayGainMode_optionNone": "$t(common.none)",
|
||||
"replayGainMode_optionTrack": "$t(entity.track_one)",
|
||||
"replayGainMode_optionTrack": "$t(entity.track, {\"count\": 1})",
|
||||
"replayGainPreamp": "{{ReplayGain}}前置放大(分貝)",
|
||||
"replayGainPreamp_description": "調整使用在{{ReplayGain}}值上的前置放大增益",
|
||||
"savePlayQueue": "儲存播放佇列",
|
||||
@@ -478,7 +495,7 @@
|
||||
"scrobble_description": "在你的媒體伺服器中記錄播放資訊",
|
||||
"showSkipButton": "顯示跳過按鈕",
|
||||
"showSkipButton_description": "在播放條上顯示/隱藏跳過按鈕",
|
||||
"sidebarPlaylistList": "側邊欄歌單清單",
|
||||
"sidebarPlaylistList": "側邊欄播放清單列表",
|
||||
"sidebarCollapsedNavigation": "側邊欄(已折疊)導航",
|
||||
"sidebarCollapsedNavigation_description": "在折疊的側邊欄中顯示或隱藏導航",
|
||||
"sidebarConfiguration": "側邊欄設定",
|
||||
@@ -534,8 +551,8 @@
|
||||
"albumBackground_description": "為包含專輯封面的專輯頁面新增背景圖片",
|
||||
"albumBackgroundBlur": "專輯背景圖片模糊大小",
|
||||
"albumBackgroundBlur_description": "調整應用於專輯背景圖片的模糊量",
|
||||
"artistConfiguration": "專輯藝術家頁面設定",
|
||||
"artistConfiguration_description": "設定專輯藝術家頁面上顯示的項目及其顯示順序",
|
||||
"artistConfiguration": "專輯藝人頁面設定",
|
||||
"artistConfiguration_description": "設定專輯藝人頁面中顯示的項目及排序",
|
||||
"clearCacheSuccess": "成功清除快取",
|
||||
"contextMenu": "右鍵選單配置",
|
||||
"contextMenu_description": "允許您隱藏在右鍵選單項目時顯示的項目。未選取的項目將被隱藏",
|
||||
@@ -551,7 +568,7 @@
|
||||
"discordServeImage": "從伺服器提供{{discord}}圖片",
|
||||
"discordServeImage_description": "從伺服器本身分享 {{discord}} Rich Presence的封面圖片,僅支援 Jellyfin 與 Navidrome。{{discord}} 會透過機器人擷取圖片,因此您的伺服器必須能從公開網路連線",
|
||||
"externalLinks": "顯示外部連結",
|
||||
"externalLinks_description": "在藝術家/專輯頁面顯示外部連結(Last.fm, MusicBrainz)",
|
||||
"externalLinks_description": "在藝人/專輯頁面顯示外部連結(Last.fm, MusicBrainz)",
|
||||
"preferLocalLyrics": "偏好本地歌詞",
|
||||
"preferLocalLyrics_description": "優先選擇本地歌詞,而不是遠端歌詞(如果可用)",
|
||||
"homeConfiguration": "首頁配置",
|
||||
@@ -561,22 +578,20 @@
|
||||
"imageAspectRatio": "使用原生封面照長寬比",
|
||||
"imageAspectRatio_description": "如果啟用,封面照將使用其原始長寬比顯示。對於非 1:1 的封面,剩餘空間將為空",
|
||||
"lastfm": "顯示 last.fm 連結",
|
||||
"lastfm_description": "在藝術家/專輯頁面顯示 Last.fm 連結",
|
||||
"lastfm_description": "在藝人/專輯頁面顯示 Last.fm 連結",
|
||||
"lastfmApiKey": "{{lastfm}} API金鑰",
|
||||
"lastfmApiKey_description": "{{lastfm}}的API金鑰。用於封面照",
|
||||
"mpvExtraParameters_help": "一行一個",
|
||||
"musicbrainz": "顯示 MusicBrainz 連結",
|
||||
"musicbrainz_description": "在存在 MusicBrainz ID 的藝術家/專輯頁面上顯示 MusicBrainz 的鏈接",
|
||||
"musicbrainz_description": "在存在 MusicBrainz ID 的藝人/專輯頁面上顯示 MusicBrainz 的連結",
|
||||
"neteaseTranslation": "啟用網易翻譯",
|
||||
"neteaseTranslation_description": "啟用後,將從網易取得並顯示翻譯的歌詞(如果有)",
|
||||
"passwordStore": "密碼/secret儲存",
|
||||
"passwordStore_description": "使用什麼密碼/secret儲存。如果您在儲存密碼時遇到問題,請變更此項目",
|
||||
"playButtonBehavior_optionPlayShuffled": "$t(player.shuffle)",
|
||||
"playerAlbumArtResolution": "播放器專輯封面解析度",
|
||||
"playerAlbumArtResolution_description": "大型播放器專輯封面預覽的解析度。較大的解析度使其看起來更清晰,但可能會減慢載入速度。預設為 0,表示自動",
|
||||
"playerbarOpenDrawer": "播放器列全螢幕切換",
|
||||
"playerbarOpenDrawer_description": "允許點擊播放器列以開啟全螢幕播放器",
|
||||
"startMinimized": "最小化啟動",
|
||||
"startMinimized": "啟動時最小化",
|
||||
"startMinimized_description": "在系統匣中啟動應用程式",
|
||||
"transcode_description": "啟用轉碼到不同格式",
|
||||
"transcodeBitrate": "要轉碼的比特率",
|
||||
@@ -616,7 +631,7 @@
|
||||
"preventSleepOnPlayback": "防止播放時進入睡眠狀態",
|
||||
"preventSleepOnPlayback_description": "在音樂播放時防止螢幕進入睡眠狀態",
|
||||
"mediaSession": "啟用Media Session",
|
||||
"mediaSession_description": "啟用 Windows Media Session 整合功能,於系統音量Overlay和鎖定畫面中顯示媒體資料與控制面板(僅限 Windows)",
|
||||
"mediaSession_description": "啟用 Media Session 整合功能,於系統音量Overlay和鎖定畫面中顯示媒體資料與控制面板",
|
||||
"releaseChannel": "發佈通道",
|
||||
"analyticsDisable": "選擇退出使用情況分析",
|
||||
"analyticsDisable_description": "經過匿名處理的使用情況資料將傳送給開發者,以協助改進應用程式",
|
||||
@@ -677,7 +692,30 @@
|
||||
"logLevel_optionInfo": "Info",
|
||||
"logLevel_optionWarn": "Warn",
|
||||
"useThemeAccentColor": "使用主題強調色",
|
||||
"useThemeAccentColor_description": "使用所選主題中定義的主要顏色,而非自訂的強調色"
|
||||
"useThemeAccentColor_description": "使用所選主題中定義的主要顏色,而非自訂的強調色",
|
||||
"artistRadioCount_description": "設定為藝人電台與曲目電台擷取的歌曲數量",
|
||||
"imageResolution": "圖片解析度",
|
||||
"imageResolution_description": "應用程式中所使用圖片的解析度。設定為 0 時,將使用圖片的原始解析度",
|
||||
"imageResolution_optionTable": "表格",
|
||||
"imageResolution_optionItemCard": "項目卡片",
|
||||
"imageResolution_optionSidebar": "側邊欄",
|
||||
"imageResolution_optionHeader": "頁首",
|
||||
"imageResolution_optionFullScreenPlayer": "全螢幕播放器",
|
||||
"combinedLyricsAndVisualizer_description": "將歌詞與視覺化效果整合至同一個面板",
|
||||
"combinedLyricsAndVisualizer": "在播放器側邊欄整合歌詞與視覺化效果",
|
||||
"artistRadioCount": "藝人/歌曲電台數量",
|
||||
"showRatings_description": "控制星級評分功能是否顯示於介面中",
|
||||
"showRatings": "顯示星級評分",
|
||||
"artistReleaseTypeConfiguration": "藝人發行類型設定",
|
||||
"artistReleaseTypeConfiguration_description": "設定專輯藝人頁面中顯示的發行類型及排序",
|
||||
"hotkey_listNavigateToPage": "從清單導覽至項目頁面",
|
||||
"mpvExtraParameters": "MPV額外參數",
|
||||
"mpvExtraParameters_description": "傳遞給MPV的額外參數",
|
||||
"pathReplace": "檔案路徑替換",
|
||||
"pathReplace_description": "替換您伺服器的預設檔案路徑",
|
||||
"pathReplace_optionRemovePrefix": "移除前綴",
|
||||
"pathReplace_optionAddPrefix": "增加前綴",
|
||||
"sidebarPlaylistSorting": "側邊欄播放清單排序"
|
||||
},
|
||||
"table": {
|
||||
"config": {
|
||||
@@ -713,25 +751,25 @@
|
||||
"verticalBorders": "列邊框線"
|
||||
},
|
||||
"label": {
|
||||
"actions": "$t(common.action_other)",
|
||||
"album": "$t(entity.album_one)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"actions": "$t(common.action, {\"count\": 2})",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"bpm": "$t(common.bpm)",
|
||||
"biography": "$t(common.biography)",
|
||||
"bitrate": "$t(common.bitrate)",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"channels": "$t(common.channel, {\"count\": 2})",
|
||||
"dateAdded": "新增日期",
|
||||
"discNumber": "光碟編號",
|
||||
"duration": "$t(common.duration)",
|
||||
"favorite": "$t(common.favorite)",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"lastPlayed": "最後播放",
|
||||
"note": "$t(common.note)",
|
||||
"owner": "$t(common.owner)",
|
||||
"path": "$t(common.path)",
|
||||
"playCount": "播放次數",
|
||||
"releaseDate": "發布日期",
|
||||
"releaseDate": "發行日期",
|
||||
"rowIndex": "行號",
|
||||
"size": "$t(common.size)",
|
||||
"title": "$t(common.title)",
|
||||
@@ -740,9 +778,9 @@
|
||||
"year": "$t(common.year)",
|
||||
"rating": "$t(common.rating)",
|
||||
"codec": "$t(common.codec)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"albumCount": "$t(entity.album_other)",
|
||||
"genreBadge": "$t(entity.genre_one) (徽章)",
|
||||
"songCount": "$t(entity.track, {\"count\": 2})",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2})",
|
||||
"genreBadge": "$t(entity.genre, {\"count\": 1}) (徽章)",
|
||||
"image": "圖片",
|
||||
"bitDepth": "$t(common.bitDepth)",
|
||||
"sampleRate": "$t(common.sampleRate)"
|
||||
@@ -755,12 +793,12 @@
|
||||
},
|
||||
"column": {
|
||||
"album": "專輯",
|
||||
"albumArtist": "專輯藝術家",
|
||||
"albumCount": "$t(entity.album_other)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"albumArtist": "專輯藝人",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2})",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"biography": "簡介",
|
||||
"bitrate": "比特率",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"channels": "$t(common.channel, {\"count\": 2})",
|
||||
"comment": "評論",
|
||||
"dateAdded": "新增日期",
|
||||
"discNumber": "光碟",
|
||||
@@ -771,9 +809,9 @@
|
||||
"rating": "評價",
|
||||
"releaseDate": "發布日期",
|
||||
"releaseYear": "年份",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"bpm": "bpm",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"songCount": "$t(entity.track, {\"count\": 2})",
|
||||
"title": "標題",
|
||||
"trackNumber": "曲目編號",
|
||||
"size": "$t(common.size)",
|
||||
@@ -784,23 +822,23 @@
|
||||
}
|
||||
},
|
||||
"action": {
|
||||
"addToFavorites": "新增到$t(entity.favorite_other)",
|
||||
"addToFavorites": "新增到$t(entity.favorite, {\"count\": 2})",
|
||||
"clearQueue": "清空播放佇列",
|
||||
"createPlaylist": "創建$t(entity.playlist_one)",
|
||||
"deletePlaylist": "刪除$t(entity.playlist_one)",
|
||||
"addToPlaylist": "新增到$t(entity.playlist_one)",
|
||||
"createPlaylist": "創建$t(entity.playlist, {\"count\": 1})",
|
||||
"deletePlaylist": "刪除$t(entity.playlist, {\"count\": 1})",
|
||||
"addToPlaylist": "新增到$t(entity.playlist, {\"count\": 1})",
|
||||
"deselectAll": "取消全選",
|
||||
"editPlaylist": "編輯 $t(entity.playlist_one)",
|
||||
"editPlaylist": "編輯 $t(entity.playlist, {\"count\": 1})",
|
||||
"goToPage": "前往頁面",
|
||||
"moveToBottom": "移至底部",
|
||||
"moveToTop": "移至頂部",
|
||||
"refresh": "$t(common.refresh)",
|
||||
"removeFromFavorites": "從$t(entity.favorite_other)移除",
|
||||
"removeFromPlaylist": "從$t(entity.playlist_one)移除",
|
||||
"removeFromFavorites": "從$t(entity.favorite, {\"count\": 2})移除",
|
||||
"removeFromPlaylist": "從$t(entity.playlist, {\"count\": 1})移除",
|
||||
"removeFromQueue": "從播放佇列中移除",
|
||||
"setRating": "評分",
|
||||
"toggleSmartPlaylistEditor": "切換$t(entity.smartPlaylist)編輯器",
|
||||
"viewPlaylists": "查看$t(entity.playlist_other)",
|
||||
"viewPlaylists": "查看$t(entity.playlist, {\"count\": 2})",
|
||||
"moveToNext": "移至下一項",
|
||||
"openIn": {
|
||||
"lastfm": "在Last.fm開啟",
|
||||
@@ -816,15 +854,19 @@
|
||||
"moveDown": "向下移動",
|
||||
"holdToMoveToTop": "按住以移動至頂部",
|
||||
"holdToMoveToBottom": "按住以移動至底部",
|
||||
"createRadioStation": "創建 $t(entity.radioStation_one)",
|
||||
"deleteRadioStation": "刪除 $t(entity.radioStation_one)"
|
||||
"createRadioStation": "創建 $t(entity.radioStation, {\"count\": 1})",
|
||||
"deleteRadioStation": "刪除 $t(entity.radioStation, {\"count\": 1})",
|
||||
"openApplicationDirectory": "開啟應用程式目錄",
|
||||
"addOrRemoveFromSelection": "新增或移除選取項目",
|
||||
"selectAll": "全選",
|
||||
"selectRangeOfItems": "批量選取"
|
||||
},
|
||||
"entity": {
|
||||
"album_other": "專輯",
|
||||
"albumArtist_other": "專輯藝術家",
|
||||
"albumArtistCount_other": "{{count}} 位專輯藝術家",
|
||||
"artist_other": "藝術家",
|
||||
"artistWithCount_other": "{{count}} 位藝術家",
|
||||
"albumArtist_other": "專輯藝人",
|
||||
"albumArtistCount_other": "{{count}} 位專輯藝人",
|
||||
"artist_other": "藝人",
|
||||
"artistWithCount_other": "{{count}} 位藝人",
|
||||
"favorite_other": "收藏",
|
||||
"folder_other": "資料夾",
|
||||
"folderWithCount_other": "{{count}} 個資料夾",
|
||||
@@ -832,7 +874,7 @@
|
||||
"genreWithCount_other": "{{count}} 種曲風",
|
||||
"playlist_other": "播放清單",
|
||||
"playlistWithCount_other": "{{count}} 個播放清單",
|
||||
"smartPlaylist": "智慧$t(entity.playlist_one)",
|
||||
"smartPlaylist": "智慧$t(entity.playlist, {\"count\": 1})",
|
||||
"track_other": "曲目",
|
||||
"trackWithCount_other": "{{count}} 首曲目",
|
||||
"albumWithCount_other": "{{count}} 張專輯",
|
||||
@@ -842,12 +884,12 @@
|
||||
"radioStationWithCount_other": "{{count}} 個電台"
|
||||
},
|
||||
"filter": {
|
||||
"albumCount": "$t(entity.album_other)數",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"albumCount": "$t(entity.album, {\"count\": 2})數",
|
||||
"artist": "$t(entity.artist, {\"count\": 1})",
|
||||
"biography": "個人簡介",
|
||||
"bitrate": "比特率",
|
||||
"bpm": "bpm",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"channels": "$t(common.channel, {\"count\": 2})",
|
||||
"comment": "評論",
|
||||
"communityRating": "社群評分",
|
||||
"criticRating": "評論家評分",
|
||||
@@ -856,7 +898,7 @@
|
||||
"duration": "時長",
|
||||
"id": "id",
|
||||
"fromYear": "從年份",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"isCompilation": "為合輯",
|
||||
"isFavorited": "已收藏",
|
||||
"isPublic": "已公開",
|
||||
@@ -875,8 +917,8 @@
|
||||
"recentlyUpdated": "最近更新",
|
||||
"releaseDate": "發布日期",
|
||||
"songCount": "曲目數",
|
||||
"album": "$t(entity.album_one)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"albumArtist": "$t(entity.albumArtist, {\"count\": 1})",
|
||||
"favorited": "已收藏",
|
||||
"recentlyAdded": "最近新增",
|
||||
"releaseYear": "發布年份",
|
||||
@@ -900,28 +942,31 @@
|
||||
"ignoreCors": "忽略 cors $t(common.restartRequired)",
|
||||
"ignoreSsl": "忽略 ssl $t(common.restartRequired)",
|
||||
"input_preferInstantMix": "偏好即時混音",
|
||||
"input_preferInstantMixDescription": "僅使用即時混音功能來獲取相似歌曲。若您擁有能修改此行為的外掛,此功能將相當實用"
|
||||
"input_preferInstantMixDescription": "僅使用即時混音功能來獲取相似歌曲。若您擁有能修改此行為的外掛,此功能將相當實用",
|
||||
"input_preferRemoteUrl": "優先使用公開網址",
|
||||
"input_remoteUrl": "公開網址",
|
||||
"input_remoteUrlPlaceholder": "選用:對外功能的公開網址"
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"input_playlists": "$t(entity.playlist_other)",
|
||||
"input_playlists": "$t(entity.playlist, {\"count\": 2})",
|
||||
"input_skipDuplicates": "跳過重複",
|
||||
"success": "新增 $t(entity.trackWithCount, {\"count\": {{message}} }) 到 $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })",
|
||||
"title": "新增到$t(entity.playlist_one)",
|
||||
"create": "創建 $t(entity.playlist_one) {{playlist}}",
|
||||
"searchOrCreate": "搜尋$t(entity.playlist_other) 或輸入內容以建立新項目"
|
||||
"title": "新增到$t(entity.playlist, {\"count\": 1})",
|
||||
"create": "創建 $t(entity.playlist, {\"count\": 1}) {{playlist}}",
|
||||
"searchOrCreate": "搜尋$t(entity.playlist, {\"count\": 2}) 或輸入內容以建立新項目"
|
||||
},
|
||||
"createPlaylist": {
|
||||
"input_description": "$t(common.description)",
|
||||
"input_name": "$t(common.name)",
|
||||
"input_owner": "$t(common.owner)",
|
||||
"input_public": "公開",
|
||||
"success": "已成功創建 $t(entity.playlist_one)",
|
||||
"title": "創建$t(entity.playlist_one)"
|
||||
"success": "已成功創建 $t(entity.playlist, {\"count\": 1})",
|
||||
"title": "創建$t(entity.playlist, {\"count\": 1})"
|
||||
},
|
||||
"lyricSearch": {
|
||||
"input_name": "$t(common.name)",
|
||||
"title": "搜尋歌詞",
|
||||
"input_artist": "$t(entity.artist_one)"
|
||||
"input_artist": "$t(entity.artist, {\"count\": 1})"
|
||||
},
|
||||
"queryEditor": {
|
||||
"input_optionMatchAll": "匹配全部",
|
||||
@@ -937,14 +982,14 @@
|
||||
"title": "更新伺服器"
|
||||
},
|
||||
"deletePlaylist": {
|
||||
"input_confirm": "輸入$t(entity.playlist_one)的名稱進行確認",
|
||||
"title": "刪除$t(entity.playlist_one)",
|
||||
"success": "$t(entity.playlist_one)已成功刪除"
|
||||
"input_confirm": "輸入$t(entity.playlist, {\"count\": 1})的名稱進行確認",
|
||||
"title": "刪除$t(entity.playlist, {\"count\": 1})",
|
||||
"success": "$t(entity.playlist, {\"count\": 1})已成功刪除"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"title": "編輯$t(entity.playlist_one)",
|
||||
"title": "編輯$t(entity.playlist, {\"count\": 1})",
|
||||
"publicJellyfinNote": "Jellyfin 出於某種原因,不會顯示播放清單是否公開。如果您希望保持公開狀態,請選擇以下輸入",
|
||||
"success": "$t(entity.playlist_one) 更新成功",
|
||||
"success": "$t(entity.playlist, {\"count\": 1}) 更新成功",
|
||||
"editNote": "不建議手動編輯大型播放清單,你確定要承擔覆寫現有播放清單可能造成的資料遺失風險嗎?"
|
||||
},
|
||||
"shareItem": {
|
||||
@@ -966,7 +1011,7 @@
|
||||
},
|
||||
"shuffleAll": {
|
||||
"title": "隨機播放",
|
||||
"input_genre": "$t(entity.genre_one)",
|
||||
"input_genre": "$t(entity.genre, {\"count\": 1})",
|
||||
"input_limit": "多少曲目?",
|
||||
"input_minYear": "起始年份",
|
||||
"input_maxYear": "結束年份",
|
||||
@@ -984,11 +1029,16 @@
|
||||
},
|
||||
"saveQueue": {
|
||||
"success": "已將播放佇列儲存至伺服器"
|
||||
},
|
||||
"lyricsExport": {
|
||||
"export": "匯出歌詞",
|
||||
"input_synced": "匯出同步歌詞",
|
||||
"input_offset": "$t(setting.lyricOffset)"
|
||||
}
|
||||
},
|
||||
"releaseType": {
|
||||
"primary": {
|
||||
"album": "$t(entity.album_one)",
|
||||
"album": "$t(entity.album, {\"count\": 1})",
|
||||
"ep": "EP",
|
||||
"other": "其他",
|
||||
"broadcast": "廣播",
|
||||
@@ -1005,7 +1055,8 @@
|
||||
"live": "Live",
|
||||
"mixtape": "混音帶",
|
||||
"remix": "Remix",
|
||||
"soundtrack": "原聲帶"
|
||||
"soundtrack": "原聲帶",
|
||||
"spokenWord": "訪談"
|
||||
}
|
||||
},
|
||||
"dragDropZone": {
|
||||
@@ -1034,6 +1085,89 @@
|
||||
"matchesRegex": "符合正規表達式",
|
||||
"notContains": "不包含",
|
||||
"notInPlaylist": "不在…之中",
|
||||
"startsWith": "以…開頭"
|
||||
"startsWith": "以…開頭",
|
||||
"inTheLast": "在最後",
|
||||
"notInTheLast": "不在最後"
|
||||
},
|
||||
"datetime": {
|
||||
"minuteShort": "分",
|
||||
"secondShort": "秒",
|
||||
"hourShort": "小時",
|
||||
"dayShort": "天"
|
||||
},
|
||||
"visualizer": {
|
||||
"visualizerType": "視覺化效果類型",
|
||||
"cyclePresets": "循環切換預設",
|
||||
"cycleTime": "循環時間 (秒)",
|
||||
"includeAllPresets": "包含所有預設",
|
||||
"ignoredPresets": "忽略的預設",
|
||||
"selectedPresets": "已選取的預設",
|
||||
"randomizeNextPreset": "隨機切換下一個預設",
|
||||
"blendTime": "過渡時間",
|
||||
"presets": "預設",
|
||||
"selectPreset": "選擇預設",
|
||||
"applyPreset": "套用預設",
|
||||
"saveAsPreset": "儲存為預設",
|
||||
"updatePreset": "更新預設",
|
||||
"copyConfiguration": "複製設定",
|
||||
"pasteConfiguration": "貼上設定",
|
||||
"pasteConfigurationPlaceholder": "在此處貼上JSON設定...",
|
||||
"pasteFromClipboard": "從剪貼簿貼上",
|
||||
"applyConfiguration": "套用設定",
|
||||
"configCopied": "設定已複製至剪貼簿",
|
||||
"configCopyFailed": "無法複製設定",
|
||||
"configPasted": "設定套用成功",
|
||||
"configPasteFailed": "無法套用設定,請檢查格式。",
|
||||
"configPasteReadFailed": "無法從剪貼簿讀取內容",
|
||||
"presetName": "預設名稱",
|
||||
"presetNamePlaceholder": "輸入預設名稱",
|
||||
"general": "一般",
|
||||
"mode": "模式",
|
||||
"mode1To8": "模式 1 - 8",
|
||||
"mode10": "模式 10",
|
||||
"barSpace": "柱間距",
|
||||
"lineWidth": "線條寬度",
|
||||
"fillAlpha": "填充透明度",
|
||||
"channelLayout": "聲道佈局",
|
||||
"maxFPS": "最大幀率",
|
||||
"opacity": "不透明度",
|
||||
"customGradients": "自定義漸層",
|
||||
"addCustomGradient": "新增自定義漸層",
|
||||
"gradientName": "漸層名稱",
|
||||
"gradientNamePlaceholder": "漸層名稱",
|
||||
"vertical": "垂直",
|
||||
"horizontal": "水平",
|
||||
"colorStops": "顏色分界點",
|
||||
"addColor": "新增顏色",
|
||||
"position": "位置",
|
||||
"remove": "移除",
|
||||
"custom": "自訂",
|
||||
"builtIn": "內建",
|
||||
"colors": "顏色",
|
||||
"colorMode": "顏色模式",
|
||||
"gradient": "漸層",
|
||||
"gradientLeft": "左側漸層",
|
||||
"gradientRight": "右側漸層",
|
||||
"fft": "FFT",
|
||||
"fftSize": "FFT 取樣大小",
|
||||
"smoothing": "平滑度",
|
||||
"frequencyRangeAndScaling": "頻率範圍與縮放",
|
||||
"minimumFrequency": "最低頻率",
|
||||
"maximumFrequency": "最高頻率",
|
||||
"frequencyScale": "頻率量表",
|
||||
"sensitivity": "靈敏度",
|
||||
"weightingFilter": "權重濾波器",
|
||||
"minimumDecibels": "最小分貝",
|
||||
"maximumDecibels": "最大分貝",
|
||||
"linearAmplitude": "線性振幅",
|
||||
"linearBoost": "線性增益",
|
||||
"peakBehavior": "峰值行為",
|
||||
"showPeaks": "顯示峰值",
|
||||
"fadePeaks": "峰值淡出",
|
||||
"peakLine": "峰值線條",
|
||||
"gravity": "重力",
|
||||
"peakFadeTime": "峰值淡出時間 (毫秒)",
|
||||
"peakHoldTime": "峰值停留時間 (毫秒)",
|
||||
"radialSpectrum": "圓形頻譜"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -100,7 +100,7 @@ export async function getLyricsBySongId(url: string): Promise<null | string> {
|
||||
try {
|
||||
result = await axios.get<string>(url, { responseType: 'text' });
|
||||
} catch (e) {
|
||||
console.error('Genius lyrics request got an error!', e);
|
||||
console.error('Genius lyrics request got an error!', (e as Error)?.message);
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -138,7 +138,7 @@ export async function getSearchResults(
|
||||
},
|
||||
});
|
||||
} catch (e) {
|
||||
console.error('Genius search request got an error!', e);
|
||||
console.error('Genius search request got an error!', (e as Error)?.message);
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -150,6 +150,7 @@ export async function getSearchResults(
|
||||
return {
|
||||
artist: song.artist_names,
|
||||
id: song.url,
|
||||
isSync: null,
|
||||
name: song.full_title,
|
||||
source: LyricSource.GENIUS,
|
||||
};
|
||||
@@ -163,13 +164,11 @@ export async function query(
|
||||
): Promise<InternetProviderLyricResponse | null> {
|
||||
const response = await getSongId(params);
|
||||
if (!response) {
|
||||
console.error('Could not find the song on Genius!');
|
||||
return null;
|
||||
}
|
||||
|
||||
const lyrics = await getLyricsBySongId(response.id);
|
||||
if (!lyrics) {
|
||||
console.error('Could not get lyrics on Genius!');
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -194,7 +193,7 @@ async function getSongId(
|
||||
},
|
||||
});
|
||||
} catch (e) {
|
||||
console.error('Genius search request got an error!', e);
|
||||
console.error('Genius search request got an error!', (e as Error)?.message);
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,21 +1,10 @@
|
||||
import { ipcMain } from 'electron';
|
||||
|
||||
import { store } from '../settings';
|
||||
import {
|
||||
getLyricsBySongId as getGenius,
|
||||
query as queryGenius,
|
||||
getSearchResults as searchGenius,
|
||||
} from './genius';
|
||||
import {
|
||||
getLyricsBySongId as getLrcLib,
|
||||
query as queryLrclib,
|
||||
getSearchResults as searchLrcLib,
|
||||
} from './lrclib';
|
||||
import {
|
||||
getLyricsBySongId as getNetease,
|
||||
query as queryNetease,
|
||||
getSearchResults as searchNetease,
|
||||
} from './netease';
|
||||
import { getLyricsBySongId as getGenius, getSearchResults as searchGenius } from './genius';
|
||||
import { getLyricsBySongId as getLrcLib, getSearchResults as searchLrcLib } from './lrclib';
|
||||
import { getLyricsBySongId as getNetease, getSearchResults as searchNetease } from './netease';
|
||||
import { orderSearchResults } from './shared';
|
||||
|
||||
import { Song } from '/@/shared/types/domain-types';
|
||||
|
||||
@@ -42,6 +31,7 @@ export type InternetProviderLyricResponse = {
|
||||
export type InternetProviderLyricSearchResponse = {
|
||||
artist: string;
|
||||
id: string;
|
||||
isSync: boolean | null;
|
||||
name: string;
|
||||
score?: number;
|
||||
source: LyricSource;
|
||||
@@ -72,14 +62,6 @@ type SearchFetcher = (
|
||||
params: LyricSearchQuery,
|
||||
) => Promise<InternetProviderLyricSearchResponse[] | null>;
|
||||
|
||||
type SongFetcher = (params: LyricSearchQuery) => Promise<InternetProviderLyricResponse | null>;
|
||||
|
||||
const FETCHERS: Record<LyricSource, SongFetcher> = {
|
||||
[LyricSource.GENIUS]: queryGenius,
|
||||
[LyricSource.LRCLIB]: queryLrclib,
|
||||
[LyricSource.NETEASE]: queryNetease,
|
||||
};
|
||||
|
||||
const SEARCH_FETCHERS: Record<LyricSource, SearchFetcher> = {
|
||||
[LyricSource.GENIUS]: searchGenius,
|
||||
[LyricSource.LRCLIB]: searchLrcLib,
|
||||
@@ -96,6 +78,30 @@ const MAX_CACHED_ITEMS = 10;
|
||||
|
||||
const lyricCache = new Map<string, CachedLyrics>();
|
||||
|
||||
const searchAllSources = async (
|
||||
params: LyricSearchQuery,
|
||||
): Promise<InternetProviderLyricSearchResponse[]> => {
|
||||
const sources = store.get('lyrics', []) as LyricSource[];
|
||||
|
||||
const searchPromises = sources.map((source) =>
|
||||
SEARCH_FETCHERS[source](params).then((searchResults) => ({ searchResults, source })),
|
||||
);
|
||||
|
||||
const settled = await Promise.allSettled(searchPromises);
|
||||
|
||||
const allSearchResults: InternetProviderLyricSearchResponse[] = [];
|
||||
|
||||
for (const result of settled) {
|
||||
if (result.status === 'fulfilled' && result.value.searchResults) {
|
||||
allSearchResults.push(...result.value.searchResults);
|
||||
} else if (result.status === 'rejected') {
|
||||
const index = settled.indexOf(result);
|
||||
console.error(`Error searching ${sources[index]} for lyrics:`, result.reason);
|
||||
}
|
||||
}
|
||||
return allSearchResults;
|
||||
};
|
||||
|
||||
const getRemoteLyrics = async (song: Song) => {
|
||||
const sources = store.get('lyrics', []) as LyricSource[];
|
||||
|
||||
@@ -108,61 +114,87 @@ const getRemoteLyrics = async (song: Song) => {
|
||||
}
|
||||
}
|
||||
|
||||
const params: LyricSearchQuery = {
|
||||
album: song.album || song.name,
|
||||
artist: song.artists[0].name,
|
||||
duration: song.duration / 1000.0,
|
||||
name: song.name,
|
||||
};
|
||||
|
||||
const allSearchResults = await searchAllSources(params);
|
||||
|
||||
if (allSearchResults.length === 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const rankedResults = orderSearchResults({
|
||||
params,
|
||||
results: allSearchResults,
|
||||
});
|
||||
|
||||
const bestMatch = rankedResults[0];
|
||||
|
||||
if (!bestMatch) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Score is 0-1 where 0 = perfect match, 1 = worst match
|
||||
const matchThreshold = 0.55;
|
||||
const matchScore = bestMatch.score ?? 1;
|
||||
|
||||
if (matchScore > matchThreshold) {
|
||||
return null;
|
||||
}
|
||||
|
||||
let lyricsFromSource: InternetProviderLyricResponse | null = null;
|
||||
|
||||
for (const source of sources) {
|
||||
const params = {
|
||||
album: song.album || song.name,
|
||||
artist: song.artists[0].name,
|
||||
duration: song.duration / 1000.0,
|
||||
name: song.name,
|
||||
};
|
||||
const response = await FETCHERS[source](params as unknown as LyricSearchQuery);
|
||||
|
||||
if (response) {
|
||||
const newResult = cached
|
||||
? {
|
||||
...cached,
|
||||
[source]: response,
|
||||
}
|
||||
: ({ [source]: response } as CachedLyrics);
|
||||
|
||||
if (lyricCache.size === MAX_CACHED_ITEMS && cached === undefined) {
|
||||
const toRemove = lyricCache.keys().next().value;
|
||||
if (toRemove) {
|
||||
lyricCache.delete(toRemove);
|
||||
}
|
||||
}
|
||||
|
||||
lyricCache.set(song.id.toString(), newResult);
|
||||
|
||||
lyricsFromSource = response;
|
||||
break;
|
||||
try {
|
||||
const lyrics = await GET_FETCHERS[bestMatch.source](bestMatch.id);
|
||||
if (lyrics) {
|
||||
lyricsFromSource = {
|
||||
artist: bestMatch.artist,
|
||||
id: bestMatch.id,
|
||||
lyrics,
|
||||
name: bestMatch.name,
|
||||
source: bestMatch.source,
|
||||
};
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`Error fetching lyrics from ${bestMatch.source}:`, error);
|
||||
}
|
||||
|
||||
if (lyricsFromSource) {
|
||||
const newResult = cached
|
||||
? {
|
||||
...cached,
|
||||
[lyricsFromSource.source]: lyricsFromSource,
|
||||
}
|
||||
: ({ [lyricsFromSource.source]: lyricsFromSource } as CachedLyrics);
|
||||
|
||||
if (lyricCache.size === MAX_CACHED_ITEMS && cached === undefined) {
|
||||
const toRemove = lyricCache.keys().next().value;
|
||||
if (toRemove) {
|
||||
lyricCache.delete(toRemove);
|
||||
}
|
||||
}
|
||||
|
||||
lyricCache.set(song.id.toString(), newResult);
|
||||
}
|
||||
|
||||
return lyricsFromSource;
|
||||
};
|
||||
|
||||
const searchRemoteLyrics = async (params: LyricSearchQuery) => {
|
||||
const sources = store.get('lyrics', []) as LyricSource[];
|
||||
const allSearchResults = await searchAllSources(params);
|
||||
|
||||
const results: Record<LyricSource, InternetProviderLyricSearchResponse[]> = {
|
||||
[LyricSource.GENIUS]: [],
|
||||
[LyricSource.LRCLIB]: [],
|
||||
[LyricSource.NETEASE]: [],
|
||||
};
|
||||
|
||||
for (const source of sources) {
|
||||
const response = await SEARCH_FETCHERS[source](params);
|
||||
|
||||
if (response) {
|
||||
response.forEach((result) => {
|
||||
results[source].push(result);
|
||||
});
|
||||
}
|
||||
for (const item of allSearchResults) {
|
||||
results[item.source].push(item);
|
||||
}
|
||||
|
||||
return results;
|
||||
};
|
||||
|
||||
|
||||
@@ -17,8 +17,12 @@ const TIMEOUT_MS = 5000;
|
||||
export interface LrcLibSearchResponse {
|
||||
albumName: string;
|
||||
artistName: string;
|
||||
duration?: number;
|
||||
id: number;
|
||||
instrumental?: boolean;
|
||||
name: string;
|
||||
plainLyrics: null | string;
|
||||
syncedLyrics: null | string;
|
||||
}
|
||||
|
||||
export interface LrcLibTrackResponse {
|
||||
@@ -42,7 +46,7 @@ export async function getLyricsBySongId(songId: string): Promise<null | string>
|
||||
try {
|
||||
result = await axios.get<LrcLibTrackResponse>(`${FETCH_URL}/${songId}`);
|
||||
} catch (e) {
|
||||
console.error('LrcLib lyrics request got an error!', e);
|
||||
console.error('LrcLib lyrics request got an error!', (e as Error)?.message);
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -65,7 +69,7 @@ export async function getSearchResults(
|
||||
},
|
||||
});
|
||||
} catch (e) {
|
||||
console.error('LrcLib search request got an error!', e);
|
||||
console.error('LrcLib search request got an error!', (e as Error)?.message);
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -75,6 +79,7 @@ export async function getSearchResults(
|
||||
return {
|
||||
artist: song.artistName,
|
||||
id: String(song.id),
|
||||
isSync: song.syncedLyrics ? true : false,
|
||||
name: song.name,
|
||||
source: LyricSource.LRCLIB,
|
||||
};
|
||||
@@ -102,14 +107,13 @@ export async function query(
|
||||
timeout: TIMEOUT_MS,
|
||||
});
|
||||
} catch (e) {
|
||||
console.error('LrcLib search request got an error!', e);
|
||||
console.error('LrcLib search request got an error!', (e as Error).message);
|
||||
return null;
|
||||
}
|
||||
|
||||
const lyrics = result.data.syncedLyrics || result.data.plainLyrics || null;
|
||||
|
||||
if (!lyrics) {
|
||||
console.error(`Could not get lyrics on LrcLib!`);
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@@ -128,6 +128,7 @@ export async function getSearchResults(
|
||||
return {
|
||||
artist,
|
||||
id: String(song.id),
|
||||
isSync: null,
|
||||
name: song.name,
|
||||
source: LyricSource.NETEASE,
|
||||
};
|
||||
@@ -141,13 +142,11 @@ export async function query(
|
||||
): Promise<InternetProviderLyricResponse | null> {
|
||||
const lyricsMatch = await getMatchedLyrics(params);
|
||||
if (!lyricsMatch) {
|
||||
console.error('Could not find the song on NetEase!');
|
||||
return null;
|
||||
}
|
||||
|
||||
const lyrics = await getLyricsBySongId(lyricsMatch.id);
|
||||
if (!lyrics) {
|
||||
console.error('Could not get lyrics on NetEase!');
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import Fuse, { IFuseOptions } from 'fuse.js';
|
||||
import Fuse, { FuseResult, IFuseOptions } from 'fuse.js';
|
||||
|
||||
import {
|
||||
InternetProviderLyricSearchResponse,
|
||||
@@ -15,20 +15,81 @@ export const orderSearchResults = (args: {
|
||||
fieldNormWeight: 1,
|
||||
includeScore: true,
|
||||
keys: [
|
||||
{ getFn: (song) => song.name, name: 'name', weight: 3 },
|
||||
{ getFn: (song) => song.artist, name: 'artist' },
|
||||
{ getFn: (song) => song.name, name: 'name', weight: 2 },
|
||||
{ getFn: (song) => song.artist, name: 'artist', weight: 2 },
|
||||
],
|
||||
threshold: 1.0,
|
||||
threshold: 0.6,
|
||||
};
|
||||
|
||||
const fuse = new Fuse(results, options);
|
||||
|
||||
const searchResults = fuse.search<InternetProviderLyricSearchResponse>({
|
||||
...(params.artist && { artist: params.artist }),
|
||||
...(params.name && { name: params.name }),
|
||||
let searchResults: Array<FuseResult<InternetProviderLyricSearchResponse>>;
|
||||
|
||||
if (params.artist && params.name) {
|
||||
const artistFuse = new Fuse(results, {
|
||||
includeScore: true,
|
||||
keys: [{ getFn: (song) => song.artist, name: 'artist' }],
|
||||
threshold: 0.6,
|
||||
});
|
||||
|
||||
const nameFuse = new Fuse(results, {
|
||||
includeScore: true,
|
||||
keys: [{ getFn: (song) => song.name, name: 'name' }],
|
||||
threshold: 0.6,
|
||||
});
|
||||
|
||||
const artistResults = artistFuse.search(params.artist);
|
||||
const nameResults = nameFuse.search(params.name);
|
||||
|
||||
const artistScores = new Map(artistResults.map((r) => [r.item.id, r.score ?? 1]));
|
||||
const nameScores = new Map(nameResults.map((r) => [r.item.id, r.score ?? 1]));
|
||||
|
||||
const combinedResults = new Map<string, FuseResult<InternetProviderLyricSearchResponse>>();
|
||||
|
||||
artistResults.forEach((result) => {
|
||||
const nameScore = nameScores.get(result.item.id);
|
||||
if (nameScore !== undefined) {
|
||||
const combinedScore = Math.max(result.score ?? 1, nameScore);
|
||||
combinedResults.set(result.item.id, {
|
||||
...result,
|
||||
score: combinedScore,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
nameResults.forEach((result) => {
|
||||
if (!combinedResults.has(result.item.id)) {
|
||||
const artistScore = artistScores.get(result.item.id);
|
||||
if (artistScore !== undefined) {
|
||||
const combinedScore = Math.max(result.score ?? 1, artistScore);
|
||||
combinedResults.set(result.item.id, {
|
||||
...result,
|
||||
score: combinedScore,
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
searchResults = Array.from(combinedResults.values());
|
||||
} else {
|
||||
searchResults = fuse.search<InternetProviderLyricSearchResponse>({
|
||||
...(params.artist && { artist: params.artist }),
|
||||
...(params.name && { name: params.name }),
|
||||
});
|
||||
}
|
||||
|
||||
const sortedResults = searchResults.sort((a, b) => {
|
||||
const aIsSync = a.item.isSync === true ? 1 : 0;
|
||||
const bIsSync = b.item.isSync === true ? 1 : 0;
|
||||
|
||||
if (aIsSync !== bIsSync) {
|
||||
return bIsSync - aIsSync;
|
||||
}
|
||||
|
||||
return (a.score || 0) - (b.score || 0);
|
||||
});
|
||||
|
||||
return searchResults.map((result) => ({
|
||||
return sortedResults.map((result) => ({
|
||||
...result.item,
|
||||
score: result.score,
|
||||
}));
|
||||
|
||||
@@ -525,6 +525,63 @@ ipcMain.handle(
|
||||
},
|
||||
);
|
||||
|
||||
ipcMain.handle(
|
||||
'player-get-audio-devices',
|
||||
async (): Promise<{ label: string; value: string }[]> => {
|
||||
try {
|
||||
const instance = getMpvInstance();
|
||||
let tempInstance: MpvAPI | null = null;
|
||||
let mpvToUse: MpvAPI | null = null;
|
||||
|
||||
if (instance && instance.isRunning()) {
|
||||
mpvToUse = instance;
|
||||
} else {
|
||||
try {
|
||||
tempInstance = await createMpv({});
|
||||
mpvToUse = tempInstance;
|
||||
} catch (err: any | NodeMpvError) {
|
||||
mpvLog(
|
||||
{ action: 'Failed to create temporary MPV instance for audio device list' },
|
||||
err,
|
||||
);
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
const deviceList = await mpvToUse.getProperty('audio-device-list');
|
||||
|
||||
if (!deviceList || !Array.isArray(deviceList)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const devices = deviceList.map((device: any) => {
|
||||
const name = device.name || device.description || 'Unknown Device';
|
||||
const description = device.description || '';
|
||||
const label = description ? `${name} (${description})` : name;
|
||||
return {
|
||||
label,
|
||||
value: name,
|
||||
};
|
||||
});
|
||||
|
||||
return devices;
|
||||
} finally {
|
||||
if (tempInstance && tempInstance !== instance) {
|
||||
try {
|
||||
await quit(tempInstance);
|
||||
} catch {
|
||||
// Ignore
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (err: any | NodeMpvError) {
|
||||
mpvLog({ action: 'Failed to get audio devices' }, err);
|
||||
return [];
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
enum MpvState {
|
||||
STARTED,
|
||||
IN_PROGRESS,
|
||||
|
||||
@@ -620,8 +620,11 @@ ipcMain.on('update-playback', (_event, status: PlayerStatus) => {
|
||||
broadcast({ data: status, event: 'playback' });
|
||||
});
|
||||
|
||||
ipcMain.on('update-song', (_event, song: QueueSong | undefined) => {
|
||||
ipcMain.on('update-song', (_event, song: QueueSong | undefined, imageUrl?: null | string) => {
|
||||
const songChanged = song?.id !== currentState.song?.id;
|
||||
if (song) {
|
||||
song.imageUrl = imageUrl || null;
|
||||
}
|
||||
currentState.song = song;
|
||||
|
||||
if (songChanged) {
|
||||
@@ -657,6 +660,9 @@ if (mprisPlayer) {
|
||||
}
|
||||
currentState.volume = volume;
|
||||
broadcast({ data: volume, event: 'volume' });
|
||||
getMainWindow()?.webContents.send('request-volume', {
|
||||
volume,
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -1,12 +1,51 @@
|
||||
import type { TitleTheme } from '/@/shared/types/types';
|
||||
|
||||
import { dialog, ipcMain, nativeTheme, OpenDialogOptions, safeStorage } from 'electron';
|
||||
import { app, dialog, ipcMain, nativeTheme, OpenDialogOptions, safeStorage } from 'electron';
|
||||
import Store from 'electron-store';
|
||||
import path from 'path';
|
||||
|
||||
export const store = new Store({
|
||||
const getFrame = () => {
|
||||
const isWindows = process.platform === 'win32';
|
||||
const isMacOS = process.platform === 'darwin';
|
||||
|
||||
if (isWindows) {
|
||||
return 'windows';
|
||||
}
|
||||
|
||||
if (isMacOS) {
|
||||
return 'macOS';
|
||||
}
|
||||
|
||||
return 'linux';
|
||||
};
|
||||
|
||||
const isDevelopment = process.env.NODE_ENV === 'development';
|
||||
|
||||
const defaultUserDataPath = app.getPath('userData');
|
||||
const storePath = isDevelopment
|
||||
? path.normalize(`${defaultUserDataPath}-dev`)
|
||||
: path.normalize(defaultUserDataPath);
|
||||
|
||||
export const store = new Store<any>({
|
||||
beforeEachMigration: (_store, context) => {
|
||||
console.log(`settings migrate from ${context.fromVersion} → ${context.toVersion}`);
|
||||
},
|
||||
cwd: storePath,
|
||||
defaults: {
|
||||
disable_auto_updates: false,
|
||||
enableNeteaseTranslation: false,
|
||||
global_media_hotkeys: true,
|
||||
lyrics: ['NetEase', 'lrclib.net'],
|
||||
mediaSession: false,
|
||||
playbackType: 'web',
|
||||
should_prompt_accessibility: true,
|
||||
shown_accessibility_warning: false,
|
||||
window_enable_tray: true,
|
||||
window_exit_to_tray: false,
|
||||
window_minimize_to_tray: false,
|
||||
window_start_minimized: false,
|
||||
window_window_bar_style: getFrame(),
|
||||
},
|
||||
migrations: {
|
||||
'>=0.21.2': (store) => {
|
||||
store.set('window_bar_style', 'linux');
|
||||
@@ -22,7 +61,11 @@ ipcMain.handle('settings-get', (_event, data: { property: string }) => {
|
||||
});
|
||||
|
||||
ipcMain.on('settings-set', (__event, data: { property: string; value: any }) => {
|
||||
store.set(`${data.property}`, data.value);
|
||||
if (data.value === undefined) {
|
||||
store.delete(data.property);
|
||||
} else {
|
||||
store.set(data.property, data.value);
|
||||
}
|
||||
});
|
||||
|
||||
ipcMain.handle('password-get', (_event, server: string): null | string => {
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
import { app, ipcMain, Menu } from 'electron';
|
||||
|
||||
import { getMainWindow } from '/@/main/index';
|
||||
import { PlayerStatus } from '/@/shared/types/types';
|
||||
|
||||
let currentStatus: PlayerStatus = PlayerStatus.PAUSED;
|
||||
|
||||
const updateDockMenu = () => {
|
||||
if (!app.dock) return;
|
||||
|
||||
const isPlaying = currentStatus === PlayerStatus.PLAYING;
|
||||
|
||||
const dockMenu = Menu.buildFromTemplate([
|
||||
{
|
||||
click: () => {
|
||||
getMainWindow()?.webContents.send('renderer-player-play-pause');
|
||||
},
|
||||
label: isPlaying ? 'Pause' : 'Play',
|
||||
},
|
||||
{
|
||||
type: 'separator',
|
||||
},
|
||||
{
|
||||
click: () => {
|
||||
getMainWindow()?.webContents.send('renderer-player-next');
|
||||
},
|
||||
label: 'Next',
|
||||
},
|
||||
{
|
||||
click: () => {
|
||||
getMainWindow()?.webContents.send('renderer-player-previous');
|
||||
},
|
||||
label: 'Previous',
|
||||
},
|
||||
{
|
||||
type: 'separator',
|
||||
},
|
||||
{
|
||||
click: () => {
|
||||
getMainWindow()?.webContents.send('renderer-player-stop');
|
||||
},
|
||||
label: 'Stop',
|
||||
},
|
||||
]);
|
||||
|
||||
app.dock.setMenu(dockMenu);
|
||||
};
|
||||
|
||||
ipcMain.on('update-playback', (_event, status: PlayerStatus) => {
|
||||
currentStatus = status;
|
||||
updateDockMenu();
|
||||
});
|
||||
|
||||
// Initialize dock menu after app is ready
|
||||
app.whenReady().then(() => {
|
||||
updateDockMenu();
|
||||
});
|
||||
@@ -0,0 +1 @@
|
||||
import './dock-menu';
|
||||
|
||||
@@ -141,48 +141,48 @@ ipcMain.on('update-shuffle', (_event, shuffle: boolean) => {
|
||||
mprisPlayer.shuffle = shuffle;
|
||||
});
|
||||
|
||||
ipcMain.on('update-song', (_event, song: QueueSong | undefined) => {
|
||||
try {
|
||||
if (!song?.id) {
|
||||
mprisPlayer.metadata = {};
|
||||
return;
|
||||
ipcMain.on(
|
||||
'update-song',
|
||||
(_event, song: QueueSong | undefined, imageUrl: null | string | undefined) => {
|
||||
try {
|
||||
if (!song?.id) {
|
||||
mprisPlayer.metadata = {};
|
||||
return;
|
||||
}
|
||||
|
||||
mprisPlayer.metadata = {
|
||||
'mpris:artUrl': imageUrl || null,
|
||||
'mpris:length': song.duration ? Math.round((song.duration || 0) * 1e3) : null,
|
||||
'mpris:trackid': song.id
|
||||
? mprisPlayer.objectPath(`track/${song.id?.replace('-', '')}`)
|
||||
: '',
|
||||
'xesam:album': song.album || null,
|
||||
'xesam:albumArtist': song.albumArtists?.length
|
||||
? song.albumArtists.map((artist) => artist.name)
|
||||
: null,
|
||||
'xesam:artist': song.artists?.length
|
||||
? song.artists.map((artist) => artist.name)
|
||||
: null,
|
||||
'xesam:audioBpm': song.bpm,
|
||||
// Comment is a `list of strings` type
|
||||
'xesam:comment': song.comment ? [song.comment] : null,
|
||||
'xesam:contentCreated': song.releaseDate,
|
||||
'xesam:discNumber': song.discNumber ? song.discNumber : null,
|
||||
'xesam:genre': song.genres?.length
|
||||
? song.genres.map((genre: any) => genre.name)
|
||||
: null,
|
||||
'xesam:lastUsed': song.lastPlayedAt,
|
||||
'xesam:title': song.name || null,
|
||||
'xesam:trackNumber': song.trackNumber ? song.trackNumber : null,
|
||||
'xesam:useCount':
|
||||
song.playCount !== null && song.playCount !== undefined ? song.playCount : null,
|
||||
// User ratings are only on Navidrome/Subsonic and are on a scale of 1-5
|
||||
'xesam:userRating': song.userRating ? song.userRating / 5 : null,
|
||||
};
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
}
|
||||
|
||||
const upsizedImageUrl = song.imageUrl
|
||||
? song.imageUrl
|
||||
?.replace(/&size=\d+/, '&size=300')
|
||||
.replace(/\?width=\d+/, '?width=300')
|
||||
.replace(/&height=\d+/, '&height=300')
|
||||
: null;
|
||||
|
||||
mprisPlayer.metadata = {
|
||||
'mpris:artUrl': upsizedImageUrl,
|
||||
'mpris:length': song.duration ? Math.round((song.duration || 0) * 1e3) : null,
|
||||
'mpris:trackid': song.id
|
||||
? mprisPlayer.objectPath(`track/${song.id?.replace('-', '')}`)
|
||||
: '',
|
||||
'xesam:album': song.album || null,
|
||||
'xesam:albumArtist': song.albumArtists?.length
|
||||
? song.albumArtists.map((artist) => artist.name)
|
||||
: null,
|
||||
'xesam:artist': song.artists?.length ? song.artists.map((artist) => artist.name) : null,
|
||||
'xesam:audioBpm': song.bpm,
|
||||
// Comment is a `list of strings` type
|
||||
'xesam:comment': song.comment ? [song.comment] : null,
|
||||
'xesam:contentCreated': song.releaseDate,
|
||||
'xesam:discNumber': song.discNumber ? song.discNumber : null,
|
||||
'xesam:genre': song.genres?.length ? song.genres.map((genre: any) => genre.name) : null,
|
||||
'xesam:lastUsed': song.lastPlayedAt,
|
||||
'xesam:title': song.name || null,
|
||||
'xesam:trackNumber': song.trackNumber ? song.trackNumber : null,
|
||||
'xesam:useCount':
|
||||
song.playCount !== null && song.playCount !== undefined ? song.playCount : null,
|
||||
// User ratings are only on Navidrome/Subsonic and are on a scale of 1-5
|
||||
'xesam:userRating': song.userRating ? song.userRating / 5 : null,
|
||||
};
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
}
|
||||
});
|
||||
},
|
||||
);
|
||||
|
||||
export { mprisPlayer };
|
||||
|
||||
@@ -30,6 +30,7 @@ import MenuBuilder from './menu';
|
||||
import {
|
||||
autoUpdaterLogInterface,
|
||||
createLog,
|
||||
disableAutoUpdates,
|
||||
hotkeyToElectronAccelerator,
|
||||
isLinux,
|
||||
isMacOS,
|
||||
@@ -46,15 +47,24 @@ export default class AppUpdater {
|
||||
|
||||
const isBetaVersion = packageJson.version.includes('-beta');
|
||||
const releaseChannel = store.get('release_channel');
|
||||
const isNotConfigured = !releaseChannel;
|
||||
|
||||
console.log('[AppUpdater] Release channel from store: ', releaseChannel);
|
||||
console.log('[AppUpdater] Is beta version: ', isBetaVersion);
|
||||
console.log('Release channel: ', releaseChannel);
|
||||
console.log('Is beta version: ', isBetaVersion);
|
||||
|
||||
if (isNotConfigured) {
|
||||
console.log(
|
||||
'Release channel not configured, setting to ',
|
||||
isBetaVersion ? 'beta' : 'latest',
|
||||
);
|
||||
store.set('release_channel', isBetaVersion ? 'beta' : 'latest');
|
||||
}
|
||||
|
||||
if (releaseChannel === 'beta') {
|
||||
autoUpdater.channel = 'beta';
|
||||
autoUpdater.allowPrerelease = true;
|
||||
autoUpdater.disableDifferentialDownload = true;
|
||||
} else {
|
||||
} else if (releaseChannel === 'latest') {
|
||||
autoUpdater.channel = 'latest';
|
||||
autoUpdater.allowDowngrade = true;
|
||||
autoUpdater.allowPrerelease = false;
|
||||
@@ -116,7 +126,9 @@ const installExtensions = async () => {
|
||||
type: 'info',
|
||||
});
|
||||
})
|
||||
.catch(console.error);
|
||||
.catch(() => {
|
||||
// Ignore
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
@@ -175,13 +187,21 @@ const createWinThumbarButtons = () => {
|
||||
};
|
||||
|
||||
const createTray = () => {
|
||||
let trayIcon: Electron.NativeImage | string;
|
||||
|
||||
if (isMacOS()) {
|
||||
return;
|
||||
const iconPath = getAssetPath('icons/IconTemplate.png');
|
||||
const icon = nativeImage.createFromPath(iconPath);
|
||||
icon.setTemplateImage(true);
|
||||
trayIcon = icon;
|
||||
} else if (isLinux()) {
|
||||
trayIcon = getAssetPath('icons/icon.png');
|
||||
} else {
|
||||
trayIcon = getAssetPath('icons/icon.ico');
|
||||
}
|
||||
|
||||
tray = isLinux()
|
||||
? new Tray(getAssetPath('icons/icon.png'))
|
||||
: new Tray(getAssetPath('icons/icon.ico'));
|
||||
tray = new Tray(trayIcon);
|
||||
|
||||
const contextMenu = Menu.buildFromTemplate([
|
||||
{
|
||||
click: () => {
|
||||
@@ -265,8 +285,8 @@ async function createWindow(first = true): Promise<void> {
|
||||
autoHideMenuBar: true,
|
||||
frame: false,
|
||||
height: 900,
|
||||
icon: getAssetPath('icons/icon.png'),
|
||||
minHeight: 640,
|
||||
icon: isWindows() ? getAssetPath('icons/icon.ico') : getAssetPath('icons/icon.png'),
|
||||
minHeight: 120,
|
||||
minWidth: 480,
|
||||
show: false,
|
||||
webPreferences: {
|
||||
@@ -447,7 +467,7 @@ async function createWindow(first = true): Promise<void> {
|
||||
return { action: 'deny' };
|
||||
});
|
||||
|
||||
if (store.get('disable_auto_updates') !== true) {
|
||||
if (!disableAutoUpdates() && store.get('disable_auto_updates') !== true) {
|
||||
new AppUpdater();
|
||||
}
|
||||
|
||||
@@ -487,6 +507,9 @@ if (shouldDisableMediaFeatures) {
|
||||
// https://github.com/electron/electron/issues/46538#issuecomment-2808806722
|
||||
app.commandLine.appendSwitch('gtk-version', '3');
|
||||
|
||||
// Enable garbage collection API
|
||||
app.commandLine.appendSwitch('js-flags', '--expose-gc');
|
||||
|
||||
// Must duplicate with the one in renderer process settings.store.ts
|
||||
enum BindingActions {
|
||||
GLOBAL_SEARCH = 'globalSearch',
|
||||
|
||||
@@ -18,6 +18,10 @@ if (process.env.NODE_ENV === 'development') {
|
||||
};
|
||||
}
|
||||
|
||||
export const disableAutoUpdates = () => {
|
||||
return process.env['DISABLE_AUTO_UPDATES'];
|
||||
};
|
||||
|
||||
export const isMacOS = () => {
|
||||
return process.platform === 'darwin';
|
||||
};
|
||||
|
||||
@@ -6,6 +6,7 @@ declare global {
|
||||
interface Window {
|
||||
api: PreloadApi;
|
||||
electron: ElectronAPI;
|
||||
LEGACY_AUTHENTICATION?: boolean;
|
||||
queryLocalFonts?: () => Promise<Font[]>;
|
||||
SERVER_LOCK?: boolean;
|
||||
SERVER_NAME?: string;
|
||||
|
||||
@@ -1,24 +1,16 @@
|
||||
import { ipcRenderer, IpcRendererEvent, OpenDialogOptions, webFrame } from 'electron';
|
||||
import Store from 'electron-store';
|
||||
|
||||
import { TitleTheme } from '/@/shared/types/types';
|
||||
|
||||
const store = new Store();
|
||||
|
||||
const set = (
|
||||
property: string,
|
||||
value: boolean | Record<string, unknown> | string | string[] | undefined,
|
||||
) => {
|
||||
if (value === undefined) {
|
||||
store.delete(property);
|
||||
return;
|
||||
}
|
||||
|
||||
store.set(`${property}`, value);
|
||||
ipcRenderer.send('settings-set', { property, value });
|
||||
};
|
||||
|
||||
const get = (property: string) => {
|
||||
return store.get(`${property}`);
|
||||
const get = async (property: string) => {
|
||||
return ipcRenderer.invoke('settings-get', { property });
|
||||
};
|
||||
|
||||
const restart = () => {
|
||||
@@ -78,14 +70,22 @@ export const toServerType = (value?: string): null | string => {
|
||||
const SERVER_TYPE = toServerType(process.env.SERVER_TYPE);
|
||||
|
||||
const env = {
|
||||
LEGACY_AUTHENTICATION:
|
||||
SERVER_TYPE !== null
|
||||
? process.env.LEGACY_AUTHENTICATION?.toLocaleLowerCase() === 'true'
|
||||
: false,
|
||||
SERVER_LOCK:
|
||||
SERVER_TYPE !== null ? process.env.SERVER_LOCK?.toLocaleLowerCase() === 'true' : false,
|
||||
SERVER_NAME: process.env.SERVER_NAME ?? '',
|
||||
SERVER_TYPE,
|
||||
SERVER_URL: process.env.SERVER_URL ?? 'http://',
|
||||
START_MAXIMIZED: store.get('maximized'),
|
||||
START_MAXIMIZED: undefined as boolean | undefined,
|
||||
};
|
||||
|
||||
get('maximized').then((value) => {
|
||||
env.START_MAXIMIZED = value as boolean | undefined;
|
||||
});
|
||||
|
||||
export const localSettings = {
|
||||
disableMediaKeys,
|
||||
enableMediaKeys,
|
||||
|
||||
@@ -27,8 +27,8 @@ const updateShuffle = (shuffle: boolean) => {
|
||||
ipcRenderer.send('update-shuffle', shuffle);
|
||||
};
|
||||
|
||||
const updateSong = (song: QueueSong | undefined) => {
|
||||
ipcRenderer.send('update-song', song);
|
||||
const updateSong = (song: QueueSong | undefined, imageUrl?: null | string) => {
|
||||
ipcRenderer.send('update-song', song, imageUrl);
|
||||
};
|
||||
|
||||
const requestSeek = (cb: (event: IpcRendererEvent, data: { offset: number }) => void) => {
|
||||
@@ -51,11 +51,16 @@ const requestToggleShuffle = (
|
||||
ipcRenderer.on('mpris-request-toggle-shuffle', cb);
|
||||
};
|
||||
|
||||
const requestVolume = (cb: (event: IpcRendererEvent, data: { volume: number }) => void) => {
|
||||
ipcRenderer.on('request-volume', cb);
|
||||
};
|
||||
|
||||
export const mpris = {
|
||||
requestPosition,
|
||||
requestSeek,
|
||||
requestToggleRepeat,
|
||||
requestToggleShuffle,
|
||||
requestVolume,
|
||||
updatePosition,
|
||||
updateRepeat,
|
||||
updateSeek,
|
||||
|
||||
@@ -98,6 +98,10 @@ const getStreamMetadata = async () => {
|
||||
return ipcRenderer.invoke('player-stream-metadata');
|
||||
};
|
||||
|
||||
const getAudioDevices = async () => {
|
||||
return ipcRenderer.invoke('player-get-audio-devices');
|
||||
};
|
||||
|
||||
const rendererAutoNext = (cb: (event: IpcRendererEvent, data: PlayerData) => void) => {
|
||||
ipcRenderer.on('renderer-player-auto-next', cb);
|
||||
};
|
||||
@@ -174,6 +178,7 @@ export const mpvPlayer = {
|
||||
autoNext,
|
||||
cleanup,
|
||||
currentTime,
|
||||
getAudioDevices,
|
||||
getCurrentTime,
|
||||
getMetadata,
|
||||
getStreamMetadata,
|
||||
|
||||
@@ -73,8 +73,8 @@ const updateShuffle = (shuffle: boolean) => {
|
||||
ipcRenderer.send('update-shuffle', shuffle);
|
||||
};
|
||||
|
||||
const updateSong = (args: QueueSong | undefined) => {
|
||||
ipcRenderer.send('update-song', args);
|
||||
const updateSong = (song: QueueSong | undefined, imageUrl?: null | string) => {
|
||||
ipcRenderer.send('update-song', song, imageUrl);
|
||||
};
|
||||
|
||||
const updateUsername = (username: string) => {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { ipcRenderer, IpcRendererEvent } from 'electron';
|
||||
import { ipcRenderer, IpcRendererEvent, webFrame } from 'electron';
|
||||
|
||||
import { isLinux, isMacOS, isWindows } from '../main/utils';
|
||||
import { disableAutoUpdates, isLinux, isMacOS, isWindows } from '../main/utils';
|
||||
|
||||
const openItem = async (path: string) => {
|
||||
return ipcRenderer.invoke('open-item', path);
|
||||
@@ -39,8 +39,28 @@ const download = (url: string) => {
|
||||
ipcRenderer.send('download-url', url);
|
||||
};
|
||||
|
||||
const forceGarbageCollection = (): boolean => {
|
||||
try {
|
||||
if (typeof global.gc === 'function') {
|
||||
global.gc();
|
||||
webFrame.clearCache();
|
||||
return true;
|
||||
}
|
||||
if (typeof window.gc === 'function') {
|
||||
window.gc();
|
||||
webFrame.clearCache();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
export const utils = {
|
||||
disableAutoUpdates,
|
||||
download,
|
||||
forceGarbageCollection,
|
||||
isLinux,
|
||||
isMacOS,
|
||||
isWindows,
|
||||
|
||||
@@ -3,7 +3,7 @@ import { JellyfinController } from '/@/renderer/api/jellyfin/jellyfin-controller
|
||||
import { NavidromeController } from '/@/renderer/api/navidrome/navidrome-controller';
|
||||
import { SubsonicController } from '/@/renderer/api/subsonic/subsonic-controller';
|
||||
import { mergeMusicFolderId } from '/@/renderer/api/utils-music-folder';
|
||||
import { getServerById, useAuthStore } from '/@/renderer/store';
|
||||
import { getServerById, useAuthStore, useSettingsStore } from '/@/renderer/store';
|
||||
import { toast } from '/@/shared/components/toast/toast';
|
||||
import {
|
||||
AuthenticationResponse,
|
||||
@@ -60,6 +60,22 @@ const apiController = <K extends keyof ControllerEndpoint>(
|
||||
return controllerFn;
|
||||
};
|
||||
|
||||
const getPathReplaceSettings = () => {
|
||||
const { pathReplace, pathReplaceWith } = useSettingsStore.getState().general;
|
||||
return { pathReplace, pathReplaceWith };
|
||||
};
|
||||
|
||||
const addContext = <T extends { apiClientProps: any; context?: any }>(args: T): T => {
|
||||
const pathSettings = getPathReplaceSettings();
|
||||
return {
|
||||
...args,
|
||||
context: {
|
||||
...(args.context || {}),
|
||||
...pathSettings,
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
export interface GeneralController extends Omit<Required<ControllerEndpoint>, 'authenticate'> {
|
||||
authenticate: (
|
||||
url: string,
|
||||
@@ -81,7 +97,7 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'addToPlaylist',
|
||||
server.type,
|
||||
)?.({ ...args, apiClientProps: { ...args.apiClientProps, server } });
|
||||
)?.(addContext({ ...args, apiClientProps: { ...args.apiClientProps, server } }));
|
||||
},
|
||||
authenticate(url, body, type) {
|
||||
return apiController('authenticate', type)(url, body);
|
||||
@@ -98,7 +114,7 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'createFavorite',
|
||||
server.type,
|
||||
)?.({ ...args, apiClientProps: { ...args.apiClientProps, server } });
|
||||
)?.(addContext({ ...args, apiClientProps: { ...args.apiClientProps, server } }));
|
||||
},
|
||||
createInternetRadioStation(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -112,7 +128,7 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'createInternetRadioStation',
|
||||
server.type,
|
||||
)?.({ ...args, apiClientProps: { ...args.apiClientProps, server } });
|
||||
)?.(addContext({ ...args, apiClientProps: { ...args.apiClientProps, server } }));
|
||||
},
|
||||
createPlaylist(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -126,7 +142,7 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'createPlaylist',
|
||||
server.type,
|
||||
)?.({ ...args, apiClientProps: { ...args.apiClientProps, server } });
|
||||
)?.(addContext({ ...args, apiClientProps: { ...args.apiClientProps, server } }));
|
||||
},
|
||||
deleteFavorite(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -140,7 +156,7 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'deleteFavorite',
|
||||
server.type,
|
||||
)?.({ ...args, apiClientProps: { ...args.apiClientProps, server } });
|
||||
)?.(addContext({ ...args, apiClientProps: { ...args.apiClientProps, server } }));
|
||||
},
|
||||
deleteInternetRadioStation(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -154,7 +170,7 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'deleteInternetRadioStation',
|
||||
server.type,
|
||||
)?.({ ...args, apiClientProps: { ...args.apiClientProps, server } });
|
||||
)?.(addContext({ ...args, apiClientProps: { ...args.apiClientProps, server } }));
|
||||
},
|
||||
deletePlaylist(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -168,7 +184,7 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'deletePlaylist',
|
||||
server.type,
|
||||
)?.({ ...args, apiClientProps: { ...args.apiClientProps, server } });
|
||||
)?.(addContext({ ...args, apiClientProps: { ...args.apiClientProps, server } }));
|
||||
},
|
||||
getAlbumArtistDetail(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -182,7 +198,7 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'getAlbumArtistDetail',
|
||||
server.type,
|
||||
)?.({ ...args, apiClientProps: { ...args.apiClientProps, server } });
|
||||
)?.(addContext({ ...args, apiClientProps: { ...args.apiClientProps, server } }));
|
||||
},
|
||||
getAlbumArtistList(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -196,11 +212,13 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'getAlbumArtistList',
|
||||
server.type,
|
||||
)?.({
|
||||
...args,
|
||||
apiClientProps: { ...args.apiClientProps, server },
|
||||
query: mergeMusicFolderId(args.query, server),
|
||||
});
|
||||
)?.(
|
||||
addContext({
|
||||
...args,
|
||||
apiClientProps: { ...args.apiClientProps, server },
|
||||
query: mergeMusicFolderId(args.query, server),
|
||||
}),
|
||||
);
|
||||
},
|
||||
getAlbumArtistListCount(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -214,11 +232,13 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'getAlbumArtistListCount',
|
||||
server.type,
|
||||
)?.({
|
||||
...args,
|
||||
apiClientProps: { ...args.apiClientProps, server },
|
||||
query: mergeMusicFolderId(args.query, server),
|
||||
});
|
||||
)?.(
|
||||
addContext({
|
||||
...args,
|
||||
apiClientProps: { ...args.apiClientProps, server },
|
||||
query: mergeMusicFolderId(args.query, server),
|
||||
}),
|
||||
);
|
||||
},
|
||||
getAlbumDetail(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -232,7 +252,7 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'getAlbumDetail',
|
||||
server.type,
|
||||
)?.({ ...args, apiClientProps: { ...args.apiClientProps, server } });
|
||||
)?.(addContext({ ...args, apiClientProps: { ...args.apiClientProps, server } }));
|
||||
},
|
||||
getAlbumInfo(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -246,7 +266,7 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'getAlbumInfo',
|
||||
server.type,
|
||||
)?.({ ...args, apiClientProps: { ...args.apiClientProps, server } });
|
||||
)?.(addContext({ ...args, apiClientProps: { ...args.apiClientProps, server } }));
|
||||
},
|
||||
getAlbumList(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -260,11 +280,13 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'getAlbumList',
|
||||
server.type,
|
||||
)?.({
|
||||
...args,
|
||||
apiClientProps: { ...args.apiClientProps, server },
|
||||
query: mergeMusicFolderId(args.query, server),
|
||||
});
|
||||
)?.(
|
||||
addContext({
|
||||
...args,
|
||||
apiClientProps: { ...args.apiClientProps, server },
|
||||
query: mergeMusicFolderId(args.query, server),
|
||||
}),
|
||||
);
|
||||
},
|
||||
getAlbumListCount(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -278,11 +300,13 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'getAlbumListCount',
|
||||
server.type,
|
||||
)?.({
|
||||
...args,
|
||||
apiClientProps: { ...args.apiClientProps, server },
|
||||
query: mergeMusicFolderId(args.query, server),
|
||||
});
|
||||
)?.(
|
||||
addContext({
|
||||
...args,
|
||||
apiClientProps: { ...args.apiClientProps, server },
|
||||
query: mergeMusicFolderId(args.query, server),
|
||||
}),
|
||||
);
|
||||
},
|
||||
getArtistList(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -296,11 +320,13 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'getArtistList',
|
||||
server.type,
|
||||
)?.({
|
||||
...args,
|
||||
apiClientProps: { ...args.apiClientProps, server },
|
||||
query: mergeMusicFolderId(args.query, server),
|
||||
});
|
||||
)?.(
|
||||
addContext({
|
||||
...args,
|
||||
apiClientProps: { ...args.apiClientProps, server },
|
||||
query: mergeMusicFolderId(args.query, server),
|
||||
}),
|
||||
);
|
||||
},
|
||||
getArtistListCount(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -314,11 +340,27 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'getArtistListCount',
|
||||
server.type,
|
||||
)?.({
|
||||
...args,
|
||||
apiClientProps: { ...args.apiClientProps, server },
|
||||
query: mergeMusicFolderId(args.query, server),
|
||||
});
|
||||
)?.(
|
||||
addContext({
|
||||
...args,
|
||||
apiClientProps: { ...args.apiClientProps, server },
|
||||
query: mergeMusicFolderId(args.query, server),
|
||||
}),
|
||||
);
|
||||
},
|
||||
getArtistRadio(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
throw new Error(
|
||||
`${i18n.t('error.apiRouteError', { postProcess: 'sentenceCase' })}: getArtistRadio`,
|
||||
);
|
||||
}
|
||||
|
||||
return apiController(
|
||||
'getArtistRadio',
|
||||
server.type,
|
||||
)?.(addContext({ ...args, apiClientProps: { ...args.apiClientProps, server } }));
|
||||
},
|
||||
getDownloadUrl(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -332,7 +374,7 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'getDownloadUrl',
|
||||
server.type,
|
||||
)?.({ ...args, apiClientProps: { ...args.apiClientProps, server } });
|
||||
)?.(addContext({ ...args, apiClientProps: { ...args.apiClientProps, server } }));
|
||||
},
|
||||
getFolder(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -346,11 +388,13 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'getFolder',
|
||||
server.type,
|
||||
)?.({
|
||||
...args,
|
||||
apiClientProps: { ...args.apiClientProps, server },
|
||||
query: mergeMusicFolderId(args.query, server),
|
||||
});
|
||||
)?.(
|
||||
addContext({
|
||||
...args,
|
||||
apiClientProps: { ...args.apiClientProps, server },
|
||||
query: mergeMusicFolderId(args.query, server),
|
||||
}),
|
||||
);
|
||||
},
|
||||
getGenreList(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -364,11 +408,32 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'getGenreList',
|
||||
server.type,
|
||||
)?.({
|
||||
...args,
|
||||
apiClientProps: { ...args.apiClientProps, server },
|
||||
query: mergeMusicFolderId(args.query, server),
|
||||
});
|
||||
)?.(
|
||||
addContext({
|
||||
...args,
|
||||
apiClientProps: { ...args.apiClientProps, server },
|
||||
query: mergeMusicFolderId(args.query, server),
|
||||
}),
|
||||
);
|
||||
},
|
||||
getImageUrl(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
|
||||
if (!server) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
apiController(
|
||||
'getImageUrl',
|
||||
server.type,
|
||||
)?.(
|
||||
addContext({
|
||||
...args,
|
||||
apiClientProps: { ...args.apiClientProps, server },
|
||||
}),
|
||||
) || null
|
||||
);
|
||||
},
|
||||
getInternetRadioStations(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -381,7 +446,7 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'getInternetRadioStations',
|
||||
server.type,
|
||||
)?.({ ...args, apiClientProps: { ...args.apiClientProps, server } });
|
||||
)?.(addContext({ ...args, apiClientProps: { ...args.apiClientProps, server } }));
|
||||
},
|
||||
getLyrics(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -395,7 +460,7 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'getLyrics',
|
||||
server.type,
|
||||
)?.({ ...args, apiClientProps: { ...args.apiClientProps, server } });
|
||||
)?.(addContext({ ...args, apiClientProps: { ...args.apiClientProps, server } }));
|
||||
},
|
||||
getMusicFolderList(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -409,7 +474,7 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'getMusicFolderList',
|
||||
server.type,
|
||||
)?.({ ...args, apiClientProps: { ...args.apiClientProps, server } });
|
||||
)?.(addContext({ ...args, apiClientProps: { ...args.apiClientProps, server } }));
|
||||
},
|
||||
getPlaylistDetail(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -423,7 +488,7 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'getPlaylistDetail',
|
||||
server.type,
|
||||
)?.({ ...args, apiClientProps: { ...args.apiClientProps, server } });
|
||||
)?.(addContext({ ...args, apiClientProps: { ...args.apiClientProps, server } }));
|
||||
},
|
||||
getPlaylistList(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -437,7 +502,7 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'getPlaylistList',
|
||||
server.type,
|
||||
)?.({ ...args, apiClientProps: { ...args.apiClientProps, server } });
|
||||
)?.(addContext({ ...args, apiClientProps: { ...args.apiClientProps, server } }));
|
||||
},
|
||||
getPlaylistListCount(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -451,7 +516,7 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'getPlaylistListCount',
|
||||
server.type,
|
||||
)?.({ ...args, apiClientProps: { ...args.apiClientProps, server } });
|
||||
)?.(addContext({ ...args, apiClientProps: { ...args.apiClientProps, server } }));
|
||||
},
|
||||
getPlaylistSongList(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -465,7 +530,7 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'getPlaylistSongList',
|
||||
server.type,
|
||||
)?.({ ...args, apiClientProps: { ...args.apiClientProps, server } });
|
||||
)?.(addContext({ ...args, apiClientProps: { ...args.apiClientProps, server } }));
|
||||
},
|
||||
getPlayQueue(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -479,7 +544,7 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'getPlayQueue',
|
||||
server.type,
|
||||
)?.({ ...args, apiClientProps: { ...args.apiClientProps, server } });
|
||||
)?.(addContext({ ...args, apiClientProps: { ...args.apiClientProps, server } }));
|
||||
},
|
||||
getRandomSongList(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -493,7 +558,13 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'getRandomSongList',
|
||||
server.type,
|
||||
)?.({ ...args, apiClientProps: { ...args.apiClientProps, server } });
|
||||
)?.(
|
||||
addContext({
|
||||
...args,
|
||||
apiClientProps: { ...args.apiClientProps, server },
|
||||
query: mergeMusicFolderId(args.query, server),
|
||||
}),
|
||||
);
|
||||
},
|
||||
getRoles(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -507,7 +578,7 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'getRoles',
|
||||
server.type,
|
||||
)?.({ ...args, apiClientProps: { ...args.apiClientProps, server } });
|
||||
)?.(addContext({ ...args, apiClientProps: { ...args.apiClientProps, server } }));
|
||||
},
|
||||
getServerInfo(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -521,7 +592,7 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'getServerInfo',
|
||||
server.type,
|
||||
)?.({ ...args, apiClientProps: { ...args.apiClientProps, server } });
|
||||
)?.(addContext({ ...args, apiClientProps: { ...args.apiClientProps, server } }));
|
||||
},
|
||||
getSimilarSongs(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -535,7 +606,13 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'getSimilarSongs',
|
||||
server.type,
|
||||
)?.({ ...args, apiClientProps: { ...args.apiClientProps, server } });
|
||||
)?.(
|
||||
addContext({
|
||||
...args,
|
||||
apiClientProps: { ...args.apiClientProps, server },
|
||||
query: mergeMusicFolderId(args.query, server),
|
||||
}),
|
||||
);
|
||||
},
|
||||
getSongDetail(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -549,7 +626,7 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'getSongDetail',
|
||||
server.type,
|
||||
)?.({ ...args, apiClientProps: { ...args.apiClientProps, server } });
|
||||
)?.(addContext({ ...args, apiClientProps: { ...args.apiClientProps, server } }));
|
||||
},
|
||||
getSongList(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -563,11 +640,13 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'getSongList',
|
||||
server.type,
|
||||
)?.({
|
||||
...args,
|
||||
apiClientProps: { ...args.apiClientProps, server },
|
||||
query: mergeMusicFolderId(args.query, server),
|
||||
});
|
||||
)?.(
|
||||
addContext({
|
||||
...args,
|
||||
apiClientProps: { ...args.apiClientProps, server },
|
||||
query: mergeMusicFolderId(args.query, server),
|
||||
}),
|
||||
);
|
||||
},
|
||||
getSongListCount(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -581,11 +660,13 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'getSongListCount',
|
||||
server.type,
|
||||
)?.({
|
||||
...args,
|
||||
apiClientProps: { ...args.apiClientProps, server },
|
||||
query: mergeMusicFolderId(args.query, server),
|
||||
});
|
||||
)?.(
|
||||
addContext({
|
||||
...args,
|
||||
apiClientProps: { ...args.apiClientProps, server },
|
||||
query: mergeMusicFolderId(args.query, server),
|
||||
}),
|
||||
);
|
||||
},
|
||||
getStreamUrl(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -597,7 +678,7 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'getStreamUrl',
|
||||
server.type,
|
||||
)?.({ ...args, apiClientProps: { ...args.apiClientProps, server } });
|
||||
)?.(addContext({ ...args, apiClientProps: { ...args.apiClientProps, server } }));
|
||||
},
|
||||
getStructuredLyrics(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -611,7 +692,7 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'getStructuredLyrics',
|
||||
server.type,
|
||||
)?.({ ...args, apiClientProps: { ...args.apiClientProps, server } });
|
||||
)?.(addContext({ ...args, apiClientProps: { ...args.apiClientProps, server } }));
|
||||
},
|
||||
getTagList(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -625,7 +706,7 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'getTagList',
|
||||
server.type,
|
||||
)?.({ ...args, apiClientProps: { ...args.apiClientProps, server } });
|
||||
)?.(addContext({ ...args, apiClientProps: { ...args.apiClientProps, server } }));
|
||||
},
|
||||
getTopSongs(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -639,7 +720,7 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'getTopSongs',
|
||||
server.type,
|
||||
)?.({ ...args, apiClientProps: { ...args.apiClientProps, server } });
|
||||
)?.(addContext({ ...args, apiClientProps: { ...args.apiClientProps, server } }));
|
||||
},
|
||||
getUserInfo(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -653,7 +734,7 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'getUserInfo',
|
||||
server.type,
|
||||
)?.({ ...args, apiClientProps: { ...args.apiClientProps, server } });
|
||||
)?.(addContext({ ...args, apiClientProps: { ...args.apiClientProps, server } }));
|
||||
},
|
||||
getUserList(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -667,7 +748,7 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'getUserList',
|
||||
server.type,
|
||||
)?.({ ...args, apiClientProps: { ...args.apiClientProps, server } });
|
||||
)?.(addContext({ ...args, apiClientProps: { ...args.apiClientProps, server } }));
|
||||
},
|
||||
movePlaylistItem(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -681,7 +762,7 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'movePlaylistItem',
|
||||
server.type,
|
||||
)?.({ ...args, apiClientProps: { ...args.apiClientProps, server } });
|
||||
)?.(addContext({ ...args, apiClientProps: { ...args.apiClientProps, server } }));
|
||||
},
|
||||
removeFromPlaylist(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -695,7 +776,7 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'removeFromPlaylist',
|
||||
server.type,
|
||||
)?.({ ...args, apiClientProps: { ...args.apiClientProps, server } });
|
||||
)?.(addContext({ ...args, apiClientProps: { ...args.apiClientProps, server } }));
|
||||
},
|
||||
replacePlaylist(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -709,7 +790,7 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'replacePlaylist',
|
||||
server.type,
|
||||
)?.({ ...args, apiClientProps: { ...args.apiClientProps, server } });
|
||||
)?.(addContext({ ...args, apiClientProps: { ...args.apiClientProps, server } }));
|
||||
},
|
||||
savePlayQueue(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -723,7 +804,7 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'savePlayQueue',
|
||||
server.type,
|
||||
)?.({ ...args, apiClientProps: { ...args.apiClientProps, server } });
|
||||
)?.(addContext({ ...args, apiClientProps: { ...args.apiClientProps, server } }));
|
||||
},
|
||||
scrobble(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -737,7 +818,7 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'scrobble',
|
||||
server.type,
|
||||
)?.({ ...args, apiClientProps: { ...args.apiClientProps, server } });
|
||||
)?.(addContext({ ...args, apiClientProps: { ...args.apiClientProps, server } }));
|
||||
},
|
||||
search(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -751,11 +832,13 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'search',
|
||||
server.type,
|
||||
)?.({
|
||||
...args,
|
||||
apiClientProps: { ...args.apiClientProps, server },
|
||||
query: mergeMusicFolderId(args.query, server),
|
||||
});
|
||||
)?.(
|
||||
addContext({
|
||||
...args,
|
||||
apiClientProps: { ...args.apiClientProps, server },
|
||||
query: mergeMusicFolderId(args.query, server),
|
||||
}),
|
||||
);
|
||||
},
|
||||
setRating(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -769,7 +852,7 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'setRating',
|
||||
server.type,
|
||||
)?.({ ...args, apiClientProps: { ...args.apiClientProps, server } });
|
||||
)?.(addContext({ ...args, apiClientProps: { ...args.apiClientProps, server } }));
|
||||
},
|
||||
shareItem(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -783,7 +866,7 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'shareItem',
|
||||
server.type,
|
||||
)?.({ ...args, apiClientProps: { ...args.apiClientProps, server } });
|
||||
)?.(addContext({ ...args, apiClientProps: { ...args.apiClientProps, server } }));
|
||||
},
|
||||
updateInternetRadioStation(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -797,7 +880,7 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'updateInternetRadioStation',
|
||||
server.type,
|
||||
)?.({ ...args, apiClientProps: { ...args.apiClientProps, server } });
|
||||
)?.(addContext({ ...args, apiClientProps: { ...args.apiClientProps, server } }));
|
||||
},
|
||||
updatePlaylist(args) {
|
||||
const server = getServerById(args.apiClientProps.serverId);
|
||||
@@ -811,6 +894,6 @@ export const controller: GeneralController = {
|
||||
return apiController(
|
||||
'updatePlaylist',
|
||||
server.type,
|
||||
)?.({ ...args, apiClientProps: { ...args.apiClientProps, server } });
|
||||
)?.(addContext({ ...args, apiClientProps: { ...args.apiClientProps, server } }));
|
||||
},
|
||||
};
|
||||
|
||||
@@ -9,6 +9,7 @@ import packageJson from '../../../../package.json';
|
||||
import i18n from '/@/i18n/i18n';
|
||||
import { authenticationFailure } from '/@/renderer/api/utils';
|
||||
import { useAuthStore } from '/@/renderer/store';
|
||||
import { getServerUrl } from '/@/renderer/utils/normalize-server-url';
|
||||
import { jfType } from '/@/shared/api/jellyfin/jellyfin-types';
|
||||
import { getClientType } from '/@/shared/api/utils';
|
||||
import { ServerListItemWithCredential } from '/@/shared/types/domain-types';
|
||||
@@ -247,6 +248,15 @@ export const contract = c.router({
|
||||
404: jfType._response.error,
|
||||
},
|
||||
},
|
||||
getStudioList: {
|
||||
method: 'GET',
|
||||
path: 'studios',
|
||||
query: jfType._parameters.studioList,
|
||||
responses: {
|
||||
200: jfType._response.studioList,
|
||||
400: jfType._response.error,
|
||||
},
|
||||
},
|
||||
getTopSongsList: {
|
||||
method: 'GET',
|
||||
path: 'users/:userId/items',
|
||||
@@ -408,7 +418,8 @@ export const jfApiClient = (args: {
|
||||
const { params, path: api } = parsePath(path);
|
||||
|
||||
if (server) {
|
||||
baseUrl = `${server?.url}`;
|
||||
const serverUrl = getServerUrl(server);
|
||||
baseUrl = serverUrl;
|
||||
token = server?.credential;
|
||||
} else {
|
||||
baseUrl = url;
|
||||
|
||||
@@ -6,6 +6,7 @@ import { z } from 'zod';
|
||||
|
||||
import { jfApiClient } from '/@/renderer/api/jellyfin/jellyfin-api';
|
||||
import { useRadioStore } from '/@/renderer/features/radio/store/radio-store';
|
||||
import { getServerUrl } from '/@/renderer/utils/normalize-server-url';
|
||||
import { jfNormalize } from '/@/shared/api/jellyfin/jellyfin-normalize';
|
||||
import { JFSongListSort, JFSortOrder, jfType } from '/@/shared/api/jellyfin/jellyfin-types';
|
||||
import { getFeatures, hasFeature, sortSongList, VersionInfo } from '/@/shared/api/utils';
|
||||
@@ -24,6 +25,7 @@ import {
|
||||
songListSortMap,
|
||||
SortOrder,
|
||||
sortOrderMap,
|
||||
Tag,
|
||||
} from '/@/shared/types/domain-types';
|
||||
import { ServerFeature } from '/@/shared/types/features-types';
|
||||
|
||||
@@ -217,24 +219,25 @@ export const JellyfinController: InternalControllerEndpoint = {
|
||||
throw new Error('No userId found');
|
||||
}
|
||||
|
||||
const res = await jfApiClient(apiClientProps).getAlbumArtistDetail({
|
||||
params: {
|
||||
id: query.id,
|
||||
userId: apiClientProps.server?.userId,
|
||||
},
|
||||
query: {
|
||||
Fields: 'Genres, Overview',
|
||||
},
|
||||
});
|
||||
|
||||
const similarArtistsRes = await jfApiClient(apiClientProps).getSimilarArtistList({
|
||||
params: {
|
||||
id: query.id,
|
||||
},
|
||||
query: {
|
||||
Limit: 10,
|
||||
},
|
||||
});
|
||||
const [res, similarArtistsRes] = await Promise.all([
|
||||
jfApiClient(apiClientProps).getAlbumArtistDetail({
|
||||
params: {
|
||||
id: query.id,
|
||||
userId: apiClientProps.server?.userId,
|
||||
},
|
||||
query: {
|
||||
Fields: 'Genres, Overview, SortName',
|
||||
},
|
||||
}),
|
||||
jfApiClient(apiClientProps).getSimilarArtistList({
|
||||
params: {
|
||||
id: query.id,
|
||||
},
|
||||
query: {
|
||||
Limit: 10,
|
||||
},
|
||||
}),
|
||||
]);
|
||||
|
||||
if (res.status !== 200 || similarArtistsRes.status !== 200) {
|
||||
throw new Error('Failed to get album artist detail');
|
||||
@@ -250,7 +253,7 @@ export const JellyfinController: InternalControllerEndpoint = {
|
||||
|
||||
const res = await jfApiClient(apiClientProps).getAlbumArtistList({
|
||||
query: {
|
||||
Fields: 'Genres, DateCreated, ExternalUrls, Overview',
|
||||
Fields: 'Genres, DateCreated, ExternalUrls, Overview, SortName',
|
||||
ImageTypeLimit: 1,
|
||||
Limit: query.limit,
|
||||
ParentId: getLibraryId(query.musicFolderId),
|
||||
@@ -302,7 +305,7 @@ export const JellyfinController: InternalControllerEndpoint = {
|
||||
userId: apiClientProps.server.userId,
|
||||
},
|
||||
query: {
|
||||
Fields: 'Genres, DateCreated, MediaSources, ParentId, People, Tags',
|
||||
Fields: 'Genres, DateCreated, MediaSources, ParentId, People, Tags, SortName',
|
||||
IncludeItemTypes: 'Audio',
|
||||
ParentId: query.id,
|
||||
SortBy: 'ParentIndexNumber,IndexNumber,SortName',
|
||||
@@ -360,11 +363,11 @@ export const JellyfinController: InternalControllerEndpoint = {
|
||||
},
|
||||
query: {
|
||||
...artistQuery,
|
||||
Fields: 'People, Tags',
|
||||
Fields: 'People, Tags, Studios, SortName',
|
||||
GenreIds: query.genreIds ? query.genreIds.join(',') : undefined,
|
||||
IncludeItemTypes: 'MusicAlbum',
|
||||
IsFavorite: query.favorite,
|
||||
Limit: query.limit,
|
||||
Limit: query.limit === -1 ? undefined : query.limit,
|
||||
ParentId: getLibraryId(query.musicFolderId),
|
||||
Recursive: true,
|
||||
SearchTerm: query.searchTerm,
|
||||
@@ -396,7 +399,7 @@ export const JellyfinController: InternalControllerEndpoint = {
|
||||
|
||||
const res = await jfApiClient(apiClientProps).getArtistList({
|
||||
query: {
|
||||
Fields: 'Genres, DateCreated, ExternalUrls, Overview',
|
||||
Fields: 'Genres, DateCreated, ExternalUrls, Overview, SortName',
|
||||
ImageTypeLimit: 1,
|
||||
Limit: query.limit,
|
||||
ParentId: getLibraryId(query.musicFolderId),
|
||||
@@ -426,10 +429,38 @@ export const JellyfinController: InternalControllerEndpoint = {
|
||||
apiClientProps,
|
||||
query: { ...query, limit: 1, startIndex: 0 },
|
||||
}).then((result) => result!.totalRecordCount!),
|
||||
getArtistRadio: async (args) => {
|
||||
const { apiClientProps, query } = args;
|
||||
|
||||
// For Jellyfin, use instant mix for artist radio
|
||||
const res = await jfApiClient(apiClientProps).getInstantMix({
|
||||
params: {
|
||||
itemId: query.artistId,
|
||||
},
|
||||
query: {
|
||||
Fields: 'Genres, DateCreated, MediaSources, ParentId, SortName',
|
||||
Limit: query.count,
|
||||
UserId: apiClientProps.server?.userId || undefined,
|
||||
},
|
||||
});
|
||||
|
||||
if (res.status !== 200) {
|
||||
throw new Error('Failed to get artist radio songs');
|
||||
}
|
||||
|
||||
return res.body.Items.map((song) =>
|
||||
jfNormalize.song(
|
||||
song,
|
||||
apiClientProps.server,
|
||||
args.context?.pathReplace,
|
||||
args.context?.pathReplaceWith,
|
||||
),
|
||||
);
|
||||
},
|
||||
getDownloadUrl: (args) => {
|
||||
const { apiClientProps, query } = args;
|
||||
|
||||
return `${apiClientProps.server?.url}/items/${query.id}/download?api_key=${apiClientProps.server?.credential}`;
|
||||
return `${apiClientProps.server?.url}/items/${query.id}/download?apiKey=${apiClientProps.server?.credential}`;
|
||||
},
|
||||
getFolder: async ({ apiClientProps, query }) => {
|
||||
const userId = apiClientProps.server?.userId;
|
||||
@@ -670,6 +701,23 @@ export const JellyfinController: InternalControllerEndpoint = {
|
||||
totalRecordCount: res.body?.TotalRecordCount || 0,
|
||||
};
|
||||
},
|
||||
getImageUrl: ({ apiClientProps: { server }, baseUrl, query }) => {
|
||||
const { id, size } = query;
|
||||
const imageSize = size;
|
||||
const url = baseUrl || getServerUrl(server);
|
||||
|
||||
if (!url) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// For Jellyfin, we construct the URL pattern
|
||||
// The server will return a 404 or placeholder if no image exists
|
||||
const imageUrl = `${url}/Items/${id}/Images/Primary?quality=96${imageSize ? `&width=${imageSize}` : ''}`;
|
||||
|
||||
// For songs, we might want to fall back to album art, but we don't have albumId here
|
||||
// The caller can handle this if needed
|
||||
return imageUrl;
|
||||
},
|
||||
getInternetRadioStations: async (args) => {
|
||||
const { apiClientProps } = args;
|
||||
|
||||
@@ -746,7 +794,7 @@ export const JellyfinController: InternalControllerEndpoint = {
|
||||
userId: apiClientProps.server?.userId,
|
||||
},
|
||||
query: {
|
||||
Fields: 'Genres, DateCreated, MediaSources, ChildCount, ParentId',
|
||||
Fields: 'Genres, DateCreated, MediaSources, ChildCount, ParentId, SortName',
|
||||
Ids: query.id,
|
||||
},
|
||||
});
|
||||
@@ -807,7 +855,7 @@ export const JellyfinController: InternalControllerEndpoint = {
|
||||
id: query.id,
|
||||
},
|
||||
query: {
|
||||
Fields: 'Genres, DateCreated, MediaSources, UserData, ParentId, People, Tags',
|
||||
Fields: 'Genres, DateCreated, MediaSources, UserData, ParentId, People, Tags, SortName',
|
||||
IncludeItemTypes: 'Audio',
|
||||
UserId: apiClientProps.server?.userId,
|
||||
},
|
||||
@@ -818,7 +866,14 @@ export const JellyfinController: InternalControllerEndpoint = {
|
||||
}
|
||||
|
||||
return {
|
||||
items: res.body.Items.map((item) => jfNormalize.song(item, apiClientProps.server)),
|
||||
items: res.body.Items.map((item) =>
|
||||
jfNormalize.song(
|
||||
item,
|
||||
apiClientProps.server,
|
||||
args.context?.pathReplace,
|
||||
args.context?.pathReplaceWith,
|
||||
),
|
||||
),
|
||||
startIndex: 0,
|
||||
totalRecordCount: res.body.TotalRecordCount,
|
||||
};
|
||||
@@ -847,7 +902,7 @@ export const JellyfinController: InternalControllerEndpoint = {
|
||||
userId: apiClientProps.server?.userId,
|
||||
},
|
||||
query: {
|
||||
Fields: 'Genres, DateCreated, MediaSources, ParentId, People, Tags',
|
||||
Fields: 'Genres, DateCreated, MediaSources, ParentId, People, Tags, SortName',
|
||||
GenreIds: query.genre ? query.genre : undefined,
|
||||
IncludeItemTypes: 'Audio',
|
||||
IsPlayed:
|
||||
@@ -871,7 +926,14 @@ export const JellyfinController: InternalControllerEndpoint = {
|
||||
}
|
||||
|
||||
return {
|
||||
items: res.body.Items.map((item) => jfNormalize.song(item, apiClientProps.server)),
|
||||
items: res.body.Items.map((item) =>
|
||||
jfNormalize.song(
|
||||
item,
|
||||
apiClientProps.server,
|
||||
args.context?.pathReplace,
|
||||
args.context?.pathReplaceWith,
|
||||
),
|
||||
),
|
||||
startIndex: 0,
|
||||
totalRecordCount: res.body.Items.length || 0,
|
||||
};
|
||||
@@ -886,7 +948,12 @@ export const JellyfinController: InternalControllerEndpoint = {
|
||||
throw new Error('Failed to get server info');
|
||||
}
|
||||
|
||||
const features = getFeatures(VERSION_INFO, res.body.Version);
|
||||
const defaultFeatures = {};
|
||||
|
||||
const features = {
|
||||
...defaultFeatures,
|
||||
...getFeatures(VERSION_INFO, res.body.Version),
|
||||
};
|
||||
|
||||
return {
|
||||
features,
|
||||
@@ -907,7 +974,7 @@ export const JellyfinController: InternalControllerEndpoint = {
|
||||
itemId: query.songId,
|
||||
},
|
||||
query: {
|
||||
Fields: 'Genres, DateCreated, MediaSources, ParentId',
|
||||
Fields: 'Genres, DateCreated, MediaSources, ParentId, SortName',
|
||||
Limit: query.count,
|
||||
UserId: apiClientProps.server?.userId || undefined,
|
||||
},
|
||||
@@ -916,7 +983,14 @@ export const JellyfinController: InternalControllerEndpoint = {
|
||||
if (res.status === 200 && res.body.Items.length) {
|
||||
const results = res.body.Items.reduce<Song[]>((acc, song) => {
|
||||
if (song.Id !== query.songId) {
|
||||
acc.push(jfNormalize.song(song, apiClientProps.server));
|
||||
acc.push(
|
||||
jfNormalize.song(
|
||||
song,
|
||||
apiClientProps.server,
|
||||
args.context?.pathReplace,
|
||||
args.context?.pathReplaceWith,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
return acc;
|
||||
@@ -933,7 +1007,7 @@ export const JellyfinController: InternalControllerEndpoint = {
|
||||
itemId: query.songId,
|
||||
},
|
||||
query: {
|
||||
Fields: 'Genres, DateCreated, MediaSources, ParentId',
|
||||
Fields: 'Genres, DateCreated, MediaSources, ParentId, SortName',
|
||||
Limit: query.count,
|
||||
UserId: apiClientProps.server?.userId || undefined,
|
||||
},
|
||||
@@ -945,7 +1019,14 @@ export const JellyfinController: InternalControllerEndpoint = {
|
||||
|
||||
return mix.body.Items.reduce<Song[]>((acc, song) => {
|
||||
if (song.Id !== query.songId) {
|
||||
acc.push(jfNormalize.song(song, apiClientProps.server));
|
||||
acc.push(
|
||||
jfNormalize.song(
|
||||
song,
|
||||
apiClientProps.server,
|
||||
args.context?.pathReplace,
|
||||
args.context?.pathReplaceWith,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
return acc;
|
||||
@@ -965,7 +1046,12 @@ export const JellyfinController: InternalControllerEndpoint = {
|
||||
throw new Error('Failed to get song detail');
|
||||
}
|
||||
|
||||
return jfNormalize.song(res.body, apiClientProps.server);
|
||||
return jfNormalize.song(
|
||||
res.body,
|
||||
apiClientProps.server,
|
||||
args.context?.pathReplace,
|
||||
args.context?.pathReplaceWith,
|
||||
);
|
||||
},
|
||||
getSongList: async (args) => {
|
||||
const { apiClientProps, query } = args;
|
||||
@@ -1006,7 +1092,7 @@ export const JellyfinController: InternalControllerEndpoint = {
|
||||
query: {
|
||||
AlbumIds: albumIdsFilter,
|
||||
ArtistIds: artistIdsFilter,
|
||||
Fields: 'Genres, DateCreated, MediaSources, ParentId, People, Tags',
|
||||
Fields: 'Genres, DateCreated, MediaSources, ParentId, People, Tags, SortName',
|
||||
GenreIds: query.genreIds?.join(','),
|
||||
IncludeItemTypes: 'Audio',
|
||||
IsFavorite: query.favorite,
|
||||
@@ -1034,19 +1120,19 @@ export const JellyfinController: InternalControllerEndpoint = {
|
||||
? formatCommaDelimitedString(query.albumIds)
|
||||
: undefined;
|
||||
|
||||
const parentIdFilter = [albumIdsFilter, artistIdsFilter].filter(Boolean).join(',');
|
||||
|
||||
const res = await jfApiClient(apiClientProps).getSongList({
|
||||
params: {
|
||||
userId: apiClientProps.server?.userId,
|
||||
},
|
||||
query: {
|
||||
Fields: 'Genres, DateCreated, MediaSources, ParentId, People, Tags',
|
||||
AlbumIds: albumIdsFilter,
|
||||
ArtistIds: artistIdsFilter,
|
||||
Fields: 'Genres, DateCreated, MediaSources, ParentId, People, Tags, SortName',
|
||||
GenreIds: query.genreIds?.join(','),
|
||||
IncludeItemTypes: 'Audio',
|
||||
IsFavorite: query.favorite,
|
||||
Limit: query.limit,
|
||||
ParentId: parentIdFilter,
|
||||
ParentId: getLibraryId(query.musicFolderId),
|
||||
Recursive: true,
|
||||
SearchTerm: query.searchTerm,
|
||||
SortBy: songListSortMap.jellyfin[query.sortBy] || 'Album,SortName',
|
||||
@@ -1078,7 +1164,12 @@ export const JellyfinController: InternalControllerEndpoint = {
|
||||
|
||||
return {
|
||||
items: items.map((item) =>
|
||||
jfNormalize.song(item, apiClientProps.server, query.imageSize),
|
||||
jfNormalize.song(
|
||||
item,
|
||||
apiClientProps.server,
|
||||
args.context?.pathReplace,
|
||||
args.context?.pathReplaceWith,
|
||||
),
|
||||
),
|
||||
startIndex: query.startIndex,
|
||||
totalRecordCount,
|
||||
@@ -1093,7 +1184,7 @@ export const JellyfinController: InternalControllerEndpoint = {
|
||||
const { bitrate, format, id, transcode } = query;
|
||||
const deviceId = '';
|
||||
|
||||
let url = `${server?.url}/Items/${id}/Download?api_key=${server?.credential}&playSessionId=${deviceId}`;
|
||||
let url = `${server?.url}/Items/${id}/Download?apiKey=${server?.credential}&playSessionId=${deviceId}`;
|
||||
|
||||
if (transcode) {
|
||||
// Some format appears to be required. Fall back to trusty MP3 if not specified
|
||||
@@ -1143,12 +1234,40 @@ export const JellyfinController: InternalControllerEndpoint = {
|
||||
throw new Error('failed to get tags');
|
||||
}
|
||||
|
||||
return {
|
||||
boolTags: res.body.Tags?.sort((a, b) =>
|
||||
a.toLocaleLowerCase().localeCompare(b.toLocaleLowerCase()),
|
||||
),
|
||||
excluded: { album: [], song: [] },
|
||||
};
|
||||
const studioRes = await jfApiClient(apiClientProps).getStudioList({
|
||||
query: {
|
||||
EnableTotalRecordCount: true,
|
||||
IncludeItemTypes: query.type === LibraryItem.SONG ? 'Audio' : 'MusicAlbum',
|
||||
ParentId: query.folder,
|
||||
},
|
||||
});
|
||||
|
||||
if (studioRes.status !== 200) {
|
||||
throw new Error('failed to get studios');
|
||||
}
|
||||
|
||||
const tags: Tag[] = [];
|
||||
if (res.body.Tags?.length) {
|
||||
tags.push({
|
||||
name: 'Tags',
|
||||
options: res.body.Tags.sort((a, b) =>
|
||||
a
|
||||
.toLocaleLowerCase()
|
||||
.localeCompare(b.toLocaleLowerCase(), undefined, { numeric: true }),
|
||||
).map((tag) => ({ id: tag, name: tag })),
|
||||
});
|
||||
}
|
||||
|
||||
if (studioRes.body.Items.length) {
|
||||
tags.push({
|
||||
name: 'Studios',
|
||||
options: studioRes.body.Items.sort((a, b) =>
|
||||
a.Name.toLocaleLowerCase().localeCompare(b.Name.toLocaleLowerCase()),
|
||||
).map((option) => ({ id: option.Name, name: option.Name })),
|
||||
});
|
||||
}
|
||||
|
||||
return { excluded: { album: [], song: [] }, tags };
|
||||
},
|
||||
getTopSongs: async (args) => {
|
||||
const { apiClientProps, query } = args;
|
||||
@@ -1163,7 +1282,7 @@ export const JellyfinController: InternalControllerEndpoint = {
|
||||
},
|
||||
query: {
|
||||
ArtistIds: query.artistId,
|
||||
Fields: 'Genres, DateCreated, MediaSources, ParentId',
|
||||
Fields: 'Genres, DateCreated, MediaSources, ParentId, SortName',
|
||||
IncludeItemTypes: 'Audio',
|
||||
Limit: query.limit,
|
||||
Recursive: true,
|
||||
@@ -1178,7 +1297,14 @@ export const JellyfinController: InternalControllerEndpoint = {
|
||||
}
|
||||
|
||||
return {
|
||||
items: res.body.Items.map((item) => jfNormalize.song(item, apiClientProps.server)),
|
||||
items: res.body.Items.map((item) =>
|
||||
jfNormalize.song(
|
||||
item,
|
||||
apiClientProps.server,
|
||||
args.context?.pathReplace,
|
||||
args.context?.pathReplaceWith,
|
||||
),
|
||||
),
|
||||
startIndex: 0,
|
||||
totalRecordCount: res.body.TotalRecordCount,
|
||||
};
|
||||
@@ -1252,7 +1378,7 @@ export const JellyfinController: InternalControllerEndpoint = {
|
||||
id: query.id,
|
||||
},
|
||||
query: {
|
||||
Fields: 'Genres, DateCreated, MediaSources, UserData, ParentId, People, Tags',
|
||||
Fields: 'Genres, DateCreated, MediaSources, UserData, ParentId, People, Tags, SortName',
|
||||
IncludeItemTypes: 'Audio',
|
||||
UserId: apiClientProps.server?.userId,
|
||||
},
|
||||
@@ -1263,7 +1389,12 @@ export const JellyfinController: InternalControllerEndpoint = {
|
||||
}
|
||||
|
||||
const existingSongs = existingSongsRes.body.Items.map((item) =>
|
||||
jfNormalize.song(item, apiClientProps.server),
|
||||
jfNormalize.song(
|
||||
item,
|
||||
apiClientProps.server,
|
||||
args.context?.pathReplace,
|
||||
args.context?.pathReplaceWith,
|
||||
),
|
||||
);
|
||||
|
||||
// 2. Get playlist detail to get the name
|
||||
@@ -1273,7 +1404,7 @@ export const JellyfinController: InternalControllerEndpoint = {
|
||||
userId: apiClientProps.server?.userId,
|
||||
},
|
||||
query: {
|
||||
Fields: 'Genres, DateCreated, MediaSources, ChildCount, ParentId',
|
||||
Fields: 'Genres, DateCreated, MediaSources, ChildCount, ParentId, SortName',
|
||||
Ids: query.id,
|
||||
},
|
||||
});
|
||||
@@ -1431,7 +1562,7 @@ export const JellyfinController: InternalControllerEndpoint = {
|
||||
},
|
||||
query: {
|
||||
EnableTotalRecordCount: true,
|
||||
Fields: 'People, Tags',
|
||||
Fields: 'People, Tags, SortName',
|
||||
ImageTypeLimit: 1,
|
||||
IncludeItemTypes: 'MusicAlbum',
|
||||
Limit: query.albumLimit,
|
||||
@@ -1479,7 +1610,7 @@ export const JellyfinController: InternalControllerEndpoint = {
|
||||
},
|
||||
query: {
|
||||
EnableTotalRecordCount: true,
|
||||
Fields: 'Genres, DateCreated, MediaSources, ParentId, People, Tags',
|
||||
Fields: 'Genres, DateCreated, MediaSources, ParentId, People, Tags, SortName',
|
||||
IncludeItemTypes: 'Audio',
|
||||
Limit: query.songLimit,
|
||||
Recursive: true,
|
||||
@@ -1503,7 +1634,14 @@ export const JellyfinController: InternalControllerEndpoint = {
|
||||
jfNormalize.albumArtist(item, apiClientProps.server),
|
||||
),
|
||||
albums: albums.map((item) => jfNormalize.album(item, apiClientProps.server)),
|
||||
songs: songs.map((item) => jfNormalize.song(item, apiClientProps.server)),
|
||||
songs: songs.map((item) =>
|
||||
jfNormalize.song(
|
||||
item,
|
||||
apiClientProps.server,
|
||||
args.context?.pathReplace,
|
||||
args.context?.pathReplaceWith,
|
||||
),
|
||||
),
|
||||
};
|
||||
},
|
||||
updateInternetRadioStation: async (args) => {
|
||||
|
||||
@@ -8,6 +8,7 @@ import qs from 'qs';
|
||||
import i18n from '/@/i18n/i18n';
|
||||
import { authenticationFailure } from '/@/renderer/api/utils';
|
||||
import { useAuthStore } from '/@/renderer/store';
|
||||
import { getServerUrl } from '/@/renderer/utils/normalize-server-url';
|
||||
import { ndType } from '/@/shared/api/navidrome/navidrome-types';
|
||||
import { resultWithHeaders } from '/@/shared/api/utils';
|
||||
import { toast } from '/@/shared/components/toast/toast';
|
||||
@@ -411,7 +412,8 @@ export const ndApiClient = (args: {
|
||||
const { params, path: api } = parsePath(path);
|
||||
|
||||
if (server) {
|
||||
baseUrl = `${server?.url}/api`;
|
||||
const serverUrl = getServerUrl(server);
|
||||
baseUrl = serverUrl ? `${serverUrl}/api` : undefined;
|
||||
token = server?.ndCredential;
|
||||
} else {
|
||||
baseUrl = url;
|
||||
|
||||
@@ -59,19 +59,17 @@ const EXCLUDED_ALBUM_TAGS = new Set<string>([
|
||||
'asin',
|
||||
'barcode',
|
||||
'copyright',
|
||||
'disctotal',
|
||||
'encodedby',
|
||||
'isrc',
|
||||
'key',
|
||||
'language',
|
||||
'musicbrainz_workid',
|
||||
'script',
|
||||
'tracktotal',
|
||||
'website',
|
||||
'work',
|
||||
]);
|
||||
|
||||
const EXCLUDED_SONG_TAGS = new Set<string>([]);
|
||||
const EXCLUDED_SONG_TAGS = new Set<string>(['disctotal', 'tracktotal']);
|
||||
|
||||
// Tags that use IDs as values as opposed to the tag value
|
||||
const ID_TAGS = new Set<string>(['albumversion', 'mood']);
|
||||
@@ -184,18 +182,19 @@ export const NavidromeController: InternalControllerEndpoint = {
|
||||
getAlbumArtistDetail: async (args) => {
|
||||
const { apiClientProps, query } = args;
|
||||
|
||||
const res = await ndApiClient(apiClientProps).getAlbumArtistDetail({
|
||||
params: {
|
||||
id: query.id,
|
||||
},
|
||||
});
|
||||
|
||||
const artistInfoRes = await ssApiClient(apiClientProps).getArtistInfo({
|
||||
query: {
|
||||
count: 10,
|
||||
id: query.id,
|
||||
},
|
||||
});
|
||||
const [res, artistInfoRes] = await Promise.all([
|
||||
ndApiClient(apiClientProps).getAlbumArtistDetail({
|
||||
params: {
|
||||
id: query.id,
|
||||
},
|
||||
}),
|
||||
ssApiClient(apiClientProps).getArtistInfo({
|
||||
query: {
|
||||
count: 10,
|
||||
id: query.id,
|
||||
},
|
||||
}),
|
||||
]);
|
||||
|
||||
if (res.status !== 200) {
|
||||
throw new Error('Failed to get album artist detail');
|
||||
@@ -267,7 +266,7 @@ export const NavidromeController: InternalControllerEndpoint = {
|
||||
query: { ...query, limit: 1, startIndex: 0 },
|
||||
}).then((result) => result!.totalRecordCount!),
|
||||
getAlbumDetail: async (args) => {
|
||||
const { apiClientProps, query } = args;
|
||||
const { apiClientProps, context, query } = args;
|
||||
|
||||
const albumRes = await ndApiClient(apiClientProps).getAlbumDetail({
|
||||
params: {
|
||||
@@ -293,6 +292,8 @@ export const NavidromeController: InternalControllerEndpoint = {
|
||||
return ndNormalize.album(
|
||||
{ ...albumRes.body.data, songs: songsData.body.data },
|
||||
apiClientProps.server,
|
||||
context?.pathReplace,
|
||||
context?.pathReplaceWith,
|
||||
);
|
||||
},
|
||||
getAlbumInfo: async (args) => {
|
||||
@@ -316,19 +317,23 @@ export const NavidromeController: InternalControllerEndpoint = {
|
||||
};
|
||||
},
|
||||
getAlbumList: async (args) => {
|
||||
const { apiClientProps, query } = args;
|
||||
const { apiClientProps, context, query } = args;
|
||||
|
||||
const genres = hasFeature(apiClientProps.server, ServerFeature.BFR)
|
||||
? query.genreIds
|
||||
: query.genreIds?.[0];
|
||||
|
||||
const artistIds = hasFeature(apiClientProps.server, ServerFeature.BFR)
|
||||
? query.artistIds
|
||||
: query.artistIds?.[0];
|
||||
|
||||
const res = await ndApiClient(apiClientProps).getAlbumList({
|
||||
query: {
|
||||
_end: query.startIndex + (query.limit || 0),
|
||||
_order: sortOrderMap.navidrome[query.sortOrder],
|
||||
_sort: albumListSortMap.navidrome[query.sortBy],
|
||||
_start: query.startIndex,
|
||||
artist_id: query.artistIds?.[0],
|
||||
artist_id: artistIds,
|
||||
compilation: query.compilation,
|
||||
genre_id: genres,
|
||||
has_rating: query.hasRating,
|
||||
@@ -347,7 +352,14 @@ export const NavidromeController: InternalControllerEndpoint = {
|
||||
}
|
||||
|
||||
return {
|
||||
items: res.body.data.map((album) => ndNormalize.album(album, apiClientProps.server)),
|
||||
items: res.body.data.map((album) =>
|
||||
ndNormalize.album(
|
||||
album,
|
||||
apiClientProps.server,
|
||||
context?.pathReplace,
|
||||
context?.pathReplaceWith,
|
||||
),
|
||||
),
|
||||
startIndex: query?.startIndex || 0,
|
||||
totalRecordCount: Number(res.body.headers.get('x-total-count') || 0),
|
||||
};
|
||||
@@ -401,6 +413,32 @@ export const NavidromeController: InternalControllerEndpoint = {
|
||||
apiClientProps,
|
||||
query: { ...query, limit: 1, startIndex: 0 },
|
||||
}).then((result) => result!.totalRecordCount!),
|
||||
getArtistRadio: async (args) => {
|
||||
const { apiClientProps, query } = args;
|
||||
|
||||
// Use getSimilarSongs2 API for artist radio
|
||||
const res = await ssApiClient({
|
||||
...apiClientProps,
|
||||
silent: true,
|
||||
}).getSimilarSongs2({
|
||||
query: {
|
||||
count: query.count,
|
||||
id: query.artistId,
|
||||
},
|
||||
});
|
||||
|
||||
if (res.status !== 200) {
|
||||
throw new Error('Failed to get artist radio songs');
|
||||
}
|
||||
|
||||
if (!res.body.similarSongs2?.song) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return res.body.similarSongs2.song.map((song) =>
|
||||
ssNormalize.song(song, apiClientProps.server),
|
||||
);
|
||||
},
|
||||
getDownloadUrl: SubsonicController.getDownloadUrl,
|
||||
getFolder: SubsonicController.getFolder,
|
||||
getGenreList: async (args) => {
|
||||
@@ -461,6 +499,7 @@ export const NavidromeController: InternalControllerEndpoint = {
|
||||
totalRecordCount: Number(res.body.headers.get('x-total-count') || 0),
|
||||
};
|
||||
},
|
||||
getImageUrl: SubsonicController.getImageUrl,
|
||||
getInternetRadioStations: SubsonicController.getInternetRadioStations,
|
||||
getLyrics: SubsonicController.getLyrics,
|
||||
getMusicFolderList: SubsonicController.getMusicFolderList,
|
||||
@@ -528,7 +567,14 @@ export const NavidromeController: InternalControllerEndpoint = {
|
||||
}
|
||||
|
||||
return {
|
||||
items: res.body.data.map((item) => ndNormalize.song(item, apiClientProps.server)),
|
||||
items: res.body.data.map((item) =>
|
||||
ndNormalize.song(
|
||||
item,
|
||||
apiClientProps.server,
|
||||
args.context?.pathReplace,
|
||||
args.context?.pathReplaceWith,
|
||||
),
|
||||
),
|
||||
startIndex: 0,
|
||||
totalRecordCount: Number(res.body.headers.get('x-total-count') || 0),
|
||||
};
|
||||
@@ -545,7 +591,14 @@ export const NavidromeController: InternalControllerEndpoint = {
|
||||
|
||||
const { changedBy, current, items, position, updatedAt } = res.body.data;
|
||||
|
||||
const entries = items.map((song) => ndNormalize.song(song, apiClientProps.server));
|
||||
const entries = items.map((song) =>
|
||||
ndNormalize.song(
|
||||
song,
|
||||
apiClientProps.server,
|
||||
args.context?.pathReplace,
|
||||
args.context?.pathReplaceWith,
|
||||
),
|
||||
);
|
||||
|
||||
return {
|
||||
changed: updatedAt,
|
||||
@@ -636,7 +689,12 @@ export const NavidromeController: InternalControllerEndpoint = {
|
||||
throw new Error('Failed to get song detail');
|
||||
}
|
||||
|
||||
return ndNormalize.song(res.body.data, apiClientProps.server);
|
||||
return ndNormalize.song(
|
||||
res.body.data,
|
||||
apiClientProps.server,
|
||||
args.context?.pathReplace,
|
||||
args.context?.pathReplaceWith,
|
||||
);
|
||||
},
|
||||
getSongList: async (args) => {
|
||||
const { apiClientProps, query } = args;
|
||||
@@ -665,7 +723,12 @@ export const NavidromeController: InternalControllerEndpoint = {
|
||||
|
||||
return {
|
||||
items: res.body.data.map((song) =>
|
||||
ndNormalize.song(song, apiClientProps.server, query.imageSize),
|
||||
ndNormalize.song(
|
||||
song,
|
||||
apiClientProps.server,
|
||||
args.context?.pathReplace,
|
||||
args.context?.pathReplaceWith,
|
||||
),
|
||||
),
|
||||
startIndex: query?.startIndex || 0,
|
||||
totalRecordCount: Number(res.body.headers.get('x-total-count') || 0),
|
||||
@@ -682,7 +745,7 @@ export const NavidromeController: InternalControllerEndpoint = {
|
||||
const { apiClientProps } = args;
|
||||
|
||||
if (!hasFeature(apiClientProps.server, ServerFeature.TAGS)) {
|
||||
return { boolTags: undefined, enumTags: undefined, excluded: { album: [], song: [] } };
|
||||
return { excluded: { album: [], song: [] } };
|
||||
}
|
||||
|
||||
const res = await ndApiClient(apiClientProps).getTagList({
|
||||
@@ -713,12 +776,16 @@ export const NavidromeController: InternalControllerEndpoint = {
|
||||
}
|
||||
}
|
||||
|
||||
const enumTags = Array.from(tagsToValues)
|
||||
const tags = Array.from(tagsToValues)
|
||||
.map((data) => ({
|
||||
name: data[0],
|
||||
options: data[1]
|
||||
.sort((a, b) =>
|
||||
a.name.toLocaleLowerCase().localeCompare(b.name.toLocaleLowerCase()),
|
||||
a.name
|
||||
.toLocaleLowerCase()
|
||||
.localeCompare(b.name.toLocaleLowerCase(), undefined, {
|
||||
numeric: true,
|
||||
}),
|
||||
)
|
||||
.map((option) => ({ id: option.id, name: option.name })),
|
||||
}))
|
||||
@@ -728,12 +795,11 @@ export const NavidromeController: InternalControllerEndpoint = {
|
||||
const excludedSongTags = Array.from(EXCLUDED_SONG_TAGS.values());
|
||||
|
||||
return {
|
||||
boolTags: undefined,
|
||||
enumTags,
|
||||
excluded: {
|
||||
album: excludedAlbumTags,
|
||||
song: excludedSongTags,
|
||||
},
|
||||
tags,
|
||||
};
|
||||
},
|
||||
getTopSongs: SubsonicController.getTopSongs,
|
||||
@@ -817,7 +883,12 @@ export const NavidromeController: InternalControllerEndpoint = {
|
||||
}
|
||||
|
||||
const existingSongs = existingSongsRes.body.data.map((item) =>
|
||||
ndNormalize.song(item, apiClientProps.server),
|
||||
ndNormalize.song(
|
||||
item,
|
||||
apiClientProps.server,
|
||||
args.context?.pathReplace,
|
||||
args.context?.pathReplaceWith,
|
||||
),
|
||||
);
|
||||
|
||||
// 2. Get playlist detail to get the name
|
||||
|
||||
@@ -4,6 +4,7 @@ import type {
|
||||
AlbumDetailQuery,
|
||||
AlbumListQuery,
|
||||
ArtistListQuery,
|
||||
ArtistRadioQuery,
|
||||
FolderQuery,
|
||||
GenreListQuery,
|
||||
LyricSearchQuery,
|
||||
@@ -340,6 +341,10 @@ export const queryKeys: Record<
|
||||
root: (serverId: string) => [serverId] as const,
|
||||
},
|
||||
songs: {
|
||||
artistRadio: (serverId: string, query?: ArtistRadioQuery) => {
|
||||
if (query) return [serverId, 'songs', 'artistRadio', query] as const;
|
||||
return [serverId, 'songs', 'artistRadio'] as const;
|
||||
},
|
||||
count: (serverId: string, query?: SongListQuery) => {
|
||||
const { filter, pagination } = splitPaginatedQuery(query);
|
||||
if (query && pagination) {
|
||||
@@ -359,6 +364,18 @@ export const queryKeys: Record<
|
||||
|
||||
return [serverId, 'songs', 'detail'] as const;
|
||||
},
|
||||
infiniteList: (serverId: string, query?: SongListQuery) => {
|
||||
const { filter, pagination } = splitPaginatedQuery(query);
|
||||
if (query && pagination) {
|
||||
return [serverId, 'songs', 'infiniteList', filter, pagination] as const;
|
||||
}
|
||||
|
||||
if (query) {
|
||||
return [serverId, 'songs', 'infiniteList', filter] as const;
|
||||
}
|
||||
|
||||
return [serverId, 'songs', 'infiniteList'] as const;
|
||||
},
|
||||
list: (serverId: string, query?: SongListQuery) => {
|
||||
const { filter, pagination } = splitPaginatedQuery(query);
|
||||
if (query && pagination) {
|
||||
@@ -386,7 +403,15 @@ export const queryKeys: Record<
|
||||
if (query) return [serverId, 'songs', 'randomSongList', query] as const;
|
||||
return [serverId, 'songs', 'randomSongList'] as const;
|
||||
},
|
||||
remoteLyrics: (serverId: string, query?: LyricsQuery) => {
|
||||
if (query) return [serverId, 'song', 'lyrics', 'remote', query] as const;
|
||||
return [serverId, 'song', 'lyrics', 'remote'] as const;
|
||||
},
|
||||
root: (serverId: string) => [serverId, 'songs'] as const,
|
||||
serverLyrics: (serverId: string, query?: LyricsQuery) => {
|
||||
if (query) return [serverId, 'song', 'lyrics', 'server', query] as const;
|
||||
return [serverId, 'song', 'lyrics', 'server'] as const;
|
||||
},
|
||||
similar: (serverId: string, query?: SimilarSongsQuery) => {
|
||||
if (query) return [serverId, 'song', 'similar', query] as const;
|
||||
return [serverId, 'song', 'similar'] as const;
|
||||
|
||||
@@ -5,6 +5,7 @@ import qs from 'qs';
|
||||
import { z } from 'zod';
|
||||
|
||||
import i18n from '/@/i18n/i18n';
|
||||
import { getServerUrl } from '/@/renderer/utils/normalize-server-url';
|
||||
import { ssType } from '/@/shared/api/subsonic/subsonic-types';
|
||||
import { hasFeature } from '/@/shared/api/utils';
|
||||
import { toast } from '/@/shared/components/toast/toast';
|
||||
@@ -201,6 +202,14 @@ export const contract = c.router({
|
||||
200: ssType._response.similarSongs,
|
||||
},
|
||||
},
|
||||
getSimilarSongs2: {
|
||||
method: 'GET',
|
||||
path: 'getSimilarSongs2',
|
||||
query: ssType._parameters.similarSongs2,
|
||||
responses: {
|
||||
200: ssType._response.similarSongs2,
|
||||
},
|
||||
},
|
||||
getSong: {
|
||||
method: 'GET',
|
||||
path: 'getSong.view',
|
||||
@@ -390,7 +399,8 @@ export const ssApiClient = (args: {
|
||||
const { params, path: api } = parsePath(path);
|
||||
|
||||
if (server) {
|
||||
baseUrl = `${server.url}/rest`;
|
||||
const serverUrl = getServerUrl(server);
|
||||
baseUrl = serverUrl ? `${serverUrl}/rest` : undefined;
|
||||
const token = server.credential;
|
||||
const params = token.split(/&?\w=/gm);
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ import { z } from 'zod';
|
||||
|
||||
import { contract, ssApiClient } from '/@/renderer/api/subsonic/subsonic-api';
|
||||
import { randomString } from '/@/renderer/utils';
|
||||
import { getServerUrl } from '/@/renderer/utils/normalize-server-url';
|
||||
import { ssNormalize } from '/@/shared/api/subsonic/subsonic-normalize';
|
||||
import {
|
||||
AlbumListSortType,
|
||||
@@ -45,6 +46,7 @@ const ALBUM_LIST_SORT_MAPPING: Record<AlbumListSort, AlbumListSortType | undefin
|
||||
[AlbumListSort.RECENTLY_PLAYED]: AlbumListSortType.RECENT,
|
||||
[AlbumListSort.RELEASE_DATE]: AlbumListSortType.BY_YEAR,
|
||||
[AlbumListSort.SONG_COUNT]: undefined,
|
||||
[AlbumListSort.SORT_NAME]: AlbumListSortType.ALPHABETICAL_BY_NAME,
|
||||
[AlbumListSort.YEAR]: AlbumListSortType.BY_YEAR,
|
||||
};
|
||||
|
||||
@@ -155,7 +157,10 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
const res = await ssApiClient(apiClientProps).createFavorite({
|
||||
query: {
|
||||
albumId: query.type === LibraryItem.ALBUM ? query.id : undefined,
|
||||
artistId: query.type === LibraryItem.ALBUM_ARTIST ? query.id : undefined,
|
||||
artistId:
|
||||
query.type === LibraryItem.ALBUM_ARTIST || query.type === LibraryItem.ARTIST
|
||||
? query.id
|
||||
: undefined,
|
||||
id: query.type === LibraryItem.SONG ? query.id : undefined,
|
||||
},
|
||||
});
|
||||
@@ -205,7 +210,10 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
const res = await ssApiClient(apiClientProps).removeFavorite({
|
||||
query: {
|
||||
albumId: query.type === LibraryItem.ALBUM ? query.id : undefined,
|
||||
artistId: query.type === LibraryItem.ALBUM_ARTIST ? query.id : undefined,
|
||||
artistId:
|
||||
query.type === LibraryItem.ALBUM_ARTIST || query.type === LibraryItem.ARTIST
|
||||
? query.id
|
||||
: undefined,
|
||||
id: query.type === LibraryItem.SONG ? query.id : undefined,
|
||||
},
|
||||
});
|
||||
@@ -249,17 +257,18 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
getAlbumArtistDetail: async (args) => {
|
||||
const { apiClientProps, query } = args;
|
||||
|
||||
const artistInfoRes = await ssApiClient(apiClientProps).getArtistInfo({
|
||||
query: {
|
||||
id: query.id,
|
||||
},
|
||||
});
|
||||
|
||||
const res = await ssApiClient(apiClientProps).getArtist({
|
||||
query: {
|
||||
id: query.id,
|
||||
},
|
||||
});
|
||||
const [artistInfoRes, res] = await Promise.all([
|
||||
ssApiClient(apiClientProps).getArtistInfo({
|
||||
query: {
|
||||
id: query.id,
|
||||
},
|
||||
}),
|
||||
ssApiClient(apiClientProps).getArtist({
|
||||
query: {
|
||||
id: query.id,
|
||||
},
|
||||
}),
|
||||
]);
|
||||
|
||||
if (res.status !== 200) {
|
||||
throw new Error('Failed to get album artist detail');
|
||||
@@ -273,11 +282,18 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
}
|
||||
|
||||
return {
|
||||
...ssNormalize.albumArtist(artist, apiClientProps.server, 300),
|
||||
albums: artist.album?.map((album) => ssNormalize.album(album, apiClientProps.server)),
|
||||
...ssNormalize.albumArtist(artist, apiClientProps.server),
|
||||
albums: artist.album?.map((album) =>
|
||||
ssNormalize.album(
|
||||
album,
|
||||
apiClientProps.server,
|
||||
args.context?.pathReplace,
|
||||
args.context?.pathReplaceWith,
|
||||
),
|
||||
),
|
||||
similarArtists:
|
||||
artistInfo?.similarArtist?.map((artist) =>
|
||||
ssNormalize.albumArtist(artist, apiClientProps.server, 300),
|
||||
ssNormalize.albumArtist(artist, apiClientProps.server),
|
||||
) || null,
|
||||
};
|
||||
},
|
||||
@@ -297,7 +313,7 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
const artists = (res.body.artists?.index || []).flatMap((index) => index.artist);
|
||||
|
||||
let results = artists.map((artist) =>
|
||||
ssNormalize.albumArtist(artist, apiClientProps.server, 300),
|
||||
ssNormalize.albumArtist(artist, apiClientProps.server),
|
||||
);
|
||||
|
||||
if (query.searchTerm) {
|
||||
@@ -308,19 +324,18 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
results = searchResults;
|
||||
}
|
||||
|
||||
if (query.sortBy) {
|
||||
results = sortAlbumArtistList(results, query.sortBy, query.sortOrder);
|
||||
}
|
||||
|
||||
return {
|
||||
items: results,
|
||||
return sortAndPaginate(results, {
|
||||
limit: query.limit,
|
||||
sortBy: query.sortBy,
|
||||
sortFn: query.sortBy ? sortAlbumArtistList : undefined,
|
||||
sortOrder: query.sortOrder,
|
||||
startIndex: query.startIndex,
|
||||
totalRecordCount: artists.length,
|
||||
};
|
||||
});
|
||||
},
|
||||
getAlbumArtistListCount: (args) =>
|
||||
SubsonicController.getAlbumArtistList({
|
||||
...args,
|
||||
context: args.context,
|
||||
query: { ...args.query, startIndex: 0 },
|
||||
}).then((res) => res!.totalRecordCount!),
|
||||
getAlbumDetail: async (args) => {
|
||||
@@ -336,7 +351,12 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
throw new Error('Failed to get album detail');
|
||||
}
|
||||
|
||||
return ssNormalize.album(res.body.album, apiClientProps.server);
|
||||
return ssNormalize.album(
|
||||
res.body.album,
|
||||
apiClientProps.server,
|
||||
args.context?.pathReplace,
|
||||
args.context?.pathReplaceWith,
|
||||
);
|
||||
},
|
||||
getAlbumList: async (args) => {
|
||||
const { apiClientProps, query } = args;
|
||||
@@ -348,6 +368,7 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
albumOffset: query.startIndex,
|
||||
artistCount: 0,
|
||||
artistOffset: 0,
|
||||
musicFolderId: getLibraryId(query.musicFolderId),
|
||||
query: query.searchTerm || '',
|
||||
songCount: 0,
|
||||
songOffset: 0,
|
||||
@@ -360,7 +381,12 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
|
||||
const results =
|
||||
res.body.searchResult3?.album?.map((album) =>
|
||||
ssNormalize.album(album, apiClientProps.server),
|
||||
ssNormalize.album(
|
||||
album,
|
||||
apiClientProps.server,
|
||||
args.context?.pathReplace,
|
||||
args.context?.pathReplaceWith,
|
||||
),
|
||||
) || [];
|
||||
|
||||
return {
|
||||
@@ -395,7 +421,14 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
return artist.body.artist.album ?? [];
|
||||
});
|
||||
|
||||
const items = albums.map((album) => ssNormalize.album(album, apiClientProps.server));
|
||||
const items = albums.map((album) =>
|
||||
ssNormalize.album(
|
||||
album,
|
||||
apiClientProps.server,
|
||||
args.context?.pathReplace,
|
||||
args.context?.pathReplaceWith,
|
||||
),
|
||||
);
|
||||
|
||||
return {
|
||||
items: sortAlbumList(items, query.sortBy, query.sortOrder),
|
||||
@@ -417,7 +450,12 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
|
||||
const allResults =
|
||||
res.body.starred?.album?.map((album) =>
|
||||
ssNormalize.album(album, apiClientProps.server),
|
||||
ssNormalize.album(
|
||||
album,
|
||||
apiClientProps.server,
|
||||
args.context?.pathReplace,
|
||||
args.context?.pathReplaceWith,
|
||||
),
|
||||
) || [];
|
||||
|
||||
return sortAndPaginate(allResults, {
|
||||
@@ -482,7 +520,12 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
return {
|
||||
items:
|
||||
res.body.albumList2.album?.map((album) =>
|
||||
ssNormalize.album(album, apiClientProps.server, 300),
|
||||
ssNormalize.album(
|
||||
album,
|
||||
apiClientProps.server,
|
||||
args.context?.pathReplace,
|
||||
args.context?.pathReplaceWith,
|
||||
),
|
||||
) || [],
|
||||
startIndex: query.startIndex,
|
||||
totalRecordCount: null,
|
||||
@@ -503,6 +546,7 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
albumOffset: startIndex,
|
||||
artistCount: 0,
|
||||
artistOffset: 0,
|
||||
musicFolderId: getLibraryId(query.musicFolderId),
|
||||
query: query.searchTerm || '',
|
||||
songCount: 0,
|
||||
songOffset: 0,
|
||||
@@ -652,7 +696,7 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
}
|
||||
|
||||
let results = artists.map((artist) =>
|
||||
ssNormalize.albumArtist(artist, apiClientProps.server, 300),
|
||||
ssNormalize.albumArtist(artist, apiClientProps.server),
|
||||
);
|
||||
|
||||
if (query.searchTerm) {
|
||||
@@ -674,8 +718,36 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
getArtistListCount: async (args) =>
|
||||
SubsonicController.getArtistList({
|
||||
...args,
|
||||
context: args.context,
|
||||
query: { ...args.query, startIndex: 0 },
|
||||
}).then((res) => res!.totalRecordCount!),
|
||||
getArtistRadio: async (args) => {
|
||||
const { apiClientProps, context, query } = args;
|
||||
|
||||
const res = await ssApiClient(apiClientProps).getSimilarSongs2({
|
||||
query: {
|
||||
count: query.count,
|
||||
id: query.artistId,
|
||||
},
|
||||
});
|
||||
|
||||
if (res.status !== 200) {
|
||||
throw new Error('Failed to get artist radio songs');
|
||||
}
|
||||
|
||||
if (!res.body.similarSongs2?.song) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return res.body.similarSongs2.song.map((song) =>
|
||||
ssNormalize.song(
|
||||
song,
|
||||
apiClientProps.server,
|
||||
context?.pathReplace,
|
||||
context?.pathReplaceWith,
|
||||
),
|
||||
);
|
||||
},
|
||||
getDownloadUrl: (args) => {
|
||||
const { apiClientProps, query } = args;
|
||||
|
||||
@@ -687,7 +759,7 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
'&c=Feishin'
|
||||
);
|
||||
},
|
||||
getFolder: async ({ apiClientProps, query }) => {
|
||||
getFolder: async ({ apiClientProps, context, query }) => {
|
||||
const sortOrder = (query.sortOrder?.toLowerCase() ?? 'asc') as 'asc' | 'desc';
|
||||
|
||||
const isRootFolderId = /^\d+$/.test(query.id);
|
||||
@@ -707,6 +779,7 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
res.body.indexes?.index?.flatMap((idx) =>
|
||||
idx.artist.map((artist) => ({
|
||||
artist: artist.name,
|
||||
coverArt: artist.coverArt,
|
||||
id: artist.id.toString(),
|
||||
isDir: true,
|
||||
title: artist.name,
|
||||
@@ -719,7 +792,14 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
});
|
||||
}
|
||||
|
||||
let folders = items.map((item) => ssNormalize.folder(item, apiClientProps.server));
|
||||
let folders = items.map((item) =>
|
||||
ssNormalize.folder(
|
||||
item,
|
||||
apiClientProps.server,
|
||||
context?.pathReplace,
|
||||
context?.pathReplaceWith,
|
||||
),
|
||||
);
|
||||
|
||||
folders = orderBy(folders, [(v) => v.name.toLowerCase()], [sortOrder]);
|
||||
|
||||
@@ -747,7 +827,12 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
throw new Error('Failed to get folder');
|
||||
}
|
||||
|
||||
const folder = ssNormalize.folder(directoryRes.body.directory, apiClientProps.server);
|
||||
const folder = ssNormalize.folder(
|
||||
directoryRes.body.directory,
|
||||
apiClientProps.server,
|
||||
context?.pathReplace,
|
||||
context?.pathReplaceWith,
|
||||
);
|
||||
|
||||
let filteredFolders = folder.children?.folders || [];
|
||||
let filteredSongs = folder.children?.songs || [];
|
||||
@@ -821,6 +906,29 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
startIndex: query.startIndex,
|
||||
});
|
||||
},
|
||||
getImageUrl: ({ apiClientProps: { server }, baseUrl, query }) => {
|
||||
const { id, size } = query;
|
||||
const imageSize = size;
|
||||
const url = baseUrl || getServerUrl(server);
|
||||
|
||||
if (!url || !server?.credential) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Check for default placeholder image ID
|
||||
if (id.match('2a96cbd8b46e442fc41c2b86b821562f')) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
`${url}/rest/getCoverArt.view` +
|
||||
`?id=${id}` +
|
||||
`&${server.credential}` +
|
||||
'&v=1.13.0' +
|
||||
'&c=Feishin' +
|
||||
(imageSize ? `&size=${imageSize}` : '')
|
||||
);
|
||||
},
|
||||
getInternetRadioStations: async (args) => {
|
||||
const { apiClientProps } = args;
|
||||
|
||||
@@ -852,6 +960,7 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
totalRecordCount: res.body.musicFolders.musicFolder.length,
|
||||
};
|
||||
},
|
||||
|
||||
getPlaylistDetail: async (args) => {
|
||||
const { apiClientProps, query } = args;
|
||||
|
||||
@@ -867,7 +976,6 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
|
||||
return ssNormalize.playlist(res.body.playlist, apiClientProps.server);
|
||||
},
|
||||
|
||||
getPlaylistList: async ({ apiClientProps, query }) => {
|
||||
const sortOrder = query.sortOrder.toLowerCase() as 'asc' | 'desc';
|
||||
|
||||
@@ -938,7 +1046,7 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
|
||||
return results.length;
|
||||
},
|
||||
getPlaylistSongList: async ({ apiClientProps, query }) => {
|
||||
getPlaylistSongList: async ({ apiClientProps, context, query }) => {
|
||||
const res = await ssApiClient(apiClientProps).getPlaylist({
|
||||
query: {
|
||||
id: query.id,
|
||||
@@ -950,8 +1058,15 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
}
|
||||
|
||||
const items =
|
||||
res.body.playlist.entry?.map((song) => ssNormalize.song(song, apiClientProps.server)) ||
|
||||
[];
|
||||
res.body.playlist.entry?.map((song, index) =>
|
||||
ssNormalize.song(
|
||||
song,
|
||||
apiClientProps.server,
|
||||
context?.pathReplace,
|
||||
context?.pathReplaceWith,
|
||||
index,
|
||||
),
|
||||
) || [];
|
||||
|
||||
return {
|
||||
items,
|
||||
@@ -959,7 +1074,7 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
totalRecordCount: items.length,
|
||||
};
|
||||
},
|
||||
getPlayQueue: async ({ apiClientProps }) => {
|
||||
getPlayQueue: async ({ apiClientProps, context }) => {
|
||||
if (hasFeature(apiClientProps.server, ServerFeature.SERVER_PLAY_QUEUE)) {
|
||||
const res = await ssApiClient(apiClientProps).getPlayQueueByIndex();
|
||||
|
||||
@@ -974,7 +1089,15 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
changed,
|
||||
changedBy,
|
||||
currentIndex: currentIndex ?? 0,
|
||||
entry: entry?.map((song) => ssNormalize.song(song, apiClientProps.server)) || [],
|
||||
entry:
|
||||
entry?.map((song) =>
|
||||
ssNormalize.song(
|
||||
song,
|
||||
apiClientProps.server,
|
||||
context?.pathReplace,
|
||||
context?.pathReplaceWith,
|
||||
),
|
||||
) || [],
|
||||
positionMs: position ?? 0,
|
||||
username,
|
||||
};
|
||||
@@ -991,14 +1114,22 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
changed,
|
||||
changedBy,
|
||||
currentIndex: current ? entry.findIndex((item) => item.id === current) : 0,
|
||||
entry: entry?.map((song) => ssNormalize.song(song, apiClientProps.server)) || [],
|
||||
entry:
|
||||
entry?.map((song) =>
|
||||
ssNormalize.song(
|
||||
song,
|
||||
apiClientProps.server,
|
||||
context?.pathReplace,
|
||||
context?.pathReplaceWith,
|
||||
),
|
||||
) || [],
|
||||
positionMs: position ?? 0,
|
||||
username,
|
||||
};
|
||||
}
|
||||
},
|
||||
getRandomSongList: async (args) => {
|
||||
const { apiClientProps, query } = args;
|
||||
const { apiClientProps, context, query } = args;
|
||||
|
||||
const res = await ssApiClient(apiClientProps).getRandomSongList({
|
||||
query: {
|
||||
@@ -1016,7 +1147,12 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
|
||||
const results = res.body.randomSongs?.song || [];
|
||||
const normalizedResults = results.map((song) =>
|
||||
ssNormalize.song(song, apiClientProps.server),
|
||||
ssNormalize.song(
|
||||
song,
|
||||
apiClientProps.server,
|
||||
context?.pathReplace,
|
||||
context?.pathReplaceWith,
|
||||
),
|
||||
);
|
||||
|
||||
return {
|
||||
@@ -1094,7 +1230,7 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
return { features, id: apiClientProps.server?.id, version: ping.body.serverVersion };
|
||||
},
|
||||
getSimilarSongs: async (args) => {
|
||||
const { apiClientProps, query } = args;
|
||||
const { apiClientProps, context, query } = args;
|
||||
|
||||
const res = await ssApiClient(apiClientProps).getSimilarSongs({
|
||||
query: {
|
||||
@@ -1113,14 +1249,21 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
|
||||
return res.body.similarSongs.song.reduce<Song[]>((acc, song) => {
|
||||
if (song.id !== query.songId) {
|
||||
acc.push(ssNormalize.song(song, apiClientProps.server));
|
||||
acc.push(
|
||||
ssNormalize.song(
|
||||
song,
|
||||
apiClientProps.server,
|
||||
context?.pathReplace,
|
||||
context?.pathReplaceWith,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
return acc;
|
||||
}, []);
|
||||
},
|
||||
getSongDetail: async (args) => {
|
||||
const { apiClientProps, query } = args;
|
||||
const { apiClientProps, context, query } = args;
|
||||
|
||||
const res = await ssApiClient(apiClientProps).getSong({
|
||||
query: {
|
||||
@@ -1132,9 +1275,14 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
throw new Error('Failed to get song detail');
|
||||
}
|
||||
|
||||
return ssNormalize.song(res.body.song, apiClientProps.server);
|
||||
return ssNormalize.song(
|
||||
res.body.song,
|
||||
apiClientProps.server,
|
||||
context?.pathReplace,
|
||||
context?.pathReplaceWith,
|
||||
);
|
||||
},
|
||||
getSongList: async ({ apiClientProps, query }) => {
|
||||
getSongList: async ({ apiClientProps, context, query }) => {
|
||||
const fromAlbumPromises: Promise<ServerInferResponses<typeof contract.getAlbum>>[] = [];
|
||||
const artistDetailPromises: Promise<ServerInferResponses<typeof contract.getArtist>>[] = [];
|
||||
|
||||
@@ -1145,6 +1293,7 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
albumOffset: 0,
|
||||
artistCount: 0,
|
||||
artistOffset: 0,
|
||||
musicFolderId: getLibraryId(query.musicFolderId),
|
||||
query: query.searchTerm || '',
|
||||
songCount: query.limit,
|
||||
songOffset: query.startIndex,
|
||||
@@ -1158,7 +1307,12 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
return {
|
||||
items:
|
||||
res.body.searchResult3?.song?.map((song) =>
|
||||
ssNormalize.song(song, apiClientProps.server),
|
||||
ssNormalize.song(
|
||||
song,
|
||||
apiClientProps.server,
|
||||
context?.pathReplace,
|
||||
context?.pathReplaceWith,
|
||||
),
|
||||
) || [],
|
||||
startIndex: query.startIndex,
|
||||
totalRecordCount: null,
|
||||
@@ -1182,7 +1336,15 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
const results = res.body.songsByGenre?.song || [];
|
||||
|
||||
return {
|
||||
items: results.map((song) => ssNormalize.song(song, apiClientProps.server)) || [],
|
||||
items:
|
||||
results.map((song) =>
|
||||
ssNormalize.song(
|
||||
song,
|
||||
apiClientProps.server,
|
||||
context?.pathReplace,
|
||||
context?.pathReplaceWith,
|
||||
),
|
||||
) || [],
|
||||
startIndex: 0,
|
||||
totalRecordCount: null,
|
||||
};
|
||||
@@ -1201,7 +1363,12 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
|
||||
const allResults =
|
||||
(res.body.starred?.song || []).map((song) =>
|
||||
ssNormalize.song(song, apiClientProps.server),
|
||||
ssNormalize.song(
|
||||
song,
|
||||
apiClientProps.server,
|
||||
context?.pathReplace,
|
||||
context?.pathReplaceWith,
|
||||
),
|
||||
) || [];
|
||||
|
||||
return sortAndPaginate(allResults, {
|
||||
@@ -1277,7 +1444,15 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
}
|
||||
|
||||
return {
|
||||
items: results.map((song) => ssNormalize.song(song, apiClientProps.server)) || [],
|
||||
items:
|
||||
results.map((song) =>
|
||||
ssNormalize.song(
|
||||
song,
|
||||
apiClientProps.server,
|
||||
context?.pathReplace,
|
||||
context?.pathReplaceWith,
|
||||
),
|
||||
) || [],
|
||||
startIndex: 0,
|
||||
totalRecordCount: results.length,
|
||||
};
|
||||
@@ -1289,6 +1464,7 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
albumOffset: 0,
|
||||
artistCount: 0,
|
||||
artistOffset: 0,
|
||||
musicFolderId: getLibraryId(query.musicFolderId),
|
||||
query: query.searchTerm || '',
|
||||
songCount: query.limit,
|
||||
songOffset: query.startIndex,
|
||||
@@ -1302,7 +1478,12 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
return {
|
||||
items:
|
||||
res.body.searchResult3?.song?.map((song) =>
|
||||
ssNormalize.song(song, apiClientProps.server),
|
||||
ssNormalize.song(
|
||||
song,
|
||||
apiClientProps.server,
|
||||
context?.pathReplace,
|
||||
context?.pathReplaceWith,
|
||||
),
|
||||
) || [],
|
||||
startIndex: 0,
|
||||
totalRecordCount: null,
|
||||
@@ -1329,6 +1510,7 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
albumOffset: 0,
|
||||
artistCount: 0,
|
||||
artistOffset: 0,
|
||||
musicFolderId: getLibraryId(query.musicFolderId),
|
||||
query: query.searchTerm || '',
|
||||
songCount: MAX_SUBSONIC_ITEMS,
|
||||
songOffset: startIndex,
|
||||
@@ -1420,6 +1602,76 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
return (res.body.starred?.song || []).length || 0;
|
||||
}
|
||||
|
||||
const artistIds = query.albumArtistIds || query.artistIds;
|
||||
|
||||
if (query.albumIds || artistIds) {
|
||||
const fromAlbumPromises: Promise<ServerInferResponses<typeof contract.getAlbum>>[] = [];
|
||||
const artistDetailPromises: Promise<ServerInferResponses<typeof contract.getArtist>>[] =
|
||||
[];
|
||||
|
||||
if (query.albumIds) {
|
||||
for (const albumId of query.albumIds) {
|
||||
fromAlbumPromises.push(
|
||||
ssApiClient(apiClientProps).getAlbum({
|
||||
query: {
|
||||
id: albumId,
|
||||
},
|
||||
}),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if (artistIds) {
|
||||
for (const artistId of artistIds) {
|
||||
artistDetailPromises.push(
|
||||
ssApiClient(apiClientProps).getArtist({
|
||||
query: {
|
||||
id: artistId,
|
||||
},
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
const artistResult = await Promise.all(artistDetailPromises);
|
||||
|
||||
const albums = artistResult.flatMap((artist) => {
|
||||
if (artist.status !== 200) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return artist.body.artist.album ?? [];
|
||||
});
|
||||
|
||||
const albumIds = albums.map((album) => album.id);
|
||||
|
||||
for (const albumId of albumIds) {
|
||||
fromAlbumPromises.push(
|
||||
ssApiClient(apiClientProps).getAlbum({
|
||||
query: {
|
||||
id: albumId.toString(),
|
||||
},
|
||||
}),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
let results: z.infer<typeof ssType._response.song>[] = [];
|
||||
|
||||
if (fromAlbumPromises.length > 0) {
|
||||
const albumsResult = await Promise.all(fromAlbumPromises);
|
||||
|
||||
results = albumsResult.flatMap((album) => {
|
||||
if (album.status !== 200) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return album.body.album.song;
|
||||
});
|
||||
}
|
||||
|
||||
return results.length;
|
||||
}
|
||||
|
||||
let totalRecordCount = 0;
|
||||
|
||||
// Rather than just do `search3` by groups of 500, instead
|
||||
@@ -1432,6 +1684,7 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
albumOffset: 0,
|
||||
artistCount: 0,
|
||||
artistOffset: 0,
|
||||
musicFolderId: getLibraryId(query.musicFolderId),
|
||||
query: query.searchTerm || '',
|
||||
songCount: 1,
|
||||
songOffset: sectionIndex,
|
||||
@@ -1460,6 +1713,7 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
albumOffset: 0,
|
||||
artistCount: 0,
|
||||
artistOffset: 0,
|
||||
musicFolderId: getLibraryId(query.musicFolderId),
|
||||
query: query.searchTerm || '',
|
||||
songCount: MAX_SUBSONIC_ITEMS,
|
||||
songOffset: startIndex,
|
||||
@@ -1538,7 +1792,7 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
});
|
||||
},
|
||||
getTopSongs: async (args) => {
|
||||
const { apiClientProps, query } = args;
|
||||
const { apiClientProps, context, query } = args;
|
||||
|
||||
const res = await ssApiClient(apiClientProps).getTopSongsList({
|
||||
query: {
|
||||
@@ -1554,7 +1808,12 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
return {
|
||||
items:
|
||||
res.body.topSongs?.song?.map((song) =>
|
||||
ssNormalize.song(song, apiClientProps.server),
|
||||
ssNormalize.song(
|
||||
song,
|
||||
apiClientProps.server,
|
||||
context?.pathReplace,
|
||||
context?.pathReplaceWith,
|
||||
),
|
||||
) || [],
|
||||
startIndex: 0,
|
||||
totalRecordCount: res.body.topSongs?.song?.length || 0,
|
||||
@@ -1594,7 +1853,7 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
return null;
|
||||
},
|
||||
replacePlaylist: async (args) => {
|
||||
const { apiClientProps, body, query } = args;
|
||||
const { apiClientProps, body, context, query } = args;
|
||||
|
||||
// 1. Fetch existing songs from the playlist
|
||||
const existingSongsRes = await ssApiClient(apiClientProps).getPlaylist({
|
||||
@@ -1609,7 +1868,12 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
|
||||
const existingSongs =
|
||||
existingSongsRes.body.playlist.entry?.map((song) =>
|
||||
ssNormalize.song(song, apiClientProps.server),
|
||||
ssNormalize.song(
|
||||
song,
|
||||
apiClientProps.server,
|
||||
context?.pathReplace,
|
||||
context?.pathReplaceWith,
|
||||
),
|
||||
) || [];
|
||||
|
||||
// 2. Get playlist detail to get the name
|
||||
@@ -1721,7 +1985,7 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
return null;
|
||||
},
|
||||
search: async (args) => {
|
||||
const { apiClientProps, query } = args;
|
||||
const { apiClientProps, context, query } = args;
|
||||
|
||||
const res = await ssApiClient(apiClientProps).search3({
|
||||
query: {
|
||||
@@ -1729,6 +1993,7 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
albumOffset: query.albumStartIndex,
|
||||
artistCount: query.albumArtistLimit,
|
||||
artistOffset: query.albumArtistStartIndex,
|
||||
musicFolderId: getLibraryId(query.musicFolderId),
|
||||
query: query.query,
|
||||
songCount: query.songLimit,
|
||||
songOffset: query.songStartIndex,
|
||||
@@ -1744,10 +2009,20 @@ export const SubsonicController: InternalControllerEndpoint = {
|
||||
ssNormalize.albumArtist(artist, apiClientProps.server),
|
||||
),
|
||||
albums: (res.body.searchResult3?.album || []).map((album) =>
|
||||
ssNormalize.album(album, apiClientProps.server),
|
||||
ssNormalize.album(
|
||||
album,
|
||||
apiClientProps.server,
|
||||
args.context?.pathReplace,
|
||||
args.context?.pathReplaceWith,
|
||||
),
|
||||
),
|
||||
songs: (res.body.searchResult3?.song || []).map((song) =>
|
||||
ssNormalize.song(song, apiClientProps.server),
|
||||
ssNormalize.song(
|
||||
song,
|
||||
apiClientProps.server,
|
||||
context?.pathReplace,
|
||||
context?.pathReplaceWith,
|
||||
),
|
||||
),
|
||||
};
|
||||
},
|
||||
|
||||
@@ -0,0 +1,68 @@
|
||||
import { QueryClient } from '@tanstack/react-query';
|
||||
|
||||
import { getServerById } from '/@/renderer/store';
|
||||
import { ServerType } from '/@/shared/types/domain-types';
|
||||
|
||||
interface OptimizedListCountOptions<TQuery, TListQuery, TResponse> {
|
||||
client: QueryClient;
|
||||
listQueryFn: (args: {
|
||||
apiClientProps: { serverId: string; signal?: AbortSignal };
|
||||
query: TListQuery;
|
||||
}) => Promise<TResponse>;
|
||||
listQueryKeyFn: (serverId: string, query: TListQuery) => readonly unknown[];
|
||||
query: TQuery;
|
||||
serverId: string;
|
||||
signal?: AbortSignal;
|
||||
}
|
||||
|
||||
export const getOptimizedListCount = async <
|
||||
TQuery,
|
||||
TListQuery extends { limit?: number; startIndex?: number },
|
||||
TResponse extends { totalRecordCount: null | number },
|
||||
>({
|
||||
client,
|
||||
listQueryFn,
|
||||
listQueryKeyFn,
|
||||
query,
|
||||
serverId,
|
||||
signal,
|
||||
}: OptimizedListCountOptions<TQuery, TListQuery, TResponse>): Promise<null | number> => {
|
||||
const server = getServerById(serverId);
|
||||
|
||||
if (server?.type !== ServerType.NAVIDROME && server?.type !== ServerType.JELLYFIN) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const limit =
|
||||
typeof query === 'object' &&
|
||||
query !== null &&
|
||||
'limit' in query &&
|
||||
typeof (query as any).limit === 'number' &&
|
||||
(query as any).limit > 0
|
||||
? (query as any).limit
|
||||
: 100;
|
||||
|
||||
// In most cases, the list count is called when entering the first page, so we fetch from the first page
|
||||
// This optimization will only help in this case, otherwise we still need 2 requests to get both the count and the data
|
||||
const pageQuery = {
|
||||
...query,
|
||||
limit,
|
||||
startIndex: 0,
|
||||
} as unknown as TListQuery;
|
||||
|
||||
const pageQueryKey = listQueryKeyFn(serverId, pageQuery);
|
||||
const cachedPage = client.getQueryData(pageQueryKey);
|
||||
|
||||
if (cachedPage && typeof cachedPage === 'object' && 'totalRecordCount' in cachedPage) {
|
||||
return (cachedPage as TResponse).totalRecordCount ?? 0;
|
||||
}
|
||||
|
||||
const pageResult = await listQueryFn({
|
||||
apiClientProps: { serverId, signal },
|
||||
query: pageQuery,
|
||||
});
|
||||
|
||||
client.setQueryData(pageQueryKey, pageResult);
|
||||
|
||||
return pageResult.totalRecordCount ?? 0;
|
||||
};
|
||||
@@ -7,14 +7,13 @@ import '@mantine/core/styles.css';
|
||||
import '@mantine/dates/styles.css';
|
||||
import '@mantine/notifications/styles.css';
|
||||
import isElectron from 'is-electron';
|
||||
import { useEffect, useMemo, useRef, useState } from 'react';
|
||||
import { lazy, Suspense, useEffect, useMemo, useRef, useState } from 'react';
|
||||
|
||||
import i18n from '/@/i18n/i18n';
|
||||
import { WebAudioContext } from '/@/renderer/features/player/context/webaudio-context';
|
||||
import { useSyncSettingsToMain } from '/@/renderer/hooks/use-sync-settings-to-main';
|
||||
import { ReleaseNotesModal } from './release-notes-modal';
|
||||
import { AppRouter } from '/@/renderer/router/app-router';
|
||||
import { useCssSettings, useHotkeySettings, useSettingsStore } from '/@/renderer/store';
|
||||
import { useCssSettings, useHotkeySettings, useLanguage } from '/@/renderer/store';
|
||||
import { useAppTheme } from '/@/renderer/themes/use-app-theme';
|
||||
import { sanitizeCss } from '/@/renderer/utils/sanitize';
|
||||
import { WebAudio } from '/@/shared/types/types';
|
||||
@@ -22,11 +21,17 @@ import '/@/shared/styles/global.css';
|
||||
import { PlayerProvider } from '/@/renderer/features/player/context/player-context';
|
||||
import { AudioPlayers } from '/@/renderer/features/player/components/audio-players';
|
||||
|
||||
const ReleaseNotesModal = lazy(() =>
|
||||
import('./release-notes-modal').then((module) => ({
|
||||
default: module.ReleaseNotesModal,
|
||||
})),
|
||||
);
|
||||
|
||||
const ipc = isElectron() ? window.api.ipc : null;
|
||||
|
||||
export const App = () => {
|
||||
const { mode, theme } = useAppTheme();
|
||||
const language = useSettingsStore((store) => store.general.language);
|
||||
const language = useLanguage();
|
||||
|
||||
const { content, enabled } = useCssSettings();
|
||||
const { bindings } = useHotkeySettings();
|
||||
@@ -72,16 +77,21 @@ export const App = () => {
|
||||
}
|
||||
}, [language]);
|
||||
|
||||
const notificationStyles = useMemo(
|
||||
() => ({
|
||||
root: {
|
||||
marginBottom: 90,
|
||||
},
|
||||
}),
|
||||
[],
|
||||
);
|
||||
|
||||
return (
|
||||
<MantineProvider forceColorScheme={mode} theme={theme}>
|
||||
<Notifications
|
||||
containerWidth="300px"
|
||||
position="bottom-center"
|
||||
styles={{
|
||||
root: {
|
||||
marginBottom: 90,
|
||||
},
|
||||
}}
|
||||
styles={notificationStyles}
|
||||
zIndex={50000}
|
||||
/>
|
||||
<WebAudioContext.Provider value={webAudioProvider}>
|
||||
@@ -90,7 +100,9 @@ export const App = () => {
|
||||
<AppRouter />
|
||||
</PlayerProvider>
|
||||
</WebAudioContext.Provider>
|
||||
<ReleaseNotesModal />
|
||||
<Suspense fallback={null}>
|
||||
<ReleaseNotesModal />
|
||||
</Suspense>
|
||||
</MantineProvider>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -3,6 +3,7 @@ import { useTranslation } from 'react-i18next';
|
||||
|
||||
import styles from './drag-preview.module.css';
|
||||
|
||||
import { useItemImageUrl } from '/@/renderer/components/item-image/item-image';
|
||||
import { Icon } from '/@/shared/components/icon/icon';
|
||||
import { LibraryItem } from '/@/shared/types/domain-types';
|
||||
import { DragData } from '/@/shared/types/drag-and-drop';
|
||||
@@ -23,22 +24,19 @@ const getItemName = (item: unknown): string => {
|
||||
return 'Item';
|
||||
};
|
||||
|
||||
const getItemImage = (item: unknown): null | string => {
|
||||
if (item && typeof item === 'object') {
|
||||
if ('imageUrl' in item && typeof item.imageUrl === 'string') {
|
||||
return item.imageUrl;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
};
|
||||
|
||||
export const DragPreview = memo(({ data }: DragPreviewProps) => {
|
||||
const items = data.item || [];
|
||||
const { t } = useTranslation();
|
||||
const itemCount = items.length;
|
||||
const firstItem = items[0];
|
||||
const itemName = firstItem ? getItemName(firstItem) : 'Item';
|
||||
const itemImage = firstItem ? getItemImage(firstItem) : null;
|
||||
|
||||
const itemImage = useItemImageUrl({
|
||||
id: (firstItem as { imageId: string })?.imageId,
|
||||
itemType: data.itemType || LibraryItem.SONG,
|
||||
type: 'table',
|
||||
});
|
||||
|
||||
const isMultiple = itemCount > 1;
|
||||
|
||||
return (
|
||||
@@ -27,6 +27,20 @@
|
||||
isolation: isolate;
|
||||
}
|
||||
|
||||
.blurred-background {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
z-index: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-repeat: no-repeat;
|
||||
background-position: center;
|
||||
background-size: cover;
|
||||
opacity: 0.8;
|
||||
transform: scale(1.1);
|
||||
}
|
||||
|
||||
.carousel-item :global(.overlay) {
|
||||
border-radius: var(--theme-radius-md);
|
||||
}
|
||||
@@ -53,6 +67,13 @@
|
||||
padding: var(--theme-spacing-md);
|
||||
}
|
||||
|
||||
.single-carousel-container .carousel-item .content {
|
||||
flex-direction: row;
|
||||
gap: var(--theme-spacing-lg);
|
||||
align-items: flex-end;
|
||||
padding: var(--theme-spacing-xl);
|
||||
}
|
||||
|
||||
.title-section {
|
||||
display: flex;
|
||||
flex-shrink: 0;
|
||||
@@ -77,6 +98,15 @@
|
||||
max-height: 160px;
|
||||
}
|
||||
|
||||
.single-carousel-container .carousel-item .content .image-section {
|
||||
flex-shrink: 0;
|
||||
justify-content: flex-start;
|
||||
width: auto;
|
||||
height: auto;
|
||||
min-height: auto;
|
||||
max-height: none;
|
||||
}
|
||||
|
||||
.play-button-overlay {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
@@ -106,6 +136,23 @@
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.single-carousel-container .carousel-item .content .metadata-section {
|
||||
flex: 1;
|
||||
align-items: flex-start;
|
||||
justify-content: center;
|
||||
height: auto;
|
||||
min-height: auto;
|
||||
max-height: none;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
/* Hide metadata on screens smaller than xs */
|
||||
@media (width < 36em) {
|
||||
.single-carousel-container .carousel-item .content .metadata-section {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.image-link {
|
||||
display: block;
|
||||
transition: transform 0.3s ease;
|
||||
@@ -129,6 +176,11 @@
|
||||
transition: filter 0.3s ease;
|
||||
}
|
||||
|
||||
.single-carousel-container .album-image-container {
|
||||
width: 200px;
|
||||
max-width: 200px;
|
||||
}
|
||||
|
||||
.album-image-container::before {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
@@ -149,7 +201,7 @@
|
||||
|
||||
.album-image {
|
||||
width: 100%;
|
||||
height: auto;
|
||||
height: 100%;
|
||||
object-fit: cover;
|
||||
border-radius: var(--theme-radius-md);
|
||||
}
|
||||
@@ -159,6 +211,12 @@
|
||||
filter: drop-shadow(0 16px 40px rgb(0 0 0 / 60%)) drop-shadow(0 6px 16px rgb(0 0 0 / 50%));
|
||||
}
|
||||
|
||||
/* Single carousel: remove hover shadow effect */
|
||||
.single-carousel-container .carousel-item:hover .album-image-container,
|
||||
.single-carousel-container .carousel-link:hover .album-image-container {
|
||||
filter: drop-shadow(0 6px 20px rgb(0 0 0 / 50%)) drop-shadow(0 2px 8px rgb(0 0 0 / 40%));
|
||||
}
|
||||
|
||||
.artist-link {
|
||||
display: inline-block;
|
||||
color: inherit;
|
||||
@@ -177,6 +235,7 @@
|
||||
}
|
||||
|
||||
.artist {
|
||||
width: 100%;
|
||||
color: white;
|
||||
text-shadow: 0 0 8px rgb(0 0 0 / 50%);
|
||||
}
|
||||
@@ -217,6 +276,21 @@
|
||||
transform: translateY(-50%) scale(0.95);
|
||||
}
|
||||
|
||||
.single-carousel-container .nav-arrow-left,
|
||||
.single-carousel-container .nav-arrow-right {
|
||||
pointer-events: none;
|
||||
opacity: 0;
|
||||
transition:
|
||||
opacity 0.2s ease,
|
||||
transform 0.2s ease;
|
||||
}
|
||||
|
||||
.single-carousel-container:hover .nav-arrow-left,
|
||||
.single-carousel-container:hover .nav-arrow-right {
|
||||
pointer-events: auto;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
@container (min-width: $mantine-breakpoint-xs) {
|
||||
.carousel-item {
|
||||
min-height: 300px;
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
import type { MouseEvent } from 'react';
|
||||
|
||||
import { AnimatePresence, motion } from 'motion/react';
|
||||
import { useEffect, useMemo, useRef, useState } from 'react';
|
||||
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
||||
import { generatePath, Link } from 'react-router';
|
||||
|
||||
import styles from './feature-carousel.module.css';
|
||||
|
||||
import { ItemImage, useItemImageUrl } from '/@/renderer/components/item-image/item-image';
|
||||
import { usePlayer } from '/@/renderer/features/player/context/player-context';
|
||||
import { BackgroundOverlay } from '/@/renderer/features/shared/components/library-background-overlay';
|
||||
import { PlayButtonGroup } from '/@/renderer/features/shared/components/play-button-group';
|
||||
@@ -15,7 +16,6 @@ import { useCurrentServer } from '/@/renderer/store';
|
||||
import { ActionIcon } from '/@/shared/components/action-icon/action-icon';
|
||||
import { Badge } from '/@/shared/components/badge/badge';
|
||||
import { Group } from '/@/shared/components/group/group';
|
||||
import { Image } from '/@/shared/components/image/image';
|
||||
import { Stack } from '/@/shared/components/stack/stack';
|
||||
import { Text } from '/@/shared/components/text/text';
|
||||
import { Album, LibraryItem } from '/@/shared/types/domain-types';
|
||||
@@ -78,9 +78,15 @@ interface CarouselItemProps {
|
||||
}
|
||||
|
||||
const CarouselItem = ({ album }: CarouselItemProps) => {
|
||||
const imageUrl = useItemImageUrl({
|
||||
id: album.imageId || undefined,
|
||||
itemType: LibraryItem.ALBUM,
|
||||
type: 'itemCard',
|
||||
});
|
||||
|
||||
const { background: backgroundColor } = useFastAverageColor({
|
||||
algorithm: 'dominant',
|
||||
src: album.imageUrl || null,
|
||||
src: imageUrl || null,
|
||||
srcLoaded: true,
|
||||
});
|
||||
|
||||
@@ -110,10 +116,16 @@ const CarouselItem = ({ album }: CarouselItemProps) => {
|
||||
</div>
|
||||
|
||||
<div className={styles.imageSection}>
|
||||
<Image
|
||||
<ItemImage
|
||||
className={styles.albumImage}
|
||||
containerClassName={styles.albumImageContainer}
|
||||
src={album.imageUrl || undefined}
|
||||
enableDebounce={false}
|
||||
enableViewport={false}
|
||||
fetchPriority="high"
|
||||
id={album.imageId}
|
||||
itemType={LibraryItem.ALBUM}
|
||||
src={imageUrl}
|
||||
type="itemCard"
|
||||
/>
|
||||
<div className={styles.playButtonOverlay}>
|
||||
<PlayButtonGroup onPlay={handlePlay} />
|
||||
@@ -123,7 +135,13 @@ const CarouselItem = ({ album }: CarouselItemProps) => {
|
||||
<div className={styles.metadataSection}>
|
||||
<Stack gap="sm">
|
||||
{album.albumArtists?.[0] && (
|
||||
<Text className={styles.artist} fw={500} size="md">
|
||||
<Text
|
||||
className={styles.artist}
|
||||
fw={500}
|
||||
lineClamp={1}
|
||||
size="md"
|
||||
ta="center"
|
||||
>
|
||||
{album.albumArtists[0].name}
|
||||
</Text>
|
||||
)}
|
||||
@@ -201,28 +219,70 @@ export const FeatureCarousel = ({ data, onNearEnd }: FeatureCarouselProps) => {
|
||||
}
|
||||
}, [data, startIndex, itemsPerRow, onNearEnd]);
|
||||
|
||||
const handleNext = (e?: MouseEvent<HTMLButtonElement>) => {
|
||||
e?.preventDefault();
|
||||
e?.stopPropagation();
|
||||
if (!data) return;
|
||||
directionRef.current = { isNext: true };
|
||||
setStartIndex((prev) => (prev + itemsPerRow) % data.length);
|
||||
};
|
||||
const handleNext = useCallback(
|
||||
(e?: MouseEvent<HTMLButtonElement>) => {
|
||||
e?.preventDefault();
|
||||
e?.stopPropagation();
|
||||
if (!data) return;
|
||||
directionRef.current = { isNext: true };
|
||||
setStartIndex((prev) => (prev + itemsPerRow) % data.length);
|
||||
},
|
||||
[data, itemsPerRow],
|
||||
);
|
||||
|
||||
const handlePrevious = (e?: MouseEvent<HTMLButtonElement>) => {
|
||||
e?.preventDefault();
|
||||
e?.stopPropagation();
|
||||
if (!data) return;
|
||||
directionRef.current = { isNext: false };
|
||||
setStartIndex((prev) => (prev - itemsPerRow + data.length) % data.length);
|
||||
};
|
||||
const handlePrevious = useCallback(
|
||||
(e?: MouseEvent<HTMLButtonElement>) => {
|
||||
e?.preventDefault();
|
||||
e?.stopPropagation();
|
||||
if (!data) return;
|
||||
directionRef.current = { isNext: false };
|
||||
setStartIndex((prev) => (prev - itemsPerRow + data.length) % data.length);
|
||||
},
|
||||
[data, itemsPerRow],
|
||||
);
|
||||
|
||||
const canNavigate = data && data.length > itemsPerRow;
|
||||
|
||||
const wheelCooldownRef = useRef(0);
|
||||
const wheelThreshold = 10;
|
||||
const wheelCooldownMs = 250;
|
||||
|
||||
const handleWheel = useCallback(
|
||||
(event: React.WheelEvent<HTMLDivElement>) => {
|
||||
if (!canNavigate || !data) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!event.shiftKey) {
|
||||
return;
|
||||
}
|
||||
|
||||
const now = Date.now();
|
||||
const elapsed = now - wheelCooldownRef.current;
|
||||
|
||||
const horizontalDelta = Math.abs(event.deltaY);
|
||||
|
||||
if (horizontalDelta < wheelThreshold || elapsed < wheelCooldownMs) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (event.deltaY > 0) {
|
||||
wheelCooldownRef.current = now;
|
||||
handleNext();
|
||||
} else if (event.deltaY < 0) {
|
||||
wheelCooldownRef.current = now;
|
||||
handlePrevious();
|
||||
}
|
||||
},
|
||||
[canNavigate, data, handleNext, handlePrevious, wheelCooldownMs, wheelThreshold],
|
||||
);
|
||||
|
||||
if (!data || data.length === 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<div className={styles.carouselContainer} ref={containerRef}>
|
||||
<div className={styles.carouselContainer} onWheel={handleWheel} ref={containerRef}>
|
||||
<AnimatePresence initial={false} mode="popLayout">
|
||||
<motion.div
|
||||
animate="animate"
|
||||
|
||||
@@ -0,0 +1,352 @@
|
||||
import type { MouseEvent } from 'react';
|
||||
|
||||
import { AnimatePresence, motion } from 'motion/react';
|
||||
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
||||
import { generatePath, Link } from 'react-router';
|
||||
|
||||
import styles from './feature-carousel.module.css';
|
||||
|
||||
import { ItemImage, useItemImageUrl } from '/@/renderer/components/item-image/item-image';
|
||||
import { usePlayer } from '/@/renderer/features/player/context/player-context';
|
||||
import { BackgroundOverlay } from '/@/renderer/features/shared/components/library-background-overlay';
|
||||
import { calculateTitleSize } from '/@/renderer/features/shared/components/library-header';
|
||||
import { PlayButtonGroup } from '/@/renderer/features/shared/components/play-button-group';
|
||||
import { useContainerQuery, useFastAverageColor } from '/@/renderer/hooks';
|
||||
import { AppRoute } from '/@/renderer/router/routes';
|
||||
import { useCurrentServer } from '/@/renderer/store';
|
||||
import { ActionIcon } from '/@/shared/components/action-icon/action-icon';
|
||||
import { Group } from '/@/shared/components/group/group';
|
||||
import { Separator } from '/@/shared/components/separator/separator';
|
||||
import { Stack } from '/@/shared/components/stack/stack';
|
||||
import { TextTitle } from '/@/shared/components/text-title/text-title';
|
||||
import { Text } from '/@/shared/components/text/text';
|
||||
import { Album, LibraryItem } from '/@/shared/types/domain-types';
|
||||
import { Play } from '/@/shared/types/types';
|
||||
|
||||
const containerVariants = {
|
||||
animate: {},
|
||||
exit: {},
|
||||
initial: {},
|
||||
};
|
||||
|
||||
const itemVariants = {
|
||||
animate: {
|
||||
opacity: 1,
|
||||
scale: 1,
|
||||
transition: {
|
||||
duration: 0.2,
|
||||
ease: 'easeOut' as const,
|
||||
},
|
||||
y: 0,
|
||||
},
|
||||
exit: {
|
||||
opacity: 0,
|
||||
transition: {
|
||||
duration: 0.3,
|
||||
ease: 'easeIn' as const,
|
||||
},
|
||||
y: 0,
|
||||
},
|
||||
initial: {
|
||||
opacity: 0,
|
||||
y: 0,
|
||||
},
|
||||
};
|
||||
|
||||
interface CarouselItemProps {
|
||||
album: Album;
|
||||
}
|
||||
|
||||
interface SingleFeatureCarouselProps {
|
||||
data: Album[] | undefined;
|
||||
onNearEnd?: () => void;
|
||||
}
|
||||
|
||||
// const CAROUSEL_AUTOPLAY_INTERVAL = 10000;
|
||||
|
||||
const CarouselItem = ({ album }: CarouselItemProps) => {
|
||||
const imageUrl = useItemImageUrl({
|
||||
id: album.imageId || undefined,
|
||||
itemType: LibraryItem.ALBUM,
|
||||
type: 'itemCard',
|
||||
});
|
||||
|
||||
const { background: backgroundColor } = useFastAverageColor({
|
||||
algorithm: 'dominant',
|
||||
src: imageUrl || null,
|
||||
srcLoaded: true,
|
||||
});
|
||||
|
||||
const server = useCurrentServer();
|
||||
const { addToQueueByFetch } = usePlayer();
|
||||
|
||||
const handlePlay = (type: Play) => {
|
||||
if (!server?.id) return;
|
||||
addToQueueByFetch(server.id, [album.id], LibraryItem.ALBUM, type);
|
||||
};
|
||||
|
||||
const metadataItems = useMemo(() => {
|
||||
return [
|
||||
...(album.genres?.slice(0, 2).map((genre) => genre.name) || []),
|
||||
album.releaseYear ? album.releaseYear.toString() : null,
|
||||
].filter(Boolean);
|
||||
}, [album]);
|
||||
|
||||
return (
|
||||
<div className={styles.carouselItem}>
|
||||
{imageUrl && (
|
||||
<div
|
||||
className={styles.blurredBackground}
|
||||
style={{
|
||||
backgroundImage: `url(${imageUrl})`,
|
||||
filter: 'blur(3rem)',
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
<BackgroundOverlay backgroundColor={backgroundColor} opacity={0.7} />
|
||||
<Link
|
||||
className={styles.carouselLink}
|
||||
state={{ item: album }}
|
||||
to={generatePath(AppRoute.LIBRARY_ALBUMS_DETAIL, {
|
||||
albumId: album.id,
|
||||
})}
|
||||
>
|
||||
<div className={styles.content}>
|
||||
<div className={styles.imageSection}>
|
||||
<ItemImage
|
||||
className={styles.albumImage}
|
||||
containerClassName={styles.albumImageContainer}
|
||||
enableDebounce={false}
|
||||
enableViewport={false}
|
||||
fetchPriority="high"
|
||||
id={album.imageId}
|
||||
itemType={LibraryItem.ALBUM}
|
||||
type="itemCard"
|
||||
/>
|
||||
<div className={styles.playButtonOverlay}>
|
||||
<PlayButtonGroup onPlay={handlePlay} />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className={styles.metadataSection}>
|
||||
<Stack gap="sm">
|
||||
<TextTitle
|
||||
className={styles.title}
|
||||
fw={900}
|
||||
lh={1.1}
|
||||
order={1}
|
||||
style={{ fontSize: calculateTitleSize(album.name) }}
|
||||
ta="left"
|
||||
>
|
||||
{album.name}
|
||||
</TextTitle>
|
||||
{album.albumArtistName && (
|
||||
<TextTitle
|
||||
className={styles.title}
|
||||
fw={700}
|
||||
lh={1.1}
|
||||
order={5}
|
||||
ta="left"
|
||||
>
|
||||
{album.albumArtistName}
|
||||
</TextTitle>
|
||||
)}
|
||||
<Group gap="xs" justify="flex-start" wrap="wrap">
|
||||
{metadataItems.map((item, index) => (
|
||||
<Text
|
||||
className={styles.title}
|
||||
fw={600}
|
||||
key={`metadata-${item}`}
|
||||
size="sm"
|
||||
>
|
||||
{item}
|
||||
{index < metadataItems.length - 1 && <Separator />}
|
||||
</Text>
|
||||
))}
|
||||
</Group>
|
||||
</Stack>
|
||||
</div>
|
||||
</div>
|
||||
</Link>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export const SingleFeatureCarousel = ({ data, onNearEnd }: SingleFeatureCarouselProps) => {
|
||||
const [currentIndex, setCurrentIndex] = useState(0);
|
||||
const directionRef = useRef<{ isNext: boolean }>({ isNext: true });
|
||||
const { ref: containerRef } = useContainerQuery({
|
||||
'2xl': 1920,
|
||||
'3xl': 2560,
|
||||
lg: 1024,
|
||||
md: 768,
|
||||
sm: 640,
|
||||
xl: 1440,
|
||||
});
|
||||
|
||||
// Check if we're near the end and trigger loading more
|
||||
useEffect(() => {
|
||||
if (!data || !onNearEnd) return;
|
||||
const remainingItems = data.length - currentIndex;
|
||||
// Trigger when we have less than 3 items remaining
|
||||
if (remainingItems < 3) {
|
||||
onNearEnd();
|
||||
}
|
||||
}, [data, currentIndex, onNearEnd]);
|
||||
|
||||
// useEffect(() => {
|
||||
// if (!data || data.length <= 1 || isPaused) {
|
||||
// if (intervalRef.current) {
|
||||
// clearInterval(intervalRef.current);
|
||||
// intervalRef.current = null;
|
||||
// }
|
||||
// return;
|
||||
// }
|
||||
|
||||
// if (intervalRef.current) {
|
||||
// clearInterval(intervalRef.current);
|
||||
// }
|
||||
|
||||
// intervalRef.current = setInterval(() => {
|
||||
// setCurrentIndex((prev) => (prev + 1) % data.length);
|
||||
// directionRef.current = { isNext: true };
|
||||
// }, CAROUSEL_AUTOPLAY_INTERVAL);
|
||||
|
||||
// return () => {
|
||||
// if (intervalRef.current) {
|
||||
// clearInterval(intervalRef.current);
|
||||
// intervalRef.current = null;
|
||||
// }
|
||||
// };
|
||||
// }, [data, isPaused, intervalKey]);
|
||||
|
||||
const handleNext = useCallback(
|
||||
(e?: MouseEvent<HTMLButtonElement>) => {
|
||||
e?.preventDefault();
|
||||
e?.stopPropagation();
|
||||
if (!data) return;
|
||||
directionRef.current = { isNext: true };
|
||||
setCurrentIndex((prev) => (prev + 1) % data.length);
|
||||
// setIntervalKey((prev) => prev + 1);
|
||||
},
|
||||
[data],
|
||||
);
|
||||
|
||||
const handlePrevious = useCallback(
|
||||
(e?: MouseEvent<HTMLButtonElement>) => {
|
||||
e?.preventDefault();
|
||||
e?.stopPropagation();
|
||||
if (!data) return;
|
||||
directionRef.current = { isNext: false };
|
||||
setCurrentIndex((prev) => (prev - 1 + data.length) % data.length);
|
||||
// setIntervalKey((prev) => prev + 1);
|
||||
},
|
||||
[data],
|
||||
);
|
||||
|
||||
const canNavigate = data && data.length > 1;
|
||||
|
||||
const wheelCooldownRef = useRef(0);
|
||||
const wheelThreshold = 10;
|
||||
const wheelCooldownMs = 250;
|
||||
|
||||
const handleWheel = useCallback(
|
||||
(event: React.WheelEvent<HTMLDivElement>) => {
|
||||
if (!canNavigate || !data) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!event.shiftKey) {
|
||||
return;
|
||||
}
|
||||
|
||||
const now = Date.now();
|
||||
const elapsed = now - wheelCooldownRef.current;
|
||||
|
||||
const horizontalDelta = Math.abs(event.deltaY);
|
||||
|
||||
if (horizontalDelta < wheelThreshold || elapsed < wheelCooldownMs) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (event.deltaY > 0) {
|
||||
wheelCooldownRef.current = now;
|
||||
handleNext();
|
||||
} else if (event.deltaY < 0) {
|
||||
wheelCooldownRef.current = now;
|
||||
handlePrevious();
|
||||
}
|
||||
},
|
||||
[canNavigate, data, handleNext, handlePrevious, wheelCooldownMs, wheelThreshold],
|
||||
);
|
||||
|
||||
if (!data || data.length === 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const currentAlbum = data[currentIndex];
|
||||
|
||||
return (
|
||||
<div
|
||||
className={`${styles.carouselContainer} ${styles.singleCarouselContainer}`}
|
||||
// onMouseEnter={() => setIsPaused(true)}
|
||||
// onMouseLeave={() => setIsPaused(false)}
|
||||
onWheel={handleWheel}
|
||||
ref={containerRef}
|
||||
>
|
||||
<AnimatePresence initial={false} mode="popLayout">
|
||||
<motion.div
|
||||
animate="animate"
|
||||
className={styles.carousel}
|
||||
exit="exit"
|
||||
initial="initial"
|
||||
key={`carousel-${currentIndex}`}
|
||||
style={{ '--items-per-row': 1 } as React.CSSProperties}
|
||||
variants={containerVariants}
|
||||
>
|
||||
<motion.div
|
||||
key={`item-${currentAlbum.id}-${currentIndex}`}
|
||||
variants={itemVariants}
|
||||
>
|
||||
<CarouselItem album={currentAlbum} />
|
||||
</motion.div>
|
||||
</motion.div>
|
||||
</AnimatePresence>
|
||||
|
||||
{data.length > 1 && (
|
||||
<>
|
||||
<ActionIcon
|
||||
className={styles.navArrowLeft}
|
||||
icon="arrowLeftS"
|
||||
iconProps={{ size: 'xl' }}
|
||||
onClick={handlePrevious}
|
||||
radius="50%"
|
||||
size="md"
|
||||
styles={{
|
||||
icon: {
|
||||
color: 'white',
|
||||
fill: 'white',
|
||||
},
|
||||
}}
|
||||
variant="subtle"
|
||||
/>
|
||||
<ActionIcon
|
||||
className={styles.navArrowRight}
|
||||
icon="arrowRightS"
|
||||
iconProps={{ size: 'xl' }}
|
||||
onClick={handleNext}
|
||||
radius="50%"
|
||||
size="md"
|
||||
styles={{
|
||||
icon: {
|
||||
color: 'white',
|
||||
fill: 'white',
|
||||
},
|
||||
}}
|
||||
variant="subtle"
|
||||
/>
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
@@ -6,10 +6,24 @@ import { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
||||
|
||||
import styles from './grid-carousel.module.css';
|
||||
|
||||
import { DataRow, MemoizedItemCard } from '/@/renderer/components/item-card/item-card';
|
||||
import { useContainerQuery } from '/@/renderer/hooks';
|
||||
import { ActionIcon } from '/@/shared/components/action-icon/action-icon';
|
||||
import { Group } from '/@/shared/components/group/group';
|
||||
import { TextTitle } from '/@/shared/components/text-title/text-title';
|
||||
import { LibraryItem } from '/@/shared/types/domain-types';
|
||||
|
||||
export const useGridCarouselContainerQuery = () => {
|
||||
return useContainerQuery({
|
||||
'2xl': 1280,
|
||||
'3xl': 1440,
|
||||
lg: 960,
|
||||
md: 720,
|
||||
sm: 520,
|
||||
xl: 1152,
|
||||
xs: 360,
|
||||
});
|
||||
};
|
||||
|
||||
interface Card {
|
||||
content: ReactNode;
|
||||
@@ -18,11 +32,16 @@ interface Card {
|
||||
|
||||
interface GridCarouselProps {
|
||||
cards: Card[];
|
||||
containerQuery?: ReturnType<typeof useGridCarouselContainerQuery>;
|
||||
enableRefresh?: boolean;
|
||||
hasNextPage?: boolean;
|
||||
isFetchingNextPage?: boolean;
|
||||
loadNextPage?: () => void;
|
||||
onNextPage: (page: number) => void;
|
||||
onPrevPage: (page: number) => void;
|
||||
onRefresh?: () => void;
|
||||
placeholderItemType?: LibraryItem;
|
||||
placeholderRows?: DataRow[];
|
||||
rowCount?: number;
|
||||
title?: ReactNode | string;
|
||||
}
|
||||
@@ -46,23 +65,22 @@ const pageVariants: Variants = {
|
||||
function BaseGridCarousel(props: GridCarouselProps) {
|
||||
const {
|
||||
cards,
|
||||
containerQuery: providedContainerQuery,
|
||||
enableRefresh = false,
|
||||
hasNextPage,
|
||||
isFetchingNextPage,
|
||||
loadNextPage,
|
||||
onNextPage,
|
||||
onPrevPage,
|
||||
onRefresh,
|
||||
placeholderItemType,
|
||||
placeholderRows,
|
||||
rowCount = 1,
|
||||
title,
|
||||
} = props;
|
||||
const { ref, ...cq } = useContainerQuery({
|
||||
'2xl': 1280,
|
||||
'3xl': 1440,
|
||||
lg: 960,
|
||||
md: 720,
|
||||
sm: 520,
|
||||
xl: 1152,
|
||||
xs: 360,
|
||||
});
|
||||
const defaultContainerQuery = useGridCarouselContainerQuery();
|
||||
const containerQuery = providedContainerQuery || defaultContainerQuery;
|
||||
const { ref, ...cq } = containerQuery;
|
||||
|
||||
const [currentPage, setCurrentPage] = useState({
|
||||
isNext: false,
|
||||
@@ -95,11 +113,48 @@ function BaseGridCarousel(props: GridCarouselProps) {
|
||||
});
|
||||
|
||||
const visibleCards = useMemo(() => {
|
||||
return cards.slice(
|
||||
currentPage.page * cardsToShow * rowCount,
|
||||
(currentPage.page + 1) * cardsToShow * rowCount,
|
||||
);
|
||||
}, [cards, currentPage, cardsToShow, rowCount]);
|
||||
const startIndex = currentPage.page * cardsToShow * rowCount;
|
||||
const endIndex = (currentPage.page + 1) * cardsToShow * rowCount;
|
||||
const slicedCards = cards.slice(startIndex, endIndex);
|
||||
const expectedCardCount = cardsToShow * rowCount;
|
||||
const missingCardCount = expectedCardCount - slicedCards.length;
|
||||
|
||||
// Add placeholder cards during loading state
|
||||
if (
|
||||
missingCardCount > 0 &&
|
||||
hasNextPage &&
|
||||
isFetchingNextPage &&
|
||||
placeholderItemType &&
|
||||
placeholderRows
|
||||
) {
|
||||
const placeholderCards: Card[] = Array.from(
|
||||
{ length: missingCardCount },
|
||||
(_, index) => ({
|
||||
content: (
|
||||
<MemoizedItemCard
|
||||
data={undefined}
|
||||
itemType={placeholderItemType}
|
||||
rows={placeholderRows}
|
||||
type="poster"
|
||||
/>
|
||||
),
|
||||
id: `placeholder-${startIndex + slicedCards.length + index}`,
|
||||
}),
|
||||
);
|
||||
return [...slicedCards, ...placeholderCards];
|
||||
}
|
||||
|
||||
return slicedCards;
|
||||
}, [
|
||||
currentPage.page,
|
||||
cardsToShow,
|
||||
rowCount,
|
||||
cards,
|
||||
hasNextPage,
|
||||
isFetchingNextPage,
|
||||
placeholderItemType,
|
||||
placeholderRows,
|
||||
]);
|
||||
|
||||
const shouldLoadNextPage = visibleCards.length < cardsToShow * rowCount;
|
||||
|
||||
@@ -150,51 +205,130 @@ function BaseGridCarousel(props: GridCarouselProps) {
|
||||
],
|
||||
);
|
||||
|
||||
const swipeCooldownRef = useRef(0);
|
||||
const dragStartTargetRef = useRef<HTMLElement | null>(null);
|
||||
const swipeCooldownMs = 300;
|
||||
const swipeThreshold = 50;
|
||||
const swipeVelocityThreshold = 500;
|
||||
|
||||
const handleDragStart = useCallback((event: MouseEvent | PointerEvent | TouchEvent) => {
|
||||
dragStartTargetRef.current = (event.target as HTMLElement) || null;
|
||||
}, []);
|
||||
|
||||
const handleDragEnd = useCallback(
|
||||
(
|
||||
_event: MouseEvent | PointerEvent | TouchEvent,
|
||||
info: { offset: { x: number }; velocity: { x: number } },
|
||||
) => {
|
||||
const startTarget = dragStartTargetRef.current;
|
||||
if (startTarget) {
|
||||
if (startTarget.closest('button, a, input, select, textarea, [role="button"]')) {
|
||||
dragStartTargetRef.current = null;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
const now = Date.now();
|
||||
const elapsed = now - swipeCooldownRef.current;
|
||||
|
||||
if (elapsed < swipeCooldownMs) {
|
||||
dragStartTargetRef.current = null;
|
||||
return;
|
||||
}
|
||||
|
||||
const { offset, velocity } = info;
|
||||
const absOffset = Math.abs(offset.x);
|
||||
const absVelocity = Math.abs(velocity.x);
|
||||
|
||||
if (absOffset > swipeThreshold || absVelocity > swipeVelocityThreshold) {
|
||||
swipeCooldownRef.current = now;
|
||||
|
||||
if (offset.x > 0 && !isPrevDisabled) {
|
||||
handlePrevPage();
|
||||
} else if (offset.x < 0 && !isNextDisabled) {
|
||||
handleNextPage();
|
||||
}
|
||||
}
|
||||
|
||||
dragStartTargetRef.current = null;
|
||||
},
|
||||
[handleNextPage, handlePrevPage, isNextDisabled, isPrevDisabled],
|
||||
);
|
||||
|
||||
return (
|
||||
<div className={styles.gridCarousel} ref={ref}>
|
||||
{cq.isCalculated && (
|
||||
<>
|
||||
<div className={styles.navigation}>
|
||||
<Group gap="xs" justify="space-between" w="100%">
|
||||
<Group gap="xs">
|
||||
{typeof title === 'string' ? (
|
||||
<motion.div
|
||||
className={styles.navigation}
|
||||
drag="x"
|
||||
dragConstraints={{ left: 0, right: 0 }}
|
||||
dragElastic={0}
|
||||
dragMomentum={false}
|
||||
dragPropagation={false}
|
||||
onDragEnd={handleDragEnd}
|
||||
onDragStart={handleDragStart}
|
||||
>
|
||||
{typeof title === 'string' ? (
|
||||
<Group gap="xs" justify="space-between" w="100%">
|
||||
<Group gap="xs">
|
||||
<TextTitle fw={700} isNoSelect order={3}>
|
||||
{title}
|
||||
</TextTitle>
|
||||
) : (
|
||||
title
|
||||
)}
|
||||
{onRefresh && (
|
||||
{enableRefresh && onRefresh && (
|
||||
<ActionIcon
|
||||
icon="refresh"
|
||||
iconProps={{ size: 'xs' }}
|
||||
onClick={onRefresh}
|
||||
size="xs"
|
||||
tooltip={{ label: 'Refresh' }}
|
||||
variant="transparent"
|
||||
/>
|
||||
)}
|
||||
</Group>
|
||||
<Group gap="xs" justify="end">
|
||||
<ActionIcon
|
||||
icon="refresh"
|
||||
iconProps={{ size: 'md' }}
|
||||
onClick={onRefresh}
|
||||
disabled={isPrevDisabled}
|
||||
icon="arrowLeftS"
|
||||
iconProps={{ size: 'lg' }}
|
||||
onClick={handlePrevPage}
|
||||
size="xs"
|
||||
tooltip={{ label: 'Refresh' }}
|
||||
variant="transparent"
|
||||
variant="subtle"
|
||||
/>
|
||||
)}
|
||||
<ActionIcon
|
||||
disabled={isNextDisabled}
|
||||
icon="arrowRightS"
|
||||
iconProps={{ size: 'lg' }}
|
||||
onClick={handleNextPage}
|
||||
size="xs"
|
||||
variant="subtle"
|
||||
/>
|
||||
</Group>
|
||||
</Group>
|
||||
<Group gap="xs" justify="end">
|
||||
<ActionIcon
|
||||
disabled={isPrevDisabled}
|
||||
icon="arrowLeftS"
|
||||
iconProps={{ size: 'lg' }}
|
||||
onClick={handlePrevPage}
|
||||
size="xs"
|
||||
variant="subtle"
|
||||
/>
|
||||
<ActionIcon
|
||||
disabled={isNextDisabled}
|
||||
icon="arrowRightS"
|
||||
iconProps={{ size: 'lg' }}
|
||||
onClick={handleNextPage}
|
||||
size="xs"
|
||||
variant="subtle"
|
||||
/>
|
||||
</Group>
|
||||
</Group>
|
||||
</div>
|
||||
) : (
|
||||
<div className={styles.customTitleContainer}>
|
||||
<div className={styles.customTitleContent}>{title}</div>
|
||||
<Group gap="xs" justify="end">
|
||||
<ActionIcon
|
||||
disabled={isPrevDisabled}
|
||||
icon="arrowLeftS"
|
||||
iconProps={{ size: 'lg' }}
|
||||
onClick={handlePrevPage}
|
||||
size="xs"
|
||||
variant="subtle"
|
||||
/>
|
||||
<ActionIcon
|
||||
disabled={isNextDisabled}
|
||||
icon="arrowRightS"
|
||||
iconProps={{ size: 'lg' }}
|
||||
onClick={handleNextPage}
|
||||
size="xs"
|
||||
variant="subtle"
|
||||
/>
|
||||
</Group>
|
||||
</div>
|
||||
)}
|
||||
</motion.div>
|
||||
<AnimatePresence custom={currentPage} initial={false} mode="wait">
|
||||
<motion.div
|
||||
animate="animate"
|
||||
@@ -227,6 +361,74 @@ export const GridCarousel = memo(BaseGridCarousel);
|
||||
|
||||
GridCarousel.displayName = 'GridCarousel';
|
||||
|
||||
interface GridCarouselSkeletonProps {
|
||||
containerQuery?: ReturnType<typeof useGridCarouselContainerQuery>;
|
||||
enableRefresh?: boolean;
|
||||
placeholderItemType: LibraryItem;
|
||||
placeholderRows: DataRow[];
|
||||
rowCount?: number;
|
||||
title?: ReactNode | string;
|
||||
}
|
||||
|
||||
const GridCarouselSkeleton = (props: GridCarouselSkeletonProps) => {
|
||||
const {
|
||||
containerQuery: providedContainerQuery,
|
||||
enableRefresh = false,
|
||||
placeholderItemType,
|
||||
placeholderRows,
|
||||
rowCount = 1,
|
||||
title,
|
||||
} = props;
|
||||
|
||||
const { ...cq } = providedContainerQuery;
|
||||
|
||||
const cardsToShow = cq.isCalculated
|
||||
? getCardsToShow({
|
||||
isLargerThan2xl: cq.is2xl,
|
||||
isLargerThan3xl: cq.is3xl,
|
||||
isLargerThanLg: cq.isLg,
|
||||
isLargerThanMd: cq.isMd,
|
||||
isLargerThanSm: cq.isSm,
|
||||
isLargerThanXl: cq.isXl,
|
||||
})
|
||||
: 6;
|
||||
|
||||
const placeholderCards = useMemo(() => {
|
||||
const cardCount = cardsToShow * rowCount;
|
||||
return Array.from({ length: cardCount }, (_, index) => ({
|
||||
content: (
|
||||
<MemoizedItemCard
|
||||
data={undefined}
|
||||
itemType={placeholderItemType}
|
||||
rows={placeholderRows}
|
||||
type="poster"
|
||||
/>
|
||||
),
|
||||
id: `skeleton-${index}`,
|
||||
}));
|
||||
}, [cardsToShow, rowCount, placeholderItemType, placeholderRows]);
|
||||
|
||||
return (
|
||||
<GridCarousel
|
||||
cards={placeholderCards}
|
||||
containerQuery={providedContainerQuery}
|
||||
enableRefresh={enableRefresh}
|
||||
hasNextPage={false}
|
||||
isFetchingNextPage={false}
|
||||
onNextPage={() => {}}
|
||||
onPrevPage={() => {}}
|
||||
placeholderItemType={placeholderItemType}
|
||||
placeholderRows={placeholderRows}
|
||||
rowCount={rowCount}
|
||||
title={title}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
export const GridCarouselSkeletonFallback = memo(GridCarouselSkeleton);
|
||||
|
||||
GridCarouselSkeletonFallback.displayName = 'GridCarouselSkeletonFallback';
|
||||
|
||||
function getCardsToShow(breakpoints: {
|
||||
isLargerThan2xl: boolean;
|
||||
isLargerThan3xl: boolean;
|
||||
|
||||
@@ -10,8 +10,30 @@
|
||||
|
||||
.navigation {
|
||||
display: flex;
|
||||
flex-shrink: 0;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
width: 100%;
|
||||
touch-action: pan-x;
|
||||
cursor: grab;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.navigation:active {
|
||||
cursor: grabbing;
|
||||
}
|
||||
|
||||
.custom-title-container {
|
||||
display: flex;
|
||||
gap: var(--theme-spacing-sm);
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.custom-title-content {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
.grid {
|
||||
|
||||
@@ -19,6 +19,7 @@ import {
|
||||
Album,
|
||||
AlbumArtist,
|
||||
Artist,
|
||||
Genre,
|
||||
LibraryItem,
|
||||
Playlist,
|
||||
ServerType,
|
||||
@@ -30,8 +31,9 @@ interface ItemCardControlsProps {
|
||||
controls?: ItemControls;
|
||||
enableExpansion?: boolean;
|
||||
internalState?: ItemListStateActions;
|
||||
item: Album | AlbumArtist | Artist | Playlist | Song | undefined;
|
||||
item: Album | AlbumArtist | Artist | Genre | Playlist | Song | undefined;
|
||||
itemType: LibraryItem;
|
||||
showRating: boolean;
|
||||
type?: 'compact' | 'default' | 'poster';
|
||||
}
|
||||
|
||||
@@ -59,7 +61,7 @@ const containerProps = {
|
||||
const createPlayHandler =
|
||||
(
|
||||
controls: ItemControls | undefined,
|
||||
item: Album | AlbumArtist | Artist | Playlist | Song | undefined,
|
||||
item: Album | AlbumArtist | Artist | Genre | Playlist | Song | undefined,
|
||||
internalState: ItemListStateActions | undefined,
|
||||
itemType: LibraryItem,
|
||||
playType: Play,
|
||||
@@ -72,6 +74,29 @@ const createPlayHandler =
|
||||
return;
|
||||
}
|
||||
|
||||
const isSongItem =
|
||||
itemType === LibraryItem.SONG ||
|
||||
itemType === LibraryItem.PLAYLIST_SONG ||
|
||||
(item as { _itemType: LibraryItem })._itemType === LibraryItem.SONG;
|
||||
|
||||
if (isSongItem && controls?.onDoubleClick && internalState) {
|
||||
const rowId = internalState.extractRowId(item);
|
||||
|
||||
if (rowId) {
|
||||
const index = internalState.findItemIndex(rowId);
|
||||
return controls.onDoubleClick({
|
||||
event: null,
|
||||
index,
|
||||
internalState,
|
||||
item,
|
||||
itemType,
|
||||
meta: {
|
||||
playType,
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
controls?.onPlay?.({
|
||||
event: e,
|
||||
internalState,
|
||||
@@ -84,7 +109,7 @@ const createPlayHandler =
|
||||
const createFavoriteHandler =
|
||||
(
|
||||
controls: ItemControls | undefined,
|
||||
item: Album | AlbumArtist | Artist | Playlist | Song | undefined,
|
||||
item: Album | AlbumArtist | Artist | Genre | Playlist | Song | undefined,
|
||||
internalState: ItemListStateActions | undefined,
|
||||
itemType: LibraryItem,
|
||||
) =>
|
||||
@@ -109,7 +134,7 @@ const createFavoriteHandler =
|
||||
const createRatingChangeHandler =
|
||||
(
|
||||
controls: ItemControls | undefined,
|
||||
item: Album | AlbumArtist | Artist | Playlist | Song | undefined,
|
||||
item: Album | AlbumArtist | Artist | Genre | Playlist | Song | undefined,
|
||||
internalState: ItemListStateActions | undefined,
|
||||
itemType: LibraryItem,
|
||||
) =>
|
||||
@@ -141,7 +166,7 @@ const moreDoubleClickHandler = (e: MouseEvent<HTMLButtonElement>) => {
|
||||
const createMoreHandler =
|
||||
(
|
||||
controls: ItemControls | undefined,
|
||||
item: Album | AlbumArtist | Artist | Playlist | Song | undefined,
|
||||
item: Album | AlbumArtist | Artist | Genre | Playlist | Song | undefined,
|
||||
internalState: ItemListStateActions | undefined,
|
||||
itemType: LibraryItem,
|
||||
) =>
|
||||
@@ -159,7 +184,7 @@ const createMoreHandler =
|
||||
const createExpandHandler =
|
||||
(
|
||||
controls: ItemControls | undefined,
|
||||
item: Album | AlbumArtist | Artist | Playlist | Song | undefined,
|
||||
item: Album | AlbumArtist | Artist | Genre | Playlist | Song | undefined,
|
||||
internalState: ItemListStateActions | undefined,
|
||||
itemType: LibraryItem,
|
||||
) =>
|
||||
@@ -180,6 +205,7 @@ export const ItemCardControls = ({
|
||||
internalState,
|
||||
item,
|
||||
itemType,
|
||||
showRating,
|
||||
type = 'default',
|
||||
}: ItemCardControlsProps) => {
|
||||
const playNowHandler = useMemo(
|
||||
@@ -267,6 +293,7 @@ export const ItemCardControls = ({
|
||||
<FavoriteButton isFavorite={isFavorite} onClick={favoriteHandler} />
|
||||
)}
|
||||
{controls?.onRating &&
|
||||
showRating &&
|
||||
(item?._serverType === ServerType.NAVIDROME ||
|
||||
item?._serverType === ServerType.SUBSONIC) && (
|
||||
<RatingButton
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
padding: var(--theme-spacing-md);
|
||||
overflow: hidden;
|
||||
user-select: none;
|
||||
@@ -27,6 +28,7 @@
|
||||
overflow: hidden;
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
border-radius: var(--theme-radius-md);
|
||||
|
||||
&::before {
|
||||
position: absolute;
|
||||
@@ -34,6 +36,7 @@
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
pointer-events: none;
|
||||
content: '';
|
||||
background-color: rgb(0 0 0);
|
||||
opacity: 0;
|
||||
@@ -111,6 +114,29 @@
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
.genre-placeholder {
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
padding: var(--theme-spacing-sm);
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.genre-placeholder-text {
|
||||
display: -webkit-box;
|
||||
width: 100%;
|
||||
min-width: 0;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
-webkit-line-clamp: 2;
|
||||
font-weight: 600;
|
||||
line-height: 1.2;
|
||||
-webkit-box-orient: vertical;
|
||||
}
|
||||
|
||||
.detail-container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
@@ -177,10 +203,10 @@
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
gap: 0;
|
||||
width: 100%;
|
||||
padding: var(--theme-spacing-xs);
|
||||
text-shadow: 0 1px 2px rgb(0 0 0 / 80%);
|
||||
background-color: rgb(0 0 0 / 50%);
|
||||
background-color: alpha(var(--theme-colors-background), 0.5);
|
||||
backdrop-filter: blur(2px);
|
||||
transform: translateY(0);
|
||||
transition:
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
import clsx from 'clsx';
|
||||
import formatDuration from 'format-duration';
|
||||
import { AnimatePresence } from 'motion/react';
|
||||
import { Fragment, memo, ReactNode, useState } from 'react';
|
||||
import { Fragment, memo, ReactNode, useCallback, useMemo, useState } from 'react';
|
||||
import { generatePath, Link } from 'react-router';
|
||||
|
||||
import styles from './item-card.module.css';
|
||||
|
||||
import i18n from '/@/i18n/i18n';
|
||||
import { ItemCardControls } from '/@/renderer/components/item-card/item-card-controls';
|
||||
import { ItemImage } from '/@/renderer/components/item-image/item-image';
|
||||
import { getDraggedItems } from '/@/renderer/components/item-list/helpers/get-dragged-items';
|
||||
import { getTitlePath } from '/@/renderer/components/item-list/helpers/get-title-path';
|
||||
import {
|
||||
@@ -15,10 +16,20 @@ import {
|
||||
useItemSelectionState,
|
||||
} from '/@/renderer/components/item-list/helpers/item-list-state';
|
||||
import { ItemControls } from '/@/renderer/components/item-list/types';
|
||||
import { JoinedArtists } from '/@/renderer/features/albums/components/joined-artists';
|
||||
import { useDragDrop } from '/@/renderer/hooks/use-drag-drop';
|
||||
import { AppRoute } from '/@/renderer/router/routes';
|
||||
import { formatDateAbsolute, formatDateRelative, formatRating } from '/@/renderer/utils/format';
|
||||
import { Image } from '/@/shared/components/image/image';
|
||||
import { useShowRatings } from '/@/renderer/store';
|
||||
import {
|
||||
formatDateAbsolute,
|
||||
formatDateAbsoluteUTC,
|
||||
formatDateRelative,
|
||||
formatDurationString,
|
||||
formatRating,
|
||||
} from '/@/renderer/utils/format';
|
||||
import { SEPARATOR_STRING } from '/@/shared/api/utils';
|
||||
import { Group } from '/@/shared/components/group/group';
|
||||
import { Icon } from '/@/shared/components/icon/icon';
|
||||
import { Separator } from '/@/shared/components/separator/separator';
|
||||
import { Skeleton } from '/@/shared/components/skeleton/skeleton';
|
||||
import { Text } from '/@/shared/components/text/text';
|
||||
@@ -27,25 +38,31 @@ import {
|
||||
Album,
|
||||
AlbumArtist,
|
||||
Artist,
|
||||
Genre,
|
||||
LibraryItem,
|
||||
Playlist,
|
||||
Song,
|
||||
} from '/@/shared/types/domain-types';
|
||||
import { DragOperation, DragTarget } from '/@/shared/types/drag-and-drop';
|
||||
import { stringToColor } from '/@/shared/utils/string-to-color';
|
||||
|
||||
export type DataRow = {
|
||||
align?: 'center' | 'end' | 'start';
|
||||
format: (data: Album | AlbumArtist | Artist | Playlist | Song) => null | ReactNode | string;
|
||||
format: (
|
||||
data: Album | AlbumArtist | Artist | Genre | Playlist | Song,
|
||||
) => null | ReactNode | string;
|
||||
id: string;
|
||||
isMuted?: boolean;
|
||||
};
|
||||
|
||||
export interface ItemCardProps {
|
||||
controls?: ItemControls;
|
||||
data: Album | AlbumArtist | Artist | Playlist | Song | undefined;
|
||||
data: Album | AlbumArtist | Artist | Genre | Playlist | Song | undefined;
|
||||
enableDrag?: boolean;
|
||||
enableExpansion?: boolean;
|
||||
enableMultiSelect?: boolean;
|
||||
enableNavigation?: boolean;
|
||||
imageAsLink?: boolean;
|
||||
internalState?: ItemListStateActions;
|
||||
isRound?: boolean;
|
||||
itemType: LibraryItem;
|
||||
@@ -59,7 +76,9 @@ export const ItemCard = ({
|
||||
data,
|
||||
enableDrag,
|
||||
enableExpansion,
|
||||
enableMultiSelect,
|
||||
enableNavigation = true,
|
||||
imageAsLink,
|
||||
internalState,
|
||||
isRound,
|
||||
itemType,
|
||||
@@ -67,56 +86,65 @@ export const ItemCard = ({
|
||||
type = 'poster',
|
||||
withControls,
|
||||
}: ItemCardProps) => {
|
||||
const showRatings = useShowRatings();
|
||||
const imageUrl = getImageUrl(data);
|
||||
const rows = providedRows || [];
|
||||
|
||||
switch (type) {
|
||||
case 'compact':
|
||||
return (
|
||||
<CompactItemCard
|
||||
<MemoizedCompactItemCard
|
||||
controls={controls}
|
||||
data={data}
|
||||
enableDrag={enableDrag}
|
||||
enableExpansion={enableExpansion}
|
||||
enableMultiSelect={enableMultiSelect}
|
||||
enableNavigation={enableNavigation}
|
||||
imageAsLink={imageAsLink}
|
||||
imageUrl={imageUrl}
|
||||
internalState={internalState}
|
||||
isRound={isRound}
|
||||
itemType={itemType}
|
||||
rows={rows}
|
||||
showRating={showRatings}
|
||||
withControls={withControls}
|
||||
/>
|
||||
);
|
||||
case 'poster':
|
||||
return (
|
||||
<PosterItemCard
|
||||
<MemoizedPosterItemCard
|
||||
controls={controls}
|
||||
data={data}
|
||||
enableDrag={enableDrag}
|
||||
enableExpansion={enableExpansion}
|
||||
enableMultiSelect={enableMultiSelect}
|
||||
enableNavigation={enableNavigation}
|
||||
imageAsLink={imageAsLink}
|
||||
imageUrl={imageUrl}
|
||||
internalState={internalState}
|
||||
isRound={isRound}
|
||||
itemType={itemType}
|
||||
rows={rows}
|
||||
showRating={showRatings}
|
||||
withControls={withControls}
|
||||
/>
|
||||
);
|
||||
case 'default':
|
||||
default:
|
||||
return (
|
||||
<DefaultItemCard
|
||||
<MemoizedDefaultItemCard
|
||||
controls={controls}
|
||||
data={data}
|
||||
enableDrag={enableDrag}
|
||||
enableExpansion={enableExpansion}
|
||||
enableNavigation={enableNavigation}
|
||||
imageAsLink={imageAsLink}
|
||||
imageUrl={imageUrl}
|
||||
internalState={internalState}
|
||||
isRound={isRound}
|
||||
itemType={itemType}
|
||||
rows={rows}
|
||||
showRating={showRatings}
|
||||
withControls={withControls}
|
||||
/>
|
||||
);
|
||||
@@ -127,21 +155,26 @@ export interface ItemCardDerivativeProps extends Omit<ItemCardProps, 'type'> {
|
||||
controls?: ItemControls;
|
||||
enableExpansion?: boolean;
|
||||
enableNavigation?: boolean;
|
||||
imageAsLink?: boolean;
|
||||
imageUrl: string | undefined;
|
||||
internalState?: ItemListStateActions;
|
||||
rows: DataRow[];
|
||||
showRating: boolean;
|
||||
}
|
||||
|
||||
const CompactItemCard = ({
|
||||
controls,
|
||||
data,
|
||||
enableDrag,
|
||||
enableExpansion,
|
||||
enableMultiSelect,
|
||||
enableNavigation,
|
||||
imageUrl,
|
||||
imageAsLink,
|
||||
internalState,
|
||||
isRound,
|
||||
itemType,
|
||||
rows,
|
||||
showRating,
|
||||
withControls,
|
||||
}: ItemCardDerivativeProps) => {
|
||||
const [showControls, setShowControls] = useState(false);
|
||||
@@ -151,6 +184,71 @@ const CompactItemCard = ({
|
||||
: undefined;
|
||||
const isSelected = useItemSelectionState(internalState, itemRowId || undefined);
|
||||
|
||||
const getId = useCallback(() => {
|
||||
if (!data) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const draggedItems = getDraggedItems(data, internalState, enableMultiSelect !== false);
|
||||
return draggedItems.map((item) => item.id);
|
||||
}, [data, internalState, enableMultiSelect]);
|
||||
|
||||
const getItem = useCallback(() => {
|
||||
if (!data) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const draggedItems = getDraggedItems(data, internalState, enableMultiSelect !== false);
|
||||
return draggedItems;
|
||||
}, [data, internalState, enableMultiSelect]);
|
||||
|
||||
const onDragStart = useCallback(() => {
|
||||
if (!data) {
|
||||
return;
|
||||
}
|
||||
|
||||
const draggedItems = getDraggedItems(data, internalState, enableMultiSelect !== false);
|
||||
if (internalState) {
|
||||
internalState.setDragging(draggedItems);
|
||||
}
|
||||
}, [data, internalState, enableMultiSelect]);
|
||||
|
||||
const onDrop = useCallback(() => {
|
||||
if (internalState) {
|
||||
internalState.setDragging([]);
|
||||
}
|
||||
}, [internalState]);
|
||||
|
||||
const dragOperation = useMemo(
|
||||
() =>
|
||||
itemType === LibraryItem.QUEUE_SONG
|
||||
? [DragOperation.REORDER, DragOperation.ADD]
|
||||
: [DragOperation.ADD],
|
||||
[itemType],
|
||||
);
|
||||
|
||||
const drag = useMemo(
|
||||
() => ({
|
||||
getId,
|
||||
getItem,
|
||||
itemType,
|
||||
onDragStart,
|
||||
onDrop,
|
||||
operation: dragOperation,
|
||||
target: DragTarget.ALBUM,
|
||||
}),
|
||||
[getId, getItem, itemType, onDragStart, onDrop, dragOperation],
|
||||
);
|
||||
|
||||
const { isDragging: isDraggingLocal, ref } = useDragDrop<HTMLDivElement>({
|
||||
drag,
|
||||
isEnabled: !!enableDrag && !!data,
|
||||
});
|
||||
|
||||
const itemId = data && internalState ? data.id : undefined;
|
||||
const isDraggingState = useItemDraggingState(internalState, itemId);
|
||||
const isDragging = isDraggingState || isDraggingLocal;
|
||||
|
||||
const handleClick = useDoubleClick({
|
||||
onDoubleClick: (e: React.MouseEvent<HTMLDivElement>) => {
|
||||
if (!data || !controls || !internalState) {
|
||||
@@ -239,7 +337,7 @@ const CompactItemCard = ({
|
||||
typeof (data as { userRating: null | number }).userRating === 'number'
|
||||
? (data as { userRating: null | number }).userRating
|
||||
: null;
|
||||
const hasRating = userRating !== null && userRating > 0;
|
||||
const hasRating = showRating && userRating !== null && userRating > 0;
|
||||
|
||||
const imageContainerClassName = clsx(styles.imageContainer, {
|
||||
[styles.isRound]: isRound,
|
||||
@@ -247,21 +345,39 @@ const CompactItemCard = ({
|
||||
|
||||
const imageContainerContent = (
|
||||
<>
|
||||
<Image
|
||||
className={clsx(styles.image, {
|
||||
[styles.isRound]: isRound,
|
||||
})}
|
||||
src={imageUrl}
|
||||
/>
|
||||
{itemType === LibraryItem.GENRE &&
|
||||
data &&
|
||||
'name' in data &&
|
||||
typeof (data as Genre).name === 'string' ? (
|
||||
<GenreImagePlaceholder
|
||||
className={clsx(styles.image, styles.genrePlaceholder, {
|
||||
[styles.isRound]: isRound,
|
||||
})}
|
||||
name={(data as Genre).name}
|
||||
/>
|
||||
) : (
|
||||
<ItemImage
|
||||
className={clsx(styles.image, {
|
||||
[styles.isRound]: isRound,
|
||||
})}
|
||||
enableDebounce={false}
|
||||
id={data?.imageId}
|
||||
itemType={itemType}
|
||||
src={(data as Album | AlbumArtist | Playlist | Song)?.imageUrl}
|
||||
type="itemCard"
|
||||
/>
|
||||
)}
|
||||
{isFavorite && <div className={styles.favoriteBadge} />}
|
||||
{hasRating && <div className={styles.ratingBadge}>{userRating}</div>}
|
||||
<AnimatePresence>
|
||||
{withControls && showControls && (
|
||||
{withControls && showControls && data && (
|
||||
<ItemCardControls
|
||||
controls={controls}
|
||||
enableExpansion={enableExpansion}
|
||||
internalState={internalState}
|
||||
item={data}
|
||||
itemType={itemType}
|
||||
showRating={showRating}
|
||||
type="compact"
|
||||
/>
|
||||
)}
|
||||
@@ -288,10 +404,12 @@ const CompactItemCard = ({
|
||||
return (
|
||||
<div
|
||||
className={clsx(styles.container, styles.compact, {
|
||||
[styles.dragging]: isDragging,
|
||||
[styles.selected]: isSelected,
|
||||
})}
|
||||
ref={ref}
|
||||
>
|
||||
{enableNavigation && navigationPath && !internalState ? (
|
||||
{enableNavigation && navigationPath && (imageAsLink ?? !internalState) ? (
|
||||
<Link
|
||||
className={imageContainerClassName}
|
||||
draggable={false}
|
||||
@@ -331,14 +449,15 @@ const CompactItemCard = ({
|
||||
row !== null && row !== undefined,
|
||||
)
|
||||
.map((row, index) => (
|
||||
<div
|
||||
<Text
|
||||
className={clsx(styles.row, {
|
||||
[styles.muted]: index > 0,
|
||||
})}
|
||||
key={row.id}
|
||||
size={index > 0 ? 'sm' : 'md'}
|
||||
>
|
||||
|
||||
</div>
|
||||
</Text>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
@@ -351,11 +470,12 @@ const DefaultItemCard = ({
|
||||
data,
|
||||
enableExpansion,
|
||||
enableNavigation,
|
||||
imageUrl,
|
||||
imageAsLink,
|
||||
internalState,
|
||||
isRound,
|
||||
itemType,
|
||||
rows,
|
||||
showRating,
|
||||
withControls,
|
||||
}: ItemCardDerivativeProps) => {
|
||||
const [showControls, setShowControls] = useState(false);
|
||||
@@ -457,14 +577,30 @@ const DefaultItemCard = ({
|
||||
typeof (data as { userRating: null | number }).userRating === 'number'
|
||||
? (data as { userRating: null | number }).userRating
|
||||
: null;
|
||||
const hasRating = userRating !== null && userRating > 0;
|
||||
const hasRating = showRating && userRating !== null && userRating > 0;
|
||||
|
||||
const imageContainerContent = (
|
||||
<>
|
||||
<Image
|
||||
className={clsx(styles.image, { [styles.isRound]: isRound })}
|
||||
src={imageUrl}
|
||||
/>
|
||||
{itemType === LibraryItem.GENRE &&
|
||||
data &&
|
||||
'name' in data &&
|
||||
typeof (data as Genre).name === 'string' ? (
|
||||
<GenreImagePlaceholder
|
||||
className={clsx(styles.image, styles.genrePlaceholder, {
|
||||
[styles.isRound]: isRound,
|
||||
})}
|
||||
name={(data as Genre).name}
|
||||
/>
|
||||
) : (
|
||||
<ItemImage
|
||||
className={clsx(styles.image, { [styles.isRound]: isRound })}
|
||||
enableDebounce={false}
|
||||
id={data?.imageId}
|
||||
itemType={itemType}
|
||||
src={(data as Album | AlbumArtist | Playlist | Song)?.imageUrl}
|
||||
type="itemCard"
|
||||
/>
|
||||
)}
|
||||
{isFavorite && <div className={styles.favoriteBadge} />}
|
||||
{hasRating && <div className={styles.ratingBadge}>{userRating}</div>}
|
||||
<AnimatePresence>
|
||||
@@ -474,6 +610,7 @@ const DefaultItemCard = ({
|
||||
enableExpansion={enableExpansion}
|
||||
item={data}
|
||||
itemType={itemType}
|
||||
showRating={showRating}
|
||||
type="default"
|
||||
/>
|
||||
)}
|
||||
@@ -487,7 +624,7 @@ const DefaultItemCard = ({
|
||||
[styles.selected]: isSelected,
|
||||
})}
|
||||
>
|
||||
{enableNavigation && navigationPath && !internalState ? (
|
||||
{enableNavigation && navigationPath && (imageAsLink ?? !internalState) ? (
|
||||
<Link
|
||||
className={imageContainerClassName}
|
||||
draggable={false}
|
||||
@@ -543,14 +680,15 @@ const DefaultItemCard = ({
|
||||
(row): row is NonNullable<typeof row> => row !== null && row !== undefined,
|
||||
)
|
||||
.map((row, index) => (
|
||||
<div
|
||||
<Text
|
||||
className={clsx(styles.row, {
|
||||
[styles.muted]: index > 0,
|
||||
})}
|
||||
key={row.id}
|
||||
size={index > 0 ? 'sm' : 'md'}
|
||||
>
|
||||
|
||||
</div>
|
||||
</Text>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
@@ -562,12 +700,14 @@ const PosterItemCard = ({
|
||||
data,
|
||||
enableDrag,
|
||||
enableExpansion,
|
||||
enableMultiSelect,
|
||||
enableNavigation,
|
||||
imageUrl,
|
||||
imageAsLink,
|
||||
internalState,
|
||||
isRound,
|
||||
itemType,
|
||||
rows,
|
||||
showRating,
|
||||
withControls,
|
||||
}: ItemCardDerivativeProps) => {
|
||||
const [showControls, setShowControls] = useState(false);
|
||||
@@ -577,46 +717,64 @@ const PosterItemCard = ({
|
||||
: undefined;
|
||||
const isSelected = useItemSelectionState(internalState, itemRowId || undefined);
|
||||
|
||||
const { isDragging: isDraggingLocal, ref } = useDragDrop<HTMLDivElement>({
|
||||
drag: {
|
||||
getId: () => {
|
||||
if (!data) {
|
||||
return [];
|
||||
}
|
||||
const getId = useCallback(() => {
|
||||
if (!data) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const draggedItems = getDraggedItems(data, internalState);
|
||||
return draggedItems.map((item) => item.id);
|
||||
},
|
||||
getItem: () => {
|
||||
if (!data) {
|
||||
return [];
|
||||
}
|
||||
const draggedItems = getDraggedItems(data, internalState, enableMultiSelect !== false);
|
||||
return draggedItems.map((item) => item.id);
|
||||
}, [data, internalState, enableMultiSelect]);
|
||||
|
||||
const draggedItems = getDraggedItems(data, internalState);
|
||||
return draggedItems;
|
||||
},
|
||||
const getItem = useCallback(() => {
|
||||
if (!data) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const draggedItems = getDraggedItems(data, internalState, enableMultiSelect !== false);
|
||||
return draggedItems;
|
||||
}, [data, internalState, enableMultiSelect]);
|
||||
|
||||
const onDragStart = useCallback(() => {
|
||||
if (!data) {
|
||||
return;
|
||||
}
|
||||
|
||||
const draggedItems = getDraggedItems(data, internalState, enableMultiSelect !== false);
|
||||
if (internalState) {
|
||||
internalState.setDragging(draggedItems);
|
||||
}
|
||||
}, [data, internalState, enableMultiSelect]);
|
||||
|
||||
const onDrop = useCallback(() => {
|
||||
if (internalState) {
|
||||
internalState.setDragging([]);
|
||||
}
|
||||
}, [internalState]);
|
||||
|
||||
const dragOperation = useMemo(
|
||||
() =>
|
||||
itemType === LibraryItem.QUEUE_SONG
|
||||
? [DragOperation.REORDER, DragOperation.ADD]
|
||||
: [DragOperation.ADD],
|
||||
[itemType],
|
||||
);
|
||||
|
||||
const drag = useMemo(
|
||||
() => ({
|
||||
getId,
|
||||
getItem,
|
||||
itemType,
|
||||
onDragStart: () => {
|
||||
if (!data) {
|
||||
return;
|
||||
}
|
||||
|
||||
const draggedItems = getDraggedItems(data, internalState);
|
||||
if (internalState) {
|
||||
internalState.setDragging(draggedItems);
|
||||
}
|
||||
},
|
||||
onDrop: () => {
|
||||
if (internalState) {
|
||||
internalState.setDragging([]);
|
||||
}
|
||||
},
|
||||
operation:
|
||||
itemType === LibraryItem.QUEUE_SONG
|
||||
? [DragOperation.REORDER, DragOperation.ADD]
|
||||
: [DragOperation.ADD],
|
||||
onDragStart,
|
||||
onDrop,
|
||||
operation: dragOperation,
|
||||
target: DragTarget.ALBUM,
|
||||
},
|
||||
}),
|
||||
[getId, getItem, itemType, onDragStart, onDrop, dragOperation],
|
||||
);
|
||||
|
||||
const { isDragging: isDraggingLocal, ref } = useDragDrop<HTMLDivElement>({
|
||||
drag,
|
||||
isEnabled: !!enableDrag && !!data,
|
||||
});
|
||||
|
||||
@@ -716,14 +874,30 @@ const PosterItemCard = ({
|
||||
typeof (data as { userRating: null | number }).userRating === 'number'
|
||||
? (data as { userRating: null | number }).userRating
|
||||
: null;
|
||||
const hasRating = userRating !== null && userRating > 0;
|
||||
const hasRating = showRating && userRating !== null && userRating > 0;
|
||||
|
||||
const imageContainerContent = (
|
||||
<>
|
||||
<Image
|
||||
className={clsx(styles.image, { [styles.isRound]: isRound })}
|
||||
src={imageUrl}
|
||||
/>
|
||||
{itemType === LibraryItem.GENRE &&
|
||||
data &&
|
||||
'name' in data &&
|
||||
typeof (data as Genre).name === 'string' ? (
|
||||
<GenreImagePlaceholder
|
||||
className={clsx(styles.image, styles.genrePlaceholder, {
|
||||
[styles.isRound]: isRound,
|
||||
})}
|
||||
name={(data as Genre).name}
|
||||
/>
|
||||
) : (
|
||||
<ItemImage
|
||||
className={clsx(styles.image, { [styles.isRound]: isRound })}
|
||||
enableDebounce={false}
|
||||
id={(data as { imageId: string })?.imageId}
|
||||
itemType={itemType}
|
||||
src={(data as { imageUrl: string })?.imageUrl}
|
||||
type="itemCard"
|
||||
/>
|
||||
)}
|
||||
{isFavorite && <div className={styles.favoriteBadge} />}
|
||||
{hasRating && <div className={styles.ratingBadge}>{userRating}</div>}
|
||||
<AnimatePresence>
|
||||
@@ -734,6 +908,7 @@ const PosterItemCard = ({
|
||||
internalState={internalState}
|
||||
item={data}
|
||||
itemType={itemType}
|
||||
showRating={showRating}
|
||||
type="poster"
|
||||
/>
|
||||
)}
|
||||
@@ -749,7 +924,7 @@ const PosterItemCard = ({
|
||||
})}
|
||||
ref={ref}
|
||||
>
|
||||
{enableNavigation && navigationPath && !internalState ? (
|
||||
{enableNavigation && navigationPath && (imageAsLink ?? !internalState) ? (
|
||||
<Link
|
||||
className={imageContainerClassName}
|
||||
draggable={false}
|
||||
@@ -807,21 +982,31 @@ const PosterItemCard = ({
|
||||
(row): row is NonNullable<typeof row> => row !== null && row !== undefined,
|
||||
)
|
||||
.map((row, index) => (
|
||||
<div
|
||||
<Text
|
||||
className={clsx(styles.row, {
|
||||
[styles.muted]: index > 0,
|
||||
})}
|
||||
key={row.id}
|
||||
size={index > 0 ? 'sm' : 'md'}
|
||||
>
|
||||
|
||||
</div>
|
||||
</Text>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export const getDataRows = (): DataRow[] => {
|
||||
const MemoizedPosterItemCard = memo(PosterItemCard);
|
||||
MemoizedPosterItemCard.displayName = 'MemoizedPosterItemCard';
|
||||
|
||||
const MemoizedCompactItemCard = memo(CompactItemCard);
|
||||
MemoizedCompactItemCard.displayName = 'MemoizedCompactItemCard';
|
||||
|
||||
const MemoizedDefaultItemCard = memo(DefaultItemCard);
|
||||
MemoizedDefaultItemCard.displayName = 'MemoizedDefaultItemCard';
|
||||
|
||||
export const getDataRows = (type?: 'compact' | 'default' | 'poster'): DataRow[] => {
|
||||
return [
|
||||
{
|
||||
format: (data) => {
|
||||
@@ -854,6 +1039,17 @@ export const getDataRows = (): DataRow[] => {
|
||||
{data.name}
|
||||
</Link>
|
||||
);
|
||||
case LibraryItem.GENRE:
|
||||
return (
|
||||
<Link
|
||||
state={{ item: data }}
|
||||
to={generatePath(AppRoute.LIBRARY_GENRES_DETAIL, {
|
||||
genreId: data.id,
|
||||
})}
|
||||
>
|
||||
{data.name}
|
||||
</Link>
|
||||
);
|
||||
case LibraryItem.PLAYLIST:
|
||||
return (
|
||||
<Link
|
||||
@@ -879,21 +1075,18 @@ export const getDataRows = (): DataRow[] => {
|
||||
{
|
||||
format: (data) => {
|
||||
if ('albumArtists' in data && Array.isArray(data.albumArtists)) {
|
||||
return (data as Album | Song).albumArtists.map((artist, index) => (
|
||||
<Fragment key={artist.id}>
|
||||
<Link
|
||||
state={{ item: artist }}
|
||||
to={generatePath(AppRoute.LIBRARY_ALBUM_ARTISTS_DETAIL, {
|
||||
albumArtistId: artist.id,
|
||||
})}
|
||||
>
|
||||
{artist.name}
|
||||
</Link>
|
||||
{index < (data as Album | Song).albumArtists.length - 1 && (
|
||||
<Separator />
|
||||
)}
|
||||
</Fragment>
|
||||
));
|
||||
return (
|
||||
<JoinedArtists
|
||||
artistName={data.albumArtistName}
|
||||
artists={data.albumArtists}
|
||||
linkProps={{ fw: 400, isMuted: true }}
|
||||
rootTextProps={{
|
||||
fw: 400,
|
||||
isMuted: type === 'compact' ? false : true,
|
||||
size: 'sm',
|
||||
}}
|
||||
/>
|
||||
);
|
||||
}
|
||||
return '';
|
||||
},
|
||||
@@ -925,7 +1118,7 @@ export const getDataRows = (): DataRow[] => {
|
||||
{
|
||||
format: (data) => {
|
||||
if ('duration' in data && data.duration !== null) {
|
||||
return formatDuration(data.duration * 1000);
|
||||
return formatDurationString(data.duration);
|
||||
}
|
||||
return '';
|
||||
},
|
||||
@@ -934,7 +1127,17 @@ export const getDataRows = (): DataRow[] => {
|
||||
{
|
||||
format: (data) => {
|
||||
if ('releaseYear' in data && data.releaseYear !== null) {
|
||||
return String(data.releaseYear);
|
||||
const releaseYear = data.releaseYear;
|
||||
const originalYear =
|
||||
'originalYear' in data && data.originalYear !== null
|
||||
? data.originalYear
|
||||
: null;
|
||||
|
||||
if (originalYear !== null && originalYear !== releaseYear) {
|
||||
return `${originalYear}${SEPARATOR_STRING}${releaseYear}`;
|
||||
}
|
||||
|
||||
return String(releaseYear);
|
||||
}
|
||||
return '';
|
||||
},
|
||||
@@ -943,7 +1146,15 @@ export const getDataRows = (): DataRow[] => {
|
||||
{
|
||||
format: (data) => {
|
||||
if ('releaseDate' in data && data.releaseDate) {
|
||||
return data.releaseDate;
|
||||
if (
|
||||
'originalDate' in data &&
|
||||
data.originalDate &&
|
||||
data.originalDate !== data.releaseDate
|
||||
) {
|
||||
return `${formatDateAbsoluteUTC(data.originalDate)}${SEPARATOR_STRING}${formatDateAbsoluteUTC(data.releaseDate)}`;
|
||||
}
|
||||
|
||||
return `${formatDateAbsoluteUTC(data.releaseDate)}`;
|
||||
}
|
||||
return '';
|
||||
},
|
||||
@@ -961,7 +1172,12 @@ export const getDataRows = (): DataRow[] => {
|
||||
{
|
||||
format: (data) => {
|
||||
if ('lastPlayedAt' in data && data.lastPlayedAt) {
|
||||
return formatDateRelative(data.lastPlayedAt);
|
||||
return (
|
||||
<Group align="center" gap="xs">
|
||||
<Icon icon="lastPlayed" size="sm" />
|
||||
{formatDateRelative(data.lastPlayedAt)}
|
||||
</Group>
|
||||
);
|
||||
}
|
||||
return '';
|
||||
},
|
||||
@@ -970,7 +1186,7 @@ export const getDataRows = (): DataRow[] => {
|
||||
{
|
||||
format: (data) => {
|
||||
if ('playCount' in data && data.playCount !== null) {
|
||||
return String(data.playCount);
|
||||
return i18n.t('entity.play', { count: data.playCount });
|
||||
}
|
||||
return '';
|
||||
},
|
||||
@@ -1019,7 +1235,7 @@ export const getDataRows = (): DataRow[] => {
|
||||
{
|
||||
format: (data) => {
|
||||
if ('songCount' in data && data.songCount !== null) {
|
||||
return String(data.songCount);
|
||||
return i18n.t('entity.trackWithCount', { count: data.songCount });
|
||||
}
|
||||
return '';
|
||||
},
|
||||
@@ -1028,7 +1244,7 @@ export const getDataRows = (): DataRow[] => {
|
||||
{
|
||||
format: (data) => {
|
||||
if ('albumCount' in data && data.albumCount !== null) {
|
||||
return String(data.albumCount);
|
||||
return i18n.t('entity.albumWithCount', { count: data.albumCount });
|
||||
}
|
||||
return '';
|
||||
},
|
||||
@@ -1062,7 +1278,7 @@ export const getDataRowsCount = () => {
|
||||
return getDataRows().length;
|
||||
};
|
||||
|
||||
const getImageUrl = (data: Album | AlbumArtist | Artist | Playlist | Song | undefined) => {
|
||||
const getImageUrl = (data: Album | AlbumArtist | Artist | Genre | Playlist | Song | undefined) => {
|
||||
if (data && 'imageUrl' in data) {
|
||||
return data.imageUrl || undefined;
|
||||
}
|
||||
@@ -1070,8 +1286,23 @@ const getImageUrl = (data: Album | AlbumArtist | Artist | Playlist | Song | unde
|
||||
return undefined;
|
||||
};
|
||||
|
||||
const GenreImagePlaceholder = ({ className, name }: { className?: string; name: string }) => {
|
||||
const { color, isLight } = useMemo(() => stringToColor(name), [name]);
|
||||
return (
|
||||
<div
|
||||
className={className}
|
||||
style={{
|
||||
backgroundColor: color,
|
||||
color: isLight ? '#000' : '#fff',
|
||||
}}
|
||||
>
|
||||
<span className={styles.genrePlaceholderText}>{name}</span>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
const getItemNavigationPath = (
|
||||
data: Album | AlbumArtist | Artist | Playlist | Song | undefined,
|
||||
data: Album | AlbumArtist | Artist | Genre | Playlist | Song | undefined,
|
||||
itemType: LibraryItem,
|
||||
): null | string => {
|
||||
if (!data || !('id' in data) || !data.id) {
|
||||
@@ -1083,56 +1314,67 @@ const getItemNavigationPath = (
|
||||
return getTitlePath(effectiveItemType, data.id);
|
||||
};
|
||||
|
||||
const ItemCardRow = ({
|
||||
data,
|
||||
index,
|
||||
row,
|
||||
type,
|
||||
}: {
|
||||
data: Album | AlbumArtist | Artist | Playlist | Song | undefined;
|
||||
index: number;
|
||||
row: DataRow;
|
||||
type?: 'compact' | 'default' | 'poster';
|
||||
}) => {
|
||||
const alignmentClass =
|
||||
row.align === 'center'
|
||||
? styles['align-center']
|
||||
: row.align === 'end'
|
||||
? styles['align-end']
|
||||
: styles['align-start'];
|
||||
const ItemCardRow = memo(
|
||||
({
|
||||
data,
|
||||
index,
|
||||
row,
|
||||
type,
|
||||
}: {
|
||||
data: Album | AlbumArtist | Artist | Genre | Playlist | Song | undefined;
|
||||
index: number;
|
||||
row: DataRow;
|
||||
type?: 'compact' | 'default' | 'poster';
|
||||
}) => {
|
||||
const alignmentClass =
|
||||
row.align === 'center'
|
||||
? styles['align-center']
|
||||
: row.align === 'end'
|
||||
? styles['align-end']
|
||||
: styles['align-start'];
|
||||
|
||||
// All rows except the first one (index 0) should be muted
|
||||
const isMuted = index > 0 || row.isMuted;
|
||||
// All rows except the first one (index 0) should be muted
|
||||
const isMuted = index > 0 || row.isMuted;
|
||||
|
||||
const formattedContent = useMemo(() => {
|
||||
if (!data) {
|
||||
return null;
|
||||
}
|
||||
return row.format(data);
|
||||
}, [data, row]);
|
||||
|
||||
if (!data) {
|
||||
return (
|
||||
<div
|
||||
className={clsx(styles.row, alignmentClass, {
|
||||
[styles.compact]: type === 'compact',
|
||||
[styles.default]: type === 'default',
|
||||
[styles.muted]: isMuted,
|
||||
[styles.poster]: type === 'poster',
|
||||
})}
|
||||
>
|
||||
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
if (!data) {
|
||||
return (
|
||||
<div
|
||||
<Text
|
||||
className={clsx(styles.row, alignmentClass, {
|
||||
[styles.bold]: index === 0,
|
||||
[styles.compact]: type === 'compact',
|
||||
[styles.default]: type === 'default',
|
||||
[styles.muted]: isMuted,
|
||||
[styles.poster]: type === 'poster',
|
||||
})}
|
||||
size={index > 0 ? 'sm' : 'md'}
|
||||
>
|
||||
|
||||
</div>
|
||||
{formattedContent}
|
||||
</Text>
|
||||
);
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
return (
|
||||
<Text
|
||||
className={clsx(styles.row, alignmentClass, {
|
||||
[styles.bold]: index === 0,
|
||||
[styles.compact]: type === 'compact',
|
||||
[styles.default]: type === 'default',
|
||||
[styles.muted]: isMuted,
|
||||
[styles.poster]: type === 'poster',
|
||||
})}
|
||||
size={index > 0 ? 'sm' : 'md'}
|
||||
>
|
||||
{row.format(data)}
|
||||
</Text>
|
||||
);
|
||||
};
|
||||
ItemCardRow.displayName = 'ItemCardRow';
|
||||
|
||||
export const MemoizedItemCard = memo(ItemCard);
|
||||
|
||||
@@ -1,146 +1,146 @@
|
||||
import { AnimatePresence } from 'motion/react';
|
||||
import { MouseEvent, useMemo, useState } from 'react';
|
||||
import { Link } from 'react-router';
|
||||
// import { AnimatePresence } from 'motion/react';
|
||||
// import { MouseEvent, useMemo, useState } from 'react';
|
||||
// import { Link } from 'react-router';
|
||||
|
||||
import styles from './item-detail.module.css';
|
||||
// import styles from './item-detail.module.css';
|
||||
|
||||
import { ItemCardControls } from '/@/renderer/components/item-card/item-card-controls';
|
||||
import { useFastAverageColor } from '/@/renderer/hooks';
|
||||
import { ActionIcon } from '/@/shared/components/action-icon/action-icon';
|
||||
import { Badge } from '/@/shared/components/badge/badge';
|
||||
import { Divider } from '/@/shared/components/divider/divider';
|
||||
import { Group } from '/@/shared/components/group/group';
|
||||
import { Image } from '/@/shared/components/image/image';
|
||||
import { Rating } from '/@/shared/components/rating/rating';
|
||||
import { Text } from '/@/shared/components/text/text';
|
||||
import {
|
||||
Album,
|
||||
AlbumArtist,
|
||||
Artist,
|
||||
LibraryItem,
|
||||
Playlist,
|
||||
Song,
|
||||
} from '/@/shared/types/domain-types';
|
||||
import { stringToColor } from '/@/shared/utils/string-to-color';
|
||||
// import { ItemCardControls } from '/@/renderer/components/item-card/item-card-controls';
|
||||
// import { useFastAverageColor } from '/@/renderer/hooks';
|
||||
// import { ActionIcon } from '/@/shared/components/action-icon/action-icon';
|
||||
// import { Badge } from '/@/shared/components/badge/badge';
|
||||
// import { Divider } from '/@/shared/components/divider/divider';
|
||||
// import { Group } from '/@/shared/components/group/group';
|
||||
// import { Image } from '/@/shared/components/image/image';
|
||||
// import { Rating } from '/@/shared/components/rating/rating';
|
||||
// import { Text } from '/@/shared/components/text/text';
|
||||
// import {
|
||||
// Album,
|
||||
// AlbumArtist,
|
||||
// Artist,
|
||||
// LibraryItem,
|
||||
// Playlist,
|
||||
// Song,
|
||||
// } from '/@/shared/types/domain-types';
|
||||
// import { stringToColor } from '/@/shared/utils/string-to-color';
|
||||
|
||||
interface ItemDetailProps {
|
||||
data: Album | AlbumArtist | Artist | Playlist | Song | undefined;
|
||||
itemHeight: number;
|
||||
itemType: LibraryItem;
|
||||
onClick?: (e: MouseEvent<HTMLDivElement>, item: unknown, itemType: LibraryItem) => void;
|
||||
withControls?: boolean;
|
||||
}
|
||||
// interface ItemDetailProps {
|
||||
// data: Album | AlbumArtist | Artist | Playlist | Song | undefined;
|
||||
// itemHeight: number;
|
||||
// itemType: LibraryItem;
|
||||
// onClick?: (e: MouseEvent<HTMLDivElement>, item: unknown, itemType: LibraryItem) => void;
|
||||
// withControls?: boolean;
|
||||
// }
|
||||
|
||||
export const ItemDetail = ({ data, itemType, onClick, withControls }: ItemDetailProps) => {
|
||||
const imageUrl = getImageUrl(data);
|
||||
// export const ItemDetail = ({ data, itemType, onClick, withControls }: ItemDetailProps) => {
|
||||
// const imageUrl = getImageUrl(data);
|
||||
|
||||
const [showControls, setShowControls] = useState(false);
|
||||
// const [showControls, setShowControls] = useState(false);
|
||||
|
||||
const { background } = useFastAverageColor({
|
||||
algorithm: 'simple',
|
||||
src: imageUrl,
|
||||
srcLoaded: false,
|
||||
});
|
||||
// const { background } = useFastAverageColor({
|
||||
// algorithm: 'simple',
|
||||
// src: imageUrl,
|
||||
// srcLoaded: false,
|
||||
// });
|
||||
|
||||
// const tags = [...(data?.genres ?? [])];
|
||||
// // const tags = [...(data?.genres ?? [])];
|
||||
|
||||
const tags = useMemo(() => {
|
||||
if (!data) {
|
||||
return [];
|
||||
}
|
||||
// const tags = useMemo(() => {
|
||||
// if (!data) {
|
||||
// return [];
|
||||
// }
|
||||
|
||||
const items: {
|
||||
color?: string;
|
||||
id: string;
|
||||
isLight?: boolean;
|
||||
itemType: LibraryItem;
|
||||
name: string;
|
||||
}[] = [];
|
||||
// const items: {
|
||||
// color?: string;
|
||||
// id: string;
|
||||
// isLight?: boolean;
|
||||
// itemType: LibraryItem;
|
||||
// name: string;
|
||||
// }[] = [];
|
||||
|
||||
if ('albumArtists' in data && Array.isArray(data.albumArtists)) {
|
||||
data.albumArtists?.forEach((tag: { id: string; name: string }) => {
|
||||
items.push({ id: tag.id, itemType: LibraryItem.ALBUM_ARTIST, name: tag.name });
|
||||
});
|
||||
}
|
||||
// if ('albumArtists' in data && Array.isArray(data.albumArtists)) {
|
||||
// data.albumArtists?.forEach((tag: { id: string; name: string }) => {
|
||||
// items.push({ id: tag.id, itemType: LibraryItem.ALBUM_ARTIST, name: tag.name });
|
||||
// });
|
||||
// }
|
||||
|
||||
if ('genres' in data && Array.isArray(data.genres)) {
|
||||
data.genres?.forEach((tag: { id: string; itemType: LibraryItem; name: string }) => {
|
||||
const { color, isLight } = stringToColor(tag.name);
|
||||
items.push({ ...tag, color, isLight });
|
||||
});
|
||||
}
|
||||
// if ('genres' in data && Array.isArray(data.genres)) {
|
||||
// data.genres?.forEach((tag: { id: string; itemType: LibraryItem; name: string }) => {
|
||||
// const { color, isLight } = stringToColor(tag.name);
|
||||
// items.push({ ...tag, color, isLight });
|
||||
// });
|
||||
// }
|
||||
|
||||
// if ('tags' in data && typeof data.tags === 'object') {
|
||||
// console.log('data.tags :>> ', data.tags);
|
||||
// Object.entries(data.tags).forEach(([key, value]) => {
|
||||
// items.push({ id: key, itemType: LibraryItem.TAG, name: value });
|
||||
// });
|
||||
// }
|
||||
// // if ('tags' in data && typeof data.tags === 'object') {
|
||||
// // console.log('data.tags :>> ', data.tags);
|
||||
// // Object.entries(data.tags).forEach(([key, value]) => {
|
||||
// // items.push({ id: key, itemType: LibraryItem.TAG, name: value });
|
||||
// // });
|
||||
// // }
|
||||
|
||||
return items;
|
||||
}, [data]);
|
||||
// return items;
|
||||
// }, [data]);
|
||||
|
||||
return (
|
||||
<div
|
||||
className={styles.container}
|
||||
onClick={(e) => onClick?.(e, data, itemType)}
|
||||
style={{ backgroundColor: background }}
|
||||
>
|
||||
<div
|
||||
className={styles.imageContainer}
|
||||
onMouseEnter={() => withControls && setShowControls(true)}
|
||||
onMouseLeave={() => withControls && setShowControls(false)}
|
||||
>
|
||||
<Image alt={data?.name} src={imageUrl} />
|
||||
<AnimatePresence>
|
||||
{withControls && showControls && <ItemCardControls type="compact" />}
|
||||
</AnimatePresence>
|
||||
</div>
|
||||
<div className={styles.metadataContainer}>
|
||||
<div className={styles.header}>
|
||||
<Text className={styles.title} component={Link} isLink size="lg" weight={500}>
|
||||
{data?.name}
|
||||
</Text>
|
||||
<Group>
|
||||
{data && 'userRating' in data && (
|
||||
<Rating size="xs" value={data?.userRating ?? 0} />
|
||||
)}
|
||||
{data && 'userFavorite' in data && (
|
||||
<ActionIcon
|
||||
icon="favorite"
|
||||
iconProps={{
|
||||
fill: data?.userFavorite ? 'primary' : 'default',
|
||||
}}
|
||||
size="xs"
|
||||
/>
|
||||
)}
|
||||
</Group>
|
||||
</div>
|
||||
<Divider />
|
||||
<div className={styles.content}>
|
||||
<Group className={styles.tags} gap="xs">
|
||||
{tags.map((tag) => (
|
||||
<Badge
|
||||
key={tag.id}
|
||||
style={{
|
||||
backgroundColor: tag.color,
|
||||
color: tag.isLight ? 'black' : 'white',
|
||||
}}
|
||||
>
|
||||
{tag.name}
|
||||
</Badge>
|
||||
))}
|
||||
</Group>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
// return (
|
||||
// <div
|
||||
// className={styles.container}
|
||||
// onClick={(e) => onClick?.(e, data, itemType)}
|
||||
// style={{ backgroundColor: background }}
|
||||
// >
|
||||
// <div
|
||||
// className={styles.imageContainer}
|
||||
// onMouseEnter={() => withControls && setShowControls(true)}
|
||||
// onMouseLeave={() => withControls && setShowControls(false)}
|
||||
// >
|
||||
// <Image alt={data?.name} src={imageUrl} />
|
||||
// <AnimatePresence>
|
||||
// {withControls && showControls && <ItemCardControls type="compact" />}
|
||||
// </AnimatePresence>
|
||||
// </div>
|
||||
// <div className={styles.metadataContainer}>
|
||||
// <div className={styles.header}>
|
||||
// <Text className={styles.title} component={Link} isLink size="lg" weight={500}>
|
||||
// {data?.name}
|
||||
// </Text>
|
||||
// <Group>
|
||||
// {data && 'userRating' in data && (
|
||||
// <Rating size="xs" value={data?.userRating ?? 0} />
|
||||
// )}
|
||||
// {data && 'userFavorite' in data && (
|
||||
// <ActionIcon
|
||||
// icon="favorite"
|
||||
// iconProps={{
|
||||
// fill: data?.userFavorite ? 'primary' : 'default',
|
||||
// }}
|
||||
// size="xs"
|
||||
// />
|
||||
// )}
|
||||
// </Group>
|
||||
// </div>
|
||||
// <Divider />
|
||||
// <div className={styles.content}>
|
||||
// <Group className={styles.tags} gap="xs">
|
||||
// {tags.map((tag) => (
|
||||
// <Badge
|
||||
// key={tag.id}
|
||||
// style={{
|
||||
// backgroundColor: tag.color,
|
||||
// color: tag.isLight ? 'black' : 'white',
|
||||
// }}
|
||||
// >
|
||||
// {tag.name}
|
||||
// </Badge>
|
||||
// ))}
|
||||
// </Group>
|
||||
// </div>
|
||||
// </div>
|
||||
// </div>
|
||||
// );
|
||||
// };
|
||||
|
||||
const getImageUrl = (data: Album | AlbumArtist | Artist | Playlist | Song | undefined) => {
|
||||
if (data && 'imageUrl' in data) {
|
||||
return data.imageUrl || undefined;
|
||||
}
|
||||
// const getImageUrl = (data: Album | AlbumArtist | Artist | Playlist | Song | undefined) => {
|
||||
// if (data && 'imageUrl' in data) {
|
||||
// return data.imageUrl || undefined;
|
||||
// }
|
||||
|
||||
return undefined;
|
||||
};
|
||||
// return undefined;
|
||||
// };
|
||||
|
||||
@@ -0,0 +1,141 @@
|
||||
import { memo, useMemo } from 'react';
|
||||
import z from 'zod';
|
||||
|
||||
import { api } from '/@/renderer/api';
|
||||
import {
|
||||
GeneralSettingsSchema,
|
||||
getServerById,
|
||||
useAuthStore,
|
||||
useCurrentServerId,
|
||||
useImageRes,
|
||||
useSettingsStore,
|
||||
} from '/@/renderer/store';
|
||||
import { BaseImage, ImageProps } from '/@/shared/components/image/image';
|
||||
import { LibraryItem } from '/@/shared/types/domain-types';
|
||||
|
||||
const getUnloaderIcon = (itemType: LibraryItem) => {
|
||||
switch (itemType) {
|
||||
case LibraryItem.ALBUM:
|
||||
return 'emptyAlbumImage';
|
||||
case LibraryItem.ALBUM_ARTIST:
|
||||
return 'emptyArtistImage';
|
||||
case LibraryItem.ARTIST:
|
||||
return 'emptyArtistImage';
|
||||
case LibraryItem.GENRE:
|
||||
return 'emptyGenreImage';
|
||||
case LibraryItem.PLAYLIST:
|
||||
return 'emptyPlaylistImage';
|
||||
case LibraryItem.SONG:
|
||||
return 'emptySongImage';
|
||||
default:
|
||||
return 'emptyImage';
|
||||
}
|
||||
};
|
||||
|
||||
const BaseItemImage = (
|
||||
props: Omit<ImageProps, 'id' | 'src'> & {
|
||||
id?: null | string;
|
||||
itemType: LibraryItem;
|
||||
serverId?: null | string;
|
||||
src?: null | string;
|
||||
type?: keyof z.infer<typeof GeneralSettingsSchema>['imageRes'];
|
||||
},
|
||||
) => {
|
||||
const { serverId, src, ...rest } = props;
|
||||
|
||||
const imageUrl = useItemImageUrl({
|
||||
id: props.id,
|
||||
imageUrl: src,
|
||||
itemType: props.itemType,
|
||||
serverId: serverId || undefined,
|
||||
type: props.type,
|
||||
});
|
||||
|
||||
return (
|
||||
<BaseImage
|
||||
src={imageUrl}
|
||||
unloaderIcon={getUnloaderIcon(props.itemType)}
|
||||
{...rest}
|
||||
id={props.id || undefined}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
export const ItemImage = memo(BaseItemImage);
|
||||
|
||||
interface UseItemImageUrlProps {
|
||||
id?: null | string;
|
||||
imageUrl?: null | string;
|
||||
itemType: LibraryItem;
|
||||
serverId?: string;
|
||||
size?: number;
|
||||
type?: keyof z.infer<typeof GeneralSettingsSchema>['imageRes'];
|
||||
useRemoteUrl?: boolean;
|
||||
}
|
||||
|
||||
export const useItemImageUrl = (args: UseItemImageUrlProps) => {
|
||||
const { id, imageUrl, itemType, size, type, useRemoteUrl } = args;
|
||||
const serverId = useCurrentServerId();
|
||||
|
||||
const imageRes = useImageRes();
|
||||
const sizeByType: number | undefined = type ? imageRes[type] : undefined;
|
||||
|
||||
return useMemo(() => {
|
||||
if (imageUrl) {
|
||||
return imageUrl;
|
||||
}
|
||||
|
||||
if (!id) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
const targetServerId = args.serverId || serverId;
|
||||
let baseUrl: string | undefined;
|
||||
|
||||
if (useRemoteUrl) {
|
||||
const server = getServerById(targetServerId);
|
||||
baseUrl = server?.remoteUrl || server?.url;
|
||||
}
|
||||
|
||||
return (
|
||||
api.controller.getImageUrl({
|
||||
apiClientProps: { serverId: targetServerId },
|
||||
baseUrl,
|
||||
query: { id, itemType, size: size ?? sizeByType },
|
||||
}) || undefined
|
||||
);
|
||||
}, [args.serverId, id, imageUrl, itemType, serverId, size, sizeByType, useRemoteUrl]);
|
||||
};
|
||||
|
||||
export function getItemImageUrl(args: UseItemImageUrlProps) {
|
||||
const { id, imageUrl, itemType, size, type, useRemoteUrl } = args;
|
||||
const authStore = useAuthStore.getState();
|
||||
const currentServerId = authStore.currentServer?.id;
|
||||
const serverId = (args.serverId || currentServerId) as string;
|
||||
|
||||
const imageRes = useSettingsStore.getState().general.imageRes;
|
||||
const sizeByType: number | undefined = type ? imageRes[type] : undefined;
|
||||
|
||||
if (imageUrl) {
|
||||
return imageUrl;
|
||||
}
|
||||
|
||||
if (!id) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
let baseUrl: string | undefined;
|
||||
|
||||
if (useRemoteUrl) {
|
||||
const server = getServerById(serverId);
|
||||
baseUrl = server?.remoteUrl || server?.url;
|
||||
}
|
||||
|
||||
return (
|
||||
api.controller.getImageUrl({
|
||||
apiClientProps: { serverId },
|
||||
baseUrl,
|
||||
query: { id, itemType, size: size ?? sizeByType },
|
||||
}) || undefined
|
||||
);
|
||||
}
|
||||
@@ -2,7 +2,15 @@ import {
|
||||
ItemListStateActions,
|
||||
ItemListStateItemWithRequiredProperties,
|
||||
} from '/@/renderer/components/item-list/helpers/item-list-state';
|
||||
import { Album, AlbumArtist, Artist, Folder, Playlist, Song } from '/@/shared/types/domain-types';
|
||||
import {
|
||||
Album,
|
||||
AlbumArtist,
|
||||
Artist,
|
||||
Folder,
|
||||
Genre,
|
||||
Playlist,
|
||||
Song,
|
||||
} from '/@/shared/types/domain-types';
|
||||
|
||||
/**
|
||||
* Type guard to assert that an item has the required properties for dragging
|
||||
@@ -34,7 +42,7 @@ const hasRequiredDragProperties = (
|
||||
* @returns Array of items that should be dragged (with original values, asserting id, itemType, and _serverId)
|
||||
*/
|
||||
export const getDraggedItems = (
|
||||
data: Album | AlbumArtist | Artist | Folder | Playlist | Song | undefined,
|
||||
data: Album | AlbumArtist | Artist | Folder | Genre | Playlist | Song | undefined,
|
||||
internalState?: ItemListStateActions,
|
||||
updateSelection: boolean = true,
|
||||
): ItemListStateItemWithRequiredProperties[] => {
|
||||
|
||||
@@ -6,10 +6,13 @@ import { ItemListStateItemWithRequiredProperties } from '/@/renderer/components/
|
||||
import { DefaultItemControlProps, ItemControls } from '/@/renderer/components/item-list/types';
|
||||
import { ContextMenuController } from '/@/renderer/features/context-menu/context-menu-controller';
|
||||
import { usePlayer } from '/@/renderer/features/player/context/player-context';
|
||||
import { useSetFavorite } from '/@/renderer/features/shared/hooks/use-set-favorite';
|
||||
import { useSetRating } from '/@/renderer/features/shared/hooks/use-set-rating';
|
||||
import { LibraryItem, QueueSong, Song } from '/@/shared/types/domain-types';
|
||||
import { Play, TableColumn } from '/@/shared/types/types';
|
||||
|
||||
interface UseDefaultItemListControlsArgs {
|
||||
enableMultiSelect?: boolean;
|
||||
onColumnReordered?: (
|
||||
columnIdFrom: TableColumn,
|
||||
columnIdTo: TableColumn,
|
||||
@@ -33,12 +36,14 @@ export const useDefaultItemListControls = (args?: UseDefaultItemListControlsArgs
|
||||
const player = usePlayer();
|
||||
const navigate = useNavigate();
|
||||
const navigateRef = useRef(navigate);
|
||||
const setFavorite = useSetFavorite();
|
||||
const setRating = useSetRating();
|
||||
|
||||
useEffect(() => {
|
||||
navigateRef.current = navigate;
|
||||
}, [navigate]);
|
||||
|
||||
const { onColumnReordered, onColumnResized, overrides } = args || {};
|
||||
const { enableMultiSelect = true, onColumnReordered, onColumnResized, overrides } = args || {};
|
||||
|
||||
const controls: ItemControls = useMemo(() => {
|
||||
return {
|
||||
@@ -191,7 +196,7 @@ export const useDefaultItemListControls = (args?: UseDefaultItemListControlsArgs
|
||||
onColumnResized?.(columnId, width);
|
||||
},
|
||||
|
||||
onDoubleClick: ({ internalState, item, itemType }: DefaultItemControlProps) => {
|
||||
onDoubleClick: ({ internalState, item, itemType, meta }: DefaultItemControlProps) => {
|
||||
if (!item || !internalState) {
|
||||
return;
|
||||
}
|
||||
@@ -212,7 +217,7 @@ export const useDefaultItemListControls = (args?: UseDefaultItemListControlsArgs
|
||||
}
|
||||
}
|
||||
|
||||
if (itemType === LibraryItem.SONG) {
|
||||
if (itemType === LibraryItem.SONG || itemType === LibraryItem.PLAYLIST_SONG) {
|
||||
const data = internalState.getData();
|
||||
const validSongs = data.filter((d): d is Song => {
|
||||
if (!d || typeof d !== 'object') {
|
||||
@@ -235,17 +240,31 @@ export const useDefaultItemListControls = (args?: UseDefaultItemListControlsArgs
|
||||
return;
|
||||
}
|
||||
|
||||
const songsBefore = 100;
|
||||
const songsAfter = 100;
|
||||
const startIndex = Math.max(0, clickedIndex - songsBefore);
|
||||
const endIndex = Math.min(validSongs.length, clickedIndex + songsAfter + 1);
|
||||
const songsToAdd = validSongs.slice(startIndex, endIndex);
|
||||
const playType = (meta?.playType as Play) || Play.NOW;
|
||||
|
||||
// For NEXT, LAST, NEXT_SHUFFLE, and LAST_SHUFFLE, only add the clicked song
|
||||
// For NOW and SHUFFLE, add a range of songs around the clicked song
|
||||
let songsToAdd: Song[];
|
||||
if (
|
||||
playType === Play.NEXT ||
|
||||
playType === Play.LAST ||
|
||||
playType === Play.NEXT_SHUFFLE ||
|
||||
playType === Play.LAST_SHUFFLE
|
||||
) {
|
||||
songsToAdd = [item as Song];
|
||||
} else {
|
||||
const songsBefore = 50;
|
||||
const songsAfter = 50;
|
||||
const startIndex = Math.max(0, clickedIndex - songsBefore);
|
||||
const endIndex = Math.min(validSongs.length, clickedIndex + songsAfter + 1);
|
||||
songsToAdd = validSongs.slice(startIndex, endIndex);
|
||||
}
|
||||
|
||||
if (songsToAdd.length === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
player.addToQueueByData(songsToAdd, Play.NOW, item.id);
|
||||
player.addToQueueByData(songsToAdd, playType, item.id);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -287,7 +306,7 @@ export const useDefaultItemListControls = (args?: UseDefaultItemListControlsArgs
|
||||
return;
|
||||
}
|
||||
|
||||
player.setFavorite(item._serverId, [item.id], apiItemType, favorite);
|
||||
setFavorite(item._serverId, [item.id], apiItemType, favorite);
|
||||
},
|
||||
|
||||
onMore: ({ event, internalState, item, itemType }: DefaultItemControlProps) => {
|
||||
@@ -315,6 +334,13 @@ export const useDefaultItemListControls = (args?: UseDefaultItemListControlsArgs
|
||||
|
||||
if (!rowId) return;
|
||||
|
||||
if (!enableMultiSelect) {
|
||||
return ContextMenuController.call({
|
||||
cmd: { items: [item] as any[], type: actualItemType as any },
|
||||
event,
|
||||
});
|
||||
}
|
||||
|
||||
// If none selected, select this item
|
||||
if (internalState.getSelected().length === 0) {
|
||||
internalState.setSelected([item]);
|
||||
@@ -384,12 +410,20 @@ export const useDefaultItemListControls = (args?: UseDefaultItemListControlsArgs
|
||||
newRating = 0;
|
||||
}
|
||||
|
||||
player.setRating(item._serverId, [item.id], apiItemType, newRating);
|
||||
setRating(item._serverId, [item.id], apiItemType, newRating);
|
||||
},
|
||||
|
||||
...overrides,
|
||||
};
|
||||
}, [onColumnReordered, onColumnResized, overrides, player]);
|
||||
}, [
|
||||
enableMultiSelect,
|
||||
overrides,
|
||||
onColumnReordered,
|
||||
onColumnResized,
|
||||
player,
|
||||
setFavorite,
|
||||
setRating,
|
||||
]);
|
||||
|
||||
return controls;
|
||||
};
|
||||
|
||||
@@ -13,7 +13,7 @@ import { eventEmitter } from '/@/renderer/events/event-emitter';
|
||||
import { UserFavoriteEventPayload, UserRatingEventPayload } from '/@/renderer/events/events';
|
||||
import { LibraryItem } from '/@/shared/types/domain-types';
|
||||
|
||||
const getQueryKeyName = (itemType: LibraryItem): string => {
|
||||
export const getListQueryKeyName = (itemType: LibraryItem): string => {
|
||||
switch (itemType) {
|
||||
case LibraryItem.ALBUM:
|
||||
return 'albums';
|
||||
@@ -32,6 +32,13 @@ const getQueryKeyName = (itemType: LibraryItem): string => {
|
||||
}
|
||||
};
|
||||
|
||||
type InfiniteLoaderCacheData = {
|
||||
dataMap: Map<number, unknown>;
|
||||
idToIndexMap: Map<string, number>;
|
||||
pagesLoaded: Record<string, boolean>;
|
||||
version: number;
|
||||
};
|
||||
|
||||
interface UseItemListInfiniteLoaderProps {
|
||||
eventKey: string;
|
||||
fetchThreshold?: number;
|
||||
@@ -43,10 +50,12 @@ interface UseItemListInfiniteLoaderProps {
|
||||
serverId: string;
|
||||
}
|
||||
|
||||
function getInitialData(itemCount: number) {
|
||||
function getInitialData(): InfiniteLoaderCacheData {
|
||||
return {
|
||||
data: Array.from({ length: itemCount }, () => undefined),
|
||||
dataMap: new Map(),
|
||||
idToIndexMap: new Map(),
|
||||
pagesLoaded: {},
|
||||
version: 0,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -85,7 +94,7 @@ export const useItemListInfiniteLoader = ({
|
||||
const { setItemCount } = useListContext();
|
||||
|
||||
useEffect(() => {
|
||||
if (!totalItemCount || !setItemCount) {
|
||||
if (totalItemCount == null || !setItemCount) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -115,31 +124,30 @@ export const useItemListInfiniteLoader = ({
|
||||
|
||||
return result;
|
||||
},
|
||||
queryKey: queryKeys[getQueryKeyName(itemType)].list(serverId, queryParams),
|
||||
queryKey: queryKeys[getListQueryKeyName(itemType)].list(serverId, queryParams),
|
||||
});
|
||||
|
||||
const endIndex = startIndex + itemsPerPage;
|
||||
|
||||
// Update the query data with the fetched page
|
||||
queryClient.setQueryData(
|
||||
dataQueryKey,
|
||||
(oldData: { data: unknown[]; pagesLoaded: Record<string, boolean> }) => {
|
||||
const newData = [
|
||||
...oldData.data.slice(0, startIndex),
|
||||
...result.items,
|
||||
...oldData.data.slice(endIndex),
|
||||
];
|
||||
const newPagesLoaded = {
|
||||
...oldData.pagesLoaded,
|
||||
[pageNumber]: true,
|
||||
};
|
||||
queryClient.setQueryData(dataQueryKey, (oldData: InfiniteLoaderCacheData) => {
|
||||
const nextDataMap = new Map(oldData.dataMap);
|
||||
const nextIdToIndexMap = new Map(oldData.idToIndexMap);
|
||||
|
||||
return {
|
||||
data: newData,
|
||||
pagesLoaded: newPagesLoaded,
|
||||
};
|
||||
},
|
||||
);
|
||||
result.items.forEach((item, offset) => {
|
||||
const index = startIndex + offset;
|
||||
nextDataMap.set(index, item);
|
||||
if (item && typeof item === 'object' && 'id' in (item as any)) {
|
||||
const id = String((item as any).id);
|
||||
nextIdToIndexMap.set(id, index);
|
||||
}
|
||||
});
|
||||
|
||||
return {
|
||||
dataMap: nextDataMap,
|
||||
idToIndexMap: nextIdToIndexMap,
|
||||
pagesLoaded: { ...oldData.pagesLoaded, [pageNumber]: true },
|
||||
version: oldData.version + 1,
|
||||
};
|
||||
});
|
||||
|
||||
// Track the last fetched page
|
||||
lastFetchedPageRef.current = Math.max(lastFetchedPageRef.current, pageNumber);
|
||||
@@ -179,17 +187,19 @@ export const useItemListInfiniteLoader = ({
|
||||
if (!oldData) return oldData;
|
||||
return {
|
||||
...oldData,
|
||||
dataMap: new Map(),
|
||||
idToIndexMap: new Map(),
|
||||
pagesLoaded: {},
|
||||
version: (oldData?.version ?? 0) + 1,
|
||||
};
|
||||
});
|
||||
|
||||
lastFetchedPageRef.current = -1;
|
||||
currentVisibleRangeRef.current = null;
|
||||
|
||||
// Invalidate and wait for count query to refetch (this will suspend via useSuspenseQuery)
|
||||
await queryClient.refetchQueries({
|
||||
// Invalidate and wait for count query to refetch
|
||||
await queryClient.ensureQueryData({
|
||||
queryKey: countQueryKey,
|
||||
type: 'active',
|
||||
});
|
||||
|
||||
// Fetch the first page after count is refetched
|
||||
@@ -212,11 +222,11 @@ export const useItemListInfiniteLoader = ({
|
||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
}, [dataQueryKey, queryClient, fetchPage, itemsPerPage]);
|
||||
|
||||
const { data } = useQuery<{ data: unknown[]; pagesLoaded: Record<string, boolean> }>({
|
||||
const { data } = useQuery<InfiniteLoaderCacheData>({
|
||||
enabled: false,
|
||||
initialData: getInitialData(totalItemCount),
|
||||
initialData: getInitialData(),
|
||||
queryFn: () => {
|
||||
return getInitialData(totalItemCount);
|
||||
return getInitialData();
|
||||
},
|
||||
queryKey: dataQueryKey,
|
||||
});
|
||||
@@ -234,7 +244,7 @@ export const useItemListInfiniteLoader = ({
|
||||
const pageNumber = Math.floor(range.startIndex / itemsPerPage);
|
||||
|
||||
const currentData = queryClient.getQueryData<{
|
||||
data: unknown[];
|
||||
dataMap: Map<number, unknown>;
|
||||
pagesLoaded: Record<string, boolean>;
|
||||
}>(dataQueryKey);
|
||||
|
||||
@@ -290,18 +300,20 @@ export const useItemListInfiniteLoader = ({
|
||||
|
||||
// Reset the infinite list data
|
||||
const currentData = queryClient.getQueryData<{
|
||||
data: unknown[];
|
||||
dataMap: Map<number, unknown>;
|
||||
pagesLoaded: Record<string, boolean>;
|
||||
}>(dataQueryKey);
|
||||
|
||||
if (force || currentData) {
|
||||
// Reset data to initial state and clear all loaded pages
|
||||
await queryClient.setQueryData(dataQueryKey, (oldData: any) => {
|
||||
if (!oldData) return getInitialData(totalItemCount);
|
||||
if (!oldData) return getInitialData();
|
||||
return {
|
||||
...oldData,
|
||||
data: Array.from({ length: totalItemCount }, () => undefined),
|
||||
dataMap: new Map(),
|
||||
idToIndexMap: new Map(),
|
||||
pagesLoaded: {},
|
||||
version: (oldData?.version ?? 0) + 1,
|
||||
};
|
||||
});
|
||||
lastFetchedPageRef.current = -1;
|
||||
@@ -337,28 +349,23 @@ export const useItemListInfiniteLoader = ({
|
||||
|
||||
const updateItems = useCallback(
|
||||
(indexes: number[], value: object) => {
|
||||
queryClient.setQueryData(
|
||||
dataQueryKey,
|
||||
(prev: { data: unknown[]; pagesLoaded: Record<string, boolean> }) => {
|
||||
return {
|
||||
...prev,
|
||||
data: prev.data.map((item: any, index) => {
|
||||
if (!item) {
|
||||
return item;
|
||||
}
|
||||
queryClient.setQueryData(dataQueryKey, (prev: InfiniteLoaderCacheData) => {
|
||||
const nextDataMap = new Map(prev.dataMap);
|
||||
|
||||
if (!indexes.includes(index)) {
|
||||
return item;
|
||||
}
|
||||
indexes.forEach((index) => {
|
||||
const existing = nextDataMap.get(index);
|
||||
if (!existing || typeof existing !== 'object') {
|
||||
return;
|
||||
}
|
||||
nextDataMap.set(index, { ...(existing as any), ...(value as any) });
|
||||
});
|
||||
|
||||
return {
|
||||
...item,
|
||||
...value,
|
||||
};
|
||||
}),
|
||||
};
|
||||
},
|
||||
);
|
||||
return {
|
||||
...prev,
|
||||
dataMap: nextDataMap,
|
||||
version: prev.version + 1,
|
||||
};
|
||||
});
|
||||
},
|
||||
[queryClient, dataQueryKey],
|
||||
);
|
||||
@@ -385,16 +392,9 @@ export const useItemListInfiniteLoader = ({
|
||||
return;
|
||||
}
|
||||
|
||||
const idToIndexMap = data.data
|
||||
.filter(Boolean)
|
||||
.reduce((acc: Record<string, number>, item: any, index: number) => {
|
||||
acc[item.id] = index;
|
||||
return acc;
|
||||
}, {});
|
||||
|
||||
const dataIndexes = payload.id
|
||||
.map((id: string) => idToIndexMap[id])
|
||||
.filter((idx) => idx !== undefined);
|
||||
.map((id: string) => (data as any).idToIndexMap?.get(id))
|
||||
.filter((idx): idx is number => typeof idx === 'number');
|
||||
|
||||
if (dataIndexes.length === 0) {
|
||||
return;
|
||||
@@ -408,16 +408,9 @@ export const useItemListInfiniteLoader = ({
|
||||
return;
|
||||
}
|
||||
|
||||
const idToIndexMap = data.data
|
||||
.filter(Boolean)
|
||||
.reduce((acc: Record<string, number>, item: any, index: number) => {
|
||||
acc[item.id] = index;
|
||||
return acc;
|
||||
}, {});
|
||||
|
||||
const dataIndexes = payload.id
|
||||
.map((id: string) => idToIndexMap[id])
|
||||
.filter((idx) => idx !== undefined);
|
||||
.map((id: string) => (data as any).idToIndexMap?.get(id))
|
||||
.filter((idx): idx is number => typeof idx === 'number');
|
||||
|
||||
if (dataIndexes.length === 0) {
|
||||
return;
|
||||
@@ -435,7 +428,40 @@ export const useItemListInfiniteLoader = ({
|
||||
};
|
||||
}, [data, eventKey, itemType, serverId, updateItems]);
|
||||
|
||||
return { data: data.data, onRangeChanged, refresh, updateItems };
|
||||
const itemCount = totalItemCount ?? 0;
|
||||
|
||||
const getItem = useCallback(
|
||||
(index: number) => {
|
||||
return (data as any).dataMap?.get(index);
|
||||
},
|
||||
[data],
|
||||
);
|
||||
|
||||
const getItemIndex = useCallback(
|
||||
(id: string) => {
|
||||
return (data as any).idToIndexMap?.get(id);
|
||||
},
|
||||
[data],
|
||||
);
|
||||
|
||||
const loadedItems = useMemo(() => {
|
||||
const map: Map<number, unknown> | undefined = (data as any).dataMap;
|
||||
if (!map || map.size === 0) return [];
|
||||
return Array.from(map.entries())
|
||||
.sort(([a], [b]) => a - b)
|
||||
.map(([, v]) => v);
|
||||
}, [data]);
|
||||
|
||||
return {
|
||||
dataVersion: (data as any).version ?? 0,
|
||||
getItem,
|
||||
getItemIndex,
|
||||
itemCount,
|
||||
loadedItems,
|
||||
onRangeChanged,
|
||||
refresh,
|
||||
updateItems,
|
||||
};
|
||||
};
|
||||
|
||||
export const parseListCountQuery = (query: any) => {
|
||||
|
||||