mirror of
https://github.com/jeffvli/feishin.git
synced 2026-05-07 04:20:12 +02:00
Compare commits
210 Commits
v0.15.0
...
refactor/api
| Author | SHA1 | Date | |
|---|---|---|---|
| 0c7c0e488d | |||
| a7430dae31 | |||
| 98e8bda45d | |||
| 96221c8fa7 | |||
| 8c7cac369a | |||
| f1c011f677 | |||
| 351464c52d | |||
| da8ba31a88 | |||
| d8a8880e48 | |||
| fe36535aee | |||
| 67eec51e5f | |||
| a7f21db563 | |||
| 6c360c3c19 | |||
| 4d7779eae1 | |||
| 71b307e4a6 | |||
| a3a67d20a9 | |||
| 1c22461ee4 | |||
| 7785874605 | |||
| 9147b041f3 | |||
| c36735575f | |||
| 854222d2fa | |||
| cd0a8d0fec | |||
| ed6376d99b | |||
| a6a51946f1 | |||
| 6e5acfa9da | |||
| 2c7fda63d3 | |||
| cf72016575 | |||
| 6368137815 | |||
| ea122f5a4f | |||
| bb7d561d0f | |||
| 6dea9196a4 | |||
| 4a28e7230a | |||
| b00305cc86 | |||
| 40fb5ba916 | |||
| 2cf0027419 | |||
| c81bd93d04 | |||
| 229f9e984e | |||
| e1e0670350 | |||
| 20debb099d | |||
| 99f9cc5968 | |||
| 53b4a2ee8a | |||
| 0b59a54f04 | |||
| f85ce9703f | |||
| cf3fd53bc1 | |||
| 871923a977 | |||
| c21f7df7b2 | |||
| c83f27ce14 | |||
| 53499e2579 | |||
| cbbf2db087 | |||
| dd60634a40 | |||
| 54932fee86 | |||
| 878e0007d9 | |||
| 2260c0c02b | |||
| dd3285544e | |||
| f3c674fb20 | |||
| 6e0ae3ba92 | |||
| c76cad9727 | |||
| 3c29004e28 | |||
| b08050d9ff | |||
| 908d5dde0f | |||
| 0540b224ec | |||
| d0a2583edb | |||
| 97ca234015 | |||
| b07395c12b | |||
| d8a10c8841 | |||
| e112d0acbf | |||
| 8ca0a207d4 | |||
| 4950ce1aed | |||
| 471d35dd70 | |||
| f5af1c314c | |||
| 1aac1a6361 | |||
| 003e71d974 | |||
| 94b2668384 | |||
| 039e553aa0 | |||
| 755a09ceec | |||
| 60c94c2299 | |||
| 59e01f90e8 | |||
| 59065d24bc | |||
| 2271c211cb | |||
| 7394d639e2 | |||
| 352a8e71e6 | |||
| 377a3ea8ab | |||
| 35b869ee7b | |||
| 618d27ffc1 | |||
| 24b9bf210c | |||
| 76770de7d8 | |||
| 7ff74b8d5e | |||
| 7423b71a65 | |||
| a44ad66d46 | |||
| 5ab0eba23e | |||
| 08fc307516 | |||
| e5adc0caa9 | |||
| 7f0bdf20fc | |||
| deb89ef87d | |||
| 9751e22db4 | |||
| 6128470a47 | |||
| ea79885ef5 | |||
| 84fd6e482d | |||
| 904f05ff61 | |||
| e78ec7688a | |||
| f43de7f23c | |||
| 07532ca55a | |||
| 040a805f5f | |||
| 33af5e625b | |||
| bdedcb883d | |||
| e842a75722 | |||
| d28054cc7f | |||
| 41f8c34f6e | |||
| 4b4df28641 | |||
| 8b141d652c | |||
| 92ed8e20c9 | |||
| 746ab8c2d9 | |||
| 69341f4492 | |||
| 56130d8503 | |||
| 4407c8d424 | |||
| 58bb8e716e | |||
| 0becfd4b59 | |||
| c94029012f | |||
| 2d9176cd21 | |||
| e28dad3f84 | |||
| 60d3eec8f7 | |||
| 62f9d064d9 | |||
| 196b9be65b | |||
| 587ce68018 | |||
| 1ec6176b77 | |||
| a5f28e49eb | |||
| 0b7d4bfb6a | |||
| 2492456b93 | |||
| 1c22c9506e | |||
| 49bb42a298 | |||
| e00aeb2b67 | |||
| b219c900ca | |||
| 5eacb4e3cb | |||
| a86d44a29e | |||
| b7a0b7f997 | |||
| cd2d531c54 | |||
| 19c8980784 | |||
| a2e5f86eac | |||
| d8c93cadce | |||
| 35f87c8552 | |||
| 4f7b0983ec | |||
| 055d9ac5c1 | |||
| 039d008223 | |||
| 2b8db9cfc1 | |||
| caa9448200 | |||
| 176a95a946 | |||
| 6f5dd4881a | |||
| ce6aaa709f | |||
| 217a4d65fd | |||
| b88671161a | |||
| dde48335cd | |||
| 8611f08f54 | |||
| cd18e683bf | |||
| 286441c1b1 | |||
| 5456c2c2b8 | |||
| 5cd4fc227e | |||
| 737d672918 | |||
| a6ac4c8f67 | |||
| c9217827ab | |||
| 0ff8fad071 | |||
| f3cb15eae2 | |||
| 5b34b287e2 | |||
| dc461a253f | |||
| 958416af4c | |||
| 1dd8eec4a5 | |||
| b263db5483 | |||
| 528f60c5f3 | |||
| 007b0166ab | |||
| d3fb2374ff | |||
| 676c091d28 | |||
| 58b7572a8b | |||
| fc77c32a0e | |||
| b5bdea1845 | |||
| 8eb591bd08 | |||
| 88be98f703 | |||
| df6b6d514d | |||
| b6d902e425 | |||
| d922d8b034 | |||
| f4db8fdb84 | |||
| 81ca6937bc | |||
| c382e01f64 | |||
| fb80b66310 | |||
| 63e3b97bca | |||
| fb584b35a9 | |||
| bdc372636b | |||
| 2c5671cf38 | |||
| bd12fbecac | |||
| c1d88ada91 | |||
| d6a3e1d90b | |||
| 789c7f3d81 | |||
| f3c785d0fa | |||
| 062c1c2b61 | |||
| eb078d62cd | |||
| c429ac9223 | |||
| bd26967ff2 | |||
| 620b810191 | |||
| 64866c59bd | |||
| 0afbe4c0a2 | |||
| 6782cd0dcc | |||
| 8f585a5be9 | |||
| ac0c396712 | |||
| b989a66991 | |||
| 2814b623e7 | |||
| 7d29a692ef | |||
| 3f9eb446f7 | |||
| d8f7b49ab6 | |||
| 35e70a3eff | |||
| ef9c16e940 | |||
| 0b39c35132 | |||
| 9f5b4e5410 |
@@ -0,0 +1,33 @@
|
||||
name: Feature request
|
||||
description: Request a feature to be added to Feishin
|
||||
title: '[Feature]: '
|
||||
labels: ['enhancement']
|
||||
body:
|
||||
- type: checkboxes
|
||||
id: check-duplicate
|
||||
attributes:
|
||||
label: I have already checked through the existing feature requests and found no duplicates
|
||||
options:
|
||||
- label: 'Yes'
|
||||
required: true
|
||||
|
||||
- type: dropdown
|
||||
id: server-specific
|
||||
attributes:
|
||||
label: Is this a server-specific feature?
|
||||
options:
|
||||
- Not server-specific
|
||||
- OpenSubsonic
|
||||
- Jellyfin
|
||||
- Navidrome
|
||||
default: 0
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: solution
|
||||
attributes:
|
||||
label: What do you want to be added?
|
||||
placeholder: I would like to see [...]
|
||||
validations:
|
||||
required: true
|
||||
@@ -0,0 +1,74 @@
|
||||
name: Bug report
|
||||
description: You're having technical issues.
|
||||
title: '[Bug]: '
|
||||
labels: ['bug']
|
||||
body:
|
||||
- type: checkboxes
|
||||
id: check-duplicate
|
||||
attributes:
|
||||
label: I have already checked through the existing bug reports and found no duplicates
|
||||
options:
|
||||
- label: 'Yes'
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
id: version
|
||||
attributes:
|
||||
label: App Version
|
||||
description: What version of the app are you running?
|
||||
placeholder: ex. 1.0.0
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
id: server-version
|
||||
attributes:
|
||||
label: Music Server and Version
|
||||
description: What music server are you using?
|
||||
placeholder: ex. Navidrome v0.55.0, LMS v3.67.0, Jellyfin v10.10.7, etc.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: dropdown
|
||||
id: environments
|
||||
attributes:
|
||||
label: What local environments are you seeing the problem on?
|
||||
multiple: true
|
||||
options:
|
||||
- Desktop Windows
|
||||
- Desktop macOS
|
||||
- Desktop Linux
|
||||
- Web Firefox
|
||||
- Web Chrome
|
||||
- Web Safari
|
||||
- Web Microsoft Edge
|
||||
- Other (please specify in the next field)
|
||||
|
||||
- type: textarea
|
||||
id: what-happened
|
||||
attributes:
|
||||
label: What happened?
|
||||
description: Also tell us, what did you expect to happen?
|
||||
placeholder: Include screenshots and error logs if possible. The browser devtools can be opened using CTRL + SHIFT + I (Windows/Linux) or CMD + SHIFT + I (macOS).
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: reproduction
|
||||
attributes:
|
||||
label: Steps to reproduce
|
||||
description: How can we reproduce this issue? Are there any specific settings that are enabled that could be the cause?
|
||||
placeholder: |
|
||||
1. Go to '...'
|
||||
2. Click on '....'
|
||||
3. Scroll down to '....'
|
||||
4. See error
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: logs
|
||||
attributes:
|
||||
label: Relevant log output
|
||||
description: Please copy and paste any relevant log output. This will be automatically formatted into code.
|
||||
render: shell
|
||||
@@ -1,63 +0,0 @@
|
||||
name: Bug report
|
||||
description: You're having technical issues. 🐞
|
||||
labels: ['bug']
|
||||
body:
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Expected Behavior
|
||||
description: What should have happened?
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Current Behavior
|
||||
description: What went wrong? Add screenshots to help explain your problem. (Open the browser dev tools in the menu or using CTRL + SHIFT + I)
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Steps to Reproduce
|
||||
placeholder: |
|
||||
<!-- Add relevant code and/or a live example -->
|
||||
<!-- Add stack traces -->
|
||||
1.
|
||||
2.
|
||||
3.
|
||||
4.
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Possible Solution
|
||||
description: Suggest a reason for the bug or how to fix it.
|
||||
validations:
|
||||
required: false
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Context
|
||||
description: How has this issue affected you? What are you trying to accomplish?
|
||||
validations:
|
||||
required: false
|
||||
- type: input
|
||||
attributes:
|
||||
label: Application version
|
||||
placeholder: (e.g. v0.1.0)
|
||||
validations:
|
||||
required: true
|
||||
- type: input
|
||||
attributes:
|
||||
label: Operating System and version
|
||||
placeholder: (e.g. Windows 11 desktop, Webapp in Firefox)
|
||||
validations:
|
||||
required: true
|
||||
- type: input
|
||||
attributes:
|
||||
label: Server and Version
|
||||
placeholder: (e.g. Navidrome v0.48.0)
|
||||
validations:
|
||||
required: true
|
||||
- type: input
|
||||
attributes:
|
||||
label: Node Version (if developing locally)
|
||||
validations:
|
||||
required: false
|
||||
@@ -1,5 +1,11 @@
|
||||
blank_issues_enabled: true
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: Question
|
||||
- name: Questions or help
|
||||
url: https://github.com/jeffvli/feishin/discussions
|
||||
about: Please ask and answer questions here.
|
||||
about: Ask questions or get help in the discussions section
|
||||
- name: Discord Community
|
||||
url: https://discord.gg/FVKpcMDy5f
|
||||
about: The discord/matrix servers are bridged so you can join whichever you prefer
|
||||
- name: Matrix Community
|
||||
url: https://matrix.to/#/#sonixd:matrix.org
|
||||
about: The discord/matrix servers are bridged so you can join whichever you prefer
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
name: Feature request - NOT ACCEPTING NEW FEATURE REQUESTS
|
||||
description: Feature requests are currently closed. The application is actively being rewritten https://github.com/audioling/audioling.
|
||||
labels: ['enhancement']
|
||||
body:
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: What do you want to be added?
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Additional context
|
||||
validations:
|
||||
required: false
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: Is this a server-specific feature? (e.g. Jellyfin only)
|
||||
options:
|
||||
- label: 'Yes'
|
||||
required: false
|
||||
@@ -24,11 +24,9 @@ jobs:
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Extract metadata (tags, labels) for Docker
|
||||
id: meta
|
||||
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||
tags: |
|
||||
type=raw,value=latest,enable={{is_default_branch}}
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3
|
||||
- name: Setup Docker buildx
|
||||
@@ -41,6 +39,6 @@ jobs:
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
platforms: |
|
||||
linux/amd64
|
||||
linux/arm/v7
|
||||
linux/arm64/v8
|
||||
linux/amd64
|
||||
linux/arm/v7
|
||||
linux/arm64/v8
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
name: 'Close stale issues and PRs'
|
||||
on:
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
- cron: '30 1 * * *'
|
||||
permissions:
|
||||
contents: read
|
||||
jobs:
|
||||
stale:
|
||||
permissions:
|
||||
issues: write
|
||||
pull-requests: write
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: dessant/lock-threads@v5
|
||||
with:
|
||||
process-only: 'issues, prs'
|
||||
issue-inactive-days: 120
|
||||
pr-inactive-days: 120
|
||||
log-output: true
|
||||
add-issue-labels: 'frozen-due-to-age'
|
||||
add-pr-labels: 'frozen-due-to-age'
|
||||
- uses: actions/stale@v9
|
||||
with:
|
||||
operations-per-run: 999
|
||||
days-before-issue-stale: 180
|
||||
days-before-pr-stale: 180
|
||||
days-before-issue-close: 30
|
||||
days-before-pr-close: 30
|
||||
stale-issue-message: >
|
||||
This issue has been automatically marked as stale because it has not had recent activity. The resources of the Feishin team are limited, and so we are asking for your help.
|
||||
|
||||
If this is a **bug** and you can still reproduce this error on the <code>development</code> branch, please reply with all of the information you have about it in order to keep the issue open.
|
||||
|
||||
This issue will automatically be closed in the near future if no further activity occurs. Thank you for all your contributions.
|
||||
|
||||
|
||||
stale-pr-message: >
|
||||
This PR has been automatically marked as stale because it has not had recent activity. The resources of the Feishin team are limited, and so we are asking for your help.
|
||||
|
||||
This PR will automatically be closed in the near future if no further activity occurs. Thank you for all your contributions.
|
||||
|
||||
|
||||
stale-issue-label: 'stale'
|
||||
exempt-issue-labels: 'enhancement,keep,security'
|
||||
stale-pr-label: 'stale'
|
||||
exempt-pr-labels: 'keep,security'
|
||||
+1
-1
@@ -8,7 +8,7 @@ arrowParens: always
|
||||
proseWrap: never
|
||||
htmlWhitespaceSensitivity: strict
|
||||
endOfLine: lf
|
||||
singleAttributePerLine: true
|
||||
singleAttributePerLine: false
|
||||
bracketSpacing: true
|
||||
plugins:
|
||||
- prettier-plugin-packagejson
|
||||
|
||||
+1
-1
@@ -10,7 +10,7 @@
|
||||
"selector-type-no-unknown": [true, { "ignoreTypes": ["/-styled-mixin/", "/^\\$\\w+/"] }],
|
||||
"declaration-block-no-shorthand-property-overrides": null,
|
||||
"declaration-block-no-redundant-longhand-properties": null,
|
||||
"at-rule-no-unknown": [true, { "ignoreAtRules": ["mixin"] }],
|
||||
"at-rule-no-unknown": [true, { "ignoreAtRules": ["mixin", "value"] }],
|
||||
"function-no-unknown": [true, { "ignoreFunctions": ["darken", "alpha", "lighten"] }],
|
||||
"declaration-property-value-no-unknown": null,
|
||||
"no-descending-specificity": null,
|
||||
|
||||
Vendored
+1
-2
@@ -13,10 +13,9 @@
|
||||
".prettierrc": "jsonc",
|
||||
".eslintignore": "ignore"
|
||||
},
|
||||
"eslint.validate": ["typescript"],
|
||||
"eslint.validate": ["typescript", "typescriptreact"],
|
||||
"eslint.workingDirectories": [
|
||||
{ "directory": "./", "changeProcessCWD": true },
|
||||
{ "directory": "./server", "changeProcessCWD": true }
|
||||
],
|
||||
"typescript.tsserver.experimental.enableProjectDiagnostics": false,
|
||||
"editor.codeActionsOnSave": {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<img src="assets/icons/icon.png" alt="logo" title="feishin" align="right" height="60px" />
|
||||
<img src="assets/icons/icon.png" alt="logo" title="feishin" align="right" height="60px" width="60px" />
|
||||
|
||||
# Feishin
|
||||
|
||||
@@ -129,6 +129,7 @@ Feishin supports any music server that implements a [Navidrome](https://www.navi
|
||||
- [LMS](https://github.com/epoupon/lms)
|
||||
- [Nextcloud Music](https://apps.nextcloud.com/apps/music)
|
||||
- [Supysonic](https://github.com/spl0k/supysonic)
|
||||
- [Qm-Music](https://github.com/chenqimiao/qm-music)
|
||||
- More (?)
|
||||
|
||||
### I have the issue "The SUID sandbox helper binary was found, but is not configured correctly" on Linux
|
||||
|
||||
Binary file not shown.
+1
-27
@@ -35,39 +35,13 @@ mac:
|
||||
notarize: false
|
||||
dmg:
|
||||
contents: [{ x: 130, y: 220 }, { x: 410, y: 220, type: link, path: /Applications }]
|
||||
deb:
|
||||
depends:
|
||||
- libgssapi_krb5.so.2
|
||||
- libavahi-common.so.3
|
||||
- libavahi-client.so.3
|
||||
- libkrb5.so.3
|
||||
- libkrb5support.so.0
|
||||
- libkeyutils.so.1
|
||||
- libcups.so.2
|
||||
rpm:
|
||||
depends:
|
||||
- libgssapi_krb5.so.2
|
||||
- libavahi-common.so.3
|
||||
- libavahi-client.so.3
|
||||
- libkrb5.so.3
|
||||
- libkrb5support.so.0
|
||||
- libkeyutils.so.1
|
||||
- libcups.so.2
|
||||
freebsd:
|
||||
depends:
|
||||
- libgssapi_krb5.so.2
|
||||
- libavahi-common.so.3
|
||||
- libavahi-client.so.3
|
||||
- libkrb5.so.3
|
||||
- libkrb5support.so.0
|
||||
- libkeyutils.so.1
|
||||
- libcups.so.2
|
||||
linux:
|
||||
target:
|
||||
- AppImage
|
||||
- tar.xz
|
||||
category: AudioVideo;Audio;Player
|
||||
icon: assets/icons/icon.png
|
||||
artifactName: ${productName}-${os}-${arch}.${ext}
|
||||
npmRebuild: false
|
||||
publish:
|
||||
provider: github
|
||||
|
||||
@@ -30,6 +30,7 @@ const config: UserConfig = {
|
||||
],
|
||||
resolve: {
|
||||
alias: {
|
||||
'/@/i18n': resolve('src/i18n'),
|
||||
'/@/main': resolve('src/main'),
|
||||
'/@/shared': resolve('src/shared'),
|
||||
},
|
||||
@@ -39,6 +40,7 @@ const config: UserConfig = {
|
||||
plugins: [externalizeDepsPlugin()],
|
||||
resolve: {
|
||||
alias: {
|
||||
'/@/i18n': resolve('src/i18n'),
|
||||
'/@/preload': resolve('src/preload'),
|
||||
'/@/shared': resolve('src/shared'),
|
||||
},
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@ import eslintPluginReactHooks from 'eslint-plugin-react-hooks';
|
||||
import eslintPluginReactRefresh from 'eslint-plugin-react-refresh';
|
||||
|
||||
export default tseslint.config(
|
||||
{ ignores: ['**/node_modules', '**/dist', '**/out'] },
|
||||
{ ignores: ['**/node_modules', '**/dist', '**/out', '**/*-schema.d.ts'] },
|
||||
tseslint.configs.recommended,
|
||||
perfectionist.configs['recommended-natural'],
|
||||
eslintPluginReact.configs.flat.recommended,
|
||||
|
||||
+19
-15
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "feishin",
|
||||
"version": "0.15.0",
|
||||
"version": "0.20.0",
|
||||
"description": "A modern self-hosted music player.",
|
||||
"keywords": [
|
||||
"subsonic",
|
||||
@@ -27,6 +27,8 @@
|
||||
"dev": "electron-vite dev",
|
||||
"dev:remote": "vite dev --config remote.vite.config.ts",
|
||||
"dev:watch": "electron-vite dev --watch",
|
||||
"generate-api": "pnpm run generate-api:subsonic",
|
||||
"generate-api:subsonic": "openapi-typescript https://opensubsonic.netlify.app/docs/openapi/openapi.json -o ./src/shared/api/subsonic/subsonic-schema.d.ts",
|
||||
"i18next": "i18next -c src/i18n/i18next-parser.config.js",
|
||||
"postinstall": "electron-builder install-app-deps",
|
||||
"lint": "pnpm run lint-code && pnpm run lint-styles",
|
||||
@@ -64,18 +66,18 @@
|
||||
"@atlaskit/pragmatic-drag-and-drop-hitbox": "^1.0.3",
|
||||
"@electron-toolkit/preload": "^3.0.1",
|
||||
"@electron-toolkit/utils": "^4.0.0",
|
||||
"@mantine/colors-generator": "^8.1.1",
|
||||
"@mantine/core": "^8.1.1",
|
||||
"@mantine/dates": "^8.1.1",
|
||||
"@mantine/form": "^8.1.1",
|
||||
"@mantine/hooks": "^8.1.1",
|
||||
"@mantine/modals": "^8.1.1",
|
||||
"@mantine/notifications": "^8.1.1",
|
||||
"@tanstack/react-query": "^4.32.1",
|
||||
"@tanstack/react-query-devtools": "^4.32.1",
|
||||
"@tanstack/react-query-persist-client": "^4.32.1",
|
||||
"@mantine/colors-generator": "^8.2.8",
|
||||
"@mantine/core": "^8.2.8",
|
||||
"@mantine/dates": "^8.2.8",
|
||||
"@mantine/form": "^8.2.8",
|
||||
"@mantine/hooks": "^8.2.8",
|
||||
"@mantine/modals": "^8.2.8",
|
||||
"@mantine/notifications": "^8.2.8",
|
||||
"@tanstack/react-query": "^5.83.0",
|
||||
"@tanstack/react-query-devtools": "^5.83.0",
|
||||
"@tanstack/react-query-persist-client": "^5.83.0",
|
||||
"@ts-rest/core": "^3.23.0",
|
||||
"@xhayper/discord-rpc": "^1.0.24",
|
||||
"@xhayper/discord-rpc": "^1.3.0",
|
||||
"audiomotion-analyzer": "^4.5.0",
|
||||
"auto-text-size": "^0.2.3",
|
||||
"axios": "^1.6.0",
|
||||
@@ -103,6 +105,7 @@
|
||||
"mpris-service": "^2.1.2",
|
||||
"nanoid": "^3.3.3",
|
||||
"node-mpv": "github:jeffvli/Node-MPV#32b4d64395289ad710c41d481d2707a7acfc228f",
|
||||
"openapi-fetch": "^0.14.0",
|
||||
"overlayscrollbars": "^2.11.1",
|
||||
"overlayscrollbars-react": "^0.5.6",
|
||||
"qs": "^6.14.0",
|
||||
@@ -112,6 +115,7 @@
|
||||
"react-i18next": "^11.18.6",
|
||||
"react-icons": "^5.5.0",
|
||||
"react-image": "^4.1.0",
|
||||
"react-intersection-observer": "^9.16.0",
|
||||
"react-loading-skeleton": "^3.5.0",
|
||||
"react-player": "^2.11.0",
|
||||
"react-router": "^6.16.0",
|
||||
@@ -134,6 +138,7 @@
|
||||
"@types/lodash": "^4.17.18",
|
||||
"@types/md5": "^2.3.5",
|
||||
"@types/node": "^22.15.32",
|
||||
"@types/qs": "^6.14.0",
|
||||
"@types/react": "^18.3.23",
|
||||
"@types/react-dom": "^18.3.7",
|
||||
"@types/react-window": "^1.8.5",
|
||||
@@ -143,7 +148,7 @@
|
||||
"@vitejs/plugin-react": "^4.3.4",
|
||||
"concurrently": "^7.1.0",
|
||||
"cross-env": "^7.0.3",
|
||||
"electron": "^35.1.5",
|
||||
"electron": "^37.4.0",
|
||||
"electron-builder": "^26.0.12",
|
||||
"electron-devtools-installer": "^3.2.0",
|
||||
"electron-vite": "^3.1.0",
|
||||
@@ -154,6 +159,7 @@
|
||||
"eslint-plugin-react-hooks": "^5.2.0",
|
||||
"eslint-plugin-react-refresh": "^0.4.19",
|
||||
"i18next-parser": "^9.0.2",
|
||||
"openapi-typescript": "^7.8.0",
|
||||
"postcss-preset-mantine": "^1.17.0",
|
||||
"prettier": "^3.5.3",
|
||||
"prettier-plugin-packagejson": "^2.5.14",
|
||||
@@ -170,9 +176,7 @@
|
||||
},
|
||||
"pnpm": {
|
||||
"onlyBuiltDependencies": [
|
||||
"abstract-socket",
|
||||
"electron",
|
||||
"electron-winstaller",
|
||||
"esbuild"
|
||||
]
|
||||
},
|
||||
|
||||
Generated
+418
-280
File diff suppressed because it is too large
Load Diff
+3
-1
@@ -1,5 +1,7 @@
|
||||
module.exports = {
|
||||
plugins: {
|
||||
'postcss-preset-mantine': {},
|
||||
'postcss-preset-mantine': {
|
||||
mixins: {},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -2,6 +2,7 @@ import { PostProcessorModule, StringMap, TOptions } from 'i18next';
|
||||
import i18n from 'i18next';
|
||||
import { initReactI18next } from 'react-i18next';
|
||||
|
||||
import ca from './locales/ca.json';
|
||||
import cs from './locales/cs.json';
|
||||
import de from './locales/de.json';
|
||||
import en from './locales/en.json';
|
||||
@@ -18,14 +19,18 @@ import nbNO from './locales/nb-NO.json';
|
||||
import nl from './locales/nl.json';
|
||||
import pl from './locales/pl.json';
|
||||
import ptBr from './locales/pt-BR.json';
|
||||
import pt from './locales/pt.json';
|
||||
import ru from './locales/ru.json';
|
||||
import sl from './locales/sl.json';
|
||||
import sr from './locales/sr.json';
|
||||
import sv from './locales/sv.json';
|
||||
import ta from './locales/ta.json';
|
||||
import tr from './locales/tr.json';
|
||||
import zhHans from './locales/zh-Hans.json';
|
||||
import zhHant from './locales/zh-Hant.json';
|
||||
|
||||
const resources = {
|
||||
ca: { translation: ca },
|
||||
cs: { translation: cs },
|
||||
de: { translation: de },
|
||||
en: { translation: en },
|
||||
@@ -41,11 +46,14 @@ const resources = {
|
||||
'nb-NO': { translation: nbNO },
|
||||
nl: { translation: nl },
|
||||
pl: { translation: pl },
|
||||
pt: { translation: pt },
|
||||
'pt-BR': { translation: ptBr },
|
||||
ru: { translation: ru },
|
||||
sl: { translation: sl },
|
||||
sr: { translation: sr },
|
||||
sv: { translation: sv },
|
||||
ta: { translation: ta },
|
||||
tr: { translation: tr },
|
||||
'zh-Hans': { translation: zhHans },
|
||||
'zh-Hant': { translation: zhHant },
|
||||
};
|
||||
@@ -55,6 +63,10 @@ export const languages = [
|
||||
label: 'English',
|
||||
value: 'en',
|
||||
},
|
||||
{
|
||||
label: 'Català',
|
||||
value: 'ca',
|
||||
},
|
||||
{
|
||||
label: 'Čeština',
|
||||
value: 'cs',
|
||||
@@ -107,6 +119,10 @@ export const languages = [
|
||||
label: 'فارسی',
|
||||
value: 'fa',
|
||||
},
|
||||
{
|
||||
label: 'Português',
|
||||
value: 'pt',
|
||||
},
|
||||
{
|
||||
label: 'Português (Brasil)',
|
||||
value: 'pt-BR',
|
||||
@@ -119,6 +135,10 @@ export const languages = [
|
||||
label: 'Русский',
|
||||
value: 'ru',
|
||||
},
|
||||
{
|
||||
label: 'Slovenščina',
|
||||
value: 'sl',
|
||||
},
|
||||
{
|
||||
label: 'Srpski',
|
||||
value: 'sr',
|
||||
@@ -131,6 +151,10 @@ export const languages = [
|
||||
label: 'Tamil',
|
||||
value: 'ta',
|
||||
},
|
||||
{
|
||||
label: 'Türkçe',
|
||||
value: 'tr',
|
||||
},
|
||||
{
|
||||
label: '简体中文',
|
||||
value: 'zh-Hans',
|
||||
|
||||
@@ -0,0 +1,826 @@
|
||||
{
|
||||
"page": {
|
||||
"sidebar": {
|
||||
"myLibrary": "La meva llibreria",
|
||||
"albumArtists": "$t(entity.albumArtist_other)",
|
||||
"albums": "$t(entity.album_other)",
|
||||
"artists": "$t(entity.artist_other)",
|
||||
"folders": "$t(entity.folder_other)",
|
||||
"genres": "$t(entity.genre_other)",
|
||||
"home": "$t(common.home)",
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"search": "$t(common.search)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"tracks": "$t(entity.track_other)",
|
||||
"nowPlaying": "ara sona",
|
||||
"shared": "$t(entity.playlist_other) compartida"
|
||||
},
|
||||
"albumArtistDetail": {
|
||||
"relatedArtists": "$t(entity.artist_other) similars",
|
||||
"viewAllTracks": "veure totes les $t(entity.track_other)",
|
||||
"about": "Sobre {{artist}}",
|
||||
"appearsOn": "apareix a",
|
||||
"recentReleases": "Llançaments recents",
|
||||
"viewDiscography": "Mosta la discografia",
|
||||
"topSongs": "millos cançons",
|
||||
"topSongsFrom": "les millors cançons de {{title}}",
|
||||
"viewAll": "mostra-ho tot"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "més d'aquest $t(entity.artist_one)",
|
||||
"moreFromGeneric": "més de {{item}}",
|
||||
"released": "publicat"
|
||||
},
|
||||
"albumList": {
|
||||
"title": "$t(entity.album_other)",
|
||||
"artistAlbums": "àlbums de {{artist}}",
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)"
|
||||
},
|
||||
"appMenu": {
|
||||
"quit": "$t(common.quit)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"goBack": "torna enrere",
|
||||
"goForward": "avança",
|
||||
"collapseSidebar": "replega la barra lateral",
|
||||
"expandSidebar": "expandeix la barra lateral",
|
||||
"manageServers": "gestionar servidors",
|
||||
"selectServer": "seleccionar servidor",
|
||||
"version": "versió {{version}}",
|
||||
"openBrowserDevtools": "obre les eines de desenvolupament del navegador",
|
||||
"privateModeOff": "desactiva el mode privat",
|
||||
"privateModeOn": "activa el mode privat"
|
||||
},
|
||||
"contextMenu": {
|
||||
"addFavorite": "$t(action.addToFavorites)",
|
||||
"addLast": "$t(player.addLast)",
|
||||
"addNext": "$t(player.addNext)",
|
||||
"addToFavorites": "$t(action.addToFavorites)",
|
||||
"addToPlaylist": "$t(action.addToPlaylist)",
|
||||
"createPlaylist": "$t(action.createPlaylist)",
|
||||
"deletePlaylist": "$t(action.deletePlaylist)",
|
||||
"deselectAll": "$t(action.deselectAll)",
|
||||
"moveToNext": "$t(action.moveToNext)",
|
||||
"moveToBottom": "$t(action.moveToBottom)",
|
||||
"moveToTop": "$t(action.moveToTop)",
|
||||
"play": "$t(player.play)",
|
||||
"playSimilarSongs": "$t(player.playSimilarSongs)",
|
||||
"removeFromFavorites": "$t(action.removeFromFavorites)",
|
||||
"removeFromPlaylist": "$t(action.removeFromPlaylist)",
|
||||
"removeFromQueue": "$t(action.removeFromQueue)",
|
||||
"setRating": "$t(action.setRating)",
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"download": "descarregar",
|
||||
"showDetails": "informació",
|
||||
"numberSelected": "{{count}} seleccionat",
|
||||
"shareItem": "comparteix l'element"
|
||||
},
|
||||
"genreList": {
|
||||
"title": "$t(entity.genre_other)",
|
||||
"showAlbums": "mostra $t(entity.album_other) $t(entity.genre_one)",
|
||||
"showTracks": "mostra $t(entity.track_other) $t(entity.genre_one)"
|
||||
},
|
||||
"home": {
|
||||
"title": "$t(common.home)",
|
||||
"explore": "explora la teva biblioteca",
|
||||
"newlyAdded": "afegits recentment",
|
||||
"mostPlayed": "els més reproduïts",
|
||||
"recentlyPlayed": "reproduït recentment"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist_other)"
|
||||
},
|
||||
"trackList": {
|
||||
"title": "$t(entity.track_other)",
|
||||
"artistTracks": "pistes de {{artist}}",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track_other)"
|
||||
},
|
||||
"manageServers": {
|
||||
"username": "nom d'usuari",
|
||||
"title": "gestionar servidors",
|
||||
"serverDetails": "detalls del servidor",
|
||||
"editServerDetailsTooltip": "editar els detalls del servidor",
|
||||
"removeServer": "eliminar el servidor",
|
||||
"url": "URL"
|
||||
},
|
||||
"fullscreenPlayer": {
|
||||
"config": {
|
||||
"opacity": "opacitat",
|
||||
"synchronized": "sincronitzat",
|
||||
"unsynchronized": "no sincronitzat",
|
||||
"useImageAspectRatio": "utilitza la relació d'aspecte de la imatge",
|
||||
"dynamicBackground": "fons dinàmic",
|
||||
"dynamicIsImage": "activar la imatge de fons",
|
||||
"followCurrentLyric": "seguir la lletra actual",
|
||||
"lyricAlignment": "alineació de la lletra",
|
||||
"lyricSize": "tamany de la lletra",
|
||||
"dynamicImageBlur": "mida del desenfocament de la imatge",
|
||||
"lyricOffset": "demora de la lletra (ms)",
|
||||
"showLyricMatch": "mosta coincidències de lletres",
|
||||
"showLyricProvider": "mostra el proveïdor de la lletra",
|
||||
"lyricGap": "espera entre lletres"
|
||||
},
|
||||
"lyrics": "lletres",
|
||||
"visualizer": "visualitzador",
|
||||
"noLyrics": "no s'ha trobat cap lletra",
|
||||
"related": "relacionat",
|
||||
"upNext": "a continuació"
|
||||
},
|
||||
"setting": {
|
||||
"advanced": "avançat",
|
||||
"generalTab": "general",
|
||||
"hotkeysTab": "tecles d'accés ràpid",
|
||||
"playbackTab": "reproducció",
|
||||
"windowTab": "finestra"
|
||||
},
|
||||
"globalSearch": {
|
||||
"commands": {
|
||||
"goToPage": "anar a la pàgina",
|
||||
"searchFor": "cerca {{query}}",
|
||||
"serverCommands": "ordres del servidor"
|
||||
},
|
||||
"title": "ordres"
|
||||
},
|
||||
"itemDetail": {
|
||||
"copyPath": "copia ruta al porta-retalls",
|
||||
"copiedPath": "ruta copiada correctament",
|
||||
"openFile": "mostra la pista al gestor d'arxius"
|
||||
},
|
||||
"playlist": {
|
||||
"reorder": "el reordenament només s'activa quan s'ordena per id"
|
||||
}
|
||||
},
|
||||
"common": {
|
||||
"home": "inici",
|
||||
"year": "any",
|
||||
"add": "afegir",
|
||||
"ascending": "ascendent",
|
||||
"biography": "biografia",
|
||||
"bitrate": "taxa de bits",
|
||||
"bpm": "bpm",
|
||||
"cancel": "cancel·lar",
|
||||
"center": "centrar",
|
||||
"close": "tancar",
|
||||
"codec": "còdec",
|
||||
"configure": "configurar",
|
||||
"confirm": "confirmar",
|
||||
"create": "crear",
|
||||
"decrease": "disminuir",
|
||||
"delete": "eliminar",
|
||||
"descending": "descendent",
|
||||
"description": "descripció",
|
||||
"disable": "desactivar",
|
||||
"disc": "disc",
|
||||
"dismiss": "descartar",
|
||||
"duration": "duració",
|
||||
"edit": "editar",
|
||||
"enable": "activar",
|
||||
"expand": "expandir",
|
||||
"filters": "filtres",
|
||||
"increase": "incrementar",
|
||||
"left": "esquerra",
|
||||
"maximize": "maximitzar",
|
||||
"menu": "menú",
|
||||
"minimize": "minimitzar",
|
||||
"modified": "modificació",
|
||||
"name": "nom",
|
||||
"no": "no",
|
||||
"none": "cap",
|
||||
"note": "nota",
|
||||
"ok": "bé",
|
||||
"preview": "vista prèvia",
|
||||
"quit": "sortir",
|
||||
"random": "aleatori",
|
||||
"rating": "valoració",
|
||||
"reload": "torna a carregar",
|
||||
"reset": "restablir",
|
||||
"right": "dreta",
|
||||
"save": "desar",
|
||||
"search": "cercar",
|
||||
"share": "compartir",
|
||||
"size": "mida",
|
||||
"sortOrder": "ordenar",
|
||||
"tags": "etiquetes",
|
||||
"title": "títol",
|
||||
"translation": "traducció",
|
||||
"unknown": "desconegut",
|
||||
"version": "versió",
|
||||
"yes": "sí",
|
||||
"additionalParticipants": "participants addicionals",
|
||||
"channel_one": "canal",
|
||||
"channel_many": "canals",
|
||||
"channel_other": "canals",
|
||||
"filter_one": "filtre",
|
||||
"filter_many": "filtres",
|
||||
"filter_other": "filtres",
|
||||
"saveAs": "desar com",
|
||||
"action_one": "acció",
|
||||
"action_many": "accions",
|
||||
"action_other": "accions",
|
||||
"newVersion": "s'ha instal·lat una nova versió ({{version}})",
|
||||
"viewReleaseNotes": "veure les notes de la versió",
|
||||
"currentSong": "$t(entity.track_one) actual",
|
||||
"limit": "límit",
|
||||
"previousSong": "$t(entity.track_one) anterior",
|
||||
"trackNumber": "pista",
|
||||
"albumGain": "guany de l'àlbum",
|
||||
"albumPeak": "pic de l'àlbum",
|
||||
"areYouSure": "estàs segur?",
|
||||
"backward": "enrere",
|
||||
"clear": "neteja",
|
||||
"collapse": "col·lapsa",
|
||||
"comingSoon": "aviat disponible…",
|
||||
"favorite": "preferit",
|
||||
"forceRestartRequired": "reinicia per aplicar els canvis… tanca la notificació per reiniciar",
|
||||
"owner": "propietari",
|
||||
"refresh": "actualitzar",
|
||||
"resetToDefault": "restablir els valors predeterminats",
|
||||
"saveAndReplace": "desar i substituir",
|
||||
"bitDepth": "profunditat de bits",
|
||||
"forward": "endavant",
|
||||
"manage": "gestiona",
|
||||
"mbid": "ID de MusicBrainz",
|
||||
"noResultsFromQuery": "la petició no ha produït resultats",
|
||||
"path": "ruta",
|
||||
"playerMustBePaused": "cal pausar el reproductor",
|
||||
"restartRequired": "cal reiniciar",
|
||||
"sampleRate": "freqüència de mostreig",
|
||||
"setting": "configuració",
|
||||
"trackGain": "guany de pista",
|
||||
"trackPeak": "pic de pista",
|
||||
"gap": "espera"
|
||||
},
|
||||
"entity": {
|
||||
"album_one": "àlbum",
|
||||
"album_many": "àlbums",
|
||||
"album_other": "àlbums",
|
||||
"albumWithCount_one": "{{count}} àlbum",
|
||||
"albumWithCount_many": "{{count}} àlbums",
|
||||
"albumWithCount_other": "{{count}} àlbums",
|
||||
"albumArtist_one": "artista de l'àlbum",
|
||||
"albumArtist_many": "artistes de l'àlbum",
|
||||
"albumArtist_other": "artistes de l'àlbum",
|
||||
"albumArtistCount_one": "{{count}} artista de l'àlbum",
|
||||
"albumArtistCount_many": "{{count}} artistes de l'àlbum",
|
||||
"albumArtistCount_other": "{{count}} artistes de l'àlbum",
|
||||
"artist_one": "artista",
|
||||
"artist_many": "artistes",
|
||||
"artist_other": "artistes",
|
||||
"artistWithCount_one": "{{count}} artista",
|
||||
"artistWithCount_many": "{{count}} artistes",
|
||||
"artistWithCount_other": "{{count}} artistes",
|
||||
"playlist_one": "llista de reproducció",
|
||||
"playlist_many": "llistes de reproducció",
|
||||
"playlist_other": "llistes de reproducció",
|
||||
"playlistWithCount_one": "{{count}} llista de reproducció",
|
||||
"playlistWithCount_many": "{{count}} llistes de reproducció",
|
||||
"playlistWithCount_other": "{{count}} llistes de reproducció",
|
||||
"smartPlaylist": "$t(entity.playlist_one) intel·ligent",
|
||||
"play_one": "{{count}} reproducció",
|
||||
"play_many": "{{count}} reproduccions",
|
||||
"play_other": "{{count}} reproduccions",
|
||||
"folderWithCount_one": "{{count}} carpeta",
|
||||
"folderWithCount_many": "{{count}} carpetes",
|
||||
"folderWithCount_other": "{{count}} carpetes",
|
||||
"genreWithCount_one": "{{count}} gènere",
|
||||
"genreWithCount_many": "{{count}} gèneres",
|
||||
"genreWithCount_other": "{{count}} gèneres",
|
||||
"track_one": "pista",
|
||||
"track_many": "pistes",
|
||||
"track_other": "pistes",
|
||||
"trackWithCount_one": "{{count}} pista",
|
||||
"trackWithCount_many": "{{count}} pistes",
|
||||
"trackWithCount_other": "{{count}} pistes",
|
||||
"folder_one": "carpeta",
|
||||
"folder_many": "carpetes",
|
||||
"folder_other": "carpetes",
|
||||
"genre_one": "gènere",
|
||||
"genre_many": "gèneres",
|
||||
"genre_other": "gèneres",
|
||||
"song_one": "cançó",
|
||||
"song_many": "cançons",
|
||||
"song_other": "cançons",
|
||||
"favorite_one": "preferit",
|
||||
"favorite_many": "preferits",
|
||||
"favorite_other": "preferits"
|
||||
},
|
||||
"form": {
|
||||
"addToPlaylist": {
|
||||
"input_playlists": "$t(entity.playlist_other)",
|
||||
"title": "afegir a una $t(entity.playlist_one)",
|
||||
"input_skipDuplicates": "salta't els duplicats",
|
||||
"success": "s'ha afegit $t(entity.trackWithCount, {\"count\": {{message}} }) a $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })"
|
||||
},
|
||||
"createPlaylist": {
|
||||
"input_description": "$t(common.description)",
|
||||
"input_name": "$t(common.name)",
|
||||
"input_owner": "$t(common.owner)",
|
||||
"success": "$t(entity.playlist_one) s'ha creat amb èxit",
|
||||
"title": "crear una $t(entity.playlist_one)",
|
||||
"input_public": "públic"
|
||||
},
|
||||
"deletePlaylist": {
|
||||
"success": "$t(entity.playlist_one) s'ha eliminat amb èxit",
|
||||
"title": "elimina la $t(entity.playlist_one)",
|
||||
"input_confirm": "escriviu el nom de la $t(entity.playlist_one) per confirmar"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"success": "$t(entity.playlist_one) s'ha actualitzat amb èxit",
|
||||
"title": "editar la $t(entity.playlist_one)",
|
||||
"publicJellyfinNote": "Per algun motiu, Jellyfin no exposa si una llista de reproducció és pública o no. Si voleu que es mantingui pública, seleccioneu la següent entrada"
|
||||
},
|
||||
"lyricSearch": {
|
||||
"input_artist": "$t(entity.artist_one)",
|
||||
"input_name": "$t(common.name)",
|
||||
"title": "cerca de lletres"
|
||||
},
|
||||
"addServer": {
|
||||
"input_password": "contrasenya",
|
||||
"input_username": "nom d'usuari",
|
||||
"error_savePassword": "hi ha hagut un error en intentar desar la contrasenya",
|
||||
"ignoreCors": "ignora el cors ($t(common.restartRequired))",
|
||||
"ignoreSsl": "ignora l'ssl ($t(common.restartRequired))",
|
||||
"input_legacyAuthentication": "activa l'autenticació antiga",
|
||||
"input_name": "nom del servidor",
|
||||
"input_savePassword": "desa la contrasenya",
|
||||
"input_url": "url",
|
||||
"success": "servidor afegit correctament",
|
||||
"title": "afegeix un servidor"
|
||||
},
|
||||
"shareItem": {
|
||||
"description": "descripció",
|
||||
"allowDownloading": "permetre descàrrega",
|
||||
"setExpiration": "estableix expiració",
|
||||
"success": "s'ha copiat l'enllaç de compartició al porta-retalls (o feu clic aquí per obrir-lo)",
|
||||
"expireInvalid": "la data d'expiració ha de ser al futur",
|
||||
"createFailed": "no s'ha pogut crear el recurs compartit (està habilitat, l'ús compartit?)"
|
||||
},
|
||||
"updateServer": {
|
||||
"success": "s'ha actualitzat el servidor amb èxit",
|
||||
"title": "actualitzar el servidor"
|
||||
},
|
||||
"queryEditor": {
|
||||
"title": "editor de consultes",
|
||||
"input_optionMatchAll": "coincidències totals",
|
||||
"input_optionMatchAny": "coincidències parcials"
|
||||
},
|
||||
"privateMode": {
|
||||
"enabled": "mode privat actiu; l'estat de reproducció ara està ocult d'integracions externes",
|
||||
"disabled": "mode privat inactiu; l'estat de reproducció ara és visible per les integracions externes",
|
||||
"title": "mode privat"
|
||||
}
|
||||
},
|
||||
"action": {
|
||||
"addToFavorites": "afegir als $t(entity.favorite_other)",
|
||||
"addToPlaylist": "afegir a $t(entity.playlist_one)",
|
||||
"createPlaylist": "crear $t(entity.playlist_one)",
|
||||
"deletePlaylist": "elimina la $t(entity.playlist_one)",
|
||||
"editPlaylist": "edita la $t(entity.playlist_one)",
|
||||
"refresh": "$t(common.refresh)",
|
||||
"removeFromFavorites": "elimina dels $t(entity.favorite_other)",
|
||||
"removeFromPlaylist": "elimina de $t(entity.playlist_one)",
|
||||
"clearQueue": "buidar la cua",
|
||||
"removeFromQueue": "treure de la cua",
|
||||
"goToPage": "anar a la pàgina",
|
||||
"openIn": {
|
||||
"lastfm": "Obrir a Last.fm",
|
||||
"musicbrainz": "Obrir a MusicBrainz"
|
||||
},
|
||||
"deselectAll": "deselecciona-ho tot",
|
||||
"viewPlaylists": "veure$t(entity.playlist_other)",
|
||||
"moveToNext": "passar al següent",
|
||||
"moveToBottom": "anar al final",
|
||||
"moveToTop": "anar al principi",
|
||||
"setRating": "Qualifica",
|
||||
"toggleSmartPlaylistEditor": "canvia l'editor $t(entity.smartPlaylist)"
|
||||
},
|
||||
"setting": {
|
||||
"language_description": "estableix l'idioma de l'aplicació ($t(common.restartRequired))",
|
||||
"playButtonBehavior_optionAddLast": "$t(player.addLast)",
|
||||
"playButtonBehavior_optionAddNext": "$t(player.addNext)",
|
||||
"playButtonBehavior_optionPlay": "$t(player.play)",
|
||||
"playButtonBehavior_optionPlayShuffled": "$t(player.shuffle)",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album_one)",
|
||||
"replayGainMode_optionNone": "$t(common.none)",
|
||||
"replayGainMode_optionTrack": "$t(entity.track_one)",
|
||||
"font": "tipus de lletra",
|
||||
"fontType": "selecció de tipus de lletra",
|
||||
"fontType_optionBuiltIn": "tipus de lletra integrats",
|
||||
"fontType_optionCustom": "tipus de lletra personalitzats",
|
||||
"fontType_optionSystem": "tipus de lletra del sistema",
|
||||
"disableAutomaticUpdates": "desactivar les actualitzacions automàtiques",
|
||||
"disableLibraryUpdateOnStartup": "desactiva la comprovació de noves versions a l'inici",
|
||||
"homeConfiguration": "configuració de la pàgina d'inici",
|
||||
"sidebarConfiguration": "configuració de la barra lateral",
|
||||
"contextMenu": "configuració del menú contextual (clic amb el botó dret)",
|
||||
"hotkey_playbackNext": "pista següent",
|
||||
"hotkey_playbackPrevious": "pista anterior",
|
||||
"sidePlayQueueStyle_optionAttached": "unida",
|
||||
"sidePlayQueueStyle_optionDetached": "separada",
|
||||
"audioDevice": "dispositiu d'àudio",
|
||||
"audioDevice_description": "seleccioneu el dispositiu d'àudio que voleu utilitzar per a la reproducció (només pel reproductor web)",
|
||||
"audioPlayer": "reproductor d'àudio",
|
||||
"audioPlayer_description": "seleccioneu el reproductor d'àudio que voleu utilitzar per a la reproducció",
|
||||
"sidebarConfiguration_description": "selecciona els elements i l'ordre en què apareixen a la barra lateral",
|
||||
"sidebarPlaylistList_description": "mostra o amaga les llistes de reproducció a la barra lateral",
|
||||
"accentColor": "color de ressaltat",
|
||||
"accentColor_description": "estableix el color de ressaltat de l'aplicació",
|
||||
"useSystemTheme_description": "seguir la preferència de d'aspecte clar o fosc definida pel sistema",
|
||||
"themeDark": "aspecte fosc",
|
||||
"theme": "aspecte",
|
||||
"themeLight": "aspecte clar",
|
||||
"useSystemTheme": "utilitzar l'aspecte del sistema",
|
||||
"discordUpdateInterval_description": "el temps en segons entre cada actualització (mínim 15 segons)",
|
||||
"enableRemote": "activar el servidor de control remot",
|
||||
"enableRemote_description": "el servidor de control remot permet que altres dispositius controlin l'aplicació",
|
||||
"notify": "activa les notificacions de cançons",
|
||||
"transcode": "activa la transcodificació",
|
||||
"transcode_description": "permet la transcodificació a diferents formats",
|
||||
"albumBackground": "imatge de fons de l'àlbum",
|
||||
"albumBackground_description": "afegeix una imatge de fons per les pàgines d'àlbum amb caràtula",
|
||||
"albumBackgroundBlur": "mida del desenfocament de la imatge de fons de l'àlbum",
|
||||
"albumBackgroundBlur_description": "ajusa la quantitat de desenfocament que s'aplica a la imatge de fons de l'àlbum",
|
||||
"applicationHotkeys": "tecles de drecera de l'aplicació",
|
||||
"applicationHotkeys_description": "configura les tecles de drecera de l'aplicació. marca la casella per configurar-les com a derecres globals (només per ordinador)",
|
||||
"artistConfiguration": "configuració de la pàgina de l'artista de l'àlbum",
|
||||
"artistConfiguration_description": "configura quins elements es mostren i el seu ordre de la pàgina de l'artista de l'àlbum",
|
||||
"audioExclusiveMode": "mode d'àudio exclusiu",
|
||||
"audioExclusiveMode_description": "activa el mode d'àudio exclusiu. En aquest mode, el sistema normalment estarà bloquejat i només mpv podrà emetre àudio",
|
||||
"buttonSize": "mida dels botons de la barra de reproducció",
|
||||
"buttonSize_description": "la mida dels botons de la barra de reproducció",
|
||||
"clearCache": "neteja la memòria del navegador",
|
||||
"clearCache_description": "una \"neteja profunda\" del feishin. a més de netejar la memòria del feishin, buida la memòria del navegador (com les imatges desades i altres recursos). la configuració i les credencials del servidor es mantenen",
|
||||
"clearQueryCache": "buida la memòria de feishin",
|
||||
"clearQueryCache_description": "una neteja superficial de feishin. això refrescarà les llistes de reproducció, les metadades de les pistes i reestablirà les lletres desades. la configuració, les credencials del servidor i les imatges desades es mantindran",
|
||||
"clearCacheSuccess": "memòria netejada correctament",
|
||||
"contextMenu_description": "us permet amagar els elements que es mostren al menú quan fas clic dret sobre un element. els elements no seleccionats estaran amagats",
|
||||
"crossfadeDuration": "duracció de la fosa encadenada",
|
||||
"crossfadeDuration_description": "estableix la duració de l'efecte de fosa encadenada",
|
||||
"crossfadeStyle": "estil de fosa encadenada",
|
||||
"crossfadeStyle_description": "selecciona l'estil de fosa encadenada que s'utilitzarà pel reproductor d'àudio",
|
||||
"customCssEnable": "activa el css personalitzat",
|
||||
"customCssEnable_description": "permet escriure CSS personalitzat.",
|
||||
"customCssNotice": "Atenció: tot i que hi ha un filtre (no es permet ni url() ni content:), l'ús de CSS personalitzat pot presentar riscs si canvieu la interfície.",
|
||||
"customCss": "css personalitzat",
|
||||
"customCss_description": "contingut del css personalitzat. Nota: la propietat \"content\" i els urls remots no es permeten. A sota hi teniu una previsualització. Els camps addicionals que no establiu hi apareixin pel filtre.",
|
||||
"customFontPath": "ruta de font personalitzada",
|
||||
"customFontPath_description": "estableix la ruta a una font personalitzada per utilitzar-la a l'aplicació",
|
||||
"discordApplicationId": "id d'aplicació de {{discord}}",
|
||||
"discordApplicationId_description": "l'id d'aplicació per l'estat d'activitat de {{discord}} (per defecte, {{defaultId}})",
|
||||
"discordPausedStatus": "mosta l'estat d'activitat quan està en pausa",
|
||||
"discordPausedStatus_description": "si està activat, l'estat es mostrarà quan el reproductor estigui pausat",
|
||||
"discordIdleStatus": "mosta l'estat d'activitat en inactivitat",
|
||||
"discordIdleStatus_description": "si està activat, s'actualitzarà l'estat mentre el reproductor estigui inactiu",
|
||||
"discordListening": "mosta l'estat com escoltant",
|
||||
"discordListening_description": "mosta l'estat com escoltant en comptes de jugant",
|
||||
"discordRichPresence": "estat d'activitat de {{discord}}",
|
||||
"discordRichPresence_description": "activa l'estat de reproducció a l'activitat de {{discord}}. Les tecles d'imatge són: {{icon}}, {{playing}} i {{paused}}",
|
||||
"discordServeImage": "serveix imatges de {{discord}} des del servidor",
|
||||
"discordServeImage_description": "comparteix la caràtula per l'estat d'activitat de {{discord}} des del servidor; només disponible per jellyfin i navidrome",
|
||||
"discordUpdateInterval": "interval d'actualització de l'estat d'activitat de {{discord}}",
|
||||
"doubleClickBehavior": "posa en cua totes les pistes cercades en fer doble clic",
|
||||
"doubleClickBehavior_description": "si està actiu, totes les pistes coincidents en una cerca de pistes es posaran a la cua. altrament, només la que seleccioneu s'afegirà a la cua",
|
||||
"externalLinks": "mostra enllaços externs",
|
||||
"externalLinks_description": "permet mostrar enllaços externs (Last.fm, MusicBrainz) a les pàgines d'artista/àlbum",
|
||||
"exitToTray": "surt a la safata",
|
||||
"exitToTray_description": "en sortir de l'aplicació, minimitza-la a la safa del sistema",
|
||||
"floatingQueueArea": "mostra la zona flotant de la cua",
|
||||
"floatingQueueArea_description": "mostra una icona flotant al costat dret de la pantalla per veure la cua de reproducció",
|
||||
"followLyric": "segueix la lletra actual",
|
||||
"followLyric_description": "desplaça la lletra a la posició de reproducció actual",
|
||||
"preferLocalLyrics": "prefereix les lletres locals",
|
||||
"preferLocalLyrics_description": "prefereix les lletres locals per sobre de les remotes, si estan disponibles",
|
||||
"font_description": "estableix la font utilitzada a l'aplicació",
|
||||
"fontType_description": "\"font incorporada\" selecciona una de les fonts proporcionades per Feishin. \"font del sistema\" us permet seleccionar qualsevol font proporcionada pel sistema operatiu. \"personalitzada\" us permet proporcionar la vostra pròpia font",
|
||||
"gaplessAudio": "àudio sense pauses",
|
||||
"gaplessAudio_description": "estableix la configuració d'àudio sense pauses per mpv",
|
||||
"gaplessAudio_optionWeak": "feble (recomanat)",
|
||||
"genreBehavior": "comportament predeterminat per les pàgines de gènere",
|
||||
"genreBehavior_description": "determina si clicar sobre un gènere obre per defecte la llista de pistes o d'àlbums",
|
||||
"globalMediaHotkeys": "tecles de drecera globals",
|
||||
"globalMediaHotkeys_description": "activa o desactiva l'ús de les tecles multimèdia del sistema per controlar la reproducció",
|
||||
"homeConfiguration_description": "configura quins objectes es mostren, i en quin ordre, a la pàgina d'inici",
|
||||
"homeFeature": "carrusel de destacats d'inici",
|
||||
"homeFeature_description": "controla si es mostra el gran carrusel d'elements destacats a la pàgina d'inici",
|
||||
"hotkey_browserBack": "anar enrere",
|
||||
"hotkey_browserForward": "anar endavant",
|
||||
"hotkey_favoriteCurrentSong": "marca $t(common.currentSong) com a preferida",
|
||||
"hotkey_favoritePreviousSong": "marca $t(common.previousSong) com a preferida",
|
||||
"hotkey_globalSearch": "cerca global",
|
||||
"hotkey_localSearch": "cerca a la pàgina",
|
||||
"hotkey_playbackPause": "pausa",
|
||||
"hotkey_playbackPlay": "reprodueix",
|
||||
"hotkey_playbackPlayPause": "reprodueix / pausa",
|
||||
"hotkey_playbackStop": "atura",
|
||||
"hotkey_rate0": "neteja la qualificació",
|
||||
"hotkey_rate1": "qualifica amb 1 estrella",
|
||||
"hotkey_rate2": "qualifica amb 2 estrelles",
|
||||
"hotkey_rate3": "qualifica amb 3 estrelles",
|
||||
"hotkey_rate4": "qualifica amb 4 estrelles",
|
||||
"hotkey_rate5": "qualifica amb 5 estrelles",
|
||||
"hotkey_skipBackward": "salta enrere",
|
||||
"hotkey_skipForward": "salta endavant",
|
||||
"hotkey_toggleCurrentSongFavorite": "canvia si $t(common.currentSong) és preferida",
|
||||
"hotkey_toggleFullScreenPlayer": "activa o desactiva el reproductor a pantalla completa",
|
||||
"hotkey_togglePreviousSongFavorite": "canvia si $t(common.previousSong) és preferida",
|
||||
"hotkey_toggleQueue": "activa o desactiva la cua",
|
||||
"hotkey_toggleRepeat": "activa o desactiva la repetició",
|
||||
"hotkey_toggleShuffle": "activa o desactiva la reproducció a l'atzar",
|
||||
"hotkey_unfavoriteCurrentSong": "elimina $t(common.currentSong) dels preferits",
|
||||
"hotkey_unfavoritePreviousSong": "elimina $t(common.previousSong) dels preferits",
|
||||
"hotkey_volumeDown": "redueix el volum",
|
||||
"hotkey_volumeMute": "silencia el volum",
|
||||
"hotkey_volumeUp": "augmenta el volum",
|
||||
"hotkey_zoomIn": "amplia",
|
||||
"hotkey_zoomOut": "redueix",
|
||||
"imageAspectRatio": "utilitza la relació d'aspecte predeterminada de la caràtula",
|
||||
"imageAspectRatio_description": "si està activat, la caràtula es mostrarà amb la relació d'aspecte predeterminada. per caràtules que no siguin 1:1, l'espai restant estarà buit",
|
||||
"language": "llengua",
|
||||
"lastfm": "mostra els enllaços last.fm",
|
||||
"lastfm_description": "mosta enllaços a last.fm a les pàgines d'artista/àlbum",
|
||||
"lastfmApiKey": "clau d'API per {{lastfm}}",
|
||||
"lastfmApiKey_description": "la clau d'API per {{lastfm}}. necessària per la caràtula",
|
||||
"lyricFetch": "extreu la lletra d'internet",
|
||||
"lyricFetch_description": "extreu la lletra de diverses fonts d'internet",
|
||||
"lyricFetchProvider": "proveïdors de lletres",
|
||||
"lyricFetchProvider_description": "selecciona els proveïdors de lletres. l'ordre en què apareixen és l'ordre en què es consultaran",
|
||||
"lyricOffset": "desfasament de la lletra (ms)",
|
||||
"lyricOffset_description": "desplaça la lletra els mil·lisegons especificats",
|
||||
"notify_description": "mostra notificacions en canvia la cançó actual",
|
||||
"minimizeToTray": "minimitza a la safata",
|
||||
"minimizeToTray_description": "minimitza l'aplicació a la safata del sistema",
|
||||
"minimumScrobblePercentage": "duració mínima de l'scrobble (percentatge)",
|
||||
"minimumScrobblePercentage_description": "el percentatge mínim de la cançó que cal reproduir abans d'activar l'scrobble",
|
||||
"minimumScrobbleSeconds": "scrobble mínim (segons)",
|
||||
"minimumScrobbleSeconds_description": "la duració mínima en segons durant la qual cal reproduir la cançó abans d'activar l'scrobble",
|
||||
"mpvExecutablePath": "ruta de l'executable de l'mpv",
|
||||
"mpvExecutablePath_description": "estableix la ruta de l'executable de l'mpv. si el deixeu buit, s'utilitzarà la ruta predeterminada",
|
||||
"mpvExtraParameters": "paràmetres de l'mpv",
|
||||
"mpvExtraParameters_help": "un per línia",
|
||||
"musicbrainz": "mostra els enllaços de musicbrainz",
|
||||
"musicbrainz_description": "mostra enllaços a les pàgines d'artista/àlbum a musicbrainz si hi ha mbid",
|
||||
"neteaseTranslation": "activeu les traduccions NetEase",
|
||||
"neteaseTranslation_description": "Si ho activeu, cerca i mostra lletres traduïdes de NetEase si estan disponibles.",
|
||||
"passwordStore": "contrasenyes/emmagatzematge secret",
|
||||
"passwordStore_description": "quina contrasenya/emmagatzematge secret s'utilitza. canvieu-ho si teniu problemes per desar contrasenyes.",
|
||||
"playbackStyle": "estil de reproducció",
|
||||
"playbackStyle_description": "selecciona l'estil de reproducció a utilitzar pel reproductor d'àudio",
|
||||
"playbackStyle_optionCrossFade": "fosa encadenada",
|
||||
"playbackStyle_optionNormal": "normal",
|
||||
"playButtonBehavior": "comportament del botó de reproducció",
|
||||
"playButtonBehavior_description": "estableix el comportament predeterminat del botó de reproducció quan s'afegeixen cançons a la cua",
|
||||
"playerAlbumArtResolution": "resolució de la caràtula de l'àlbum al reproductor",
|
||||
"playerAlbumArtResolution_description": "la resolució de la previsualització gran de la caràtula al reproductor. si és més alta, serà més nítida, però es carregarà més lent. el valor predeterminat 0 vol dir automàtic",
|
||||
"playerbarOpenDrawer": "activa el reproductor en pantalla completa",
|
||||
"playerbarOpenDrawer_description": "permet fer clic a la barra de reproducció per obrir el reproductor de pantalla completa",
|
||||
"remotePassword": "contrasenya del servidor de control remot",
|
||||
"remotePassword_description": "estableix la contrasenya pel servidor de control remot. Aquestes credencials es transfereixen de forma no segura per defecte, de manera que hauríeu d'utilitzar una contrasenya única no relacionada amb res més",
|
||||
"remotePort": "port del servidor de control remot",
|
||||
"remotePort_description": "estableix el port pel servidor de control remot",
|
||||
"remoteUsername": "nom d'usuari pel servidor de control remot",
|
||||
"remoteUsername_description": "estableix el nom d'usuari pel servidor de control remot. si tant el nom d'usuari com la contrasenya són buits, l'autenticació estarà desactivada",
|
||||
"replayGainPreamp_description": "ajusta el guany del preamplificador aplicat als valors de {{ReplayGain}}",
|
||||
"sampleRate": "ràtio de mostratge",
|
||||
"sampleRate_description": "selecciona el ràtio de mostratge de sortida que s'ha d'utilitzar si la freqüència de mostratge seleccionada és diferent a la del mitjà actual. un valor inferior a 8000 utilitzarà la freqüència predeterminada",
|
||||
"savePlayQueue": "desa la cua de reproducció",
|
||||
"savePlayQueue_description": "desa la cua de reproducció quan l'aplicació es tanca i la restaura quan s'obre",
|
||||
"scrobble": "scrobble",
|
||||
"scrobble_description": "fa scrobble de les reproduccions al vostre servidor multimèdia",
|
||||
"showSkipButton": "mostra els botons de saltar",
|
||||
"showSkipButton_description": "mostra o amaga els botons de saltar a la barra de reproducció",
|
||||
"showSkipButtons": "mostra els botons de saltar",
|
||||
"showSkipButtons_description": "mostra o amaga els botons de saltar a la barra de reproducció",
|
||||
"sidebarCollapsedNavigation": "navegació de la barra lateral (plegada)",
|
||||
"sidebarCollapsedNavigation_description": "mostra o amaga la navegació a la barra lateral plegada",
|
||||
"sidebarPlaylistList": "llista de reproducció lateral",
|
||||
"sidePlayQueueStyle": "estil de la cua de reproducció lateral",
|
||||
"sidePlayQueueStyle_description": "estableix l'estil de la cua de reproducció lateral",
|
||||
"skipDuration": "interval de salt",
|
||||
"skipDuration_description": "estableix l'interval de temps que se saltarà en fer servir els botons de saltar a la barra de reproducció",
|
||||
"skipPlaylistPage": "salta la pàgina de la llista de reproducció",
|
||||
"skipPlaylistPage_description": "en navegar a una llista de reproducció, obre la pàgina de cançons de la llista de reproducció en comptes de la pàgina predeterminada",
|
||||
"startMinimized": "obre minimitzada",
|
||||
"startMinimized_description": "obre l'aplicació a la safata del sistema",
|
||||
"theme_description": "estableix el tema visual per l'aplicació",
|
||||
"themeDark_description": "estableix el tema fosc per l'aplicació",
|
||||
"themeLight_description": "estableix el tema clar per l'aplicació",
|
||||
"transcodeNote": "tindrà efecte després d'1 (web) o 2 (mpv) cançons",
|
||||
"transcodeBitrate": "taxa de bits per transcodificar",
|
||||
"transcodeBitrate_description": "selecciona la taxa de bits per transcodificar. 0 significa deixar que el servidor triï",
|
||||
"transcodeFormat": "format per transcodificar",
|
||||
"transcodeFormat_description": "selecciona el format per transcodificar. deixeu-ho buit per deixar que el servidor decideixi",
|
||||
"translationApiProvider": "proveïdor d'api de traducció",
|
||||
"translationApiProvider_description": "proveïdor de l'api de traducció",
|
||||
"translationApiKey": "clau de l'api de traducció",
|
||||
"translationTargetLanguage": "llengua meta de traducció",
|
||||
"translationTargetLanguage_description": "llengua meta per la traducció",
|
||||
"trayEnabled": "mostra a la safata",
|
||||
"trayEnabled_description": "mostra/oculta la icona/menú de la safata. si està desactivat, també desactiva la funcionalitat de minimitzar/sortir a la safata",
|
||||
"volumeWheelStep": "increment de volum de la roda",
|
||||
"volumeWheelStep_description": "la quantitat de volum a canviar quan utilitzeu la roda del ratolí sobre el controlador de volum",
|
||||
"volumeWidth": "amplada del controlador de volum",
|
||||
"volumeWidth_description": "l'amplada del controlador de volum",
|
||||
"webAudio": "utilitza l'àudio web",
|
||||
"webAudio_description": "utilitza l'àudio web. això habilita funcions avançades com Replaygain. desactiveu-ho si teniu una experiència diferent",
|
||||
"replayGainClipping": "saturació de {{ReplayGain}}",
|
||||
"replayGainClipping_description": "rebaixa automàticament el guany per evitar la saturació causada pel {{ReplayGain}}",
|
||||
"replayGainFallback": "alternativa per {{ReplayGain}}",
|
||||
"replayGainFallback_description": "guany en db que s'ha d'aplicar si el fitxer no té etiquetes de {{ReplayGain}}",
|
||||
"replayGainMode": "mode de {{ReplayGain}}",
|
||||
"replayGainMode_description": "ajuda el volum del guany segons els vlors de {{ReplayGain}} desats a les metadades del fitxer",
|
||||
"replayGainPreamp": "preamplificador de {{ReplayGain}} (dB)",
|
||||
"translationApiKey_description": "clau api per la traducció (només per serveis globals)",
|
||||
"preservePitch": "mantén el to",
|
||||
"preservePitch_description": "manté el to quan s'altera la velocitat de reproducció",
|
||||
"windowBarStyle": "estil de la barra de la finestra",
|
||||
"windowBarStyle_description": "selecciona l'estil de la barra de la finestra",
|
||||
"zoom": "percentatge de zoom",
|
||||
"zoom_description": "estableix el percentatge de zoom de l'aplicació",
|
||||
"discordDisplayType": "tipus de pantalla d'activitat de {{discord}}",
|
||||
"discordDisplayType_description": "canvia què escolteu al vostre estat",
|
||||
"discordDisplayType_songname": "nom de la cançó",
|
||||
"discordDisplayType_artistname": "nom de l'artista"
|
||||
},
|
||||
"table": {
|
||||
"column": {
|
||||
"albumCount": "$t(entity.album_other)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"codec": "$t(common.codec)",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"size": "$t(common.size)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"releaseYear": "any",
|
||||
"playCount": "reproduccions",
|
||||
"releaseDate": "data de llançament",
|
||||
"album": "àlbum",
|
||||
"albumArtist": "artista de l'àlbum",
|
||||
"biography": "biografia",
|
||||
"bitrate": "taxa de bits",
|
||||
"bpm": "bpm",
|
||||
"dateAdded": "data d'addició",
|
||||
"discNumber": "disc",
|
||||
"trackNumber": "pista",
|
||||
"comment": "comentari",
|
||||
"favorite": "preferit",
|
||||
"lastPlayed": "última reproducció",
|
||||
"path": "ruta",
|
||||
"rating": "qualificació",
|
||||
"title": "títol"
|
||||
},
|
||||
"config": {
|
||||
"general": {
|
||||
"gap": "$t(common.gap)",
|
||||
"size": "$t(common.size)",
|
||||
"autoFitColumns": "ajusta les columnes automàticament",
|
||||
"followCurrentSong": "segueix la cançó actual",
|
||||
"displayType": "tipus de visualització",
|
||||
"itemGap": "espai entre elements (px)",
|
||||
"itemSize": "mida dels elements (px)",
|
||||
"tableColumns": "columnes de la taula"
|
||||
},
|
||||
"label": {
|
||||
"actions": "$t(common.action_other)",
|
||||
"album": "$t(entity.album_one)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"biography": "$t(common.biography)",
|
||||
"bitrate": "$t(common.bitrate)",
|
||||
"bpm": "$t(common.bpm)",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"codec": "$t(common.codec)",
|
||||
"duration": "$t(common.duration)",
|
||||
"favorite": "$t(common.favorite)",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"note": "$t(common.note)",
|
||||
"owner": "$t(common.owner)",
|
||||
"path": "$t(common.path)",
|
||||
"rating": "$t(common.rating)",
|
||||
"size": "$t(common.size)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"title": "$t(common.title)",
|
||||
"year": "$t(common.year)",
|
||||
"playCount": "compte de reproduccions",
|
||||
"releaseDate": "data de llançament",
|
||||
"dateAdded": "data d'addició",
|
||||
"trackNumber": "número de pista",
|
||||
"discNumber": "número de disc",
|
||||
"lastPlayed": "última reproducció",
|
||||
"rowIndex": "índex de files",
|
||||
"titleCombined": "$t(common.title) (combinat)"
|
||||
},
|
||||
"view": {
|
||||
"table": "taula",
|
||||
"card": "targeta",
|
||||
"grid": "quadrícula",
|
||||
"list": "llista",
|
||||
"poster": "pòster"
|
||||
}
|
||||
}
|
||||
},
|
||||
"filter": {
|
||||
"fromYear": "des de l'any",
|
||||
"releaseYear": "any de llançament",
|
||||
"toYear": "fins a l'any",
|
||||
"album": "$t(entity.album_one)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"biography": "biografia",
|
||||
"bitrate": "taxa de bits",
|
||||
"bpm": "bpm",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"comment": "comentari",
|
||||
"disc": "disc",
|
||||
"duration": "durada",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"id": "identificador",
|
||||
"name": "nom",
|
||||
"note": "nota",
|
||||
"owner": "$t(common.owner)",
|
||||
"random": "aleatori",
|
||||
"rating": "valoració",
|
||||
"search": "cercar",
|
||||
"title": "títol",
|
||||
"playCount": "compte de reproduccions",
|
||||
"releaseDate": "data de llançament",
|
||||
"mostPlayed": "els més reproduïts",
|
||||
"dateAdded": "data d'addició",
|
||||
"trackNumber": "pista",
|
||||
"communityRating": "valoració de la comunitat",
|
||||
"criticRating": "valoració dels crítics",
|
||||
"recentlyAdded": "afegit recentment",
|
||||
"recentlyPlayed": "reproduït recentment",
|
||||
"recentlyUpdated": "actualitzat recentment",
|
||||
"albumCount": "nombre de $t(entity.album_other)",
|
||||
"favorited": "preferits",
|
||||
"isCompilation": "és una compilació",
|
||||
"isFavorited": "és un preferit",
|
||||
"isPublic": "és públic",
|
||||
"isRated": "està qualificat",
|
||||
"isRecentlyPlayed": "s'ha reproduït fa poc",
|
||||
"lastPlayed": "última reproducció",
|
||||
"path": "ruta",
|
||||
"songCount": "nombre de cançons"
|
||||
},
|
||||
"player": {
|
||||
"muted": "silenciat",
|
||||
"repeat": "repetició d'una pista",
|
||||
"skip": "saltar",
|
||||
"stop": "parar",
|
||||
"queue_clear": "buidar la cua",
|
||||
"viewQueue": "veure la cua",
|
||||
"playbackFetchInProgress": "carregant cançons…",
|
||||
"playbackFetchNoResults": "no s'han trobat cançons",
|
||||
"playbackSpeed": "velocitat de reproducció",
|
||||
"playSimilarSongs": "reproduir cançons similars",
|
||||
"repeat_off": "repetició desactivada",
|
||||
"repeat_all": "repetició",
|
||||
"shuffle": "reproducció aleatòria",
|
||||
"shuffle_off": "reproducció aleatòria desactivada",
|
||||
"addLast": "afegeix al final",
|
||||
"addNext": "afegeix a continuació",
|
||||
"favorite": "marcar com a preferida",
|
||||
"mute": "silencia",
|
||||
"next": "següent",
|
||||
"play": "reprodueix",
|
||||
"playbackFetchCancel": "està trigant bastant... tanqueu la notificació per cancel·lar",
|
||||
"playRandom": "reproducció a l'atzar",
|
||||
"previous": "anterior",
|
||||
"queue_moveToBottom": "mou la selecció a l'inici",
|
||||
"queue_moveToTop": "mou la selecció al final",
|
||||
"queue_remove": "elimina la selecció",
|
||||
"skip_back": "salta enrere",
|
||||
"skip_forward": "salta endavant",
|
||||
"toggleFullscreenPlayer": "activa el reproductor de pantalla completa",
|
||||
"unfavorite": "elimina de preferits",
|
||||
"pause": "pausa"
|
||||
},
|
||||
"error": {
|
||||
"credentialsRequired": "credencials requerides",
|
||||
"genericError": "s'ha produït un error",
|
||||
"invalidServer": "servidor no vàlid",
|
||||
"localFontAccessDenied": "accés denegat als tipus de lletra locals",
|
||||
"networkError": "s'ha produït un error de xarxa",
|
||||
"openError": "no s'ha pogut obrir el fitxer",
|
||||
"remotePortError": "s'ha produït un error en intentar configurar el port del servidor remot",
|
||||
"serverNotSelectedError": "no s'ha seleccionat cap servidor",
|
||||
"sessionExpiredError": "la sessió ha caducat",
|
||||
"systemFontError": "s'ha produït un error en intentar obtenir els tipus de lletra del sistema",
|
||||
"remoteEnableError": "s'ha produït un error en intentar $t(common.enable) el servidor remot",
|
||||
"remotePortWarning": "reiniciar el servidor per aplicar el nou port",
|
||||
"serverRequired": "servidor requerit",
|
||||
"apiRouteError": "no es pot encaminar la sol·licitud",
|
||||
"audioDeviceFetchError": "hi ha hagut un error en obtenir els dispositius d'àudio",
|
||||
"authenticationFailed": "autenticació fallida",
|
||||
"badAlbum": "esteu veient aquesta pàgina perquè aquesta cançó no és part de cap àlbum. aquest problema pot passar si teniu una cançó al nivell superior de la vostra carpeta de música. jellyfin només agrupa pistes si són en una carpeta.",
|
||||
"badValue": "l'opció \"{{value}}\"és invàlida. aquest valor ja no existeix",
|
||||
"loginRateError": "massa intents d'inici de sessió, intenteu-ho de nou d'aquí uns segons",
|
||||
"mpvRequired": "Cal l'MPV",
|
||||
"notificationDenied": "s'han negat els permisos per enviar notificacions. aquesta opció no té cap efecte",
|
||||
"playbackError": "hi ha hagut un error en intentar reproduir el mitjà",
|
||||
"remoteDisableError": "hi ha hagut un error en intentar $t(common.disable) el servidor remot",
|
||||
"endpointNotImplementedError": "el punt final {{endpoint}} no està implementat per {{serverType}}"
|
||||
}
|
||||
}
|
||||
+39
-11
@@ -4,7 +4,7 @@
|
||||
"stop": "zastavit",
|
||||
"repeat": "opakovat",
|
||||
"queue_remove": "odebrat vybrané",
|
||||
"playRandom": "přehrát náhodné",
|
||||
"playRandom": "přehrát náhodně",
|
||||
"skip": "přeskočit",
|
||||
"previous": "předchozí",
|
||||
"toggleFullscreenPlayer": "přepnout celoobrazovkový přehrávač",
|
||||
@@ -124,7 +124,7 @@
|
||||
"hotkey_toggleShuffle": "přepnutí náhodného přehrávání",
|
||||
"theme": "motiv",
|
||||
"playbackStyle_description": "nastavení způsobu přehrávání pro přehrávač zvuku",
|
||||
"discordRichPresence_description": "povolit stav přehrávání v {{discord}} rich presence. Klíče obrázků jsou: {{icon}}, {{playing}}, {{paused}} ",
|
||||
"discordRichPresence_description": "povolit stav přehrávání v {{discord}} rich presence. Klíče obrázků jsou: {{icon}}, {{playing}}, {{paused}}",
|
||||
"mpvExecutablePath": "cesta ke spustitelnému souboru mpv",
|
||||
"audioDevice": "zvukové zařízení",
|
||||
"hotkey_rate2": "hodnocení 2 hvězdami",
|
||||
@@ -171,7 +171,7 @@
|
||||
"hotkey_zoomOut": "oddálení",
|
||||
"hotkey_unfavoriteCurrentSong": "zrušení oblíbení u $t(common.currentSong)",
|
||||
"hotkey_rate0": "vymazání hodnocení",
|
||||
"discordApplicationId": "aplikační id pro {{discord}}",
|
||||
"discordApplicationId": "id aplikace pro {{discord}}",
|
||||
"applicationHotkeys_description": "nastavení klávesových zkratek aplikace. přepněte pole pro nastavení jako globální zkratku (pouze na počítači)",
|
||||
"floatingQueueArea_description": "zobrazit ikonu přejetí myší na pravé straně obrazovky pro zobrazení fronty",
|
||||
"hotkey_volumeMute": "ztlumení",
|
||||
@@ -265,7 +265,19 @@
|
||||
"musicbrainz": "zobrazit odkazy na musicbrainz",
|
||||
"musicbrainz_description": "na stránkách umělců a alb, kde existuje mbid, zobrazit odkazy na musicbrainz",
|
||||
"neteaseTranslation": "Povolit překlady NetEase",
|
||||
"neteaseTranslation_description": "Pokud je povoleno, načte a zobrazí přeložené texty ze služby NetEase, pokud jsou dostupné."
|
||||
"neteaseTranslation_description": "Pokud je povoleno, načte a zobrazí přeložené texty ze služby NetEase, pokud jsou dostupné.",
|
||||
"preferLocalLyrics": "preferovat místní texty",
|
||||
"preferLocalLyrics_description": "preferovat místní texty před vzdálenými, pokud jsou dostupné",
|
||||
"discordPausedStatus": "zobrazit rich presence při pozastavení",
|
||||
"discordPausedStatus_description": "pokud je povoleno, bude při pozastavení přehrávače zobrazen stav",
|
||||
"preservePitch": "zachovat výšku",
|
||||
"preservePitch_description": "zachová výšku při úpravě rychlosti přehrávání",
|
||||
"notify": "povolit oznámení o skladbách",
|
||||
"notify_description": "zobrazit oznámení při změně aktuální skladby",
|
||||
"discordDisplayType": "typ zobrazení stavu {{discord}}",
|
||||
"discordDisplayType_description": "změní, co posloucháte, ve vašem stavu",
|
||||
"discordDisplayType_songname": "název skladby",
|
||||
"discordDisplayType_artistname": "jména umělců"
|
||||
},
|
||||
"action": {
|
||||
"editPlaylist": "upravit $t(entity.playlist_one)",
|
||||
@@ -373,7 +385,7 @@
|
||||
"size": "velikost",
|
||||
"biography": "biografie",
|
||||
"note": "poznámka",
|
||||
"albumGain": "zisk (gain) alba",
|
||||
"albumGain": "gain alba",
|
||||
"albumPeak": "vrchol alba",
|
||||
"close": "zavřít",
|
||||
"mbid": "ID MusicBrainz",
|
||||
@@ -385,14 +397,20 @@
|
||||
"preview": "náhled",
|
||||
"translation": "překlad",
|
||||
"additionalParticipants": "další přispívající",
|
||||
"tags": "štítky"
|
||||
"tags": "štítky",
|
||||
"viewReleaseNotes": "zobrazit seznam změn",
|
||||
"newVersion": "byla nainstalována nová verze ({{version}})",
|
||||
"bitDepth": "bitová hloubka",
|
||||
"sampleRate": "vzorkovací frekvence"
|
||||
},
|
||||
"table": {
|
||||
"config": {
|
||||
"view": {
|
||||
"card": "karta",
|
||||
"table": "tabulka",
|
||||
"poster": "plakát"
|
||||
"poster": "plakát",
|
||||
"list": "seznam",
|
||||
"grid": "mřížka"
|
||||
},
|
||||
"general": {
|
||||
"displayType": "typ zobrazení",
|
||||
@@ -485,7 +503,8 @@
|
||||
"badAlbum": "tuto stránku vidíte, protože tato skladba není součástí alba. tento problém může nastat, pokud máte skladbu na nejvyšší úrovni vaší složky s hudbou. jellyfin seskupuje skladby pouze, pokud se nacházejí ve složce.",
|
||||
"networkError": "vyskytla se chyba sítě",
|
||||
"openError": "nepodařilo se otevřít soubor",
|
||||
"badValue": "neplatná možnost „{{value}}“. tato možnost již neexistuje"
|
||||
"badValue": "neplatná možnost „{{value}}“. tato možnost již neexistuje",
|
||||
"notificationDenied": "oprávnění k posílání oznámení byla zamítnuta. toto nastavení nemá žádný vliv"
|
||||
},
|
||||
"filter": {
|
||||
"mostPlayed": "nejvíce přehráváno",
|
||||
@@ -544,7 +563,8 @@
|
||||
"home": "$t(common.home)",
|
||||
"artists": "$t(entity.artist_other)",
|
||||
"albumArtists": "$t(entity.albumArtist_other)",
|
||||
"shared": "$t(entity.playlist_other) sdíleny"
|
||||
"shared": "$t(entity.playlist_other) sdíleny",
|
||||
"myLibrary": "moje knihovna"
|
||||
},
|
||||
"fullscreenPlayer": {
|
||||
"config": {
|
||||
@@ -579,7 +599,9 @@
|
||||
"openBrowserDevtools": "otevřít vývojářské nástroje",
|
||||
"quit": "$t(common.quit)",
|
||||
"goBack": "přejít zpět",
|
||||
"goForward": "přejít vpřed"
|
||||
"goForward": "přejít vpřed",
|
||||
"privateModeOff": "vypnout soukromý režim",
|
||||
"privateModeOn": "zapnout soukromý režim"
|
||||
},
|
||||
"contextMenu": {
|
||||
"addToPlaylist": "$t(action.addToPlaylist)",
|
||||
@@ -720,7 +742,8 @@
|
||||
},
|
||||
"queryEditor": {
|
||||
"input_optionMatchAll": "shoda všeho",
|
||||
"input_optionMatchAny": "shoda libovolného"
|
||||
"input_optionMatchAny": "shoda libovolného",
|
||||
"title": "editor dotazů"
|
||||
},
|
||||
"lyricSearch": {
|
||||
"input_name": "$t(common.name)",
|
||||
@@ -739,6 +762,11 @@
|
||||
"expireInvalid": "čas vypršení musí být v budoucnosti",
|
||||
"setExpiration": "nastavit vypršení",
|
||||
"createFailed": "nepodařilo se vytvořit sdílení (je sdílení povoleno?)"
|
||||
},
|
||||
"privateMode": {
|
||||
"enabled": "soukromý režim povolen, stav přehrávání je nyní skryt před externími integracemi",
|
||||
"disabled": "soukromý režim povolen, stav přehrávání je nyní viditelný pro externími integrace",
|
||||
"title": "soukromý režim"
|
||||
}
|
||||
},
|
||||
"entity": {
|
||||
|
||||
+45
-12
@@ -20,7 +20,8 @@
|
||||
"openIn": {
|
||||
"lastfm": "In Last.fm öffnen",
|
||||
"musicbrainz": "In MusicBrainz öffnen"
|
||||
}
|
||||
},
|
||||
"moveToNext": "nach unten verschieben"
|
||||
},
|
||||
"common": {
|
||||
"backward": "rückwärts",
|
||||
@@ -113,7 +114,12 @@
|
||||
"trackPeak": "Track-Spitzenpegel",
|
||||
"codec": "Codec",
|
||||
"albumPeak": "Album-Spitzenpegel",
|
||||
"albumGain": "Album-Pegelverstärkung"
|
||||
"albumGain": "Album-Pegelverstärkung",
|
||||
"tags": "tags",
|
||||
"viewReleaseNotes": "Release Notes anzeigen",
|
||||
"newVersion": "eine neue Version wurde installiert ({{version}})",
|
||||
"bitDepth": "Bittiefe",
|
||||
"sampleRate": "Abtastrate"
|
||||
},
|
||||
"error": {
|
||||
"remotePortWarning": "Starten Sie den Server neu, um den neuen Port anzuwenden",
|
||||
@@ -137,7 +143,9 @@
|
||||
"loginRateError": "Zu viele Anmeldeversuche, bitte versuche es in einigen Sekunden erneut",
|
||||
"badAlbum": "Sie sehen diese Seite, weil dieses Lied nicht Teil eines Albums ist. Wahrscheinlich sehen Sie dieses Problem, wenn Sie einen Song in Ihrem Musikordner auf oberster Ebene haben. Jellyfin gruppiert nur Songs, wenn sie sich in einem Ordner befinden.",
|
||||
"networkError": "ein Netzwerkfehler ist aufgetreten",
|
||||
"openError": "datei kann nicht geöffnet werden"
|
||||
"openError": "datei kann nicht geöffnet werden",
|
||||
"badValue": "ungültige option \"{{value}}\". Dieser Wert existiert nicht mehr",
|
||||
"notificationDenied": "Berechtigungen über Benachrichtigungen wurden verweigert. Diese Einstellung hat keinen Effekt"
|
||||
},
|
||||
"filter": {
|
||||
"mostPlayed": "Meistgespielt",
|
||||
@@ -237,7 +245,8 @@
|
||||
"description": "Beschreibung",
|
||||
"setExpiration": "Ablaufdatum setzen",
|
||||
"expireInvalid": "Ablaufdatum muss in der Zukunft liegen",
|
||||
"allowDownloading": "Herunterladen zulassen"
|
||||
"allowDownloading": "Herunterladen zulassen",
|
||||
"success": "Link in die Zwischenablage kopiert (oder hier klicken um zu öffnen)"
|
||||
}
|
||||
},
|
||||
"entity": {
|
||||
@@ -357,12 +366,15 @@
|
||||
"lyricAlignment": "Songtext-Ausrichtung",
|
||||
"useImageAspectRatio": "Bildseitenverhältnis verwenden",
|
||||
"lyricGap": "Songtext-Lücke",
|
||||
"dynamicIsImage": "Hintergrundbild aktivieren"
|
||||
"dynamicIsImage": "Hintergrundbild aktivieren",
|
||||
"dynamicImageBlur": "Größe der Bildunschärfe",
|
||||
"lyricOffset": "Zeitversetzung des Liedtexts (ms)"
|
||||
},
|
||||
"upNext": "als nächstes",
|
||||
"lyrics": "Songtexte",
|
||||
"related": "Ähnliche",
|
||||
"noLyrics": "Keine Liedtexte gefunden"
|
||||
"noLyrics": "Keine Liedtexte gefunden",
|
||||
"visualizer": "visualizer"
|
||||
},
|
||||
"appMenu": {
|
||||
"selectServer": "Server auswählen",
|
||||
@@ -415,7 +427,8 @@
|
||||
"removeFromQueue": "$t(action.removeFromQueue)",
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"download": "Download",
|
||||
"playSimilarSongs": "$t(player.playSimilarSongs)"
|
||||
"playSimilarSongs": "$t(player.playSimilarSongs)",
|
||||
"moveToNext": "$t(action.moveToNext)"
|
||||
},
|
||||
"sidebar": {
|
||||
"nowPlaying": "läuft gerade",
|
||||
@@ -429,7 +442,8 @@
|
||||
"home": "$t(common.home)",
|
||||
"artists": "$t(entity.artist_other)",
|
||||
"albumArtists": "$t(entity.albumArtist_other)",
|
||||
"shared": "$t(entity.playlist_other) geteilt"
|
||||
"shared": "$t(entity.playlist_other) geteilt",
|
||||
"myLibrary": "meine bibliothek"
|
||||
},
|
||||
"setting": {
|
||||
"playbackTab": "Wiedergabe",
|
||||
@@ -513,10 +527,11 @@
|
||||
"unfavorite": "Aus Favoriten entfernen",
|
||||
"skip_forward": "Vorspulen",
|
||||
"skip": "Überspringen",
|
||||
"playSimilarSongs": "Ähnliche Lieder abspielen"
|
||||
"playSimilarSongs": "Ähnliche Lieder abspielen",
|
||||
"viewQueue": "Warteschlange anzeigen"
|
||||
},
|
||||
"setting": {
|
||||
"audioDevice_description": "Wählen Sie das Audiogerät aus, das für die Wiedergabe verwendet werden soll (nur Webplayer).",
|
||||
"audioDevice_description": "Wählen Sie das Audiogerät aus, das für die Wiedergabe verwendet werden soll (nur Webplayer)",
|
||||
"audioExclusiveMode": "Audio-Exklusivmodus",
|
||||
"audioDevice": "Audiogerät",
|
||||
"accentColor": "Akzentfarbe",
|
||||
@@ -670,12 +685,30 @@
|
||||
"windowBarStyle_description": "Wähle den Stil der Windows-Leiste",
|
||||
"hotkey_toggleCurrentSongFavorite": "$t(common.currentSong) zu Favoriten hinzufügen",
|
||||
"clearQueryCache_description": "\"Weiches\" Zurücksetzen. Dies wird Playlisten, Musik-Metadaten und gespeicherte Liedtexte zurücksetzen, Zugangsinformationen und zwischengespeicherte Bilder werden behalten",
|
||||
"discordRichPresence_description": "Zeige deinen Wiedergabe-Status in {{discord}} als rich presence an. Angezeigte Bilder sind: {{icon}}, {{playing}}, und {{paused}} ",
|
||||
"discordRichPresence_description": "Zeige deinen Wiedergabe-Status in {{discord}} als rich presence an. Angezeigte Bilder sind: {{icon}}, {{playing}}, und {{paused}}",
|
||||
"clearCache": "Browser-Zwischenspeicher löschen",
|
||||
"clearQueryCache": "feishins Zwischenspeicher leeren",
|
||||
"clearCache_description": "Hartes Zurücksetzen. Neben feishins Zwischenspeicher wird auch der des Browsers gelöscht (Bilder und andere Daten). Zugangsinformationen und Einstellungen werden behalten",
|
||||
"sidePlayQueueStyle": "Wiedergabelistenstil in der Seitenleiste",
|
||||
"zoom_description": "Setzt den Zoom (in %) für das Programm",
|
||||
"zoom": "Zoom"
|
||||
"zoom": "Zoom",
|
||||
"albumBackground": "Album Hintergrund",
|
||||
"customCss": "Benutzerdefiniert css",
|
||||
"homeConfiguration": "Startseite Konfiguration",
|
||||
"lastfmApiKey": "{{lastfm}} API-Schlüssel",
|
||||
"lastfmApiKey_description": "Der API-Schlüssel für {{lastfm}}. wird für benötigt",
|
||||
"discordListening": "Status als hört zu anzeigen",
|
||||
"discordListening_description": "Status als hört zu statt als spielt anzeigen",
|
||||
"lastfm": "zeige last.fm links",
|
||||
"lastfm_description": "zeige links zu last.fm auf dem Künstler/Album-Seiten",
|
||||
"musicbrainz": "Zeig musicbrainz links",
|
||||
"customCssEnable": "aktiviere Benutzerdefinierte css",
|
||||
"albumBackground_description": "fügt ein Hintergrundbild für die Albumseiten hinzu, welche das Albumcover zeigen",
|
||||
"albumBackgroundBlur": "Größe der Album-Bildunschärfe",
|
||||
"albumBackgroundBlur_description": "passt die Stärke der Unschärfe an, welche auf das Hintergrundbild des Albums angewandt wird",
|
||||
"clearCacheSuccess": "Cache erfolgreich geleert",
|
||||
"contextMenu": "Kontextmenü-Einstellungen (Rechtsklick)",
|
||||
"customCssEnable_description": "ermöglicht das Schreiben benutzerdefinierten CSS.",
|
||||
"doubleClickBehavior": "bei Doppelklick alle gesuchten Tracks zur Warteschlange hinzufügen"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,6 +36,7 @@
|
||||
"ascending": "ascending",
|
||||
"backward": "backward",
|
||||
"biography": "biography",
|
||||
"bitDepth": "bit depth",
|
||||
"bitrate": "bitrate",
|
||||
"bpm": "bpm",
|
||||
"cancel": "cancel",
|
||||
@@ -99,6 +100,7 @@
|
||||
"resetToDefault": "reset to default",
|
||||
"restartRequired": "restart required",
|
||||
"right": "right",
|
||||
"sampleRate": "sample rate",
|
||||
"save": "save",
|
||||
"saveAndReplace": "save and replace",
|
||||
"saveAs": "save as",
|
||||
@@ -171,6 +173,7 @@
|
||||
"loginRateError": "too many login attempts, please try again in a few seconds",
|
||||
"mpvRequired": "MPV required",
|
||||
"networkError": "a network error occurred",
|
||||
"notificationDenied": "permissions for notifications were denied. this setting has no effect",
|
||||
"openError": "could not open file",
|
||||
"playbackError": "an error occurred when trying to play the media",
|
||||
"remoteDisableError": "an error occurred when trying to $t(common.disable) the remote server",
|
||||
@@ -224,7 +227,11 @@
|
||||
"songCount": "song count",
|
||||
"title": "title",
|
||||
"toYear": "to year",
|
||||
"trackNumber": "track"
|
||||
"trackNumber": "track",
|
||||
"createdAt": "created at",
|
||||
"updatedAt": "updated at",
|
||||
"type": "type",
|
||||
"email": "email"
|
||||
},
|
||||
"form": {
|
||||
"addServer": {
|
||||
@@ -285,6 +292,11 @@
|
||||
"updateServer": {
|
||||
"success": "server updated successfully",
|
||||
"title": "update server"
|
||||
},
|
||||
"privateMode": {
|
||||
"enabled": "private mode enabled, playback status is now hidden from external integrations",
|
||||
"disabled": "private mode disabled, playback status is now visible to enabled external integrations",
|
||||
"title": "private mode"
|
||||
}
|
||||
},
|
||||
"page": {
|
||||
@@ -318,6 +330,8 @@
|
||||
"goBack": "go back",
|
||||
"goForward": "go forward",
|
||||
"manageServers": "manage servers",
|
||||
"privateModeOff": "turn off private mode",
|
||||
"privateModeOn": "turn on private mode",
|
||||
"openBrowserDevtools": "open browser devtools",
|
||||
"quit": "$t(common.quit)",
|
||||
"selectServer": "select server",
|
||||
@@ -354,6 +368,8 @@
|
||||
"setRating": "$t(action.setRating)",
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"shareItem": "share item",
|
||||
"goToAlbum": "go to $t(entity.album_one)",
|
||||
"goToAlbumArtist": "go to $t(entity.albumArtist_one)",
|
||||
"showDetails": "get info"
|
||||
},
|
||||
"fullscreenPlayer": {
|
||||
@@ -514,16 +530,22 @@
|
||||
"disableLibraryUpdateOnStartup": "disable checking for new versions on startup",
|
||||
"discordApplicationId": "{{discord}} application id",
|
||||
"discordApplicationId_description": "the application id for {{discord}} rich presence (defaults to {{defaultId}})",
|
||||
"discordPausedStatus": "show rich presence when paused",
|
||||
"discordPausedStatus_description": "when enabled, status will show when player is paused",
|
||||
"discordIdleStatus": "show rich presence idle status",
|
||||
"discordIdleStatus_description": "when enabled, update status while player is idle",
|
||||
"discordListening": "show status as listening",
|
||||
"discordListening_description": "show status as listening instead of playing",
|
||||
"discordRichPresence": "{{discord}} rich presence",
|
||||
"discordRichPresence_description": "enable playback status in {{discord}} rich presence. Image keys are: {{icon}}, {{playing}}, and {{paused}} ",
|
||||
"discordRichPresence_description": "enable playback status in {{discord}} rich presence. Image keys are: {{icon}}, {{playing}}, and {{paused}}",
|
||||
"discordServeImage": "serve {{discord}} images from server",
|
||||
"discordServeImage_description": "share cover art for {{discord}} rich presence from server itself, only available for jellyfin and navidrome",
|
||||
"discordUpdateInterval": "{{discord}} rich presence update interval",
|
||||
"discordUpdateInterval_description": "the time in seconds between each update (minimum 15 seconds)",
|
||||
"discordDisplayType": "{{discord}} presence display type",
|
||||
"discordDisplayType_description": "changes what you are listening to in your status",
|
||||
"discordDisplayType_songname": "song name",
|
||||
"discordDisplayType_artistname": "artist name(s)",
|
||||
"doubleClickBehavior": "queue all searched tracks when double clicking",
|
||||
"doubleClickBehavior_description": "if true, all matching tracks in a track search will be queued. otherwise, only the clicked one will be queued",
|
||||
"enableRemote": "enable remote control server",
|
||||
@@ -536,6 +558,8 @@
|
||||
"floatingQueueArea_description": "display a hover icon on the right side of the screen to view the play queue",
|
||||
"followLyric": "follow current lyric",
|
||||
"followLyric_description": "scroll the lyric to the current playing position",
|
||||
"preferLocalLyrics": "prefer local lyrics",
|
||||
"preferLocalLyrics_description": "prefer local lyrics over remote lyrics when available",
|
||||
"font": "font",
|
||||
"font_description": "sets the font to use for the application",
|
||||
"fontType": "font type",
|
||||
@@ -560,6 +584,7 @@
|
||||
"hotkey_favoritePreviousSong": "favorite $t(common.previousSong)",
|
||||
"hotkey_globalSearch": "global search",
|
||||
"hotkey_localSearch": "in-page search",
|
||||
"hotkey_navigateHome": "navigate to home",
|
||||
"hotkey_playbackNext": "next track",
|
||||
"hotkey_playbackPause": "pause",
|
||||
"hotkey_playbackPlay": "play",
|
||||
@@ -601,6 +626,8 @@
|
||||
"lyricFetchProvider_description": "select the providers to fetch lyrics from. the order of the providers is the order in which they will be queried",
|
||||
"lyricOffset": "lyric offset (ms)",
|
||||
"lyricOffset_description": "offset the lyric by the specified amount of milliseconds",
|
||||
"notify": "enable song notifications",
|
||||
"notify_description": "show notifications when changing the current song",
|
||||
"minimizeToTray": "minimize to tray",
|
||||
"minimizeToTray_description": "minimize the application to the system tray",
|
||||
"minimumScrobblePercentage": "minimum scrobble duration (percentage)",
|
||||
@@ -674,6 +701,8 @@
|
||||
"skipPlaylistPage_description": "when navigating to a playlist, go to the playlist song list page instead of the default page",
|
||||
"startMinimized": "start minimized",
|
||||
"startMinimized_description": "start the application in system tray",
|
||||
"preventSleepOnPlayback": "prevent sleep on playback",
|
||||
"preventSleepOnPlayback_description": "prevent the display from sleeping while music is playing",
|
||||
"theme": "theme",
|
||||
"theme_description": "sets the theme to use for the application",
|
||||
"themeDark": "theme (dark)",
|
||||
@@ -703,6 +732,8 @@
|
||||
"volumeWidth_description": "the width of the volume slider",
|
||||
"webAudio": "use web audio",
|
||||
"webAudio_description": "use web audio. this enables advanced features like replaygain. disable if you experience otherwise",
|
||||
"preservePitch": "preserve pitch",
|
||||
"preservePitch_description": "preserves pitch when modifying playback speed",
|
||||
"windowBarStyle": "window bar style",
|
||||
"windowBarStyle_description": "select the style of the window bar",
|
||||
"zoom": "zoom percentage",
|
||||
|
||||
@@ -120,7 +120,7 @@
|
||||
"hotkey_toggleShuffle": "alterna aleatorio",
|
||||
"theme": "tema",
|
||||
"playbackStyle_description": "selecciona el estilo de reproducción a usar por el reproductor de audio",
|
||||
"discordRichPresence_description": "activa el estado de reproducción en el estado de actividad de {{discord}}. Las teclas de imagen son: {{icon}}, {{playing}}, y {{paused}} ",
|
||||
"discordRichPresence_description": "activa el estado de reproducción en el estado de actividad de {{discord}}. Las teclas de imagen son: {{icon}}, {{playing}}, y {{paused}}",
|
||||
"mpvExecutablePath": "ruta del ejecutable mpv",
|
||||
"audioDevice": "dispositivo de audio",
|
||||
"hotkey_rate2": "calificar con 2 estrellas",
|
||||
@@ -265,7 +265,22 @@
|
||||
"musicbrainz": "Mostrar enlaces de MusicBrainz",
|
||||
"musicbrainz_description": "Muestra enlaces a MusicBrainz en las páginas de artistas/álbumes, donde exista mbid",
|
||||
"neteaseTranslation": "Activar traducciones de NetEase",
|
||||
"neteaseTranslation_description": "Cuando se habilita, busca y muestra letras traducidas desde NetEase si está disponible."
|
||||
"neteaseTranslation_description": "Cuando se habilita, busca y muestra letras traducidas desde NetEase si está disponible.",
|
||||
"preferLocalLyrics_description": "Prefiere letras locales sobre letras remotas cuando esté disponible",
|
||||
"preferLocalLyrics": "Preferir letras locales",
|
||||
"discordPausedStatus": "Mostrar estado de actividad cuando esté en pausa",
|
||||
"discordPausedStatus_description": "Cuando está activado, el estado mostrará cuando el reproductor esté en pausa",
|
||||
"preservePitch": "Mantener el tono",
|
||||
"preservePitch_description": "Mantiene el tono cuando se modifica la velocidad de reproducción",
|
||||
"notify": "Activar notificaciones de canciones",
|
||||
"notify_description": "Muestra notificaciones cuando se cambia la canción actual",
|
||||
"discordDisplayType_songname": "Nombre de la canción",
|
||||
"discordDisplayType_artistname": "Nombre(s) del artista(s)",
|
||||
"discordDisplayType_description": "Cambia qué estás escuchando en tu estado",
|
||||
"discordDisplayType": "Tipo de pantalla de actividad de {{discord}}",
|
||||
"hotkey_navigateHome": "Navegar a inicio",
|
||||
"preventSleepOnPlayback": "Evitar entrar en reposo durante la reproducción",
|
||||
"preventSleepOnPlayback_description": "Evita que la pantalla entre en reposo mientras se está reproduciendo música"
|
||||
},
|
||||
"action": {
|
||||
"editPlaylist": "editar $t(entity.playlist_one)",
|
||||
@@ -385,7 +400,11 @@
|
||||
"preview": "Vista previa",
|
||||
"translation": "traducción",
|
||||
"additionalParticipants": "Participantes adicionales",
|
||||
"tags": "Etiquetas"
|
||||
"tags": "Etiquetas",
|
||||
"newVersion": "Una nueva versión ha sido instalada ({{version}})",
|
||||
"viewReleaseNotes": "Ver notas de lanzamiento",
|
||||
"bitDepth": "Profundidad de bit",
|
||||
"sampleRate": "Frecuencia de muestreo"
|
||||
},
|
||||
"error": {
|
||||
"remotePortWarning": "reiniciar el servidor para aplicar el nuevo puerto",
|
||||
@@ -410,7 +429,8 @@
|
||||
"badAlbum": "Estás viendo esta página porque esta canción no forma parte de un álbum. Este problema puede ocurrir si tienes una canción en el nivel superior de tu carpeta de música. Jellyfin solo agrupa pistas si están en una carpeta.",
|
||||
"networkError": "Ocurrió un error de red",
|
||||
"openError": "No se pudo abrir el archivo",
|
||||
"badValue": "Opción inválida \"{{value}}\". Este valor ya no existe"
|
||||
"badValue": "Opción inválida \"{{value}}\". Este valor ya no existe",
|
||||
"notificationDenied": "Se denegaron los permisos para notificaciones. Esta configuración no tiene efecto"
|
||||
},
|
||||
"filter": {
|
||||
"mostPlayed": "más reproducido",
|
||||
@@ -469,7 +489,8 @@
|
||||
"home": "$t(common.home)",
|
||||
"artists": "$t(entity.artist_other)",
|
||||
"albumArtists": "$t(entity.albumArtist_other)",
|
||||
"shared": "compartido $t(entity.playlist_other)"
|
||||
"shared": "compartido $t(entity.playlist_other)",
|
||||
"myLibrary": "Mi biblioteca"
|
||||
},
|
||||
"appMenu": {
|
||||
"selectServer": "seleccionar servidor",
|
||||
@@ -481,7 +502,9 @@
|
||||
"openBrowserDevtools": "abrir herramientas de desarrollador del navegador",
|
||||
"quit": "$t(common.quit)",
|
||||
"goBack": "retroceder",
|
||||
"goForward": "avanzar"
|
||||
"goForward": "avanzar",
|
||||
"privateModeOff": "Apagar modo privado",
|
||||
"privateModeOn": "Encender modo privado"
|
||||
},
|
||||
"contextMenu": {
|
||||
"addToPlaylist": "$t(action.addToPlaylist)",
|
||||
@@ -505,7 +528,9 @@
|
||||
"playSimilarSongs": "$t(player.playSimilarSongs)",
|
||||
"download": "descargar",
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"moveToNext": "$t(action.moveToNext)"
|
||||
"moveToNext": "$t(action.moveToNext)",
|
||||
"goToAlbum": "Ir a $t(entity.album_one)",
|
||||
"goToAlbumArtist": "Ir a $t(entity.albumArtist_one)"
|
||||
},
|
||||
"home": {
|
||||
"mostPlayed": "más reproducidos",
|
||||
@@ -655,7 +680,8 @@
|
||||
},
|
||||
"queryEditor": {
|
||||
"input_optionMatchAll": "coincidir todos",
|
||||
"input_optionMatchAny": "coincidir cualquiera"
|
||||
"input_optionMatchAny": "coincidir cualquiera",
|
||||
"title": "Editor de consultas"
|
||||
},
|
||||
"shareItem": {
|
||||
"createFailed": "No se pudo crear el recurso compartido (¿está habilitado el uso compartido?)",
|
||||
@@ -664,6 +690,11 @@
|
||||
"setExpiration": "Establecer expiración",
|
||||
"success": "Enlace de compartición copiado al portapapeles (o pulsa aquí para abrir)",
|
||||
"expireInvalid": "La expiración debe ser en el futuro"
|
||||
},
|
||||
"privateMode": {
|
||||
"enabled": "Modo privado activado, el estado de reproducción ahora está oculto de integraciones externas",
|
||||
"disabled": "Modo privado desactivado, el estado de reproducción ahora es visible a las integraciones externas habilitadas",
|
||||
"title": "Modo privado"
|
||||
}
|
||||
},
|
||||
"table": {
|
||||
@@ -737,7 +768,9 @@
|
||||
"view": {
|
||||
"card": "tarjeta",
|
||||
"table": "tabla",
|
||||
"poster": "cartel"
|
||||
"poster": "cartel",
|
||||
"list": "Lista",
|
||||
"grid": "Cuadrícula"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@@ -90,7 +90,11 @@
|
||||
"trackGain": "raidan vahvistus (gain)",
|
||||
"trackPeak": "kappaleen huippu (peak)",
|
||||
"additionalParticipants": "muut osallistujat",
|
||||
"tags": "tägit"
|
||||
"tags": "tägit",
|
||||
"newVersion": "uusi versio on asennettu ({{version}})",
|
||||
"viewReleaseNotes": "katsele julkaisutietoja",
|
||||
"bitDepth": "bittisyvyys",
|
||||
"sampleRate": "näytteenottotaajuus"
|
||||
},
|
||||
"entity": {
|
||||
"album_one": "albumi",
|
||||
@@ -176,7 +180,8 @@
|
||||
"playbackError": "mediaa toistaessa tapahtui virhe",
|
||||
"remotePortWarning": "käynnistä palvelin uudestaan ottaaksesi uuden portin käyttöön",
|
||||
"endpointNotImplementedError": "päätepiste {{endpoint}} ei ole toteutettu {{serverType}} varten",
|
||||
"badValue": "kelpaamaton optio \"{{value}}\". tätä arvoa ei ole enää olemassa"
|
||||
"badValue": "kelpaamaton optio \"{{value}}\". tätä arvoa ei ole enää olemassa",
|
||||
"notificationDenied": "luvat ilmouilmoituksia varten evättiin. tällä asetuksella ei ole vaikutusta"
|
||||
},
|
||||
"filter": {
|
||||
"album": "$t(entity.album_one)",
|
||||
@@ -279,7 +284,8 @@
|
||||
},
|
||||
"queryEditor": {
|
||||
"input_optionMatchAny": "sovita joku",
|
||||
"input_optionMatchAll": "sovita kaikki"
|
||||
"input_optionMatchAll": "sovita kaikki",
|
||||
"title": "kyselyeditori"
|
||||
}
|
||||
},
|
||||
"setting": {
|
||||
@@ -359,7 +365,7 @@
|
||||
"doubleClickBehavior": "lisää kaikki haetut kappaleet soittojonoon tuplaklikkauksella",
|
||||
"discordUpdateInterval_description": "päivitysväli sekunnteina (vähintään 15 sekunttia)",
|
||||
"discordRichPresence": "{{discord}} rich presence",
|
||||
"discordRichPresence_description": "ota toiston tila käyttöön {{discord}}n rich presence-toiminnossa. Kuvakkeiden avaimet ovat {{icon}}, {{playing}} ja {{paused}}. ",
|
||||
"discordRichPresence_description": "ota toiston tila käyttöön {{discord}}n rich presence-toiminnossa. Kuvakkeiden avaimet ovat {{icon}}, {{playing}} ja {{paused}}",
|
||||
"discordUpdateInterval": "{{discord}} rich presencen päivitysväli",
|
||||
"enableRemote": "aktivoi etäohjauspalvelin",
|
||||
"externalLinks_description": "ottaa ulkoiset linkit (Last.fm, MusicBrainz) artistien/albumien sivuilla",
|
||||
@@ -515,7 +521,15 @@
|
||||
"lastfm_description": "näytä linkit last.fm sivulle artistin/albumin sivuilla",
|
||||
"musicbrainz": "näytä musicbrainz linkit",
|
||||
"neteaseTranslation": "Ota NetEasen käännökset käyttöön",
|
||||
"neteaseTranslation_description": "Käytöss ollessa noutaa ja näyttää käännetyt sanat NetEasesta, jos ne ovat saatavilla."
|
||||
"neteaseTranslation_description": "Käytöss ollessa noutaa ja näyttää käännetyt sanat NetEasesta, jos ne ovat saatavilla.",
|
||||
"preferLocalLyrics_description": "suosi paikallisia sanoituksia ulkoisten sijasta, kun saatavilla",
|
||||
"preferLocalLyrics": "suosi paikallisia sanoituksia",
|
||||
"discordPausedStatus": "näytä rich presence tauotettuna",
|
||||
"discordPausedStatus_description": "ollessak käytössä, status näyttää milloin soitin on tautotettuna",
|
||||
"preservePitch": "säilytä sävelkorkeus",
|
||||
"preservePitch_description": "säilytä sävelkorkeus toistonopeutta muokatessa",
|
||||
"notify": "käytä kappaleen ilmoituksia",
|
||||
"notify_description": "näytä limoituksia, kun vaihdetaan nykyistä kappaletta"
|
||||
},
|
||||
"page": {
|
||||
"itemDetail": {
|
||||
@@ -584,7 +598,8 @@
|
||||
"home": "$t(common.home)",
|
||||
"nowPlaying": "nyt soi",
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"search": "$t(common.search)"
|
||||
"search": "$t(common.search)",
|
||||
"myLibrary": "oma kirjasto"
|
||||
},
|
||||
"setting": {
|
||||
"generalTab": "yleinen",
|
||||
@@ -745,7 +760,9 @@
|
||||
"view": {
|
||||
"table": "taulukko",
|
||||
"card": "kortti",
|
||||
"poster": "juliste"
|
||||
"poster": "juliste",
|
||||
"grid": "ruudukko",
|
||||
"list": "lista"
|
||||
}
|
||||
},
|
||||
"column": {
|
||||
|
||||
+80
-47
@@ -12,8 +12,8 @@
|
||||
"favorite": "favori",
|
||||
"next": "suivant",
|
||||
"shuffle": "lecture aléatoire",
|
||||
"playbackFetchNoResults": "aucune chansons trouvées",
|
||||
"playbackFetchInProgress": "chargement des chansons…",
|
||||
"playbackFetchNoResults": "aucun titre trouvé",
|
||||
"playbackFetchInProgress": "chargement des titres…",
|
||||
"addNext": "ajouter ensuite",
|
||||
"playbackSpeed": "vitesse de lecture",
|
||||
"playbackFetchCancel": "cela prend du temps… fermez la notification pour annuler",
|
||||
@@ -29,7 +29,7 @@
|
||||
"skip_forward": "avancer",
|
||||
"pause": "pause",
|
||||
"unfavorite": "retirer des favoris",
|
||||
"playSimilarSongs": "jouer des chansons similaires",
|
||||
"playSimilarSongs": "jouer des titres similaires",
|
||||
"viewQueue": "voir la file d'attente"
|
||||
},
|
||||
"action": {
|
||||
@@ -60,7 +60,7 @@
|
||||
"backward": "en arrière",
|
||||
"increase": "augmenter",
|
||||
"rating": "note",
|
||||
"bpm": "bpm",
|
||||
"bpm": "BPM",
|
||||
"refresh": "rafraichir",
|
||||
"unknown": "inconnu",
|
||||
"areYouSure": "êtes-vous sûr ?",
|
||||
@@ -81,7 +81,7 @@
|
||||
"manage": "gérer",
|
||||
"limit": "limite",
|
||||
"minimize": "minimiser",
|
||||
"modified": "modifier",
|
||||
"modified": "modifié",
|
||||
"duration": "durée",
|
||||
"name": "nom",
|
||||
"maximize": "agrandir",
|
||||
@@ -100,6 +100,9 @@
|
||||
"cancel": "annuler",
|
||||
"forceRestartRequired": "redémarrer pour appliquer les changements… fermer la notification pour redémarrer",
|
||||
"setting": "paramètre",
|
||||
"setting_one": "paramètre",
|
||||
"setting_many": "",
|
||||
"setting_other": "paramètres",
|
||||
"version": "version",
|
||||
"title": "titre",
|
||||
"filter_one": "filtre",
|
||||
@@ -150,7 +153,11 @@
|
||||
"codec": "codec",
|
||||
"translation": "traduction",
|
||||
"additionalParticipants": "participants additionnels",
|
||||
"tags": "tags"
|
||||
"tags": "tags",
|
||||
"newVersion": "une nouvelle version vient d'être installée ({{version}})",
|
||||
"viewReleaseNotes": "voir la note de version",
|
||||
"sampleRate": "taux d'échantillonnage",
|
||||
"bitDepth": "bit par échantillon"
|
||||
},
|
||||
"error": {
|
||||
"remotePortWarning": "redémarrer le serveur pour appliquer le nouveau port",
|
||||
@@ -175,7 +182,8 @@
|
||||
"openError": "impossible d'ouvrir le fichier",
|
||||
"networkError": "une erreur de réseau est survenue",
|
||||
"badAlbum": "vous voyez cette page parce que cette chanson ne fait pas parti d'un album. vous rencontrez probablement cette erreur si vous avez une chanson qui n'est pas dans votre répertoire de musique. jellyfin gère les chansons uniquement si elles sont dans un sous-dossier, qui est lui-même dans un dossier \"Musique(s)\".",
|
||||
"badValue": "option {{value}} invalide. Cette valeur n'existe plus"
|
||||
"badValue": "option {{value}} invalide. Cette valeur n'existe plus",
|
||||
"notificationDenied": "les autorisations pour les notifications ont été refusées. ce paramètre n'a aucun effet"
|
||||
},
|
||||
"filter": {
|
||||
"mostPlayed": "plus joués",
|
||||
@@ -197,7 +205,7 @@
|
||||
"favorited": "favoris",
|
||||
"isRecentlyPlayed": "est récemment joué",
|
||||
"isFavorited": "est favori",
|
||||
"bpm": "bpm",
|
||||
"bpm": "BPM",
|
||||
"releaseYear": "année de sortie",
|
||||
"disc": "disque",
|
||||
"biography": "biographie",
|
||||
@@ -234,7 +242,8 @@
|
||||
"home": "$t(common.home)",
|
||||
"artists": "$t(entity.artist_other)",
|
||||
"albumArtists": "$t(entity.albumArtist_other)",
|
||||
"shared": "partagé $t(entity.playlist_other)"
|
||||
"shared": "partagé $t(entity.playlist_other)",
|
||||
"myLibrary": "ma bibliothèque"
|
||||
},
|
||||
"fullscreenPlayer": {
|
||||
"config": {
|
||||
@@ -269,13 +278,15 @@
|
||||
"goForward": "avancer",
|
||||
"version": "version {{version}}",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"quit": "$t(common.quit)"
|
||||
"quit": "$t(common.quit)",
|
||||
"privateModeOff": "désactiver le mode privé",
|
||||
"privateModeOn": "activer le mode privé"
|
||||
},
|
||||
"home": {
|
||||
"mostPlayed": "plus joués",
|
||||
"newlyAdded": "versions récemment ajoutés",
|
||||
"explore": "explorer depuis votre bibliothèque",
|
||||
"recentlyPlayed": "récemment joué",
|
||||
"mostPlayed": "Les plus joués",
|
||||
"newlyAdded": "Ajoutés récemment",
|
||||
"explore": "explorer depuis la bibliothèque",
|
||||
"recentlyPlayed": "Joués récemment",
|
||||
"title": "$t(common.home)"
|
||||
},
|
||||
"albumDetail": {
|
||||
@@ -346,13 +357,13 @@
|
||||
"albumArtistDetail": {
|
||||
"about": "À propos de {{artist}}",
|
||||
"appearsOn": "apparaît sur",
|
||||
"topSongsFrom": "meilleures chansons de {{title}}",
|
||||
"topSongsFrom": "meilleurs titres de {{title}}",
|
||||
"viewAll": "voir tout",
|
||||
"viewAllTracks": "voir tout $t(entity.track_other)",
|
||||
"recentReleases": "sorties récentes",
|
||||
"viewDiscography": "voir la discographie",
|
||||
"relatedArtists": "en rapport avec $t(entity.artist_other)",
|
||||
"topSongs": "meilleures chansons"
|
||||
"topSongs": "meilleurs titres"
|
||||
},
|
||||
"itemDetail": {
|
||||
"copyPath": "copier le chemin dans le presse-papiers",
|
||||
@@ -360,11 +371,11 @@
|
||||
"copiedPath": "chemin copié avec succès"
|
||||
},
|
||||
"playlist": {
|
||||
"reorder": "le tri n'est possible que lorsque l'on trie par identifiant"
|
||||
"reorder": "le tri n'est possible que lors du tri par identifiant"
|
||||
},
|
||||
"manageServers": {
|
||||
"serverDetails": "détails du serveur",
|
||||
"removeServer": "supprimer le serveur",
|
||||
"removeServer": "retirer le serveur",
|
||||
"url": "URL du serveur",
|
||||
"title": "gérer les serveurs",
|
||||
"username": "nom d'utilisateur",
|
||||
@@ -395,7 +406,7 @@
|
||||
"discordIdleStatus_description": "quand activé, mettre à jour le status pendant que le lecteur est inactif",
|
||||
"showSkipButtons": "affiche les boutons suivants et précédents",
|
||||
"minimumScrobblePercentage": "durée minimal du scobble (pourcentage)",
|
||||
"lyricFetch": "récupère les paroles depuis internet",
|
||||
"lyricFetch": "récupérer les paroles depuis internet",
|
||||
"scrobble": "scrobble",
|
||||
"enableRemote_description": "activer le serveur de contrôle à distance, qui permet à d'autres appareils de contrôler l'application",
|
||||
"fontType_optionSystem": "police système",
|
||||
@@ -446,17 +457,17 @@
|
||||
"playbackStyle": "style de lecture",
|
||||
"hotkey_toggleShuffle": "basculer la lecture aléatoire",
|
||||
"playbackStyle_description": "sélectionnez le style de lecture à utiliser pour le lecteur audio",
|
||||
"discordRichPresence_description": "active l'état de lecteur dans le status d'activité {{discord}}. Les images clés sont : {{icon}}, {{playing}}, et {{paused}} ",
|
||||
"discordRichPresence_description": "active l'état de lecteur dans le status d'activité {{discord}}. Les images clés sont : {{icon}}, {{playing}}, et {{paused}}",
|
||||
"mpvExecutablePath": "chemin de l'exécutable mpv",
|
||||
"hotkey_rate2": "noter 2 étoiles",
|
||||
"playButtonBehavior_description": "définit le comportement par défaut du bouton play, lors de l'ajout de chanson à la file d'attente",
|
||||
"minimumScrobblePercentage_description": "le pourcentage minimum de la chanson qui doit être joué avant qu'elle ne soit scrobbleée",
|
||||
"playButtonBehavior_description": "définit le comportement par défaut du bouton Jouer/Pause, lors de l'ajout de titres à la file d'attente",
|
||||
"minimumScrobblePercentage_description": "le pourcentage minimum de la chanson qui doit être joué avant qu'elle ne soit scrobblée",
|
||||
"exitToTray": "quitter vers la barre des tâches",
|
||||
"hotkey_rate4": "noter 4 étoiles",
|
||||
"enableRemote": "activer le serveur de contrôle à distance",
|
||||
"showSkipButton_description": "affiche ou cache les boutons suivants et précédents de la barre de lecture",
|
||||
"savePlayQueue": "sauvegarder la liste de lecture",
|
||||
"minimumScrobbleSeconds_description": "la durée minimale en secondes de la chanson qui doit être jouée avant qu'elle ne soit scrobbleée",
|
||||
"minimumScrobbleSeconds_description": "la durée minimale en secondes de la chanson qui doit être jouée avant qu'elle ne soit scrobblée",
|
||||
"fontType_description": "police intégré vous permet de sélectionner une des polices fourni par Feishin. Police système vous permet de sélectionner une des polices fourni par votre système d'éxploitation. personnalisé vous permet de fournir votre propre police",
|
||||
"playButtonBehavior": "comportement du bouton play",
|
||||
"playbackStyle_optionNormal": "normale",
|
||||
@@ -488,12 +499,12 @@
|
||||
"sidebarCollapsedNavigation_description": "affiche ou cache la navigation dans la barre latérale réduite",
|
||||
"sidebarConfiguration": "configuration de la barre latérale",
|
||||
"sidebarConfiguration_description": "sélectionnez les éléments et l'ordre dans lequel ils seront affichés dans la barre latérale",
|
||||
"sidebarPlaylistList": "liste de playlist de la barre latérale",
|
||||
"sidebarPlaylistList": "liste de listes de lecture de la barre latérale",
|
||||
"sidebarCollapsedNavigation": "navigation de la barre latéral (réduite)",
|
||||
"skipDuration": "durée de l'avance rapide",
|
||||
"sidePlayQueueStyle_optionAttached": "attaché",
|
||||
"sidePlayQueueStyle": "style de la liste de lecture latérale",
|
||||
"sidebarPlaylistList_description": "affiche ou cache la liste de playlist de la barre latérale",
|
||||
"sidebarPlaylistList_description": "affiche ou cache le menu de listes de lecture de la barre latérale",
|
||||
"sidePlayQueueStyle_description": "définit le style de la liste de lecture latérale",
|
||||
"sidePlayQueueStyle_optionDetached": "détaché",
|
||||
"volumeWheelStep_description": "la valeur de volume à modifier lors du défilement de la molette de la souris sur le curseur de volume",
|
||||
@@ -505,11 +516,11 @@
|
||||
"themeLight_description": "définit le thème clair à utiliser pour l'application",
|
||||
"zoom_description": "définit le pourcentage de zoom de l'application",
|
||||
"theme": "thème",
|
||||
"skipPlaylistPage_description": "lors de la navigation dans une playlist, aller directement vers la liste des morceaux, au lieu de la page par défaut",
|
||||
"skipPlaylistPage_description": "lors de la navigation dans une liste de lecture, aller directement vers la liste des titres, au lieu de la page par défaut",
|
||||
"volumeWheelStep": "valeur du pas de volume",
|
||||
"windowBarStyle": "style de la barre de la fenêtre",
|
||||
"useSystemTheme_description": "suivre les préférences du système (mode clair ou sombre)",
|
||||
"skipPlaylistPage": "sauter la page de playlist",
|
||||
"skipPlaylistPage": "sauter la page de listes de lecture",
|
||||
"themeDark": "thème (sombre)",
|
||||
"windowBarStyle_description": "ajuster le style de la barre de la fenêtre",
|
||||
"useSystemTheme": "utiliser le thème du système",
|
||||
@@ -525,17 +536,17 @@
|
||||
"replayGainMode_optionTrack": "$t(entity.track_one)",
|
||||
"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": "{{ReplayGain}} fallback",
|
||||
"replayGainFallback": "valeur de repli {{ReplayGain}}",
|
||||
"replayGainClipping_description": "Prévient le clipping causé par {{ReplayGain}} en baissant automatiquement le gain",
|
||||
"replayGainPreamp": "préamplificateur (dB) de {{ReplayGain}}",
|
||||
"replayGainClipping": "{{ReplayGain}} clipping",
|
||||
"replayGainClipping": "écrêtage {{ReplayGain}}",
|
||||
"replayGainMode": "mode de {{ReplayGain}}",
|
||||
"replayGainFallback_description": "gain en dB à appliquer si le fichier n'a pas de tag {{ReplayGain}}",
|
||||
"replayGainPreamp_description": "ajuste le gain de préampli appliqué a la valeur de {{ReplayGain}}",
|
||||
"clearQueryCache": "vide le cache de feishin",
|
||||
"clearCache": "vider le cache navigateur",
|
||||
"buttonSize_description": "la taille des boutons de la barre de lecture",
|
||||
"clearQueryCache_description": "un 'soft clear' de feishin. cela actualisera les playlists, les métadonnées des pistes, et réinitialisera les paroles enregistrées. les paramètres, identifiants serveurs et les images mises en cache sont conservés",
|
||||
"clearQueryCache_description": "un 'soft clear' de Feishin. Cela actualisera les liste de lecture, les métadonnées des titres, et réinitialisera les paroles enregistrées. Les paramètres, identifiants du serveur et images mises en cache seront conservés",
|
||||
"clearCache_description": "un 'hard clear' de feishin. en plus de vider le cache de feishin, vide le cache du navigateur (images sauvegardées et autres ressources). les identifiants serveurs et paramètres sont conservés",
|
||||
"buttonSize": "taille des boutons du lecteur",
|
||||
"clearCacheSuccess": "le cache a été vidé",
|
||||
@@ -573,7 +584,7 @@
|
||||
"artistConfiguration": "page de configuration de l'artiste de l'album",
|
||||
"artistConfiguration_description": "configurer les éléments et l'ordre à afficher, sur la page de l'artiste de l'album",
|
||||
"doubleClickBehavior": "mettre en file d'attente toutes les pistes recherchées lors d'un double clic",
|
||||
"contextMenu": "configuration du menu contexte (clic droit)",
|
||||
"contextMenu": "configuration du menu contextuel (clic droit)",
|
||||
"contextMenu_description": "permet de masquer les éléments qui s'affichent dans le menu lorsque vous cliquez avec le bouton droit de la souris sur un élément. les éléments qui ne sont pas cochés seront masqués",
|
||||
"albumBackground": "image d'arrière-plan de l'album",
|
||||
"albumBackground_description": "ajoute une image d'arrière-plan pour les pages de l'album contenant les illustrations de l'album",
|
||||
@@ -591,7 +602,7 @@
|
||||
"customCss_description": "contenu css personnalisé. Remarque : le contenu et les URL distantes sont des propriétés non autorisées. Un aperçu de votre contenu est affiché ci-dessous. Des champs supplémentaires que vous n'avez pas définis sont présents en raison de la vérification.",
|
||||
"translationApiKey": "clé api de traduction",
|
||||
"translationTargetLanguage_description": "langue cible pour la traduction des paroles",
|
||||
"transcodeNote": "prend effet après 1 (web) - 2 (mpv) chansons",
|
||||
"transcodeNote": "prend effet après 1 (web) - 2 (mpv) titres",
|
||||
"trayEnabled_description": "afficher ou masquer l'icône et le menu de la barre d'état système. si désactivé, désactive également la réduction et la sortie vers la barre d'état système",
|
||||
"doubleClickBehavior_description": "si vrai, toutes les pistes correspondantes dans une recherche de piste seront mises en file d'attente. sinon, seule celle sur laquelle vous avez cliqué sera mise en file d'attente",
|
||||
"albumBackgroundBlur": "taille du flou de l'image d'arrière-plan de l'album",
|
||||
@@ -602,7 +613,21 @@
|
||||
"lastfm": "affiche les liens de last.fm",
|
||||
"musicbrainz_description": "affiches les liens vers musicbrainz sur les pages des artistes/albums, quand mbid existes",
|
||||
"lastfm_description": "affiche les liens vers last.fm sur les pages des artistes/albums",
|
||||
"musicbrainz": "affiches les liens musicbrainz"
|
||||
"musicbrainz": "affiches les liens musicbrainz",
|
||||
"neteaseTranslation": "Activer les traductions NetEase",
|
||||
"neteaseTranslation_description": "Lorsque cette option est activée, récupère et affiche les paroles traduites de NetEase si elles sont disponibles.",
|
||||
"preferLocalLyrics_description": "privilégier les paroles locales aux paroles distantes lorsqu'elles sont disponibles",
|
||||
"preferLocalLyrics": "privilégier les paroles locales",
|
||||
"discordPausedStatus_description": "quand activé, le status s'affichera lorsque le lecteur est en pause",
|
||||
"discordPausedStatus": "afficher le status d'activité en pause",
|
||||
"preservePitch": "préserver la hauteur",
|
||||
"preservePitch_description": "préserver la hauteur lors du changement de la vitesse de lecture",
|
||||
"notify": "activer les notifications des chansons",
|
||||
"notify_description": "affiche une notification lors du changement de chanson",
|
||||
"discordDisplayType": "type d'affichage du status {{discord}}",
|
||||
"discordDisplayType_description": "change ce que vous écoutez dans votre statut",
|
||||
"discordDisplayType_songname": "nom du morceau",
|
||||
"discordDisplayType_artistname": "nom(s) d’artiste"
|
||||
},
|
||||
"form": {
|
||||
"deletePlaylist": {
|
||||
@@ -630,7 +655,7 @@
|
||||
"input_playlists": "$t(entity.playlist_other)"
|
||||
},
|
||||
"createPlaylist": {
|
||||
"title": "créer $t(entity.playlist_one)",
|
||||
"title": "créer une $t(entity.playlist_one)",
|
||||
"input_public": "publique",
|
||||
"success": "$t(entity.playlist_one) créée avec succès",
|
||||
"input_description": "$t(common.description)",
|
||||
@@ -643,11 +668,12 @@
|
||||
},
|
||||
"queryEditor": {
|
||||
"input_optionMatchAll": "correspondre à tous",
|
||||
"input_optionMatchAny": "correspondre à n'importe quel"
|
||||
"input_optionMatchAny": "correspondre à n'importe quel",
|
||||
"title": "éditeur de requête"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"title": "modifier $t(entity.playlist_one)",
|
||||
"publicJellyfinNote": "Jellyfin n'indique pas si une playlist est publique ou non. Si vous souhaitez que cette playlist reste publique, veuillez sélectionner l'entrée suivante",
|
||||
"publicJellyfinNote": "Jellyfin n'indique pas si une liste de lecture est publique ou non. Si vous souhaitez que cette liste de lecture reste publique, veuillez sélectionner l'entrée suivante",
|
||||
"success": "$t(entity.playlist_one) mis à jour avec succès"
|
||||
},
|
||||
"lyricSearch": {
|
||||
@@ -662,18 +688,23 @@
|
||||
"success": "lien de partage copié dans le presse-papier (ou cliquez ici pour ouvrir)",
|
||||
"expireInvalid": "l'expiration doit être définie à une date ultérieure",
|
||||
"createFailed": "échec de la création du lien de partage (le partage est-il activé ?)"
|
||||
},
|
||||
"privateMode": {
|
||||
"enabled": "le mode privé est activé, le statut de lecture est maintenant caché des intégrations externes",
|
||||
"disabled": "le mode privé est désactivé, le statut de lecture est maintenant visible des intégrations externes",
|
||||
"title": "mode privé"
|
||||
}
|
||||
},
|
||||
"entity": {
|
||||
"genre_one": "genre",
|
||||
"genre_many": "genres",
|
||||
"genre_other": "genres",
|
||||
"playlistWithCount_one": "{{count}} playlist",
|
||||
"playlistWithCount_many": "{{count}} playlists",
|
||||
"playlistWithCount_other": "{{count}} playlists",
|
||||
"playlist_one": "playlist",
|
||||
"playlist_many": "playlists",
|
||||
"playlist_other": "playlists",
|
||||
"playlistWithCount_one": "{{count}} liste de lecture",
|
||||
"playlistWithCount_many": "{{count}} listes de lecture",
|
||||
"playlistWithCount_other": "{{count}} listes de lecture",
|
||||
"playlist_one": "liste de lecture",
|
||||
"playlist_many": "listes de lecture",
|
||||
"playlist_other": "listes de lecture",
|
||||
"artist_one": "artiste",
|
||||
"artist_many": "artistes",
|
||||
"artist_other": "artistes",
|
||||
@@ -714,9 +745,9 @@
|
||||
"play_one": "{{count}} écouter",
|
||||
"play_many": "{{count}} écoute",
|
||||
"play_other": "{{count}} écoute",
|
||||
"song_one": "chanson",
|
||||
"song_many": "chansons",
|
||||
"song_other": "chansons"
|
||||
"song_one": "titre",
|
||||
"song_many": "titres",
|
||||
"song_other": "titres"
|
||||
},
|
||||
"table": {
|
||||
"config": {
|
||||
@@ -732,8 +763,10 @@
|
||||
},
|
||||
"view": {
|
||||
"table": "liste",
|
||||
"poster": "poster",
|
||||
"card": "Carte"
|
||||
"poster": "affiche",
|
||||
"card": "Carte",
|
||||
"grid": "grille",
|
||||
"list": "liste"
|
||||
},
|
||||
"label": {
|
||||
"releaseDate": "date de sortie",
|
||||
|
||||
@@ -163,7 +163,7 @@
|
||||
"remotePortWarning": "indítsd újra a szervert az új PORT használatához",
|
||||
"genericError": "hiba történt",
|
||||
"endpointNotImplementedError": "a(z) {{endpoint}} végpont nincs implementálva a következőhöz: {{serverType}}",
|
||||
"badAlbum": "azért látod ezt az oldalt mert ez a zeneszám nem része egy albumnak. ez általában akkor történik amikor egy szám a zenekönyvtárad gyökerébe kerül. a Jellyfin csak mappákba rendezett számokat csoportosít",
|
||||
"badAlbum": "azért látod ezt az oldalt mert ez a zeneszám nem része egy albumnak. ez általában akkor történik amikor egy szám a zenekönyvtárad gyökerébe kerül. a Jellyfin csak mappákba rendezett számokat csoportosít.",
|
||||
"loginRateError": "túl sok bejelentkezési kísérlet, kérlek próbáld újra pár másodperc múlva",
|
||||
"mpvRequired": "MPV szükséges",
|
||||
"invalidServer": "érvénytelen szerver",
|
||||
|
||||
@@ -491,7 +491,7 @@
|
||||
"discordListening": "Tampilkan status sebagai mendengarkan",
|
||||
"discordListening_description": "tampilkan status sebagai mendengarkan alih-alih bermain",
|
||||
"discordRichPresence": "status aktivitas {{discord}}",
|
||||
"discordRichPresence_description": "aktifkan status pemutaran di status aktivitas {{discord}}. Gambar tombol adalah: {{icon}}, {{playing}}, dan {{paused}} ",
|
||||
"discordRichPresence_description": "aktifkan status pemutaran di status aktivitas {{discord}}. Gambar tombol adalah: {{icon}}, {{playing}}, dan {{paused}}",
|
||||
"discordUpdateInterval": "interval pembaruan status aktivitas {{discord}}",
|
||||
"discordUpdateInterval_description": "waktu dalam detik antara setiap pembaruan (minimal 15 detik)",
|
||||
"doubleClickBehavior": "masukkan semua lagu yang dicari saat mengklik dua kali",
|
||||
|
||||
+204
-26
@@ -16,7 +16,12 @@
|
||||
"toggleSmartPlaylistEditor": "attiva/disattiva editor $t(entity.smartPlaylist)",
|
||||
"removeFromFavorites": "rimuovi da $t(entity.favorite_other)",
|
||||
"moveToTop": "sposta in cima",
|
||||
"moveToBottom": "sposta in fondo"
|
||||
"moveToBottom": "sposta in fondo",
|
||||
"moveToNext": "passa al successivo",
|
||||
"openIn": {
|
||||
"lastfm": "Apri in Last.fm",
|
||||
"musicbrainz": "Apri in MusicBrainz"
|
||||
}
|
||||
},
|
||||
"common": {
|
||||
"backward": "indietro",
|
||||
@@ -99,7 +104,22 @@
|
||||
"yes": "si",
|
||||
"random": "casuale",
|
||||
"size": "dimensione",
|
||||
"note": "nota"
|
||||
"note": "nota",
|
||||
"additionalParticipants": "partecipanti aggiuntivi",
|
||||
"newVersion": "è stata installata una nuova versione ({{version}})",
|
||||
"viewReleaseNotes": "mostra le note di rilascio",
|
||||
"albumGain": "guadagno (gain) dell'album",
|
||||
"albumPeak": "picco di volume dell'album",
|
||||
"close": "chiudi",
|
||||
"codec": "codec",
|
||||
"mbid": "MusicBrainz ID",
|
||||
"preview": "anteprima",
|
||||
"reload": "ricarica",
|
||||
"share": "condividi",
|
||||
"tags": "tags",
|
||||
"trackGain": "normalizzazione (gain) del brano",
|
||||
"trackPeak": "picco di volume del brano",
|
||||
"translation": "traduzione"
|
||||
},
|
||||
"player": {
|
||||
"repeat_all": "ripeti coda",
|
||||
@@ -113,7 +133,7 @@
|
||||
"skip_back": "salta indietro",
|
||||
"favorite": "preferito",
|
||||
"next": "successivo",
|
||||
"shuffle": "mescola",
|
||||
"shuffle": "riproduzione casuale",
|
||||
"playbackFetchNoResults": "nessuna canzone trovata",
|
||||
"playbackFetchInProgress": "caricamento canzoni…",
|
||||
"addNext": "aggiungi successivo",
|
||||
@@ -130,7 +150,9 @@
|
||||
"shuffle_off": "non mescolare",
|
||||
"addLast": "aggiungi in coda",
|
||||
"mute": "silenzia",
|
||||
"skip_forward": "salta avanti"
|
||||
"skip_forward": "salta avanti",
|
||||
"playSimilarSongs": "riproduci brani simili",
|
||||
"viewQueue": "visualizza coda"
|
||||
},
|
||||
"setting": {
|
||||
"crossfadeStyle_description": "seleziona lo stile dissolvenza da usare per il player audio",
|
||||
@@ -150,7 +172,7 @@
|
||||
"skipDuration_description": "imposta la durata da saltare quando vengono usati i pulsanti di salto nella barra del player",
|
||||
"enableRemote_description": "abilita il controllo remoto del server per permettere ad altri dispositivi di controllare l'applicazione",
|
||||
"fontType_optionSystem": "font di sistema",
|
||||
"mpvExecutablePath_description": "imposta il percorso dell'eseguibile di mpv",
|
||||
"mpvExecutablePath_description": "imposta il percorso dell'eseguibile mpv. se lasciato vuoto, verrà utilizzato il percorso predefinito",
|
||||
"hotkey_favoriteCurrentSong": "$t(common.currentSong) preferita",
|
||||
"crossfadeStyle": "stile dissolvenza",
|
||||
"sidebarConfiguration": "configurazione barra laterale",
|
||||
@@ -209,7 +231,7 @@
|
||||
"hotkey_toggleShuffle": "attiva/disattiva mescolamento",
|
||||
"theme": "tema",
|
||||
"playbackStyle_description": "selezione lo stile di riproduzione da usare per il player audio",
|
||||
"discordRichPresence_description": "abilita lo status del playback nello stato attività di {{discord}}. Le chiavi immagine sono: {{icon}}, {{playing}} e {{paused}} ",
|
||||
"discordRichPresence_description": "abilita lo status del playback nello stato attività di {{discord}}. Le chiavi immagine sono: {{icon}}, {{playing}} e {{paused}}",
|
||||
"mpvExecutablePath": "percorso eseguibile mpv",
|
||||
"audioDevice": "device audio",
|
||||
"hotkey_rate2": "voto 2 stelle",
|
||||
@@ -268,7 +290,7 @@
|
||||
"replayGainMode_description": "aggiusta il volume secondo i valori {{ReplayGain}} salvati nei metadati del file",
|
||||
"showSkipButtons": "mostra pulsanti per saltare",
|
||||
"sampleRate": "frequenza di campionamento",
|
||||
"sampleRate_description": "seleziona la frequenza di campionamento di output da usare se la frequenza di campionamento selezionata è diversa da quella della del media attuale",
|
||||
"sampleRate_description": "seleziona la frequenza di campionamento di output da utilizzare se quella selezionata è diversa da quella del file sorgente in riproduzione. Un valore inferiore a 8000 utilizzerà la frequenza predefinita",
|
||||
"hotkey_togglePreviousSongFavorite": "imposta/rimuovi $t(common.previousSong) favorito",
|
||||
"hotkey_unfavoritePreviousSong": "rimuovi $t(common.previousSong) dai preferiti",
|
||||
"showSkipButton_description": "mostra o nascondi i pulsanti per saltare nella barra del player",
|
||||
@@ -293,7 +315,85 @@
|
||||
"clearQueryCache": "pulisci cache di feishin",
|
||||
"buttonSize_description": "Dimensione bottoni nella barra di riproduzione",
|
||||
"clearCache": "pulisci la cache del browser",
|
||||
"clearQueryCache_description": "\"leggera\" pulizia di feishin. verranno aggiornate le playlist, metadata delle tracce e i testi salvati. impostazioni, credenziali del server e le immagini salvate saranno mantenute"
|
||||
"clearQueryCache_description": "\"leggera\" pulizia di feishin. verranno aggiornate le playlist, metadata delle tracce e i testi salvati. impostazioni, credenziali del server e le immagini salvate saranno mantenute",
|
||||
"albumBackground": "immagine di sfondo dell'album",
|
||||
"albumBackground_description": "aggiunge un'immagine di sfondo per le pagine degli album contenenti l'album art",
|
||||
"albumBackgroundBlur": "intensità sfocatura immagine di sfondo dell'album",
|
||||
"albumBackgroundBlur_description": "regola la quantità di sfocatura applicata all'immagine di sfondo dell'album",
|
||||
"artistConfiguration": "configurazione della pagina artista dell’album",
|
||||
"artistConfiguration_description": "configurare quali elementi vengono visualizzati, e in quale ordine, nella pagina dell'artista dell'album",
|
||||
"buttonSize": "dimensione del bottone nella barra di riproduzione",
|
||||
"clearCacheSuccess": "cache pulita correttamente",
|
||||
"contextMenu": "configurazione menu contestuale (clic destro)",
|
||||
"contextMenu_description": "consente di nascondere gli elementi che vengono visualizzati nel menu quando si fa clic destro su un elemento. gli oggetti non selezionati saranno nascosti",
|
||||
"customCssEnable": "abilita css personalizzato",
|
||||
"customCssEnable_description": "consente di scrivere css personalizzati.",
|
||||
"customCssNotice": "Attenzione: sebbene ci sia una certa sanitizzazione (vengono bloccati url() e content:), l’uso di CSS personalizzati può comunque comportare dei rischi modificando l’interfaccia.",
|
||||
"customCss": "css personalizzato",
|
||||
"customCss_description": "contenuto CSS personalizzato. Nota: le proprietà content e gli URL remoti non sono consentiti. Di seguito è mostrata un’anteprima del tuo contenuto. Sono presenti anche altri campi non impostati da te a causa della sanitizzazione.",
|
||||
"discordPausedStatus": "mostra rich presence di Discord quando la riproduzione è in pausa",
|
||||
"discordPausedStatus_description": "quando abilitato, verrà mostrato lo stato del lettore in standby/pausa (nessun brano in riproduzione)",
|
||||
"discordListening": "mostra stato come in ascolto",
|
||||
"discordListening_description": "mostra lo stato come in ascolto invece che in riproduzione",
|
||||
"discordServeImage": "recupera le immagini di {{discord}} dal server",
|
||||
"discordServeImage_description": "condividi la copertina per la rich presence di {{discord}} direttamente dal server, disponibile solo per Jellyfin e Navidrome",
|
||||
"doubleClickBehavior": "aggiungi alla coda tutte le tracce cercate, con un doppio clic",
|
||||
"doubleClickBehavior_description": "se attivato, tutte le tracce corrispondenti alla ricerca verranno aggiunte alla coda. altrimenti, verrà aggiunta alla coda solo la traccia selezionata",
|
||||
"externalLinks": "mostra link esterni",
|
||||
"externalLinks_description": "consente di visualizzare link esterni (Last.fm, MusicBrainz) sulle pagine di artista/album",
|
||||
"preferLocalLyrics": "utilizza i testi locali",
|
||||
"preferLocalLyrics_description": "usa i testi locali anziché quelli online, quando disponibili",
|
||||
"genreBehavior": "comportamento predefinito della pagina genere",
|
||||
"genreBehavior_description": "determina se cliccando su un genere si apre di default la lista dei brani o degli album",
|
||||
"homeConfiguration": "configurazione della home page",
|
||||
"homeConfiguration_description": "configura quali elementi vengono mostrati e in quale ordine nella home page",
|
||||
"homeFeature": "carosello in evidenza nella home page",
|
||||
"homeFeature_description": "controlla se mostrare il grande carosello in evidenza nella pagina principale",
|
||||
"imageAspectRatio": "usa dimensioni originali(aspect ratio) della copertina",
|
||||
"imageAspectRatio_description": "se abilitato, la copertina verrà mostrata utilizzando le dimesioni originali. per le immagini con rapporto diverso da 1:1, lo spazio residuo resterà vuoto",
|
||||
"lastfm": "mostra links last.fm",
|
||||
"lastfm_description": "mostra i link per last.fm sulle pagine di artista/album",
|
||||
"lastfmApiKey": "{{lastfm}} chiave API",
|
||||
"lastfmApiKey_description": "chiave API per {{lastfm}}. necessaria per visualizzare le copertine",
|
||||
"mpvExtraParameters_help": "uno per linea",
|
||||
"musicbrainz": "mostra links musicbrainz",
|
||||
"musicbrainz_description": "mostra link a musicbrainz sulle pagine degli artisti/album, se è disponibile un mbid",
|
||||
"neteaseTranslation": "Abilita traduzioni di NetEase",
|
||||
"neteaseTranslation_description": "Se abilitato, recupera e mostra i testi tradotti da NetEase, se disponibili.",
|
||||
"passwordStore": "Archivio di password/segreti",
|
||||
"passwordStore_description": "specifica quale archivio di password e segreti utilizzare. modificalo in caso di problemi nel salvataggio delle credenziali.",
|
||||
"playButtonBehavior_optionPlayShuffled": "$t(player.shuffle)",
|
||||
"playerAlbumArtResolution": "risoluzione della copertina nel lettore",
|
||||
"playerAlbumArtResolution_description": "la risoluzione 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",
|
||||
"startMinimized_description": "avvia l'app nella barra di sistema",
|
||||
"transcodeNote": "ha effetto dopo 1 brano (web) - 2 brani (mpv)",
|
||||
"transcode": "abilita la transcodifica",
|
||||
"transcode_description": "abilita la transcodifica in formati diversi",
|
||||
"playerbarOpenDrawer": "attiva/disattiva schermo intero",
|
||||
"playerbarOpenDrawer_description": "consente di cliccare sulla barra del lettore per aprire il lettore a schermo intero",
|
||||
"replayGainClipping": "clipping di {{ReplayGain}}",
|
||||
"replayGainFallback": "metodo alternativo di {{ReplayGain}}",
|
||||
"transcodeBitrate": "bitrate per la transcodifica",
|
||||
"transcodeBitrate_description": "seleziona il bitrate per la transcodifica. 0 significa lasciare che sia il server a scegliere",
|
||||
"transcodeFormat": "formato per la transcodifica",
|
||||
"transcodeFormat_description": "seleziona il formato per la transcodifica. se vuoto viene decisco dal server",
|
||||
"translationApiProvider": "translation api provider",
|
||||
"translationApiProvider_description": "api provider for translation",
|
||||
"translationApiKey": "chiave api translation",
|
||||
"translationApiKey_description": "chiave api per la traduzione (supporta solo endpoint di servizio globali)",
|
||||
"translationTargetLanguage": "lingua di destinazione della traduzione",
|
||||
"translationTargetLanguage_description": "lingua di destinazione per la traduzione",
|
||||
"trayEnabled": "Mostra icona app nella barra di sistema",
|
||||
"trayEnabled_description": "mostra/nascondi icona app nella barra si sistema. se disabilitato, disattiva anche minimizza/chiudi nella barra di sistema",
|
||||
"volumeWidth": "larghezza della barra del volume",
|
||||
"webAudio": "use audio web",
|
||||
"webAudio_description": "usa audio web. abilita funzionalità avanzate come ReplayGain. disabilita se riscontri problemi",
|
||||
"preservePitch": "mantieni tono (pitch)",
|
||||
"preservePitch_description": "mantiene il tono (pitch) durante la modifica della velocità di riproduzione",
|
||||
"volumeWidth_description": "larghezza del cursore del volume"
|
||||
},
|
||||
"error": {
|
||||
"remotePortWarning": "riavvia il server per applicare la nuova porta",
|
||||
@@ -314,7 +414,11 @@
|
||||
"mpvRequired": "MPV richiesto",
|
||||
"audioDeviceFetchError": "si è verificato un errore nel provare ad ottenre i device audio",
|
||||
"invalidServer": "server non valido",
|
||||
"loginRateError": "troppi tentativi di accesso, per favore riprova tra qualche secondo"
|
||||
"loginRateError": "troppi tentativi di accesso, per favore riprova tra qualche secondo",
|
||||
"badAlbum": "stai visualizzando questa pagina perché questa canzone non fa parte di un album. probabilmente vedi questo messaggio perché hai una canzone posizionata direttamente nella cartella principale della tua libreria musicale. jellyfin raggruppa le tracce solo se si trovano all’interno di una cartella.",
|
||||
"badValue": "opzione non valida \"{{value}}\". valore inesistente",
|
||||
"networkError": "si è verificato un errore di rete",
|
||||
"openError": "impossibile aprire il file"
|
||||
},
|
||||
"filter": {
|
||||
"mostPlayed": "più riprodotti",
|
||||
@@ -372,7 +476,9 @@
|
||||
"settings": "$t(common.setting_other)",
|
||||
"home": "$t(common.home)",
|
||||
"artists": "$t(entity.artist_other)",
|
||||
"albumArtists": "$t(entity.albumArtist_other)"
|
||||
"albumArtists": "$t(entity.albumArtist_other)",
|
||||
"myLibrary": "la mia libreria",
|
||||
"shared": "condivisa $t(entity.playlist_other)"
|
||||
},
|
||||
"fullscreenPlayer": {
|
||||
"config": {
|
||||
@@ -386,11 +492,16 @@
|
||||
"unsynchronized": "non sinncronizzato",
|
||||
"lyricAlignment": "allineamento testo",
|
||||
"useImageAspectRatio": "usa le proporzioni dell'immagine",
|
||||
"lyricGap": "gap testo"
|
||||
"lyricGap": "gap testo",
|
||||
"dynamicImageBlur": "intensità sfocatura immagine",
|
||||
"dynamicIsImage": "abilita immagine di sfondo",
|
||||
"lyricOffset": "ritardo testi (ms)"
|
||||
},
|
||||
"upNext": "successivamente",
|
||||
"lyrics": "testi",
|
||||
"related": "correlati"
|
||||
"related": "correlati",
|
||||
"visualizer": "visualizzatore audio",
|
||||
"noLyrics": "nessun testo trovato"
|
||||
},
|
||||
"appMenu": {
|
||||
"selectServer": "seleziona server",
|
||||
@@ -420,7 +531,13 @@
|
||||
"addFavorite": "$t(action.addToFavorites)",
|
||||
"play": "$t(player.play)",
|
||||
"numberSelected": "{{count}} selezionati",
|
||||
"removeFromQueue": "$t(action.removeFromQueue)"
|
||||
"removeFromQueue": "$t(action.removeFromQueue)",
|
||||
"download": "download",
|
||||
"moveToNext": "$t(action.moveToNext)",
|
||||
"playSimilarSongs": "$t(player.playSimilarSongs)",
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"shareItem": "condividi elemento",
|
||||
"showDetails": "mostra info"
|
||||
},
|
||||
"home": {
|
||||
"mostPlayed": "più riprodotti",
|
||||
@@ -431,22 +548,28 @@
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "di più da questo $t(entity.artist_one)",
|
||||
"moreFromGeneric": "di più da {{item}}"
|
||||
"moreFromGeneric": "di più da {{item}}",
|
||||
"released": "rilasciato"
|
||||
},
|
||||
"setting": {
|
||||
"playbackTab": "riproduzione",
|
||||
"generalTab": "generale",
|
||||
"hotkeysTab": "tasti a scelta rapida",
|
||||
"windowTab": "finestra"
|
||||
"windowTab": "finestra",
|
||||
"advanced": "avanzate"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
},
|
||||
"genreList": {
|
||||
"title": "$t(entity.genre_other)"
|
||||
"title": "$t(entity.genre_other)",
|
||||
"showAlbums": "mostra $t(entity.genre_one) $t(entity.album_other)",
|
||||
"showTracks": "mostra $t(entity.genre_one) $t(entity.track_other)"
|
||||
},
|
||||
"trackList": {
|
||||
"title": "$t(entity.track_other)"
|
||||
"title": "$t(entity.track_other)",
|
||||
"artistTracks": "tracce di {{artist}}",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track_other)"
|
||||
},
|
||||
"globalSearch": {
|
||||
"commands": {
|
||||
@@ -460,7 +583,36 @@
|
||||
"title": "$t(entity.playlist_other)"
|
||||
},
|
||||
"albumList": {
|
||||
"title": "$t(entity.album_other)"
|
||||
"title": "$t(entity.album_other)",
|
||||
"artistAlbums": "albums di {{artist}}",
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)"
|
||||
},
|
||||
"albumArtistDetail": {
|
||||
"about": "Info {{artist}}",
|
||||
"appearsOn": "compare su",
|
||||
"recentReleases": "uscite recenti",
|
||||
"viewDiscography": "mostra discografia",
|
||||
"relatedArtists": "correlati $t(entity.artist_other)",
|
||||
"topSongs": "brani migliori",
|
||||
"topSongsFrom": "brani migliori da {{title}}",
|
||||
"viewAll": "mostra tutto",
|
||||
"viewAllTracks": "mostra tutto $t(entity.track_other)"
|
||||
},
|
||||
"manageServers": {
|
||||
"title": "gestisci servers",
|
||||
"serverDetails": "dettagli server",
|
||||
"url": "URL",
|
||||
"username": "nome utente",
|
||||
"editServerDetailsTooltip": "modifica dettagli server",
|
||||
"removeServer": "rimuovi server"
|
||||
},
|
||||
"itemDetail": {
|
||||
"copyPath": "copia percorso negli appunti",
|
||||
"copiedPath": "percorso copiato con successo",
|
||||
"openFile": "mostra traccia nel gestore file"
|
||||
},
|
||||
"playlist": {
|
||||
"reorder": "riordino abilitato solo quando si ordina per id"
|
||||
}
|
||||
},
|
||||
"form": {
|
||||
@@ -491,7 +643,7 @@
|
||||
"error_savePassword": "si è verificato un errore quando si è provato a salvare la password"
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"success": "aggiunto {{message}} $t(entity.track_other) a {{numOfPlaylists}} $t(entity.playlist_other)",
|
||||
"success": "aggiunto $t(entity.trackWithCount, {\"count\": {{message}} }) a $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })",
|
||||
"title": "aggiungi a $t(entity.playlist_one)",
|
||||
"input_skipDuplicates": "salta duplicati",
|
||||
"input_playlists": "$t(entity.playlist_other)"
|
||||
@@ -502,7 +654,8 @@
|
||||
},
|
||||
"queryEditor": {
|
||||
"input_optionMatchAll": "soddisfa tutti",
|
||||
"input_optionMatchAny": "soddisfa qualsiasi"
|
||||
"input_optionMatchAny": "soddisfa qualsiasi",
|
||||
"title": "editor di query"
|
||||
},
|
||||
"lyricSearch": {
|
||||
"input_name": "$t(common.name)",
|
||||
@@ -510,7 +663,17 @@
|
||||
"title": "cerca testi"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"title": "modifica $t(entity.playlist_one)"
|
||||
"title": "modifica $t(entity.playlist_one)",
|
||||
"publicJellyfinNote": "Jellyfin non mostra se una playlist è pubblica o meno. Se vuoi che rimanga pubblica, assicurati di selezionare l’opzione seguente",
|
||||
"success": "$t(entity.playlist_one) aggiornato con successo"
|
||||
},
|
||||
"shareItem": {
|
||||
"allowDownloading": "consentire il download",
|
||||
"description": "descrizione",
|
||||
"setExpiration": "imposta scadenza",
|
||||
"success": "link di condivisione copiato negli appunti (o clicca qui per aprirlo)",
|
||||
"expireInvalid": "la scadenza deve essere nel futuro",
|
||||
"createFailed": "condivisione fallita (è abilitata la condivisione?)"
|
||||
}
|
||||
},
|
||||
"table": {
|
||||
@@ -520,11 +683,17 @@
|
||||
"gap": "$t(common.gap)",
|
||||
"tableColumns": "tabella colonne",
|
||||
"autoFitColumns": "adatta colonne automaticamente",
|
||||
"size": "$t(common.size)"
|
||||
"size": "$t(common.size)",
|
||||
"followCurrentSong": "segui il brano corrente",
|
||||
"itemGap": "spaziatura tra gli elementi (px)",
|
||||
"itemSize": "dimensione dell’elemento (px)"
|
||||
},
|
||||
"view": {
|
||||
"table": "tabella",
|
||||
"card": "Scheda"
|
||||
"card": "Scheda",
|
||||
"grid": "griglia",
|
||||
"list": "lista",
|
||||
"poster": "poster"
|
||||
},
|
||||
"label": {
|
||||
"releaseDate": "data rilascio",
|
||||
@@ -552,7 +721,9 @@
|
||||
"discNumber": "numero disco",
|
||||
"favorite": "$t(common.favorite)",
|
||||
"year": "$t(common.year)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)"
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"codec": "$t(common.codec)",
|
||||
"songCount": "$t(entity.track_other)"
|
||||
}
|
||||
},
|
||||
"column": {
|
||||
@@ -578,7 +749,8 @@
|
||||
"path": "percorso",
|
||||
"discNumber": "disco",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"size": "$t(common.size)"
|
||||
"size": "$t(common.size)",
|
||||
"codec": "$t(common.codec)"
|
||||
}
|
||||
},
|
||||
"entity": {
|
||||
@@ -627,6 +799,12 @@
|
||||
"genreWithCount_other": "{{count}} generi",
|
||||
"trackWithCount_one": "{{count}} traccia",
|
||||
"trackWithCount_many": "{{count}} tracce",
|
||||
"trackWithCount_other": "{{count}} tracce"
|
||||
"trackWithCount_other": "{{count}} tracce",
|
||||
"play_one": "{{count}} riproduzione",
|
||||
"play_many": "{{count}} riproduzioni",
|
||||
"play_other": "{{count}} riproduzioni",
|
||||
"song_one": "traccia",
|
||||
"song_many": "tracce",
|
||||
"song_other": "tracce"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -122,7 +122,7 @@
|
||||
"hotkey_toggleShuffle": "シャッフルの切り替え",
|
||||
"theme": "テーマ",
|
||||
"playbackStyle_description": "オーディオプレーヤーに使用する再生スタイルを選択します",
|
||||
"discordRichPresence_description": "{{discord}} のRich Presenceに再生ステータスを表示するようにします。画像キー: {{icon}}, {{playing}}, {{paused}} ",
|
||||
"discordRichPresence_description": "{{discord}} のRich Presenceに再生ステータスを表示するようにします。画像キー: {{icon}}, {{playing}}, {{paused}}",
|
||||
"mpvExecutablePath": "mpv 実行ファイルパス",
|
||||
"audioDevice": "オーディオデバイス",
|
||||
"hotkey_rate2": "2つ星で評価",
|
||||
|
||||
@@ -104,13 +104,21 @@
|
||||
"year": "år",
|
||||
"yes": "ja",
|
||||
"descending": "synkende",
|
||||
"dismiss": "avkreft",
|
||||
"dismiss": "lukk",
|
||||
"delete": "slett",
|
||||
"description": "beskrivelse",
|
||||
"manage": "håndtere",
|
||||
"maximize": "maksimer",
|
||||
"right": "høyre",
|
||||
"sortOrder": "rekkefølge"
|
||||
"sortOrder": "rekkefølge",
|
||||
"tags": "tagger",
|
||||
"newVersion": "en ny versjon har blitt installert ({{version}})",
|
||||
"viewReleaseNotes": "se utgivelsesnotater",
|
||||
"additionalParticipants": "ytterligere deltakere",
|
||||
"albumGain": "gjennomsnittlig lydnivå for album",
|
||||
"albumPeak": "høyeste lydnivå for album",
|
||||
"bitDepth": "bitdybde",
|
||||
"sampleRate": "samplingsfrekvens"
|
||||
},
|
||||
"entity": {
|
||||
"smartPlaylist": "smart $t(entity.playlist_one)",
|
||||
@@ -153,7 +161,7 @@
|
||||
"apiRouteError": "kan ikke behandle forespørselen",
|
||||
"mpvRequired": "MPV er påkrevd",
|
||||
"authenticationFailed": "autentisering feilet",
|
||||
"badAlbum": "du ser denne siden fordi sangen ikke er med i et album. Mest sannsynlig opplever du dette problemet fordi du har en sang helt øverst i musikkmappen. jellyfin gruperer kun spor som ligger i en mappe.",
|
||||
"badAlbum": "du ser denne siden fordi sangen ikke er med i et album. Mest sannsynlig opplever du dette problemet fordi du har en sang helt øverst i musikkmappen. Jellyfin grupperer kun spor som ligger i en mappe.",
|
||||
"endpointNotImplementedError": "endepunkt {{endpoint}} er ikke implementert for {{serverType}}",
|
||||
"credentialsRequired": "innloggingsdetaljer er påkrevd",
|
||||
"genericError": "en feil har oppstått",
|
||||
@@ -171,7 +179,9 @@
|
||||
"sessionExpiredError": "sesjonen din har utløpt",
|
||||
"remotePortWarning": "ta omstart av serveren for å aktivere ny port",
|
||||
"remoteDisableError": "en problem oppstod ved å $t(common.disable) serveren",
|
||||
"remoteEnableError": "et problem oppstod ved å $t(common.enable) serveren"
|
||||
"remoteEnableError": "et problem oppstod ved å $t(common.enable) serveren",
|
||||
"notificationDenied": "tillatelser for varsler ble avvist. Denne innstillingen har ingen effekt",
|
||||
"badValue": "ugyldig alternativ \"{{value}}\". Denne verdien eksisterer ikke lenger"
|
||||
},
|
||||
"filter": {
|
||||
"bpm": "bpm",
|
||||
@@ -214,7 +224,8 @@
|
||||
"recentlyAdded": "nylig lagt til",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"trackNumber": "spor"
|
||||
"trackNumber": "spor",
|
||||
"albumCount": "$t(entity.album_other) opptelling"
|
||||
},
|
||||
"form": {
|
||||
"createPlaylist": {
|
||||
@@ -233,7 +244,7 @@
|
||||
"addServer": {
|
||||
"ignoreCors": "ignorer cors ($t(common.restartRequired))",
|
||||
"ignoreSsl": "ignorer ssl ($t(common.restartRequired))",
|
||||
"error_savePassword": "en problem oppstod ved lagring av passord",
|
||||
"error_savePassword": "et problem oppstod ved lagring av passord",
|
||||
"input_savePassword": "lagre passord",
|
||||
"input_url": "lenke",
|
||||
"input_username": "brukernavn",
|
||||
@@ -269,6 +280,11 @@
|
||||
"updateServer": {
|
||||
"success": "vellykket oppdatering av serveren",
|
||||
"title": "oppdater server"
|
||||
},
|
||||
"queryEditor": {
|
||||
"input_optionMatchAll": "match alle",
|
||||
"input_optionMatchAny": "matche hvilken som helst",
|
||||
"title": "redigeringsverktøy for spørringer"
|
||||
}
|
||||
},
|
||||
"page": {
|
||||
@@ -338,7 +354,7 @@
|
||||
"lyricGap": "sangtekstavstand",
|
||||
"dynamicImageBlur": "bilduskarphetstørrelse",
|
||||
"lyricAlignment": "sangtekstjustering",
|
||||
"lyricOffset": "sangtekstjustering (ms)",
|
||||
"lyricOffset": "sangtekstforskyvning (ms)",
|
||||
"lyricSize": "sangtekststørrelse",
|
||||
"opacity": "absorpsjon",
|
||||
"showLyricMatch": "vis sangteksttreff",
|
||||
@@ -405,7 +421,8 @@
|
||||
"search": "$t(common.search)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"shared": "delt $t(entity.playlist_other)",
|
||||
"artists": "$t(entity.artist_other)"
|
||||
"artists": "$t(entity.artist_other)",
|
||||
"myLibrary": "mitt bibliotek"
|
||||
},
|
||||
"setting": {
|
||||
"generalTab": "generelt",
|
||||
@@ -416,6 +433,9 @@
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist_other)"
|
||||
},
|
||||
"playlist": {
|
||||
"reorder": "omorganisering kun mulig ved sortering på id"
|
||||
}
|
||||
},
|
||||
"player": {
|
||||
@@ -439,6 +459,68 @@
|
||||
"queue_moveToTop": "flytt valgte til bunnen",
|
||||
"playbackFetchNoResults": "ingen sanger funnet",
|
||||
"playbackSpeed": "avspillingshastighet",
|
||||
"playSimilarSongs": "spill lignende sanger"
|
||||
"playSimilarSongs": "spill lignende sanger",
|
||||
"skip": "hopp over",
|
||||
"shuffle": "spill i tilfeldig rekkefølge",
|
||||
"shuffle_off": "tilfeldig rekkefølge skrudd av",
|
||||
"skip_back": "hopp bakover",
|
||||
"skip_forward": "hopp fremover",
|
||||
"stop": "stopp",
|
||||
"toggleFullscreenPlayer": "bytt til fullskjermspiller",
|
||||
"pause": "sett på pause",
|
||||
"viewQueue": "se kø",
|
||||
"unfavorite": "fjern fra favoritter"
|
||||
},
|
||||
"setting": {
|
||||
"accentColor": "aksentfarge",
|
||||
"accentColor_description": "setter aksentfarge i applikasjonen",
|
||||
"albumBackground": "album bakgrunnsbilde",
|
||||
"albumBackgroundBlur": "album bakgrunnsbilde uskarphetsstørrelse",
|
||||
"albumBackgroundBlur_description": "justerer grad av uskarphet lagt til på album bakgrunnsbilde",
|
||||
"audioDevice": "lydenhet",
|
||||
"zoom": "zoomprosent",
|
||||
"zoom_description": "angir zoomprosent for applikasjonen"
|
||||
},
|
||||
"table": {
|
||||
"config": {
|
||||
"label": {
|
||||
"playCount": "antall avspillinger",
|
||||
"releaseDate": "utgivelsesdato",
|
||||
"trackNumber": "spornummer",
|
||||
"rowIndex": "radindeks",
|
||||
"dateAdded": "dato lagt til",
|
||||
"discNumber": "skivenummer",
|
||||
"lastPlayed": "sist avspilt"
|
||||
},
|
||||
"view": {
|
||||
"table": "tabell",
|
||||
"card": "kort",
|
||||
"grid": "rutenett",
|
||||
"list": "liste",
|
||||
"poster": "plakat"
|
||||
},
|
||||
"general": {
|
||||
"autoFitColumns": "automatisk kolonnetilpasning",
|
||||
"displayType": "visningstype",
|
||||
"followCurrentSong": "følg gjeldende sang"
|
||||
}
|
||||
},
|
||||
"column": {
|
||||
"releaseYear": "år",
|
||||
"comment": "kommentar",
|
||||
"biography": "biografi",
|
||||
"album": "album",
|
||||
"albumArtist": "albumartist",
|
||||
"dateAdded": "dato lagt til",
|
||||
"discNumber": "skive",
|
||||
"favorite": "favoritt",
|
||||
"lastPlayed": "sist avspilt",
|
||||
"path": "sti",
|
||||
"playCount": "avspillinger",
|
||||
"rating": "vurdering",
|
||||
"releaseDate": "utgivelsesdato",
|
||||
"title": "tittel",
|
||||
"trackNumber": "spor"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,7 +20,8 @@
|
||||
"openIn": {
|
||||
"lastfm": "Open in Last.fm",
|
||||
"musicbrainz": "Open in MusicBrainz"
|
||||
}
|
||||
},
|
||||
"moveToNext": "ga naar volgende"
|
||||
},
|
||||
"common": {
|
||||
"backward": "achteruit",
|
||||
@@ -102,7 +103,12 @@
|
||||
"size": "grootte",
|
||||
"reload": "herlaad",
|
||||
"setting": "instelling",
|
||||
"close": "sluiten"
|
||||
"close": "sluiten",
|
||||
"additionalParticipants": "andere deelnemers",
|
||||
"newVersion": "een nieuwe versie is geinstalleerd ({{version}})",
|
||||
"viewReleaseNotes": "zie release notes",
|
||||
"albumGain": "album gain",
|
||||
"translation": "vertaling"
|
||||
},
|
||||
"filter": {
|
||||
"rating": "rating",
|
||||
@@ -252,7 +258,9 @@
|
||||
"genreWithCount_one": "{{count}} genre",
|
||||
"genreWithCount_other": "{{count}} genres",
|
||||
"trackWithCount_one": "{{count}} track",
|
||||
"trackWithCount_other": "{{count}} tracks"
|
||||
"trackWithCount_other": "{{count}} tracks",
|
||||
"song_one": "lied",
|
||||
"song_other": "liedjes"
|
||||
},
|
||||
"table": {
|
||||
"column": {
|
||||
|
||||
@@ -115,7 +115,13 @@
|
||||
"codec": "kodek",
|
||||
"preview": "podgląd",
|
||||
"close": "zamknij",
|
||||
"translation": "tłumaczenie"
|
||||
"translation": "tłumaczenie",
|
||||
"additionalParticipants": "dodatkowi uczestnicy",
|
||||
"newVersion": "nowa wersja została zaintalowana ({{version}})",
|
||||
"viewReleaseNotes": "zobacz notatki dotyczące wydania",
|
||||
"bitDepth": "głębia bitowa",
|
||||
"sampleRate": "częstotliwość próbkowania",
|
||||
"tags": "tagi"
|
||||
},
|
||||
"entity": {
|
||||
"genre_one": "gatunek",
|
||||
@@ -193,7 +199,8 @@
|
||||
"loginRateError": "zbyt dużo prób logowania, poczekaj chwilę i spróbuj ponownie",
|
||||
"badAlbum": "ta strona jest wyświetlana, ponieważ ten utwór nie jest częścią albumu. najprawdopodobniej ten problem występuje, jeśli utwór znajduje się w nadrzędnym folderze plików z muzyką. jellyfin grupuje utwory tylko wtedy, gdy znajdują się one w folderze.",
|
||||
"networkError": "wystąpił błąd sieciowy",
|
||||
"openError": "nie można otworzyć pliku"
|
||||
"openError": "nie można otworzyć pliku",
|
||||
"badValue": "niewłaściwa opcja \"{{value}}\". ta wartość już nie istnieje"
|
||||
},
|
||||
"filter": {
|
||||
"mostPlayed": "najczęściej odtwarzane",
|
||||
@@ -278,7 +285,8 @@
|
||||
},
|
||||
"queryEditor": {
|
||||
"input_optionMatchAll": "dopasuj wszystkie",
|
||||
"input_optionMatchAny": "dopasuj dowolne"
|
||||
"input_optionMatchAny": "dopasuj dowolne",
|
||||
"title": "edytor zapytań"
|
||||
},
|
||||
"lyricSearch": {
|
||||
"input_name": "$t(common.name)",
|
||||
@@ -389,7 +397,8 @@
|
||||
"home": "$t(common.home)",
|
||||
"artists": "$t(entity.artist_other)",
|
||||
"albumArtists": "$t(entity.albumArtist_other)",
|
||||
"shared": "udostępnione $t(entity.playlist_other)"
|
||||
"shared": "udostępnione $t(entity.playlist_other)",
|
||||
"myLibrary": "Moja biblioteka"
|
||||
},
|
||||
"home": {
|
||||
"mostPlayed": "najczęściej odtwarzane",
|
||||
@@ -533,7 +542,7 @@
|
||||
"crossfadeDuration_description": "ustaw czas trwania efektu przenikania",
|
||||
"language": "język",
|
||||
"hotkey_toggleShuffle": "przełącz kolejność losową",
|
||||
"discordRichPresence_description": "włącz status odtwarzania w {{discord}} (rich presence). Dzięki temu będą wyświetlane informacje takie jak: {{icon}}, {{playing}} i {{paused}}. ",
|
||||
"discordRichPresence_description": "włącz status odtwarzania w {{discord}} (rich presence). Dzięki temu będą wyświetlane informacje takie jak: {{icon}}, {{playing}} i {{paused}}",
|
||||
"audioDevice": "urządzenia dźwiękowe",
|
||||
"hotkey_rate2": "oceń na 2 gwiazdki",
|
||||
"exitToTray": "zamknij do zasobnika",
|
||||
@@ -707,7 +716,15 @@
|
||||
"doubleClickBehavior_description": "jeżeli włączone, wszystkie pasujące utwory w wyszukiwaniu zostaną zakolejkowane. w przeciwnym wypadku, tylko kliknięty będzie zakolejkowany",
|
||||
"lastfmApiKey": "klucz API {{lastfm}}",
|
||||
"lastfmApiKey_description": "klucz API dla {{lastfm}}. wymagany dla okładek",
|
||||
"translationTargetLanguage": "docelowy język tłumaczenia"
|
||||
"translationTargetLanguage": "docelowy język tłumaczenia",
|
||||
"discordPausedStatus_description": "jeżeli włączone, status będzie pokazywany kiedy odtwarzanie jest wstrzymane",
|
||||
"preferLocalLyrics": "preferuj lokalne teksty",
|
||||
"preferLocalLyrics_description": "jeśli to możliwe, preferuj lokalne teksty zamiast tekstów zdalnych",
|
||||
"lastfm": "pokazuj linki do last.fm",
|
||||
"lastfm_description": "pokazuj linki do last.fm na stronach artystów/albumów",
|
||||
"notify": "włącz powiadomienia o piosenkach",
|
||||
"musicbrainz": "pokazuj linki do musicbrainz",
|
||||
"musicbrainz_description": "pokazuj linki do musicbrainz na stronach artystów/albumów, gdzie istnieje mbid"
|
||||
},
|
||||
"table": {
|
||||
"config": {
|
||||
|
||||
@@ -93,7 +93,9 @@
|
||||
"albumPeak": "pico do álbum",
|
||||
"trackGain": "ganho da faixa",
|
||||
"additionalParticipants": "participantes adicionais",
|
||||
"tags": "tags"
|
||||
"tags": "tags",
|
||||
"newVersion": "uma nova versão foi instalada ({{version}})",
|
||||
"viewReleaseNotes": "ver notas de lançamento"
|
||||
},
|
||||
"action": {
|
||||
"goToPage": "vá para página",
|
||||
@@ -216,7 +218,9 @@
|
||||
"crossfadeDuration_description": "define a duração do efeito crossfade",
|
||||
"customCssNotice": "Aviso: apesar de existir alguma higienização (url() e content: não são permitidas), o uso de CSS personalizado ainda pode representar riscos ao alterar a interface.",
|
||||
"crossfadeStyle": "estilo do crossfade",
|
||||
"crossfadeStyle_description": "seleciona qual estilo de crossfade usado no player de áudio"
|
||||
"crossfadeStyle_description": "seleciona qual estilo de crossfade usado no player de áudio",
|
||||
"disableAutomaticUpdates": "desabilitar atualizações automáticas",
|
||||
"disableLibraryUpdateOnStartup": "desabilitar a verificação de novas versões na inicialização"
|
||||
},
|
||||
"table": {
|
||||
"config": {
|
||||
@@ -273,7 +277,8 @@
|
||||
"nowPlaying": "tocando agora",
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"search": "$t(common.search)",
|
||||
"settings": "$t(common.setting_other)"
|
||||
"settings": "$t(common.setting_other)",
|
||||
"myLibrary": "minha biblioteca"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist_other)"
|
||||
|
||||
@@ -0,0 +1,545 @@
|
||||
{
|
||||
"action": {
|
||||
"addToFavorites": "adicionar a $t(entity.favorite_other)",
|
||||
"addToPlaylist": "adicionar a $t(entity.playlist_one)",
|
||||
"clearQueue": "limpar fila",
|
||||
"createPlaylist": "criar $t(entity.playlist_one)",
|
||||
"deletePlaylist": "apagar $t(entity.playlist_one)",
|
||||
"deselectAll": "desmarcar todos",
|
||||
"editPlaylist": "editar $t(entity.playlist_one)",
|
||||
"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)",
|
||||
"removeFromQueue": "remover da fila",
|
||||
"setRating": "definir classificação",
|
||||
"toggleSmartPlaylistEditor": "alternar editor $t(entity.smartPlaylist)",
|
||||
"viewPlaylists": "ver $t(entity.playlist_other)",
|
||||
"openIn": {
|
||||
"lastfm": "Abrir em Last.fm",
|
||||
"musicbrainz": "Abrir em MusicBrainz"
|
||||
}
|
||||
},
|
||||
"common": {
|
||||
"action_one": "ação",
|
||||
"action_many": "ações",
|
||||
"action_other": "ações",
|
||||
"add": "adicionar",
|
||||
"additionalParticipants": "participantes adicionais",
|
||||
"newVersion": "uma nova versão foi instalada ({{version}})",
|
||||
"viewReleaseNotes": "ver notas de lançamento",
|
||||
"albumGain": "ganho do álbum",
|
||||
"albumPeak": "pico do álbum",
|
||||
"areYouSure": "tem certeza?",
|
||||
"ascending": "ascendente",
|
||||
"backward": "para trás",
|
||||
"biography": "biografia",
|
||||
"bitrate": "taxa de bits",
|
||||
"bpm": "bpm",
|
||||
"cancel": "cancelar",
|
||||
"center": "centro",
|
||||
"channel_one": "canal",
|
||||
"channel_many": "canais",
|
||||
"channel_other": "canais",
|
||||
"clear": "limpar",
|
||||
"close": "fechar",
|
||||
"codec": "codec",
|
||||
"collapse": "minimizar",
|
||||
"comingSoon": "em breve…",
|
||||
"configure": "configurar",
|
||||
"confirm": "confirmar",
|
||||
"create": "criar",
|
||||
"currentSong": "$t(entity.track_one) atual",
|
||||
"decrease": "diminuir",
|
||||
"delete": "apagar",
|
||||
"descending": "abaixar",
|
||||
"description": "descrição",
|
||||
"disable": "desativar",
|
||||
"disc": "disco",
|
||||
"dismiss": "liberar",
|
||||
"duration": "duração",
|
||||
"edit": "editar",
|
||||
"enable": "ativar",
|
||||
"expand": "expandir",
|
||||
"favorite": "favorito",
|
||||
"filter_one": "filtro",
|
||||
"filter_many": "filtros",
|
||||
"filter_other": "filtros",
|
||||
"filters": "filtros",
|
||||
"forceRestartRequired": "reinicie para aplicar as alterações… feche a notificação para reiniciar",
|
||||
"forward": "para frente",
|
||||
"gap": "intervalo",
|
||||
"home": "início",
|
||||
"increase": "incrementar",
|
||||
"left": "esquerda",
|
||||
"limit": "limite",
|
||||
"manage": "gerir",
|
||||
"maximize": "maximizar",
|
||||
"menu": "menu",
|
||||
"minimize": "minimizar",
|
||||
"modified": "modificado",
|
||||
"mbid": "ID no MusicBrainz",
|
||||
"name": "nome",
|
||||
"no": "não",
|
||||
"none": "nenhum",
|
||||
"noResultsFromQuery": "a consulta não retornou resultados",
|
||||
"note": "observação",
|
||||
"ok": "ok",
|
||||
"owner": "dono",
|
||||
"path": "caminho",
|
||||
"playerMustBePaused": "o player deve estar pausado",
|
||||
"preview": "pré-visualizar",
|
||||
"previousSong": "anterior $t(entity.track_one)",
|
||||
"quit": "sair",
|
||||
"random": "aleatório",
|
||||
"rating": "classificação",
|
||||
"refresh": "atualizar",
|
||||
"reload": "recarregar",
|
||||
"reset": "reiniciar",
|
||||
"resetToDefault": "restaurar ao padrão",
|
||||
"restartRequired": "é necessário reiniciar",
|
||||
"right": "direita",
|
||||
"save": "gravar",
|
||||
"saveAndReplace": "gravar e substituir",
|
||||
"saveAs": "gravar como",
|
||||
"search": "procurar",
|
||||
"setting": "configuração",
|
||||
"share": "partilhar",
|
||||
"size": "tamanho",
|
||||
"sortOrder": "ordem",
|
||||
"tags": "tags",
|
||||
"title": "titulo",
|
||||
"trackNumber": "faixa",
|
||||
"trackGain": "ganho da faixa",
|
||||
"trackPeak": "pico da faixa",
|
||||
"translation": "tradução",
|
||||
"unknown": "desconhecido",
|
||||
"version": "versão",
|
||||
"year": "ano",
|
||||
"yes": "sim"
|
||||
},
|
||||
"entity": {
|
||||
"album_one": "álbum",
|
||||
"album_many": "álbuns",
|
||||
"album_other": "álbuns",
|
||||
"albumArtist_one": "artista do álbum",
|
||||
"albumArtist_many": "artistas do álbum",
|
||||
"albumArtist_other": "artistas do álbum",
|
||||
"albumArtistCount_one": "{{count}} artista do álbum",
|
||||
"albumArtistCount_many": "{{count}} artistas do álbum",
|
||||
"albumArtistCount_other": "{{count}} artistas do álbum",
|
||||
"albumWithCount_one": "{{count}} álbum",
|
||||
"albumWithCount_many": "{{count}} álbuns",
|
||||
"albumWithCount_other": "{{count}} álbuns",
|
||||
"artist_one": "artista",
|
||||
"artist_many": "artistas",
|
||||
"artist_other": "artistas",
|
||||
"artistWithCount_one": "{{count}} artista",
|
||||
"artistWithCount_many": "{{count}} artistas",
|
||||
"artistWithCount_other": "{{count}} artistas",
|
||||
"favorite_one": "favorito",
|
||||
"favorite_many": "favoritos",
|
||||
"favorite_other": "favoritos",
|
||||
"folder_one": "pasta",
|
||||
"folder_many": "pastas",
|
||||
"folder_other": "pastas",
|
||||
"folderWithCount_one": "{{count}} pasta",
|
||||
"folderWithCount_many": "{{count}} pastas",
|
||||
"folderWithCount_other": "{{count}} pastas",
|
||||
"genre_one": "gênero",
|
||||
"genre_many": "gêneros",
|
||||
"genre_other": "gêneros",
|
||||
"genreWithCount_one": "{{count}} gênero",
|
||||
"genreWithCount_many": "{{count}} gêneros",
|
||||
"genreWithCount_other": "{{count}} gêneros",
|
||||
"playlist_one": "playlist",
|
||||
"playlist_many": "playlists",
|
||||
"playlist_other": "playlists",
|
||||
"play_one": "{{count}} reprodução",
|
||||
"play_many": "{{count}} reproduções",
|
||||
"play_other": "{{count}} reproduções",
|
||||
"playlistWithCount_one": "{{count}} playlist",
|
||||
"playlistWithCount_many": "{{count}} playlists",
|
||||
"playlistWithCount_other": "{{count}} playlists",
|
||||
"smartPlaylist": "$t(entity.playlist_one) inteligente",
|
||||
"track_one": "faixa",
|
||||
"track_many": "faixas",
|
||||
"track_other": "faixas",
|
||||
"song_one": "música",
|
||||
"song_many": "músicas",
|
||||
"song_other": "músicas",
|
||||
"trackWithCount_one": "{{count}} faixa",
|
||||
"trackWithCount_many": "{{count}} faixas",
|
||||
"trackWithCount_other": "{{count}} faixas"
|
||||
},
|
||||
"error": {
|
||||
"apiRouteError": "não é possível encaminhar a solicitação",
|
||||
"audioDeviceFetchError": "ocorreu um erro ao tentar obter dispositivos de áudio",
|
||||
"authenticationFailed": "falha na autenticação",
|
||||
"badAlbum": "está a ver este erro por que está música não é parte de algum album. um motivo comum para si estar a ver este erro é se a sua música estiver na raiz da sua pasta de músicas. o jellyfin apenas agrupa as músicas se elas estiveram na mesma pasta.",
|
||||
"badValue": "opção inválida \"{{value}}\". este valor não existe no momento",
|
||||
"credentialsRequired": "credenciais necessárias",
|
||||
"endpointNotImplementedError": "endpoint {{endpoint}} não está implementado para {{serverType}}",
|
||||
"genericError": "um erro ocorreu",
|
||||
"invalidServer": "servidor inválido",
|
||||
"localFontAccessDenied": "acesso a fontes locais rejeitado",
|
||||
"loginRateError": "muitas tentativas de login, tente novamente em alguns segundos",
|
||||
"mpvRequired": "MPV necessário",
|
||||
"networkError": "ocorreu um erro na internet",
|
||||
"openError": "não foi possível abrir o ficheiro",
|
||||
"playbackError": "ocorreu um erro ao tentar reproduzir a média",
|
||||
"remoteDisableError": "ocorreu um erro ao tentar $t(common.disable) o servidor remoto",
|
||||
"remoteEnableError": "ocorreu um erro ao tentar $t(common.enable) o servidor remoto",
|
||||
"remotePortError": "ocorreu um erro ao tentar definir a porta do servidor remoto",
|
||||
"remotePortWarning": "reinicie o servidor para aplicar a nova porta",
|
||||
"serverNotSelectedError": "nenhum servidor selecionado",
|
||||
"serverRequired": "servidor necessário",
|
||||
"sessionExpiredError": "a sua sessão expirou",
|
||||
"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)",
|
||||
"biography": "bibliografia",
|
||||
"bitrate": "bitrate",
|
||||
"bpm": "bpm",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"comment": "comentário",
|
||||
"communityRating": "Nota da comunidade",
|
||||
"criticRating": "avaliação da crítica",
|
||||
"dateAdded": "data de adição",
|
||||
"disc": "disco",
|
||||
"duration": "duração",
|
||||
"favorited": "favoritado",
|
||||
"fromYear": "a partir do ano",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"id": "id",
|
||||
"isCompilation": "é compilação",
|
||||
"isFavorited": "é favoritado",
|
||||
"isPublic": "é público",
|
||||
"isRated": "possui avaliação",
|
||||
"isRecentlyPlayed": "foi tocado recentemente",
|
||||
"lastPlayed": "última tocada",
|
||||
"mostPlayed": "mais tocado",
|
||||
"name": "nome",
|
||||
"note": "nota",
|
||||
"owner": "$t(common.owner)",
|
||||
"path": "caminho",
|
||||
"playCount": "contador de reproduções",
|
||||
"random": "aleatório",
|
||||
"rating": "avaliação",
|
||||
"recentlyAdded": "adicionado recentemente",
|
||||
"recentlyPlayed": "tocado recentemente",
|
||||
"recentlyUpdated": "atualizado recentemente",
|
||||
"releaseDate": "data de lançamento",
|
||||
"releaseYear": "ano de lançamento",
|
||||
"search": "buscar",
|
||||
"songCount": "contador de músicas",
|
||||
"title": "titulo",
|
||||
"toYear": "até o ano",
|
||||
"trackNumber": "faixa"
|
||||
},
|
||||
"form": {
|
||||
"addServer": {
|
||||
"error_savePassword": "um erro ocorreu ao tentar gravar a palavra-passe",
|
||||
"ignoreCors": "ignorar CORS ($t(common.restartRequired))",
|
||||
"ignoreSsl": "ignorar ssl ($t(common.restartRequired))",
|
||||
"input_legacyAuthentication": "ativar autenticação legada",
|
||||
"input_name": "nome do servidor",
|
||||
"input_password": "palavra-passe",
|
||||
"input_savePassword": "gravar palavra-passe",
|
||||
"input_url": "url",
|
||||
"input_username": "nome de utilizador",
|
||||
"success": "servidor adicionado com sucesso",
|
||||
"title": "adicionar servidor"
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"input_playlists": "$t(entity.playlist_other)",
|
||||
"input_skipDuplicates": "pular duplicadas",
|
||||
"success": "adicionado $t(entity.trackWithCount, {\"count\": {{message}} }) para $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })",
|
||||
"title": "adicionar à $t(entity.playlist_one)"
|
||||
},
|
||||
"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)"
|
||||
},
|
||||
"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)"
|
||||
},
|
||||
"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)"
|
||||
},
|
||||
"lyricSearch": {
|
||||
"input_artist": "$t(entity.artist_one)",
|
||||
"input_name": "$t(common.name)",
|
||||
"title": "pesquisa de letras"
|
||||
},
|
||||
"queryEditor": {
|
||||
"input_optionMatchAll": "corresponder todos",
|
||||
"input_optionMatchAny": "corresponder qualquer um"
|
||||
},
|
||||
"shareItem": {
|
||||
"allowDownloading": "permitir descargas",
|
||||
"description": "descrição",
|
||||
"setExpiration": "definir expiração",
|
||||
"success": "ligação de compartilhamento copiado para a área de transferência (ou clique aqui para abrir)",
|
||||
"expireInvalid": "a expiração deve ser uma data futura",
|
||||
"createFailed": "falha ao criar compartilhamento (o compartilhamento está ativado?)"
|
||||
},
|
||||
"updateServer": {
|
||||
"success": "servidor atualizado com sucesso",
|
||||
"title": "atualizar servidor"
|
||||
}
|
||||
},
|
||||
"page": {
|
||||
"albumArtistDetail": {
|
||||
"about": "Sobre {{artist}}",
|
||||
"appearsOn": "aparece em",
|
||||
"recentReleases": "lançamentos recentes",
|
||||
"viewDiscography": "ver discografia",
|
||||
"relatedArtists": "$t(entity.artist_other) relacionados",
|
||||
"topSongs": "músicas mais tocadas",
|
||||
"topSongsFrom": "músicas mais tocadas de {{title}}",
|
||||
"viewAll": "ver tudo",
|
||||
"viewAllTracks": "ver todas as $t(entity.track_other)"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "mais deste $t(entity.artist_one)",
|
||||
"moreFromGeneric": "mais que {{elemento}}",
|
||||
"released": "lançado"
|
||||
},
|
||||
"albumList": {
|
||||
"artistAlbums": "álbuns de {{artist}}",
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)",
|
||||
"title": "$t(entity.album_other)"
|
||||
},
|
||||
"appMenu": {
|
||||
"collapseSidebar": "recolher barra lateral",
|
||||
"expandSidebar": "expandir barra lateral",
|
||||
"goBack": "voltar",
|
||||
"goForward": "avançar",
|
||||
"manageServers": "gerir servidores",
|
||||
"openBrowserDevtools": "abrir ferramentas do programador",
|
||||
"quit": "$t(common.quit)",
|
||||
"selectServer": "selecionar servidor",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"version": "versão {{version}}"
|
||||
},
|
||||
"manageServers": {
|
||||
"title": "gerir servidores",
|
||||
"serverDetails": "pormenores do servidor",
|
||||
"url": "URL",
|
||||
"username": "nome de utilizador",
|
||||
"editServerDetailsTooltip": "editar pormenores do servidor",
|
||||
"removeServer": "remover servidor"
|
||||
},
|
||||
"contextMenu": {
|
||||
"addFavorite": "$t(action.addToFavorites)",
|
||||
"addLast": "$t(player.addLast)",
|
||||
"addNext": "$t(player.addNext)",
|
||||
"addToFavorites": "$t(action.addToFavorites)",
|
||||
"addToPlaylist": "$t(action.addToPlaylist)",
|
||||
"createPlaylist": "$t(action.createPlaylist)",
|
||||
"deletePlaylist": "$t(action.deletePlaylist)",
|
||||
"deselectAll": "$t(action.deselectAll)",
|
||||
"download": "descarregar",
|
||||
"moveToNext": "$t(action.moveToNext)",
|
||||
"moveToBottom": "$t(action.moveToBottom)",
|
||||
"moveToTop": "$t(action.moveToTop)",
|
||||
"numberSelected": "{{count}} selecionado",
|
||||
"play": "$t(player.play)",
|
||||
"playSimilarSongs": "$t(player.playSimilarSongs)",
|
||||
"removeFromFavorites": "$t(action.removeFromFavorites)",
|
||||
"removeFromPlaylist": "$t(action.removeFromPlaylist)",
|
||||
"removeFromQueue": "$t(action.removeFromQueue)",
|
||||
"setRating": "$t(action.setRating)",
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"shareItem": "partilhar elemento",
|
||||
"showDetails": "obter informações"
|
||||
},
|
||||
"fullscreenPlayer": {
|
||||
"config": {
|
||||
"dynamicBackground": "fundo dinâmico",
|
||||
"dynamicImageBlur": "tamanho do desfoque da imagem",
|
||||
"dynamicIsImage": "ativar imagem de fundo",
|
||||
"followCurrentLyric": "acompanhar letra",
|
||||
"lyricAlignment": "alinhamento da letra",
|
||||
"lyricOffset": "deslocamento da letra (ms)",
|
||||
"lyricGap": "espaçamento da letra",
|
||||
"lyricSize": "tamanho da letra",
|
||||
"opacity": "opacidade",
|
||||
"showLyricMatch": "exibir correspondência da letra",
|
||||
"showLyricProvider": "exibir origem da letra",
|
||||
"synchronized": "sincronizado",
|
||||
"unsynchronized": "não sincronizado",
|
||||
"useImageAspectRatio": "usar proporção da imagem"
|
||||
},
|
||||
"lyrics": "letra",
|
||||
"related": "relacionado",
|
||||
"upNext": "a seguir",
|
||||
"visualizer": "visualizador",
|
||||
"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)"
|
||||
},
|
||||
"globalSearch": {
|
||||
"commands": {
|
||||
"goToPage": "ir à página",
|
||||
"searchFor": "procurar {{query}}",
|
||||
"serverCommands": "comandos do servidor"
|
||||
},
|
||||
"title": "comandos"
|
||||
},
|
||||
"home": {
|
||||
"explore": "explore a sua biblioteca",
|
||||
"mostPlayed": "mais tocado",
|
||||
"newlyAdded": "lançamentos recém-adicionados",
|
||||
"recentlyPlayed": "tocado recentemente",
|
||||
"title": "$t(common.home)"
|
||||
},
|
||||
"itemDetail": {
|
||||
"copyPath": "copiar caminho para a área de transferência",
|
||||
"copiedPath": "caminho copiado com sucesso",
|
||||
"openFile": "mostrar faixa no gestor de ficheiros"
|
||||
},
|
||||
"playlist": {
|
||||
"reorder": "reordenar apenas disponível quando ordenado pelo id"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist_other)"
|
||||
},
|
||||
"setting": {
|
||||
"advanced": "avançado",
|
||||
"generalTab": "geral",
|
||||
"hotkeysTab": "teclas de atalho",
|
||||
"playbackTab": "reprodução",
|
||||
"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)",
|
||||
"home": "$t(common.home)",
|
||||
"myLibrary": "a minha biblioteca",
|
||||
"nowPlaying": "agora a tocar",
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"search": "$t(common.search)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"shared": "$t(entity.playlist_other) partilhada",
|
||||
"tracks": "$t(entity.track_other)"
|
||||
},
|
||||
"trackList": {
|
||||
"artistTracks": "faixas de {{artist}}",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track_other)",
|
||||
"title": "$t(entity.track_other)"
|
||||
}
|
||||
},
|
||||
"player": {
|
||||
"addLast": "adicionar no final",
|
||||
"addNext": "adicionar a seguir",
|
||||
"favorite": "favorito",
|
||||
"mute": "mudo",
|
||||
"muted": "mudo",
|
||||
"next": "próximo",
|
||||
"play": "tocar",
|
||||
"playbackFetchCancel": "isto demora um pouco... feche a notificação para cancelar",
|
||||
"playbackFetchInProgress": "a carregar músicas…",
|
||||
"playbackFetchNoResults": "nenhuma música encontrada",
|
||||
"playbackSpeed": "velocidade de reprodução",
|
||||
"playRandom": "tocar aleatório",
|
||||
"playSimilarSongs": "tocar músicas similares",
|
||||
"previous": "anterior",
|
||||
"queue_clear": "limpar fila",
|
||||
"queue_moveToBottom": "mover selecionados para o topo",
|
||||
"queue_moveToTop": "mover selecionados para o fim",
|
||||
"queue_remove": "remover selecionados",
|
||||
"repeat": "repetir",
|
||||
"repeat_all": "repetir tudo",
|
||||
"repeat_off": "repetição desativada",
|
||||
"shuffle": "tocar aleatório",
|
||||
"shuffle_off": "aleatório desativado",
|
||||
"skip": "pular",
|
||||
"skip_back": "retroceder",
|
||||
"skip_forward": "avançar",
|
||||
"stop": "parar",
|
||||
"toggleFullscreenPlayer": "alternar player de ecrã cheio",
|
||||
"unfavorite": "remover favorito",
|
||||
"pause": "pausar",
|
||||
"viewQueue": "ver fila"
|
||||
},
|
||||
"setting": {
|
||||
"accentColor": "cor de realce",
|
||||
"accentColor_description": "define a cor de realce para a aplicação",
|
||||
"albumBackground": "imagem de fundo do álbum",
|
||||
"albumBackground_description": "adiciona uma imagem de fundo contendo a arte do álbum para a página de álbum",
|
||||
"albumBackgroundBlur": "tamanho de desfoque da imagem de fundo do álbum",
|
||||
"albumBackgroundBlur_description": "ajusta a quantidade de desfoque aplicada para a imagem de fundo do álbum",
|
||||
"applicationHotkeys": "teclas de atalho da aplicação",
|
||||
"applicationHotkeys_description": "configure as teclas de atalho da aplicação. clique na caixa de seleção para definir como tecla de atalho global (somente desktop)",
|
||||
"artistConfiguration": "configuração da página de artista de álbum",
|
||||
"artistConfiguration_description": "configure quais elementos serão mostrados, e em qual ordem, na página de artista de álbum",
|
||||
"audioDevice": "dispositivo de áudio",
|
||||
"audioDevice_description": "selecione o dispositivo de áudio usado para reprodução (somente player web)",
|
||||
"audioExclusiveMode": "modo de áudio exclusivo",
|
||||
"audioExclusiveMode_description": "ativar modo de saída exclusiva. Neste modo, o sistema é geralmente bloqueado, e apenas mpv terá saída de áudio",
|
||||
"audioPlayer": "player de áudio",
|
||||
"audioPlayer_description": "selecione o player de áudio usado para reprodução",
|
||||
"buttonSize": "tamanho do botão da barra de reprodução",
|
||||
"buttonSize_description": "o tamanho dos botões da barra de reprodução",
|
||||
"clearCache": "limpar cache do navegador",
|
||||
"clearCache_description": "uma 'limpeza geral' do feishin. em adição a limpar o cache do feishin, limpa o cache do navegador (imagens gravadas e outros recursos). as credenciais de servidor e as configurações serão mantidas",
|
||||
"clearQueryCache": "limpar cache do feishin",
|
||||
"clearQueryCache_description": "uma 'limpeza leve' do feishin. isto irá renovar playlists, metadados de faixas, e resetar letras gravadas. as configurações, as credenciais de servidor e o cache de imagens serão mantidos",
|
||||
"clearCacheSuccess": "cache limpo com sucesso",
|
||||
"contextMenu": "configuração do menu de contexto (clique do botão direito do rato)",
|
||||
"contextMenu_description": "permite esconder elementos exibidos no menu quando clica num elemento com o botão direito. elementos não selecionados serão escondidos",
|
||||
"crossfadeDuration": "duraçao de crossfade",
|
||||
"crossfadeDuration_description": "define a duração do efeito crossfade",
|
||||
"crossfadeStyle": "estilo do crossfade",
|
||||
"crossfadeStyle_description": "seleciona qual estilo de crossfade usado no player de áudio",
|
||||
"customCssEnable": "ativar css customizado",
|
||||
"customCssEnable_description": "permite escrever css customizado.",
|
||||
"customCssNotice": "Aviso: apesar de existir alguma higienização (url() e content: não são permitidas), o uso de CSS personalizado ainda pode representar riscos ao alterar a interface.",
|
||||
"customCss": "css customizado",
|
||||
"disableAutomaticUpdates": "desativar atualizações automáticas",
|
||||
"disableLibraryUpdateOnStartup": "desativar a verificação de novas versões na inicialização",
|
||||
"discordApplicationId": "{{discord}} ID da aplicação",
|
||||
"discordIdleStatus_description": "quando ativado, atualiza o estado enquanto o player está ocioso",
|
||||
"discordUpdateInterval_description": "o tempo em segundos entre cada atualização (mínimo 15 segundos)",
|
||||
"playButtonBehavior_description": "define o comportamento padrão do botão play ao adicionar músicas à fila"
|
||||
},
|
||||
"table": {
|
||||
"column": {
|
||||
"discNumber": "disco",
|
||||
"size": "$t(common.size)",
|
||||
"title": "titulo"
|
||||
},
|
||||
"config": {
|
||||
"label": {
|
||||
"discNumber": "numero do disco",
|
||||
"titleCombined": "$t(common.title) (combinado)"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -86,7 +86,7 @@
|
||||
"confirm": "подтвердить",
|
||||
"resetToDefault": "сбросить настройки",
|
||||
"home": "главная",
|
||||
"comingSoon": "скоро...",
|
||||
"comingSoon": "скоро…",
|
||||
"reset": "сбросить",
|
||||
"channel_one": "канал",
|
||||
"channel_few": "канала",
|
||||
@@ -333,7 +333,7 @@
|
||||
"next": "следующий",
|
||||
"shuffle": "перемешать",
|
||||
"playbackFetchNoResults": "песни не найдены",
|
||||
"playbackFetchInProgress": "загрузка песен..",
|
||||
"playbackFetchInProgress": "загрузка песен…",
|
||||
"addNext": "воспроизвести следующим",
|
||||
"playbackSpeed": "скорость воспроизведения",
|
||||
"playbackFetchCancel": "пожалуйста, подождите немного... закройте уведомление для отмены",
|
||||
@@ -759,7 +759,7 @@
|
||||
"artistConfiguration": "конфигурация страницы альбомов исполнителей",
|
||||
"artistConfiguration_description": "позволяет настроить видимость и порядок элементов на странице альбомов исполнителей",
|
||||
"fontType_description": "встроенный позволяет выбрать один из шрифтов, предоставляемых Feishin. системный позволяет выбрать любой шрифт, предоставляемый вашей операционной системой. пользовательский позволяет выбрать свой собственный шрифт",
|
||||
"discordRichPresence_description": "включить статус воспроизведения в статус профиля в {{discord}}. Ключи изображений: {{icon}}, {{playing}} и {{paused}} ",
|
||||
"discordRichPresence_description": "включить статус воспроизведения в статус профиля в {{discord}}. Ключи изображений: {{icon}}, {{playing}} и {{paused}}",
|
||||
"lyricOffset": "синхронизация текста треков (мс)"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,594 @@
|
||||
{
|
||||
"action": {
|
||||
"addToFavorites": "pridať do $t(entity.favorite_other)",
|
||||
"addToPlaylist": "pridať do $t(entity.playlist_one)",
|
||||
"clearQueue": "vymazať frontu",
|
||||
"createPlaylist": "vytvoriť $t(entity.playlist_one)",
|
||||
"deletePlaylist": "odstrániť $t(entity.playlist_one)",
|
||||
"deselectAll": "odznačiť všetko",
|
||||
"editPlaylist": "upraviť $t(entity.playlist_one)",
|
||||
"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)",
|
||||
"removeFromQueue": "odstrániť z fronty",
|
||||
"setRating": "ohodnotiť",
|
||||
"toggleSmartPlaylistEditor": "prepnúť $t(entity.smartPlaylist) editor",
|
||||
"viewPlaylists": "zobraziť $t(entity.playlist_other)",
|
||||
"openIn": {
|
||||
"lastfm": "Otvoriť v Last.fm",
|
||||
"musicbrainz": "Otvoriť v MusicBrainz"
|
||||
}
|
||||
},
|
||||
"common": {
|
||||
"action_one": "akcia",
|
||||
"action_few": "akcie",
|
||||
"action_other": "akcií",
|
||||
"add": "pridať",
|
||||
"additionalParticipants": "ďalší účastníci",
|
||||
"newVersion": "bola nainštalovaná nová verzia ({{version}})",
|
||||
"viewReleaseNotes": "zobraziť poznámky k vydaniu",
|
||||
"albumGain": "hranosť albumu",
|
||||
"albumPeak": "vrchol albumu",
|
||||
"areYouSure": "ste si istý?",
|
||||
"ascending": "vzostupne",
|
||||
"backward": "dozadu",
|
||||
"biography": "životopis",
|
||||
"bitDepth": "bitová hĺbka",
|
||||
"bitrate": "bitrate",
|
||||
"bpm": "bpm",
|
||||
"cancel": "zrušiť",
|
||||
"center": "uprostred",
|
||||
"channel_one": "kanál",
|
||||
"channel_few": "kanály",
|
||||
"channel_other": "kanálov",
|
||||
"clear": "vyčistiť",
|
||||
"close": "zavrieť",
|
||||
"codec": "kodek",
|
||||
"collapse": "zbaliť",
|
||||
"comingSoon": "čoskoro…",
|
||||
"configure": "nastaviť",
|
||||
"confirm": "potvrdiť",
|
||||
"create": "vytvoriť",
|
||||
"currentSong": "aktuálne $t(entity.track_one)",
|
||||
"decrease": "znížiť",
|
||||
"delete": "zmazať",
|
||||
"descending": "zostupne",
|
||||
"description": "popis",
|
||||
"disable": "zakázať",
|
||||
"disc": "disk",
|
||||
"dismiss": "zamietnuť",
|
||||
"duration": "dĺžka",
|
||||
"edit": "zmeniť",
|
||||
"enable": "povoliť",
|
||||
"expand": "rozbaliť",
|
||||
"favorite": "obľúbené",
|
||||
"filter_one": "filter",
|
||||
"filter_few": "filtre",
|
||||
"filter_other": "filtrov",
|
||||
"filters": "filtre",
|
||||
"forceRestartRequired": "zmeny vyžadujú reštart... zavretím upozornenia sa aplikácia reštartuje",
|
||||
"forward": "dopredu",
|
||||
"gap": "medzera",
|
||||
"home": "domov",
|
||||
"increase": "zvýšiť",
|
||||
"left": "vľavo",
|
||||
"limit": "limit",
|
||||
"manage": "spravovať",
|
||||
"maximize": "maximalizovať",
|
||||
"menu": "ponuka",
|
||||
"minimize": "minimalizovať",
|
||||
"modified": "zmenené",
|
||||
"mbid": "MusicBrainz ID",
|
||||
"name": "meno",
|
||||
"no": "nie",
|
||||
"none": "žiadny",
|
||||
"noResultsFromQuery": "dopyt nevrátil žiadne výsledky",
|
||||
"note": "poznámka",
|
||||
"ok": "ok",
|
||||
"owner": "majiteľ",
|
||||
"path": "cesta",
|
||||
"playerMustBePaused": "prehrávač musí byť pozastavený",
|
||||
"preview": "náhľad",
|
||||
"previousSong": "predchádzajúci $t(entity.track_one)",
|
||||
"quit": "ukončiť",
|
||||
"random": "náhodne",
|
||||
"rating": "hodnotenie",
|
||||
"refresh": "obnoviť",
|
||||
"reload": "znovu načítať",
|
||||
"reset": "resetovať",
|
||||
"resetToDefault": "resetovať na predvolené",
|
||||
"restartRequired": "vyžaduje sa reštart",
|
||||
"right": "vpravo",
|
||||
"sampleRate": "vzorkovacia frekvencia",
|
||||
"save": "uložiť",
|
||||
"saveAndReplace": "uložiť a nahradiť",
|
||||
"saveAs": "uložiť ako",
|
||||
"search": "vyhľadať",
|
||||
"setting": "nastavenie",
|
||||
"share": "zdieľať",
|
||||
"size": "veľkosť",
|
||||
"sortOrder": "poradie",
|
||||
"tags": "štítky",
|
||||
"title": "názov",
|
||||
"trackNumber": "skladba",
|
||||
"trackGain": "hranosť skladby",
|
||||
"trackPeak": "vrchol skladby",
|
||||
"translation": "preklad",
|
||||
"unknown": "neznámy",
|
||||
"version": "verzia",
|
||||
"year": "rok",
|
||||
"yes": "áno"
|
||||
},
|
||||
"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)",
|
||||
"biography": "životopis",
|
||||
"bitrate": "bitrate",
|
||||
"bpm": "bpm",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"comment": "komentár",
|
||||
"communityRating": "hodnotenie komunity",
|
||||
"criticRating": "hodnotenie kritiky",
|
||||
"dateAdded": "dátum pridania",
|
||||
"disc": "disk",
|
||||
"duration": "dĺžka",
|
||||
"favorited": "obľúbené",
|
||||
"fromYear": "od roku",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"id": "id",
|
||||
"isCompilation": "je kompilácia",
|
||||
"isFavorited": "je obľúbený",
|
||||
"isPublic": "je verejný",
|
||||
"isRated": "je hodnotený",
|
||||
"isRecentlyPlayed": "je nedávno hraný",
|
||||
"lastPlayed": "posledne hraný",
|
||||
"mostPlayed": "najhranejší",
|
||||
"note": "poznámka",
|
||||
"owner": "$t(common.owner)",
|
||||
"path": "cesta",
|
||||
"playCount": "počet prehraní",
|
||||
"random": "náhodne",
|
||||
"rating": "hodnotenie",
|
||||
"recentlyAdded": "nedávno pridané",
|
||||
"recentlyPlayed": "nedávno hrané",
|
||||
"recentlyUpdated": "nedávno aktualizované",
|
||||
"releaseDate": "dátum vydania",
|
||||
"releaseYear": "rok vydania",
|
||||
"search": "vyhľadať",
|
||||
"songCount": "počet skladieb",
|
||||
"title": "názov",
|
||||
"toYear": "do roku",
|
||||
"trackNumber": "stopa"
|
||||
},
|
||||
"form": {
|
||||
"addServer": {
|
||||
"input_name": "názov servera",
|
||||
"input_username": "užívateľské meno",
|
||||
"error_savePassword": "pri pokuse o uloženie hesla sa vyskytla chyba",
|
||||
"ignoreCors": "ignorovať cors ($t(common.restartRequired)",
|
||||
"ignoreSsl": "ignorovať ssl ($t(common.restartRequired))",
|
||||
"input_legacyAuthentication": "povoliť zastarané overenie",
|
||||
"input_password": "heslo",
|
||||
"input_savePassword": "uložiť heslo",
|
||||
"input_url": "url",
|
||||
"success": "server úspešne pridaný",
|
||||
"title": "pridať server"
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"input_playlists": "$t(entity.playlist_other)",
|
||||
"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)"
|
||||
},
|
||||
"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)"
|
||||
},
|
||||
"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)"
|
||||
},
|
||||
"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)"
|
||||
},
|
||||
"lyricSearch": {
|
||||
"input_artist": "$t(entity.artist_one)",
|
||||
"input_name": "$t(common.name)",
|
||||
"title": "vyhľadať text skladby"
|
||||
},
|
||||
"queryEditor": {
|
||||
"title": "editor dopytov",
|
||||
"input_optionMatchAll": "zhoda na všetkých",
|
||||
"input_optionMatchAny": "zhoda na ľubovoľnom"
|
||||
},
|
||||
"shareItem": {
|
||||
"allowDownloading": "povoliť sťahovanie",
|
||||
"description": "popis",
|
||||
"setExpiration": "nastaviť vypršanie platnosti",
|
||||
"success": "zdieľať link skopírovaný do schránky (alebo klinutím otvoriť tu)",
|
||||
"expireInvalid": "vypršanie platnosti musí byť v budúcnosti",
|
||||
"createFailed": "nepodarilo sa nazdielať (je zdieľanie povolené)"
|
||||
},
|
||||
"updateServer": {
|
||||
"success": "server bol úspešne aktualizovaný",
|
||||
"title": "aktualizovať server"
|
||||
},
|
||||
"privateMode": {
|
||||
"enabled": "je zapnutý súkromný režim, status prehrávania je pre vonkajšie integrácie skrytý",
|
||||
"disabled": "súkromný režim je vypnutý, status prehrávania je teraz pre vonkajšie integrácie povolený",
|
||||
"title": "súkromný režim"
|
||||
}
|
||||
},
|
||||
"entity": {
|
||||
"album_one": "album",
|
||||
"album_few": "albumy",
|
||||
"album_other": "albumov",
|
||||
"albumArtist_one": "interpret albumu",
|
||||
"albumArtist_few": "interpreti albumu",
|
||||
"albumArtist_other": "interpretov albumu",
|
||||
"albumArtistCount_one": "{{count}} interpret albumu",
|
||||
"albumArtistCount_few": "{{count}} interpreti albumu",
|
||||
"albumArtistCount_other": "{{count}} interpretov albumu",
|
||||
"albumWithCount_one": "{{count}} album",
|
||||
"albumWithCount_few": "{{count}} albumy",
|
||||
"albumWithCount_other": "{{count}} albumov",
|
||||
"artist_one": "interpret",
|
||||
"artist_few": "interpreti",
|
||||
"artist_other": "interpretov",
|
||||
"artistWithCount_one": "{{count}} interpret",
|
||||
"artistWithCount_few": "{{count}} interpreti",
|
||||
"artistWithCount_other": "{{count}} interpretov",
|
||||
"favorite_one": "obľúbený",
|
||||
"favorite_few": "obľúbení",
|
||||
"favorite_other": "obľúbených",
|
||||
"folder_one": "priečinok",
|
||||
"folder_few": "priečinky",
|
||||
"folder_other": "priečinkov",
|
||||
"folderWithCount_one": "{{count}} priečinok",
|
||||
"folderWithCount_few": "{{count}} priečinky",
|
||||
"folderWithCount_other": "{{count}} priečinkov",
|
||||
"genre_one": "žáner",
|
||||
"genre_few": "žánre",
|
||||
"genre_other": "žánrov",
|
||||
"genreWithCount_one": "{{count}} žáner",
|
||||
"genreWithCount_few": "{{count}} žánre",
|
||||
"genreWithCount_other": "{{count}} žánrov",
|
||||
"playlist_one": "playlist",
|
||||
"playlist_few": "playlisty",
|
||||
"playlist_other": "playlistov",
|
||||
"play_one": "{{count}} prehranie",
|
||||
"play_few": "{{count}} prehrania",
|
||||
"play_other": "{{count}} prehraní",
|
||||
"playlistWithCount_one": "{{count}} playlist",
|
||||
"playlistWithCount_few": "{{count}} playlisty",
|
||||
"playlistWithCount_other": "{{count}} playlistov",
|
||||
"smartPlaylist": "smart $t(entity.playlist_one)",
|
||||
"track_one": "stopa",
|
||||
"track_few": "stopy",
|
||||
"track_other": "stôp",
|
||||
"song_one": "skladba",
|
||||
"song_few": "skladby",
|
||||
"song_other": "skladieb",
|
||||
"trackWithCount_one": "{{count}} stopa",
|
||||
"trackWithCount_few": "{{count}} stopy",
|
||||
"trackWithCount_other": "{{count}} stôp"
|
||||
},
|
||||
"error": {
|
||||
"apiRouteError": "nie je možné zaslať požiadavku",
|
||||
"audioDeviceFetchError": "pri vyhľadávaní zvukových zariadení sa vyskytla chyba",
|
||||
"authenticationFailed": "overenie zlyhalo",
|
||||
"badAlbum": "túto stránku vidíte, pretože táto skladba nie je súčasťou albumu. najčastejšou príčinou tohto problému býva umiestnenie skladby priamo v priečinku hudobnej knižnice. jellyfin navzájom prepája iba skladby, ktoré sú spolu v jednom priečinku.",
|
||||
"badValue": "neplatná možnosť \"{{value}}\". táto hodnota už neexistuje",
|
||||
"credentialsRequired": "vyžadujú sa prihlasovacie údaje",
|
||||
"endpointNotImplementedError": "koncový bod {{endpoint}} nie je implementovaný v {{serverType}}",
|
||||
"genericError": "vyskyla sa chyba",
|
||||
"invalidServer": "neplatný server",
|
||||
"localFontAccessDenied": "prístup k lokálnym fontom bol odmietnutý",
|
||||
"loginRateError": "príliš veľa pokusov o prihlásenie, skúste to znova o pár sekúnd",
|
||||
"mpvRequired": "vyžaduje sa MPV",
|
||||
"networkError": "vyskytla sa chyba siete",
|
||||
"notificationDenied": "povolenia na oznámenia boli odmietnuté. toto nastavenie nemá žiadny účinok",
|
||||
"openError": "súbor nebolo možné otvoriť",
|
||||
"playbackError": "pri prehrávaní média sa vyskytla chyba",
|
||||
"remoteDisableError": "pri pokuse o $t(common.disable) vzdialeného severa sa vyskytla chyba",
|
||||
"remoteEnableError": "pri pokuse o $t(common.enable) vzdialeného servera sa vyskytla chyba",
|
||||
"remotePortError": "pri nastavovaní portu vzdialeného servera sa vyskytla chyba",
|
||||
"remotePortWarning": "pre použitie nového portu reštartujte server",
|
||||
"serverNotSelectedError": "nebol vybraný žiadny server",
|
||||
"serverRequired": "vyžaduje sa server",
|
||||
"sessionExpiredError": "vaša relácia vypršala",
|
||||
"systemFontError": "pri pokuse o získanie systémových fontov sa vyskytla chyba"
|
||||
},
|
||||
"page": {
|
||||
"albumArtistDetail": {
|
||||
"about": "O {{artist}}",
|
||||
"appearsOn": "vyskytuje sa na",
|
||||
"recentReleases": "posledné vydania",
|
||||
"viewDiscography": "zobraziť diskografiu",
|
||||
"relatedArtists": "súvisiaci s $t(entity.artist_other)",
|
||||
"topSongs": "top skladby",
|
||||
"topSongsFrom": "top skladby z {{title}}",
|
||||
"viewAll": "zobraziť všetko",
|
||||
"viewAllTracks": "zobraziť všetky $t(entity.track_other)"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "viac od $t(entity.artist_one)",
|
||||
"moreFromGeneric": "viac z {{item}}",
|
||||
"released": "vydané"
|
||||
},
|
||||
"albumList": {
|
||||
"artistAlbums": "albumy {{artist}}",
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)",
|
||||
"title": "$t(entity.album_other)"
|
||||
},
|
||||
"appMenu": {
|
||||
"collapseSidebar": "zbaliť bočnú lištu",
|
||||
"expandSidebar": "rozbaliť bočnú lištu",
|
||||
"goBack": "ísť naspäť",
|
||||
"goForward": "ísť dopredu",
|
||||
"manageServers": "spravovať servery",
|
||||
"privateModeOff": "vypnúť súkromný režim",
|
||||
"privateModeOn": "zapnúť súkromný režim",
|
||||
"openBrowserDevtools": "otvoriť vývojárske nástroje prehliadača",
|
||||
"quit": "$t(common.quit)",
|
||||
"selectServer": "vybrať server",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"version": "verzia {{version}}"
|
||||
},
|
||||
"manageServers": {
|
||||
"title": "spravovať servery",
|
||||
"serverDetails": "podrobnosti servera",
|
||||
"url": "URL",
|
||||
"username": "užívateľské meno",
|
||||
"editServerDetailsTooltip": "zmeniť podrobnosti servera",
|
||||
"removeServer": "odstrániť server"
|
||||
},
|
||||
"contextMenu": {
|
||||
"addFavorite": "$t(action.addToFavorites)",
|
||||
"addLast": "$t(player.addLast)",
|
||||
"addNext": "$t(player.addNext)",
|
||||
"addToFavorites": "$t(action.addToFavorites)",
|
||||
"addToPlaylist": "$t(action.addToPlaylist)",
|
||||
"createPlaylist": "$t(action.createPlaylist)",
|
||||
"deletePlaylist": "$t(action.deletePlaylist)",
|
||||
"deselectAll": "$t(action.deselectAll)",
|
||||
"download": "stiahnuť",
|
||||
"moveToNext": "$t(action.moveToNext)",
|
||||
"moveToBottom": "$t(action.moveToBottom)",
|
||||
"moveToTop": "$t(action.moveToTop)",
|
||||
"numberSelected": "{{count}} vybrané",
|
||||
"play": "$t(player.play)",
|
||||
"playSimilarSongs": "$t(player.playSimilarSongs)",
|
||||
"removeFromFavorites": "$t(action.removeFromFavorites)",
|
||||
"removeFromPlaylist": "$t(action.removeFromPlaylist)",
|
||||
"removeFromQueue": "$t(action.removeFromQueue)",
|
||||
"setRating": "$t(action.setRating)",
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"shareItem": "zdieľať položku",
|
||||
"showDetails": "získať informácie",
|
||||
"goToAlbum": "choď na $t(entity.album_one)",
|
||||
"goToAlbumArtist": "choď na $t(entity.albumArtist_one)"
|
||||
},
|
||||
"fullscreenPlayer": {
|
||||
"config": {
|
||||
"dynamicBackground": "dynamické pozadie",
|
||||
"dynamicImageBlur": "veľkosť rozostrenia obrázku",
|
||||
"dynamicIsImage": "povoliť obrázok pozadia",
|
||||
"followCurrentLyric": "nasleduj aktuálny text skladby",
|
||||
"lyricAlignment": "zarovnanie textov skladieb",
|
||||
"lyricOffset": "posunutie textov skladieb (ms)",
|
||||
"lyricGap": "medzera textov skladieb",
|
||||
"lyricSize": "veľkosť textov skladieb",
|
||||
"opacity": "opacita",
|
||||
"showLyricMatch": "zobraziť zhodu textu skladby",
|
||||
"showLyricProvider": "zobraziť poskytovateľa textov skladieb",
|
||||
"synchronized": "synchronizované",
|
||||
"unsynchronized": "nesynchronizované",
|
||||
"useImageAspectRatio": "použiť pomer strán obrázka"
|
||||
},
|
||||
"lyrics": "texty skladieb",
|
||||
"related": "súvisiace",
|
||||
"upNext": "ďalšia nahor",
|
||||
"visualizer": "vizualizátor",
|
||||
"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)"
|
||||
},
|
||||
"globalSearch": {
|
||||
"commands": {
|
||||
"goToPage": "ísť na stránku",
|
||||
"searchFor": "hľadať {{query}}",
|
||||
"serverCommands": "príkazy servera"
|
||||
},
|
||||
"title": "príkazy"
|
||||
},
|
||||
"home": {
|
||||
"explore": "preskúmať tvoju knižnicu",
|
||||
"mostPlayed": "najhranejší",
|
||||
"newlyAdded": "novopridané vydania",
|
||||
"recentlyPlayed": "nedávno hrané",
|
||||
"title": "$t(common.home)"
|
||||
},
|
||||
"itemDetail": {
|
||||
"copyPath": "skopírovať cestu do schránky",
|
||||
"copiedPath": "cesta úspešne skopírovaná",
|
||||
"openFile": "zobraziť stopu v správcovi súborov"
|
||||
},
|
||||
"playlist": {
|
||||
"reorder": "zmena poradia povolená len pri zoradení podľa id"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist_other)"
|
||||
},
|
||||
"setting": {
|
||||
"advanced": "pokročilé",
|
||||
"generalTab": "všeobecné",
|
||||
"hotkeysTab": "klávesové skratky",
|
||||
"playbackTab": "prehrávanie",
|
||||
"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)",
|
||||
"home": "$t(common.home)",
|
||||
"myLibrary": "moja knižnica",
|
||||
"nowPlaying": "teraz hrá",
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"search": "$t(common.search)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"shared": "zdieľaný $t(entity.playlist_other)",
|
||||
"tracks": "$t(entity.track_other)"
|
||||
},
|
||||
"trackList": {
|
||||
"artistTracks": "skladby {{artist}}",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track_other)",
|
||||
"title": "$t(entity.track_other)"
|
||||
}
|
||||
},
|
||||
"player": {
|
||||
"addLast": "pridať posledné",
|
||||
"addNext": "pridať nasledujúce",
|
||||
"favorite": "obľúbené",
|
||||
"mute": "stíšiť",
|
||||
"muted": "stíšené",
|
||||
"next": "nasledujúci",
|
||||
"play": "prehrať",
|
||||
"playbackFetchCancel": "toto chvíľu trvá... ak to chcete zrušiť, zavrite notifikáciu",
|
||||
"playbackFetchInProgress": "načítanie skladieb…",
|
||||
"playbackFetchNoResults": "neboli nájdené žiadne skladby",
|
||||
"playbackSpeed": "rýchlosť prehrávania",
|
||||
"playRandom": "prehrávať náhodne",
|
||||
"playSimilarSongs": "prehrávať podobné skladby",
|
||||
"previous": "predchádzajúce",
|
||||
"queue_clear": "vymazať frontu",
|
||||
"queue_moveToBottom": "presunúť vybrané navrch",
|
||||
"queue_moveToTop": "presunúť vybrané naspodok",
|
||||
"queue_remove": "odstrániť vybrané",
|
||||
"repeat": "opakovať",
|
||||
"repeat_all": "opakovať všetky",
|
||||
"repeat_off": "opakovanie vypnuté",
|
||||
"shuffle": "prehrávať náhodne",
|
||||
"shuffle_off": "náhodné prehrávanie vypnuté",
|
||||
"skip": "preskočiť",
|
||||
"skip_back": "preskočiť dozadu",
|
||||
"skip_forward": "preskočiť dopredu",
|
||||
"stop": "zastaviť",
|
||||
"toggleFullscreenPlayer": "prepnúť prehrávač na celú obrazovku",
|
||||
"unfavorite": "odstrániť z obľúbených",
|
||||
"pause": "pozastaviť",
|
||||
"viewQueue": "zobraziť frontu"
|
||||
},
|
||||
"setting": {
|
||||
"accentColor": "odtieň farby",
|
||||
"accentColor_description": "nastaviť odtieň farby aplikácie",
|
||||
"albumBackground": "obrázok pozadia albumu",
|
||||
"albumBackground_description": "pridáva obrázky albumov na pozadia na jednotlivých stránok albumov",
|
||||
"albumBackgroundBlur": "veľkosť rozmazania obrázku pozadia albumu",
|
||||
"albumBackgroundBlur_description": "upravuje mieru rozmazania obrázku pozadia albumu",
|
||||
"applicationHotkeys": "klávesové skratky aplikácie",
|
||||
"applicationHotkeys_description": "nastaviť klávesové skratky aplukácie. zaškrtni políčko, ak chceš nastaviť skratku ako globálnu (len desktop)",
|
||||
"artistConfiguration": "nastavenie stránky interpreta albumu",
|
||||
"artistConfiguration_description": "konfigurovať aké položky sa zobrazujú, a v akom poradí, na stránke interpreta albumu",
|
||||
"audioDevice": "zvukové zariadenie",
|
||||
"audioDevice_description": "vybrať zvukové zariadenie na prehrávanie (len webový prehrávač)",
|
||||
"audioExclusiveMode": "exkluzívny zvukový režim",
|
||||
"audioExclusiveMode_description": "povoliť exkluzívny režim výstupu. V tomto režime je systém zvyčajne zamknutý a len mpv je schopný poskytovať zvukový výstup",
|
||||
"audioPlayer": "audioprehrávač",
|
||||
"audioPlayer_description": "vybrať zvukové zariadenie, ktoré bude použité na prehrávanie",
|
||||
"buttonSize": "veľkosť tlačidiel na paneli prehrávania",
|
||||
"buttonSize_description": "veľkosť tlačidiel na paneli prehrávania",
|
||||
"clearCache": "vyčistiť dočasnú pamäť prehliadača",
|
||||
"imageAspectRatio_description": "ak je povolené, obrázok albumu sa zobrazí s originálnym pomerom strán. pre obrázky s pomerom iným ako 1:1 zostane nevyplnený priestor prázdny",
|
||||
"clearCache_description": "'hard' vyčistenie feishin-u. okrem vyrovnávacej pamäte feishin-u sa vymaže aj vyrovnávacia pamäť prehliadača (uložené obrázky a iné súbory). prihlasovacie údaje k serveru a iné nastavenia zostávajú zachované",
|
||||
"clearQueryCache": "vymazať vyrovnávaciu pamäť feishin-u",
|
||||
"clearQueryCache_description": "'soft' vyčistenie feishin-u. obnovia sa playlisty, metadáta skladieb a resetujú sa uložené texty skladieb. nastavenia, prihlasovacie údaje k serveru a obrázky vo vyrovnávacej pamäti zostávajú zachované",
|
||||
"clearCacheSuccess": "vyrovnávacia pamäť úspešne vymazaná",
|
||||
"contextMenu": "konfigurácia kontextovej ponuky (pravé tlačítko myši)",
|
||||
"contextMenu_description": "umožňuje vám skryť položky nachádzajúce v menu, ktoré sa zobrazí po kliknutí pravým tlačítkom myši. nezakliknuté položky budú skryté",
|
||||
"crossfadeDuration": "dĺžka crossfade",
|
||||
"crossfadeDuration_description": "nastavuje dĺžku trvania crossfade efektu",
|
||||
"crossfadeStyle": "štýl crossfade",
|
||||
"crossfadeStyle_description": "vybrať štýl crossfade efektu pre prehrávač",
|
||||
"customCssEnable": "povoliť vlastné css",
|
||||
"customCssEnable_description": "umožňuje písať vlastné css.",
|
||||
"customCssNotice": "Varovanie: hoci sa využíva istá miera sanitizaácie (deaktivácia url() a obsahu:), používanie vlastných CSS pri zmene rozhrania stále predstavuje riziko.",
|
||||
"customCss": "vlastné css",
|
||||
"customCss_description": "vlastný css obsah. Poznámka: obsah a vzdialené url linky sú defaultne deaktivované.Náhľad vášho obsahu je zobrazený nižšie. Pridané polia, ktoré ste nenastavovali boli pridané pri sanitizácii.",
|
||||
"customFontPath": "cesta k vlastným fontom",
|
||||
"customFontPath_description": "Nastaví cestu k vlastným fontom na použitie aplikáciou",
|
||||
"disableAutomaticUpdates": "vypnúť automatické aktualizácie",
|
||||
"disableLibraryUpdateOnStartup": "vypnúť kontrolu nových verzií pri štarte",
|
||||
"discordApplicationId": "id aplikácie {{discord}}",
|
||||
"discordApplicationId_description": "aplikačné id pre plnohodnotné prepojenie s {{discord}} (predvolená hodnota {{defaultId}})",
|
||||
"discordPausedStatus": "pri pozastavení prehrávania zobrazuje 'rich presence'",
|
||||
"discordPausedStatus_description": "pri povolení bude status zobrazovaný aj pri pozastavenom prehrávaní",
|
||||
"discordIdleStatus": "zobraziť 'rich presence idle status'",
|
||||
"discordIdleStatus_description": "pri povolení bude 'rich presense' status zobrazený aj pri nečinnosti",
|
||||
"discordListening": "zobraziť status počúvanie",
|
||||
"discordListening_description": "zobraziť status počúvanie namiesto prehrávanie",
|
||||
"discordRichPresence": "{{discord}} rich resence",
|
||||
"discordRichPresence_description": "povoliť status prehrávania v {{discord}} rich presence. Obrázky kláves sú: {{icon}}, {{playing}} a {{paused}}",
|
||||
"discordServeImage": "poskytuje {{discord}} obrázky zo servera",
|
||||
"discordServeImage_description": "zdieľať obrázok albumu na {{discord}} rich presence priamo zo servera, dostupné iba pre jellyfin a navidrome",
|
||||
"discordUpdateInterval": "interval aktualizácií {{discord}} rich presence",
|
||||
"discordUpdateInterval_description": "čas v sekundách medzi dvomi nasledujúcimi aktualizáciami (minimálne 15 sekúnd)",
|
||||
"discordDisplayType": "typ zobrazenia {{discord}} presence",
|
||||
"discordDisplayType_description": "mení vo vašom statuse info, čo počúvate",
|
||||
"discordDisplayType_songname": "názov skladby",
|
||||
"discordDisplayType_artistname": "názov interpreta(-ov)",
|
||||
"doubleClickBehavior": "po dvojkliku zaradí do fronty všetky vyhľadané skladby",
|
||||
"doubleClickBehavior_description": "ak je povolené, všetky nájdené skladby budú zaradené do fronty. inak budú skladby zaradené iba po kliknutí",
|
||||
"enableRemote": "povoliť vzdialené ovládanie servera",
|
||||
"enableRemote_description": "pomocou vzdialeného servera umožňuje ovládanie aplikácie prostredníctvom iných zariadení",
|
||||
"externalLinks": "zobraziť externé odkazy",
|
||||
"externalLinks_description": "umožňuje zobrazovať externé odkazy (Last.fm, MusicBrainz) na stránkach umelca/albumu",
|
||||
"exitToTray": "ukončiť do lišty",
|
||||
"exitToTray_description": "po zavretí sa aplikácia minimalizuje do lišty a beží ďalej",
|
||||
"floatingQueueArea": "zobraziť ikonu výsuvnej fronty prehrávania",
|
||||
"floatingQueueArea_description": "zobraziť ikonu výsuvnej fronty prehrávania na pravej strane obrazovky",
|
||||
"followLyric": "nasleduj aktuálny text skladby",
|
||||
"followLyric_description": "posunúť sa v texte skladby na aktuálne prehrávanú pozíciu",
|
||||
"preferLocalLyrics": "uprednostniť lokálne texty skladieb",
|
||||
"preferLocalLyrics_description": "uprednostniť miestne skladby textov, ak sú dostupné, pred vzdialenými",
|
||||
"font": "font",
|
||||
"font_description": "nastaví font písma pre aplikáciu",
|
||||
"fontType": "typ písma",
|
||||
"fontType_description": "vstavané písmo vyberie jeden z fontov poskytovaných Feishin-om. systémové písmo umožňuje vybrať ľubovoľný font poskytovaný vaším operačným systémom. vlastné umožňuje poskytnúť váš vlastný font",
|
||||
"fontType_optionBuiltIn": "vstavané písmo",
|
||||
"fontType_optionCustom": "vlastné písmo",
|
||||
"fontType_optionSystem": "systémové písmo",
|
||||
"gaplessAudio": "prehrávanie bez prerušení",
|
||||
"gaplessAudio_description": "nastaví prehrávanie bez prerušení pre mpv",
|
||||
"gaplessAudio_optionWeak": "slabo (odporúčané)",
|
||||
"genreBehavior": "predvolené správanie stránky žánru",
|
||||
"genreBehavior_description": "určuje, či kliknutie na žáner otvorí zoznam skladieb alebo zoznam albumov",
|
||||
"globalMediaHotkeys": "globálne klávesové skratky médií",
|
||||
"globalMediaHotkeys_description": "povoliť alebo zakázať použitie vašich klávesových skratiek médií na ovládanie prehrávania",
|
||||
"homeConfiguration": "konfigurácia domovskej stránky",
|
||||
"homeConfiguration_description": "konfigurovať, aké položky sú zobrazené a v akom poradí na domovskej stránke",
|
||||
"homeFeature": "carousel odporúčania na domovskej stránke"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,647 @@
|
||||
{
|
||||
"action": {
|
||||
"addToFavorites": "dodaj na $t(entity.favorite_other)",
|
||||
"addToPlaylist": "dodaj na $t(entity.playlist_one)",
|
||||
"clearQueue": "počisti čakalno vrsto",
|
||||
"createPlaylist": "ustvari $t(entity.playlist_one)",
|
||||
"deletePlaylist": "izbriši $t(entity.playlist_one)",
|
||||
"deselectAll": "odizberi vse",
|
||||
"editPlaylist": "uredi $t(entity.playlist_one)",
|
||||
"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 seznama predvajanja",
|
||||
"removeFromQueue": "odstrani iz čakalne vrste",
|
||||
"setRating": "nastavi oceno",
|
||||
"toggleSmartPlaylistEditor": "preklopi urejevalnik $t(entity.smartPlaylist)",
|
||||
"viewPlaylists": "poglej $t(entity.playlist_other)",
|
||||
"openIn": {
|
||||
"lastfm": "Odpri v Last.fm",
|
||||
"musicbrainz": "Odpri v MusicBrainz"
|
||||
}
|
||||
},
|
||||
"common": {
|
||||
"action_one": "dejanje",
|
||||
"action_two": "dejanji",
|
||||
"action_few": "dejanja",
|
||||
"action_other": "dejanj",
|
||||
"add": "dodaj",
|
||||
"additionalParticipants": "dodatni udeleženci",
|
||||
"newVersion": "nova verzija je bila nameščena ({{version}})",
|
||||
"viewReleaseNotes": "poglej zapiske o različici",
|
||||
"albumGain": "ojačitev albuma",
|
||||
"albumPeak": "vrh albuma",
|
||||
"areYouSure": "ali si prepričan?",
|
||||
"ascending": "naraščajoče",
|
||||
"backward": "nazaj",
|
||||
"biography": "biografija",
|
||||
"bitrate": "bitna hitrost",
|
||||
"bpm": "unm",
|
||||
"cancel": "prekliči",
|
||||
"center": "center",
|
||||
"channel_one": "kanal",
|
||||
"channel_two": "kanala",
|
||||
"channel_few": "kanali",
|
||||
"channel_other": "kanalov",
|
||||
"clear": "počisti",
|
||||
"close": "zapri",
|
||||
"codec": "kodek",
|
||||
"collapse": "strni",
|
||||
"comingSoon": "prihaja kmalu …",
|
||||
"configure": "prilagodi",
|
||||
"confirm": "potrdi",
|
||||
"create": "ustvari",
|
||||
"currentSong": "trenutna $t(entity.track_one)",
|
||||
"decrease": "zmanjšaj",
|
||||
"delete": "izbriši",
|
||||
"descending": "padajoče",
|
||||
"description": "opis",
|
||||
"disable": "onemogoči",
|
||||
"disc": "disk",
|
||||
"dismiss": "spreglej",
|
||||
"duration": "trajanje",
|
||||
"edit": "uredi",
|
||||
"enable": "omogoči",
|
||||
"expand": "razširi",
|
||||
"favorite": "najljubša",
|
||||
"filter_one": "filter",
|
||||
"filter_two": "filtra",
|
||||
"filter_few": "filtri",
|
||||
"filter_other": "filtrov",
|
||||
"filters": "filtri",
|
||||
"forceRestartRequired": "znova zaženi, da potrdiš spremembe ... zapri obvestilo, da znova zaženeš",
|
||||
"forward": "naprej",
|
||||
"gap": "reža",
|
||||
"home": "domov",
|
||||
"increase": "povišaj",
|
||||
"limit": "omeji",
|
||||
"manage": "upravljaj",
|
||||
"maximize": "maksimiziraj",
|
||||
"menu": "meni",
|
||||
"minimize": "pomanjšaj",
|
||||
"modified": "spremenjeno",
|
||||
"mbid": "MusicBrainz identifikator (ID)",
|
||||
"left": "levo",
|
||||
"no": "ne",
|
||||
"none": "noben",
|
||||
"noResultsFromQuery": "poizvedba ni vrnila rezultatov",
|
||||
"note": "opomba",
|
||||
"ok": "ok",
|
||||
"owner": "lastnik",
|
||||
"path": "pot",
|
||||
"playerMustBePaused": "predvajalnik mora biti ustavljen",
|
||||
"preview": "predogled",
|
||||
"previousSong": "prejšnja $t(entity.track_one)",
|
||||
"quit": "izhod",
|
||||
"random": "naključno",
|
||||
"rating": "ocena",
|
||||
"refresh": "osveži",
|
||||
"reload": "ponovno naloži",
|
||||
"reset": "ponastavi",
|
||||
"resetToDefault": "ponastavi na privzeto",
|
||||
"restartRequired": "zahtevan je ponovni zagon",
|
||||
"right": "desno",
|
||||
"save": "shrani",
|
||||
"saveAndReplace": "shrani in zamenjaj",
|
||||
"saveAs": "shrani kot",
|
||||
"search": "išči",
|
||||
"setting": "nastavitev",
|
||||
"share": "deli",
|
||||
"size": "velikost",
|
||||
"sortOrder": "vrstni red",
|
||||
"tags": "oznake",
|
||||
"title": "naslov",
|
||||
"trackNumber": "skladba",
|
||||
"trackGain": "glasnost skladbe",
|
||||
"trackPeak": "vrhunec skladbe",
|
||||
"translation": "prevod",
|
||||
"unknown": "neznan",
|
||||
"version": "verzija",
|
||||
"year": "leto",
|
||||
"yes": "da",
|
||||
"name": "ime"
|
||||
},
|
||||
"entity": {
|
||||
"album_one": "album",
|
||||
"album_two": "albuma",
|
||||
"album_few": "albumi",
|
||||
"album_other": "albumov",
|
||||
"albumArtist_one": "izvajalec albuma",
|
||||
"albumArtist_two": "izvajalec albumov",
|
||||
"albumArtist_few": "izvajalec albumov",
|
||||
"albumArtist_other": "izvajalec albumov",
|
||||
"albumArtistCount_one": "{{count}} izvajalec albuma",
|
||||
"albumArtistCount_two": "{{count}} izvajalca albuma",
|
||||
"albumArtistCount_few": "{{count}} izvajalci albuma",
|
||||
"albumArtistCount_other": "{{count}} izvajalcev albuma",
|
||||
"albumWithCount_one": "{{count}} album",
|
||||
"albumWithCount_two": "{{count}} albuma",
|
||||
"albumWithCount_few": "{{count}} albumi",
|
||||
"albumWithCount_other": "{{count}} albumov",
|
||||
"artist_one": "izvajalec",
|
||||
"artist_two": "izvajalca",
|
||||
"artist_few": "izvajalci",
|
||||
"artist_other": "izvajalcev",
|
||||
"artistWithCount_one": "{{count}} izvajalec",
|
||||
"artistWithCount_two": "{{count}} izvajalca",
|
||||
"artistWithCount_few": "{{count}} izvajalci",
|
||||
"artistWithCount_other": "{{count}} izvajalcev",
|
||||
"favorite_one": "priljubljen",
|
||||
"favorite_two": "priljubljena",
|
||||
"favorite_few": "priljubljeni",
|
||||
"favorite_other": "priljubljenih",
|
||||
"folder_one": "mapa",
|
||||
"folder_two": "mapi",
|
||||
"folder_few": "mape",
|
||||
"folder_other": "map",
|
||||
"folderWithCount_one": "{{count}} mapa",
|
||||
"folderWithCount_two": "{{count}} mapi",
|
||||
"folderWithCount_few": "{{count}} mape",
|
||||
"folderWithCount_other": "{{count}} map",
|
||||
"genre_one": "zvrst",
|
||||
"genre_two": "zvrsti",
|
||||
"genre_few": "zvrsti",
|
||||
"genre_other": "zvrsti",
|
||||
"genreWithCount_one": "{{count}} zvrst",
|
||||
"genreWithCount_two": "{{count}} zvrsti",
|
||||
"genreWithCount_few": "{{count}} zvrsti",
|
||||
"genreWithCount_other": "{{count}} zvrsti",
|
||||
"playlist_one": "seznam predvajanja",
|
||||
"playlist_two": "seznama predvajanja",
|
||||
"playlist_few": "seznami predvajanja",
|
||||
"playlist_other": "seznamov predvajanja",
|
||||
"play_one": "{{count}} predvajanje",
|
||||
"play_two": "{{count}} predvajanji",
|
||||
"play_few": "{{count}} predvajanja",
|
||||
"play_other": "{{count}} predvajanj",
|
||||
"playlistWithCount_one": "{{count}} seznam predvajanja",
|
||||
"playlistWithCount_two": "{{count}} seznama predvajanja",
|
||||
"playlistWithCount_few": "{{count}} seznami predvajanja",
|
||||
"playlistWithCount_other": "{{count}} seznamov predvajanja",
|
||||
"smartPlaylist": "pametni $t(entity.playlist_one)",
|
||||
"track_one": "skladba",
|
||||
"track_two": "skladbi",
|
||||
"track_few": "skladbe",
|
||||
"track_other": "skladb",
|
||||
"song_one": "pesem",
|
||||
"song_two": "pesmi",
|
||||
"song_few": "pesmi",
|
||||
"song_other": "pesmi",
|
||||
"trackWithCount_one": "{{count}} skladba",
|
||||
"trackWithCount_two": "{{count}} skladbi",
|
||||
"trackWithCount_few": "{{count}} skladbe",
|
||||
"trackWithCount_other": "{{count}} skladb"
|
||||
},
|
||||
"error": {
|
||||
"apiRouteError": "preusmeritev zahteve ni bila mogoča",
|
||||
"audioDeviceFetchError": "napaka pri poskusu pridobivanja avdio naprav",
|
||||
"authenticationFailed": "napaka pri avtentikaciji",
|
||||
"badAlbum": "ta stran je prikazana ker skladba ne pripada nobenemu albumu. skladba se verjetno nahaja na vrhu datotečne strukture direktorija z glasbo. jellyfin razporedi skladbe v skupine samo v primeru, ko se nahajajo v direktoriju.",
|
||||
"badValue": "neveljavna možnost \"{{value}}\". ta vrednost ne obstaja več",
|
||||
"credentialsRequired": "zahtevana prijava",
|
||||
"endpointNotImplementedError": "{{serverType}} ne implementira končne točke {{endpoint}}",
|
||||
"genericError": "prišlo je do napake",
|
||||
"invalidServer": "neveljaven strežnik",
|
||||
"localFontAccessDenied": "dostop do lokalnih pisav je bil zavrnjen",
|
||||
"loginRateError": "preveč poskusov prijave, prosimo, poskusite čez nekaj sekund",
|
||||
"mpvRequired": "obvezen MPV",
|
||||
"networkError": "prišlo je do mrežne napake",
|
||||
"openError": "datoteke ni mogoče odpreti",
|
||||
"playbackError": "prišlo je do napake pri poskusu predvajanja skladbe",
|
||||
"remoteDisableError": "oddaljenega strežnika ni bilo mogoče $t(common.disable)ti",
|
||||
"remoteEnableError": "oddaljenega strežnika ni bilo mogoče $t(common.enable)ti",
|
||||
"remotePortError": "pri nastavljanju vrat oddaljenega strežnika je prišlo do napake",
|
||||
"remotePortWarning": "ponovno zaženite strežnik da aplicirate spremembo strežniških vrat",
|
||||
"serverNotSelectedError": "izbran ni bil noben strežnik",
|
||||
"serverRequired": "strežnik zahtevan",
|
||||
"sessionExpiredError": "vaša seja se je iztekla",
|
||||
"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)",
|
||||
"biography": "biografija",
|
||||
"bitrate": "bitna hitrost",
|
||||
"bpm": "bpm",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"comment": "komentar",
|
||||
"communityRating": "ocena skupnosti",
|
||||
"criticRating": "ocena kritikov",
|
||||
"dateAdded": "dodano",
|
||||
"disc": "disk",
|
||||
"duration": "trajanje",
|
||||
"favorited": "priljubljeno",
|
||||
"fromYear": "od leta",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"id": "identifikator",
|
||||
"isCompilation": "je kompilacija",
|
||||
"isFavorited": "je dodan med priljubljene",
|
||||
"isPublic": "je javno",
|
||||
"isRated": "je ocenjen",
|
||||
"isRecentlyPlayed": "je bil nedavno predvajan",
|
||||
"lastPlayed": "zadnje predvajano",
|
||||
"mostPlayed": "najpogosteje predvajano",
|
||||
"name": "ime",
|
||||
"note": "opomba",
|
||||
"owner": "$t(common.owner)",
|
||||
"path": "pot",
|
||||
"playCount": "število predvajanj",
|
||||
"random": "naključno",
|
||||
"rating": "ocena",
|
||||
"recentlyAdded": "nedavno dodano",
|
||||
"recentlyPlayed": "nedavno predvajano",
|
||||
"recentlyUpdated": "nedavno posodobljeno",
|
||||
"releaseDate": "datum izida",
|
||||
"releaseYear": "leto izida",
|
||||
"search": "išči",
|
||||
"songCount": "število pesmi",
|
||||
"title": "naslov",
|
||||
"toYear": "do leta",
|
||||
"trackNumber": "skladba"
|
||||
},
|
||||
"form": {
|
||||
"addServer": {
|
||||
"error_savePassword": "pri shranjevanju gesla je prišlo do napake",
|
||||
"ignoreCors": "ignoriraj cors $t(common.restartRequired)",
|
||||
"ignoreSsl": "ignoriraj ssl $t(common.restartRequired)",
|
||||
"input_legacyAuthentication": "omogoči legacy avtentikacijo",
|
||||
"input_name": "ime strežnika",
|
||||
"input_password": "geslo",
|
||||
"input_savePassword": "shrani geslo",
|
||||
"input_url": "url",
|
||||
"input_username": "uporabniško ime",
|
||||
"success": "dodajanje strežnika uspešno",
|
||||
"title": "dodaj strežnik"
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"input_playlists": "$t(entity.playlist_other)",
|
||||
"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)"
|
||||
},
|
||||
"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)"
|
||||
},
|
||||
"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)"
|
||||
},
|
||||
"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)"
|
||||
},
|
||||
"lyricSearch": {
|
||||
"input_artist": "$t(entity.artist_one)",
|
||||
"input_name": "$t(common.name)",
|
||||
"title": "iskanje po besedilu"
|
||||
},
|
||||
"queryEditor": {
|
||||
"title": "urejevalnik poizvedb",
|
||||
"input_optionMatchAll": "ujemanje vseh",
|
||||
"input_optionMatchAny": "ujemanje z najmanj enim"
|
||||
},
|
||||
"shareItem": {
|
||||
"allowDownloading": "dovoli prenašanje",
|
||||
"description": "opis",
|
||||
"setExpiration": "nastavi datum poteka veljavnosti",
|
||||
"success": "deli povezavo v odložišču (ali klikni tukaj za odpiranje)",
|
||||
"expireInvalid": "datum poteka veljavnosti mora biti v prihodnosti",
|
||||
"createFailed": "deljenje ni uspelo (je deljenje omogočeno?)"
|
||||
},
|
||||
"updateServer": {
|
||||
"success": "strežnik uspešno posodobljen",
|
||||
"title": "posodobi strežnik"
|
||||
}
|
||||
},
|
||||
"page": {
|
||||
"albumArtistDetail": {
|
||||
"about": "O izvajalcu",
|
||||
"appearsOn": "se pojavi na",
|
||||
"recentReleases": "zadnje izdaje",
|
||||
"viewDiscography": "poglej diskografijo",
|
||||
"relatedArtists": "sorodni $t(entity.artist_other)",
|
||||
"topSongs": "najboljše skladbe",
|
||||
"topSongsFrom": "najboljše skladbe iz {{title}}",
|
||||
"viewAll": "poglej vse",
|
||||
"viewAllTracks": "poglej vse $t(entity.track_other)"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "več od $t(entity.artist_one)",
|
||||
"moreFromGeneric": "več iz {{item}}",
|
||||
"released": "izdano"
|
||||
},
|
||||
"albumList": {
|
||||
"artistAlbums": "albumi izvajalca {{artist}}",
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)",
|
||||
"title": "$t(entity.album_other)"
|
||||
},
|
||||
"appMenu": {
|
||||
"collapseSidebar": "skrij stransko vrstico",
|
||||
"expandSidebar": "razširi stransko vrstico",
|
||||
"goBack": "nazaj",
|
||||
"goForward": "naprej",
|
||||
"manageServers": "urejanje strežnikov",
|
||||
"openBrowserDevtools": "odpri orodja za razvijalce brskalnika",
|
||||
"quit": "$t(common.quit)",
|
||||
"selectServer": "izberi strežnik",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"version": "verzija {{version}}"
|
||||
},
|
||||
"manageServers": {
|
||||
"title": "urejanje strežnikov",
|
||||
"serverDetails": "podrobosti o strežniku",
|
||||
"url": "URL",
|
||||
"username": "uporabniško ime",
|
||||
"editServerDetailsTooltip": "urejanje podrobnosti strežnika",
|
||||
"removeServer": "odstrani strežnik"
|
||||
},
|
||||
"contextMenu": {
|
||||
"addFavorite": "$t(action.addToFavorites)",
|
||||
"addLast": "$t(player.addLast)",
|
||||
"addNext": "$t(player.addNext)",
|
||||
"addToFavorites": "$t(action.addToFavorites)",
|
||||
"addToPlaylist": "$t(action.addToPlaylist)",
|
||||
"createPlaylist": "$t(action.createPlaylist)",
|
||||
"deletePlaylist": "$t(action.deletePlaylist)",
|
||||
"deselectAll": "$t(action.deselectAll)",
|
||||
"download": "prenesi",
|
||||
"moveToNext": "$t(action.moveToNext)",
|
||||
"moveToBottom": "$t(action.moveToBottom)",
|
||||
"moveToTop": "$t(action.moveToTop)",
|
||||
"numberSelected": "{{count}} izbranih",
|
||||
"play": "$t(player.play)",
|
||||
"playSimilarSongs": "$t(player.playSimilarSongs)",
|
||||
"removeFromFavorites": "$t(action.removeFromFavorites)",
|
||||
"removeFromPlaylist": "$t(action.removeFromPlaylist)",
|
||||
"removeFromQueue": "$t(action.removeFromQueue)",
|
||||
"setRating": "$t(action.setRating)",
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"shareItem": "deli",
|
||||
"showDetails": "pridobi informacije"
|
||||
},
|
||||
"fullscreenPlayer": {
|
||||
"config": {
|
||||
"dynamicBackground": "dinamično ozadje",
|
||||
"dynamicImageBlur": "velikost zameglitve slike",
|
||||
"dynamicIsImage": "omogoči sliko v ozadju",
|
||||
"followCurrentLyric": "sledi besedilu",
|
||||
"lyricAlignment": "poravnava besedila",
|
||||
"lyricOffset": "zamik besedila (ms)",
|
||||
"lyricGap": "razmik besedila",
|
||||
"lyricSize": "velikost besedila",
|
||||
"opacity": "prosojnost",
|
||||
"showLyricMatch": "prikaži ujemanje besedila",
|
||||
"showLyricProvider": "pokaži ponudnika besedila",
|
||||
"synchronized": "sinhronizirano",
|
||||
"unsynchronized": "nesinhronizirano",
|
||||
"useImageAspectRatio": "uporabi razmerje stranic slike"
|
||||
},
|
||||
"lyrics": "besedilo",
|
||||
"related": "sorodno",
|
||||
"upNext": "sledi",
|
||||
"visualizer": "vizualizator",
|
||||
"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)"
|
||||
},
|
||||
"globalSearch": {
|
||||
"commands": {
|
||||
"goToPage": "pojdi na stran",
|
||||
"searchFor": "išči {{query}}",
|
||||
"serverCommands": "strežniški ukazi"
|
||||
},
|
||||
"title": "ukazi"
|
||||
},
|
||||
"home": {
|
||||
"explore": "razišči knjižnico",
|
||||
"mostPlayed": "najpogosteje predvajano",
|
||||
"newlyAdded": "zadnje dodane izdaje",
|
||||
"recentlyPlayed": "nedavno predvajano",
|
||||
"title": "$t(common.home)"
|
||||
},
|
||||
"itemDetail": {
|
||||
"copyPath": "kopiraj v odložišče",
|
||||
"copiedPath": "kopiranje poti uspešno",
|
||||
"openFile": "prikaži skladbo v upravitelju datotek"
|
||||
},
|
||||
"playlist": {
|
||||
"reorder": "preurejanje je omogočeno samo pri razvrščanju po identifikatorju"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist_other)"
|
||||
},
|
||||
"setting": {
|
||||
"advanced": "napredno",
|
||||
"generalTab": "splošno",
|
||||
"hotkeysTab": "blžnjice",
|
||||
"playbackTab": "predvajanje",
|
||||
"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)",
|
||||
"home": "$t(common.home)",
|
||||
"myLibrary": "moja knjižnica",
|
||||
"nowPlaying": "trenutno se predvaja",
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"search": "$t(common.search)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"shared": "deljen $t(entity.playlist_other)",
|
||||
"tracks": "$t(entity.track_other)"
|
||||
},
|
||||
"trackList": {
|
||||
"artistTracks": "skladbe po {{artist}}",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track_other)",
|
||||
"title": "$t(entity.track_other)"
|
||||
}
|
||||
},
|
||||
"player": {
|
||||
"addLast": "dodaj zadnje",
|
||||
"addNext": "dodaj naslednje",
|
||||
"favorite": "dodaj med priljubljene",
|
||||
"mute": "utišaj",
|
||||
"muted": "utišano",
|
||||
"next": "naslednje",
|
||||
"play": "predvajaj",
|
||||
"playbackFetchCancel": "akcija traja dlje časa... zaprite obvestilo za preklic",
|
||||
"playbackFetchInProgress": "nalaganje pesmi…",
|
||||
"playbackFetchNoResults": "nobena pesem ni bila najdena",
|
||||
"playbackSpeed": "hitrost predvajanja",
|
||||
"playRandom": "predvajaj naključno",
|
||||
"playSimilarSongs": "predvajaj sorodne pesmi",
|
||||
"previous": "prejšnje",
|
||||
"queue_clear": "počisti čakalno vrsto",
|
||||
"queue_moveToBottom": "premakni izbrano na vrh",
|
||||
"queue_moveToTop": "premakni izbrano na dno",
|
||||
"queue_remove": "odstrani izbrano",
|
||||
"repeat": "ponovi",
|
||||
"repeat_all": "ponovi vse",
|
||||
"repeat_off": "ne ponavljaj",
|
||||
"shuffle": "predvajaj v naključnem vrstnem redu",
|
||||
"shuffle_off": "prevajanje v naključnem vrstnem redu izključeno",
|
||||
"skip": "preskoči",
|
||||
"skip_back": "preskoči nazaj",
|
||||
"skip_forward": "preskoči naprej",
|
||||
"stop": "ustavi",
|
||||
"toggleFullscreenPlayer": "preklopi predvajalnik v celozaslonski način",
|
||||
"unfavorite": "odstrani iz priljubljenih",
|
||||
"pause": "premor",
|
||||
"viewQueue": "poglej čakalno vrsto"
|
||||
},
|
||||
"setting": {
|
||||
"accentColor": "barva poudarka",
|
||||
"accentColor_description": "nastavi barva poudarka aplikacije",
|
||||
"albumBackground": "slika ozadja albuma",
|
||||
"albumBackground_description": "doda sliko ozadja za strani albuma",
|
||||
"albumBackgroundBlur": "velikost zameglitve slike ozadja albuma",
|
||||
"albumBackgroundBlur_description": "spremeni moč zameglitve slike ozadja albuma",
|
||||
"applicationHotkeys": "bližnjične tipke aplikacije",
|
||||
"applicationHotkeys_description": "konfigurira bližnjične tipke aplikacije. obkljukajte da nastavite globalne bližnjico na tipkovnici (samo na namizju)",
|
||||
"artistConfiguration": "konfiguracija strani izvajalca albuma",
|
||||
"artistConfiguration_description": "konfiguriranje vsebine in vrstnega reda prikaza na strani izvajalca albuma",
|
||||
"audioDevice": "avdio naprava",
|
||||
"audioDevice_description": "izberite avdio napravo za predvajanje (samo v spletnem predvajalniku)",
|
||||
"audioExclusiveMode": "avdio način",
|
||||
"audioExclusiveMode_description": "omogoči način ekskluzivnega predvajanja. V tem načinu je sistem običajno zaklenjen in samo mpv lahko oddaja zvok",
|
||||
"audioPlayer": "avdio predvajalnik",
|
||||
"audioPlayer_description": "izberite avdio predvajalnik za predvajanje",
|
||||
"buttonSize": "velikost gumbov vrstice predvajalnika",
|
||||
"buttonSize_description": "velikost gumbov v vrstici predvajalnika",
|
||||
"clearCache": "izbriši začasni pomnilnik",
|
||||
"clearCache_description": "poleg brisanja feishinovega začasnega pomnilnika bo izbrisan tudi začasni pomnilnik brskalnika. nastavitve in prijavni podatki strežnikov se ohranijo",
|
||||
"clearQueryCache": "počisti feishinov začasni pomnilnik",
|
||||
"clearQueryCache_description": "osveži sezname predvajanja, metapodatke in ponastavi shranjena besedila. nastavitve, prijavni podatki za strežnike in slike se ohranijo",
|
||||
"clearCacheSuccess": "začasni pomnilnik uspešno izbrisan",
|
||||
"contextMenu": "konfiguracija kontekstnega menija (desni klik)",
|
||||
"contextMenu_description": "omogoči skrivanje vrstic v meniju, prikazanem ob desnem kliku. odznačeni predmeti bodo skriti",
|
||||
"crossfadeDuration": "trajanje prehoda",
|
||||
"crossfadeDuration_description": "nastavi čas trajanja prehoda med pesmimi",
|
||||
"crossfadeStyle": "tip prehoda",
|
||||
"crossfadeStyle_description": "izbira tipa efekta prehoda",
|
||||
"customCssEnable": "omogoči css po meri",
|
||||
"customCssEnable_description": "omogoča urejanje css-ja po meri.",
|
||||
"customCssNotice": "Opozorilo: kljub določenim varnostnim ukrepom (prepoved url() in content:) lahko uporaba CSS po meri s spreminjanjem vmesnika še vedno predstavlja tveganje.",
|
||||
"customCss": "css po meri",
|
||||
"customCss_description": "vsebina css po meri. Opomba: vsebina in oddaljeni url-ji so prepovedane lastnosti. Spodaj je prikazan predogled vaše vsebine. Dodatna polja, ki jih niste nastavili, so prisotna zaradi prečiščevanja.",
|
||||
"customFontPath": "pot za pisavo po meri",
|
||||
"customFontPath_description": "nastavi pot do pisave po meri",
|
||||
"disableAutomaticUpdates": "onemogoči samodejne posodobitve",
|
||||
"disableLibraryUpdateOnStartup": "onemogoči prevejranje novih verzij ob zagonu",
|
||||
"discordApplicationId": "{{discord}} identifikator aplikacije",
|
||||
"discordApplicationId_description": "identifikator aplikacije za {{discord}} bogato prezenco (privzeto {{defaultId}})",
|
||||
"discordPausedStatus": "prikaži bogato prezenco med ustavljenim predvajanjem",
|
||||
"discordPausedStatus_description": "ko je nastavitev omogočena, se bo status prikazal tudi ko je predvajanje začasno zaustavljeno",
|
||||
"discordIdleStatus": "prikaže stanje mirovanja v bogati prezenci",
|
||||
"discordIdleStatus_description": "ko je nastavitev omogočena, se bo status posodabljal ko predvajalnik miruje",
|
||||
"discordListening": "prikaži status poslušanja",
|
||||
"discordListening_description": "prikaži status poslušanja namesto predvajanja",
|
||||
"discordRichPresence": "{{discord}} bogata prezenca",
|
||||
"discordRichPresence_description": "omogoči prikaz statusa predvajanja v {{discord}} bogati prezenci. Oznake slike so: {{icon}}, {{playing}} in {{paused}}",
|
||||
"discordServeImage": "pošiljaj {{discord}} u slike iz strežnika",
|
||||
"discordServeImage_description": "deli naslovne slike za {{discord}} bogato prisotnost iz samega strežnika, na voljo samo za jellyfin in navidrome",
|
||||
"discordUpdateInterval": "interval posodabljanja {{discord}} bogate prezence",
|
||||
"discordUpdateInterval_description": "čas v sekundah med posameznimi posodobitvami (najmanj 15 sekund)",
|
||||
"doubleClickBehavior": "dvojni klik doda vse iskane skladbe v čakalno vrsto",
|
||||
"doubleClickBehavior_description": "če je nastavitev vklopljena se bodo v čakalno vrsto dodale vse skladbe, ki ustrezajo iskanju. v nasprotnem primeru se v čakalno vrsto doda samo izbrana skladba",
|
||||
"enableRemote": "omogoči oddaljeno upravljanje strežnika",
|
||||
"enableRemote_description": "omogoči oddaljeno nadzorovanje strežnika in s tem dovoli drugim napravam da upravljajo aplikacijo",
|
||||
"externalLinks": "prikaži zunanje povezave",
|
||||
"externalLinks_description": "omogoči prikaz zunanjih povezav (Last.fm, MusicBrainz) na straneh albumov,izvajalcev",
|
||||
"exitToTray": "minimiziraj",
|
||||
"exitToTray_description": "ob izhodu se aplikacija minimizira v opravilno vrstico",
|
||||
"floatingQueueArea": "prikaži območje plavajoče čakalne vrste",
|
||||
"floatingQueueArea_description": "na desni strani zaslona prikažite ikono za ogled čakalne vrste predvajanja",
|
||||
"followLyric": "sledenje besedilu",
|
||||
"followLyric_description": "pomaknite besedilo pesmi do trenutnega položaja predvajanja",
|
||||
"preferLocalLyrics": "prioritiziraj lokalna besedila",
|
||||
"preferLocalLyrics_description": "prioritiziraj lokalna besedila pred oddaljenimi, kadar so na voljo",
|
||||
"font": "pisava",
|
||||
"font_description": "nastavi pisavo, ki jo bo aplikacija uporabljala",
|
||||
"fontType": "tip pisave",
|
||||
"fontType_description": "vgrajena pisava izbere eno od pisav, ki jih ponuja Feishin. sistemska pisava vam omogoča, da izberete katero koli pisavo, ki jo ponuja vaš operacijski sistem. po meri lahko izberete svojo pisavo",
|
||||
"fontType_optionBuiltIn": "vgrajena pisava",
|
||||
"fontType_optionCustom": "pisava po meri",
|
||||
"fontType_optionSystem": "sistemska pisava",
|
||||
"gaplessAudio": "neprekinjen avdio",
|
||||
"gaplessAudio_description": "nastavi neprekinjen avdio za mpv",
|
||||
"gaplessAudio_optionWeak": "šibko (priporočeno)",
|
||||
"genreBehavior": "privzeto vedenje strani z zvrstmi",
|
||||
"genreBehavior_description": "določa, ali se ob kliku na zvrst privzeto odpre seznam skladb ali albumov",
|
||||
"globalMediaHotkeys": "globalne bližnjične tipke za vsebino",
|
||||
"globalMediaHotkeys_description": "omogočite ali onemogočite uporabo bližnjic za sistemske medije za nadzor predvajanja",
|
||||
"homeConfiguration": "konfiguracija domače strani",
|
||||
"homeConfiguration_description": "konfigurirajte, kateri elementi so prikazani na domači strani in v kakšnem vrstnem redu",
|
||||
"homeFeature": "tekoči trak na domači strani",
|
||||
"homeFeature_description": "nadzoruje, ali naj se na domači strani prikaže velik tekoči trak",
|
||||
"hotkey_browserBack": "nazaj (brskalnik)",
|
||||
"hotkey_browserForward": "naprej (brskalnik)",
|
||||
"hotkey_favoriteCurrentSong": "dodaj $t(common.currentSong) med priljubljene",
|
||||
"hotkey_favoritePreviousSong": "dodaj $t(common.previousSong) med priljubljene",
|
||||
"hotkey_globalSearch": "globalno iskanje",
|
||||
"hotkey_localSearch": "iskanje na strani",
|
||||
"hotkey_playbackNext": "naslednja skladba",
|
||||
"hotkey_playbackPause": "pavza",
|
||||
"hotkey_playbackPlay": "predvajaj",
|
||||
"hotkey_playbackPlayPause": "predvajaj / pavza",
|
||||
"hotkey_playbackPrevious": "prejšnja skladba",
|
||||
"hotkey_playbackStop": "ustavi",
|
||||
"hotkey_rate0": "počisti oceno",
|
||||
"hotkey_rate1": "oceni z 1 zvezdico",
|
||||
"hotkey_rate2": "oceni z 2 zvezdicama",
|
||||
"hotkey_rate3": "oceni s 3 zvezdicami",
|
||||
"hotkey_rate4": "oceni s 4 zvezdicami",
|
||||
"hotkey_rate5": "oceni s 5 zvezdicami",
|
||||
"hotkey_skipBackward": "preskoči nazaj",
|
||||
"hotkey_skipForward": "preskoči naprej",
|
||||
"hotkey_toggleCurrentSongFavorite": "dodaj/odstrani $t(common.currentSong) iz seznama priljubljenih",
|
||||
"hotkey_toggleFullScreenPlayer": "preklopi predvajalnik na celozaslonski način",
|
||||
"hotkey_togglePreviousSongFavorite": "dodaj/odstrani $t(common.previousSong) iz seznama priljubljenih",
|
||||
"hotkey_toggleQueue": "preklopi čakalno vrsto",
|
||||
"hotkey_toggleRepeat": "preklopi ponovitve",
|
||||
"hotkey_toggleShuffle": "preklopi naključni vrstni red predvajanja",
|
||||
"hotkey_unfavoriteCurrentSong": "odstrani $t(common.currentSong) iz seznama priljubljenih",
|
||||
"hotkey_unfavoritePreviousSong": "odstrani $t(common.previousSong) iz seznama priljubljenih",
|
||||
"hotkey_volumeDown": "znižaj glasnost",
|
||||
"hotkey_volumeMute": "utišaj",
|
||||
"hotkey_volumeUp": "povišaj glasnost",
|
||||
"hotkey_zoomIn": "povečaj",
|
||||
"hotkey_zoomOut": "pomanjšaj",
|
||||
"imageAspectRatio": "uporabi razmerje stranic izvorne naslovnice",
|
||||
"imageAspectRatio_description": "če je omogočeno, bo naslovnica prikazana z izvornim razmerjem stranic. za slike, ki niso 1:1, bo preostali prostor prazen",
|
||||
"language": "jezik",
|
||||
"language_description": "nastavi jezik aplikacije ($t(common.restartRequired))",
|
||||
"lastfm": "prikaži last.fm povezave",
|
||||
"lastfm_description": "prikaži povezave do last.fm na straneh izvajalcev/albumov",
|
||||
"lastfmApiKey": "API ključ {{lastfm}}",
|
||||
"lastfmApiKey_description": "API ključ za {{lastfm}}. potreben za naslovnico albuma",
|
||||
"lyricFetch": "pridobi besedila iz interneta",
|
||||
"lyricFetch_description": "pridobivanje besedil iz različnih internetnih virov",
|
||||
"lyricFetchProvider": "ponudniki za pridobivanje besedil",
|
||||
"lyricFetchProvider_description": "izberite ponudnike, od katerih želite pridobiti besedila. vrstni red ponudnikov je vrstni red, v katerem bodo poizvedovani",
|
||||
"lyricOffset": "zamik besedila (ms)",
|
||||
"lyricOffset_description": "zamakni besedilo za določeno število milisekund",
|
||||
"minimizeToTray": "minimiziraj v sistemsko vrstico",
|
||||
"minimizeToTray_description": "minimizirajte aplikacijo v sistemsko vrstico"
|
||||
}
|
||||
}
|
||||
@@ -112,7 +112,7 @@
|
||||
"hotkey_localSearch": "pretraživanje na stranici",
|
||||
"hotkey_toggleQueue": "promeni listu za reprodukciju",
|
||||
"zoom_description": "postavlja stepen zumiranja za aplikaciju",
|
||||
"remotePassword_description": "postavlja lozinku za daljinsku kontrolu servera. Ove informacije se prenose nezaštićeno, pa biste trebali koristiti jedinstvenu lozinku koja vam nije važna.",
|
||||
"remotePassword_description": "postavlja lozinku za daljinsku kontrolu servera. Ove informacije se prenose nezaštićeno, pa biste trebali koristiti jedinstvenu lozinku koja vam nije važna",
|
||||
"hotkey_rate5": "oceni sa 5 zvezdica",
|
||||
"hotkey_playbackPrevious": "prethodna pesma",
|
||||
"showSkipButtons_description": "prikaži ili sakrij dugmad za preskakanje na traci za reprodukciju",
|
||||
@@ -122,7 +122,7 @@
|
||||
"hotkey_toggleShuffle": "promeni slučajan redosled",
|
||||
"theme": "tema",
|
||||
"playbackStyle_description": "izaberite stil reprodukcije za audio plejer",
|
||||
"discordRichPresence_description": "omogućava status reprodukcije u {{discord}} bogatom prikazu. Ključevi slika su: {{icon}}, {{playing}}, i {{paused}} ",
|
||||
"discordRichPresence_description": "omogućava status reprodukcije u {{discord}} bogatom prikazu. Ključevi slika su: {{icon}}, {{playing}}, i {{paused}}",
|
||||
"mpvExecutablePath": "putanja do mpv izvršne datoteke",
|
||||
"audioDevice": "audio uređaj",
|
||||
"hotkey_rate2": "oceni sa 2 zvezdice",
|
||||
@@ -158,7 +158,7 @@
|
||||
"useSystemTheme_description": "prati sistemski određene postavke za svetlu ili tamnu temu",
|
||||
"playButtonBehavior_optionAddNext": "$t(player.addNext)",
|
||||
"lyricFetch_description": "preuzimanje tekstova sa različitih izvora na internetu",
|
||||
"lyricFetchProvider_description": "izaberite pružatelje tekstova za preuzimanje. Redosled pružatelja je redosled upita.",
|
||||
"lyricFetchProvider_description": "izaberite pružatelje tekstova za preuzimanje. Redosled pružatelja je redosled upita",
|
||||
"globalMediaHotkeys_description": "omogućava ili onemogućava korišćenje medijskih tastera sistema za kontrolu reprodukcije",
|
||||
"customFontPath": "prilagođena putanja fonta",
|
||||
"followLyric": "prati trenutni tekst pesme",
|
||||
|
||||
+172
-144
@@ -1,22 +1,22 @@
|
||||
{
|
||||
"action": {
|
||||
"addToFavorites": "$ t இல் சேர்க்கவும் (entity.foavorite_other)",
|
||||
"addToFavorites": "$t(entity.favorite_other) இல் சேர்க்கவும்",
|
||||
"clearQueue": "தெளிவான வரிசை",
|
||||
"goToPage": "பக்கத்திற்குச் செல்லுங்கள்",
|
||||
"moveToBottom": "கீழே செல்லுங்கள்",
|
||||
"moveToTop": "மேலே செல்லுங்கள்",
|
||||
"refresh": "$ t (காமன்.ரெஃப்ரெச்)",
|
||||
"removeFromFavorites": "$ t இலிருந்து அகற்று (entity.foavorite_other)",
|
||||
"removeFromPlaylist": "$ t இலிருந்து அகற்று (entity.playlist_one)",
|
||||
"refresh": "$t(common.refresh)",
|
||||
"removeFromFavorites": "$t(entity.favorite_other)இலிருந்து அகற்று",
|
||||
"removeFromPlaylist": "$t(entity.playlist_one) இலிருந்து அகற்று",
|
||||
"removeFromQueue": "வரிசையிலிருந்து அகற்று",
|
||||
"setRating": "மதிப்பீட்டை அமைக்கவும்",
|
||||
"toggleSmartPlaylistEditor": "மாற்று $ t (entity.smartplaylist) ஆசிரியர்",
|
||||
"viewPlaylists": "$ t (entity.playlist_other) காண்க",
|
||||
"addToPlaylist": "$ t இல் சேர்க்கவும் (entity.playlist_one)",
|
||||
"createPlaylist": "$ t ஐ உருவாக்கவும் (entity.playlist_one)",
|
||||
"deletePlaylist": "$ t (entity.playlist_one) ஐ நீக்கு",
|
||||
"toggleSmartPlaylistEditor": "மாற்று $t(entity.smartPlaylist) ஆசிரியர்",
|
||||
"viewPlaylists": "$t(entity.playlist_other) காண்க",
|
||||
"addToPlaylist": "$t(entity.playlist_one)இல் சேர்க்கவும்",
|
||||
"createPlaylist": "$t(entity.playlist_one)ஐ உருவாக்கவும்",
|
||||
"deletePlaylist": "$t(entity.playlist_one)ஐ நீக்கு",
|
||||
"deselectAll": "அனைத்தையும் தேர்வு செய்யுங்கள்",
|
||||
"editPlaylist": "திருத்து $ t (entity.playlist_one)",
|
||||
"editPlaylist": "திருத்து $t(entity.playlist_one)",
|
||||
"moveToNext": "அடுத்து செல்லுங்கள்",
|
||||
"openIn": {
|
||||
"lastfm": "Last.fm இல் திறந்திருக்கும்",
|
||||
@@ -33,7 +33,7 @@
|
||||
"configure": "உள்ளமைக்கவும்",
|
||||
"confirm": "உறுதிப்படுத்தவும்",
|
||||
"create": "உருவாக்கு",
|
||||
"currentSong": "தற்போதைய $ t (entity.track_one)",
|
||||
"currentSong": "தற்போதைய $t(entity.track_one)",
|
||||
"decrease": "குறைவு",
|
||||
"action_one": "செயல்",
|
||||
"action_other": "செயல்கள்",
|
||||
@@ -69,7 +69,7 @@
|
||||
"filter_one": "வடிப்பி",
|
||||
"filter_other": "வடிப்பான்கள்",
|
||||
"filters": "வடிப்பான்கள்",
|
||||
"forceRestartRequired": "மாற்றங்களைப் பயன்படுத்த மறுதொடக்கம்… மறுதொடக்கம் செய்ய அறிவிப்பை மூடு",
|
||||
"forceRestartRequired": "மாற்றங்களைப் பயன்படுத்த மறுதொடக்கம் செய்… மறுதொடக்கம் செய்ய அறிவிப்பை மூடு",
|
||||
"forward": "முன்னோக்கி",
|
||||
"gap": "இடைவெளி",
|
||||
"home": "வீடு",
|
||||
@@ -87,7 +87,7 @@
|
||||
"path": "பாதை",
|
||||
"playerMustBePaused": "வீரர் இடைநிறுத்தப்பட வேண்டும்",
|
||||
"preview": "முன்னோட்டம்",
|
||||
"previousSong": "முந்தைய $ t (entity.track_one)",
|
||||
"previousSong": "முந்தைய $t(entity.track_one)",
|
||||
"quit": "வெளியேறு",
|
||||
"random": "சீரற்ற",
|
||||
"rating": "செயல்வரம்பு",
|
||||
@@ -112,7 +112,13 @@
|
||||
"trackNumber": "மின்தடம்",
|
||||
"trackGain": "தடமறிதல்",
|
||||
"trackPeak": "ட்ராக் பீக்",
|
||||
"translation": "மொழிபெயர்ப்பு"
|
||||
"translation": "மொழிபெயர்ப்பு",
|
||||
"additionalParticipants": "கூடுதல் பங்கேற்பாளர்கள்",
|
||||
"newVersion": "புதிய பதிப்பு நிறுவப்பட்டுள்ளது ({{version}})",
|
||||
"viewReleaseNotes": "வெளியீட்டு குறிப்புகளைக் காண்க",
|
||||
"bitDepth": "பிட் ஆழம்",
|
||||
"sampleRate": "மாதிரி வீதம்",
|
||||
"tags": "குறிச்சொற்கள்"
|
||||
},
|
||||
"entity": {
|
||||
"folderWithCount_one": "{{count}} கோப்புறை",
|
||||
@@ -121,8 +127,8 @@
|
||||
"genre_other": "வகைகள்",
|
||||
"genreWithCount_one": "{{count}} வகை",
|
||||
"genreWithCount_other": "{{count}} வகைகள்",
|
||||
"album_one": "ஆல்பம்",
|
||||
"album_other": "ஆல்பம்",
|
||||
"album_one": "செருகேடு",
|
||||
"album_other": "செருகேடுகள்",
|
||||
"albumArtist_one": "ஆல்பம் கலைஞர்",
|
||||
"albumArtist_other": "ஆல்பம் கலைஞர்கள்",
|
||||
"albumArtistCount_one": "{{count}} ஆல்பம் கலைஞர்",
|
||||
@@ -139,11 +145,11 @@
|
||||
"folder_other": "கோப்புறைகள்",
|
||||
"playlist_one": "பிளேலிச்ட்",
|
||||
"playlist_other": "பிளேலிச்ட்கள்",
|
||||
"play_one": "{{count}} play",
|
||||
"play_one": "{{count}} நாடகம்",
|
||||
"play_other": "{{count}} நாடகங்கள்",
|
||||
"playlistWithCount_one": "{{count}} பிளேலிச்ட்",
|
||||
"playlistWithCount_other": "{{count}} பிளேலிச்ட்கள்",
|
||||
"smartPlaylist": "அறிவுள்ள $ t (entity.playlist_one)",
|
||||
"smartPlaylist": "அறிவுள்ள $t(entity.playlist_one)",
|
||||
"track_one": "மின்தடம்",
|
||||
"track_other": "தடங்கள்",
|
||||
"song_one": "பாடல்",
|
||||
@@ -157,13 +163,13 @@
|
||||
"remotePortWarning": "புதிய துறைமுகத்தைப் பயன்படுத்த சேவையகத்தை மறுதொடக்கம் செய்யுங்கள்",
|
||||
"serverNotSelectedError": "சேவையகம் எதுவும் தேர்ந்தெடுக்கப்படவில்லை",
|
||||
"serverRequired": "சேவையகம் தேவை",
|
||||
"remoteEnableError": "தொலைநிலை சேவையகத்தை $ t (பொதுவானது) முயற்சிக்கும்போது பிழை ஏற்பட்டது",
|
||||
"remoteEnableError": "தொலைநிலை சேவையகத்தை $t(common.enable) முயற்சிக்கும்போது பிழை ஏற்பட்டது",
|
||||
"apiRouteError": "பாதை கோரிக்கை செய்ய முடியவில்லை",
|
||||
"audioDeviceFetchError": "ஆடியோ சாதனங்களைப் பெற முயற்சிக்கும்போது பிழை ஏற்பட்டது",
|
||||
"authenticationFailed": "ஏற்பு தோல்வியடைந்தது",
|
||||
"badAlbum": "இந்த பாடல் ஆல்பத்தின் பகுதியாக இல்லாததால் இந்தப் பக்கத்தைப் பார்க்கிறீர்கள். உங்கள் இசை கோப்புறையின் மேல் மட்டத்தில் ஒரு பாடல் இருந்தால் இந்த சிக்கலைப் பார்க்கிறீர்கள். செல்லிஃபின் ஒரு கோப்புறையில் இருந்தால் தடங்களை மட்டுமே குழுக்கள்.",
|
||||
"credentialsRequired": "நற்சான்றிதழ்கள் தேவை",
|
||||
"endpointNotImplementedError": "Endpoint {{endpoint}} {{serverType} க்கு க்கு செயல்படுத்தப்படவில்லை",
|
||||
"endpointNotImplementedError": "Endpoint {{endpoint}} {{serverType}} க்கு செயல்படுத்தப்படவில்லை",
|
||||
"genericError": "பிழை ஏற்பட்டது",
|
||||
"invalidServer": "தவறான சேவையகம்",
|
||||
"localFontAccessDenied": "உள்ளக எழுத்துருக்களுக்கு மறுக்கப்பட்டது",
|
||||
@@ -171,32 +177,34 @@
|
||||
"networkError": "பிணைய பிழை ஏற்பட்டது",
|
||||
"openError": "கோப்பைத் திறக்க முடியவில்லை",
|
||||
"playbackError": "ஊடகங்களை விளையாட முயற்சிக்கும்போது பிழை ஏற்பட்டது",
|
||||
"remoteDisableError": "தொலைநிலை சேவையகத்தை $ t (பொதுவானது. குறைக்கக்கூடிய) முயற்சிக்கும்போது பிழை ஏற்பட்டது",
|
||||
"remoteDisableError": "தொலைநிலை சேவையகத்தை $t(common.disable) முயற்சிக்கும்போது பிழை ஏற்பட்டது",
|
||||
"sessionExpiredError": "உங்கள் அமர்வு காலாவதியானது",
|
||||
"systemFontError": "கணினி எழுத்துருக்களைப் பெற முயற்சிக்கும்போது பிழை ஏற்பட்டது"
|
||||
"systemFontError": "கணினி எழுத்துருக்களைப் பெற முயற்சிக்கும்போது பிழை ஏற்பட்டது",
|
||||
"badValue": "தவறான விருப்பம் \"{{value}}\". இந்த மதிப்பு இனி இல்லை",
|
||||
"notificationDenied": "அறிவிப்புகளுக்கான அனுமதிகள் மறுக்கப்பட்டன. இந்த அமைப்பு எந்த விளைவையும் ஏற்படுத்தாது"
|
||||
},
|
||||
"filter": {
|
||||
"albumArtist": "$ t (entity.albumartist_one)",
|
||||
"albumCount": "$ t (entity.album_other) எண்ணிக்கை",
|
||||
"artist": "$ t (entity.artist_one)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"albumCount": "$t(entity.album_other) எண்ணிக்கை",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"biography": "சுயசரிதை",
|
||||
"bitrate": "பிட்ரேட்",
|
||||
"bpm": "பிபிஎம்",
|
||||
"channels": "$ t (common.channel_other)",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"comment": "கருத்து",
|
||||
"communityRating": "சமூக மதிப்பீடு",
|
||||
"path": "பாதை",
|
||||
"playCount": "விளையாட்டு எண்ணிக்கை",
|
||||
"random": "சீரற்ற",
|
||||
"rating": "செயல்வரம்பு",
|
||||
"album": "$ t (entity.album_one)",
|
||||
"album": "$t(entity.album_one)",
|
||||
"criticRating": "விமர்சகர் மதிப்பீடு",
|
||||
"dateAdded": "தேதி சேர்க்கப்பட்டது",
|
||||
"disc": "வட்டு",
|
||||
"duration": "காலம்",
|
||||
"favorited": "பிடித்தது",
|
||||
"fromYear": "ஆண்டு முதல்",
|
||||
"genre": "$ t (entity.genre_one)",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"id": "ஐடி",
|
||||
"isCompilation": "தொகுப்பு",
|
||||
"isFavorited": "பிடித்தது",
|
||||
@@ -207,7 +215,7 @@
|
||||
"mostPlayed": "அதிகம் விளையாடியது",
|
||||
"name": "பெயர்",
|
||||
"note": "குறிப்பு",
|
||||
"owner": "$ t (பொதுவானவர்)",
|
||||
"owner": "$t(common.owner)",
|
||||
"recentlyAdded": "அண்மைக் காலத்தில் சேர்க்கப்பட்டது",
|
||||
"recentlyPlayed": "அண்மைக் காலத்தில் விளையாடியது",
|
||||
"recentlyUpdated": "அண்மைக் காலத்தில் புதுப்பிக்கப்பட்டது",
|
||||
@@ -223,8 +231,8 @@
|
||||
"addServer": {
|
||||
"input_password": "கடவுச்சொல்",
|
||||
"error_savePassword": "கடவுச்சொல்லை சேமிக்க முயற்சிக்கும்போது பிழை ஏற்பட்டது",
|
||||
"ignoreCors": "CORS ஐ புறக்கணிக்கவும் ($ t (Common.RestartRequired))",
|
||||
"ignoreSsl": "SSL ஐ புறக்கணிக்கவும் ($ t (பொதுவானது.",
|
||||
"ignoreCors": "CORS ஐ புறக்கணிக்கவும் ($t(common.restartRequired))",
|
||||
"ignoreSsl": "SSL ஐ புறக்கணிக்கவும் ($t(common.restartRequired))",
|
||||
"input_legacyAuthentication": "மரபு அங்கீகாரத்தை இயக்கவும்",
|
||||
"input_name": "சேவையக பெயர்",
|
||||
"input_savePassword": "கடவுச்சொல்லைச் சேமிக்கவும்",
|
||||
@@ -234,23 +242,24 @@
|
||||
"title": "சேவையகத்தைச் சேர்க்கவும்"
|
||||
},
|
||||
"deletePlaylist": {
|
||||
"input_confirm": "உறுதிப்படுத்த $ t (entity.playlist_one) பெயரைத் தட்டச்சு செய்க",
|
||||
"success": "$ t (entity.playlist_one) வெற்றிகரமாக நீக்கப்பட்டது",
|
||||
"title": "$ t (entity.playlist_one) ஐ நீக்கு"
|
||||
"input_confirm": "உறுதிப்படுத்த $t(entity.playlist_one) பெயரைத் தட்டச்சு செய்க",
|
||||
"success": "$t(entity.playlist_one) வெற்றிகரமாக நீக்கப்பட்டது",
|
||||
"title": "$t(entity.playlist_one)ஐ நீக்கு"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"title": "திருத்து $ t (entity.playlist_one)",
|
||||
"title": "திருத்து $t(entity.playlist_one)",
|
||||
"publicJellyfinNote": "சில காரணங்களால் செல்லிஃபின் ஒரு பிளேலிச்ட் பொதுவில் இல்லையா என்பதை அம்பலப்படுத்தவில்லை. இது பொதுவில் இருக்க விரும்பினால், தயவுசெய்து பின்வரும் உள்ளீட்டைத் தேர்ந்தெடுக்கவும்",
|
||||
"success": "$ t (entity.playlist_one) வெற்றிகரமாக புதுப்பிக்கப்பட்டது"
|
||||
"success": "$t(entity.playlist_one) வெற்றிகரமாகப் புதுப்பிக்கப்பட்டது"
|
||||
},
|
||||
"lyricSearch": {
|
||||
"input_artist": "$ t (entity.artist_one)",
|
||||
"input_name": "$ t (common.name)",
|
||||
"input_artist": "$t(entity.artist_one)",
|
||||
"input_name": "$t(common.name)",
|
||||
"title": "பாடல் தேடல்"
|
||||
},
|
||||
"queryEditor": {
|
||||
"input_optionMatchAll": "அனைத்தையும் பொருத்துங்கள்",
|
||||
"input_optionMatchAny": "எந்த பொருத்தவும்"
|
||||
"input_optionMatchAny": "எந்த பொருத்தவும்",
|
||||
"title": "வினவல் ஆசிரியர்"
|
||||
},
|
||||
"shareItem": {
|
||||
"description": "விவரம்",
|
||||
@@ -261,18 +270,18 @@
|
||||
"createFailed": "பங்கை உருவாக்கத் தவறிவிட்டது (பகிர்வு இயக்கப்பட்டதா?)"
|
||||
},
|
||||
"createPlaylist": {
|
||||
"success": "$ t (entity.playlist_one) வெற்றிகரமாக உருவாக்கப்பட்டது",
|
||||
"title": "$ t (entity.playlist_one) ஐ உருவாக்கவும்",
|
||||
"input_description": "$ t (common.description)",
|
||||
"input_name": "$ t (common.name)",
|
||||
"input_owner": "$ t (பொதுவானவர்)",
|
||||
"success": "$t(entity.playlist_one) வெற்றிகரமாக உருவாக்கப்பட்டது",
|
||||
"title": "$t(entity.playlist_one) ஐ உருவாக்கவும்",
|
||||
"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_other)",
|
||||
"input_skipDuplicates": "நகல்களைத் தவிர்க்கவும்",
|
||||
"success": "$ t (entity.trackwithCount, {\"count\": {{message}}}) $ t (entity.playlistwithCount, {\"count\": {{numOfPlaylists}}})",
|
||||
"title": "$ t இல் சேர்க்கவும் (entity.playlist_one)"
|
||||
"success": "$t(entity.trackWithCount, {\"count\": {{message}} }) இதற்கு $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} }) சேர்க்கப்பட்டது",
|
||||
"title": "$t(entity.playlist_one) இல் சேர்"
|
||||
},
|
||||
"updateServer": {
|
||||
"success": "சேவையகம் வெற்றிகரமாக புதுப்பிக்கப்பட்டது",
|
||||
@@ -286,8 +295,8 @@
|
||||
"recentReleases": "அண்மைக் கால வெளியீடுகள்",
|
||||
"viewDiscography": "டிச்கோகிராஃபி காண்க",
|
||||
"topSongs": "சிறந்த பாடல்கள்",
|
||||
"viewAllTracks": "அனைத்தையும் காண்க (entity.track_other)",
|
||||
"relatedArtists": "தொடர்புடைய $ t (entity.artist_other)",
|
||||
"viewAllTracks": "அனைத்தையும் காண்க $t(entity.track_other)",
|
||||
"relatedArtists": "தொடர்புடைய $t(entity.artist_other)",
|
||||
"topSongsFrom": "{{title}} இலிருந்து சிறந்த பாடல்கள்",
|
||||
"viewAll": "அனைத்தையும் காண்க"
|
||||
},
|
||||
@@ -298,9 +307,9 @@
|
||||
"goForward": "முன்னோக்கிச் செல்லுங்கள்",
|
||||
"manageServers": "சேவையகங்களை நிர்வகிக்கவும்",
|
||||
"openBrowserDevtools": "திறந்த உலாவி தேவ்டூல்கள்",
|
||||
"quit": "$ t (common.quit)",
|
||||
"quit": "$t(common.quit)",
|
||||
"selectServer": "சேவையகத்தைத் தேர்ந்தெடுக்கவும்",
|
||||
"settings": "$ t (common.setting_other)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"version": "பதிப்பு {{version}}"
|
||||
},
|
||||
"manageServers": {
|
||||
@@ -312,28 +321,28 @@
|
||||
"removeServer": "சேவையகத்தை அகற்று"
|
||||
},
|
||||
"contextMenu": {
|
||||
"addNext": "$ t (player.addnext)",
|
||||
"deletePlaylist": "$ t (action.deleteplaylist)",
|
||||
"deselectAll": "$ t (action.deselectall)",
|
||||
"addNext": "$t(player.addNext)",
|
||||
"deletePlaylist": "$t(action.deletePlaylist)",
|
||||
"deselectAll": "$t(action.deselectAll)",
|
||||
"download": "பதிவிறக்கம்",
|
||||
"moveToBottom": "$ t (action.movetobottom)",
|
||||
"moveToTop": "$ t (action.movetotop)",
|
||||
"moveToBottom": "$t(action.moveToBottom)",
|
||||
"moveToTop": "$t(action.moveToTop)",
|
||||
"numberSelected": "{{count}} தேர்ந்தெடுக்கப்பட்டது",
|
||||
"playSimilarSongs": "$ t (player.playsimilarsongs)",
|
||||
"removeFromFavorites": "$ t (action.removefromfoavites)",
|
||||
"removeFromPlaylist": "$ t (action.RemoveFrollayList)",
|
||||
"removeFromQueue": "$ t (action.RemoveFromQueue)",
|
||||
"setRating": "$ t (action.setrating)",
|
||||
"playShuffled": "$ t (player.shuffle)",
|
||||
"addFavorite": "$ t (action.addtofoaverites)",
|
||||
"addLast": "$ t (player.addlast)",
|
||||
"moveToNext": "$ t (action.movetonext)",
|
||||
"play": "$ t (player.play)",
|
||||
"playSimilarSongs": "$t(player.playSimilarSongs)",
|
||||
"removeFromFavorites": "$t(action.removeFromFavorites)",
|
||||
"removeFromPlaylist": "$t(action.removeFromPlaylist)",
|
||||
"removeFromQueue": "$t(action.removeFromQueue)",
|
||||
"setRating": "$t(action.setRating)",
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"addFavorite": "$t(action.addToFavorites)",
|
||||
"addLast": "$t(player.addLast)",
|
||||
"moveToNext": "$t(action.moveToNext)",
|
||||
"play": "$t(player.play)",
|
||||
"shareItem": "உருப்படியைப் பகிரவும்",
|
||||
"showDetails": "தகவலைப் பெறுங்கள்",
|
||||
"addToFavorites": "$ t (action.addtofoaverites)",
|
||||
"addToPlaylist": "$ t (action.addtoplailist)",
|
||||
"createPlaylist": "$ t (action.createplaylist)"
|
||||
"addToFavorites": "$t(action.addToFavorites)",
|
||||
"addToPlaylist": "$t(action.addToPlaylist)",
|
||||
"createPlaylist": "$t(action.createPlaylist)"
|
||||
},
|
||||
"fullscreenPlayer": {
|
||||
"config": {
|
||||
@@ -359,9 +368,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_one) $t(entity.album_other)",
|
||||
"showTracks": "காட்டு $t(entity.genre_one) $t(entity.track_other)",
|
||||
"title": "$t(entity.genre_other)"
|
||||
},
|
||||
"globalSearch": {
|
||||
"commands": {
|
||||
@@ -376,7 +385,7 @@
|
||||
"mostPlayed": "அதிகம் விளையாடியது",
|
||||
"newlyAdded": "புதிதாக சேர்க்கப்பட்ட வெளியீடுகள்",
|
||||
"recentlyPlayed": "அண்மைக் காலத்தில் விளையாடியது",
|
||||
"title": "$ t (காமன்.ஓம்)"
|
||||
"title": "$t(common.home)"
|
||||
},
|
||||
"itemDetail": {
|
||||
"copyPath": "இடைநிலைப்பலகைக்கு பாதையை நகலெடுக்கவும்",
|
||||
@@ -387,7 +396,7 @@
|
||||
"reorder": "ஐடியால் வரிசைப்படுத்தும்போது மட்டுமே மறுசீரமைப்பு இயக்கப்பட்டது"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$ t (entity.playlist_other)"
|
||||
"title": "$t(entity.playlist_other)"
|
||||
},
|
||||
"setting": {
|
||||
"advanced": "மேம்பட்ட",
|
||||
@@ -397,43 +406,44 @@
|
||||
"windowTab": "சாளரம்"
|
||||
},
|
||||
"sidebar": {
|
||||
"folders": "$ t (entity.folder_other)",
|
||||
"genres": "$ t (entity.genre_other)",
|
||||
"home": "$ t (காமன்.ஓம்)",
|
||||
"folders": "$t(entity.folder_other)",
|
||||
"genres": "$t(entity.genre_other)",
|
||||
"home": "$t(common.home)",
|
||||
"nowPlaying": "இப்போது விளையாடுகிறது",
|
||||
"playlists": "$ t (entity.playlist_other)",
|
||||
"search": "$ t (பொதுவானது. தேடல்)",
|
||||
"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)"
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"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)",
|
||||
"myLibrary": "எனது நூலகம்"
|
||||
},
|
||||
"trackList": {
|
||||
"title": "$ t (entity.track_other)",
|
||||
"genreTracks": "\"{{genre}}\" $ t (entity.track_other)",
|
||||
"title": "$t(entity.track_other)",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track_other)",
|
||||
"artistTracks": "{{artist}}"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$ t (entity.albumartist_other)"
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "இந்த $ t (entity.artist_one) இலிருந்து மேலும்",
|
||||
"moreFromGeneric": "{{item} இருந்து இலிருந்து மேலும்",
|
||||
"moreFromArtist": "இந்த $t(entity.artist_one) இலிருந்து மேலும்",
|
||||
"moreFromGeneric": "{{item}} இலிருந்து மேலும்",
|
||||
"released": "வெளியிடப்பட்டது"
|
||||
},
|
||||
"albumList": {
|
||||
"artistAlbums": "ஆல்பங்கள் {{artist}}",
|
||||
"genreAlbums": "\"{{genre}}\" $ t (entity.album_other)",
|
||||
"title": "$ t (entity.album_other)"
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)",
|
||||
"title": "$t(entity.album_other)"
|
||||
}
|
||||
},
|
||||
"player": {
|
||||
"addLast": "கடைசியாக சேர்க்கவும்",
|
||||
"addNext": "அடுத்து சேர்க்கவும்",
|
||||
"favorite": "பிடித்த",
|
||||
"mute": "முடக்கு",
|
||||
"mute": "ஒலிமுடக்கு",
|
||||
"muted": "முடக்கிய",
|
||||
"next": "அடுத்தது",
|
||||
"play": "விளையாடுங்கள்",
|
||||
@@ -500,7 +510,7 @@
|
||||
"globalMediaHotkeys_description": "பிளேபேக்கைக் கட்டுப்படுத்த உங்கள் கணினி மீடியா ஆட்கீசின் பயன்பாட்டை இயக்கவும் அல்லது முடக்கவும்",
|
||||
"homeConfiguration": "முகப்பு பக்க உள்ளமைவு",
|
||||
"homeFeature": "வீட்டில் கொணர்வி இடம்பெற்றது",
|
||||
"hotkey_favoriteCurrentSong": "பிடித்த $ t (common.curressong)",
|
||||
"hotkey_favoriteCurrentSong": "பிடித்த $t(common.currentSong)",
|
||||
"hotkey_globalSearch": "உலக தேடல்",
|
||||
"hotkey_playbackPrevious": "முந்தைய பாடல்",
|
||||
"hotkey_playbackStop": "நிறுத்து",
|
||||
@@ -511,19 +521,19 @@
|
||||
"hotkey_rate4": "மதிப்பீடு 4 நட்சத்திரங்கள்",
|
||||
"hotkey_rate5": "மதிப்பீடு 5 நட்சத்திரங்கள்",
|
||||
"hotkey_toggleFullScreenPlayer": "முழு திரை பிளேயரை மாற்றவும்",
|
||||
"hotkey_togglePreviousSongFavorite": "மாற்றவும் (பொதுவானது. ப்ரீவியச்ங்) பிடித்தது",
|
||||
"hotkey_togglePreviousSongFavorite": "மாற்றவும் $t(common.previousSong) பிடித்தது",
|
||||
"hotkey_toggleQueue": "வரிசையை மாற்றவும்",
|
||||
"hotkey_toggleRepeat": "மீண்டும் மீண்டும்",
|
||||
"hotkey_toggleRepeat": "மாற்று மறுநிகழ்வு",
|
||||
"hotkey_toggleShuffle": "கலக்கு மாற்று",
|
||||
"hotkey_unfavoriteCurrentSong": "சாதகமற்ற $ t (common.curressong)",
|
||||
"hotkey_unfavoritePreviousSong": "சாதகமற்ற $ t (காமன்.பிரெவியச்ங்)",
|
||||
"hotkey_unfavoriteCurrentSong": "பிடிக்காத $t(common.currentSong)",
|
||||
"hotkey_unfavoritePreviousSong": "பிடிக்காத $t(common.previousSong)",
|
||||
"hotkey_volumeDown": "தொகுதி கீழே",
|
||||
"hotkey_volumeMute": "தொகுதி முடக்கு",
|
||||
"hotkey_volumeUp": "தொகுதி",
|
||||
"language": "மொழி",
|
||||
"language_description": "பயன்பாட்டிற்கான மொழியை அமைக்கிறது ($ t (பொதுவானது.",
|
||||
"language_description": "பயன்பாட்டிற்கான மொழியை அமைக்கிறது ($t(common.restartRequired))",
|
||||
"lastfmApiKey": "{{lastfm}} பநிஇ key",
|
||||
"lastfmApiKey_description": "{{lastfm} க்கு க்கான பநிஇ விசை. கவர் கலைக்கு தேவை",
|
||||
"lastfmApiKey_description": "{{lastfm}} க்கான பநிஇ விசை. கவர் கலைக்குத் தேவை",
|
||||
"lyricFetch": "இணையத்திலிருந்து வரிகளை பெறுங்கள்",
|
||||
"lyricFetchProvider_description": "பாடல் பெற வழங்குநர்களைத் தேர்ந்தெடுக்கவும். வழங்குநர்களின் வரிசை அவர்கள் வினவப்படும் ஒழுங்கு",
|
||||
"lyricOffset": "பாடல் ஆஃப்செட் (எம்.எச்)",
|
||||
@@ -544,8 +554,8 @@
|
||||
"playbackStyle_optionNormal": "சாதாரண",
|
||||
"playButtonBehavior": "பொத்தான் நடத்தை விளையாடுங்கள்",
|
||||
"playButtonBehavior_description": "வரிசையில் பாடல்களைச் சேர்க்கும்போது ப்ளே பொத்தானின் இயல்புநிலை நடத்தை அமைக்கிறது",
|
||||
"playButtonBehavior_optionAddLast": "$ t (player.addlast)",
|
||||
"playButtonBehavior_optionAddNext": "$ t (player.addnext)",
|
||||
"playButtonBehavior_optionAddLast": "$t(player.addLast)",
|
||||
"playButtonBehavior_optionAddNext": "$t(player.addNext)",
|
||||
"playerAlbumArtResolution": "பிளேயர் ஆல்பம் கலைத் தீர்மானம்",
|
||||
"playerAlbumArtResolution_description": "பெரிய வீரரின் ஆல்பம் கலை முன்னோட்டத்திற்கான தீர்மானம். பெரியது இது மிகவும் மிருதுவானதாக தோற்றமளிக்கிறது, ஆனால் மெதுவாக ஏற்றுவதை மெதுவாகக் கொண்டிருக்கலாம். இயல்புநிலை 0 க்கு, அதாவது ஆட்டோ",
|
||||
"playerbarOpenDrawer": "பிளேயர்பார் முழுத்திரை மாற்று",
|
||||
@@ -557,14 +567,14 @@
|
||||
"remoteUsername": "ரிமோட் கண்ட்ரோல் சர்வர் பயனர்பெயர்",
|
||||
"remoteUsername_description": "ரிமோட் கண்ட்ரோல் சேவையகத்திற்கான பயனர்பெயரை அமைக்கிறது. பயனர்பெயர் மற்றும் கடவுச்சொல் இரண்டும் காலியாக இருந்தால், ஏற்பு முடக்கப்படும்",
|
||||
"replayGainClipping": "{{ReplayGain}} கிளிப்பிங்",
|
||||
"replayGainClipping_description": "ஆதாயத்தை தானாகவே குறைப்பதன் மூலம் {{ReplayGain} by காரணமாக ஏற்படும் கிளிப்பிங்கைத் தடுக்கவும்",
|
||||
"replayGainFallback": "{{{ReplayGain}}} falback",
|
||||
"replayGainClipping_description": "ஆதாயத்தைத் தானாகவே குறைப்பதன் மூலம் {{ReplayGain}} காரணமாக ஏற்படும் கிளிப்பிங்கைத் தடுக்கவும்",
|
||||
"replayGainFallback": "{{ReplayGain}} பின்னடைவு",
|
||||
"replayGainFallback_description": "கோப்பில் {{ReplayGain}} குறிச்சொற்கள் இல்லையென்றால் விண்ணப்பிக்க DB இல் ஆதாயம்",
|
||||
"replayGainMode": "{{ReplayGain}} பயன்முறை",
|
||||
"replayGainMode_description": "{{ReplayGain}}} மதிப்புகளின் படி தொகுதி ஆதாயத்தை சரிசெய்யவும் மேனிலை தரவு கோப்பு",
|
||||
"replayGainMode_optionAlbum": "$ t (entity.album_one)",
|
||||
"replayGainMode_optionNone": "$ t (common.none)",
|
||||
"replayGainMode_optionTrack": "$ t (entity.track_one)",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album_one)",
|
||||
"replayGainMode_optionNone": "$t(common.none)",
|
||||
"replayGainMode_optionTrack": "$t(entity.track_one)",
|
||||
"replayGainPreamp": "{{ReplayGain}} preamp (db)",
|
||||
"replayGainPreamp_description": "{{ReplayGain}}} மதிப்புகளுக்கு பயன்படுத்தப்படும் Preamp ஆதாயத்தை சரிசெய்யவும்",
|
||||
"sampleRate": "மாதிரி வீதம்",
|
||||
@@ -615,7 +625,7 @@
|
||||
"discordIdleStatus_description": "இயக்கப்பட்டால், பிளேயர் சும்மா இருக்கும்போது நிலையைப் புதுப்பிக்கவும்",
|
||||
"discordListening_description": "விளையாடுவதற்குப் பதிலாக கேட்பது என்று அந்த நிலையைக் காட்டுங்கள்",
|
||||
"discordRichPresence": "{{discord}} பணக்கார இருப்பு",
|
||||
"discordRichPresence_description": "{{discord}} பணக்கார இருப்பில் பின்னணி நிலையை இயக்கவும். பட விசைகள்: {{icon}}, {{playing}}, மற்றும் {{paused}} ",
|
||||
"discordRichPresence_description": "{{discord}} பணக்கார இருப்பில் பின்னணி நிலையை இயக்கவும். பட விசைகள்: {{icon}}, {{playing}}, மற்றும் {{paused}}",
|
||||
"customCss_description": "தனிப்பயன் சிஎச்எச் உள்ளடக்கம். குறிப்பு: உள்ளடக்கம் மற்றும் தொலைநிலை முகவரி கள் அனுமதிக்கப்படாத பண்புகள். உங்கள் உள்ளடக்கத்தின் முன்னோட்டம் கீழே காட்டப்பட்டுள்ளது. நீங்கள் அமைக்காத கூடுதல் புலங்கள் சுத்திகரிப்பு காரணமாக உள்ளன.",
|
||||
"doubleClickBehavior": "இரட்டை சொடுக்கு செய்யும் போது தேடப்பட்ட அனைத்து தடங்களையும் வரிசைப்படுத்தவும்",
|
||||
"doubleClickBehavior_description": "உண்மை என்றால், தட தேடலில் பொருந்தக்கூடிய அனைத்து தடங்களும் வரிசையில் நிற்கப்படும். இல்லையெனில், சொடுக்கு செய்யப்பட்ட ஒன்று மட்டுமே வரிசையில் நிற்கப்படும்",
|
||||
@@ -631,7 +641,7 @@
|
||||
"homeFeature_description": "முகப்பு பக்கத்தில் பெரிய பிரத்யேக கொணர்வி காட்ட வேண்டுமா என்பதைக் கட்டுப்படுத்துகிறது",
|
||||
"hotkey_browserBack": "உலாவி மீண்டும்",
|
||||
"hotkey_browserForward": "முன்னோக்கி உலாவி",
|
||||
"hotkey_favoritePreviousSong": "பிடித்த $ t (காமன்.பிரெவியச்ங்)",
|
||||
"hotkey_favoritePreviousSong": "பிடித்த $t(common.previousSong)",
|
||||
"hotkey_localSearch": "பக்க தேடல்",
|
||||
"hotkey_playbackNext": "அடுத்த பாடல்",
|
||||
"hotkey_playbackPause": "இடைநிறுத்தம்",
|
||||
@@ -646,10 +656,10 @@
|
||||
"lyricFetchProvider": "பாடல் பெற வழங்குநர்கள்",
|
||||
"lyricOffset_description": "குறிப்பிட்ட அளவு மில்லி விநாடிகளால் பாடலை ஈடுசெய்யவும்",
|
||||
"hotkey_skipForward": "முன்னோக்கி செல்லுங்கள்",
|
||||
"hotkey_toggleCurrentSongFavorite": "மாற்று $ t (common.curressong) பிடித்தது",
|
||||
"hotkey_toggleCurrentSongFavorite": "மாற்று $t(common.currentSong) பிடித்தது",
|
||||
"minimizeToTray_description": "கணினி தட்டில் பயன்பாட்டைக் குறைக்கவும்",
|
||||
"playButtonBehavior_optionPlay": "$ t (player.play)",
|
||||
"playButtonBehavior_optionPlayShuffled": "$ t (player.shuffle)",
|
||||
"playButtonBehavior_optionPlay": "$t(player.play)",
|
||||
"playButtonBehavior_optionPlayShuffled": "$t(player.shuffle)",
|
||||
"savePlayQueue": "விளையாட்டு வரிசையை சேமிக்கவும்",
|
||||
"savePlayQueue_description": "பயன்பாடு மூடப்படும் போது ப்ளே வரிசையை சேமித்து, பயன்பாடு திறக்கப்படும் போது அதை மீட்டெடுக்கவும்",
|
||||
"scrobble": "ச்க்ரோபில்",
|
||||
@@ -687,79 +697,97 @@
|
||||
"useSystemTheme": "கணினி கருப்பொருளைப் பயன்படுத்தவும்",
|
||||
"useSystemTheme_description": "கணினி வரையறுக்கப்பட்ட ஒளி அல்லது இருண்ட விருப்பத்தைப் பின்பற்றவும்",
|
||||
"zoom": "சூம் விழுக்காடு",
|
||||
"zoom_description": "பயன்பாட்டிற்கான சூம் சதவீதத்தை அமைக்கிறது"
|
||||
"zoom_description": "பயன்பாட்டிற்கான சூம் சதவீதத்தை அமைக்கிறது",
|
||||
"discordPausedStatus": "இடைநிறுத்தப்படும்போது பணக்கார இருப்பைக் காட்டுங்கள்",
|
||||
"discordPausedStatus_description": "இயக்கப்பட்டால், பிளேயர் இடைநிறுத்தப்படும்போது நிலை காண்பிக்கப்படும்",
|
||||
"discordServeImage": "சேவையகத்திலிருந்து {{discord}} படங்களை பரிமாறவும்",
|
||||
"discordServeImage_description": "{{discord}} சேவையகத்திலிருந்தே பணக்கார இருப்புக்கான கவர் கலையைப் பகிரவும், செலிஃபின் மற்றும் நுடிட்ரோம் மட்டுமே கிடைக்கும்",
|
||||
"preferLocalLyrics": "உள்ளக பாடல்களை விரும்புங்கள்",
|
||||
"preferLocalLyrics_description": "கிடைக்கும்போது தொலைநிலை பாடல்களை விட உள்ளக பாடல்களை விரும்புங்கள்",
|
||||
"lastfm": "last.fm இணைப்புகளைக் காட்டு",
|
||||
"lastfm_description": "கலைஞர்/ஆல்பம் பக்கங்களில் Last.fm க்கான இணைப்புகளைக் காட்டு",
|
||||
"notify": "பாடல் அறிவிப்புகளை இயக்கவும்",
|
||||
"notify_description": "தற்போதைய பாடலை மாற்றும்போது அறிவிப்புகளைக் காட்டு",
|
||||
"musicbrainz": "மியூசிக் பிரேன்ச் இணைப்புகளைக் காட்டு",
|
||||
"musicbrainz_description": "கலைஞர்/ஆல்பம் பக்கங்களில் மியூசிக் பிரைன்ச் இணைப்புகளைக் காட்டு, அங்கு MBID உள்ளது",
|
||||
"neteaseTranslation": "நெட்ச் மொழிபெயர்ப்புகளை இயக்கவும்",
|
||||
"neteaseTranslation_description": "இயக்கப்பட்டால், கிடைத்தால் நெட்சிலிருந்து மொழிபெயர்க்கப்பட்ட பாடல்களைப் பெறுகிறது மற்றும் காட்சிப்படுத்துகிறது.",
|
||||
"preservePitch": "சுருதியைப் பாதுகாக்கவும்",
|
||||
"preservePitch_description": "பின்னணி வேகத்தை மாற்றும்போது சுருதியைப் பாதுகாக்கிறது"
|
||||
},
|
||||
"table": {
|
||||
"config": {
|
||||
"label": {
|
||||
"album": "$ t (entity.album_one)",
|
||||
"artist": "$ t (entity.artist_one)",
|
||||
"biography": "$ t (காமன். -புவியியல்)",
|
||||
"bitrate": "$ t (common.bitrate)",
|
||||
"bpm": "$ t (common.bpm)",
|
||||
"channels": "$ t (common.channel_other)",
|
||||
"codec": "$ t (common.codec)",
|
||||
"album": "$t(entity.album_one)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"biography": "$t(common.biography)",
|
||||
"bitrate": "$t(common.bitrate)",
|
||||
"bpm": "$t(common.bpm)",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"codec": "$t(common.codec)",
|
||||
"dateAdded": "தேதி சேர்க்கப்பட்டது",
|
||||
"rating": "$ t (பொதுவானது. ரேட்டிங்)",
|
||||
"rating": "$t(common.rating)",
|
||||
"releaseDate": "வெளியீட்டு தேதி",
|
||||
"rowIndex": "வரிசை அட்டவணை",
|
||||
"size": "$ t (common.size)",
|
||||
"size": "$t(common.size)",
|
||||
"trackNumber": "ட்ராக் எண்",
|
||||
"year": "$ t (பொதுவானது.",
|
||||
"year": "$t(common.year)",
|
||||
"lastPlayed": "கடைசியாக விளையாடியது",
|
||||
"note": "$ t (பொதுவானது. குறிப்பு)",
|
||||
"owner": "$ t (பொதுவானவர்)",
|
||||
"actions": "$ t (common.action_other)",
|
||||
"albumArtist": "$ t (entity.albumartist_one)",
|
||||
"note": "$t(common.note)",
|
||||
"owner": "$t(common.owner)",
|
||||
"actions": "$t(common.action_other)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"discNumber": "வட்டு எண்",
|
||||
"duration": "$ t (பொதுவானது.",
|
||||
"favorite": "$ t (common.foavorite)",
|
||||
"genre": "$ t (entity.genre_one)",
|
||||
"path": "$ t (common.path)",
|
||||
"duration": "$t(common.duration)",
|
||||
"favorite": "$t(common.favorite)",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"path": "$t(common.path)",
|
||||
"playCount": "விளையாட்டு எண்ணிக்கை",
|
||||
"songCount": "$ t (entity.track_other)",
|
||||
"title": "$ t (common.title)",
|
||||
"titleCombined": "$ t (common.title) (ஒருங்கிணைந்த)"
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"title": "$t(common.title)",
|
||||
"titleCombined": "$t(common.title) (இணைந்தது)"
|
||||
},
|
||||
"view": {
|
||||
"card": "அட்டை",
|
||||
"table": "அட்டவணை",
|
||||
"poster": "சுவரொட்டி"
|
||||
"poster": "சுவரொட்டி",
|
||||
"grid": "வலைவாய்",
|
||||
"list": "பட்டியல்"
|
||||
},
|
||||
"general": {
|
||||
"autoFitColumns": "ஆட்டோ பொருத்தம் நெடுவரிசைகள்",
|
||||
"followCurrentSong": "தற்போதைய பாடலைப் பின்தொடரவும்",
|
||||
"displayType": "காட்சி வகை",
|
||||
"gap": "$ t (comman.gap)",
|
||||
"gap": "$t(common.gap)",
|
||||
"itemGap": "உருப்படி இடைவெளி (பிஎக்ச்)",
|
||||
"itemSize": "உருப்படி அளவு (பிஎக்ச்)",
|
||||
"size": "$ t (common.size)",
|
||||
"size": "$t(common.size)",
|
||||
"tableColumns": "அட்டவணை நெடுவரிசைகள்"
|
||||
}
|
||||
},
|
||||
"column": {
|
||||
"album": "ஆல்பம்",
|
||||
"albumArtist": "ஆல்பம் கலைஞர்",
|
||||
"albumCount": "$ t (entity.album_other)",
|
||||
"artist": "$ t (entity.artist_one)",
|
||||
"albumCount": "$t(entity.album_other)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"biography": "சுயசரிதை",
|
||||
"bitrate": "பிட்ரேட்",
|
||||
"bpm": "பிபிஎம்",
|
||||
"channels": "$ t (common.channel_other)",
|
||||
"codec": "$ t (common.codec)",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"codec": "$t(common.codec)",
|
||||
"comment": "கருத்து",
|
||||
"dateAdded": "தேதி சேர்க்கப்பட்டது",
|
||||
"discNumber": "வட்டு",
|
||||
"favorite": "பிடித்த",
|
||||
"genre": "$ t (entity.genre_one)",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"lastPlayed": "கடைசியாக விளையாடியது",
|
||||
"path": "பாதை",
|
||||
"playCount": "நாடகங்கள்",
|
||||
"rating": "செயல்வரம்பு",
|
||||
"releaseDate": "வெளியீட்டு தேதி",
|
||||
"releaseYear": "ஆண்டு",
|
||||
"size": "$ t (common.size)",
|
||||
"songCount": "$ t (entity.track_other)",
|
||||
"size": "$t(common.size)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"title": "தலைப்பு",
|
||||
"trackNumber": "மின்தடம்"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,795 @@
|
||||
{
|
||||
"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",
|
||||
"removeFromQueue": "sıradan kaldır",
|
||||
"setRating": "oyla",
|
||||
"viewPlaylists": "$t(entity.playlist_other) 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",
|
||||
"clearQueue": "sırayı temizle",
|
||||
"createPlaylist": "$t(entity.playlist_one) listesini oluştur",
|
||||
"deletePlaylist": "$t(entity.playlist_one) listesini sil",
|
||||
"deselectAll": "seçimleri kaldır",
|
||||
"editPlaylist": "$t(entity.playlist_one) listesini düzenle",
|
||||
"goToPage": "sayfaya git",
|
||||
"moveToNext": "sonrakine geç",
|
||||
"refresh": "$t(common.refresh)",
|
||||
"toggleSmartPlaylistEditor": "$t(entity.smartPlaylist) düzenleyiciye geç"
|
||||
},
|
||||
"common": {
|
||||
"action_one": "eylem",
|
||||
"action_other": "eylemler",
|
||||
"add": "ekle",
|
||||
"additionalParticipants": "ek katılımcılar",
|
||||
"newVersion": "yeni bir sürüm ({{version}}) yüklendi",
|
||||
"viewReleaseNotes": "sürüm notlarını görüntüle",
|
||||
"areYouSure": "emin misin?",
|
||||
"backward": "geri",
|
||||
"biography": "biyografi",
|
||||
"bitDepth": "bit derinliği",
|
||||
"bitrate": "bit hızı",
|
||||
"bpm": "bpm",
|
||||
"cancel": "iptal et",
|
||||
"center": "merkez",
|
||||
"channel_one": "kanal",
|
||||
"channel_other": "kanallar",
|
||||
"clear": "temizle",
|
||||
"close": "kapat",
|
||||
"codec": "codec",
|
||||
"comingSoon": "çok yakında…",
|
||||
"configure": "yapılandır",
|
||||
"confirm": "onayla",
|
||||
"create": "oluştur",
|
||||
"currentSong": "şu anki parça $t(entity.track_one)",
|
||||
"decrease": "azalt",
|
||||
"delete": "sil",
|
||||
"descending": "azalan",
|
||||
"description": "açıklama",
|
||||
"disable": "devre dışı",
|
||||
"disc": "disk",
|
||||
"duration": "süre",
|
||||
"edit": "düzenle",
|
||||
"enable": "etkinleştir",
|
||||
"expand": "genişlet",
|
||||
"favorite": "favori",
|
||||
"filter_one": "filtre",
|
||||
"filter_other": "filtreler",
|
||||
"filters": "filtreler",
|
||||
"forceRestartRequired": "değişiklikleri uygulamak için yeniden başlatın... yeniden başlatmak için bildirimi kapatın",
|
||||
"forward": "ileri",
|
||||
"gap": "boşluk",
|
||||
"home": "ana sayfa",
|
||||
"left": "sol",
|
||||
"manage": "yönet",
|
||||
"increase": "arttır",
|
||||
"limit": "sınır",
|
||||
"maximize": "ekranı kapla",
|
||||
"menu": "menü",
|
||||
"minimize": "simge durumuna küçült",
|
||||
"modified": "değiştirilmiş",
|
||||
"mbid": "MusicBrainz ID",
|
||||
"name": "isim",
|
||||
"no": "hayır",
|
||||
"none": "hiçbiri",
|
||||
"noResultsFromQuery": "arama sorguları için sonuç bulunamadı",
|
||||
"note": "not",
|
||||
"ok": "tamam",
|
||||
"owner": "sahip",
|
||||
"path": "yol",
|
||||
"playerMustBePaused": "oynatıcı duraklatılmalı",
|
||||
"preview": "önizleme",
|
||||
"previousSong": "önceki $t(entity.track_one)",
|
||||
"quit": "çık",
|
||||
"random": "rastgele",
|
||||
"rating": "oylama",
|
||||
"refresh": "yenile",
|
||||
"reload": "yeniden yükle",
|
||||
"reset": "sıfırla",
|
||||
"resetToDefault": "varsayılana sıfırla",
|
||||
"restartRequired": "yeniden başlatma gerekli",
|
||||
"right": "sağ",
|
||||
"sampleRate": "örnekleme hızı",
|
||||
"save": "kaydet",
|
||||
"saveAndReplace": "kaydet ve değiştir",
|
||||
"saveAs": "farklı kaydet",
|
||||
"search": "arama",
|
||||
"setting": "ayarlar",
|
||||
"share": "paylaş",
|
||||
"size": "boyut",
|
||||
"sortOrder": "sıralama düzeni",
|
||||
"tags": "etiketler",
|
||||
"title": "başlık",
|
||||
"trackNumber": "parça",
|
||||
"albumGain": "albüm kazancı",
|
||||
"albumPeak": "albüm zirvesi",
|
||||
"ascending": "artan",
|
||||
"collapse": "daralt",
|
||||
"dismiss": "kapat",
|
||||
"translation": "çeviri",
|
||||
"unknown": "bilinmeyen",
|
||||
"version": "sürüm",
|
||||
"year": "yıl",
|
||||
"yes": "evet",
|
||||
"trackGain": "parça kazancı",
|
||||
"trackPeak": "parça zirvesi"
|
||||
},
|
||||
"entity": {
|
||||
"album_one": "albüm",
|
||||
"album_other": "albümler",
|
||||
"albumArtist_one": "albüm sanatçısı",
|
||||
"albumArtist_other": "albüm sanatçıları",
|
||||
"albumArtistCount_one": "{{count}} albüm sanatçısı",
|
||||
"albumArtistCount_other": "{{count}} albüm sanatçıları",
|
||||
"albumWithCount_one": "{{count}} albüm",
|
||||
"albumWithCount_other": "{{count}} albüm",
|
||||
"artist_one": "sanatçı",
|
||||
"artist_other": "sanatçılar",
|
||||
"artistWithCount_one": "{{count}} sanatçı",
|
||||
"artistWithCount_other": "{{count}} sanatçı",
|
||||
"favorite_one": "favori",
|
||||
"favorite_other": "favoriler",
|
||||
"folder_one": "klasör",
|
||||
"folder_other": "klasörler",
|
||||
"folderWithCount_one": "{{count}} klasör",
|
||||
"folderWithCount_other": "{{count}} klasör",
|
||||
"genre_one": "tür",
|
||||
"genre_other": "türler",
|
||||
"genreWithCount_one": "{{count}} tür",
|
||||
"genreWithCount_other": "{{count}} türler",
|
||||
"playlist_one": "çalma listesi",
|
||||
"playlist_other": "çalma listeleri",
|
||||
"play_one": "{{count}} oynat",
|
||||
"play_other": "{{count}} oynatma",
|
||||
"playlistWithCount_one": "{{count}} oynatma listesi",
|
||||
"playlistWithCount_other": "{{count}} oynatma listesi",
|
||||
"smartPlaylist": "akıllı $t(entity.playlist_one)",
|
||||
"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"
|
||||
},
|
||||
"error": {
|
||||
"apiRouteError": "istek yönlendirilemiyor",
|
||||
"audioDeviceFetchError": "ses aygıtları alınmaya çalışılırken bir hata oluştu",
|
||||
"authenticationFailed": "kimlik doğrulaması başarısız",
|
||||
"badAlbum": "bu sayfayı görüyorsunuz çünkü bu şarkı bir albümün parçası değil. büyük olasılıkla müzik klasörünüzün en üst seviyesinde bir şarkınız varsa bu sorunu görüyorsunuz. jellyfin yalnızca bir klasör içindeyse parçaları gruplandırır.",
|
||||
"badValue": "geçersiz seçenek \"{{value}}\". bu değer artık mevcut değil",
|
||||
"remotePortError": "uzak sunucu bağlantı noktası ayarlanmaya çalışılırken bir hata oluştu",
|
||||
"remotePortWarning": "yeni bağlantı noktasını uygulamak için sunucuyu yeniden başlatın",
|
||||
"serverNotSelectedError": "sunucu seçili değil",
|
||||
"serverRequired": "sunucu gerekli",
|
||||
"sessionExpiredError": "oturumunuzun süresi doldu",
|
||||
"systemFontError": "sistem fontlarını almaya çalışırken bir hata oluştu",
|
||||
"endpointNotImplementedError": "{{endpoint}} uç noktası bu {{serverType}} için uygulanamaz",
|
||||
"genericError": "bir hata oluştu",
|
||||
"invalidServer": "geçersiz sunucu",
|
||||
"localFontAccessDenied": "yerel fontlara erişim reddedildi",
|
||||
"loginRateError": "çok fazla giriş denemesi, lütfen birkaç saniye içinde tekrar deneyin",
|
||||
"mpvRequired": "MPV gerekli",
|
||||
"networkError": "bir ağ hatası meydana geldi",
|
||||
"notificationDenied": "bildirimler için izinler reddedildi. bu ayarın hiçbir etkisi yoktur",
|
||||
"openError": "dosya açılamadı",
|
||||
"playbackError": "medya oynatmayı çalışırken bir hata meydana geldi",
|
||||
"credentialsRequired": "ki̇mli̇k bi̇lgi̇leri̇ gerekli",
|
||||
"remoteDisableError": "uzak sunucuyu $t(common.disable) yapmaya çalışırken bir hata oluştu",
|
||||
"remoteEnableError": "uzak sunucuyu $t(common.enable) yapmaya çalışırken bir hata oluştu"
|
||||
},
|
||||
"filter": {
|
||||
"albumCount": "$t(entity.album_other) sayısı",
|
||||
"biography": "biyografi",
|
||||
"bitrate": "bit hızı",
|
||||
"bpm": "bpm",
|
||||
"comment": "yorum",
|
||||
"communityRating": "topluluk derecelendirmesi",
|
||||
"criticRating": "eleştirmen derecelendirmesi",
|
||||
"dateAdded": "tarih eklendi",
|
||||
"disc": "disk",
|
||||
"duration": "süre",
|
||||
"favorited": "favorilendi",
|
||||
"fromYear": "yılından itibaren",
|
||||
"id": "kimlik",
|
||||
"isCompilation": "derleme",
|
||||
"isFavorited": "favorilendi",
|
||||
"isPublic": "herkese açık",
|
||||
"isRated": "oylandı",
|
||||
"isRecentlyPlayed": "yakın zamanda çalındı",
|
||||
"lastPlayed": "son çalınan",
|
||||
"mostPlayed": "en çok çalınan",
|
||||
"name": "isim",
|
||||
"note": "not",
|
||||
"owner": "$t(common.owner)",
|
||||
"path": "yol",
|
||||
"playCount": "çalma sayısı",
|
||||
"random": "rastgele",
|
||||
"rating": "oylama",
|
||||
"recentlyAdded": "yakın zamanda eklendi",
|
||||
"recentlyPlayed": "yakın zamanda oynadı",
|
||||
"recentlyUpdated": "yakın zamanda güncellendi",
|
||||
"releaseDate": "çıkış tarihi",
|
||||
"releaseYear": "çıkış yılı",
|
||||
"search": "arama",
|
||||
"songCount": "şarkı sayısı",
|
||||
"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)",
|
||||
"channels": "$t(common.channel_other)"
|
||||
},
|
||||
"form": {
|
||||
"addServer": {
|
||||
"error_savePassword": "şifreyi kaydetmeye çalışırken bir hata oluştu",
|
||||
"ignoreCors": "cors'u $t(common.restartRequired) görmezden gel",
|
||||
"ignoreSsl": "ssl bağlantısını görmezden gel $t(common.restartRequired)",
|
||||
"input_legacyAuthentication": "eski kimlik doğrulamayı etkinleştir",
|
||||
"input_name": "sucunu ismi",
|
||||
"input_password": "şifre",
|
||||
"input_savePassword": "şifreyi kaydet",
|
||||
"input_url": "URL",
|
||||
"input_username": "kullanıcı ismi",
|
||||
"success": "sunucu başarıyla eklendi",
|
||||
"title": "sunucu ekle"
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"input_playlists": "$t(entity.playlist_other)",
|
||||
"input_skipDuplicates": "kopyaları atla",
|
||||
"title": "$t(entity.playlist_one) listesine ekle",
|
||||
"success": "$t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} }) $t(entity.trackWithCount, {\"count\": {{message}} }) eklendi"
|
||||
},
|
||||
"createPlaylist": {
|
||||
"input_description": "$t(common.description)",
|
||||
"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"
|
||||
},
|
||||
"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"
|
||||
},
|
||||
"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"
|
||||
},
|
||||
"lyricSearch": {
|
||||
"input_artist": "$t(entity.artist_one)",
|
||||
"input_name": "$t(common.name)",
|
||||
"title": "şarkı sözü arama"
|
||||
},
|
||||
"queryEditor": {
|
||||
"title": "sorgu düzenleyici",
|
||||
"input_optionMatchAll": "hepsini eşleştir",
|
||||
"input_optionMatchAny": "herhangi biriyle eşleştir"
|
||||
},
|
||||
"shareItem": {
|
||||
"allowDownloading": "indirmeye izin ver",
|
||||
"description": "açıklama",
|
||||
"setExpiration": "sona erme tarihi ayarla",
|
||||
"success": "paylaşma bağlantısı panoya kopyalandı (veya açmak için buraya tıklayın)",
|
||||
"expireInvalid": "son kullanma tarihi gelecekte olmalı",
|
||||
"createFailed": "paylaşım oluşturulamadı (paylaşım etkin mi?)"
|
||||
},
|
||||
"updateServer": {
|
||||
"success": "sunucu başarıyla güncellendi",
|
||||
"title": "sunucuyu güncelle"
|
||||
}
|
||||
},
|
||||
"page": {
|
||||
"albumArtistDetail": {
|
||||
"about": "{{artist}} hakkında",
|
||||
"appearsOn": "üzerinde görünür",
|
||||
"recentReleases": "son sürümler",
|
||||
"viewDiscography": "diskografiyi görüntüle",
|
||||
"relatedArtists": "$t(entity.artist_other) 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",
|
||||
"topSongsFrom": "{{title}} tarafından en iyi şarkılar"
|
||||
},
|
||||
"contextMenu": {
|
||||
"addLast": "$t(player.addLast)",
|
||||
"addNext": "$t(player.addNext)",
|
||||
"addToFavorites": "$t(action.addToFavorites)",
|
||||
"addToPlaylist": "$t(action.addToPlaylist)",
|
||||
"createPlaylist": "$t(action.createPlaylist)",
|
||||
"deletePlaylist": "$t(action.deletePlaylist)",
|
||||
"deselectAll": "$t(action.deselectAll)",
|
||||
"download": "indir",
|
||||
"moveToNext": "$t(action.moveToNext)",
|
||||
"moveToBottom": "$t(action.moveToBottom)",
|
||||
"moveToTop": "$t(action.moveToTop)",
|
||||
"numberSelected": "{{count}} seçildi",
|
||||
"play": "$t(player.play)",
|
||||
"playSimilarSongs": "$t(player.playSimilarSongs)",
|
||||
"removeFromFavorites": "$t(action.removeFromFavorites)",
|
||||
"removeFromPlaylist": "$t(action.removeFromPlaylist)",
|
||||
"removeFromQueue": "$t(action.removeFromQueue)",
|
||||
"setRating": "$t(action.setRating)",
|
||||
"addFavorite": "$t(action.addToFavorites)",
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"shareItem": "öğeyi paylaş",
|
||||
"showDetails": "bilgi al"
|
||||
},
|
||||
"manageServers": {
|
||||
"url": "URL",
|
||||
"username": "kullanıcıadı",
|
||||
"editServerDetailsTooltip": "sunucu ayrıntılarını düzenle",
|
||||
"removeServer": "sunucuyu kaldır",
|
||||
"title": "sunucuları yönet",
|
||||
"serverDetails": "sunucu detayları"
|
||||
},
|
||||
"fullscreenPlayer": {
|
||||
"config": {
|
||||
"dynamicBackground": "dinamik arka plan",
|
||||
"dynamicImageBlur": "görüntü bulanıklık boyutu",
|
||||
"dynamicIsImage": "arka plan resmini etkinleştir",
|
||||
"followCurrentLyric": "şu anki şarkı sözlerini takip et",
|
||||
"lyricAlignment": "şarkı sözü hizalama",
|
||||
"lyricOffset": "şarkı sözü ofseti (ms)",
|
||||
"lyricGap": "şarkı sözü boşluğu",
|
||||
"lyricSize": "şarkı sözü boyutu",
|
||||
"opacity": "opaklık",
|
||||
"showLyricMatch": "şarkı sözü eşleşmesini göster",
|
||||
"showLyricProvider": "şarkı sözü sağlayıcısını göster",
|
||||
"synchronized": "eşitlenmiş",
|
||||
"unsynchronized": "eşitlenmemiş",
|
||||
"useImageAspectRatio": "görüntü en boy oranını kullanın"
|
||||
},
|
||||
"lyrics": "şarkı sözleri",
|
||||
"related": "i̇lgili",
|
||||
"upNext": "sıradaki",
|
||||
"visualizer": "görselleştirici",
|
||||
"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)"
|
||||
},
|
||||
"globalSearch": {
|
||||
"commands": {
|
||||
"goToPage": "sayfaya git",
|
||||
"searchFor": "{{query}} için ara",
|
||||
"serverCommands": "sunucu komutları"
|
||||
},
|
||||
"title": "komutlar"
|
||||
},
|
||||
"home": {
|
||||
"explore": "kütüphanenizden keşfedin",
|
||||
"mostPlayed": "en çok çalınan",
|
||||
"newlyAdded": "yeni eklenenler",
|
||||
"recentlyPlayed": "yakınlarda çalınanlar",
|
||||
"title": "$t(common.home)"
|
||||
},
|
||||
"itemDetail": {
|
||||
"copyPath": "yolu panoya kopyala",
|
||||
"copiedPath": "yol başarıyla kopyalandı",
|
||||
"openFile": "dosya yöneticisinde parçayı göster"
|
||||
},
|
||||
"playlist": {
|
||||
"reorder": "yeniden sıralama yalnızca kimliğe göre sıralama yapıldığında etkinleştirilir"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist_other)"
|
||||
},
|
||||
"setting": {
|
||||
"advanced": "gelişmiş",
|
||||
"generalTab": "genel",
|
||||
"hotkeysTab": "kısayol tuşları",
|
||||
"playbackTab": "oynatma",
|
||||
"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)",
|
||||
"home": "$t(common.home)",
|
||||
"myLibrary": "kütüphanem",
|
||||
"nowPlaying": "şimdi oynatılıyor",
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"search": "$t(common.search)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"shared": "paylaşılan $t(entity.playlist_other)",
|
||||
"tracks": "$t(entity.track_other)"
|
||||
},
|
||||
"trackList": {
|
||||
"artistTracks": "{{artist}} parçaları",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track_other)",
|
||||
"title": "$t(entity.track_other)"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "$t(entity.artist_one) 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)",
|
||||
"artistAlbums": "{{artist}} albümleri"
|
||||
},
|
||||
"appMenu": {
|
||||
"collapseSidebar": "kenar çubuğunu daralt",
|
||||
"expandSidebar": "kenar çubuğunu genişlet",
|
||||
"goBack": "geri dön",
|
||||
"goForward": "i̇leriye git",
|
||||
"manageServers": "sunucuları yönet",
|
||||
"openBrowserDevtools": "tarayıcı geliştirici araçlarını aç",
|
||||
"quit": "$t(common.quit)",
|
||||
"selectServer": "sunucu seç",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"version": "{{version}} sürümü"
|
||||
}
|
||||
},
|
||||
"player": {
|
||||
"addLast": "sona ekle",
|
||||
"addNext": "sonrakine ekle",
|
||||
"favorite": "favori",
|
||||
"mute": "sessiz",
|
||||
"muted": "sessiz",
|
||||
"next": "sonraki",
|
||||
"play": "çal",
|
||||
"playbackFetchCancel": "bu biraz zaman alıyor... iptal etmek için bildirimi kapatın",
|
||||
"playbackFetchInProgress": "şarkılar yükleniyor…",
|
||||
"playbackFetchNoResults": "hiçbir şarkı bulunamadı",
|
||||
"playbackSpeed": "oynatma hızı",
|
||||
"playRandom": "rastgele çal",
|
||||
"playSimilarSongs": "benzer şarkılar çal",
|
||||
"previous": "önceki",
|
||||
"queue_clear": "sırayı temizle",
|
||||
"queue_moveToBottom": "seçileni üste taşı",
|
||||
"queue_moveToTop": "seçileni alta taşı",
|
||||
"queue_remove": "seçileni kaldır",
|
||||
"repeat": "birini tekrarla",
|
||||
"repeat_all": "tümünü tekrarla",
|
||||
"repeat_off": "tekrarlama devre dışı",
|
||||
"shuffle": "karışık çal",
|
||||
"shuffle_off": "karışık çalmayı devre dışı bırak",
|
||||
"skip": "atla",
|
||||
"skip_back": "geriye atla",
|
||||
"skip_forward": "ileri atla",
|
||||
"stop": "durdur",
|
||||
"toggleFullscreenPlayer": "tam ekran oynatıcıya geç",
|
||||
"unfavorite": "favoriden kaldır",
|
||||
"pause": "durdur",
|
||||
"viewQueue": "kuyruğu görüntüle"
|
||||
},
|
||||
"setting": {
|
||||
"accentColor": "vurgu rengi",
|
||||
"accentColor_description": "uygulama için vurgu rengini ayarlar",
|
||||
"albumBackground": "albüm arka plan resmi",
|
||||
"albumBackground_description": "albüm resmini içeren albüm sayfaları için bir arka plan resmi ekler",
|
||||
"albumBackgroundBlur": "albüm arka plan resmi bulanıklaştırma boyutu",
|
||||
"albumBackgroundBlur_description": "albüm arka plan görüntüsüne uygulanan bulanıklık miktarını ayarlar",
|
||||
"applicationHotkeys": "uygulama kısayol tuşları",
|
||||
"applicationHotkeys_description": "uygulama kısayol tuşlarını yapılandırın. genel kısayol tuşu olarak ayarlamak için onay kutusunu değiştirin (yalnızca masaüstü)",
|
||||
"artistConfiguration": "albüm sanatçı sayfası yapılandırması",
|
||||
"artistConfiguration_description": "albüm sanatçısı sayfasında hangi öğelerin ve hangi sırayla gösterileceğini yapılandır",
|
||||
"audioDevice": "ses aygıtı",
|
||||
"audioDevice_description": "oynatma için kullanılacak ses cihazını seçin (yalnızca web oynatıcı)",
|
||||
"audioExclusiveMode": "ses özel modu",
|
||||
"audioExclusiveMode_description": "özel çıkış modunu etkinleştirin. Bu modda, sistem genellikle kilitlenir ve yalnızca mpv ses çıkışı yapabilir",
|
||||
"audioPlayer": "ses oynatıcı",
|
||||
"audioPlayer_description": "oynatma için kullanılacak ses oynatıcısını seçin",
|
||||
"buttonSize": "oynatma çubuğu düğme boyutu",
|
||||
"buttonSize_description": "oynatma çubuğu düğmelerinin boyutu",
|
||||
"clearCache": "tarayıcı önbelleğini temizle",
|
||||
"clearCache_description": "feishin'in 'zor temizliği'. feishin'in önbelleğini temizlemeye ek olarak, tarayıcı önbelleğini de boşaltın (kayıtlı resimler ve diğer varlıklar). sunucu kimlik bilgileri ve ayarları korunur",
|
||||
"clearQueryCache": "feishin önbelleğini temizle",
|
||||
"clearQueryCache_description": "feishin'in 'yumuşak temizliği'. bu işlem çalma listelerini, parça meta verilerini yeniler ve kayıtlı şarkı sözlerini sıfırlar. ayarlar, sunucu kimlik bilgileri ve önbelleğe alınmış görüntüler korunur",
|
||||
"clearCacheSuccess": "önbellek başarıyla temizlendi",
|
||||
"contextMenu": "içerik menüsü (sağ tıklama) yapılandırması",
|
||||
"contextMenu_description": "bir öğeye sağ tıkladığınızda menüde gösterilen öğeleri gizlemenizi sağlar. işaretli olmayan öğeler gizlenecektir",
|
||||
"crossfadeDuration": "çapraz geçiş süresi",
|
||||
"crossfadeDuration_description": "çapraz geçiş efektinin süresini ayarlar",
|
||||
"crossfadeStyle": "çapraz geçiş stili",
|
||||
"crossfadeStyle_description": "ses oynatıcı için kullanılacak çapraz geçiş stilini seçin",
|
||||
"customCssEnable": "özel css etkinleştir",
|
||||
"customCssEnable_description": "özel css yazmaya izin verir.",
|
||||
"customCssNotice": "Uyarı: bazı sterillemeler (url() ve içeriğe izin verilmemesi) olsa da, özel CSS kullanmak arayüzü değiştirmede hala risk oluşturabilir.",
|
||||
"customCss": "özel css",
|
||||
"customCss_description": "özel css içeriği. Not: içerik ve uzaktan URL'ler izin verilmeyen özelliklerdir. İçeriğinizin önizlemesi aşağıda gösterilmektedir. Ayarlamadığınız ek alanlar sterilleme nedeniyle mevcuttur.",
|
||||
"customFontPath": "özel yazı tipi yolu",
|
||||
"customFontPath_description": "uygulama için kullanılacak özel yazı tipinin yolunu ayarlar",
|
||||
"disableAutomaticUpdates": "otomatik güncellemeleri devre dışı bırak",
|
||||
"disableLibraryUpdateOnStartup": "başlangıçta yeni sürümler için denetimi devre dışı bırak",
|
||||
"discordApplicationId": "{{discord}} uygulama kimliği",
|
||||
"discordApplicationId_description": "{{discord}} \"Rich Presence\" için uygulama kimliği (varsayılan olarak {{defaultId}})",
|
||||
"discordPausedStatus": "duraklatıldığında \"Rich Presence\"da göster",
|
||||
"discordPausedStatus_description": "etkinleştirildiğinde, oynatıcı duraklatıldığında durum gösterilir",
|
||||
"discordIdleStatus": "\"Rich presence\" boşta durumunu göster",
|
||||
"discordIdleStatus_description": "etkinleştirildiğinde, oynatıcı boştayken durumu günceller",
|
||||
"discordListening": "durumu dinleme olarak göster",
|
||||
"discordListening_description": "durumu çalma yerine dinleme olarak göster",
|
||||
"discordRichPresence": "{{discord}} Rich Presence",
|
||||
"discordRichPresence_description": "{{discord}} \"Rich Presence\" oynatma durumunu etkinleştirin. Görüntü tuşları şunlardır: {{icon}}, {{playing}} ve {{paused}}",
|
||||
"discordServeImage": "sunucudan {{discord}} resimleri servis et",
|
||||
"discordServeImage_description": "sunucudan {{discord}} Rich Presence için kapak resmi paylaşın, yalnızca jellyfin ve navidrome için kullanılabilir",
|
||||
"discordUpdateInterval": "{{discord}} Rich Presence güncelleme aralığı",
|
||||
"discordUpdateInterval_description": "her güncelleme arasındaki saniye cinsinden süre (minimum 15 saniye)",
|
||||
"doubleClickBehavior": "çift tıklandığında aranan tüm parçaları sıraya koyma",
|
||||
"gaplessAudio": "aralıksız ses",
|
||||
"gaplessAudio_description": "mpv için aralıksız ses ayarını belirler",
|
||||
"gaplessAudio_optionWeak": "zayıf (tavsiye edilen)",
|
||||
"genreBehavior": "tür sayfası varsayılan davranışı",
|
||||
"genreBehavior_description": "bir türe tıklandığında varsayılan olarak parça mı yoksa albüm listesinde mi açılacağını belirler",
|
||||
"globalMediaHotkeys": "evrensel medya kısayol tuşları",
|
||||
"globalMediaHotkeys_description": "oynatmayı kontrol etmek için sistem medya kısayol tuşlarınızın kullanımını etkinleştirin veya devre dışı bırakın",
|
||||
"homeConfiguration": "ana sayfa yapılandırma",
|
||||
"homeConfiguration_description": "ana sayfada hangi öğelerin ve hangi sırayla gösterileceğini yapılandır",
|
||||
"homeFeature": "ana sayfa öne çıkan görselleri",
|
||||
"homeFeature_description": "ana sayfada büyük özellikli görsellerin gösterilip gösterilmeyeceğini kontrol eder",
|
||||
"hotkey_rate0": "derecelendirme temizle",
|
||||
"hotkey_rate1": "derecelendirme 1 yıldız",
|
||||
"hotkey_rate2": "derecelendirme 2 yıldız",
|
||||
"hotkey_rate3": "derecelendirme 3 yıldız",
|
||||
"hotkey_rate4": "derecelendirme 4 yıldız",
|
||||
"hotkey_rate5": "derecelendirme 5 yıldız",
|
||||
"hotkey_skipBackward": "geri atla",
|
||||
"hotkey_skipForward": "ileri atla",
|
||||
"hotkey_toggleCurrentSongFavorite": "$t(common.currentSong) beğenilenlere ekle",
|
||||
"hotkey_toggleFullScreenPlayer": "tam ekran oynatıcı tuşu",
|
||||
"hotkey_togglePreviousSongFavorite": "$t(common.previousSong) beğenilenlere ekle",
|
||||
"hotkey_toggleQueue": "kuyruğu aç",
|
||||
"hotkey_toggleRepeat": "tekrarlamayı aç",
|
||||
"hotkey_toggleShuffle": "karıştırmayı değiştir",
|
||||
"hotkey_unfavoriteCurrentSong": "$t(common.currentSong) beğenilerden kaldır",
|
||||
"hotkey_unfavoritePreviousSong": "$t(common.previousSong) beğenilerden kaldır",
|
||||
"hotkey_volumeDown": "ses kısma",
|
||||
"hotkey_volumeMute": "sessize alma",
|
||||
"hotkey_volumeUp": "sesi yükselt",
|
||||
"hotkey_zoomIn": "yakınlaştır",
|
||||
"hotkey_zoomOut": "uzaklaştır",
|
||||
"imageAspectRatio": "doğal kapak resmi en boy oranını kullanın",
|
||||
"imageAspectRatio_description": "etkinleştirilirse, kapak resmi kendi doğal en boy oranı kullanılarak gösterilecektir. 1:1 olmayan resimler için kalan alan boş olacaktır",
|
||||
"language": "dil",
|
||||
"language_description": "uygulama için dili ayarlar ($t(common.restartRequired))",
|
||||
"lastfm": "last.fm bağlantılarını göster",
|
||||
"lastfm_description": "sanatçı/albüm sayfalarında last.fm bağlantılarını göster",
|
||||
"lastfmApiKey": "{{lastfm}} API anahtarı",
|
||||
"lastfmApiKey_description": "{{lastfm}} için API anahtarı. kapak resmi için gereklidir",
|
||||
"lyricFetch": "internetten şarkı sözü getirme",
|
||||
"lyricFetch_description": "çeşitli internet kaynaklarından şarkı sözleri getirme",
|
||||
"lyricFetchProvider": "şarkı sözlerini almak için sağlayıcılar",
|
||||
"lyricFetchProvider_description": "şarkı sözlerinin getirileceği sağlayıcıları seçin. sağlayıcıların sırası, sorgulanacakları sıradır",
|
||||
"lyricOffset": "şarkı sözü kaydırma (ms)",
|
||||
"lyricOffset_description": "şarkı sözünü belirtilen milisaniye miktarı kadar kaydırır",
|
||||
"notify": "şarkı bildirimlerini etkinleştir",
|
||||
"notify_description": "geçerli şarkıyı değiştirirken bildirimleri göster",
|
||||
"minimizeToTray": "tepsiye yerleştir",
|
||||
"minimizeToTray_description": "uygulamayı sistem tepsisine küçültme",
|
||||
"minimumScrobblePercentage": "minimum \"scrobble\" (dinleme sayımı) süresi (yüzde)",
|
||||
"minimumScrobblePercentage_description": "'scrobble' yapılmadan önce çalınması gereken minimum şarkı yüzdesi",
|
||||
"minimumScrobbleSeconds": "minimum 'scrobble' (saniye)",
|
||||
"minimumScrobbleSeconds_description": "'scrobble' yapılmadan önce çalınması gereken şarkının saniye cinsinden minimum süresi",
|
||||
"mpvExecutablePath": "mpv çalıştırma yolu",
|
||||
"mpvExecutablePath_description": "mpv çalıştırma yolunu ayarlar. boş bırakılırsa, varsayılan yol kullanılır",
|
||||
"mpvExtraParameters": "mpv parametreleri",
|
||||
"mpvExtraParameters_help": "her satır için tek",
|
||||
"musicbrainz": "musicbrainz bağlantılarını göster",
|
||||
"musicbrainz_description": "mbid'in bulunduğu sanatçı/albüm sayfalarında musicbrainz bağlantılarını göster",
|
||||
"neteaseTranslation": "NetEase çevirilerini etkinleştirin",
|
||||
"neteaseTranslation_description": "etkinleştirildiğinde, varsa NetEase platformunda çevrilmiş şarkı sözlerini alır ve görüntüler.",
|
||||
"passwordStore": "passwords/secret store",
|
||||
"passwordStore_description": "hangi parola/gizli deponun kullanılacağıdır. parolaları saklama konusunda sorun yaşıyorsanız bunu değiştirin.",
|
||||
"playbackStyle": "oynatma stili",
|
||||
"playbackStyle_description": "ses oynatıcı için kullanılacak oynatma stilini seçin",
|
||||
"playbackStyle_optionCrossFade": "çapraz geçiş",
|
||||
"playbackStyle_optionNormal": "normal",
|
||||
"playButtonBehavior": "oynat düğmesi davranışı",
|
||||
"playButtonBehavior_description": "kuyruğa şarkı eklerken oynat düğmesinin varsayılan davranışını ayarlar",
|
||||
"playButtonBehavior_optionAddLast": "$t(player.addLast)",
|
||||
"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",
|
||||
"remotePassword_description": "uzaktan kumanda sunucusu için parolayı ayarlar. Bu kimlik bilgileri varsayılan olarak güvensiz bir şekilde aktarılır, bu nedenle önemsemediğiniz benzersiz bir parola kullanmalısınız",
|
||||
"remotePort": "uzaktan kontrol sunucusu bağlantı noktası",
|
||||
"remotePort_description": "uzaktan kumanda sunucusu için bağlantı noktasını ayarlar",
|
||||
"remoteUsername": "uzaktan kontrol sunucusu kullanıcı adı",
|
||||
"remoteUsername_description": "uzaktan kontrol sunucusu için kullanıcı adını ayarlar. hem kullanıcı adı hem de parola boşsa, kimlik doğrulama devre dışı bırakılır",
|
||||
"replayGainClipping": "{{ReplayGain}} kırpma",
|
||||
"replayGainClipping_description": "Kazancı otomatik olarak düşürerek {{ReplayGain}}'in neden olduğu kırpılmayı önleyin",
|
||||
"replayGainFallback": "{{ReplayGain}} geri dönüş",
|
||||
"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_optionNone": "$t(common.none)",
|
||||
"replayGainMode_optionTrack": "$t(entity.track_one)",
|
||||
"replayGainPreamp": "{{ReplayGain}} preamp (dB)",
|
||||
"replayGainPreamp_description": "{{ReplayGain}} değerlerine uygulanan preamp kazancını ayarlar",
|
||||
"sampleRate": "örnekleme hızı",
|
||||
"sampleRate_description": "seçilen örnekleme frekansı mevcut ortamınkinden farklıysa kullanılacak çıkış örnekleme oranını seçin. 8000'den küçük değerler için varsayılan frekans kullanacaktır",
|
||||
"savePlayQueue": "oynatma kuyruğunu kaydet",
|
||||
"savePlayQueue_description": "uygulama kapatıldığında oynatma kuyruğunu kaydedin ve uygulama açıldığında geri yükleyin",
|
||||
"scrobble": "scrobble",
|
||||
"scrobble_description": "scrobble medya sunucunuzda oynatılır",
|
||||
"showSkipButton": "atlama düğmelerini göster",
|
||||
"showSkipButton_description": "oynatıcı çubuğundaki atlama düğmelerini göster veya gizle",
|
||||
"showSkipButtons": "atlama düğmelerini göster",
|
||||
"showSkipButtons_description": "oynatıcı çubuğundaki atlama düğmelerini göster veya gizle",
|
||||
"sidebarCollapsedNavigation": "kenar çubuğu (daraltılmış) navigasyon",
|
||||
"sidebarCollapsedNavigation_description": "daraltılmış kenar çubuğunda gezinmeyi göster veya gizle",
|
||||
"sidebarConfiguration": "kenar çubuğu yapılandırması",
|
||||
"sidebarConfiguration_description": "öğeleri ve bunların kenar çubuğunda görünme sırasını seçme",
|
||||
"sidebarPlaylistList": "kenar çubuğu çalma listesi",
|
||||
"sidebarPlaylistList_description": "kenar çubuğunda çalma listesi listesini gösterme veya gizleme",
|
||||
"sidePlayQueueStyle": "yan oynatma kuyruğu stili",
|
||||
"sidePlayQueueStyle_description": "yan oynatma kuyruğunun stilini ayarlar",
|
||||
"sidePlayQueueStyle_optionAttached": "ekli",
|
||||
"sidePlayQueueStyle_optionDetached": "ayrılmış",
|
||||
"skipDuration": "atlama süresi",
|
||||
"skipDuration_description": "oynatıcı çubuğundaki atlama düğmeleri kullanılırken atlanacak süreyi ayarlar",
|
||||
"translationApiKey_description": "çeviri için api anahtarı (Yalnızca global hizmet uç noktasını destekler)",
|
||||
"translationTargetLanguage": "çeviri hedef dili",
|
||||
"translationTargetLanguage_description": "çeviri için hedef dil",
|
||||
"trayEnabled": "tepsiyi göster",
|
||||
"trayEnabled_description": "tepsi simgesini/menüsünü göster/gizle. devre dışı bırakılırsa, tepsiye küçültme/çıkış da devre dışı bırakır",
|
||||
"useSystemTheme": "sistem temasını kullan",
|
||||
"useSystemTheme_description": "sistem tarafından tanımlanan açık veya koyu mod tercihini takip et",
|
||||
"volumeWheelStep": "ses tekerleği adımı",
|
||||
"volumeWheelStep_description": "ses seviyesi kaydırıcısı üzerinde fare tekerleğini kaydırırken değiştirilecek ses seviyesi miktarı",
|
||||
"volumeWidth": "ses kaydırıcı genişliği",
|
||||
"volumeWidth_description": "ses seviyesi kaydırıcısının genişliği",
|
||||
"webAudio": "ağ sesini kullanın",
|
||||
"webAudio_description": "ağ sesi kullanın. bu, replaygain gibi gelişmiş özellikleri etkinleştirir. aksi bir durumla karşılaşırsanız devre dışı bırakın",
|
||||
"preservePitch": "perdeyi koru",
|
||||
"preservePitch_description": "oynatma hızını değiştirirken perdeyi korur",
|
||||
"windowBarStyle": "pencere çubuğu stili",
|
||||
"windowBarStyle_description": "pencere çubuğunun stilini seçin",
|
||||
"zoom": "yakınlaştırma yüzdesi",
|
||||
"zoom_description": "uygulama için yakınlaştırma yüzdesini ayarlar",
|
||||
"doubleClickBehavior_description": "evet ise, bir parça aramasında eşleşen tüm parçalar sıraya alınır. aksi takdirde, yalnızca tıklanan parça sıraya alınır",
|
||||
"enableRemote": "uzaktan kontrol sunucusunu etkinleştir",
|
||||
"enableRemote_description": "uzaktan kumanda sunucusunun diğer cihazların uygulamayı kontrol etmesine izin vermesini sağlar",
|
||||
"externalLinks": "harici bağlantıları göster",
|
||||
"externalLinks_description": "sanatçı/albüm sayfalarında dış bağlantıların (Last.fm, MusicBrainz) gösterilmesini sağlar",
|
||||
"exitToTray": "tepsiye çıkış",
|
||||
"exitToTray_description": "uygulamadan sistem tepsisine çıkma",
|
||||
"floatingQueueArea": "kayan liste üzerine gelinen alanı göster",
|
||||
"floatingQueueArea_description": "oynatma kuyruğunu görüntülemek için ekranın sağ tarafında fareyle üzerine gelinen bir simge görüntüleyin",
|
||||
"followLyric": "güncel şarkı sözlerini takip et",
|
||||
"followLyric_description": "şarkı sözünü geçerli çalma konumuna kaydırma",
|
||||
"preferLocalLyrics": "yerel sözleri tercih edin",
|
||||
"preferLocalLyrics_description": "mümkün olduğunda uzak (remote) şarkı sözleri yerine yerel olarak depolanan şarkı sözlerini tercih edin",
|
||||
"font": "font",
|
||||
"font_description": "uygulama için kullanılacak yazı tipini ayarlar",
|
||||
"fontType": "yazı tipi",
|
||||
"fontType_description": "yerleşik yazı tipi Feishin tarafından sağlanan yazı tiplerinden birini seçer. sistem yazı tipi işletim sisteminiz tarafından sağlanan herhangi bir yazı tipini seçmenize izin verir. özel kendi yazı tipinizi sağlamanıza izin verir",
|
||||
"fontType_optionBuiltIn": "yerleşik yazı tipi",
|
||||
"fontType_optionCustom": "özel yazı tipi",
|
||||
"fontType_optionSystem": "sistem yazı tipi",
|
||||
"hotkey_browserBack": "tarayıcı geri",
|
||||
"hotkey_browserForward": "tarayıcı ileri",
|
||||
"hotkey_favoriteCurrentSong": "$t(common.currentSong) favorilere ekle",
|
||||
"hotkey_favoritePreviousSong": "$t(common.previousSong) favorilere ekle",
|
||||
"hotkey_globalSearch": "genel arama",
|
||||
"hotkey_localSearch": "sayfa içi arama",
|
||||
"hotkey_playbackNext": "sonraki parça",
|
||||
"hotkey_playbackPause": "durdur",
|
||||
"hotkey_playbackPlay": "çal",
|
||||
"hotkey_playbackPlayPause": "çal / duraklat",
|
||||
"translationApiKey": "çeviri api anahtarı",
|
||||
"translationApiProvider_description": "çeviri için api sağlayıcısı",
|
||||
"translationApiProvider": "çeviri api sağlayıcısı",
|
||||
"transcodeFormat_description": "dönüştürülecek formatı seçer. sunucunun karar vermesi için boş bırakın",
|
||||
"transcodeFormat": "dönüştürülecek format",
|
||||
"transcodeBitrate_description": "kod dönüştürmek için bit hızını seçer. 0, sunucunun seçmesine izin ver anlamına gelir",
|
||||
"transcodeBitrate": "kod dönüştürmek için bit hızı",
|
||||
"transcode_description": "farklı formatlara kod dönüştürme sağlar",
|
||||
"hotkey_playbackStop": "dur",
|
||||
"hotkey_playbackPrevious": "önceki parça",
|
||||
"skipPlaylistPage": "çalma listesi sayfasını atla",
|
||||
"skipPlaylistPage_description": "bir çalma listesine giderken, varsayılan sayfa yerine çalma listesi şarkı listesi sayfasına gitme",
|
||||
"startMinimized": "küçültülmüş olarak başlat",
|
||||
"startMinimized_description": "uygulamayı sistem tepsisinde başlat",
|
||||
"theme": "tema",
|
||||
"theme_description": "uygulama için kullanılacak temayı ayarlar",
|
||||
"themeDark": "tema (koyu)",
|
||||
"themeDark_description": "uygulama için kullanılacak koyu temayı ayarlar",
|
||||
"themeLight": "tema (açık)",
|
||||
"themeLight_description": "uygulama için kullanılacak açık temayı ayarlar",
|
||||
"transcodeNote": "1 (web) - 2 (mpv) şarkıdan sonra etkili olur",
|
||||
"transcode": "kod dönüştürmeyi etkinleştir"
|
||||
},
|
||||
"table": {
|
||||
"column": {
|
||||
"album": "albüm",
|
||||
"albumArtist": "albüm sanatçısı",
|
||||
"albumCount": "$t(entity.album_other)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"biography": "biyografi",
|
||||
"bitrate": "bit hızı",
|
||||
"bpm": "bpm (dakika başına vuruş)",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"codec": "$t(common.codec)",
|
||||
"comment": "yorum",
|
||||
"dateAdded": "tarih eklendi",
|
||||
"discNumber": "disk",
|
||||
"favorite": "favori",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"lastPlayed": "son çalınan",
|
||||
"path": "yol",
|
||||
"playCount": "oynatılıyor",
|
||||
"rating": "derecelendirme",
|
||||
"releaseDate": "çıkış tarihi",
|
||||
"releaseYear": "yıl",
|
||||
"size": "$t(common.size)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"title": "başlık",
|
||||
"trackNumber": "parça"
|
||||
},
|
||||
"config": {
|
||||
"general": {
|
||||
"autoFitColumns": "sütunları otomatik sığdır",
|
||||
"followCurrentSong": "güncel şarkıyı takip et",
|
||||
"displayType": "görüntüleme türü",
|
||||
"gap": "$t(common.gap)",
|
||||
"itemGap": "öğe boşluğu (px)",
|
||||
"itemSize": "öğe boyutu (px)",
|
||||
"size": "$t(common.size)",
|
||||
"tableColumns": "tablo sütunları"
|
||||
},
|
||||
"label": {
|
||||
"actions": "$t(common.action_other)",
|
||||
"album": "$t(entity.album_one)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"biography": "$t(common.biography)",
|
||||
"bitrate": "$t(common.bitrate)",
|
||||
"bpm": "$t(common.bpm)",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"codec": "$t(common.codec)",
|
||||
"dateAdded": "tarih eklendi",
|
||||
"discNumber": "disk numarası",
|
||||
"duration": "$t(common.duration)",
|
||||
"favorite": "$t(common.favorite)",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"lastPlayed": "son çalınan",
|
||||
"note": "$t(common.note)",
|
||||
"owner": "$t(common.owner)",
|
||||
"path": "$t(common.path)",
|
||||
"playCount": "çalma sayısı",
|
||||
"rating": "$t(common.rating)",
|
||||
"releaseDate": "çıkış tarihi",
|
||||
"rowIndex": "satır indeksi",
|
||||
"size": "$t(common.size)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"title": "$t(common.title)",
|
||||
"titleCombined": "$t(common.title) (birleşik)",
|
||||
"trackNumber": "parça numarası",
|
||||
"year": "$t(common.year)"
|
||||
},
|
||||
"view": {
|
||||
"card": "kart",
|
||||
"grid": "ızgara",
|
||||
"list": "liste",
|
||||
"poster": "poster",
|
||||
"table": "tablo"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -111,7 +111,11 @@
|
||||
"preview": "预览",
|
||||
"translation": "翻译",
|
||||
"additionalParticipants": "其他参与者",
|
||||
"tags": "标签"
|
||||
"tags": "标签",
|
||||
"viewReleaseNotes": "查看发行说明",
|
||||
"newVersion": "已安装新版本 ({{version}})",
|
||||
"bitDepth": "位深度",
|
||||
"sampleRate": "采样率"
|
||||
},
|
||||
"entity": {
|
||||
"albumArtist_other": "专辑艺术家",
|
||||
@@ -323,7 +327,7 @@
|
||||
"discordUpdateInterval": "{{discord}} rich presence 更新间隔",
|
||||
"discordApplicationId_description": "{{discord}} rich presence 应用 id(默认为 {{defaultId}})",
|
||||
"discordUpdateInterval_description": "更新间隔秒数(至少 15 秒)",
|
||||
"discordRichPresence_description": "在 {{discord}} rich presence 中显示播放状态。图片键为:{{icon}}、{{playing}} 和 {{paused}} ",
|
||||
"discordRichPresence_description": "在 {{discord}} rich presence 中显示播放状态。图片键为:{{icon}}、{{playing}} 和 {{paused}}",
|
||||
"accentColor": "强调色",
|
||||
"accentColor_description": "设置应用的强调色",
|
||||
"replayGainPreamp_description": "调整应用在{{ReplayGain}}值上的前置放大增益",
|
||||
@@ -399,7 +403,22 @@
|
||||
"musicbrainz": "显示 musicbrainz 链接",
|
||||
"musicbrainz_description": "在 mbid 的艺术家/专辑页面上显示 musicbrainz 的链接",
|
||||
"lastfm": "显示 last.fm 链接",
|
||||
"lastfm_description": "在艺术家/专辑页面上显示 last.fm 的链接"
|
||||
"lastfm_description": "在艺术家/专辑页面上显示 last.fm 的链接",
|
||||
"preferLocalLyrics_description": "优先选择本地歌词(如有),而不是远程歌词",
|
||||
"preferLocalLyrics": "首选本地歌词",
|
||||
"discordPausedStatus": "暂停时显示rich presence",
|
||||
"discordPausedStatus_description": "启用后将在播放器暂停时显示状态",
|
||||
"preservePitch": "保持音高",
|
||||
"preservePitch_description": "在调整播放速度时保持音高",
|
||||
"notify": "启用歌曲通知",
|
||||
"notify_description": "更改当前歌曲时显示通知",
|
||||
"discordDisplayType": "{{discord}} 存在显示类型",
|
||||
"discordDisplayType_description": "改变您在状态中收听的内容",
|
||||
"discordDisplayType_songname": "歌曲名称",
|
||||
"discordDisplayType_artistname": "艺术家名称",
|
||||
"hotkey_navigateHome": "导航到主页",
|
||||
"preventSleepOnPlayback": "防止播放时进入睡眠状态",
|
||||
"preventSleepOnPlayback_description": "播放音乐时防止显示器进入睡眠状态"
|
||||
},
|
||||
"error": {
|
||||
"remotePortWarning": "重启服务器使新端口生效",
|
||||
@@ -424,7 +443,8 @@
|
||||
"badAlbum": "您看到此页面是因为这首歌不是专辑的一部分。如果您的音乐文件夹顶层有一首歌曲,您很可能会遇到此问题。jellyfin 仅对位于文件夹中的曲目进行分组。",
|
||||
"networkError": "发生网络错误",
|
||||
"openError": "无法打开文件",
|
||||
"badValue": "无效的选项 \"{{value}}\". 此值不再存在"
|
||||
"badValue": "无效的选项 \"{{value}}\". 此值不再存在",
|
||||
"notificationDenied": "通知权限被拒绝。此设置无效"
|
||||
},
|
||||
"filter": {
|
||||
"mostPlayed": "最多播放过",
|
||||
@@ -483,7 +503,8 @@
|
||||
"home": "$t(common.home)",
|
||||
"artists": "$t(entity.artist_other)",
|
||||
"albumArtists": "$t(entity.albumArtist_other)",
|
||||
"shared": "共享$t(entity.playlist_other)"
|
||||
"shared": "共享$t(entity.playlist_other)",
|
||||
"myLibrary": "我的媒体库"
|
||||
},
|
||||
"fullscreenPlayer": {
|
||||
"config": {
|
||||
@@ -518,7 +539,9 @@
|
||||
"goBack": "返回",
|
||||
"goForward": "前进",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"quit": "$t(common.quit)"
|
||||
"quit": "$t(common.quit)",
|
||||
"privateModeOff": "关闭私人模式",
|
||||
"privateModeOn": "开启私人模式"
|
||||
},
|
||||
"home": {
|
||||
"mostPlayed": "最多播放",
|
||||
@@ -569,7 +592,9 @@
|
||||
"playSimilarSongs": "$t(player.playSimilarSongs)",
|
||||
"download": "下载",
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"moveToNext": "$t(action.moveToNext)"
|
||||
"moveToNext": "$t(action.moveToNext)",
|
||||
"goToAlbum": "转到 $t(entity.album_one)",
|
||||
"goToAlbumArtist": "转到 $t(entity.albumArtist_one)"
|
||||
},
|
||||
"trackList": {
|
||||
"title": "$t(entity.track_other)",
|
||||
@@ -659,7 +684,8 @@
|
||||
},
|
||||
"queryEditor": {
|
||||
"input_optionMatchAll": "匹配全部",
|
||||
"input_optionMatchAny": "匹配任何"
|
||||
"input_optionMatchAny": "匹配任何",
|
||||
"title": "查询编辑器"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"title": "编辑$t(entity.playlist_one)",
|
||||
@@ -678,6 +704,11 @@
|
||||
"description": "描述",
|
||||
"setExpiration": "设置过期时间",
|
||||
"success": "共享链接已复制到剪贴板(或单击此处打开)"
|
||||
},
|
||||
"privateMode": {
|
||||
"enabled": "启用私人模式,播放状态现在对外部集成隐藏",
|
||||
"disabled": "私人模式已禁用,播放状态现在对启用的外部集成可见",
|
||||
"title": "私人模式"
|
||||
}
|
||||
},
|
||||
"table": {
|
||||
@@ -695,7 +726,9 @@
|
||||
"view": {
|
||||
"table": "表格",
|
||||
"poster": "海报",
|
||||
"card": "卡片"
|
||||
"card": "卡片",
|
||||
"grid": "网格",
|
||||
"list": "列表"
|
||||
},
|
||||
"label": {
|
||||
"releaseDate": "发布日期",
|
||||
|
||||
+388
-214
@@ -2,24 +2,24 @@
|
||||
"common": {
|
||||
"backward": "返回",
|
||||
"biography": "簡介",
|
||||
"bitrate": "比特率",
|
||||
"bitrate": "位元率",
|
||||
"bpm": "bpm",
|
||||
"clear": "清空",
|
||||
"collapse": "折疊",
|
||||
"comingSoon": "即將上線…",
|
||||
"comingSoon": "即將推出…",
|
||||
"confirm": "確認",
|
||||
"decrease": "降低",
|
||||
"delete": "刪除",
|
||||
"descending": "降序",
|
||||
"descending": "降冪",
|
||||
"description": "描述",
|
||||
"forceRestartRequired": "重啓應用使更改生效…關閉通知即可重啓",
|
||||
"menu": "菜單",
|
||||
"forceRestartRequired": "重新啟動應用程式使更改生效…關閉通知即可重啟",
|
||||
"menu": "選單",
|
||||
"action_other": "操作",
|
||||
"add": "添加",
|
||||
"areYouSure": "是否繼續?",
|
||||
"ascending": "升序",
|
||||
"add": "新增",
|
||||
"areYouSure": "你確定嗎?",
|
||||
"ascending": "升冪",
|
||||
"disable": "禁用",
|
||||
"disc": "盤",
|
||||
"disc": "光碟",
|
||||
"dismiss": "忽略",
|
||||
"duration": "時長",
|
||||
"edit": "編輯",
|
||||
@@ -30,7 +30,7 @@
|
||||
"filters": "篩選",
|
||||
"forward": "前進",
|
||||
"gap": "空隙",
|
||||
"home": "主頁",
|
||||
"home": "首頁",
|
||||
"increase": "增高",
|
||||
"left": "左",
|
||||
"limit": "限制",
|
||||
@@ -39,20 +39,20 @@
|
||||
"ok": "好",
|
||||
"owner": "所有者",
|
||||
"path": "路徑",
|
||||
"playerMustBePaused": "播放器須被暫停",
|
||||
"previousSong": "上壹首$t(entity.track_one)",
|
||||
"playerMustBePaused": "播放器必須被暫停",
|
||||
"previousSong": "上一首$t(entity.track_one)",
|
||||
"quit": "退出",
|
||||
"random": "隨機",
|
||||
"rating": "評分",
|
||||
"refresh": "刷新",
|
||||
"refresh": "重新整理",
|
||||
"reset": "重置",
|
||||
"resetToDefault": "重置爲默認",
|
||||
"restartRequired": "需要重啓應用",
|
||||
"resetToDefault": "恢復為預設值",
|
||||
"restartRequired": "需要重新啟動應用程式",
|
||||
"right": "右",
|
||||
"save": "保存",
|
||||
"saveAndReplace": "保存並替換",
|
||||
"saveAs": "保存爲",
|
||||
"search": "搜索",
|
||||
"save": "儲存",
|
||||
"saveAndReplace": "儲存並取代",
|
||||
"saveAs": "儲存為",
|
||||
"search": "搜尋",
|
||||
"sortOrder": "順序",
|
||||
"title": "標題",
|
||||
"trackNumber": "音軌編號",
|
||||
@@ -63,38 +63,61 @@
|
||||
"yes": "是",
|
||||
"cancel": "取消",
|
||||
"center": "中央",
|
||||
"channel_other": "頻道",
|
||||
"channel_other": "聲道",
|
||||
"configure": "配置",
|
||||
"create": "創建",
|
||||
"currentSong": "當前$t(entity.track_one)",
|
||||
"currentSong": "目前$t(entity.track_one)",
|
||||
"minimize": "最小化",
|
||||
"modified": "已修改",
|
||||
"name": "名稱",
|
||||
"no": "否",
|
||||
"none": "無",
|
||||
"noResultsFromQuery": "未查詢到匹配結果",
|
||||
"note": "注釋"
|
||||
"note": "注釋",
|
||||
"additionalParticipants": "額外參與者",
|
||||
"newVersion": "已安裝新版本 ({{version}})",
|
||||
"viewReleaseNotes": "查看發行註記",
|
||||
"albumGain": "專輯增益",
|
||||
"albumPeak": "專輯peak",
|
||||
"bitDepth": "位元深度",
|
||||
"close": "關閉",
|
||||
"codec": "編碼",
|
||||
"mbid": "MusicBrainz ID",
|
||||
"preview": "預覽",
|
||||
"reload": "重新載入",
|
||||
"sampleRate": "取樣率",
|
||||
"setting": "設定",
|
||||
"share": "分享",
|
||||
"tags": "標籤",
|
||||
"trackGain": "曲目增益",
|
||||
"trackPeak": "歌曲峰值",
|
||||
"translation": "翻譯"
|
||||
},
|
||||
"error": {
|
||||
"endpointNotImplementedError": "{{serverType}} 尚未實現端點 {{endpoint}}",
|
||||
"apiRouteError": "請求失敗:無法路由",
|
||||
"audioDeviceFetchError": "無法獲取音頻設備",
|
||||
"authenticationFailed": "認證失敗",
|
||||
"audioDeviceFetchError": "無法取得音訊設備",
|
||||
"authenticationFailed": "驗證失敗",
|
||||
"credentialsRequired": "需要憑證",
|
||||
"genericError": "發生了錯誤",
|
||||
"invalidServer": "無效的服務器",
|
||||
"localFontAccessDenied": "無法獲取本地字體",
|
||||
"localFontAccessDenied": "無法取得本地字體",
|
||||
"loginRateError": "登錄請求嘗試次數過多,請稍後再試",
|
||||
"remoteDisableError": "$t(common.disable)遠程服務器時出現錯誤",
|
||||
"remoteEnableError": "$t(common.enable)遠程服務器時出現錯誤",
|
||||
"remotePortError": "設置遠程服務器端口時發生錯誤",
|
||||
"remotePortWarning": "重啓服務器使新端口生效",
|
||||
"serverRequired": "需要服務器",
|
||||
"sessionExpiredError": "會話已過期",
|
||||
"systemFontError": "獲取系統字體時出現錯誤",
|
||||
"serverNotSelectedError": "未選擇服務器",
|
||||
"remoteDisableError": "$t(common.disable)遠端伺服器時出現錯誤",
|
||||
"remoteEnableError": "$t(common.enable)遠端伺服器時出現錯誤",
|
||||
"remotePortError": "設定遠端伺服器端口時發生錯誤",
|
||||
"remotePortWarning": "重啟伺服器使新端口生效",
|
||||
"serverRequired": "需要伺服器",
|
||||
"sessionExpiredError": "工作階段已過期",
|
||||
"systemFontError": "嘗試取得系統字體時出現錯誤",
|
||||
"serverNotSelectedError": "未選擇伺服器",
|
||||
"mpvRequired": "需要 MPV",
|
||||
"playbackError": "無法播放媒體"
|
||||
"playbackError": "無法播放媒體",
|
||||
"badAlbum": "您看到此頁面是因為這首歌不是專輯的一部分。如果您的音樂資料夾頂層有一首歌,則很可能會看到此問題。 Jellyfin 僅將資料夾中的曲目分組。",
|
||||
"badValue": "無效選項“{{value}}”。該值不再存在",
|
||||
"networkError": "發生網路錯誤",
|
||||
"notificationDenied": "通知權限被拒絕。此設定無效",
|
||||
"openError": "無法開啟檔案"
|
||||
},
|
||||
"page": {
|
||||
"contextMenu": {
|
||||
@@ -112,53 +135,64 @@
|
||||
"moveToBottom": "$t(action.moveToBottom)",
|
||||
"setRating": "$t(action.setRating)",
|
||||
"moveToTop": "$t(action.moveToTop)",
|
||||
"numberSelected": "{{count}} 已選擇",
|
||||
"play": "$t(player.play)"
|
||||
"numberSelected": "已選取 {{count}}",
|
||||
"play": "$t(player.play)",
|
||||
"download": "下載",
|
||||
"moveToNext": "$t(action.moveToNext)",
|
||||
"playSimilarSongs": "$t(player.playSimilarSongs)",
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"shareItem": "分享項目",
|
||||
"showDetails": "取得資訊"
|
||||
},
|
||||
"globalSearch": {
|
||||
"title": "命令",
|
||||
"title": "指令",
|
||||
"commands": {
|
||||
"goToPage": "跳至頁面",
|
||||
"searchFor": "搜索 {{query}}",
|
||||
"serverCommands": "服務器命令"
|
||||
"searchFor": "搜尋 {{query}}",
|
||||
"serverCommands": "伺服器指令"
|
||||
}
|
||||
},
|
||||
"home": {
|
||||
"explore": "從庫中搜索",
|
||||
"explore": "從資料庫中搜尋",
|
||||
"recentlyPlayed": "最近播放",
|
||||
"title": "$t(common.home)",
|
||||
"mostPlayed": "最多播放",
|
||||
"newlyAdded": "最近添加的發布"
|
||||
"newlyAdded": "最近新增的發行"
|
||||
},
|
||||
"appMenu": {
|
||||
"openBrowserDevtools": "打開浏覽器開發者工具",
|
||||
"openBrowserDevtools": "打開瀏覽器開發者工具",
|
||||
"collapseSidebar": "折疊側邊欄",
|
||||
"expandSidebar": "展開側邊欄",
|
||||
"goBack": "返回",
|
||||
"goForward": "前進",
|
||||
"quit": "$t(common.quit)",
|
||||
"selectServer": "選擇服務器",
|
||||
"selectServer": "選擇伺服器",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"version": "版本 {{version}}",
|
||||
"manageServers": "管理服務器"
|
||||
"manageServers": "管理伺服器"
|
||||
},
|
||||
"fullscreenPlayer": {
|
||||
"config": {
|
||||
"showLyricProvider": "顯示歌詞提供者",
|
||||
"useImageAspectRatio": "使用圖片縱橫比",
|
||||
"dynamicBackground": "動態背景",
|
||||
"followCurrentLyric": "跟隨當前歌詞",
|
||||
"followCurrentLyric": "跟隨目前歌詞",
|
||||
"lyricAlignment": "歌詞對齊",
|
||||
"lyricGap": "歌詞間距",
|
||||
"lyricSize": "歌詞字體大小",
|
||||
"synchronized": "已同步",
|
||||
"unsynchronized": "未同步",
|
||||
"opacity": "透明度",
|
||||
"showLyricMatch": "顯示匹配的歌詞"
|
||||
"showLyricMatch": "顯示匹配的歌詞",
|
||||
"dynamicImageBlur": "圖片模糊大小",
|
||||
"dynamicIsImage": "啟用背景圖片",
|
||||
"lyricOffset": "歌詞偏移時間 (ms)"
|
||||
},
|
||||
"lyrics": "歌詞",
|
||||
"related": "相關",
|
||||
"upNext": "即將播放"
|
||||
"upNext": "即將播放",
|
||||
"visualizer": "視覺化",
|
||||
"noLyrics": "未找到歌詞"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist_other)"
|
||||
@@ -166,21 +200,27 @@
|
||||
"setting": {
|
||||
"hotkeysTab": "快捷鍵",
|
||||
"playbackTab": "播放",
|
||||
"windowTab": "窗口",
|
||||
"generalTab": "通用"
|
||||
"windowTab": "視窗",
|
||||
"generalTab": "一般",
|
||||
"advanced": "進階"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "更多該$t(entity.artist_one)作品",
|
||||
"moreFromGeneric": "更多{{item}}作品"
|
||||
"moreFromArtist": "更多來自 $t(entity.artist_one) 的作品",
|
||||
"moreFromGeneric": "更多{{item}}作品",
|
||||
"released": "發行"
|
||||
},
|
||||
"albumList": {
|
||||
"title": "$t(entity.album_other)"
|
||||
"title": "$t(entity.album_other)",
|
||||
"artistAlbums": "{{artist}} 的專輯",
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)"
|
||||
},
|
||||
"genreList": {
|
||||
"title": "$t(entity.genre_other)"
|
||||
"title": "$t(entity.genre_other)",
|
||||
"showAlbums": "顯示 $t(entity.genre_one) $t(entity.album_other)",
|
||||
"showTracks": "顯示 $t(entity.genre_one) $t(entity.track_other)"
|
||||
},
|
||||
"sidebar": {
|
||||
"albumArtists": "$t(entity.albumArtist_other)",
|
||||
@@ -193,112 +233,145 @@
|
||||
"genres": "$t(entity.genre_other)",
|
||||
"home": "$t(common.home)",
|
||||
"nowPlaying": "正在播放",
|
||||
"playlists": "$t(entity.playlist_other)"
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"myLibrary": "我的資料庫",
|
||||
"shared": "已分享 $t(entity.playlist_other)"
|
||||
},
|
||||
"trackList": {
|
||||
"title": "$t(entity.track_other)"
|
||||
"title": "$t(entity.track_other)",
|
||||
"artistTracks": "{{artist}} 的歌曲",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track_other)"
|
||||
},
|
||||
"albumArtistDetail": {
|
||||
"about": "關於{{artist}}",
|
||||
"appearsOn": "出現在",
|
||||
"recentReleases": "最近發行",
|
||||
"viewDiscography": "查看音樂作品",
|
||||
"relatedArtists": "關聯$t(entity.artist_other)",
|
||||
"topSongs": "熱門歌曲",
|
||||
"topSongsFrom": "{{title}} 的熱門歌曲",
|
||||
"viewAll": "檢視所有",
|
||||
"viewAllTracks": "檢視所有$t(entity.track_other)"
|
||||
},
|
||||
"manageServers": {
|
||||
"title": "管理伺服器",
|
||||
"serverDetails": "伺服器詳細資訊",
|
||||
"url": "URL",
|
||||
"username": "使用者名稱",
|
||||
"editServerDetailsTooltip": "編輯伺服器詳細資訊",
|
||||
"removeServer": "移除伺服器"
|
||||
},
|
||||
"itemDetail": {
|
||||
"copyPath": "複製路徑至剪貼簿",
|
||||
"copiedPath": "成功複製路徑",
|
||||
"openFile": "在檔案管理器中顯示曲目"
|
||||
},
|
||||
"playlist": {
|
||||
"reorder": "僅當按 ID 排序時才啟用重新排序"
|
||||
}
|
||||
},
|
||||
"player": {
|
||||
"playbackFetchInProgress": "正在加載歌曲…",
|
||||
"addLast": "添加到播放列表末尾",
|
||||
"addNext": "添加爲播放列表下壹首",
|
||||
"playbackFetchInProgress": "正在載入歌曲…",
|
||||
"addLast": "新增到尾端",
|
||||
"addNext": "新增到下一首",
|
||||
"favorite": "收藏",
|
||||
"mute": "靜音",
|
||||
"muted": "已靜音",
|
||||
"playbackFetchNoResults": "未找到歌曲",
|
||||
"playbackSpeed": "播放速度",
|
||||
"playRandom": "隨機播放",
|
||||
"previous": "上壹首",
|
||||
"queue_clear": "清空播放隊列",
|
||||
"previous": "上一首",
|
||||
"queue_clear": "清空播放佇列",
|
||||
"queue_remove": "移除所選",
|
||||
"repeat": "循環",
|
||||
"repeat_all": "全部循環",
|
||||
"repeat_off": "不循環",
|
||||
"shuffle": "隨機播放",
|
||||
"shuffle_off": "未啓用隨機播放",
|
||||
"shuffle_off": "未啟用隨機播放",
|
||||
"skip": "跳過",
|
||||
"skip_back": "向後跳過",
|
||||
"skip_forward": "向前跳過",
|
||||
"stop": "停止",
|
||||
"toggleFullscreenPlayer": "全屏",
|
||||
"toggleFullscreenPlayer": "切換全螢幕播放器",
|
||||
"unfavorite": "取消收藏",
|
||||
"pause": "暫停",
|
||||
"next": "下壹首",
|
||||
"next": "下一首",
|
||||
"play": "播放",
|
||||
"playbackFetchCancel": "請稍等…關閉通知以取消操作",
|
||||
"playbackFetchCancel": "請稍等…關閉通知以取消",
|
||||
"queue_moveToBottom": "使所選置頂",
|
||||
"queue_moveToTop": "使所選置底"
|
||||
"queue_moveToTop": "使所選置底",
|
||||
"playSimilarSongs": "播放相似歌曲",
|
||||
"viewQueue": "檢視佇列"
|
||||
},
|
||||
"setting": {
|
||||
"audioPlayer_description": "選擇用于播放的音頻播放器",
|
||||
"audioPlayer_description": "選擇用於播放的音訊播放器",
|
||||
"themeLight": "主題(淺色)",
|
||||
"themeLight_description": "應用將使用淺色主題",
|
||||
"themeLight_description": "應用程式將使用淺色主題",
|
||||
"discordRichPresence": "{{discord}} rich presence",
|
||||
"hotkey_volumeDown": "音量降低",
|
||||
"hotkey_volumeMute": "靜音",
|
||||
"minimumScrobblePercentage": "最小 scrobble 時長(百分比)",
|
||||
"minimumScrobblePercentage_description": "歌曲被記錄爲已播放(scrobble)所需的最小播放百分比",
|
||||
"theme_description": "設置應用的主題",
|
||||
"minimumScrobblePercentage": "最小紀錄時長(百分比)",
|
||||
"minimumScrobblePercentage_description": "歌曲被記錄為已播放(scrobble)所需的最小播放百分比",
|
||||
"theme_description": "設定應用程式的主題",
|
||||
"accentColor": "強調色",
|
||||
"accentColor_description": "設置應用的強調色",
|
||||
"applicationHotkeys": "應用快捷鍵",
|
||||
"applicationHotkeys_description": "配置應用快捷鍵。勾選設爲全局快捷鍵(僅桌面端)",
|
||||
"audioDevice": "音頻設備",
|
||||
"audioDevice_description": "選擇用于播放的音頻設備(僅 web 播放器)",
|
||||
"audioExclusiveMode": "音頻獨占模式",
|
||||
"audioExclusiveMode_description": "啓用獨占輸出模式。在此模式下,系統通常被鎖定,只有 mpv 能夠輸出音頻",
|
||||
"audioPlayer": "音頻播放器",
|
||||
"accentColor_description": "設定應用程式的強調色",
|
||||
"applicationHotkeys": "應用程式快捷鍵",
|
||||
"applicationHotkeys_description": "設定應用程式快捷鍵。切換勾選框來設為全局快捷鍵(僅桌面端)",
|
||||
"audioDevice": "音訊設備",
|
||||
"audioDevice_description": "選擇用於播放的音訊設備(僅 web 播放器)",
|
||||
"audioExclusiveMode": "音訊獨占模式",
|
||||
"audioExclusiveMode_description": "啟用獨占輸出模式。在此模式下,系統通常被鎖定,只有 mpv 能夠輸出音訊",
|
||||
"audioPlayer": "音訊播放器",
|
||||
"crossfadeDuration": "淡入淡出持續時間",
|
||||
"crossfadeDuration_description": "設置淡入淡出持續時間",
|
||||
"crossfadeDuration_description": "設定淡入淡出持續時間",
|
||||
"crossfadeStyle": "淡入淡出風格",
|
||||
"crossfadeStyle_description": "選擇用于音頻播放器的淡入淡出風格",
|
||||
"customFontPath": "自定義字體路徑",
|
||||
"customFontPath_description": "設置應用使用的自定義字體路徑",
|
||||
"crossfadeStyle_description": "選擇用於音訊播放器的淡入淡出風格",
|
||||
"customFontPath": "自定字體路徑",
|
||||
"customFontPath_description": "設定應用程式使用的自定字體路徑",
|
||||
"disableAutomaticUpdates": "禁用自動更新",
|
||||
"disableLibraryUpdateOnStartup": "禁用啓動時查找新版本",
|
||||
"discordApplicationId": "{{discord}} 應用 id",
|
||||
"discordApplicationId_description": "{{discord}} rich presence 應用 id(默認爲 {{defaultId}})",
|
||||
"discordIdleStatus": "顯示 rich presence 閑置狀態",
|
||||
"discordIdleStatus_description": "啓用後將會在播放器閑置時更新狀態",
|
||||
"discordRichPresence_description": "在 {{discord}} rich presence 中顯示播放狀態。圖片鍵爲:{{icon}}、{{playing}} 和 {{paused}} ",
|
||||
"disableLibraryUpdateOnStartup": "禁用啟動時檢查新版本",
|
||||
"discordApplicationId": "{{discord}} 應用程式 id",
|
||||
"discordApplicationId_description": "{{discord}} rich presence 應用程式 id(預設為 {{defaultId}})",
|
||||
"discordIdleStatus": "顯示 rich presence 閒置狀態",
|
||||
"discordIdleStatus_description": "啟用後將會在播放器閒置時更新狀態",
|
||||
"discordRichPresence_description": "在 {{discord}} rich presence 中顯示播放狀態。圖片鍵為:{{icon}}、{{playing}} 和 {{paused}}",
|
||||
"discordUpdateInterval": "{{discord}} rich presence 更新間隔",
|
||||
"discordUpdateInterval_description": "更新間隔秒數(至少 15 秒)",
|
||||
"enableRemote": "啓用遠程控制服務器",
|
||||
"enableRemote_description": "啓用遠程控制服務器,以允許其他設備控制此應用",
|
||||
"enableRemote": "啟用遠端控制伺服器",
|
||||
"enableRemote_description": "啟用遠端控制伺服器,以允許其他設備控制此應用程式",
|
||||
"exitToTray": "退出時最小化到托盤",
|
||||
"floatingQueueArea_description": "在屏幕右側顯示壹個懸停圖標,以查看播放隊列",
|
||||
"followLyric": "跟隨當前歌詞",
|
||||
"font_description": "設置應用使用的字體",
|
||||
"floatingQueueArea_description": "在螢幕右側顯示一個懸停圖示,以查看佇列",
|
||||
"followLyric": "跟隨目前歌詞",
|
||||
"font_description": "設定應用程式使用的字體",
|
||||
"fontType": "字體類型",
|
||||
"fontType_description": "內置字體可以選擇 Feishin 提供的字體之壹。系統字體允許您選擇操作系統提供的任何字體。自定義選項允許您使用自己的字體",
|
||||
"fontType_optionBuiltIn": "內置字體",
|
||||
"fontType_optionCustom": "自定義字體",
|
||||
"fontType_description": "內建字體可以選擇 Feishin 提供的字體之一。系統字體允許您選擇作業系統提供的任何字體。自定選項允許您使用自己的字體",
|
||||
"fontType_optionBuiltIn": "內建字體",
|
||||
"fontType_optionCustom": "自定字體",
|
||||
"fontType_optionSystem": "系統字體",
|
||||
"gaplessAudio": "無縫音頻",
|
||||
"gaplessAudio_description": "調整 mpv 無縫音頻設置",
|
||||
"gaplessAudio_optionWeak": "弱(推薦)",
|
||||
"gaplessAudio": "無間隔音訊",
|
||||
"gaplessAudio_description": "調整 mpv 無間隔音訊設定",
|
||||
"gaplessAudio_optionWeak": "弱(建議)",
|
||||
"globalMediaHotkeys": "全局媒體快捷鍵",
|
||||
"hotkey_browserForward": "浏覽器前進",
|
||||
"hotkey_browserForward": "瀏覽器往前",
|
||||
"hotkey_favoritePreviousSong": "收藏 $t(common.previousSong)",
|
||||
"hotkey_globalSearch": "全局搜索",
|
||||
"hotkey_localSearch": "頁面內搜索",
|
||||
"hotkey_playbackNext": "下壹曲",
|
||||
"hotkey_globalSearch": "全局搜尋",
|
||||
"hotkey_localSearch": "頁面內搜尋",
|
||||
"hotkey_playbackNext": "下一首",
|
||||
"hotkey_playbackPause": "暫停",
|
||||
"hotkey_playbackPlay": "播放",
|
||||
"hotkey_playbackPlayPause": "播放/暫停",
|
||||
"hotkey_playbackPrevious": "上壹曲",
|
||||
"hotkey_rate2": "評爲 2 星",
|
||||
"hotkey_rate1": "評爲 1 星",
|
||||
"hotkey_rate3": "評爲 3 星",
|
||||
"hotkey_rate4": "評爲 4 星",
|
||||
"hotkey_rate5": "評爲 5 星",
|
||||
"hotkey_skipBackward": "向回跳過",
|
||||
"hotkey_skipForward": "向後跳過",
|
||||
"hotkey_playbackPrevious": "上一首",
|
||||
"hotkey_rate2": "評為 2 星",
|
||||
"hotkey_rate1": "評為 1 星",
|
||||
"hotkey_rate3": "評為 3 星",
|
||||
"hotkey_rate4": "評為 4 星",
|
||||
"hotkey_rate5": "評為 5 星",
|
||||
"hotkey_skipBackward": "退進",
|
||||
"hotkey_skipForward": "快進",
|
||||
"hotkey_toggleCurrentSongFavorite": "收藏 / 取消收藏$t(common.currentSong)",
|
||||
"hotkey_toggleFullScreenPlayer": "全屏播放",
|
||||
"hotkey_toggleFullScreenPlayer": "切換全螢幕播放器",
|
||||
"hotkey_togglePreviousSongFavorite": "收藏 / 取消收藏$t(common.previousSong)",
|
||||
"hotkey_toggleQueue": "顯示 / 隱藏播放隊列",
|
||||
"hotkey_toggleQueue": "顯示 / 隱藏佇列",
|
||||
"hotkey_toggleRepeat": "切換循環播放設定",
|
||||
"hotkey_toggleShuffle": "切換隨機播放設定",
|
||||
"hotkey_unfavoriteCurrentSong": "取消收藏$t(common.currentSong)",
|
||||
@@ -306,97 +379,172 @@
|
||||
"hotkey_zoomIn": "放大",
|
||||
"hotkey_zoomOut": "縮小",
|
||||
"language": "語言",
|
||||
"language_description": "設置應用的語言($t(common.restartRequired))",
|
||||
"lyricFetch": "從互聯網獲取歌詞",
|
||||
"lyricFetch_description": "從多個互聯網源獲取歌詞",
|
||||
"language_description": "設定應用程式的語言($t(common.restartRequired))",
|
||||
"lyricFetch": "從網路取得歌詞",
|
||||
"lyricFetch_description": "從多個網路源取得歌詞",
|
||||
"lyricFetchProvider": "歌詞源",
|
||||
"lyricOffset": "歌詞偏移(毫秒)",
|
||||
"lyricOffset_description": "將歌詞偏移指定的毫秒數",
|
||||
"lyricFetchProvider_description": "選擇歌詞源。 歌詞源順序與查詢順序壹致",
|
||||
"lyricFetchProvider_description": "選擇歌詞源。 歌詞源順序與搜尋順序一致",
|
||||
"minimizeToTray": "最小化到托盤",
|
||||
"minimizeToTray_description": "將應用程序最小化到系統托盤",
|
||||
"minimumScrobbleSeconds": "最小 scrobble 時間(秒)",
|
||||
"minimumScrobbleSeconds_description": "歌曲被記錄爲已播放(scrobble)所需的最小播放時間",
|
||||
"mpvExecutablePath": "mpv 二進制文件路徑",
|
||||
"playbackStyle_optionCrossFade": "交叉淡入淡出",
|
||||
"playbackStyle_optionNormal": "通常",
|
||||
"playButtonBehavior": "播放按鈕行爲",
|
||||
"playButtonBehavior_description": "設置將歌曲添加到隊列時播放按鈕的默認行爲",
|
||||
"minimizeToTray_description": "將應用程式最小化到系統托盤",
|
||||
"minimumScrobbleSeconds": "最小紀錄時間(秒)",
|
||||
"minimumScrobbleSeconds_description": "歌曲被記錄為已播放(scrobble)所需的最小播放時間",
|
||||
"mpvExecutablePath": "mpv 執行檔路徑",
|
||||
"playbackStyle_optionCrossFade": "淡入淡出",
|
||||
"playbackStyle_optionNormal": "一般",
|
||||
"playButtonBehavior": "播放按鈕動作",
|
||||
"playButtonBehavior_description": "設定歌曲新增到佇列時播放按鈕的預設動作",
|
||||
"playButtonBehavior_optionAddLast": "$t(player.addLast)",
|
||||
"playButtonBehavior_optionAddNext": "$t(player.addNext)",
|
||||
"remotePort": "遠程服務器端口",
|
||||
"remoteUsername": "遠程服務器用戶名",
|
||||
"remotePort": "遠端控制伺服器端口",
|
||||
"remoteUsername": "遠端控制伺服器使用者名稱",
|
||||
"replayGainClipping": "{{ReplayGain}}削波",
|
||||
"replayGainFallback": "{{ReplayGain}}後備替代",
|
||||
"replayGainFallback_description": "樂曲沒有{{ReplayGain}}標簽時應用的增益(以分貝爲單位)",
|
||||
"replayGainFallback_description": "歌曲沒有{{ReplayGain}}標簽時使用的增益(以分貝為單位)",
|
||||
"replayGainMode": "{{ReplayGain}}模式",
|
||||
"replayGainMode_description": "根據樂曲元數據中存儲的{{ReplayGain}}值調整音量增益",
|
||||
"replayGainMode_description": "根據歌曲標籤中儲存的{{ReplayGain}}值調整音量增益",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album_one)",
|
||||
"replayGainMode_optionNone": "$t(common.none)",
|
||||
"replayGainMode_optionTrack": "$t(entity.track_one)",
|
||||
"replayGainPreamp": "{{ReplayGain}}前置放大(分貝)",
|
||||
"replayGainPreamp_description": "調整應用在{{ReplayGain}}值上的前置放大增益",
|
||||
"savePlayQueue": "保存播放列表",
|
||||
"sampleRate_description": "如果選擇的采樣頻率與當前媒體的采樣頻率不同,請選擇要使用的輸出采樣率。小于 8000 的值將使用默認頻率",
|
||||
"savePlayQueue_description": "當應用程序關閉時保存播放隊列,並在應用程序打開時恢複它",
|
||||
"scrobble": "記錄播放信息(Scrobble)",
|
||||
"scrobble_description": "在妳的社交媒體中記錄播放信息",
|
||||
"replayGainPreamp_description": "調整使用在{{ReplayGain}}值上的前置放大增益",
|
||||
"savePlayQueue": "儲存播放佇列",
|
||||
"sampleRate_description": "如果選擇的取樣率與目前媒體的取樣率不同,請選擇要使用的輸出取樣率。小於 8000 的值將使用預設頻率",
|
||||
"savePlayQueue_description": "當應用程式關閉時儲存播放佇列,並在應用程式打開時恢複它",
|
||||
"scrobble": "記錄播放資訊(Scrobble)",
|
||||
"scrobble_description": "在你的媒體伺服器中記錄播放資訊",
|
||||
"showSkipButton": "顯示跳過按鈕",
|
||||
"showSkipButton_description": "在播放條上顯示/隱藏跳過按鈕",
|
||||
"sidebarPlaylistList": "側邊欄歌單列表",
|
||||
"sidebarPlaylistList": "側邊欄歌單清單",
|
||||
"sidebarCollapsedNavigation": "側邊欄(已折疊)導航",
|
||||
"sidebarCollapsedNavigation_description": "在折疊的側邊欄中顯示或隱藏導航",
|
||||
"sidebarConfiguration": "側邊欄設定",
|
||||
"sidebarConfiguration_description": "選擇側邊欄包含的項目與順序",
|
||||
"sidebarPlaylistList_description": "顯示或隱藏側邊欄歌單列表",
|
||||
"sidePlayQueueStyle": "側邊播放列表樣式",
|
||||
"sidePlayQueueStyle_description": "設置側邊播放列表樣式",
|
||||
"sidebarPlaylistList_description": "顯示或隱藏側邊欄歌單清單",
|
||||
"sidePlayQueueStyle": "側邊播放清單樣式",
|
||||
"sidePlayQueueStyle_description": "設置側邊播放清單樣式",
|
||||
"sidePlayQueueStyle_optionAttached": "吸附",
|
||||
"sidePlayQueueStyle_optionDetached": "不吸附",
|
||||
"skipDuration": "跳過時長",
|
||||
"skipDuration_description": "設置每次按下跳過按鈕將會跳過的時長",
|
||||
"skipPlaylistPage": "跳過歌單頁面",
|
||||
"skipPlaylistPage_description": "打開歌單時,直接查看歌曲列表而非查看默認頁面",
|
||||
"skipPlaylistPage": "跳過播放清單頁面",
|
||||
"skipPlaylistPage_description": "打開播放清單時,直接查看歌曲列表而非查看預設頁面",
|
||||
"theme": "主題",
|
||||
"themeDark": "主題(深色)",
|
||||
"useSystemTheme_description": "使用系統定義的淺色或深色主題",
|
||||
"useSystemTheme": "跟隨系統",
|
||||
"volumeWheelStep": "音量滾輪步長",
|
||||
"volumeWheelStep_description": "在音量滑塊上滾動鼠標滾輪時要更改的音量大小",
|
||||
"windowBarStyle": "窗口頂欄風格",
|
||||
"windowBarStyle_description": "選擇窗口頂欄的風格",
|
||||
"zoom": "縮放率",
|
||||
"zoom_description": "設置應用程序的縮放率",
|
||||
"volumeWheelStep": "音量滾輪步進",
|
||||
"volumeWheelStep_description": "在音量條上滾動滑鼠滾輪時要更改的音量大小",
|
||||
"windowBarStyle": "視窗頂欄風格",
|
||||
"windowBarStyle_description": "選擇視窗頂欄的風格",
|
||||
"zoom": "縮放比例",
|
||||
"zoom_description": "設定應用程式的縮放比例",
|
||||
"hotkey_volumeUp": "音量增高",
|
||||
"sampleRate": "采樣率",
|
||||
"sampleRate": "取樣率",
|
||||
"showSkipButtons_description": "在播放條顯示/隱藏播放按鈕",
|
||||
"playbackStyle": "播放風格",
|
||||
"exitToTray_description": "退出應用時最小化到系統托盤而非關閉",
|
||||
"floatingQueueArea": "顯示浮動隊列懸停區域",
|
||||
"followLyric_description": "滾動歌詞到當前播放位置",
|
||||
"exitToTray_description": "退出應用程式時最小化到系統托盤而非關閉",
|
||||
"floatingQueueArea": "顯示浮動佇列懸停區域",
|
||||
"followLyric_description": "滾動歌詞到目前播放位置",
|
||||
"font": "字體",
|
||||
"globalMediaHotkeys_description": "啓用或禁用系統媒體快捷鍵以控制播放",
|
||||
"hotkey_browserBack": "浏覽器後退",
|
||||
"globalMediaHotkeys_description": "啟用或禁用系統媒體快捷鍵以控制播放",
|
||||
"hotkey_browserBack": "瀏覽器返回",
|
||||
"hotkey_favoriteCurrentSong": "收藏 $t(common.currentSong)",
|
||||
"hotkey_playbackStop": "停止",
|
||||
"hotkey_rate0": "清除評分",
|
||||
"mpvExecutablePath_description": "設置 mpv 二進制文件的路徑。如果留空,則使用默認路徑",
|
||||
"mpvExecutablePath_description": "設定 mpv 執行檔的路徑。如果留空,則使用預設路徑",
|
||||
"mpvExtraParameters": "mpv 參數",
|
||||
"playbackStyle_description": "選擇播放器的播放風格",
|
||||
"playButtonBehavior_optionPlay": "$t(player.play)",
|
||||
"remotePassword": "遠程控制服務器密碼",
|
||||
"remotePassword_description": "設置遠程控制服務器的密碼。這些憑據默認以不安全的方式傳輸,因此您應該使用壹個您不在意的唯壹密碼",
|
||||
"remotePort_description": "設置遠程服務器端口",
|
||||
"remoteUsername_description": "設置遠程控制服務器的用戶名。如果用戶名和密碼都爲空,則身份驗證將被禁用",
|
||||
"remotePassword": "遠端控制伺服器密碼",
|
||||
"remotePassword_description": "設定遠端控制伺服器的密碼。這些憑證預設以不安全的方式傳輸,因此您應該使用一個您不在意的唯一密碼",
|
||||
"remotePort_description": "設定遠端控制伺服器的端口",
|
||||
"remoteUsername_description": "設定遠端控制伺服器的使用者名稱。如果使用者名稱和密碼都為空,則身份驗證將被禁用",
|
||||
"replayGainClipping_description": "自動降低增益以防止{{ReplayGain}}造成削波",
|
||||
"showSkipButtons": "顯示跳過按鈕",
|
||||
"themeDark_description": "應用將使用深色主題",
|
||||
"clearQueryCache_description": "feishin的“軟清除”。這將會刷新播放列表、元數據並重置保存的歌詞。會保留設置、服務器憑據和緩存圖像",
|
||||
"clearCache": "清除浏覽器緩存",
|
||||
"clearCache_description": "feishin的“硬清除”。除了清除feishin的緩存,清空浏覽器緩存(保存的圖像和其他資源)。會保留服務器憑據和設置",
|
||||
"clearQueryCache": "清除feishin緩存",
|
||||
"themeDark_description": "應用程式將使用深色主題",
|
||||
"clearQueryCache_description": "Feishin的“軟清除”。這將會刷新播放清單、曲目標籤並重置儲存的歌詞。會保留設定、伺服器憑證和暫存圖片",
|
||||
"clearCache": "清除瀏覽器快取",
|
||||
"clearCache_description": "Feishin的“硬清除”。除了清除Feishin的快取、清除瀏覽器快取(儲存的圖片和其他資源)。會保留伺服器憑證和設定",
|
||||
"clearQueryCache": "清除Feishin快取",
|
||||
"buttonSize": "播放器欄按鈕大小",
|
||||
"buttonSize_description": "播放器欄按鈕大小"
|
||||
"buttonSize_description": "播放器欄按鈕大小",
|
||||
"albumBackground": "專輯背景圖片",
|
||||
"albumBackground_description": "為包含專輯封面的專輯頁面新增背景圖片",
|
||||
"albumBackgroundBlur": "專輯背景圖片模糊大小",
|
||||
"albumBackgroundBlur_description": "調整應用於專輯背景圖片的模糊量",
|
||||
"artistConfiguration": "專輯藝術家頁面設定",
|
||||
"artistConfiguration_description": "設定專輯藝術家頁面上顯示的項目及其顯示順序",
|
||||
"clearCacheSuccess": "成功清除快取",
|
||||
"contextMenu": "右鍵選單配置",
|
||||
"contextMenu_description": "允許您隱藏在右鍵選單項目時顯示的項目。未選取的項目將被隱藏",
|
||||
"customCssEnable": "啟用自訂CSS",
|
||||
"customCssEnable_description": "允許撰寫自訂CSS。",
|
||||
"customCssNotice": "警告:雖然有一些清理措施(不允許 url() 和 content:),但使用自訂 CSS 仍然會透過更改介面帶來風險。",
|
||||
"customCss": "自訂CSS",
|
||||
"customCss_description": "自訂 CSS 內容。注意:內容和遠端 URL 是不允許使用的屬性。您的內容預覽如下所示。由於需要進行清理,因此存在一些您未設定的其他欄位。",
|
||||
"discordPausedStatus": "暫停時顯示 rich presence",
|
||||
"discordPausedStatus_description": "啟用後,播放器暫停時將顯示狀態",
|
||||
"discordListening": "將狀態設為\"正在聽\"",
|
||||
"discordListening_description": "將狀態顯示為\"正在聽\"而不是\"正在玩\"",
|
||||
"discordServeImage": "從伺服器提供{{discord}}圖片",
|
||||
"discordServeImage_description": "從伺服器本身為 {{discord}} rich presence 分享封面圖片,只在jellyfin和navidrome可用",
|
||||
"doubleClickBehavior": "雙擊時將所有搜尋到的曲目加入佇列",
|
||||
"doubleClickBehavior_description": "如果為 true,則歌曲搜尋中所有符合的歌曲都會被加入佇列。否則,只有被點擊的歌曲才會被加入佇列",
|
||||
"externalLinks": "顯示外部連結",
|
||||
"externalLinks_description": "在藝術家/專輯頁面顯示外部連結(Last.fm, MusicBrainz)",
|
||||
"preferLocalLyrics": "偏好本地歌詞",
|
||||
"preferLocalLyrics_description": "優先選擇本地歌詞,而不是遠端歌詞(如果可用)",
|
||||
"genreBehavior": "曲風頁面預設動作",
|
||||
"genreBehavior_description": "決定點擊某個曲風時是否預設開啟曲目或專輯列表",
|
||||
"homeConfiguration": "首頁配置",
|
||||
"homeConfiguration_description": "配置在首頁上顯示哪些項目以及顯示順序",
|
||||
"homeFeature": "首頁特色輪播",
|
||||
"homeFeature_description": "控制是否在首頁上顯示大型特色輪播",
|
||||
"imageAspectRatio": "使用原生封面照長寬比",
|
||||
"imageAspectRatio_description": "如果啟用,封面照將使用其原始長寬比顯示。對於非 1:1 的封面,剩餘空間將為空",
|
||||
"lastfm": "顯示 last.fm 連結",
|
||||
"lastfm_description": "在藝術家/專輯頁面顯示 last.fm 連結",
|
||||
"lastfmApiKey": "{{lastfm}} API金鑰",
|
||||
"lastfmApiKey_description": "{{lastfm}}的API金鑰。用於封面照",
|
||||
"notify": "啟用歌曲通知",
|
||||
"notify_description": "當切換目前歌曲時顯示通知",
|
||||
"mpvExtraParameters_help": "一行一個",
|
||||
"musicbrainz": "顯示 musicbrainz 連結",
|
||||
"musicbrainz_description": "在存在 mbid 的藝術家/專輯頁面上顯示 musicbrainz 的鏈接",
|
||||
"neteaseTranslation": "啟用網易翻譯",
|
||||
"neteaseTranslation_description": "啟用後,將從網易取得並顯示翻譯的歌詞(如果有)。",
|
||||
"passwordStore": "密碼/secret儲存",
|
||||
"passwordStore_description": "使用什麼密碼/secret儲存。如果您在儲存密碼時遇到問題,請變更此項目。",
|
||||
"playButtonBehavior_optionPlayShuffled": "$t(player.shuffle)",
|
||||
"playerAlbumArtResolution": "播放器專輯封面解析度",
|
||||
"playerAlbumArtResolution_description": "大型播放器專輯封面預覽的解析度。較大的解析度使其看起來更清晰,但可能會減慢載入速度。預設為 0,表示自動",
|
||||
"playerbarOpenDrawer": "播放器列全螢幕切換",
|
||||
"playerbarOpenDrawer_description": "允許點擊播放器列以開啟全螢幕播放器",
|
||||
"startMinimized": "最小化啟動",
|
||||
"startMinimized_description": "在系統托盤中啟動應用程式",
|
||||
"transcodeNote": "將在播放1 (web) - 2 (mpv)首歌後生效",
|
||||
"transcode": "啟用轉碼",
|
||||
"transcode_description": "啟用轉碼到不同格式",
|
||||
"transcodeBitrate": "要轉碼的比特率",
|
||||
"transcodeBitrate_description": "選擇要轉碼的比特率。 0 表示讓伺服器選擇",
|
||||
"transcodeFormat": "轉碼的格式",
|
||||
"transcodeFormat_description": "選擇要轉碼的格式。留空來讓伺服器決定",
|
||||
"translationApiProvider": "翻譯API提供者",
|
||||
"translationApiProvider_description": "翻譯API的提供者",
|
||||
"translationApiKey": "翻譯API金鑰",
|
||||
"translationApiKey_description": "翻譯的API金鑰(僅支援全域服務端點)",
|
||||
"translationTargetLanguage": "目標翻譯語言",
|
||||
"translationTargetLanguage_description": "翻譯的目標語言",
|
||||
"trayEnabled": "顯示托盤",
|
||||
"trayEnabled_description": "顯示/隱藏托盤圖示/選單。如果停用,則也會停用最小化/退出到托盤",
|
||||
"volumeWidth": "音量條寬度",
|
||||
"volumeWidth_description": "音量條的寬度",
|
||||
"webAudio": "使用網頁音訊",
|
||||
"webAudio_description": "使用網頁音訊。這將啟用重播增益等進階功能。如果您遇到其他問題,請停用",
|
||||
"preservePitch": "保持音高",
|
||||
"preservePitch_description": "修改播放速度時保留音調"
|
||||
},
|
||||
"table": {
|
||||
"config": {
|
||||
@@ -405,7 +553,10 @@
|
||||
"gap": "$t(common.gap)",
|
||||
"size": "$t(common.size)",
|
||||
"tableColumns": "列",
|
||||
"autoFitColumns": "列寬自適應"
|
||||
"autoFitColumns": "列寬自適應",
|
||||
"followCurrentSong": "跟隨目前歌曲",
|
||||
"itemGap": "項目間隔 (px)",
|
||||
"itemSize": "項目大小 (px)"
|
||||
},
|
||||
"label": {
|
||||
"actions": "$t(common.action_other)",
|
||||
@@ -416,8 +567,8 @@
|
||||
"biography": "$t(common.biography)",
|
||||
"bitrate": "$t(common.bitrate)",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"dateAdded": "添加日期",
|
||||
"discNumber": "碟片編號",
|
||||
"dateAdded": "新增日期",
|
||||
"discNumber": "光碟編號",
|
||||
"duration": "$t(common.duration)",
|
||||
"favorite": "$t(common.favorite)",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
@@ -425,20 +576,24 @@
|
||||
"note": "$t(common.note)",
|
||||
"owner": "$t(common.owner)",
|
||||
"path": "$t(common.path)",
|
||||
"playCount": "播放數",
|
||||
"playCount": "播放次數",
|
||||
"releaseDate": "發布日期",
|
||||
"rowIndex": "行號",
|
||||
"size": "$t(common.size)",
|
||||
"title": "$t(common.title)",
|
||||
"titleCombined": "$t(common.title)(合並)",
|
||||
"trackNumber": "音軌編號",
|
||||
"titleCombined": "$t(common.title)(合併)",
|
||||
"trackNumber": "曲目編號",
|
||||
"year": "$t(common.year)",
|
||||
"rating": "$t(common.rating)"
|
||||
"rating": "$t(common.rating)",
|
||||
"codec": "$t(common.codec)",
|
||||
"songCount": "$t(entity.track_other)"
|
||||
},
|
||||
"view": {
|
||||
"card": "卡片",
|
||||
"poster": "海報",
|
||||
"table": "表格"
|
||||
"table": "表格",
|
||||
"grid": "網格",
|
||||
"list": "列表"
|
||||
}
|
||||
},
|
||||
"column": {
|
||||
@@ -450,8 +605,8 @@
|
||||
"bitrate": "比特率",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"comment": "評論",
|
||||
"dateAdded": "添加日期",
|
||||
"discNumber": "盤",
|
||||
"dateAdded": "新增日期",
|
||||
"discNumber": "光碟",
|
||||
"favorite": "收藏",
|
||||
"lastPlayed": "最後播放",
|
||||
"path": "路徑",
|
||||
@@ -463,28 +618,34 @@
|
||||
"bpm": "bpm",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"title": "標題",
|
||||
"trackNumber": "音軌編號",
|
||||
"size": "$t(common.size)"
|
||||
"trackNumber": "曲目編號",
|
||||
"size": "$t(common.size)",
|
||||
"codec": "$t(common.codec)"
|
||||
}
|
||||
},
|
||||
"action": {
|
||||
"addToFavorites": "添加到$t(entity.favorite_other)",
|
||||
"clearQueue": "清空播放隊列",
|
||||
"addToFavorites": "新增到$t(entity.favorite_other)",
|
||||
"clearQueue": "清空播放佇列",
|
||||
"createPlaylist": "創建$t(entity.playlist_one)",
|
||||
"deletePlaylist": "刪除$t(entity.playlist_one)",
|
||||
"addToPlaylist": "添加到$t(entity.playlist_one)",
|
||||
"addToPlaylist": "新增到$t(entity.playlist_one)",
|
||||
"deselectAll": "取消全選",
|
||||
"editPlaylist": "編輯 $t(entity.playlist_one)",
|
||||
"goToPage": "轉到頁面",
|
||||
"moveToBottom": "跳至底部",
|
||||
"moveToTop": "跳至頂部",
|
||||
"goToPage": "前往頁面",
|
||||
"moveToBottom": "移至底部",
|
||||
"moveToTop": "移至頂部",
|
||||
"refresh": "$t(common.refresh)",
|
||||
"removeFromFavorites": "從$t(entity.favorite_other)移除",
|
||||
"removeFromPlaylist": "從$t(entity.playlist_one)移除",
|
||||
"removeFromQueue": "從播放隊列中移除",
|
||||
"removeFromQueue": "從播放佇列中移除",
|
||||
"setRating": "評分",
|
||||
"toggleSmartPlaylistEditor": "切換$t(entity.smartPlaylist)編輯器",
|
||||
"viewPlaylists": "查看$t(entity.playlist_other)"
|
||||
"viewPlaylists": "查看$t(entity.playlist_other)",
|
||||
"moveToNext": "移至下一項",
|
||||
"openIn": {
|
||||
"lastfm": "在Last.fm開啟",
|
||||
"musicbrainz": "在MusicBrainz開啟"
|
||||
}
|
||||
},
|
||||
"entity": {
|
||||
"album_other": "專輯",
|
||||
@@ -493,16 +654,18 @@
|
||||
"artist_other": "藝術家",
|
||||
"artistWithCount_other": "{{count}} 位藝術家",
|
||||
"favorite_other": "收藏",
|
||||
"folder_other": "文件夾",
|
||||
"folderWithCount_other": "{{count}} 個文件夾",
|
||||
"genre_other": "流派",
|
||||
"genreWithCount_other": "{{count}} 種流派",
|
||||
"playlist_other": "播放列表",
|
||||
"playlistWithCount_other": "{{count}} 個播放列表",
|
||||
"smartPlaylist": "智能$t(entity.playlist_one)",
|
||||
"track_other": "樂曲",
|
||||
"trackWithCount_other": "{{count}} 首樂曲",
|
||||
"albumWithCount_other": "{{count}} 張專輯"
|
||||
"folder_other": "資料夾",
|
||||
"folderWithCount_other": "{{count}} 個資料夾",
|
||||
"genre_other": "曲風",
|
||||
"genreWithCount_other": "{{count}} 種曲風",
|
||||
"playlist_other": "播放清單",
|
||||
"playlistWithCount_other": "{{count}} 個播放清單",
|
||||
"smartPlaylist": "智慧$t(entity.playlist_one)",
|
||||
"track_other": "曲目",
|
||||
"trackWithCount_other": "{{count}} 首曲目",
|
||||
"albumWithCount_other": "{{count}} 張專輯",
|
||||
"play_other": "{{count}}次播放",
|
||||
"song_other": "歌曲"
|
||||
},
|
||||
"filter": {
|
||||
"albumCount": "$t(entity.album_other)數",
|
||||
@@ -512,15 +675,15 @@
|
||||
"bpm": "bpm",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"comment": "評論",
|
||||
"communityRating": "社區評分",
|
||||
"communityRating": "社群評分",
|
||||
"criticRating": "評論家評分",
|
||||
"dateAdded": "已添加日期",
|
||||
"disc": "盤",
|
||||
"dateAdded": "已新增日期",
|
||||
"disc": "光碟",
|
||||
"duration": "時長",
|
||||
"id": "id",
|
||||
"fromYear": "從年份",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"isCompilation": "爲合輯",
|
||||
"isCompilation": "為合輯",
|
||||
"isFavorited": "已收藏",
|
||||
"isPublic": "已公開",
|
||||
"isRated": "已評分",
|
||||
@@ -541,32 +704,32 @@
|
||||
"album": "$t(entity.album_one)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"favorited": "已收藏",
|
||||
"recentlyAdded": "最近添加",
|
||||
"recentlyAdded": "最近新增",
|
||||
"releaseYear": "發布年份",
|
||||
"search": "搜索",
|
||||
"search": "搜尋",
|
||||
"title": "標題",
|
||||
"toYear": "從年份",
|
||||
"trackNumber": "曲目"
|
||||
},
|
||||
"form": {
|
||||
"addServer": {
|
||||
"input_legacyAuthentication": "啓用舊版認證方式",
|
||||
"input_name": "服務器名",
|
||||
"input_legacyAuthentication": "啟用舊版認證方式",
|
||||
"input_name": "伺服器名稱",
|
||||
"input_password": "密碼",
|
||||
"input_savePassword": "保存密碼",
|
||||
"input_savePassword": "儲存密碼",
|
||||
"input_url": "url",
|
||||
"input_username": "用戶名",
|
||||
"success": "服務器添加成功",
|
||||
"title": "添加服務器",
|
||||
"error_savePassword": "保存密碼時出現錯誤",
|
||||
"input_username": "使用者名稱",
|
||||
"success": "伺服器新增成功",
|
||||
"title": "新增伺服器",
|
||||
"error_savePassword": "儲存密碼時出現錯誤",
|
||||
"ignoreCors": "忽略 cors $t(common.restartRequired)",
|
||||
"ignoreSsl": "忽略 ssl $t(common.restartRequired)"
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"input_playlists": "$t(entity.playlist_other)",
|
||||
"input_skipDuplicates": "跳過重複",
|
||||
"success": "添加 $t(entity.trackWithCount, {\"count\": {{message}} }) 到 $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })",
|
||||
"title": "添加到$t(entity.playlist_one)"
|
||||
"success": "新增 $t(entity.trackWithCount, {\"count\": {{message}} }) 到 $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })",
|
||||
"title": "新增到$t(entity.playlist_one)"
|
||||
},
|
||||
"createPlaylist": {
|
||||
"input_description": "$t(common.description)",
|
||||
@@ -578,16 +741,17 @@
|
||||
},
|
||||
"lyricSearch": {
|
||||
"input_name": "$t(common.name)",
|
||||
"title": "搜索歌詞",
|
||||
"title": "搜尋歌詞",
|
||||
"input_artist": "$t(entity.artist_one)"
|
||||
},
|
||||
"queryEditor": {
|
||||
"input_optionMatchAll": "匹配全部",
|
||||
"input_optionMatchAny": "匹配任何"
|
||||
"input_optionMatchAny": "匹配任何",
|
||||
"title": "查詢編輯器"
|
||||
},
|
||||
"updateServer": {
|
||||
"success": "服務器已更新成功",
|
||||
"title": "更新服務器"
|
||||
"success": "伺服器已更新成功",
|
||||
"title": "更新伺服器"
|
||||
},
|
||||
"deletePlaylist": {
|
||||
"input_confirm": "輸入$t(entity.playlist_one)的名稱進行確認",
|
||||
@@ -595,7 +759,17 @@
|
||||
"success": "$t(entity.playlist_one)已成功刪除"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"title": "編輯$t(entity.playlist_one)"
|
||||
"title": "編輯$t(entity.playlist_one)",
|
||||
"publicJellyfinNote": "Jellyfin 出於某種原因,不會顯示播放清單是否公開。如果您希望保持公開狀態,請選擇以下輸入",
|
||||
"success": "$t(entity.playlist_one) 更新成功"
|
||||
},
|
||||
"shareItem": {
|
||||
"allowDownloading": "允許下載",
|
||||
"description": "描述",
|
||||
"setExpiration": "設定過期時間",
|
||||
"success": "分享連結已複製到剪貼簿(或點擊此處開啟)",
|
||||
"expireInvalid": "到期日必須是未來",
|
||||
"createFailed": "無法建立分享(分享是否啟用?)"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,16 +5,20 @@ const FEISHIN_DISCORD_APPLICATION_ID = '1165957668758900787';
|
||||
|
||||
let client: Client | null = null;
|
||||
|
||||
const createClient = (clientId?: string) => {
|
||||
const createClient = async (clientId?: string) => {
|
||||
client = new Client({
|
||||
clientId: clientId || FEISHIN_DISCORD_APPLICATION_ID,
|
||||
});
|
||||
|
||||
client.login();
|
||||
await client.login();
|
||||
|
||||
return client;
|
||||
};
|
||||
|
||||
const isConnected = () => {
|
||||
return client?.isConnected;
|
||||
};
|
||||
|
||||
const setActivity = (activity: SetActivity) => {
|
||||
if (client) {
|
||||
client.user?.setActivity({
|
||||
@@ -35,8 +39,12 @@ const quit = () => {
|
||||
}
|
||||
};
|
||||
|
||||
ipcMain.handle('discord-rpc-initialize', (_event, clientId?: string) => {
|
||||
createClient(clientId);
|
||||
ipcMain.handle('discord-rpc-initialize', async (_event, clientId?: string) => {
|
||||
await createClient(clientId);
|
||||
});
|
||||
|
||||
ipcMain.handle('discord-rpc-is-connected', () => {
|
||||
return isConnected();
|
||||
});
|
||||
|
||||
ipcMain.handle('discord-rpc-set-activity', (_event, activity: SetActivity) => {
|
||||
@@ -58,6 +66,7 @@ ipcMain.handle('discord-rpc-quit', () => {
|
||||
export const discordRpc = {
|
||||
clearActivity,
|
||||
createClient,
|
||||
isConnected,
|
||||
quit,
|
||||
setActivity,
|
||||
};
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
import axios, { AxiosResponse } from 'axios';
|
||||
import { load } from 'cheerio';
|
||||
|
||||
import { orderSearchResults } from './shared';
|
||||
|
||||
import {
|
||||
InternetProviderLyricResponse,
|
||||
InternetProviderLyricSearchResponse,
|
||||
LyricSearchQuery,
|
||||
LyricSource,
|
||||
} from '.';
|
||||
import { orderSearchResults } from './shared';
|
||||
} from '/@/shared/types/domain/lyric-domain-types';
|
||||
|
||||
const SEARCH_URL = 'https://genius.com/api/search/song';
|
||||
|
||||
|
||||
@@ -17,35 +17,12 @@ import {
|
||||
getSearchResults as searchNetease,
|
||||
} from './netease';
|
||||
|
||||
import { Song } from '/@/shared/types/domain-types';
|
||||
|
||||
export enum LyricSource {
|
||||
GENIUS = 'Genius',
|
||||
LRCLIB = 'lrclib.net',
|
||||
NETEASE = 'NetEase',
|
||||
}
|
||||
|
||||
export type FullLyricsMetadata = Omit<InternetProviderLyricResponse, 'id' | 'lyrics' | 'source'> & {
|
||||
lyrics: LyricsResponse;
|
||||
remote: boolean;
|
||||
source: string;
|
||||
};
|
||||
|
||||
export type InternetProviderLyricResponse = {
|
||||
artist: string;
|
||||
id: string;
|
||||
lyrics: string;
|
||||
name: string;
|
||||
source: LyricSource;
|
||||
};
|
||||
|
||||
export type InternetProviderLyricSearchResponse = {
|
||||
artist: string;
|
||||
id: string;
|
||||
name: string;
|
||||
score?: number;
|
||||
source: LyricSource;
|
||||
};
|
||||
import {
|
||||
InternetProviderLyricResponse,
|
||||
InternetProviderLyricSearchResponse,
|
||||
LyricSource,
|
||||
} from '/@/shared/types/domain/lyric-domain-types';
|
||||
import { Song } from '/@/shared/types/domain/song-domain-types';
|
||||
|
||||
export type LyricGetQuery = {
|
||||
remoteSongId: string;
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
// Credits to https://github.com/tranxuanthang/lrcget for API implementation
|
||||
import axios, { AxiosResponse } from 'axios';
|
||||
|
||||
import { orderSearchResults } from './shared';
|
||||
|
||||
import {
|
||||
InternetProviderLyricResponse,
|
||||
InternetProviderLyricSearchResponse,
|
||||
LyricSearchQuery,
|
||||
LyricSource,
|
||||
} from '.';
|
||||
import { orderSearchResults } from './shared';
|
||||
} from '/@/shared/types/domain/lyric-domain-types';
|
||||
|
||||
const FETCH_URL = 'https://lrclib.net/api/get';
|
||||
const SEEARCH_URL = 'https://lrclib.net/api/search';
|
||||
|
||||
@@ -1,43 +1,20 @@
|
||||
import axios, { AxiosResponse } from 'axios';
|
||||
|
||||
import { store } from '../settings';
|
||||
import { orderSearchResults } from './shared';
|
||||
|
||||
import {
|
||||
InternetProviderLyricResponse,
|
||||
InternetProviderLyricSearchResponse,
|
||||
LyricSearchQuery,
|
||||
LyricSource,
|
||||
} from '.';
|
||||
import { store } from '../settings';
|
||||
import { orderSearchResults } from './shared';
|
||||
} from '/@/shared/types/domain/lyric-domain-types';
|
||||
|
||||
const SEARCH_URL = 'https://music.163.com/api/search/get';
|
||||
const LYRICS_URL = 'https://music.163.com/api/song/lyric';
|
||||
|
||||
// Adapted from https://github.com/NyaomiDEV/Sunamu/blob/master/src/main/lyricproviders/netease.ts
|
||||
|
||||
export interface Result {
|
||||
hasMore: boolean;
|
||||
songCount: number;
|
||||
songs: Song[];
|
||||
}
|
||||
|
||||
export interface Song {
|
||||
album: Album;
|
||||
alias: string[];
|
||||
artists: Artist[];
|
||||
copyrightId: number;
|
||||
duration: number;
|
||||
fee: number;
|
||||
ftype: number;
|
||||
id: number;
|
||||
mark: number;
|
||||
mvid: number;
|
||||
name: string;
|
||||
rtype: number;
|
||||
rUrl: null;
|
||||
status: number;
|
||||
transNames?: string[];
|
||||
}
|
||||
|
||||
interface Album {
|
||||
artist: Artist;
|
||||
copyrightId: number;
|
||||
@@ -69,6 +46,30 @@ interface NetEaseResponse {
|
||||
result: Result;
|
||||
}
|
||||
|
||||
interface Result {
|
||||
hasMore: boolean;
|
||||
songCount: number;
|
||||
songs: Song[];
|
||||
}
|
||||
|
||||
interface Song {
|
||||
album: Album;
|
||||
alias: string[];
|
||||
artists: Artist[];
|
||||
copyrightId: number;
|
||||
duration: number;
|
||||
fee: number;
|
||||
ftype: number;
|
||||
id: number;
|
||||
mark: number;
|
||||
mvid: number;
|
||||
name: string;
|
||||
rtype: number;
|
||||
rUrl: null;
|
||||
status: number;
|
||||
transNames?: string[];
|
||||
}
|
||||
|
||||
export async function getLyricsBySongId(songId: string): Promise<null | string> {
|
||||
let result: AxiosResponse<any, any>;
|
||||
try {
|
||||
@@ -201,25 +202,23 @@ function mergeLyrics(original: string | undefined, translated: string | undefine
|
||||
return original;
|
||||
}
|
||||
|
||||
// Iterate through each line of the original LRC. If a translation exists for
|
||||
// the same timestamp, insert it as a new, fully-formatted LRC line.
|
||||
const finalLines = original.split('\n').flatMap((line) => {
|
||||
// Iterate through each line of the original LRC. If a translation exists for the same timestamp, append the translated text after the original text.
|
||||
const finalLines = original.split('\n').map((line) => {
|
||||
const match = line.match(lrcLineRegex);
|
||||
|
||||
if (match) {
|
||||
const timestamp = match[1];
|
||||
const originalText = match[2].trim();
|
||||
const translatedText = translatedMap.get(timestamp);
|
||||
|
||||
if (translatedText) {
|
||||
// Return an array containing both the original line and the new translated line.
|
||||
// flatMap will flatten this into the final array of lines.
|
||||
const translatedLine = `[${timestamp}]${translatedText}`;
|
||||
return [line, translatedLine];
|
||||
if (translatedText && originalText) {
|
||||
// Append and add a break delimiter to separate the original and translated text
|
||||
return [`[${timestamp}]${originalText}`, translatedText].join('_BREAK_');
|
||||
}
|
||||
}
|
||||
|
||||
// If no match or no translation is found, return only the original line.
|
||||
return [line];
|
||||
// If no match or no translation is found, return the original line unchanged.
|
||||
return line;
|
||||
});
|
||||
|
||||
return finalLines.join('\n');
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
import Fuse from 'fuse.js';
|
||||
|
||||
import {
|
||||
InternetProviderLyricSearchResponse,
|
||||
LyricSearchQuery,
|
||||
} from '/@/shared/types/domain-types';
|
||||
import { InternetProviderLyricSearchResponse } from '/@/shared/types/domain/lyric-domain-types';
|
||||
import { LyricSearchQuery } from '/@/shared/types/domain/lyric-domain-types';
|
||||
|
||||
export const orderSearchResults = (args: {
|
||||
params: LyricSearchQuery;
|
||||
|
||||
@@ -105,7 +105,7 @@ const createMpv = async (data: {
|
||||
try {
|
||||
await mpv.start();
|
||||
} catch (error: any) {
|
||||
console.log('mpv failed to start', error);
|
||||
console.error('mpv failed to start', error);
|
||||
} finally {
|
||||
await mpv.setMultipleProperties(properties || {});
|
||||
}
|
||||
|
||||
@@ -11,8 +11,8 @@ import manifest from './manifest.json';
|
||||
|
||||
import { getMainWindow } from '/@/main/index';
|
||||
import { isLinux } from '/@/main/utils';
|
||||
import { QueueSong } from '/@/shared/types/domain-types';
|
||||
import { ClientEvent, ServerEvent } from '/@/shared/types/remote-types';
|
||||
import { QueueSong } from '/@/shared/types/domain/player-domain-types';
|
||||
import { ClientEvent, ServerEvent } from '/@/shared/types/domain/remote-types';
|
||||
import { PlayerRepeat, PlayerStatus, SongState } from '/@/shared/types/types';
|
||||
|
||||
let mprisPlayer: any | undefined;
|
||||
@@ -405,7 +405,7 @@ const enableServer = (config: RemoteConfig): Promise<void> => {
|
||||
}
|
||||
case 'proxy': {
|
||||
const toFetch = currentState.song?.imageUrl?.replaceAll(
|
||||
/&(size|width|height=\d+)/g,
|
||||
/&(size|width|height)=\d+/g,
|
||||
'',
|
||||
);
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ import { ipcMain } from 'electron';
|
||||
import Player from 'mpris-service';
|
||||
|
||||
import { getMainWindow } from '/@/main/index';
|
||||
import { QueueSong } from '/@/shared/types/domain-types';
|
||||
import { QueueSong } from '/@/shared/types/domain/player-domain-types';
|
||||
import { PlayerRepeat, PlayerStatus } from '/@/shared/types/types';
|
||||
|
||||
const mprisPlayer = Player({
|
||||
@@ -168,7 +168,7 @@ ipcMain.on('update-song', (_event, song: QueueSong | undefined) => {
|
||||
'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:lastUsed': song.userLastPlayedDate,
|
||||
'xesam:title': song.name || null,
|
||||
'xesam:trackNumber': song.trackNumber ? song.trackNumber : null,
|
||||
'xesam:useCount':
|
||||
@@ -177,7 +177,7 @@ ipcMain.on('update-song', (_event, song: QueueSong | undefined) => {
|
||||
'xesam:userRating': song.userRating ? song.userRating / 5 : null,
|
||||
};
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
console.error(err);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
+34
-7
@@ -9,6 +9,7 @@ import {
|
||||
nativeImage,
|
||||
nativeTheme,
|
||||
net,
|
||||
powerSaveBlocker,
|
||||
protocol,
|
||||
Rectangle,
|
||||
screen,
|
||||
@@ -49,7 +50,7 @@ export default class AppUpdater {
|
||||
protocol.registerSchemesAsPrivileged([{ privileges: { bypassCSP: true }, scheme: 'feishin' }]);
|
||||
|
||||
process.on('uncaughtException', (error: any) => {
|
||||
console.log('Error in main process', error);
|
||||
console.error('Error in main process', error);
|
||||
});
|
||||
|
||||
if (store.get('ignore_ssl')) {
|
||||
@@ -66,6 +67,7 @@ let mainWindow: BrowserWindow | null = null;
|
||||
let tray: null | Tray = null;
|
||||
let exitFromTray = false;
|
||||
let forceQuit = false;
|
||||
let powerSaveBlockerId: null | number = null;
|
||||
|
||||
if (process.env.NODE_ENV === 'production') {
|
||||
import('source-map-support').then((sourceMapSupport) => {
|
||||
@@ -421,9 +423,6 @@ async function createWindow(first = true): Promise<void> {
|
||||
store.set('fullscreen', mainWindow?.isFullScreen());
|
||||
|
||||
if (!exitFromTray && store.get('window_exit_to_tray')) {
|
||||
if (isMacOS() && !forceQuit) {
|
||||
exitFromTray = true;
|
||||
}
|
||||
event.preventDefault();
|
||||
mainWindow?.hide();
|
||||
}
|
||||
@@ -432,8 +431,6 @@ async function createWindow(first = true): Promise<void> {
|
||||
event.preventDefault();
|
||||
saved = true;
|
||||
|
||||
getMainWindow()?.webContents.send('renderer-save-queue');
|
||||
|
||||
ipcMain.once('player-save-queue', async (_event, data: Record<string, any>) => {
|
||||
const queueLocation = join(app.getPath('userData'), 'queue');
|
||||
const serialized = JSON.stringify(data);
|
||||
@@ -457,12 +454,19 @@ async function createWindow(first = true): Promise<void> {
|
||||
} catch (error) {
|
||||
console.error('error saving queue state: ', error);
|
||||
} finally {
|
||||
mainWindow?.close();
|
||||
if (!isMacOS()) {
|
||||
mainWindow?.close();
|
||||
}
|
||||
if (forceQuit) {
|
||||
app.exit();
|
||||
}
|
||||
}
|
||||
});
|
||||
getMainWindow()?.webContents.send('renderer-save-queue');
|
||||
} else {
|
||||
if (forceQuit) {
|
||||
app.exit();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -485,6 +489,7 @@ async function createWindow(first = true): Promise<void> {
|
||||
|
||||
const menuBuilder = new MenuBuilder(mainWindow);
|
||||
menuBuilder.buildMenu();
|
||||
Menu.setApplicationMenu(null);
|
||||
|
||||
// Open URLs in the user's browser
|
||||
mainWindow.webContents.setWindowOpenHandler((edata) => {
|
||||
@@ -613,6 +618,28 @@ ipcMain.on(
|
||||
},
|
||||
);
|
||||
|
||||
ipcMain.handle('power-save-blocker-start', () => {
|
||||
if (powerSaveBlockerId !== null) {
|
||||
return powerSaveBlockerId;
|
||||
}
|
||||
|
||||
powerSaveBlockerId = powerSaveBlocker.start('prevent-display-sleep');
|
||||
return powerSaveBlockerId;
|
||||
});
|
||||
|
||||
ipcMain.handle('power-save-blocker-stop', () => {
|
||||
if (powerSaveBlockerId !== null) {
|
||||
const stopped = powerSaveBlocker.stop(powerSaveBlockerId);
|
||||
powerSaveBlockerId = null;
|
||||
return stopped;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
|
||||
ipcMain.handle('power-save-blocker-is-started', () => {
|
||||
return powerSaveBlockerId !== null && powerSaveBlocker.isStarted(powerSaveBlockerId);
|
||||
});
|
||||
|
||||
app.on('window-all-closed', () => {
|
||||
globalShortcut.unregisterAll();
|
||||
// Respect the OSX convention of having the application in memory even
|
||||
|
||||
@@ -6,6 +6,11 @@ const initialize = (clientId: string) => {
|
||||
return client;
|
||||
};
|
||||
|
||||
const isConnected = () => {
|
||||
const isConnected = ipcRenderer.invoke('discord-rpc-is-connected');
|
||||
return isConnected;
|
||||
};
|
||||
|
||||
const clearActivity = () => {
|
||||
ipcRenderer.invoke('discord-rpc-clear-activity');
|
||||
};
|
||||
@@ -21,6 +26,7 @@ const quit = () => {
|
||||
export const discordRpc = {
|
||||
clearActivity,
|
||||
initialize,
|
||||
isConnected,
|
||||
quit,
|
||||
setActivity,
|
||||
};
|
||||
|
||||
@@ -8,7 +8,12 @@ const send = (channel: string, ...args: any[]) => {
|
||||
ipcRenderer.send(channel, ...args);
|
||||
};
|
||||
|
||||
const invoke = (channel: string, ...args: any[]) => {
|
||||
return ipcRenderer.invoke(channel, ...args);
|
||||
};
|
||||
|
||||
export const ipc = {
|
||||
invoke,
|
||||
removeAllListeners,
|
||||
send,
|
||||
};
|
||||
|
||||
@@ -7,7 +7,7 @@ import {
|
||||
LyricSource,
|
||||
} from '../main/features/core/lyrics';
|
||||
|
||||
import { QueueSong } from '/@/shared/types/domain-types';
|
||||
import { QueueSong } from '/@/shared/types/domain/player-domain-types';
|
||||
|
||||
const getRemoteLyricsBySong = (song: QueueSong) => {
|
||||
const result = ipcRenderer.invoke('lyric-by-song', song);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { ipcRenderer, IpcRendererEvent } from 'electron';
|
||||
|
||||
import { PlayerData } from '/@/shared/types/domain-types';
|
||||
import { PlayerData } from '/@/shared/types/domain/player-domain-types';
|
||||
|
||||
const initialize = (data: { extraParameters?: string[]; properties?: Record<string, any> }) => {
|
||||
return ipcRenderer.invoke('player-initialize', data);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { ipcRenderer, IpcRendererEvent } from 'electron';
|
||||
|
||||
import { QueueSong } from '/@/shared/types/domain-types';
|
||||
import { QueueSong, QueueSong } from '/@/shared/types/domain/player-domain-types';
|
||||
import { PlayerStatus } from '/@/shared/types/types';
|
||||
|
||||
const requestFavorite = (
|
||||
|
||||
+1
-4
@@ -22,10 +22,7 @@ export const App = () => {
|
||||
const { mode, theme } = useAppTheme(isDark ? AppTheme.DEFAULT_DARK : AppTheme.DEFAULT_LIGHT);
|
||||
|
||||
return (
|
||||
<MantineProvider
|
||||
defaultColorScheme={mode}
|
||||
theme={theme}
|
||||
>
|
||||
<MantineProvider defaultColorScheme={mode} theme={theme}>
|
||||
<Shell />
|
||||
</MantineProvider>
|
||||
);
|
||||
|
||||
@@ -18,17 +18,7 @@ export const ThemeButton = () => {
|
||||
}}
|
||||
variant="default"
|
||||
>
|
||||
{isDark ? (
|
||||
<Icon
|
||||
icon="themeLight"
|
||||
size={30}
|
||||
/>
|
||||
) : (
|
||||
<Icon
|
||||
icon="themeDark"
|
||||
size={30}
|
||||
/>
|
||||
)}
|
||||
{isDark ? <Icon icon="themeLight" size={30} /> : <Icon icon="themeDark" size={30} />}
|
||||
</ActionIcon>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -12,7 +12,7 @@ export const PlayerImage = ({ src }: PlayerImageProps) => {
|
||||
<img
|
||||
className={styles.container}
|
||||
onError={() => send({ event: 'proxy' })}
|
||||
src={src?.replaceAll(/&(size|width|height=\d+)/g, '')}
|
||||
src={src?.replaceAll(/&(size|width|height)=\d+/g, '')}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -32,17 +32,9 @@ export const RemoteContainer = () => {
|
||||
const debouncedSetRating = debounce(setRating, 400);
|
||||
|
||||
return (
|
||||
<Stack
|
||||
gap="md"
|
||||
h="100dvh"
|
||||
w="100%"
|
||||
>
|
||||
<Stack gap="md" h="100dvh" w="100%">
|
||||
{showImage && (
|
||||
<Flex
|
||||
align="center"
|
||||
justify="center"
|
||||
w="100%"
|
||||
>
|
||||
<Flex align="center" justify="center" w="100%">
|
||||
<PlayerImage src={song?.imageUrl} />
|
||||
</Flex>
|
||||
)}
|
||||
@@ -87,10 +79,7 @@ export const RemoteContainer = () => {
|
||||
</Group>
|
||||
</Stack>
|
||||
)}
|
||||
<Group
|
||||
gap={0}
|
||||
grow
|
||||
>
|
||||
<Group gap={0} grow>
|
||||
<ActionIcon
|
||||
disabled={!id}
|
||||
icon="favorite"
|
||||
@@ -109,10 +98,7 @@ export const RemoteContainer = () => {
|
||||
/>
|
||||
{(song?.serverType === 'navidrome' || song?.serverType === 'subsonic') && (
|
||||
<div style={{ margin: 'auto' }}>
|
||||
<Tooltip
|
||||
label="Double click to clear"
|
||||
openDelay={1000}
|
||||
>
|
||||
<Tooltip label="Double click to clear" openDelay={1000}>
|
||||
<Rating
|
||||
onChange={debouncedSetRating}
|
||||
onDoubleClick={() => debouncedSetRating(0)}
|
||||
@@ -123,10 +109,7 @@ export const RemoteContainer = () => {
|
||||
</div>
|
||||
)}
|
||||
</Group>
|
||||
<Group
|
||||
gap="xs"
|
||||
grow
|
||||
>
|
||||
<Group gap="xs" grow>
|
||||
<ActionIcon
|
||||
disabled={!id}
|
||||
icon="mediaPrevious"
|
||||
@@ -174,10 +157,7 @@ export const RemoteContainer = () => {
|
||||
variant="default"
|
||||
/>
|
||||
</Group>
|
||||
<Group
|
||||
gap="xs"
|
||||
grow
|
||||
>
|
||||
<Group gap="xs" grow>
|
||||
<ActionIcon
|
||||
icon="mediaShuffle"
|
||||
iconProps={{
|
||||
@@ -232,10 +212,7 @@ export const RemoteContainer = () => {
|
||||
max={100}
|
||||
onChangeEnd={(e) => send({ event: 'volume', volume: e })}
|
||||
rightLabel={
|
||||
<Text
|
||||
fw={600}
|
||||
size="xs"
|
||||
>
|
||||
<Text fw={600} size="xs">
|
||||
{volume ?? 0}
|
||||
</Text>
|
||||
}
|
||||
|
||||
@@ -13,16 +13,9 @@ export const Shell = () => {
|
||||
const connected = useConnected();
|
||||
|
||||
return (
|
||||
<AppShell
|
||||
h="100vh"
|
||||
padding="md"
|
||||
w="100vw"
|
||||
>
|
||||
<AppShell h="100vh" padding="md" w="100vw">
|
||||
<AppShell.Header style={{ background: 'var(--theme-colors-surface)' }}>
|
||||
<Grid
|
||||
px="md"
|
||||
py="sm"
|
||||
>
|
||||
<Grid px="md" py="sm">
|
||||
<Grid.Col span={4}>
|
||||
<Flex
|
||||
align="center"
|
||||
@@ -33,20 +26,11 @@ export const Shell = () => {
|
||||
justifySelf: 'flex-start',
|
||||
}}
|
||||
>
|
||||
<Image
|
||||
fit="contain"
|
||||
height={32}
|
||||
src="/favicon.ico"
|
||||
width={32}
|
||||
/>
|
||||
<Image fit="contain" height={32} src="/favicon.ico" width={32} />
|
||||
</Flex>
|
||||
</Grid.Col>
|
||||
<Grid.Col span={8}>
|
||||
<Group
|
||||
gap="sm"
|
||||
justify="flex-end"
|
||||
wrap="nowrap"
|
||||
>
|
||||
<Group gap="sm" justify="flex-end" wrap="nowrap">
|
||||
<ReconnectButton />
|
||||
<ImageButton />
|
||||
<ThemeButton />
|
||||
@@ -58,10 +42,7 @@ export const Shell = () => {
|
||||
{connected ? (
|
||||
<RemoteContainer />
|
||||
) : (
|
||||
<Center
|
||||
h="100vh"
|
||||
w="100vw"
|
||||
>
|
||||
<Center h="100vh" w="100vw">
|
||||
<Spinner />
|
||||
</Center>
|
||||
)}
|
||||
|
||||
@@ -61,10 +61,7 @@ export const WrappedSlider = ({ leftLabel, rightLabel, value, ...props }: Wrappe
|
||||
const [seek, setSeek] = useState(0);
|
||||
|
||||
return (
|
||||
<Group
|
||||
align="center"
|
||||
wrap="nowrap"
|
||||
>
|
||||
<Group align="center" wrap="nowrap">
|
||||
{leftLabel && <Text size="sm">{leftLabel}</Text>}
|
||||
<PlayerbarSlider
|
||||
{...props}
|
||||
|
||||
@@ -0,0 +1,172 @@
|
||||
import {
|
||||
ApiController,
|
||||
ApiControllerError,
|
||||
ApiControllerFn,
|
||||
} from '/@/shared/types/adapter/api-controller-types';
|
||||
import { ServerListItem } from '/@/shared/types/domain/server-domain-types';
|
||||
import { logger } from '/@/shared/utils/logger';
|
||||
|
||||
export interface LoggingOptions {
|
||||
logErrors?: boolean;
|
||||
logPerformance?: boolean;
|
||||
logRequests?: boolean;
|
||||
logResponses?: boolean;
|
||||
maxRequestSize?: number;
|
||||
maxResponseSize?: number;
|
||||
}
|
||||
|
||||
type LoggedApiControllerFn<TRequest, TResponse> = (
|
||||
request: TRequest,
|
||||
server: ServerListItem,
|
||||
options?: any,
|
||||
) => Promise<[ApiControllerError, null] | [null, TResponse]>;
|
||||
|
||||
export function createLoggedApiController(
|
||||
controller: ApiController,
|
||||
options: LoggingOptions = {},
|
||||
): ApiController {
|
||||
const loggedController: any = {};
|
||||
|
||||
// Log utility functions
|
||||
loggedController._utility = createLoggedUtility(controller._utility);
|
||||
|
||||
// Log all controller methods
|
||||
for (const [sectionKey, section] of Object.entries(controller)) {
|
||||
if (sectionKey === '_utility') continue;
|
||||
|
||||
loggedController[sectionKey] = {};
|
||||
|
||||
for (const [methodKey, method] of Object.entries(section as Record<string, any>)) {
|
||||
if (typeof method === 'function') {
|
||||
const functionName = `${sectionKey}.${methodKey}`;
|
||||
|
||||
if (methodKey === 'authenticate' || methodKey === 'getType') {
|
||||
// Special handling for non-standard API functions
|
||||
loggedController[sectionKey][methodKey] = (...args: any[]) => {
|
||||
logger.info(`[API] ${functionName} called`, {
|
||||
args: JSON.stringify(args, null, 2),
|
||||
});
|
||||
return method(...args);
|
||||
};
|
||||
} else {
|
||||
loggedController[sectionKey][methodKey] = createLoggedFunction(
|
||||
method as ApiControllerFn<any, any>,
|
||||
functionName,
|
||||
options,
|
||||
);
|
||||
}
|
||||
} else {
|
||||
loggedController[sectionKey][methodKey] = method;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return loggedController as ApiController;
|
||||
}
|
||||
|
||||
function createLoggedFunction<TRequest, TResponse>(
|
||||
originalFn: ApiControllerFn<TRequest, TResponse> | undefined,
|
||||
functionName: string,
|
||||
options: LoggingOptions = {},
|
||||
): LoggedApiControllerFn<TRequest, TResponse> | undefined {
|
||||
if (!originalFn) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
return async (request: TRequest, requestOptions?: any) => {
|
||||
const startTime = Date.now();
|
||||
const requestId = Math.random().toString(36).substring(2, 15);
|
||||
|
||||
const {
|
||||
logErrors = true,
|
||||
logPerformance = true,
|
||||
logRequests = true,
|
||||
logResponses = true,
|
||||
maxRequestSize = 1000,
|
||||
maxResponseSize = 1000,
|
||||
} = options;
|
||||
|
||||
if (logRequests) {
|
||||
const requestStr = JSON.stringify(request, null, 2);
|
||||
const truncatedRequest =
|
||||
requestStr.length > maxRequestSize
|
||||
? requestStr.substring(0, maxRequestSize) + '...'
|
||||
: requestStr;
|
||||
|
||||
logger.info(`[API] ${functionName} called`, {
|
||||
request: truncatedRequest,
|
||||
requestId,
|
||||
});
|
||||
}
|
||||
|
||||
try {
|
||||
const result = await originalFn(request, requestOptions);
|
||||
const duration = Date.now() - startTime;
|
||||
|
||||
if (result[0]) {
|
||||
// Error response
|
||||
if (logErrors) {
|
||||
const error = result[0] as ApiControllerError;
|
||||
logger.error(`[API] ${functionName} failed`, {
|
||||
duration: logPerformance ? `${duration}ms` : undefined,
|
||||
error: {
|
||||
code: error.code,
|
||||
message: error.message,
|
||||
},
|
||||
requestId,
|
||||
});
|
||||
}
|
||||
} else {
|
||||
// Success response
|
||||
if (logResponses) {
|
||||
const response = result[1];
|
||||
const responseStr = JSON.stringify(response);
|
||||
const truncatedResponse =
|
||||
responseStr.length > maxResponseSize
|
||||
? responseStr.substring(0, maxResponseSize) + '...'
|
||||
: responseStr;
|
||||
|
||||
logger.info(`[API] ${functionName} succeeded`, {
|
||||
duration: logPerformance ? `${duration}ms` : undefined,
|
||||
requestId,
|
||||
response: truncatedResponse,
|
||||
responseSize: responseStr.length,
|
||||
responseType: typeof response,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
} catch (error) {
|
||||
const duration = Date.now() - startTime;
|
||||
if (logErrors) {
|
||||
logger.error(`[API] ${functionName} threw exception`, {
|
||||
duration: logPerformance ? `${duration}ms` : undefined,
|
||||
error: error instanceof Error ? error.message : String(error),
|
||||
requestId,
|
||||
stack: error instanceof Error ? error.stack : undefined,
|
||||
});
|
||||
}
|
||||
throw error;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
function createLoggedUtility<T extends Record<string, any>>(utility: T): T {
|
||||
const loggedUtility: any = {};
|
||||
|
||||
for (const [key, value] of Object.entries(utility)) {
|
||||
if (typeof value === 'function') {
|
||||
loggedUtility[key] = (...args: any[]) => {
|
||||
logger.debug(`[API] _utility.${key} called`, {
|
||||
args: JSON.stringify(args, null, 2),
|
||||
});
|
||||
return value(...args);
|
||||
};
|
||||
} else {
|
||||
loggedUtility[key] = value;
|
||||
}
|
||||
}
|
||||
|
||||
return loggedUtility as T;
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
import { createLoggedApiController } from '/@/renderer/api/api-controller-logger';
|
||||
import { useAuthStore } from '/@/renderer/store';
|
||||
import {
|
||||
createApiClient as subsonicApiClient,
|
||||
authenticate as subsonicAuthenticate,
|
||||
controller as subsonicController,
|
||||
middleware as subsonicMiddleware,
|
||||
} from '/@/shared/api/subsonic/subsonic-controller';
|
||||
import { ApiController } from '/@/shared/types/adapter/api-controller-types';
|
||||
import { ServerType } from '/@/shared/types/domain/server-domain-types';
|
||||
|
||||
export const serverApiMap = {
|
||||
[ServerType.JELLYFIN]: {
|
||||
apiClient: null,
|
||||
authenticate: null,
|
||||
controller: {},
|
||||
middleware: null,
|
||||
},
|
||||
[ServerType.NAVIDROME]: {
|
||||
apiClient: null,
|
||||
authenticate: null,
|
||||
controller: {},
|
||||
middleware: null,
|
||||
},
|
||||
[ServerType.SUBSONIC]: {
|
||||
apiClient: subsonicApiClient,
|
||||
authenticate: subsonicAuthenticate,
|
||||
controller: subsonicController,
|
||||
middleware: subsonicMiddleware,
|
||||
},
|
||||
};
|
||||
|
||||
const getApiByServer = (serverId: string): ApiController => {
|
||||
const servers = useAuthStore.getState().serverList;
|
||||
const server = servers[serverId];
|
||||
|
||||
if (!server) {
|
||||
throw new Error('No server or api client selected');
|
||||
}
|
||||
|
||||
const { apiClient, controller, middleware } = serverApiMap[server.type];
|
||||
|
||||
if (!apiClient) {
|
||||
throw new Error('No api client found');
|
||||
}
|
||||
|
||||
const client = apiClient(server, middleware);
|
||||
|
||||
return createLoggedApiController(controller(client, server));
|
||||
};
|
||||
|
||||
const getAppApi = () => {
|
||||
const servers = useAuthStore.getState().serverList;
|
||||
|
||||
return Object.entries(servers).reduce(
|
||||
(acc, [id]) => {
|
||||
acc[id] = getApiByServer(id);
|
||||
return acc;
|
||||
},
|
||||
{} as Record<string, ApiController>,
|
||||
);
|
||||
};
|
||||
|
||||
export const api = {
|
||||
authenticate: (serverType: ServerType) => {
|
||||
const { authenticate } = serverApiMap[serverType];
|
||||
|
||||
if (!serverType || !authenticate) {
|
||||
throw new Error();
|
||||
}
|
||||
|
||||
return authenticate;
|
||||
},
|
||||
controller: getAppApi(),
|
||||
};
|
||||
@@ -4,11 +4,9 @@ import { NavidromeController } from '/@/renderer/api/navidrome/navidrome-control
|
||||
import { SubsonicController } from '/@/renderer/api/subsonic/subsonic-controller';
|
||||
import { useAuthStore } from '/@/renderer/store';
|
||||
import { toast } from '/@/shared/components/toast/toast';
|
||||
import {
|
||||
AuthenticationResponse,
|
||||
ControllerEndpoint,
|
||||
ServerType,
|
||||
} from '/@/shared/types/domain-types';
|
||||
import { ControllerEndpoint } from '/@/shared/types/domain/api-domain-types';
|
||||
import { AuthenticationResponse } from '/@/shared/types/domain/auth-domain-types';
|
||||
import { ServerType } from '/@/shared/types/domain/server-domain-types';
|
||||
|
||||
type ApiController = {
|
||||
jellyfin: ControllerEndpoint;
|
||||
|
||||
@@ -11,7 +11,7 @@ import { authenticationFailure } from '/@/renderer/api/utils';
|
||||
import { useAuthStore } from '/@/renderer/store';
|
||||
import { jfType } from '/@/shared/api/jellyfin/jellyfin-types';
|
||||
import { getClientType } from '/@/shared/api/utils';
|
||||
import { ServerListItem } from '/@/shared/types/domain-types';
|
||||
import { ServerListItem } from '/@/shared/types/domain/server-domain-types';
|
||||
|
||||
const c = initContract();
|
||||
|
||||
@@ -118,7 +118,7 @@ export const contract = c.router({
|
||||
},
|
||||
getGenreList: {
|
||||
method: 'GET',
|
||||
path: 'genres',
|
||||
path: 'musicgenres',
|
||||
query: jfType._parameters.genreList,
|
||||
responses: {
|
||||
200: jfType._response.genreList,
|
||||
|
||||
@@ -6,19 +6,13 @@ import { JFSongListSort, JFSortOrder } from '/@/shared/api/jellyfin.types';
|
||||
import { jfNormalize } from '/@/shared/api/jellyfin/jellyfin-normalize';
|
||||
import { jfType } from '/@/shared/api/jellyfin/jellyfin-types';
|
||||
import { getFeatures, hasFeature, VersionInfo } from '/@/shared/api/utils';
|
||||
import {
|
||||
albumArtistListSortMap,
|
||||
albumListSortMap,
|
||||
ControllerEndpoint,
|
||||
genreListSortMap,
|
||||
LibraryItem,
|
||||
Played,
|
||||
playlistListSortMap,
|
||||
Song,
|
||||
songListSortMap,
|
||||
sortOrderMap,
|
||||
} from '/@/shared/types/domain-types';
|
||||
import { ServerFeature } from '/@/shared/types/features-types';
|
||||
import { albumListSortMap } from '/@/shared/types/domain/album-domain-types';
|
||||
import { ControllerEndpoint } from '/@/shared/types/domain/api-domain-types';
|
||||
import { albumArtistListSortMap } from '/@/shared/types/domain/artist-domain-types';
|
||||
import { Played } from '/@/shared/types/domain/player-domain-types';
|
||||
import { ServerFeature } from '/@/shared/types/domain/server-domain-types';
|
||||
import { LibraryItem, sortOrderMap } from '/@/shared/types/domain/shared-domain-types';
|
||||
import { Song, songListSortMap } from '/@/shared/types/domain/song-domain-types';
|
||||
|
||||
const formatCommaDelimitedString = (value: string[]) => {
|
||||
return value.join(',');
|
||||
@@ -290,19 +284,32 @@ export const JellyfinController: ControllerEndpoint = {
|
||||
|
||||
const yearsFilter = yearsGroup.length ? yearsGroup.join(',') : undefined;
|
||||
|
||||
let artistQuery:
|
||||
| Omit<z.infer<typeof jfType._parameters.albumList>, 'IncludeItemTypes'>
|
||||
| undefined;
|
||||
|
||||
if (query.artistIds) {
|
||||
// Based mostly off of observation, this is the behavior I've seen:
|
||||
// ContributingArtistIds is the _closest_ to where the album is a compilation and the artist is involved
|
||||
// AlbumArtistIds is where the artist is an album artist
|
||||
// ArtistIds is all credits
|
||||
if (query.compilation) {
|
||||
artistQuery = {
|
||||
ContributingArtistIds: formatCommaDelimitedString(query.artistIds),
|
||||
};
|
||||
} else if (query.compilation === false) {
|
||||
artistQuery = { AlbumArtistIds: formatCommaDelimitedString(query.artistIds) };
|
||||
} else {
|
||||
artistQuery = { ArtistIds: formatCommaDelimitedString(query.artistIds) };
|
||||
}
|
||||
}
|
||||
|
||||
const res = await jfApiClient(apiClientProps).getAlbumList({
|
||||
params: {
|
||||
userId: apiClientProps.server?.userId,
|
||||
},
|
||||
query: {
|
||||
...(!query.compilation &&
|
||||
query.artistIds && {
|
||||
AlbumArtistIds: formatCommaDelimitedString(query.artistIds),
|
||||
}),
|
||||
...(query.compilation &&
|
||||
query.artistIds && {
|
||||
ContributingArtistIds: query.artistIds[0],
|
||||
}),
|
||||
...artistQuery,
|
||||
Fields: 'People, Tags',
|
||||
GenreIds: query.genres ? query.genres.join(',') : undefined,
|
||||
IncludeItemTypes: 'MusicAlbum',
|
||||
@@ -313,7 +320,7 @@ export const JellyfinController: ControllerEndpoint = {
|
||||
SearchTerm: query.searchTerm,
|
||||
SortBy: albumListSortMap.jellyfin[query.sortBy] || 'SortName',
|
||||
SortOrder: sortOrderMap.jellyfin[query.sortOrder],
|
||||
StartIndex: query.startIndex,
|
||||
StartIndex: query.offset,
|
||||
...query._custom?.jellyfin,
|
||||
Years: yearsFilter,
|
||||
},
|
||||
@@ -325,14 +332,14 @@ export const JellyfinController: ControllerEndpoint = {
|
||||
|
||||
return {
|
||||
items: res.body.Items.map((item) => jfNormalize.album(item, apiClientProps.server)),
|
||||
startIndex: query.startIndex,
|
||||
offset: query.offset,
|
||||
totalRecordCount: res.body.TotalRecordCount,
|
||||
};
|
||||
},
|
||||
getAlbumListCount: async ({ apiClientProps, query }) =>
|
||||
JellyfinController.getAlbumList({
|
||||
apiClientProps,
|
||||
query: { ...query, limit: 1, startIndex: 0 },
|
||||
query: { ...query, limit: 1, offset: 0 },
|
||||
}).then((result) => result!.totalRecordCount!),
|
||||
getArtistList: async (args) => {
|
||||
const { apiClientProps, query } = args;
|
||||
@@ -347,7 +354,7 @@ export const JellyfinController: ControllerEndpoint = {
|
||||
SearchTerm: query.searchTerm,
|
||||
SortBy: albumArtistListSortMap.jellyfin[query.sortBy] || 'SortName,Name',
|
||||
SortOrder: sortOrderMap.jellyfin[query.sortOrder],
|
||||
StartIndex: query.startIndex,
|
||||
StartIndex: query.offset,
|
||||
UserId: apiClientProps.server?.userId || undefined,
|
||||
},
|
||||
});
|
||||
@@ -360,14 +367,14 @@ export const JellyfinController: ControllerEndpoint = {
|
||||
items: res.body.Items.map((item) =>
|
||||
jfNormalize.albumArtist(item, apiClientProps.server),
|
||||
),
|
||||
startIndex: query.startIndex,
|
||||
offset: query.offset,
|
||||
totalRecordCount: res.body.TotalRecordCount,
|
||||
};
|
||||
},
|
||||
getArtistListCount: async ({ apiClientProps, query }) =>
|
||||
JellyfinController.getArtistList({
|
||||
apiClientProps,
|
||||
query: { ...query, limit: 1, startIndex: 0 },
|
||||
query: { ...query, limit: 1, offset: 0 },
|
||||
}).then((result) => result!.totalRecordCount!),
|
||||
getDownloadUrl: (args) => {
|
||||
const { apiClientProps, query } = args;
|
||||
@@ -389,7 +396,7 @@ export const JellyfinController: ControllerEndpoint = {
|
||||
SearchTerm: query?.searchTerm,
|
||||
SortBy: genreListSortMap.jellyfin[query.sortBy] || 'SortName',
|
||||
SortOrder: sortOrderMap.jellyfin[query.sortOrder],
|
||||
StartIndex: query.startIndex,
|
||||
StartIndex: query.offset,
|
||||
UserId: apiClientProps.server?.userId,
|
||||
},
|
||||
});
|
||||
@@ -400,7 +407,7 @@ export const JellyfinController: ControllerEndpoint = {
|
||||
|
||||
return {
|
||||
items: res.body.Items.map((item) => jfNormalize.genre(item, apiClientProps.server)),
|
||||
startIndex: query.startIndex || 0,
|
||||
offset: query.offset || 0,
|
||||
totalRecordCount: res.body?.TotalRecordCount || 0,
|
||||
};
|
||||
},
|
||||
@@ -449,7 +456,7 @@ export const JellyfinController: ControllerEndpoint = {
|
||||
|
||||
return {
|
||||
items: musicFolders.map(jfNormalize.musicFolder),
|
||||
startIndex: 0,
|
||||
offset: 0,
|
||||
totalRecordCount: musicFolders?.length || 0,
|
||||
};
|
||||
},
|
||||
@@ -496,7 +503,7 @@ export const JellyfinController: ControllerEndpoint = {
|
||||
SearchTerm: query.searchTerm,
|
||||
SortBy: playlistListSortMap.jellyfin[query.sortBy],
|
||||
SortOrder: sortOrderMap.jellyfin[query.sortOrder],
|
||||
StartIndex: query.startIndex,
|
||||
StartIndex: query.offset,
|
||||
},
|
||||
});
|
||||
|
||||
@@ -506,14 +513,14 @@ export const JellyfinController: ControllerEndpoint = {
|
||||
|
||||
return {
|
||||
items: res.body.Items.map((item) => jfNormalize.playlist(item, apiClientProps.server)),
|
||||
startIndex: 0,
|
||||
offset: 0,
|
||||
totalRecordCount: res.body.TotalRecordCount,
|
||||
};
|
||||
},
|
||||
getPlaylistListCount: async ({ apiClientProps, query }) =>
|
||||
JellyfinController.getPlaylistList({
|
||||
apiClientProps,
|
||||
query: { ...query, limit: 1, startIndex: 0 },
|
||||
query: { ...query, limit: 1, offset: 0 },
|
||||
}).then((result) => result!.totalRecordCount!),
|
||||
getPlaylistSongList: async (args) => {
|
||||
const { apiClientProps, query } = args;
|
||||
@@ -543,7 +550,7 @@ export const JellyfinController: ControllerEndpoint = {
|
||||
|
||||
return {
|
||||
items: res.body.Items.map((item) => jfNormalize.song(item, apiClientProps.server, '')),
|
||||
startIndex: query.startIndex,
|
||||
offset: query.startIndex,
|
||||
totalRecordCount: res.body.TotalRecordCount,
|
||||
};
|
||||
},
|
||||
@@ -593,7 +600,7 @@ export const JellyfinController: ControllerEndpoint = {
|
||||
|
||||
return {
|
||||
items: res.body.Items.map((item) => jfNormalize.song(item, apiClientProps.server, '')),
|
||||
startIndex: 0,
|
||||
offset: 0,
|
||||
totalRecordCount: res.body.Items.length || 0,
|
||||
};
|
||||
},
|
||||
@@ -733,7 +740,7 @@ export const JellyfinController: ControllerEndpoint = {
|
||||
SearchTerm: query.searchTerm,
|
||||
SortBy: songListSortMap.jellyfin[query.sortBy] || 'Album,SortName',
|
||||
SortOrder: sortOrderMap.jellyfin[query.sortOrder],
|
||||
StartIndex: query.startIndex,
|
||||
StartIndex: query.offset,
|
||||
...query._custom?.jellyfin,
|
||||
Years: yearsFilter,
|
||||
},
|
||||
@@ -768,7 +775,7 @@ export const JellyfinController: ControllerEndpoint = {
|
||||
SearchTerm: query.searchTerm,
|
||||
SortBy: songListSortMap.jellyfin[query.sortBy] || 'Album,SortName',
|
||||
SortOrder: sortOrderMap.jellyfin[query.sortOrder],
|
||||
StartIndex: query.startIndex,
|
||||
StartIndex: query.offset,
|
||||
...query._custom?.jellyfin,
|
||||
Years: yearsFilter,
|
||||
},
|
||||
@@ -797,14 +804,14 @@ export const JellyfinController: ControllerEndpoint = {
|
||||
items: items.map((item) =>
|
||||
jfNormalize.song(item, apiClientProps.server, '', query.imageSize),
|
||||
),
|
||||
startIndex: query.startIndex,
|
||||
offset: query.offset,
|
||||
totalRecordCount,
|
||||
};
|
||||
},
|
||||
getSongListCount: async ({ apiClientProps, query }) =>
|
||||
JellyfinController.getSongList({
|
||||
apiClientProps,
|
||||
query: { ...query, limit: 1, startIndex: 0 },
|
||||
query: { ...query, limit: 1, offset: 0 },
|
||||
}).then((result) => result!.totalRecordCount!),
|
||||
getTags: async (args) => {
|
||||
const { apiClientProps, query } = args;
|
||||
@@ -860,7 +867,7 @@ export const JellyfinController: ControllerEndpoint = {
|
||||
|
||||
return {
|
||||
items: res.body.Items.map((item) => jfNormalize.song(item, apiClientProps.server, '')),
|
||||
startIndex: 0,
|
||||
offset: 0,
|
||||
totalRecordCount: res.body.TotalRecordCount,
|
||||
};
|
||||
},
|
||||
|
||||
@@ -11,7 +11,7 @@ import { useAuthStore } from '/@/renderer/store';
|
||||
import { ndType } from '/@/shared/api/navidrome/navidrome-types';
|
||||
import { resultWithHeaders } from '/@/shared/api/utils';
|
||||
import { toast } from '/@/shared/components/toast/toast';
|
||||
import { ServerListItem } from '/@/shared/types/domain-types';
|
||||
import { ServerListItem } from '/@/shared/types/domain/server-domain-types';
|
||||
|
||||
const localSettings = isElectron() ? window.api.localSettings : null;
|
||||
|
||||
@@ -349,7 +349,14 @@ axiosClient.interceptors.response.use(
|
||||
.catch((newError: any) => {
|
||||
if (newError !== TIMEOUT_ERROR) {
|
||||
console.error('Error when trying to reauthenticate: ', newError);
|
||||
limitedFail(currentServer);
|
||||
|
||||
if (isAxiosError(newError) && newError.code === 'ERR_NETWORK') {
|
||||
console.log(
|
||||
'Network error during reauthentication - preserving credentials',
|
||||
);
|
||||
} else {
|
||||
limitedFail(currentServer);
|
||||
}
|
||||
}
|
||||
|
||||
// make sure to pass the error so axios will error later on
|
||||
@@ -360,7 +367,11 @@ axiosClient.interceptors.response.use(
|
||||
});
|
||||
}
|
||||
|
||||
limitedFail(currentServer);
|
||||
if (isAxiosError(error) && error.code === 'ERR_NETWORK') {
|
||||
console.log('Network error during authentication - preserving credentials');
|
||||
} else {
|
||||
limitedFail(currentServer);
|
||||
}
|
||||
}
|
||||
|
||||
return Promise.reject(error);
|
||||
|
||||
@@ -4,25 +4,24 @@ import { SubsonicController } from '/@/renderer/api/subsonic/subsonic-controller
|
||||
import { NDSongListSort } from '/@/shared/api/navidrome.types';
|
||||
import { ndNormalize } from '/@/shared/api/navidrome/navidrome-normalize';
|
||||
import { ndType } from '/@/shared/api/navidrome/navidrome-types';
|
||||
import { ssNormalize } from '/@/shared/api/subsonic/subsonic-normalize';
|
||||
import { normalize } from '/@/shared/api/subsonic/subsonic-normalize';
|
||||
import { SubsonicExtensions } from '/@/shared/api/subsonic/subsonic-types';
|
||||
import { getFeatures, hasFeature, VersionInfo } from '/@/shared/api/utils';
|
||||
import { albumListSortMap } from '/@/shared/types/domain/album-domain-types';
|
||||
import { ControllerEndpoint } from '/@/shared/types/domain/api-domain-types';
|
||||
import { albumArtistListSortMap } from '/@/shared/types/domain/artist-domain-types';
|
||||
import { AuthenticationResponse } from '/@/shared/types/domain/auth-domain-types';
|
||||
import {
|
||||
albumArtistListSortMap,
|
||||
albumListSortMap,
|
||||
AuthenticationResponse,
|
||||
ControllerEndpoint,
|
||||
genreListSortMap,
|
||||
playlistListSortMap,
|
||||
PlaylistSongListArgs,
|
||||
PlaylistSongListRequest,
|
||||
PlaylistSongListResponse,
|
||||
} from '/@/shared/types/domain/playlist-domain-types';
|
||||
import {
|
||||
ServerFeature,
|
||||
ServerFeatures,
|
||||
ServerListItem,
|
||||
Song,
|
||||
songListSortMap,
|
||||
sortOrderMap,
|
||||
userListSortMap,
|
||||
} from '/@/shared/types/domain-types';
|
||||
import { ServerFeature, ServerFeatures } from '/@/shared/types/features-types';
|
||||
} from '/@/shared/types/domain/server-domain-types';
|
||||
import { sortOrderMap } from '/@/shared/types/domain/shared-domain-types';
|
||||
import { Song, songListSortMap } from '/@/shared/types/domain/song-domain-types';
|
||||
|
||||
const VERSION_INFO: VersionInfo = [
|
||||
['0.55.0', { [ServerFeature.BFR]: [1] }],
|
||||
@@ -187,6 +186,7 @@ export const NavidromeController: ControllerEndpoint = {
|
||||
name: query.searchTerm,
|
||||
...query._custom?.navidrome,
|
||||
role: hasFeature(apiClientProps.server, ServerFeature.BFR) ? 'albumartist' : '',
|
||||
...excludeMissing(apiClientProps.server),
|
||||
},
|
||||
});
|
||||
|
||||
@@ -232,6 +232,7 @@ export const NavidromeController: ControllerEndpoint = {
|
||||
_sort: NDSongListSort.ALBUM,
|
||||
_start: 0,
|
||||
album_id: [query.id],
|
||||
...excludeMissing(apiClientProps.server),
|
||||
},
|
||||
});
|
||||
|
||||
@@ -269,10 +270,10 @@ export const NavidromeController: ControllerEndpoint = {
|
||||
|
||||
const res = await ndApiClient(apiClientProps).getAlbumList({
|
||||
query: {
|
||||
_end: query.startIndex + (query.limit || 0),
|
||||
_end: query.offset + (query.limit || 0),
|
||||
_order: sortOrderMap.navidrome[query.sortOrder],
|
||||
_sort: albumListSortMap.navidrome[query.sortBy],
|
||||
_start: query.startIndex,
|
||||
_start: query.offset,
|
||||
artist_id: query.artistIds?.[0],
|
||||
compilation: query.compilation,
|
||||
genre_id: query.genres?.[0],
|
||||
@@ -289,27 +290,28 @@ export const NavidromeController: ControllerEndpoint = {
|
||||
|
||||
return {
|
||||
items: res.body.data.map((album) => ndNormalize.album(album, apiClientProps.server)),
|
||||
startIndex: query?.startIndex || 0,
|
||||
offset: query?.offset || 0,
|
||||
totalRecordCount: Number(res.body.headers.get('x-total-count') || 0),
|
||||
};
|
||||
},
|
||||
getAlbumListCount: async ({ apiClientProps, query }) =>
|
||||
NavidromeController.getAlbumList({
|
||||
apiClientProps,
|
||||
query: { ...query, limit: 1, startIndex: 0 },
|
||||
query: { ...query, limit: 1, offset: 0 },
|
||||
}).then((result) => result!.totalRecordCount!),
|
||||
getArtistList: async (args) => {
|
||||
const { apiClientProps, query } = args;
|
||||
|
||||
const res = await ndApiClient(apiClientProps).getAlbumArtistList({
|
||||
query: {
|
||||
_end: query.startIndex + (query.limit || 0),
|
||||
_end: query.offset + (query.limit || 0),
|
||||
_order: sortOrderMap.navidrome[query.sortOrder],
|
||||
_sort: albumArtistListSortMap.navidrome[query.sortBy],
|
||||
_start: query.startIndex,
|
||||
_start: query.offset,
|
||||
name: query.searchTerm,
|
||||
...query._custom?.navidrome,
|
||||
role: query.role || undefined,
|
||||
...excludeMissing(apiClientProps.server),
|
||||
},
|
||||
});
|
||||
|
||||
@@ -330,14 +332,14 @@ export const NavidromeController: ControllerEndpoint = {
|
||||
apiClientProps.server,
|
||||
),
|
||||
),
|
||||
startIndex: query.startIndex,
|
||||
offset: query.offset,
|
||||
totalRecordCount: Number(res.body.headers.get('x-total-count') || 0),
|
||||
};
|
||||
},
|
||||
getArtistListCount: async ({ apiClientProps, query }) =>
|
||||
NavidromeController.getArtistList({
|
||||
apiClientProps,
|
||||
query: { ...query, limit: 1, startIndex: 0 },
|
||||
query: { ...query, limit: 1, offset: 0 },
|
||||
}).then((result) => result!.totalRecordCount!),
|
||||
getDownloadUrl: SubsonicController.getDownloadUrl,
|
||||
getGenreList: async (args) => {
|
||||
@@ -345,10 +347,10 @@ export const NavidromeController: ControllerEndpoint = {
|
||||
|
||||
const res = await ndApiClient(apiClientProps).getGenreList({
|
||||
query: {
|
||||
_end: query.startIndex + (query.limit || 0),
|
||||
_end: query.offset + (query.limit || 0),
|
||||
_order: sortOrderMap.navidrome[query.sortOrder],
|
||||
_sort: genreListSortMap.navidrome[query.sortBy],
|
||||
_start: query.startIndex,
|
||||
_start: query.offset,
|
||||
name: query.searchTerm,
|
||||
},
|
||||
});
|
||||
@@ -359,7 +361,7 @@ export const NavidromeController: ControllerEndpoint = {
|
||||
|
||||
return {
|
||||
items: res.body.data.map((genre) => ndNormalize.genre(genre)),
|
||||
startIndex: query.startIndex || 0,
|
||||
offset: query.offset || 0,
|
||||
totalRecordCount: Number(res.body.headers.get('x-total-count') || 0),
|
||||
};
|
||||
},
|
||||
@@ -395,10 +397,10 @@ export const NavidromeController: ControllerEndpoint = {
|
||||
|
||||
const res = await ndApiClient(apiClientProps).getPlaylistList({
|
||||
query: {
|
||||
_end: query.startIndex + (query.limit || 0),
|
||||
_end: query.offset + (query.limit || 0),
|
||||
_order: sortOrderMap.navidrome[query.sortOrder],
|
||||
_sort: query.sortBy ? playlistListSortMap.navidrome[query.sortBy] : undefined,
|
||||
_start: query.startIndex,
|
||||
_start: query.offset,
|
||||
q: query.searchTerm,
|
||||
...customQuery,
|
||||
},
|
||||
@@ -410,16 +412,18 @@ export const NavidromeController: ControllerEndpoint = {
|
||||
|
||||
return {
|
||||
items: res.body.data.map((item) => ndNormalize.playlist(item, apiClientProps.server)),
|
||||
startIndex: query?.startIndex || 0,
|
||||
offset: query?.offset || 0,
|
||||
totalRecordCount: Number(res.body.headers.get('x-total-count') || 0),
|
||||
};
|
||||
},
|
||||
getPlaylistListCount: async ({ apiClientProps, query }) =>
|
||||
NavidromeController.getPlaylistList({
|
||||
apiClientProps,
|
||||
query: { ...query, limit: 1, startIndex: 0 },
|
||||
query: { ...query, limit: 1, offset: 0 },
|
||||
}).then((result) => result!.totalRecordCount!),
|
||||
getPlaylistSongList: async (args: PlaylistSongListArgs): Promise<PlaylistSongListResponse> => {
|
||||
getPlaylistSongList: async (
|
||||
args: PlaylistSongListRequest,
|
||||
): Promise<PlaylistSongListResponse> => {
|
||||
const { apiClientProps, query } = args;
|
||||
|
||||
const res = await ndApiClient(apiClientProps).getPlaylistSongList({
|
||||
@@ -433,6 +437,7 @@ export const NavidromeController: ControllerEndpoint = {
|
||||
? songListSortMap.navidrome[query.sortBy]
|
||||
: ndType._enum.songList.ID,
|
||||
_start: query.startIndex,
|
||||
...excludeMissing(apiClientProps.server),
|
||||
},
|
||||
});
|
||||
|
||||
@@ -442,7 +447,7 @@ export const NavidromeController: ControllerEndpoint = {
|
||||
|
||||
return {
|
||||
items: res.body.data.map((item) => ndNormalize.song(item, apiClientProps.server)),
|
||||
startIndex: query?.startIndex || 0,
|
||||
offset: query?.startIndex || 0,
|
||||
totalRecordCount: Number(res.body.headers.get('x-total-count') || 0),
|
||||
};
|
||||
},
|
||||
@@ -514,7 +519,7 @@ export const NavidromeController: ControllerEndpoint = {
|
||||
if (res.status === 200 && res.body.similarSongs?.song) {
|
||||
const similar = res.body.similarSongs.song.reduce<Song[]>((acc, song) => {
|
||||
if (song.id !== query.songId) {
|
||||
acc.push(ssNormalize.song(song, apiClientProps.server));
|
||||
acc.push(normalize.song(song, apiClientProps.server));
|
||||
}
|
||||
|
||||
return acc;
|
||||
@@ -532,6 +537,7 @@ export const NavidromeController: ControllerEndpoint = {
|
||||
_sort: NDSongListSort.RANDOM,
|
||||
_start: 0,
|
||||
album_artist_id: query.albumArtistIds,
|
||||
...excludeMissing(apiClientProps.server),
|
||||
},
|
||||
});
|
||||
|
||||
@@ -567,10 +573,10 @@ export const NavidromeController: ControllerEndpoint = {
|
||||
|
||||
const res = await ndApiClient(apiClientProps).getSongList({
|
||||
query: {
|
||||
_end: query.startIndex + (query.limit || -1),
|
||||
_end: query.offset + (query.limit || -1),
|
||||
_order: sortOrderMap.navidrome[query.sortOrder],
|
||||
_sort: songListSortMap.navidrome[query.sortBy],
|
||||
_start: query.startIndex,
|
||||
_start: query.offset,
|
||||
album_artist_id: query.albumArtistIds,
|
||||
album_id: query.albumIds,
|
||||
artist_id: query.artistIds,
|
||||
@@ -590,14 +596,14 @@ export const NavidromeController: ControllerEndpoint = {
|
||||
items: res.body.data.map((song) =>
|
||||
ndNormalize.song(song, apiClientProps.server, query.imageSize),
|
||||
),
|
||||
startIndex: query?.startIndex || 0,
|
||||
offset: query?.offset || 0,
|
||||
totalRecordCount: Number(res.body.headers.get('x-total-count') || 0),
|
||||
};
|
||||
},
|
||||
getSongListCount: async ({ apiClientProps, query }) =>
|
||||
NavidromeController.getSongList({
|
||||
apiClientProps,
|
||||
query: { ...query, limit: 1, startIndex: 0 },
|
||||
query: { ...query, limit: 1, offset: 0 },
|
||||
}).then((result) => result!.totalRecordCount!),
|
||||
getStructuredLyrics: SubsonicController.getStructuredLyrics,
|
||||
getTags: async (args) => {
|
||||
@@ -646,10 +652,10 @@ export const NavidromeController: ControllerEndpoint = {
|
||||
|
||||
const res = await ndApiClient(apiClientProps).getUserList({
|
||||
query: {
|
||||
_end: query.startIndex + (query.limit || 0),
|
||||
_end: query.offset + (query.limit || 0),
|
||||
_order: sortOrderMap.navidrome[query.sortOrder],
|
||||
_sort: userListSortMap.navidrome[query.sortBy],
|
||||
_start: query.startIndex,
|
||||
_start: query.offset,
|
||||
...query._custom?.navidrome,
|
||||
},
|
||||
});
|
||||
@@ -660,7 +666,7 @@ export const NavidromeController: ControllerEndpoint = {
|
||||
|
||||
return {
|
||||
items: res.body.data.map((user) => ndNormalize.user(user)),
|
||||
startIndex: query?.startIndex || 0,
|
||||
offset: query?.offset || 0,
|
||||
totalRecordCount: Number(res.body.headers.get('x-total-count') || 0),
|
||||
};
|
||||
},
|
||||
|
||||
@@ -1,27 +1,31 @@
|
||||
import type {
|
||||
import { QueryFunctionContext } from '@tanstack/react-query';
|
||||
|
||||
import { AlbumDetailQuery, AlbumListQuery } from '/@/shared/types/domain/album-domain-types';
|
||||
import {
|
||||
AlbumArtistDetailQuery,
|
||||
AlbumArtistListQuery,
|
||||
AlbumDetailQuery,
|
||||
AlbumListQuery,
|
||||
ArtistListQuery,
|
||||
GenreListQuery,
|
||||
} from '/@/shared/types/domain/artist-domain-types';
|
||||
import { GenreListQuery } from '/@/shared/types/domain/genre-domain-types';
|
||||
import {
|
||||
LyricSearchQuery,
|
||||
LyricSource,
|
||||
LyricsQuery,
|
||||
} from '/@/shared/types/domain/lyric-domain-types';
|
||||
import {
|
||||
PlaylistDetailQuery,
|
||||
PlaylistListQuery,
|
||||
PlaylistSongListQuery,
|
||||
} from '/@/shared/types/domain/playlist-domain-types';
|
||||
import { SearchQuery } from '/@/shared/types/domain/search-domain-types';
|
||||
import {
|
||||
RandomSongListQuery,
|
||||
SearchQuery,
|
||||
SimilarSongsQuery,
|
||||
SongDetailQuery,
|
||||
SongListQuery,
|
||||
TopSongListQuery,
|
||||
UserListQuery,
|
||||
} from '/@/shared/types/domain-types';
|
||||
|
||||
import { QueryFunctionContext } from '@tanstack/react-query';
|
||||
|
||||
import { LyricSource } from '/@/shared/types/domain-types';
|
||||
} from '/@/shared/types/domain/song-domain-types';
|
||||
import { UserListQuery } from '/@/shared/types/domain/user-domain-types';
|
||||
|
||||
export const splitPaginatedQuery = (key: any) => {
|
||||
const { limit, startIndex, ...filter } = key || {};
|
||||
|
||||
@@ -7,7 +7,7 @@ import { z } from 'zod';
|
||||
import i18n from '/@/i18n/i18n';
|
||||
import { ssType } from '/@/shared/api/subsonic/subsonic-types';
|
||||
import { toast } from '/@/shared/components/toast/toast';
|
||||
import { ServerListItem } from '/@/shared/types/domain-types';
|
||||
import { ServerListItem } from '/@/shared/types/domain/server-domain-types';
|
||||
|
||||
const c = initContract();
|
||||
|
||||
@@ -251,6 +251,9 @@ axiosClient.interceptors.response.use(
|
||||
message: data['subsonic-response'].error.message,
|
||||
title: i18n.t('error.genericError', { postProcess: 'sentenceCase' }) as string,
|
||||
});
|
||||
|
||||
// Since we do status === 200, override this value with the error code
|
||||
response.status = data['subsonic-response'].error.code;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,25 +1,25 @@
|
||||
import type { ServerInferResponses } from '@ts-rest/core';
|
||||
|
||||
import dayjs from 'dayjs';
|
||||
import filter from 'lodash/filter';
|
||||
import orderBy from 'lodash/orderBy';
|
||||
import md5 from 'md5';
|
||||
import { z } from 'zod';
|
||||
|
||||
import { ssApiClient } from '/@/renderer/api/subsonic/subsonic-api';
|
||||
import { contract, ssApiClient } from '/@/renderer/api/subsonic/subsonic-api';
|
||||
import { randomString } from '/@/renderer/utils';
|
||||
import { ssNormalize } from '/@/shared/api/subsonic/subsonic-normalize';
|
||||
import { AlbumListSortType, SubsonicExtensions } from '/@/shared/api/subsonic/subsonic-types';
|
||||
import { normalize } from '/@/shared/api/subsonic/subsonic-normalize';
|
||||
import {
|
||||
AlbumListSort,
|
||||
ControllerEndpoint,
|
||||
GenreListSort,
|
||||
LibraryItem,
|
||||
PlaylistListSort,
|
||||
Song,
|
||||
sortAlbumArtistList,
|
||||
sortAlbumList,
|
||||
SortOrder,
|
||||
sortSongList,
|
||||
} from '/@/shared/types/domain-types';
|
||||
import { ServerFeatures } from '/@/shared/types/features-types';
|
||||
AlbumListSortType,
|
||||
ssType,
|
||||
SubsonicExtensions,
|
||||
} from '/@/shared/api/subsonic/subsonic-types';
|
||||
import { AlbumListSort, sortAlbumList } from '/@/shared/types/domain/album-domain-types';
|
||||
import { ControllerEndpoint } from '/@/shared/types/domain/api-domain-types';
|
||||
import { sortAlbumArtistList } from '/@/shared/types/domain/artist-domain-types';
|
||||
import { ServerFeatures } from '/@/shared/types/domain/server-domain-types';
|
||||
import { LibraryItem, ListSortOrder } from '/@/shared/types/domain/shared-domain-types';
|
||||
import { Song, sortSongList } from '/@/shared/types/domain/song-domain-types';
|
||||
|
||||
const ALBUM_LIST_SORT_MAPPING: Record<AlbumListSort, AlbumListSortType | undefined> = {
|
||||
[AlbumListSort.ALBUM_ARTIST]: AlbumListSortType.ALPHABETICAL_BY_ARTIST,
|
||||
@@ -39,6 +39,10 @@ const ALBUM_LIST_SORT_MAPPING: Record<AlbumListSort, AlbumListSortType | undefin
|
||||
[AlbumListSort.YEAR]: AlbumListSortType.BY_YEAR,
|
||||
};
|
||||
|
||||
const MAX_SUBSONIC_ITEMS = 500;
|
||||
// A trick to skip ahead 10x
|
||||
const SUBSONIC_FAST_BATCH_SIZE = MAX_SUBSONIC_ITEMS * 10;
|
||||
|
||||
export const SubsonicController: ControllerEndpoint = {
|
||||
addToPlaylist: async ({ apiClientProps, body, query }) => {
|
||||
const res = await ssApiClient(apiClientProps).updatePlaylist({
|
||||
@@ -83,7 +87,7 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
};
|
||||
}
|
||||
|
||||
await ssApiClient({ server: null, url: cleanServerUrl }).authenticate({
|
||||
const resp = await ssApiClient({ server: null, url: cleanServerUrl }).authenticate({
|
||||
query: {
|
||||
c: 'Feishin',
|
||||
f: 'json',
|
||||
@@ -92,6 +96,10 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
},
|
||||
});
|
||||
|
||||
if (resp.status !== 200) {
|
||||
throw new Error('Failed to log in');
|
||||
}
|
||||
|
||||
return {
|
||||
credential,
|
||||
userId: null,
|
||||
@@ -190,11 +198,11 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
}
|
||||
|
||||
return {
|
||||
...ssNormalize.albumArtist(artist, apiClientProps.server, 300),
|
||||
albums: artist.album?.map((album) => ssNormalize.album(album, apiClientProps.server)),
|
||||
...normalize.albumArtist(artist, apiClientProps.server, 300),
|
||||
albums: artist.album?.map((album) => normalize.album(album, apiClientProps.server)),
|
||||
similarArtists:
|
||||
artistInfo?.similarArtist?.map((artist) =>
|
||||
ssNormalize.albumArtist(artist, apiClientProps.server, 300),
|
||||
normalize.albumArtist(artist, apiClientProps.server, 300),
|
||||
) || null,
|
||||
};
|
||||
},
|
||||
@@ -214,7 +222,7 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
const artists = (res.body.artists?.index || []).flatMap((index) => index.artist);
|
||||
|
||||
let results = artists.map((artist) =>
|
||||
ssNormalize.albumArtist(artist, apiClientProps.server, 300),
|
||||
normalize.albumArtist(artist, apiClientProps.server, 300),
|
||||
);
|
||||
|
||||
if (query.searchTerm) {
|
||||
@@ -250,7 +258,7 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
throw new Error('Failed to get album detail');
|
||||
}
|
||||
|
||||
return ssNormalize.album(res.body.album, apiClientProps.server);
|
||||
return normalize.album(res.body.album, apiClientProps.server);
|
||||
},
|
||||
getAlbumList: async (args) => {
|
||||
const { apiClientProps, query } = args;
|
||||
@@ -259,10 +267,10 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
const res = await ssApiClient(apiClientProps).search3({
|
||||
query: {
|
||||
albumCount: query.limit,
|
||||
albumOffset: query.startIndex,
|
||||
albumOffset: query.offset,
|
||||
artistCount: 0,
|
||||
artistOffset: 0,
|
||||
query: query.searchTerm || '""',
|
||||
query: query.searchTerm || '',
|
||||
songCount: 0,
|
||||
songOffset: 0,
|
||||
},
|
||||
@@ -274,12 +282,12 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
|
||||
const results =
|
||||
res.body.searchResult3?.album?.map((album) =>
|
||||
ssNormalize.album(album, apiClientProps.server),
|
||||
normalize.album(album, apiClientProps.server),
|
||||
) || [];
|
||||
|
||||
return {
|
||||
items: results,
|
||||
startIndex: query.startIndex,
|
||||
offset: query.offset,
|
||||
totalRecordCount: null,
|
||||
};
|
||||
}
|
||||
@@ -287,7 +295,7 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
let type = ALBUM_LIST_SORT_MAPPING[query.sortBy] ?? AlbumListSortType.ALPHABETICAL_BY_NAME;
|
||||
|
||||
if (query.artistIds) {
|
||||
const promises: any[] = [];
|
||||
const promises: Promise<ServerInferResponses<typeof contract.getArtist>>[] = [];
|
||||
|
||||
for (const artistId of query.artistIds) {
|
||||
promises.push(
|
||||
@@ -309,9 +317,11 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
return artist.body.artist.album ?? [];
|
||||
});
|
||||
|
||||
const items = albums.map((album) => normalize.album(album, apiClientProps.server));
|
||||
|
||||
return {
|
||||
items: albums.map((album) => ssNormalize.album(album, apiClientProps.server)),
|
||||
startIndex: 0,
|
||||
items: sortAlbumList(items, query.sortBy, query.sortOrder),
|
||||
offset: 0,
|
||||
totalRecordCount: albums.length,
|
||||
};
|
||||
}
|
||||
@@ -329,12 +339,12 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
|
||||
const results =
|
||||
res.body.starred?.album?.map((album) =>
|
||||
ssNormalize.album(album, apiClientProps.server),
|
||||
normalize.album(album, apiClientProps.server),
|
||||
) || [];
|
||||
|
||||
return {
|
||||
items: sortAlbumList(results, query.sortBy, query.sortOrder),
|
||||
startIndex: 0,
|
||||
offset: 0,
|
||||
totalRecordCount: res.body.starred?.album?.length || 0,
|
||||
};
|
||||
}
|
||||
@@ -364,7 +374,7 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
}
|
||||
|
||||
if (type === AlbumListSortType.BY_YEAR && !fromYear && !toYear) {
|
||||
if (query.sortOrder === SortOrder.ASC) {
|
||||
if (query.sortOrder === ListSortOrder.ASC) {
|
||||
fromYear = 0;
|
||||
toYear = dayjs().year();
|
||||
} else {
|
||||
@@ -378,7 +388,7 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
fromYear,
|
||||
genre: query.genres?.length ? query.genres[0] : undefined,
|
||||
musicFolderId: query.musicFolderId,
|
||||
offset: query.startIndex,
|
||||
offset: query.offset,
|
||||
size: query.limit,
|
||||
toYear,
|
||||
type,
|
||||
@@ -392,14 +402,155 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
return {
|
||||
items:
|
||||
res.body.albumList2.album?.map((album) =>
|
||||
ssNormalize.album(album, apiClientProps.server, 300),
|
||||
normalize.album(album, apiClientProps.server, 300),
|
||||
) || [],
|
||||
startIndex: query.startIndex,
|
||||
offset: query.offset,
|
||||
totalRecordCount: null,
|
||||
};
|
||||
},
|
||||
getAlbumListCount: async (args) =>
|
||||
SubsonicController.getAlbumList(args).then((res) => res!.totalRecordCount!),
|
||||
getAlbumListCount: async (args) => {
|
||||
const { apiClientProps, query } = args;
|
||||
|
||||
if (query.searchTerm) {
|
||||
let fetchNextPage = true;
|
||||
let startIndex = 0;
|
||||
let totalRecordCount = 0;
|
||||
|
||||
while (fetchNextPage) {
|
||||
const res = await ssApiClient(apiClientProps).search3({
|
||||
query: {
|
||||
albumCount: MAX_SUBSONIC_ITEMS,
|
||||
albumOffset: startIndex,
|
||||
artistCount: 0,
|
||||
artistOffset: 0,
|
||||
query: query.searchTerm || '',
|
||||
songCount: 0,
|
||||
songOffset: 0,
|
||||
},
|
||||
});
|
||||
|
||||
if (res.status !== 200) {
|
||||
throw new Error('Failed to get album list count');
|
||||
}
|
||||
|
||||
const albumCount = (res.body.searchResult3?.album || [])?.length;
|
||||
|
||||
totalRecordCount += albumCount;
|
||||
startIndex += albumCount;
|
||||
|
||||
fetchNextPage = albumCount === MAX_SUBSONIC_ITEMS;
|
||||
}
|
||||
|
||||
return totalRecordCount;
|
||||
}
|
||||
|
||||
if (query.artistIds) {
|
||||
const promises: Promise<ServerInferResponses<typeof contract.getArtist>>[] = [];
|
||||
|
||||
for (const artistId of query.artistIds) {
|
||||
promises.push(
|
||||
ssApiClient(apiClientProps).getArtist({
|
||||
query: {
|
||||
id: artistId,
|
||||
},
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
const artistResult = await Promise.all(promises);
|
||||
|
||||
const albums = artistResult.reduce((total: number, artist) => {
|
||||
if (artist.status !== 200) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
const length = artist.body.artist.album?.length ?? 0;
|
||||
return length + total;
|
||||
}, 0);
|
||||
|
||||
return albums;
|
||||
}
|
||||
|
||||
if (query.favorite) {
|
||||
const res = await ssApiClient(apiClientProps).getStarred({
|
||||
query: {
|
||||
musicFolderId: query.musicFolderId,
|
||||
},
|
||||
});
|
||||
|
||||
if (res.status !== 200) {
|
||||
throw new Error('Failed to get album list');
|
||||
}
|
||||
|
||||
return (res.body.starred?.album || []).length || 0;
|
||||
}
|
||||
|
||||
let type = AlbumListSortType.ALPHABETICAL_BY_NAME;
|
||||
|
||||
let fetchNextPage = true;
|
||||
let startIndex = 0;
|
||||
let totalRecordCount = 0;
|
||||
|
||||
if (query.genres?.length) {
|
||||
type = AlbumListSortType.BY_GENRE;
|
||||
}
|
||||
|
||||
if (query.minYear || query.maxYear) {
|
||||
type = AlbumListSortType.BY_YEAR;
|
||||
}
|
||||
|
||||
let fromYear: number | undefined;
|
||||
let toYear: number | undefined;
|
||||
|
||||
if (query.minYear) {
|
||||
fromYear = query.minYear;
|
||||
toYear = dayjs().year();
|
||||
}
|
||||
|
||||
if (query.maxYear) {
|
||||
toYear = query.maxYear;
|
||||
|
||||
if (!query.minYear) {
|
||||
fromYear = 0;
|
||||
}
|
||||
}
|
||||
|
||||
while (fetchNextPage) {
|
||||
const res = await ssApiClient(apiClientProps).getAlbumList2({
|
||||
query: {
|
||||
fromYear,
|
||||
genre: query.genres?.length ? query.genres[0] : undefined,
|
||||
musicFolderId: query.musicFolderId,
|
||||
offset: startIndex,
|
||||
size: MAX_SUBSONIC_ITEMS,
|
||||
toYear,
|
||||
type,
|
||||
},
|
||||
});
|
||||
|
||||
const headers = res.headers;
|
||||
|
||||
// Navidrome returns the total count in the header
|
||||
if (headers.get('x-total-count')) {
|
||||
fetchNextPage = false;
|
||||
totalRecordCount = Number(headers.get('x-total-count'));
|
||||
break;
|
||||
}
|
||||
|
||||
if (res.status !== 200) {
|
||||
throw new Error('Failed to get album list count');
|
||||
}
|
||||
|
||||
const albumCount = res.body.albumList2.album.length;
|
||||
|
||||
totalRecordCount += albumCount;
|
||||
startIndex += albumCount;
|
||||
|
||||
fetchNextPage = albumCount === MAX_SUBSONIC_ITEMS;
|
||||
}
|
||||
|
||||
return totalRecordCount;
|
||||
},
|
||||
getArtistList: async (args) => {
|
||||
const { apiClientProps, query } = args;
|
||||
|
||||
@@ -421,7 +572,7 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
}
|
||||
|
||||
let results = artists.map((artist) =>
|
||||
ssNormalize.albumArtist(artist, apiClientProps.server, 300),
|
||||
normalize.albumArtist(artist, apiClientProps.server, 300),
|
||||
);
|
||||
|
||||
if (query.searchTerm) {
|
||||
@@ -438,7 +589,7 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
|
||||
return {
|
||||
items: results,
|
||||
startIndex: query.startIndex,
|
||||
offset: query.offset,
|
||||
totalRecordCount: results?.length || 0,
|
||||
};
|
||||
},
|
||||
@@ -482,11 +633,11 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
break;
|
||||
}
|
||||
|
||||
const genres = results.map(ssNormalize.genre);
|
||||
const genres = results.map(normalize.genre);
|
||||
|
||||
return {
|
||||
items: genres,
|
||||
startIndex: 0,
|
||||
offset: 0,
|
||||
totalRecordCount: genres.length,
|
||||
};
|
||||
},
|
||||
@@ -504,7 +655,7 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
id: folder.id.toString(),
|
||||
name: folder.name,
|
||||
})),
|
||||
startIndex: 0,
|
||||
offset: 0,
|
||||
totalRecordCount: res.body.musicFolders.musicFolder.length,
|
||||
};
|
||||
},
|
||||
@@ -521,7 +672,7 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
throw new Error('Failed to get playlist detail');
|
||||
}
|
||||
|
||||
return ssNormalize.playlist(res.body.playlist, apiClientProps.server);
|
||||
return normalize.playlist(res.body.playlist, apiClientProps.server);
|
||||
},
|
||||
getPlaylistList: async ({ apiClientProps, query }) => {
|
||||
const sortOrder = query.sortOrder.toLowerCase() as 'asc' | 'desc';
|
||||
@@ -566,8 +717,8 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
}
|
||||
|
||||
return {
|
||||
items: results.map((playlist) => ssNormalize.playlist(playlist, apiClientProps.server)),
|
||||
startIndex: 0,
|
||||
items: results.map((playlist) => normalize.playlist(playlist, apiClientProps.server)),
|
||||
offset: 0,
|
||||
totalRecordCount: results.length,
|
||||
};
|
||||
},
|
||||
@@ -602,7 +753,7 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
}
|
||||
|
||||
let results =
|
||||
res.body.playlist.entry?.map((song) => ssNormalize.song(song, apiClientProps.server)) ||
|
||||
res.body.playlist.entry?.map((song) => normalize.song(song, apiClientProps.server)) ||
|
||||
[];
|
||||
|
||||
if (query.sortBy && query.sortOrder) {
|
||||
@@ -611,7 +762,7 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
|
||||
return {
|
||||
items: results,
|
||||
startIndex: 0,
|
||||
offset: 0,
|
||||
totalRecordCount: results?.length || 0,
|
||||
};
|
||||
},
|
||||
@@ -635,8 +786,8 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
const results = res.body.randomSongs?.song || [];
|
||||
|
||||
return {
|
||||
items: results.map((song) => ssNormalize.song(song, apiClientProps.server)),
|
||||
startIndex: 0,
|
||||
items: results.map((song) => normalize.song(song, apiClientProps.server)),
|
||||
offset: 0,
|
||||
totalRecordCount: res.body.randomSongs?.song?.length || 0,
|
||||
};
|
||||
},
|
||||
@@ -720,7 +871,7 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
|
||||
return res.body.similarSongs.song.reduce<Song[]>((acc, song) => {
|
||||
if (song.id !== query.songId) {
|
||||
acc.push(ssNormalize.song(song, apiClientProps.server));
|
||||
acc.push(normalize.song(song, apiClientProps.server));
|
||||
}
|
||||
|
||||
return acc;
|
||||
@@ -739,12 +890,11 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
throw new Error('Failed to get song detail');
|
||||
}
|
||||
|
||||
return ssNormalize.song(res.body.song, apiClientProps.server);
|
||||
return normalize.song(res.body.song, apiClientProps.server);
|
||||
},
|
||||
getSongList: async ({ apiClientProps, query }) => {
|
||||
const fromAlbumPromises: any[] = [];
|
||||
const artistDetailPromises: any[] = [];
|
||||
let results: any[] = [];
|
||||
const fromAlbumPromises: Promise<ServerInferResponses<typeof contract.getAlbum>>[] = [];
|
||||
const artistDetailPromises: Promise<ServerInferResponses<typeof contract.getArtist>>[] = [];
|
||||
|
||||
if (query.searchTerm) {
|
||||
const res = await ssApiClient(apiClientProps).search3({
|
||||
@@ -753,9 +903,9 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
albumOffset: 0,
|
||||
artistCount: 0,
|
||||
artistOffset: 0,
|
||||
query: query.searchTerm || '""',
|
||||
query: query.searchTerm || '',
|
||||
songCount: query.limit,
|
||||
songOffset: query.startIndex,
|
||||
songOffset: query.offset,
|
||||
},
|
||||
});
|
||||
|
||||
@@ -766,9 +916,9 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
return {
|
||||
items:
|
||||
res.body.searchResult3?.song?.map((song) =>
|
||||
ssNormalize.song(song, apiClientProps.server),
|
||||
normalize.song(song, apiClientProps.server),
|
||||
) || [],
|
||||
startIndex: query.startIndex,
|
||||
offset: query.offset,
|
||||
totalRecordCount: null,
|
||||
};
|
||||
}
|
||||
@@ -779,7 +929,7 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
count: query.limit,
|
||||
genre: query.genreIds[0],
|
||||
musicFolderId: query.musicFolderId,
|
||||
offset: query.startIndex,
|
||||
offset: query.offset,
|
||||
},
|
||||
});
|
||||
|
||||
@@ -790,8 +940,8 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
const results = res.body.songsByGenre?.song || [];
|
||||
|
||||
return {
|
||||
items: results.map((song) => ssNormalize.song(song, apiClientProps.server)) || [],
|
||||
startIndex: 0,
|
||||
items: results.map((song) => normalize.song(song, apiClientProps.server)) || [],
|
||||
offset: 0,
|
||||
totalRecordCount: null,
|
||||
};
|
||||
}
|
||||
@@ -809,12 +959,12 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
|
||||
const results =
|
||||
(res.body.starred?.song || []).map((song) =>
|
||||
ssNormalize.song(song, apiClientProps.server),
|
||||
normalize.song(song, apiClientProps.server),
|
||||
) || [];
|
||||
|
||||
return {
|
||||
items: sortSongList(results, query.sortBy, query.sortOrder),
|
||||
startIndex: 0,
|
||||
offset: 0,
|
||||
totalRecordCount: (res.body.starred?.song || []).length || 0,
|
||||
};
|
||||
}
|
||||
@@ -868,6 +1018,8 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
}
|
||||
}
|
||||
|
||||
let results: z.infer<typeof ssType._response.song>[] = [];
|
||||
|
||||
if (fromAlbumPromises) {
|
||||
const albumsResult = await Promise.all(fromAlbumPromises);
|
||||
|
||||
@@ -881,8 +1033,8 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
}
|
||||
|
||||
return {
|
||||
items: results.map((song) => ssNormalize.song(song, apiClientProps.server)),
|
||||
startIndex: 0,
|
||||
items: results.map((song) => normalize.song(song, apiClientProps.server)),
|
||||
offset: 0,
|
||||
totalRecordCount: results.length,
|
||||
};
|
||||
}
|
||||
@@ -893,9 +1045,9 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
albumOffset: 0,
|
||||
artistCount: 0,
|
||||
artistOffset: 0,
|
||||
query: query.searchTerm || '""',
|
||||
query: query.searchTerm || '',
|
||||
songCount: query.limit,
|
||||
songOffset: query.startIndex,
|
||||
songOffset: query.offset,
|
||||
},
|
||||
});
|
||||
|
||||
@@ -906,9 +1058,9 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
return {
|
||||
items:
|
||||
res.body.searchResult3?.song?.map((song) =>
|
||||
ssNormalize.song(song, apiClientProps.server),
|
||||
normalize.song(song, apiClientProps.server),
|
||||
) || [],
|
||||
startIndex: 0,
|
||||
offset: 0,
|
||||
totalRecordCount: null,
|
||||
};
|
||||
},
|
||||
@@ -933,8 +1085,8 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
albumOffset: 0,
|
||||
artistCount: 0,
|
||||
artistOffset: 0,
|
||||
query: query.searchTerm || '""',
|
||||
songCount: 500,
|
||||
query: query.searchTerm || '',
|
||||
songCount: MAX_SUBSONIC_ITEMS,
|
||||
songOffset: startIndex,
|
||||
},
|
||||
});
|
||||
@@ -948,8 +1100,7 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
totalRecordCount += songCount;
|
||||
startIndex += songCount;
|
||||
|
||||
// The max limit size for Subsonic is 500
|
||||
fetchNextPage = songCount === 500;
|
||||
fetchNextPage = songCount === MAX_SUBSONIC_ITEMS;
|
||||
}
|
||||
|
||||
return totalRecordCount;
|
||||
@@ -957,6 +1108,10 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
|
||||
if (query.genreIds) {
|
||||
let totalRecordCount = 0;
|
||||
|
||||
// Rather than just do `getSongsByGenre` by groups of 500, instead
|
||||
// jump the offset 10x, and then backtrack on the last chunk. This improves
|
||||
// performance for extremely large libraries
|
||||
while (fetchNextSection) {
|
||||
const res = await ssApiClient(apiClientProps).getSongsByGenre({
|
||||
query: {
|
||||
@@ -975,17 +1130,17 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
|
||||
if (numberOfResults !== 1) {
|
||||
fetchNextSection = false;
|
||||
startIndex = sectionIndex === 0 ? 0 : sectionIndex - 5000;
|
||||
startIndex = sectionIndex === 0 ? 0 : sectionIndex - SUBSONIC_FAST_BATCH_SIZE;
|
||||
break;
|
||||
} else {
|
||||
sectionIndex += 5000;
|
||||
sectionIndex += SUBSONIC_FAST_BATCH_SIZE;
|
||||
}
|
||||
}
|
||||
|
||||
while (fetchNextPage) {
|
||||
const res = await ssApiClient(apiClientProps).getSongsByGenre({
|
||||
query: {
|
||||
count: 500,
|
||||
count: MAX_SUBSONIC_ITEMS,
|
||||
genre: query.genreIds[0],
|
||||
musicFolderId: query.musicFolderId,
|
||||
offset: startIndex,
|
||||
@@ -1001,7 +1156,7 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
totalRecordCount = startIndex + numberOfResults;
|
||||
startIndex += numberOfResults;
|
||||
|
||||
fetchNextPage = numberOfResults === 500;
|
||||
fetchNextPage = numberOfResults === MAX_SUBSONIC_ITEMS;
|
||||
}
|
||||
|
||||
return totalRecordCount;
|
||||
@@ -1023,6 +1178,9 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
|
||||
let totalRecordCount = 0;
|
||||
|
||||
// Rather than just do `search3` by groups of 500, instead
|
||||
// jump the offset 10x, and then backtrack on the last chunk. This improves
|
||||
// performance for extremely large libraries
|
||||
while (fetchNextSection) {
|
||||
const res = await ssApiClient(apiClientProps).search3({
|
||||
query: {
|
||||
@@ -1030,7 +1188,7 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
albumOffset: 0,
|
||||
artistCount: 0,
|
||||
artistOffset: 0,
|
||||
query: query.searchTerm || '""',
|
||||
query: query.searchTerm || '',
|
||||
songCount: 1,
|
||||
songOffset: sectionIndex,
|
||||
},
|
||||
@@ -1042,13 +1200,12 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
|
||||
const numberOfResults = (res.body.searchResult3?.song || []).length || 0;
|
||||
|
||||
// Check each batch of 5000 songs to check for data
|
||||
sectionIndex += 5000;
|
||||
fetchNextSection = numberOfResults === 1;
|
||||
|
||||
if (!fetchNextSection) {
|
||||
// fetchNextBlock will be false on the next loop so we need to subtract 5000 * 2
|
||||
startIndex = sectionIndex - 10000;
|
||||
if (numberOfResults !== 1) {
|
||||
fetchNextSection = false;
|
||||
startIndex = sectionIndex === 0 ? 0 : sectionIndex - SUBSONIC_FAST_BATCH_SIZE;
|
||||
break;
|
||||
} else {
|
||||
sectionIndex += SUBSONIC_FAST_BATCH_SIZE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1059,8 +1216,8 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
albumOffset: 0,
|
||||
artistCount: 0,
|
||||
artistOffset: 0,
|
||||
query: query.searchTerm || '""',
|
||||
songCount: 500,
|
||||
query: query.searchTerm || '',
|
||||
songCount: MAX_SUBSONIC_ITEMS,
|
||||
songOffset: startIndex,
|
||||
},
|
||||
});
|
||||
@@ -1074,8 +1231,7 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
totalRecordCount = startIndex + numberOfResults;
|
||||
startIndex += numberOfResults;
|
||||
|
||||
// The max limit size for Subsonic is 500
|
||||
fetchNextPage = numberOfResults === 500;
|
||||
fetchNextPage = numberOfResults === MAX_SUBSONIC_ITEMS;
|
||||
}
|
||||
|
||||
return totalRecordCount;
|
||||
@@ -1139,9 +1295,9 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
return {
|
||||
items:
|
||||
res.body.topSongs?.song?.map((song) =>
|
||||
ssNormalize.song(song, apiClientProps.server),
|
||||
normalize.song(song, apiClientProps.server),
|
||||
) || [],
|
||||
startIndex: 0,
|
||||
offset: 0,
|
||||
totalRecordCount: res.body.topSongs?.song?.length || 0,
|
||||
};
|
||||
},
|
||||
@@ -1209,13 +1365,13 @@ export const SubsonicController: ControllerEndpoint = {
|
||||
|
||||
return {
|
||||
albumArtists: (res.body.searchResult3?.artist || [])?.map((artist) =>
|
||||
ssNormalize.albumArtist(artist, apiClientProps.server),
|
||||
normalize.albumArtist(artist, apiClientProps.server),
|
||||
),
|
||||
albums: (res.body.searchResult3?.album || []).map((album) =>
|
||||
ssNormalize.album(album, apiClientProps.server),
|
||||
normalize.album(album, apiClientProps.server),
|
||||
),
|
||||
songs: (res.body.searchResult3?.song || []).map((song) =>
|
||||
ssNormalize.song(song, apiClientProps.server),
|
||||
normalize.song(song, apiClientProps.server),
|
||||
),
|
||||
};
|
||||
},
|
||||
|
||||
@@ -10,7 +10,7 @@ export const authenticationFailure = (currentServer: null | ServerListItem) => {
|
||||
if (currentServer) {
|
||||
const serverId = currentServer.id;
|
||||
const token = currentServer.ndCredential;
|
||||
console.log(`token is expired: ${token}`);
|
||||
console.error(`token is expired: ${token}`);
|
||||
useAuthStore.getState().actions.updateServer(serverId, { ndCredential: undefined });
|
||||
useAuthStore.getState().actions.setCurrentServer(null);
|
||||
}
|
||||
|
||||
+5
-15
@@ -16,7 +16,6 @@ import 'overlayscrollbars/overlayscrollbars.css';
|
||||
|
||||
import '/styles/overlayscrollbars.css';
|
||||
import i18n from '/@/i18n/i18n';
|
||||
import { ContextMenuProvider } from '/@/renderer/features/context-menu';
|
||||
import { useDiscordRpc } from '/@/renderer/features/discord-rpc/use-discord-rpc';
|
||||
import { PlayQueueHandlerContext } from '/@/renderer/features/player';
|
||||
import { WebAudioContext } from '/@/renderer/features/player/context/webaudio-context';
|
||||
@@ -190,21 +189,12 @@ export const App = () => {
|
||||
}, [language]);
|
||||
|
||||
return (
|
||||
<MantineProvider
|
||||
defaultColorScheme={mode as 'dark' | 'light'}
|
||||
theme={theme}
|
||||
>
|
||||
<Notifications
|
||||
containerWidth="300px"
|
||||
position="bottom-center"
|
||||
zIndex={5}
|
||||
/>
|
||||
<MantineProvider defaultColorScheme={mode as 'dark' | 'light'} theme={theme}>
|
||||
<Notifications containerWidth="300px" position="bottom-center" zIndex={50000} />
|
||||
<PlayQueueHandlerContext.Provider value={providerValue}>
|
||||
<ContextMenuProvider>
|
||||
<WebAudioContext.Provider value={webAudioProvider}>
|
||||
<AppRouter />
|
||||
</WebAudioContext.Provider>{' '}
|
||||
</ContextMenuProvider>
|
||||
<WebAudioContext.Provider value={webAudioProvider}>
|
||||
<AppRouter />
|
||||
</WebAudioContext.Provider>
|
||||
</PlayQueueHandlerContext.Provider>
|
||||
<IsUpdatedDialog />
|
||||
</MantineProvider>
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
import type { Song } from '/@/shared/types/domain-types';
|
||||
import type { CrossfadeStyle } from '/@/shared/types/types';
|
||||
import type { ReactPlayerProps } from 'react-player';
|
||||
|
||||
@@ -20,9 +19,11 @@ import {
|
||||
gaplessHandler,
|
||||
} from '/@/renderer/components/audio-player/utils/list-handlers';
|
||||
import { useWebAudio } from '/@/renderer/features/player/hooks/use-webaudio';
|
||||
import { getServerById, TranscodingConfig, usePlaybackSettings, useSpeed } from '/@/renderer/store';
|
||||
import { TranscodingConfig, usePlaybackSettings, useSpeed } from '/@/renderer/store';
|
||||
import { useSettingsStore, useSettingsStoreActions } from '/@/renderer/store/settings.store';
|
||||
import { toast } from '/@/shared/components/toast/toast';
|
||||
import { QueueSong } from '/@/shared/types/domain/player-domain-types';
|
||||
import { Song } from '/@/shared/types/domain/song-domain-types';
|
||||
import { PlaybackStyle, PlayerStatus } from '/@/shared/types/types';
|
||||
|
||||
export type AudioPlayerProgress = {
|
||||
@@ -57,27 +58,28 @@ const getDuration = (ref: any) => {
|
||||
const EMPTY_SOURCE =
|
||||
'data:audio/mp3;base64,SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU2LjM2LjEwMAAAAAAAAAAAAAAA//OEAAAAAAAAAAAAAAAAAAAAAAAASW5mbwAAAA8AAAAEAAABIADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV6urq6urq6urq6urq6urq6urq6urq6urq6v////////////////////////////////8AAAAATGF2YzU2LjQxAAAAAAAAAAAAAAAAJAAAAAAAAAAAASDs90hvAAAAAAAAAAAAAAAAAAAA//MUZAAAAAGkAAAAAAAAA0gAAAAATEFN//MUZAMAAAGkAAAAAAAAA0gAAAAARTMu//MUZAYAAAGkAAAAAAAAA0gAAAAAOTku//MUZAkAAAGkAAAAAAAAA0gAAAAANVVV';
|
||||
|
||||
const useSongUrl = (transcode: TranscodingConfig, current: boolean, song?: Song): null | string => {
|
||||
const useSongUrl = (
|
||||
transcode: TranscodingConfig,
|
||||
current: boolean,
|
||||
song?: QueueSong,
|
||||
): null | string => {
|
||||
const prior = useRef(['', '']);
|
||||
|
||||
return useMemo(() => {
|
||||
if (song?.serverId) {
|
||||
if (song?._serverId) {
|
||||
// If we are the current track, we do not want a transcoding
|
||||
// reconfiguration to force a restart.
|
||||
if (current && prior.current[0] === song.uniqueId) {
|
||||
return prior.current[1];
|
||||
if (current && prior.current[0] === song._uniqueId) {
|
||||
return prior.current[1] as string;
|
||||
}
|
||||
|
||||
if (!transcode.enabled) {
|
||||
// transcoding disabled; save the result
|
||||
prior.current = [song.uniqueId, song.streamUrl];
|
||||
prior.current = [song._uniqueId, song.streamUrl];
|
||||
return song.streamUrl;
|
||||
}
|
||||
|
||||
const result = api.controller.getTranscodingUrl({
|
||||
apiClientProps: {
|
||||
server: getServerById(song.serverId),
|
||||
},
|
||||
query: {
|
||||
base: song.streamUrl,
|
||||
...transcode,
|
||||
@@ -85,14 +87,14 @@ const useSongUrl = (transcode: TranscodingConfig, current: boolean, song?: Song)
|
||||
})!;
|
||||
|
||||
// transcoding enabled; save the updated result
|
||||
prior.current = [song.uniqueId, result];
|
||||
prior.current = [song._uniqueId, result];
|
||||
return result;
|
||||
}
|
||||
|
||||
// no track; clear result
|
||||
prior.current = ['', ''];
|
||||
return null;
|
||||
}, [current, song?.uniqueId, song?.serverId, song?.streamUrl, transcode]);
|
||||
}, [song?._serverId, song?._uniqueId, song?.streamUrl, current, transcode]);
|
||||
};
|
||||
|
||||
export interface AudioPlayerRef {
|
||||
@@ -120,6 +122,7 @@ export const AudioPlayer = forwardRef<AudioPlayerRef, AudioPlayerProps>((props,
|
||||
const audioDeviceId = useSettingsStore((state) => state.playback.audioDeviceId);
|
||||
const playback = useSettingsStore((state) => state.playback.mpvProperties);
|
||||
const shouldUseWebAudio = useSettingsStore((state) => state.playback.webAudio);
|
||||
const preservesPitch = useSettingsStore((state) => state.playback.preservePitch);
|
||||
const { resetSampleRate } = useSettingsStoreActions();
|
||||
const playbackSpeed = useSpeed();
|
||||
const { transcode } = usePlaybackSettings();
|
||||
@@ -224,27 +227,51 @@ export const AudioPlayer = forwardRef<AudioPlayerRef, AudioPlayerProps>((props,
|
||||
setIsTransitioning(false);
|
||||
};
|
||||
|
||||
const handleOnError = (playerRef: React.RefObject<ReactPlayer>) => {
|
||||
return ({ target }: ErrorEvent) => {
|
||||
const { current: player } = playerRef;
|
||||
if (!player || !(target instanceof Audio)) {
|
||||
return;
|
||||
}
|
||||
|
||||
const { error } = target;
|
||||
if (error?.code !== MediaError.MEDIA_ERR_DECODE) {
|
||||
return;
|
||||
}
|
||||
|
||||
const duration = player.getDuration();
|
||||
const currentTime = player.getCurrentTime();
|
||||
|
||||
// Decode error within last second, handle as track ended
|
||||
if (duration && duration - currentTime < 1) {
|
||||
handleOnEnded();
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
if (status === PlayerStatus.PLAYING) {
|
||||
if (currentPlayer === 1) {
|
||||
// calling play() is not necessarily a safe option (https://developer.chrome.com/blog/play-request-was-interrupted)
|
||||
// In practice, this failure is only likely to happen when using the 0-second wav:
|
||||
// play() + play() in rapid succession will cause problems as the frist one ends the track.
|
||||
player1Ref.current
|
||||
?.getInternalPlayer()
|
||||
?.play()
|
||||
.catch(() => {});
|
||||
const internalPlayer = player1Ref.current?.getInternalPlayer();
|
||||
if (internalPlayer) {
|
||||
internalPlayer.preservesPitch = preservesPitch;
|
||||
internalPlayer.play().catch(() => {});
|
||||
}
|
||||
} else {
|
||||
player2Ref.current
|
||||
?.getInternalPlayer()
|
||||
?.play()
|
||||
.catch(() => {});
|
||||
const internalPlayer = player2Ref.current?.getInternalPlayer();
|
||||
if (internalPlayer) {
|
||||
internalPlayer.preservesPitch = preservesPitch;
|
||||
internalPlayer.play().catch(() => {});
|
||||
}
|
||||
}
|
||||
} else {
|
||||
player1Ref.current?.getInternalPlayer()?.pause();
|
||||
player2Ref.current?.getInternalPlayer()?.pause();
|
||||
}
|
||||
}, [currentPlayer, status]);
|
||||
}, [currentPlayer, status, preservesPitch]);
|
||||
|
||||
const handleCrossfade1 = useCallback(
|
||||
(e: AudioPlayerProgress) => {
|
||||
@@ -319,10 +346,8 @@ export const AudioPlayer = forwardRef<AudioPlayerRef, AudioPlayerProps>((props,
|
||||
if (isElectron() && webAudio && 'setSinkId' in webAudio.context && audioDeviceId) {
|
||||
const setSink = async () => {
|
||||
try {
|
||||
if (audioDeviceId !== 'default') {
|
||||
if (webAudio.context.state !== 'closed') {
|
||||
await (webAudio.context as any).setSinkId(audioDeviceId);
|
||||
} else {
|
||||
await (webAudio.context as any).setSinkId('');
|
||||
}
|
||||
} catch (error) {
|
||||
toast.error({ message: `Error setting sink: ${(error as Error).message}` });
|
||||
@@ -423,6 +448,7 @@ export const AudioPlayer = forwardRef<AudioPlayerRef, AudioPlayerProps>((props,
|
||||
muted={muted}
|
||||
// If there is no stream url, we do not need to handle when the audio finishes
|
||||
onEnded={stream1 ? handleOnEnded : undefined}
|
||||
onError={handleOnError(player1Ref)}
|
||||
onProgress={
|
||||
playbackStyle === PlaybackStyle.GAPLESS ? handleGapless1 : handleCrossfade1
|
||||
}
|
||||
@@ -442,6 +468,7 @@ export const AudioPlayer = forwardRef<AudioPlayerRef, AudioPlayerProps>((props,
|
||||
height={0}
|
||||
muted={muted}
|
||||
onEnded={stream2 ? handleOnEnded : undefined}
|
||||
onError={handleOnError(player2Ref)}
|
||||
onProgress={
|
||||
playbackStyle === PlaybackStyle.GAPLESS ? handleGapless2 : handleCrossfade2
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ import { ActionIcon } from '/@/shared/components/action-icon/action-icon';
|
||||
import { Button } from '/@/shared/components/button/button';
|
||||
import { Group } from '/@/shared/components/group/group';
|
||||
import { Icon } from '/@/shared/components/icon/icon';
|
||||
import { LibraryItem } from '/@/shared/types/domain-types';
|
||||
import { LibraryItem } from '/@/shared/types/domain/shared-domain-types';
|
||||
import { Play } from '/@/shared/types/types';
|
||||
|
||||
export const CardControls = ({
|
||||
@@ -47,10 +47,7 @@ export const CardControls = ({
|
||||
return (
|
||||
<div className={styles.gridCardControlsContainer}>
|
||||
<div className={styles.bottomControls}>
|
||||
<button
|
||||
className={styles.playButton}
|
||||
onClick={handlePlay}
|
||||
>
|
||||
<button className={styles.playButton} onClick={handlePlay}>
|
||||
<Icon icon="mediaPlay" />
|
||||
</button>
|
||||
<Group gap="xs">
|
||||
|
||||
@@ -3,18 +3,21 @@ import formatDuration from 'format-duration';
|
||||
import React from 'react';
|
||||
import { generatePath } from 'react-router';
|
||||
import { Link } from 'react-router-dom';
|
||||
import { Song } from 'src/main/features/core/lyrics/netease';
|
||||
|
||||
import styles from './card-rows.module.css';
|
||||
|
||||
import { AppRoute } from '/@/renderer/router/routes';
|
||||
import { formatDateAbsolute, formatDateRelative, formatRating } from '/@/renderer/utils/format';
|
||||
import { Text } from '/@/shared/components/text/text';
|
||||
import { Album, AlbumArtist, Artist, Playlist, Song } from '/@/shared/types/domain-types';
|
||||
import { Album } from '/@/shared/types/domain/album-domain-types';
|
||||
import { Artist } from '/@/shared/types/domain/artist-domain-types';
|
||||
import { Playlist } from '/@/shared/types/domain/playlist-domain-types';
|
||||
import { CardRow } from '/@/shared/types/types';
|
||||
|
||||
interface CardRowsProps {
|
||||
data: any;
|
||||
rows: CardRow<Album>[] | CardRow<AlbumArtist>[] | CardRow<Artist>[];
|
||||
rows: CardRow<Album>[] | CardRow<Artist>[];
|
||||
}
|
||||
|
||||
export const CardRows = ({ data, rows }: CardRowsProps) => {
|
||||
|
||||
@@ -8,12 +8,14 @@ import { GridCardControls } from '/@/renderer/components/virtual-grid/grid-card/
|
||||
import { Image } from '/@/shared/components/image/image';
|
||||
import { Skeleton } from '/@/shared/components/skeleton/skeleton';
|
||||
import { Stack } from '/@/shared/components/stack/stack';
|
||||
import { Album, AlbumArtist, Artist, LibraryItem } from '/@/shared/types/domain-types';
|
||||
import { Album } from '/@/shared/types/domain/album-domain-types';
|
||||
import { Artist } from '/@/shared/types/domain/artist-domain-types';
|
||||
import { LibraryItem } from '/@/shared/types/domain/shared-domain-types';
|
||||
import { CardRoute, CardRow, Play, PlayQueueAddOptions } from '/@/shared/types/types';
|
||||
|
||||
interface BaseGridCardProps {
|
||||
controls: {
|
||||
cardRows: CardRow<Album>[] | CardRow<AlbumArtist>[] | CardRow<Artist>[];
|
||||
cardRows: CardRow<Album>[] | CardRow<Artist>[];
|
||||
handleFavorite: (options: {
|
||||
id: string[];
|
||||
isFavorite: boolean;
|
||||
@@ -55,14 +57,8 @@ export const PosterCard = ({
|
||||
onMouseEnter={() => setIsHovered(true)}
|
||||
onMouseLeave={() => setIsHovered(false)}
|
||||
>
|
||||
<Link
|
||||
className={styles.imageContainer}
|
||||
to={path}
|
||||
>
|
||||
<Image
|
||||
className={styles.image}
|
||||
src={data?.imageUrl}
|
||||
/>
|
||||
<Link className={styles.imageContainer} to={path}>
|
||||
<Image className={styles.image} src={data?.imageUrl} />
|
||||
<GridCardControls
|
||||
handleFavorite={controls.handleFavorite}
|
||||
handlePlayQueueAdd={controls.handlePlayQueueAdd}
|
||||
@@ -72,30 +68,21 @@ export const PosterCard = ({
|
||||
/>
|
||||
</Link>
|
||||
<div className={styles.detailContainer}>
|
||||
<CardRows
|
||||
data={data}
|
||||
rows={controls.cardRows}
|
||||
/>
|
||||
<CardRows data={data} rows={controls.cardRows} />
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<div
|
||||
className={styles.container}
|
||||
key={`placeholder-${uniqueId}-${data.id}`}
|
||||
>
|
||||
<div className={styles.container} key={`placeholder-${uniqueId}-${data.id}`}>
|
||||
<div className={styles.imageContainer}>
|
||||
<Skeleton className={styles.image} />
|
||||
</div>
|
||||
<div className={styles.detailContainer}>
|
||||
<Stack gap="xs">
|
||||
{(controls?.cardRows || []).map((row, index) => (
|
||||
<Skeleton
|
||||
height={14}
|
||||
key={`${index}-${row.arrayProperty}`}
|
||||
/>
|
||||
<Skeleton height={14} key={`${index}-${row.arrayProperty}`} />
|
||||
))}
|
||||
</Stack>
|
||||
</div>
|
||||
|
||||
@@ -35,14 +35,8 @@ export const ContextMenuButton = forwardRef(
|
||||
onClick={props.onClick}
|
||||
ref={ref}
|
||||
>
|
||||
<Group
|
||||
justify="space-between"
|
||||
w="100%"
|
||||
>
|
||||
<Group
|
||||
className={styles.left}
|
||||
gap="md"
|
||||
>
|
||||
<Group justify="space-between" w="100%">
|
||||
<Group className={styles.left} gap="md">
|
||||
{leftIcon}
|
||||
{children}
|
||||
</Group>
|
||||
|
||||
@@ -20,7 +20,8 @@ import { Image } from '/@/shared/components/image/image';
|
||||
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 { Album } from '/@/shared/types/domain/album-domain-types';
|
||||
import { LibraryItem } from '/@/shared/types/domain/shared-domain-types';
|
||||
import { Play } from '/@/shared/types/types';
|
||||
|
||||
const variants: Variants = {
|
||||
@@ -77,11 +78,7 @@ export const FeatureCarousel = ({ data }: FeatureCarouselProps) => {
|
||||
className={styles.wrapper}
|
||||
to={generatePath(AppRoute.LIBRARY_ALBUMS_DETAIL, { albumId: currentItem?.id || '' })}
|
||||
>
|
||||
<AnimatePresence
|
||||
custom={direction}
|
||||
initial={false}
|
||||
mode="popLayout"
|
||||
>
|
||||
<AnimatePresence custom={direction} initial={false} mode="popLayout">
|
||||
{data && (
|
||||
<motion.div
|
||||
animate="animate"
|
||||
@@ -101,10 +98,7 @@ export const FeatureCarousel = ({ data }: FeatureCarouselProps) => {
|
||||
/>
|
||||
</div>
|
||||
<div className={styles.infoColumn}>
|
||||
<Stack
|
||||
gap="md"
|
||||
style={{ width: '100%' }}
|
||||
>
|
||||
<Stack gap="md" style={{ width: '100%' }}>
|
||||
<div className={styles.titleWrapper}>
|
||||
<TextTitle
|
||||
fw={900}
|
||||
@@ -117,10 +111,7 @@ export const FeatureCarousel = ({ data }: FeatureCarouselProps) => {
|
||||
</div>
|
||||
<div className={styles.titleWrapper}>
|
||||
{currentItem?.albumArtists.slice(0, 1).map((artist) => (
|
||||
<Text
|
||||
fw={600}
|
||||
key={`carousel-artist-${artist.id}`}
|
||||
>
|
||||
<Text fw={600} key={`carousel-artist-${artist.id}`}>
|
||||
{artist.name}
|
||||
</Text>
|
||||
))}
|
||||
|
||||
@@ -24,13 +24,9 @@ import { Group } from '/@/shared/components/group/group';
|
||||
import { Icon } from '/@/shared/components/icon/icon';
|
||||
import { Stack } from '/@/shared/components/stack/stack';
|
||||
import { TextTitle } from '/@/shared/components/text-title/text-title';
|
||||
import {
|
||||
Album,
|
||||
AlbumArtist,
|
||||
Artist,
|
||||
LibraryItem,
|
||||
RelatedArtist,
|
||||
} from '/@/shared/types/domain-types';
|
||||
import { Album } from '/@/shared/types/domain/album-domain-types';
|
||||
import { Artist, RelatedArtist } from '/@/shared/types/domain/artist-domain-types';
|
||||
import { LibraryItem } from '/@/shared/types/domain/shared-domain-types';
|
||||
import { CardRoute, CardRow } from '/@/shared/types/types';
|
||||
|
||||
const getSlidesPerView = (windowWidth: number) => {
|
||||
@@ -60,10 +56,7 @@ const Title = ({ handleNext, handlePrev, label, pagination }: TitleProps) => {
|
||||
{isValidElement(label) ? (
|
||||
label
|
||||
) : (
|
||||
<TextTitle
|
||||
order={3}
|
||||
weight={700}
|
||||
>
|
||||
<TextTitle order={3} weight={700}>
|
||||
{label}
|
||||
</TextTitle>
|
||||
)}
|
||||
@@ -280,11 +273,7 @@ export const SwiperGridCarousel = ({
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<Stack
|
||||
className="grid-carousel"
|
||||
gap="md"
|
||||
ref={containerRef as any}
|
||||
>
|
||||
<Stack className="grid-carousel" gap="md" ref={containerRef as any}>
|
||||
{title ? (
|
||||
<Title
|
||||
{...title}
|
||||
|
||||
@@ -91,11 +91,7 @@ export const NativeScrollArea = forwardRef(
|
||||
{...pageHeaderProps}
|
||||
/>
|
||||
)}
|
||||
<div
|
||||
className={styles.scrollArea}
|
||||
ref={mergedRef}
|
||||
{...props}
|
||||
>
|
||||
<div className={styles.scrollArea} ref={mergedRef} {...props}>
|
||||
{children}
|
||||
</div>
|
||||
</>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user