mirror of
https://github.com/jeffvli/feishin.git
synced 2026-05-07 04:20:12 +02:00
Compare commits
360 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 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 | |||
| e00aeb2b67 | |||
| b219c900ca | |||
| 5eacb4e3cb | |||
| a86d44a29e | |||
| b7a0b7f997 | |||
| cd2d531c54 | |||
| 19c8980784 | |||
| a2e5f86eac | |||
| d8c93cadce | |||
| 35f87c8552 | |||
| 4f7b0983ec | |||
| 055d9ac5c1 | |||
| 039d008223 | |||
| 2b8db9cfc1 | |||
| caa9448200 | |||
| 176a95a946 | |||
| 6f5dd4881a | |||
| ce6aaa709f | |||
| 217a4d65fd | |||
| b88671161a | |||
| dde48335cd | |||
| 8611f08f54 | |||
| cd18e683bf | |||
| 286441c1b1 | |||
| 5456c2c2b8 | |||
| 5cd4fc227e | |||
| 737d672918 | |||
| a6ac4c8f67 | |||
| c9217827ab | |||
| 0ff8fad071 | |||
| f3cb15eae2 | |||
| 5b34b287e2 | |||
| dc461a253f | |||
| 958416af4c | |||
| 1dd8eec4a5 | |||
| b263db5483 | |||
| 528f60c5f3 | |||
| 007b0166ab | |||
| d3fb2374ff | |||
| 676c091d28 | |||
| 58b7572a8b | |||
| fc77c32a0e | |||
| b5bdea1845 | |||
| 8eb591bd08 | |||
| 88be98f703 | |||
| df6b6d514d | |||
| b6d902e425 | |||
| d922d8b034 | |||
| f4db8fdb84 | |||
| 81ca6937bc | |||
| c382e01f64 | |||
| fb80b66310 | |||
| 63e3b97bca | |||
| fb584b35a9 | |||
| bdc372636b | |||
| 2c5671cf38 | |||
| bd12fbecac | |||
| c1d88ada91 | |||
| d6a3e1d90b | |||
| 789c7f3d81 | |||
| f3c785d0fa | |||
| 062c1c2b61 | |||
| eb078d62cd | |||
| c429ac9223 | |||
| bd26967ff2 | |||
| 620b810191 | |||
| 64866c59bd | |||
| 0afbe4c0a2 | |||
| 6782cd0dcc | |||
| 8f585a5be9 | |||
| ac0c396712 | |||
| b989a66991 | |||
| 2814b623e7 | |||
| 7d29a692ef | |||
| 3f9eb446f7 | |||
| d8f7b49ab6 | |||
| 35e70a3eff | |||
| ef9c16e940 | |||
| 0b39c35132 | |||
| 9f5b4e5410 | |||
| dbf840b185 | |||
| e0f0524eb9 | |||
| 8598313d12 | |||
| c84dd648ea | |||
| 01885c1a9b | |||
| 5121f57171 | |||
| 3d7ee10328 | |||
| 4db47b4d37 | |||
| 786a693526 | |||
| 1faef6a1a7 | |||
| 1598642389 | |||
| 8c4a7f4f91 | |||
| 5878f89339 | |||
| 4acbb1820d | |||
| 01f5745629 | |||
| 73dd781a88 | |||
| d777be6251 | |||
| 6689e84f67 | |||
| ad533a1d9c | |||
| b691891e62 | |||
| 53fa265af9 | |||
| 55f6a382d4 | |||
| 9c30acdd56 | |||
| b29d3e7f78 | |||
| c1330d92b2 | |||
| bea55d48a8 | |||
| ae41fe99bb | |||
| e3751229b6 | |||
| 87c9963354 | |||
| b7fb7c7f94 | |||
| b8ceb174b3 | |||
| 48f085b0ac | |||
| dfc0639f95 | |||
| 80ffd1a925 | |||
| c87bb65023 | |||
| 5ae21bd224 | |||
| 12d293a74c | |||
| 62f4bb0d7b | |||
| 9f11061433 | |||
| aba64b10d0 | |||
| c20e30e387 | |||
| c4b4300845 | |||
| f1e5ed41bc | |||
| 9b79502022 | |||
| 636c227a83 | |||
| e8a94a0b1c | |||
| fa93dfd771 | |||
| 8629994eb6 | |||
| c54423a667 | |||
| d28fc9f630 | |||
| bd2b39fdfb | |||
| 2912cd72ef | |||
| 9d31d952b7 | |||
| 8f692b6f4d | |||
| 7562c619d2 | |||
| 6b91ee4a25 | |||
| 9e689468f9 | |||
| 1cda4363ef | |||
| b6941df7a7 | |||
| 608b322f9e | |||
| daee582e92 | |||
| 6525a8a725 | |||
| ee1896c345 | |||
| ec625c2c65 | |||
| 52e4423cf1 | |||
| a9f7e808cb | |||
| 9c26187b45 | |||
| 90afa11f20 | |||
| 6463ea937b | |||
| ac682428e6 | |||
| 48917547b2 | |||
| 74554d9725 | |||
| 0d42a6ea49 | |||
| faadff0211 | |||
| 91715ebf7d | |||
| 1808f160b4 | |||
| e10a92a5c2 | |||
| 930165d006 | |||
| 249eaf89f8 | |||
| bf1cddae9d | |||
| 9db2e51d2d | |||
| 26c02e03c5 | |||
| 1cf587bc8f | |||
| 91ce2cd8a1 | |||
| 4f61e82068 | |||
| 1e6673fabd | |||
| 02951c92af | |||
| 05f8fb3114 | |||
| 169da10c1b | |||
| 5a79fee77e | |||
| 7ef80f14b0 | |||
| 36cc37e39f | |||
| d4e7c6bd18 | |||
| 90f79b4ae7 | |||
| cf74625bfc | |||
| f068d6e4b8 | |||
| e1aa8d74f3 | |||
| b0d86ee5c9 | |||
| 89e27ec6ff | |||
| 39c714a137 | |||
| a8fb7ff11e | |||
| 9b95f47a91 | |||
| 2267e9bc9d | |||
| 089311c673 | |||
| 773f349b66 | |||
| 3980c8ea97 | |||
| 257a5ceef0 | |||
| fb022891fe | |||
| 5d9906b8f2 | |||
| 6f7cb468b2 | |||
| 076693e969 | |||
| 781d8055b5 | |||
| 960bb5c660 | |||
| 42bb2bf66f | |||
| f03d88cd8c | |||
| 58f6535ba6 | |||
| 9a59ce3613 | |||
| 6f37e13611 | |||
| 3c494f1c72 | |||
| ec0e7256cb | |||
| 262203b62d | |||
| 41bdc1a7b7 | |||
| d35e73792f | |||
| 4a3604b1a8 | |||
| b9611589ba | |||
| 12c517f0ff | |||
| 01884ab656 | |||
| 0ba830d5d7 | |||
| b08a0d178c | |||
| 9afa64b537 | |||
| be8bc74ab5 | |||
| 2f4e228fa1 | |||
| 35ee7e4606 | |||
| b265f2817b | |||
| 48af447838 | |||
| 397df0c9c6 | |||
| 68759a2613 | |||
| c376293f2f | |||
| e84a4b20bc | |||
| 14e9f6ac41 | |||
| 0115ecb59b | |||
| 1555b827ee | |||
| 41c2a7da69 | |||
| 592376316f | |||
| c6d7dc0b32 | |||
| 571aacbaa0 | |||
| ef194424e3 | |||
| 233c24cea6 | |||
| b48b0b0d11 | |||
| 65fe42d30c | |||
| 90ae7130f6 | |||
| d866dd211a | |||
| 81446561e0 | |||
| 4ef7213cf5 | |||
| b639d7bfab | |||
| 35e0af5164 | |||
| 86cca7fca5 | |||
| 132ebb6b52 | |||
| e23906582a | |||
| e57232f89c | |||
| f0978365d4 | |||
| ae65922253 | |||
| ca58551b94 | |||
| be0ebac362 | |||
| 8eb8290fc4 | |||
| fac1d3fb62 | |||
| 93fbe1f49a | |||
| 59f17a4faa | |||
| d9e41720c8 | |||
| 8452780602 | |||
| 96b5b660fb | |||
| 610138c05c | |||
| 6a619240fa | |||
| b65c972da1 | |||
| 8ec4551b46 | |||
| 21f4a78dd7 | |||
| 61d7e7c390 | |||
| 993841ddbf | |||
| 98b8409592 | |||
| d3480a86c3 | |||
| 3a63ee4b95 | |||
| 876376d65f | |||
| 215abf615d | |||
| afad2843c6 | |||
| 958ab1f31f | |||
| 0ca325aac2 | |||
| 12b66e5fa0 | |||
| 7e78478fbe | |||
| f783a6360e | |||
| 8eb6c6a213 | |||
| ea5f0268cb | |||
| 427272f8c8 | |||
| 40d09404b3 | |||
| f3ee198833 | |||
| 5416d6e596 | |||
| a0639cbd27 | |||
| 790961f29a | |||
| 18027d4292 | |||
| a8b3944c66 | |||
| a00385e78f | |||
| 5e628d96c7 | |||
| ad34d8553e | |||
| a89b6640a9 | |||
| b3b810c62c | |||
| ecef9bea5e | |||
| c7214fc7ce | |||
| 84bcfb6eb9 | |||
| 0ca7a0efc9 | |||
| cb76436a2a | |||
| 88a951e2e7 | |||
| 6f1b78c2d6 | |||
| 107074b240 | |||
| 6e8ca7e035 | |||
| 3c99a662e8 | |||
| fc8110ca79 | |||
| 715f800788 | |||
| 244aee45cd | |||
| c96f5b207d | |||
| 0e8b2aed72 | |||
| f2accd63fd | |||
| c024e975fb | |||
| a3f725b0ef | |||
| f137f487aa | |||
| 8e59514524 | |||
| 7bcfe30a8e | |||
| 8cddbef701 | |||
| 31492fa9ef | |||
| e3946a9413 | |||
| 28c12496f1 | |||
| f8c2ff735b | |||
| 22e4974191 | |||
| 6eecc3c0fd | |||
| b628b684ae | |||
| 4c49e403ab | |||
| 730683fe25 | |||
| 96b4f8dd89 | |||
| f82889e5ec | |||
| 8d8826a9b7 | |||
| 660c9744bf | |||
| 8221af9a8f |
+2
-5
@@ -1,12 +1,9 @@
|
||||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
|
||||
[*.md]
|
||||
trim_trailing_whitespace = false
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
{
|
||||
"rules": {
|
||||
"no-console": "off",
|
||||
"global-require": "off",
|
||||
"import/no-dynamic-require": "off"
|
||||
}
|
||||
}
|
||||
@@ -1,64 +0,0 @@
|
||||
/**
|
||||
* Base webpack config used across other specific configs
|
||||
*/
|
||||
|
||||
import webpack from 'webpack';
|
||||
import { dependencies as externals } from '../../release/app/package.json';
|
||||
import webpackPaths from './webpack.paths';
|
||||
import { TsconfigPathsPlugin } from 'tsconfig-paths-webpack-plugin';
|
||||
|
||||
const createStyledComponentsTransformer = require('typescript-plugin-styled-components').default;
|
||||
|
||||
const styledComponentsTransformer = createStyledComponentsTransformer();
|
||||
|
||||
const configuration: webpack.Configuration = {
|
||||
externals: [...Object.keys(externals || {})],
|
||||
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
exclude: /node_modules/,
|
||||
test: /\.[jt]sx?$/,
|
||||
use: {
|
||||
loader: 'ts-loader',
|
||||
options: {
|
||||
// Remove this line to enable type checking in webpack builds
|
||||
transpileOnly: true,
|
||||
getCustomTransformers: () => ({ before: [styledComponentsTransformer] }),
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
output: {
|
||||
// https://github.com/webpack/webpack/issues/1114
|
||||
library: {
|
||||
type: 'commonjs2',
|
||||
},
|
||||
|
||||
path: webpackPaths.srcPath,
|
||||
},
|
||||
|
||||
plugins: [
|
||||
new webpack.EnvironmentPlugin({
|
||||
NODE_ENV: 'production',
|
||||
}),
|
||||
],
|
||||
|
||||
/**
|
||||
* Determine the array of extensions that should be used to resolve modules.
|
||||
*/
|
||||
resolve: {
|
||||
extensions: ['.js', '.jsx', '.json', '.ts', '.tsx'],
|
||||
fallback: {
|
||||
child_process: false,
|
||||
},
|
||||
plugins: [new TsconfigPathsPlugin({ baseUrl: webpackPaths.srcPath })],
|
||||
modules: [webpackPaths.srcPath, 'node_modules'],
|
||||
},
|
||||
|
||||
stats: 'errors-only',
|
||||
};
|
||||
|
||||
export default configuration;
|
||||
@@ -1,3 +0,0 @@
|
||||
/* eslint import/no-unresolved: off, import/no-self-import: off */
|
||||
|
||||
module.exports = require('./webpack.config.renderer.dev').default;
|
||||
@@ -1,84 +0,0 @@
|
||||
/**
|
||||
* Webpack config for production electron main process
|
||||
*/
|
||||
|
||||
import path from 'path';
|
||||
|
||||
import TerserPlugin from 'terser-webpack-plugin';
|
||||
import webpack from 'webpack';
|
||||
import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer';
|
||||
import { merge } from 'webpack-merge';
|
||||
|
||||
import checkNodeEnv from '../scripts/check-node-env';
|
||||
import deleteSourceMaps from '../scripts/delete-source-maps';
|
||||
import baseConfig from './webpack.config.base';
|
||||
import webpackPaths from './webpack.paths';
|
||||
|
||||
checkNodeEnv('production');
|
||||
deleteSourceMaps();
|
||||
|
||||
const devtoolsConfig =
|
||||
process.env.DEBUG_PROD === 'true'
|
||||
? {
|
||||
devtool: 'source-map',
|
||||
}
|
||||
: {};
|
||||
|
||||
const configuration: webpack.Configuration = {
|
||||
...devtoolsConfig,
|
||||
|
||||
mode: 'production',
|
||||
|
||||
target: 'electron-main',
|
||||
|
||||
entry: {
|
||||
main: path.join(webpackPaths.srcMainPath, 'main.ts'),
|
||||
preload: path.join(webpackPaths.srcMainPath, 'preload.ts'),
|
||||
},
|
||||
|
||||
output: {
|
||||
path: webpackPaths.distMainPath,
|
||||
filename: '[name].js',
|
||||
},
|
||||
|
||||
optimization: {
|
||||
minimizer: [
|
||||
new TerserPlugin({
|
||||
parallel: true,
|
||||
}),
|
||||
],
|
||||
},
|
||||
|
||||
plugins: [
|
||||
new BundleAnalyzerPlugin({
|
||||
analyzerMode: process.env.ANALYZE === 'true' ? 'server' : 'disabled',
|
||||
}),
|
||||
|
||||
/**
|
||||
* Create global constants which can be configured at compile time.
|
||||
*
|
||||
* Useful for allowing different behaviour between development builds and
|
||||
* release builds
|
||||
*
|
||||
* NODE_ENV should be production so that modules do not perform certain
|
||||
* development checks
|
||||
*/
|
||||
new webpack.EnvironmentPlugin({
|
||||
NODE_ENV: 'production',
|
||||
DEBUG_PROD: false,
|
||||
START_MINIMIZED: false,
|
||||
}),
|
||||
],
|
||||
|
||||
/**
|
||||
* Disables webpack processing of __dirname and __filename.
|
||||
* If you run the bundle in node.js it falls back to these values of node.js.
|
||||
* https://github.com/webpack/webpack/issues/2010
|
||||
*/
|
||||
node: {
|
||||
__dirname: false,
|
||||
__filename: false,
|
||||
},
|
||||
};
|
||||
|
||||
export default merge(baseConfig, configuration);
|
||||
@@ -1,70 +0,0 @@
|
||||
import path from 'path';
|
||||
|
||||
import webpack from 'webpack';
|
||||
import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer';
|
||||
import { merge } from 'webpack-merge';
|
||||
|
||||
import checkNodeEnv from '../scripts/check-node-env';
|
||||
import baseConfig from './webpack.config.base';
|
||||
import webpackPaths from './webpack.paths';
|
||||
|
||||
// When an ESLint server is running, we can't set the NODE_ENV so we'll check if it's
|
||||
// at the dev webpack config is not accidentally run in a production environment
|
||||
if (process.env.NODE_ENV === 'production') {
|
||||
checkNodeEnv('development');
|
||||
}
|
||||
|
||||
const configuration: webpack.Configuration = {
|
||||
devtool: 'inline-source-map',
|
||||
|
||||
mode: 'development',
|
||||
|
||||
target: 'electron-preload',
|
||||
|
||||
entry: path.join(webpackPaths.srcMainPath, 'preload.ts'),
|
||||
|
||||
output: {
|
||||
path: webpackPaths.dllPath,
|
||||
filename: 'preload.js',
|
||||
},
|
||||
|
||||
plugins: [
|
||||
new BundleAnalyzerPlugin({
|
||||
analyzerMode: process.env.ANALYZE === 'true' ? 'server' : 'disabled',
|
||||
}),
|
||||
|
||||
/**
|
||||
* Create global constants which can be configured at compile time.
|
||||
*
|
||||
* Useful for allowing different behaviour between development builds and
|
||||
* release builds
|
||||
*
|
||||
* NODE_ENV should be production so that modules do not perform certain
|
||||
* development checks
|
||||
*
|
||||
* By default, use 'development' as NODE_ENV. This can be overriden with
|
||||
* 'staging', for example, by changing the ENV variables in the npm scripts
|
||||
*/
|
||||
new webpack.EnvironmentPlugin({
|
||||
NODE_ENV: 'development',
|
||||
}),
|
||||
|
||||
new webpack.LoaderOptionsPlugin({
|
||||
debug: true,
|
||||
}),
|
||||
],
|
||||
|
||||
/**
|
||||
* Disables webpack processing of __dirname and __filename.
|
||||
* If you run the bundle in node.js it falls back to these values of node.js.
|
||||
* https://github.com/webpack/webpack/issues/2010
|
||||
*/
|
||||
node: {
|
||||
__dirname: false,
|
||||
__filename: false,
|
||||
},
|
||||
|
||||
watch: true,
|
||||
};
|
||||
|
||||
export default merge(baseConfig, configuration);
|
||||
@@ -1,127 +0,0 @@
|
||||
import 'webpack-dev-server';
|
||||
import path from 'path';
|
||||
|
||||
import HtmlWebpackPlugin from 'html-webpack-plugin';
|
||||
import webpack from 'webpack';
|
||||
import { merge } from 'webpack-merge';
|
||||
|
||||
import checkNodeEnv from '../scripts/check-node-env';
|
||||
import baseConfig from './webpack.config.base';
|
||||
import webpackPaths from './webpack.paths';
|
||||
|
||||
const { version } = require('../../package.json');
|
||||
|
||||
// When an ESLint server is running, we can't set the NODE_ENV so we'll check if it's
|
||||
// at the dev webpack config is not accidentally run in a production environment
|
||||
if (process.env.NODE_ENV === 'production') {
|
||||
checkNodeEnv('development');
|
||||
}
|
||||
|
||||
const configuration: webpack.Configuration = {
|
||||
devtool: 'inline-source-map',
|
||||
|
||||
mode: 'development',
|
||||
|
||||
target: ['web'],
|
||||
|
||||
entry: {
|
||||
remote: path.join(webpackPaths.srcRemotePath, 'index.tsx'),
|
||||
worker: path.join(webpackPaths.srcRemotePath, 'service-worker.ts'),
|
||||
},
|
||||
|
||||
output: {
|
||||
path: webpackPaths.dllPath,
|
||||
publicPath: '/',
|
||||
filename: '[name].js',
|
||||
library: {
|
||||
type: 'umd',
|
||||
},
|
||||
},
|
||||
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: /\.s?css$/,
|
||||
use: [
|
||||
'style-loader',
|
||||
{
|
||||
loader: 'css-loader',
|
||||
options: {
|
||||
modules: true,
|
||||
sourceMap: true,
|
||||
importLoaders: 1,
|
||||
},
|
||||
},
|
||||
'sass-loader',
|
||||
],
|
||||
include: /\.module\.s?(c|a)ss$/,
|
||||
},
|
||||
{
|
||||
test: /\.s?css$/,
|
||||
use: ['style-loader', 'css-loader', 'sass-loader'],
|
||||
exclude: /\.module\.s?(c|a)ss$/,
|
||||
},
|
||||
// Fonts
|
||||
{
|
||||
test: /\.(woff|woff2|eot|ttf|otf)$/i,
|
||||
type: 'asset/resource',
|
||||
},
|
||||
// Images
|
||||
{
|
||||
test: /\.(png|svg|jpg|jpeg|gif)$/i,
|
||||
type: 'asset/resource',
|
||||
},
|
||||
],
|
||||
},
|
||||
plugins: [
|
||||
new webpack.NoEmitOnErrorsPlugin(),
|
||||
|
||||
/**
|
||||
* Create global constants which can be configured at compile time.
|
||||
*
|
||||
* Useful for allowing different behaviour between development builds and
|
||||
* release builds
|
||||
*
|
||||
* NODE_ENV should be production so that modules do not perform certain
|
||||
* development checks
|
||||
*
|
||||
* By default, use 'development' as NODE_ENV. This can be overriden with
|
||||
* 'staging', for example, by changing the ENV variables in the npm scripts
|
||||
*/
|
||||
new webpack.EnvironmentPlugin({
|
||||
NODE_ENV: 'development',
|
||||
}),
|
||||
|
||||
new webpack.LoaderOptionsPlugin({
|
||||
debug: true,
|
||||
}),
|
||||
|
||||
new HtmlWebpackPlugin({
|
||||
filename: path.join('index.html'),
|
||||
template: path.join(webpackPaths.srcRemotePath, 'index.ejs'),
|
||||
favicon: path.join(webpackPaths.assetsPath, 'icons', 'favicon.ico'),
|
||||
minify: {
|
||||
collapseWhitespace: true,
|
||||
removeAttributeQuotes: true,
|
||||
removeComments: true,
|
||||
},
|
||||
isBrowser: true,
|
||||
env: process.env.NODE_ENV,
|
||||
isDevelopment: process.env.NODE_ENV !== 'production',
|
||||
nodeModules: webpackPaths.appNodeModulesPath,
|
||||
templateParameters: {
|
||||
version,
|
||||
prod: false,
|
||||
},
|
||||
}),
|
||||
],
|
||||
|
||||
node: {
|
||||
__dirname: false,
|
||||
__filename: false,
|
||||
},
|
||||
|
||||
watch: true,
|
||||
};
|
||||
|
||||
export default merge(baseConfig, configuration);
|
||||
@@ -1,142 +0,0 @@
|
||||
/**
|
||||
* Build config for electron renderer process
|
||||
*/
|
||||
|
||||
import path from 'path';
|
||||
|
||||
import CssMinimizerPlugin from 'css-minimizer-webpack-plugin';
|
||||
import HtmlWebpackPlugin from 'html-webpack-plugin';
|
||||
import MiniCssExtractPlugin from 'mini-css-extract-plugin';
|
||||
import TerserPlugin from 'terser-webpack-plugin';
|
||||
import webpack from 'webpack';
|
||||
import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer';
|
||||
import { merge } from 'webpack-merge';
|
||||
|
||||
import checkNodeEnv from '../scripts/check-node-env';
|
||||
import deleteSourceMaps from '../scripts/delete-source-maps';
|
||||
import baseConfig from './webpack.config.base';
|
||||
import webpackPaths from './webpack.paths';
|
||||
|
||||
const { version } = require('../../package.json');
|
||||
|
||||
checkNodeEnv('production');
|
||||
deleteSourceMaps();
|
||||
|
||||
const devtoolsConfig =
|
||||
process.env.DEBUG_PROD === 'true'
|
||||
? {
|
||||
devtool: 'source-map',
|
||||
}
|
||||
: {};
|
||||
|
||||
const configuration: webpack.Configuration = {
|
||||
...devtoolsConfig,
|
||||
|
||||
mode: 'production',
|
||||
|
||||
target: ['web'],
|
||||
|
||||
entry: {
|
||||
remote: path.join(webpackPaths.srcRemotePath, 'index.tsx'),
|
||||
worker: path.join(webpackPaths.srcRemotePath, 'service-worker.ts'),
|
||||
},
|
||||
|
||||
output: {
|
||||
path: webpackPaths.distRemotePath,
|
||||
publicPath: './',
|
||||
filename: '[name].js',
|
||||
library: {
|
||||
type: 'umd',
|
||||
},
|
||||
},
|
||||
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: /\.s?(a|c)ss$/,
|
||||
use: [
|
||||
MiniCssExtractPlugin.loader,
|
||||
{
|
||||
loader: 'css-loader',
|
||||
options: {
|
||||
modules: true,
|
||||
sourceMap: true,
|
||||
importLoaders: 1,
|
||||
},
|
||||
},
|
||||
'sass-loader',
|
||||
],
|
||||
include: /\.module\.s?(c|a)ss$/,
|
||||
},
|
||||
{
|
||||
test: /\.s?(a|c)ss$/,
|
||||
use: [MiniCssExtractPlugin.loader, 'css-loader', 'sass-loader'],
|
||||
exclude: /\.module\.s?(c|a)ss$/,
|
||||
},
|
||||
// Fonts
|
||||
{
|
||||
test: /\.(woff|woff2|eot|ttf|otf)$/i,
|
||||
type: 'asset/resource',
|
||||
},
|
||||
// Images
|
||||
{
|
||||
test: /\.(png|svg|jpg|jpeg|gif)$/i,
|
||||
type: 'asset/resource',
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
optimization: {
|
||||
minimize: true,
|
||||
minimizer: [
|
||||
new TerserPlugin({
|
||||
parallel: true,
|
||||
}),
|
||||
new CssMinimizerPlugin(),
|
||||
],
|
||||
},
|
||||
|
||||
plugins: [
|
||||
/**
|
||||
* Create global constants which can be configured at compile time.
|
||||
*
|
||||
* Useful for allowing different behaviour between development builds and
|
||||
* release builds
|
||||
*
|
||||
* NODE_ENV should be production so that modules do not perform certain
|
||||
* development checks
|
||||
*/
|
||||
new webpack.EnvironmentPlugin({
|
||||
NODE_ENV: 'production',
|
||||
DEBUG_PROD: false,
|
||||
}),
|
||||
|
||||
new MiniCssExtractPlugin({
|
||||
filename: 'remote.css',
|
||||
}),
|
||||
|
||||
new BundleAnalyzerPlugin({
|
||||
analyzerMode: process.env.ANALYZE === 'true' ? 'server' : 'disabled',
|
||||
}),
|
||||
|
||||
new HtmlWebpackPlugin({
|
||||
filename: 'index.html',
|
||||
template: path.join(webpackPaths.srcRemotePath, 'index.ejs'),
|
||||
favicon: path.join(webpackPaths.assetsPath, 'icons', 'favicon.ico'),
|
||||
minify: {
|
||||
collapseWhitespace: true,
|
||||
removeAttributeQuotes: true,
|
||||
removeComments: true,
|
||||
},
|
||||
isBrowser: true,
|
||||
env: process.env.NODE_ENV,
|
||||
isDevelopment: process.env.NODE_ENV !== 'production',
|
||||
templateParameters: {
|
||||
version,
|
||||
prod: true,
|
||||
},
|
||||
}),
|
||||
],
|
||||
};
|
||||
|
||||
export default merge(baseConfig, configuration);
|
||||
@@ -1,79 +0,0 @@
|
||||
/**
|
||||
* Builds the DLL for development electron renderer process
|
||||
*/
|
||||
|
||||
import path from 'path';
|
||||
|
||||
import webpack from 'webpack';
|
||||
import { merge } from 'webpack-merge';
|
||||
|
||||
import { dependencies } from '../../package.json';
|
||||
import checkNodeEnv from '../scripts/check-node-env';
|
||||
import baseConfig from './webpack.config.base';
|
||||
import webpackPaths from './webpack.paths';
|
||||
|
||||
checkNodeEnv('development');
|
||||
|
||||
const dist = webpackPaths.dllPath;
|
||||
|
||||
const configuration: webpack.Configuration = {
|
||||
context: webpackPaths.rootPath,
|
||||
|
||||
devtool: 'eval',
|
||||
|
||||
mode: 'development',
|
||||
|
||||
target: 'electron-renderer',
|
||||
|
||||
externals: ['fsevents', 'crypto-browserify'],
|
||||
|
||||
/**
|
||||
* Use `module` from `webpack.config.renderer.dev.js`
|
||||
*/
|
||||
module: require('./webpack.config.renderer.dev').default.module,
|
||||
|
||||
entry: {
|
||||
renderer: Object.keys(dependencies || {}),
|
||||
},
|
||||
|
||||
output: {
|
||||
path: dist,
|
||||
filename: '[name].dev.dll.js',
|
||||
library: {
|
||||
name: 'renderer',
|
||||
type: 'var',
|
||||
},
|
||||
},
|
||||
|
||||
plugins: [
|
||||
new webpack.DllPlugin({
|
||||
path: path.join(dist, '[name].json'),
|
||||
name: '[name]',
|
||||
}),
|
||||
|
||||
/**
|
||||
* Create global constants which can be configured at compile time.
|
||||
*
|
||||
* Useful for allowing different behaviour between development builds and
|
||||
* release builds
|
||||
*
|
||||
* NODE_ENV should be production so that modules do not perform certain
|
||||
* development checks
|
||||
*/
|
||||
new webpack.EnvironmentPlugin({
|
||||
NODE_ENV: 'development',
|
||||
}),
|
||||
|
||||
new webpack.LoaderOptionsPlugin({
|
||||
debug: true,
|
||||
options: {
|
||||
context: webpackPaths.srcPath,
|
||||
output: {
|
||||
path: webpackPaths.dllPath,
|
||||
},
|
||||
},
|
||||
}),
|
||||
],
|
||||
};
|
||||
|
||||
export default merge(baseConfig, configuration);
|
||||
@@ -1,201 +0,0 @@
|
||||
import 'webpack-dev-server';
|
||||
import { execSync, spawn } from 'child_process';
|
||||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
|
||||
import ReactRefreshWebpackPlugin from '@pmmmwh/react-refresh-webpack-plugin';
|
||||
import chalk from 'chalk';
|
||||
import HtmlWebpackPlugin from 'html-webpack-plugin';
|
||||
import webpack from 'webpack';
|
||||
import { merge } from 'webpack-merge';
|
||||
|
||||
import checkNodeEnv from '../scripts/check-node-env';
|
||||
import baseConfig from './webpack.config.base';
|
||||
import webpackPaths from './webpack.paths';
|
||||
|
||||
// When an ESLint server is running, we can't set the NODE_ENV so we'll check if it's
|
||||
// at the dev webpack config is not accidentally run in a production environment
|
||||
if (process.env.NODE_ENV === 'production') {
|
||||
checkNodeEnv('development');
|
||||
}
|
||||
|
||||
const port = process.env.PORT || 4343;
|
||||
const manifest = path.resolve(webpackPaths.dllPath, 'renderer.json');
|
||||
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
||||
const requiredByDLLConfig = module.parent!.filename.includes('webpack.config.renderer.dev.dll');
|
||||
|
||||
/**
|
||||
* Warn if the DLL is not built
|
||||
*/
|
||||
if (!requiredByDLLConfig && !(fs.existsSync(webpackPaths.dllPath) && fs.existsSync(manifest))) {
|
||||
console.log(
|
||||
chalk.black.bgYellow.bold(
|
||||
'The DLL files are missing. Sit back while we build them for you with "npm run build-dll"',
|
||||
),
|
||||
);
|
||||
execSync('npm run postinstall');
|
||||
}
|
||||
|
||||
const configuration: webpack.Configuration = {
|
||||
devtool: 'inline-source-map',
|
||||
|
||||
mode: 'development',
|
||||
|
||||
target: ['web', 'electron-renderer'],
|
||||
|
||||
entry: [
|
||||
`webpack-dev-server/client?http://localhost:${port}/dist`,
|
||||
'webpack/hot/only-dev-server',
|
||||
path.join(webpackPaths.srcRendererPath, 'index.tsx'),
|
||||
],
|
||||
|
||||
output: {
|
||||
path: webpackPaths.distRendererPath,
|
||||
publicPath: '/',
|
||||
filename: 'renderer.dev.js',
|
||||
library: {
|
||||
type: 'umd',
|
||||
},
|
||||
},
|
||||
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: /\.s?css$/,
|
||||
use: [
|
||||
'style-loader',
|
||||
{
|
||||
loader: 'css-loader',
|
||||
options: {
|
||||
modules: {
|
||||
localIdentName: '[name]__[local]--[hash:base64:5]',
|
||||
exportLocalsConvention: 'camelCaseOnly',
|
||||
},
|
||||
sourceMap: true,
|
||||
importLoaders: 1,
|
||||
},
|
||||
},
|
||||
'sass-loader',
|
||||
],
|
||||
include: /\.module\.s?(c|a)ss$/,
|
||||
},
|
||||
{
|
||||
test: /\.s?css$/,
|
||||
use: ['style-loader', 'css-loader', 'sass-loader'],
|
||||
exclude: /\.module\.s?(c|a)ss$/,
|
||||
},
|
||||
// Fonts
|
||||
{
|
||||
test: /\.(woff|woff2|eot|ttf|otf)$/i,
|
||||
type: 'asset/resource',
|
||||
},
|
||||
// Images
|
||||
{
|
||||
test: /\.(png|svg|jpg|jpeg|gif)$/i,
|
||||
type: 'asset/resource',
|
||||
},
|
||||
],
|
||||
},
|
||||
plugins: [
|
||||
...(requiredByDLLConfig
|
||||
? []
|
||||
: [
|
||||
new webpack.DllReferencePlugin({
|
||||
context: webpackPaths.dllPath,
|
||||
manifest: require(manifest),
|
||||
sourceType: 'var',
|
||||
}),
|
||||
]),
|
||||
|
||||
new webpack.NoEmitOnErrorsPlugin(),
|
||||
|
||||
/**
|
||||
* Create global constants which can be configured at compile time.
|
||||
*
|
||||
* Useful for allowing different behaviour between development builds and
|
||||
* release builds
|
||||
*
|
||||
* NODE_ENV should be production so that modules do not perform certain
|
||||
* development checks
|
||||
*
|
||||
* By default, use 'development' as NODE_ENV. This can be overriden with
|
||||
* 'staging', for example, by changing the ENV variables in the npm scripts
|
||||
*/
|
||||
new webpack.EnvironmentPlugin({
|
||||
NODE_ENV: 'development',
|
||||
}),
|
||||
|
||||
new webpack.LoaderOptionsPlugin({
|
||||
debug: true,
|
||||
}),
|
||||
|
||||
new ReactRefreshWebpackPlugin(),
|
||||
|
||||
new HtmlWebpackPlugin({
|
||||
filename: path.join('index.html'),
|
||||
template: path.join(webpackPaths.srcRendererPath, 'index.ejs'),
|
||||
minify: {
|
||||
collapseWhitespace: true,
|
||||
removeAttributeQuotes: true,
|
||||
removeComments: true,
|
||||
},
|
||||
isBrowser: false,
|
||||
env: process.env.NODE_ENV,
|
||||
isDevelopment: process.env.NODE_ENV !== 'production',
|
||||
nodeModules: webpackPaths.appNodeModulesPath,
|
||||
templateParameters: {
|
||||
web: false,
|
||||
},
|
||||
}),
|
||||
],
|
||||
|
||||
node: {
|
||||
__dirname: false,
|
||||
__filename: false,
|
||||
},
|
||||
|
||||
devServer: {
|
||||
port,
|
||||
compress: true,
|
||||
hot: true,
|
||||
headers: { 'Access-Control-Allow-Origin': '*' },
|
||||
static: {
|
||||
publicPath: '/',
|
||||
},
|
||||
historyApiFallback: {
|
||||
verbose: true,
|
||||
},
|
||||
setupMiddlewares(middlewares) {
|
||||
console.log('Starting preload.js builder...');
|
||||
const preloadProcess = spawn('npm', ['run', 'start:preload'], {
|
||||
shell: true,
|
||||
stdio: 'inherit',
|
||||
})
|
||||
.on('close', (code: number) => process.exit(code!))
|
||||
.on('error', (spawnError) => console.error(spawnError));
|
||||
|
||||
console.log('Starting remote.js builder...');
|
||||
const remoteProcess = spawn('npm', ['run', 'start:remote'], {
|
||||
shell: true,
|
||||
stdio: 'inherit',
|
||||
})
|
||||
.on('close', (code: number) => process.exit(code!))
|
||||
.on('error', (spawnError) => console.error(spawnError));
|
||||
|
||||
console.log('Starting Main Process...');
|
||||
spawn('npm', ['run', 'start:main'], {
|
||||
shell: true,
|
||||
stdio: 'inherit',
|
||||
})
|
||||
.on('close', (code: number) => {
|
||||
preloadProcess.kill();
|
||||
remoteProcess.kill();
|
||||
process.exit(code!);
|
||||
})
|
||||
.on('error', (spawnError) => console.error(spawnError));
|
||||
return middlewares;
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default merge(baseConfig, configuration);
|
||||
@@ -1,137 +0,0 @@
|
||||
/**
|
||||
* Build config for electron renderer process
|
||||
*/
|
||||
|
||||
import path from 'path';
|
||||
|
||||
import CssMinimizerPlugin from 'css-minimizer-webpack-plugin';
|
||||
import HtmlWebpackPlugin from 'html-webpack-plugin';
|
||||
import MiniCssExtractPlugin from 'mini-css-extract-plugin';
|
||||
import TerserPlugin from 'terser-webpack-plugin';
|
||||
import webpack from 'webpack';
|
||||
import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer';
|
||||
import { merge } from 'webpack-merge';
|
||||
|
||||
import checkNodeEnv from '../scripts/check-node-env';
|
||||
import deleteSourceMaps from '../scripts/delete-source-maps';
|
||||
import baseConfig from './webpack.config.base';
|
||||
import webpackPaths from './webpack.paths';
|
||||
|
||||
checkNodeEnv('production');
|
||||
deleteSourceMaps();
|
||||
|
||||
const devtoolsConfig =
|
||||
process.env.DEBUG_PROD === 'true'
|
||||
? {
|
||||
devtool: 'source-map',
|
||||
}
|
||||
: {};
|
||||
|
||||
const configuration: webpack.Configuration = {
|
||||
...devtoolsConfig,
|
||||
|
||||
mode: 'production',
|
||||
|
||||
target: ['web', 'electron-renderer'],
|
||||
|
||||
entry: [path.join(webpackPaths.srcRendererPath, 'index.tsx')],
|
||||
|
||||
output: {
|
||||
path: webpackPaths.distRendererPath,
|
||||
publicPath: './',
|
||||
filename: 'renderer.js',
|
||||
library: {
|
||||
type: 'umd',
|
||||
},
|
||||
},
|
||||
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: /\.s?(a|c)ss$/,
|
||||
use: [
|
||||
MiniCssExtractPlugin.loader,
|
||||
{
|
||||
loader: 'css-loader',
|
||||
options: {
|
||||
modules: {
|
||||
localIdentName: '[name]__[local]--[hash:base64:5]',
|
||||
exportLocalsConvention: 'camelCaseOnly',
|
||||
},
|
||||
sourceMap: true,
|
||||
importLoaders: 1,
|
||||
},
|
||||
},
|
||||
'sass-loader',
|
||||
],
|
||||
include: /\.module\.s?(c|a)ss$/,
|
||||
},
|
||||
{
|
||||
test: /\.s?(a|c)ss$/,
|
||||
use: [MiniCssExtractPlugin.loader, 'css-loader', 'sass-loader'],
|
||||
exclude: /\.module\.s?(c|a)ss$/,
|
||||
},
|
||||
// Fonts
|
||||
{
|
||||
test: /\.(woff|woff2|eot|ttf|otf)$/i,
|
||||
type: 'asset/resource',
|
||||
},
|
||||
// Images
|
||||
{
|
||||
test: /\.(png|svg|jpg|jpeg|gif)$/i,
|
||||
type: 'asset/resource',
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
optimization: {
|
||||
minimize: true,
|
||||
minimizer: [
|
||||
new TerserPlugin({
|
||||
parallel: true,
|
||||
}),
|
||||
new CssMinimizerPlugin(),
|
||||
],
|
||||
},
|
||||
|
||||
plugins: [
|
||||
/**
|
||||
* Create global constants which can be configured at compile time.
|
||||
*
|
||||
* Useful for allowing different behaviour between development builds and
|
||||
* release builds
|
||||
*
|
||||
* NODE_ENV should be production so that modules do not perform certain
|
||||
* development checks
|
||||
*/
|
||||
new webpack.EnvironmentPlugin({
|
||||
NODE_ENV: 'production',
|
||||
DEBUG_PROD: false,
|
||||
}),
|
||||
|
||||
new MiniCssExtractPlugin({
|
||||
filename: 'style.css',
|
||||
}),
|
||||
|
||||
new BundleAnalyzerPlugin({
|
||||
analyzerMode: process.env.ANALYZE === 'true' ? 'server' : 'disabled',
|
||||
}),
|
||||
|
||||
new HtmlWebpackPlugin({
|
||||
filename: 'index.html',
|
||||
template: path.join(webpackPaths.srcRendererPath, 'index.ejs'),
|
||||
minify: {
|
||||
collapseWhitespace: true,
|
||||
removeAttributeQuotes: true,
|
||||
removeComments: true,
|
||||
},
|
||||
isBrowser: false,
|
||||
isDevelopment: process.env.NODE_ENV !== 'production',
|
||||
templateParameters: {
|
||||
web: false,
|
||||
},
|
||||
}),
|
||||
],
|
||||
};
|
||||
|
||||
export default merge(baseConfig, configuration);
|
||||
@@ -1,147 +0,0 @@
|
||||
import 'webpack-dev-server';
|
||||
import path from 'path';
|
||||
|
||||
import ReactRefreshWebpackPlugin from '@pmmmwh/react-refresh-webpack-plugin';
|
||||
import HtmlWebpackPlugin from 'html-webpack-plugin';
|
||||
import webpack from 'webpack';
|
||||
import { merge } from 'webpack-merge';
|
||||
|
||||
import checkNodeEnv from '../scripts/check-node-env';
|
||||
import baseConfig from './webpack.config.base';
|
||||
import webpackPaths from './webpack.paths';
|
||||
|
||||
// When an ESLint server is running, we can't set the NODE_ENV so we'll check if it's
|
||||
// at the dev webpack config is not accidentally run in a production environment
|
||||
if (process.env.NODE_ENV === 'production') {
|
||||
checkNodeEnv('development');
|
||||
}
|
||||
|
||||
const port = process.env.PORT || 4343;
|
||||
|
||||
const configuration: webpack.Configuration = {
|
||||
devtool: 'inline-source-map',
|
||||
|
||||
mode: 'development',
|
||||
|
||||
target: ['web', 'electron-renderer'],
|
||||
|
||||
entry: [
|
||||
`webpack-dev-server/client?http://localhost:${port}/dist`,
|
||||
'webpack/hot/only-dev-server',
|
||||
path.join(webpackPaths.srcRendererPath, 'index.tsx'),
|
||||
],
|
||||
|
||||
output: {
|
||||
path: webpackPaths.distRendererPath,
|
||||
publicPath: '/',
|
||||
filename: 'renderer.dev.js',
|
||||
library: {
|
||||
type: 'umd',
|
||||
},
|
||||
},
|
||||
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: /\.s?css$/,
|
||||
use: [
|
||||
'style-loader',
|
||||
{
|
||||
loader: 'css-loader',
|
||||
options: {
|
||||
modules: {
|
||||
localIdentName: '[name]__[local]--[hash:base64:5]',
|
||||
exportLocalsConvention: 'camelCaseOnly',
|
||||
},
|
||||
sourceMap: true,
|
||||
importLoaders: 1,
|
||||
},
|
||||
},
|
||||
'sass-loader',
|
||||
],
|
||||
include: /\.module\.s?(c|a)ss$/,
|
||||
},
|
||||
{
|
||||
test: /\.s?css$/,
|
||||
use: ['style-loader', 'css-loader', 'sass-loader'],
|
||||
exclude: /\.module\.s?(c|a)ss$/,
|
||||
},
|
||||
// Fonts
|
||||
{
|
||||
test: /\.(woff|woff2|eot|ttf|otf)$/i,
|
||||
type: 'asset/resource',
|
||||
},
|
||||
// Images
|
||||
{
|
||||
test: /\.(png|svg|jpg|jpeg|gif)$/i,
|
||||
type: 'asset/resource',
|
||||
},
|
||||
],
|
||||
},
|
||||
plugins: [
|
||||
new webpack.NoEmitOnErrorsPlugin(),
|
||||
|
||||
/**
|
||||
* Create global constants which can be configured at compile time.
|
||||
*
|
||||
* Useful for allowing different behaviour between development builds and
|
||||
* release builds
|
||||
*
|
||||
* NODE_ENV should be production so that modules do not perform certain
|
||||
* development checks
|
||||
*
|
||||
* By default, use 'development' as NODE_ENV. This can be overriden with
|
||||
* 'staging', for example, by changing the ENV variables in the npm scripts
|
||||
*/
|
||||
new webpack.EnvironmentPlugin({
|
||||
NODE_ENV: 'development',
|
||||
}),
|
||||
|
||||
new webpack.LoaderOptionsPlugin({
|
||||
debug: true,
|
||||
}),
|
||||
|
||||
new ReactRefreshWebpackPlugin(),
|
||||
|
||||
new HtmlWebpackPlugin({
|
||||
filename: path.join('index.html'),
|
||||
template: path.join(webpackPaths.srcRendererPath, 'index.ejs'),
|
||||
favicon: path.join(webpackPaths.assetsPath, 'icons', 'favicon.ico'),
|
||||
minify: {
|
||||
collapseWhitespace: true,
|
||||
removeAttributeQuotes: true,
|
||||
removeComments: true,
|
||||
},
|
||||
isBrowser: false,
|
||||
env: process.env.NODE_ENV,
|
||||
isDevelopment: process.env.NODE_ENV !== 'production',
|
||||
nodeModules: webpackPaths.appNodeModulesPath,
|
||||
templateParameters: {
|
||||
web: false, // with hot reload, we don't have NGINX injecting variables
|
||||
},
|
||||
}),
|
||||
],
|
||||
|
||||
node: {
|
||||
__dirname: false,
|
||||
__filename: false,
|
||||
},
|
||||
|
||||
devServer: {
|
||||
port,
|
||||
compress: true,
|
||||
hot: true,
|
||||
headers: { 'Access-Control-Allow-Origin': '*' },
|
||||
static: {
|
||||
publicPath: '/',
|
||||
},
|
||||
historyApiFallback: {
|
||||
verbose: true,
|
||||
},
|
||||
setupMiddlewares(middlewares) {
|
||||
return middlewares;
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default merge(baseConfig, configuration);
|
||||
@@ -1,138 +0,0 @@
|
||||
/**
|
||||
* Build config for electron renderer process
|
||||
*/
|
||||
|
||||
import path from 'path';
|
||||
|
||||
import CssMinimizerPlugin from 'css-minimizer-webpack-plugin';
|
||||
import HtmlWebpackPlugin from 'html-webpack-plugin';
|
||||
import MiniCssExtractPlugin from 'mini-css-extract-plugin';
|
||||
import TerserPlugin from 'terser-webpack-plugin';
|
||||
import webpack from 'webpack';
|
||||
import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer';
|
||||
import { merge } from 'webpack-merge';
|
||||
|
||||
import checkNodeEnv from '../scripts/check-node-env';
|
||||
import deleteSourceMaps from '../scripts/delete-source-maps';
|
||||
import baseConfig from './webpack.config.base';
|
||||
import webpackPaths from './webpack.paths';
|
||||
|
||||
checkNodeEnv('production');
|
||||
deleteSourceMaps();
|
||||
|
||||
const devtoolsConfig =
|
||||
process.env.DEBUG_PROD === 'true'
|
||||
? {
|
||||
devtool: 'source-map',
|
||||
}
|
||||
: {};
|
||||
|
||||
const configuration: webpack.Configuration = {
|
||||
...devtoolsConfig,
|
||||
|
||||
mode: 'production',
|
||||
|
||||
target: ['web'],
|
||||
|
||||
entry: [path.join(webpackPaths.srcRendererPath, 'index.tsx')],
|
||||
|
||||
output: {
|
||||
path: webpackPaths.distWebPath,
|
||||
publicPath: 'auto',
|
||||
filename: 'renderer.js',
|
||||
library: {
|
||||
type: 'umd',
|
||||
},
|
||||
},
|
||||
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: /\.s?(a|c)ss$/,
|
||||
use: [
|
||||
MiniCssExtractPlugin.loader,
|
||||
{
|
||||
loader: 'css-loader',
|
||||
options: {
|
||||
modules: {
|
||||
localIdentName: '[name]__[local]--[hash:base64:5]',
|
||||
exportLocalsConvention: 'camelCaseOnly',
|
||||
},
|
||||
sourceMap: true,
|
||||
importLoaders: 1,
|
||||
},
|
||||
},
|
||||
'sass-loader',
|
||||
],
|
||||
include: /\.module\.s?(c|a)ss$/,
|
||||
},
|
||||
{
|
||||
test: /\.s?(a|c)ss$/,
|
||||
use: [MiniCssExtractPlugin.loader, 'css-loader', 'sass-loader'],
|
||||
exclude: /\.module\.s?(c|a)ss$/,
|
||||
},
|
||||
// Fonts
|
||||
{
|
||||
test: /\.(woff|woff2|eot|ttf|otf)$/i,
|
||||
type: 'asset/resource',
|
||||
},
|
||||
// Images
|
||||
{
|
||||
test: /\.(png|svg|jpg|jpeg|gif)$/i,
|
||||
type: 'asset/resource',
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
optimization: {
|
||||
minimize: true,
|
||||
minimizer: [
|
||||
new TerserPlugin({
|
||||
parallel: true,
|
||||
}),
|
||||
new CssMinimizerPlugin(),
|
||||
],
|
||||
},
|
||||
|
||||
plugins: [
|
||||
/**
|
||||
* Create global constants which can be configured at compile time.
|
||||
*
|
||||
* Useful for allowing different behaviour between development builds and
|
||||
* release builds
|
||||
*
|
||||
* NODE_ENV should be production so that modules do not perform certain
|
||||
* development checks
|
||||
*/
|
||||
new webpack.EnvironmentPlugin({
|
||||
NODE_ENV: 'production',
|
||||
DEBUG_PROD: false,
|
||||
}),
|
||||
|
||||
new MiniCssExtractPlugin({
|
||||
filename: 'style.css',
|
||||
}),
|
||||
|
||||
new BundleAnalyzerPlugin({
|
||||
analyzerMode: process.env.ANALYZE === 'true' ? 'server' : 'disabled',
|
||||
}),
|
||||
|
||||
new HtmlWebpackPlugin({
|
||||
filename: 'index.html',
|
||||
template: path.join(webpackPaths.srcRendererPath, 'index.ejs'),
|
||||
favicon: path.join(webpackPaths.assetsPath, 'icons', 'favicon.ico'),
|
||||
minify: {
|
||||
collapseWhitespace: true,
|
||||
removeAttributeQuotes: true,
|
||||
removeComments: true,
|
||||
},
|
||||
isBrowser: false,
|
||||
isDevelopment: process.env.NODE_ENV !== 'production',
|
||||
templateParameters: {
|
||||
web: true,
|
||||
},
|
||||
}),
|
||||
],
|
||||
};
|
||||
|
||||
export default merge(baseConfig, configuration);
|
||||
@@ -1,46 +0,0 @@
|
||||
const path = require('path');
|
||||
|
||||
const rootPath = path.join(__dirname, '../..');
|
||||
|
||||
const dllPath = path.join(__dirname, '../dll');
|
||||
|
||||
const srcPath = path.join(rootPath, 'src');
|
||||
const assetsPath = path.join(rootPath, 'assets');
|
||||
const srcMainPath = path.join(srcPath, 'main');
|
||||
const srcRemotePath = path.join(srcPath, 'remote');
|
||||
const srcRendererPath = path.join(srcPath, 'renderer');
|
||||
|
||||
const releasePath = path.join(rootPath, 'release');
|
||||
const appPath = path.join(releasePath, 'app');
|
||||
const appPackagePath = path.join(appPath, 'package.json');
|
||||
const appNodeModulesPath = path.join(appPath, 'node_modules');
|
||||
const srcNodeModulesPath = path.join(srcPath, 'node_modules');
|
||||
|
||||
const distPath = path.join(appPath, 'dist');
|
||||
const distMainPath = path.join(distPath, 'main');
|
||||
const distRemotePath = path.join(distPath, 'remote');
|
||||
const distRendererPath = path.join(distPath, 'renderer');
|
||||
const distWebPath = path.join(distPath, 'web');
|
||||
|
||||
const buildPath = path.join(releasePath, 'build');
|
||||
|
||||
export default {
|
||||
assetsPath,
|
||||
rootPath,
|
||||
dllPath,
|
||||
srcPath,
|
||||
srcMainPath,
|
||||
srcRemotePath,
|
||||
srcRendererPath,
|
||||
releasePath,
|
||||
appPath,
|
||||
appPackagePath,
|
||||
appNodeModulesPath,
|
||||
srcNodeModulesPath,
|
||||
distPath,
|
||||
distMainPath,
|
||||
distRemotePath,
|
||||
distRendererPath,
|
||||
distWebPath,
|
||||
buildPath,
|
||||
};
|
||||
@@ -1 +0,0 @@
|
||||
export default 'test-file-stub';
|
||||
@@ -1,8 +0,0 @@
|
||||
{
|
||||
"rules": {
|
||||
"no-console": "off",
|
||||
"global-require": "off",
|
||||
"import/no-dynamic-require": "off",
|
||||
"import/no-extraneous-dependencies": "off"
|
||||
}
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
// Check if the renderer and main bundles are built
|
||||
import path from 'path';
|
||||
import chalk from 'chalk';
|
||||
import fs from 'fs';
|
||||
import webpackPaths from '../configs/webpack.paths';
|
||||
|
||||
const mainPath = path.join(webpackPaths.distMainPath, 'main.js');
|
||||
const remotePath = path.join(webpackPaths.distMainPath, 'remote.js');
|
||||
const rendererPath = path.join(webpackPaths.distRendererPath, 'renderer.js');
|
||||
|
||||
if (!fs.existsSync(mainPath)) {
|
||||
throw new Error(
|
||||
chalk.whiteBright.bgRed.bold(
|
||||
'The main process is not built yet. Build it by running "npm run build:main"',
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
if (!fs.existsSync(remotePath)) {
|
||||
throw new Error(
|
||||
chalk.whiteBright.bgRed.bold(
|
||||
'The remote process is not built yet. Build it by running "npm run build:remote"',
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
if (!fs.existsSync(rendererPath)) {
|
||||
throw new Error(
|
||||
chalk.whiteBright.bgRed.bold(
|
||||
'The renderer process is not built yet. Build it by running "npm run build:renderer"',
|
||||
),
|
||||
);
|
||||
}
|
||||
@@ -1,54 +0,0 @@
|
||||
import fs from 'fs';
|
||||
import chalk from 'chalk';
|
||||
import { execSync } from 'child_process';
|
||||
import { dependencies } from '../../package.json';
|
||||
|
||||
if (dependencies) {
|
||||
const dependenciesKeys = Object.keys(dependencies);
|
||||
const nativeDeps = fs
|
||||
.readdirSync('node_modules')
|
||||
.filter((folder) => fs.existsSync(`node_modules/${folder}/binding.gyp`));
|
||||
if (nativeDeps.length === 0) {
|
||||
process.exit(0);
|
||||
}
|
||||
try {
|
||||
// Find the reason for why the dependency is installed. If it is installed
|
||||
// because of a devDependency then that is okay. Warn when it is installed
|
||||
// because of a dependency
|
||||
const { dependencies: dependenciesObject } = JSON.parse(
|
||||
execSync(`npm ls ${nativeDeps.join(' ')} --json`).toString()
|
||||
);
|
||||
const rootDependencies = Object.keys(dependenciesObject);
|
||||
const filteredRootDependencies = rootDependencies.filter((rootDependency) =>
|
||||
dependenciesKeys.includes(rootDependency)
|
||||
);
|
||||
if (filteredRootDependencies.length > 0) {
|
||||
const plural = filteredRootDependencies.length > 1;
|
||||
console.log(`
|
||||
${chalk.whiteBright.bgYellow.bold(
|
||||
'Webpack does not work with native dependencies.'
|
||||
)}
|
||||
${chalk.bold(filteredRootDependencies.join(', '))} ${
|
||||
plural ? 'are native dependencies' : 'is a native dependency'
|
||||
} and should be installed inside of the "./release/app" folder.
|
||||
First, uninstall the packages from "./package.json":
|
||||
${chalk.whiteBright.bgGreen.bold('npm uninstall your-package')}
|
||||
${chalk.bold(
|
||||
'Then, instead of installing the package to the root "./package.json":'
|
||||
)}
|
||||
${chalk.whiteBright.bgRed.bold('npm install your-package')}
|
||||
${chalk.bold('Install the package to "./release/app/package.json"')}
|
||||
${chalk.whiteBright.bgGreen.bold(
|
||||
'cd ./release/app && npm install your-package'
|
||||
)}
|
||||
Read more about native dependencies at:
|
||||
${chalk.bold(
|
||||
'https://electron-react-boilerplate.js.org/docs/adding-dependencies/#module-structure'
|
||||
)}
|
||||
`);
|
||||
process.exit(1);
|
||||
}
|
||||
} catch (e) {
|
||||
console.log('Native dependencies could not be checked');
|
||||
}
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
import chalk from 'chalk';
|
||||
|
||||
export default function checkNodeEnv(expectedEnv) {
|
||||
if (!expectedEnv) {
|
||||
throw new Error('"expectedEnv" not set');
|
||||
}
|
||||
|
||||
if (process.env.NODE_ENV !== expectedEnv) {
|
||||
console.log(
|
||||
chalk.whiteBright.bgRed.bold(
|
||||
`"process.env.NODE_ENV" must be "${expectedEnv}" to use this webpack config`
|
||||
)
|
||||
);
|
||||
process.exit(2);
|
||||
}
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
import chalk from 'chalk';
|
||||
import detectPort from 'detect-port';
|
||||
|
||||
const port = process.env.PORT || '4343';
|
||||
|
||||
detectPort(port, (err, availablePort) => {
|
||||
if (port !== String(availablePort)) {
|
||||
throw new Error(
|
||||
chalk.whiteBright.bgRed.bold(
|
||||
`Port "${port}" on "localhost" is already in use. Please use another port. ex: PORT=4343 npm start`
|
||||
)
|
||||
);
|
||||
} else {
|
||||
process.exit(0);
|
||||
}
|
||||
});
|
||||
@@ -1,17 +0,0 @@
|
||||
import rimraf from 'rimraf';
|
||||
import process from 'process';
|
||||
import webpackPaths from '../configs/webpack.paths';
|
||||
|
||||
const args = process.argv.slice(2);
|
||||
const commandMap = {
|
||||
dist: webpackPaths.distPath,
|
||||
release: webpackPaths.releasePath,
|
||||
dll: webpackPaths.dllPath,
|
||||
};
|
||||
|
||||
args.forEach((x) => {
|
||||
const pathToRemove = commandMap[x];
|
||||
if (pathToRemove !== undefined) {
|
||||
rimraf.sync(pathToRemove);
|
||||
}
|
||||
});
|
||||
@@ -1,9 +0,0 @@
|
||||
import path from 'path';
|
||||
import rimraf from 'rimraf';
|
||||
import webpackPaths from '../configs/webpack.paths';
|
||||
|
||||
export default function deleteSourceMaps() {
|
||||
rimraf.sync(path.join(webpackPaths.distMainPath, '*.js.map'));
|
||||
rimraf.sync(path.join(webpackPaths.distRemotePath, '*.js.map'));
|
||||
rimraf.sync(path.join(webpackPaths.distRendererPath, '*.js.map'));
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
import { execSync } from 'child_process';
|
||||
import fs from 'fs';
|
||||
import { dependencies } from '../../release/app/package.json';
|
||||
import webpackPaths from '../configs/webpack.paths';
|
||||
|
||||
if (
|
||||
Object.keys(dependencies || {}).length > 0 &&
|
||||
fs.existsSync(webpackPaths.appNodeModulesPath)
|
||||
) {
|
||||
const electronRebuildCmd =
|
||||
'../../node_modules/.bin/electron-rebuild --force --types prod,dev,optional --module-dir .';
|
||||
const cmd =
|
||||
process.platform === 'win32'
|
||||
? electronRebuildCmd.replace(/\//g, '\\')
|
||||
: electronRebuildCmd;
|
||||
execSync(cmd, {
|
||||
cwd: webpackPaths.appPath,
|
||||
stdio: 'inherit',
|
||||
});
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
import fs from 'fs';
|
||||
import webpackPaths from '../configs/webpack.paths';
|
||||
|
||||
const { srcNodeModulesPath } = webpackPaths;
|
||||
const { appNodeModulesPath } = webpackPaths;
|
||||
|
||||
if (!fs.existsSync(srcNodeModulesPath) && fs.existsSync(appNodeModulesPath)) {
|
||||
fs.symlinkSync(appNodeModulesPath, srcNodeModulesPath, 'junction');
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
const { notarize } = require('electron-notarize');
|
||||
const { build } = require('../../package.json');
|
||||
|
||||
exports.default = async function notarizeMacos(context) {
|
||||
const { electronPlatformName, appOutDir } = context;
|
||||
if (electronPlatformName !== 'darwin') {
|
||||
return;
|
||||
}
|
||||
|
||||
if (process.env.CI !== 'true') {
|
||||
console.warn('Skipping notarizing step. Packaging is not running in CI');
|
||||
return;
|
||||
}
|
||||
|
||||
if (!('APPLE_ID' in process.env && 'APPLE_ID_PASS' in process.env)) {
|
||||
console.warn(
|
||||
'Skipping notarizing step. APPLE_ID and APPLE_ID_PASS env variables must be set'
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
const appName = context.packager.appInfo.productFilename;
|
||||
|
||||
await notarize({
|
||||
appBundleId: build.appId,
|
||||
appPath: `${appOutDir}/${appName}.app`,
|
||||
appleId: process.env.APPLE_ID,
|
||||
appleIdPassword: process.env.APPLE_ID_PASS,
|
||||
});
|
||||
};
|
||||
@@ -1,34 +0,0 @@
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
|
||||
# Runtime data
|
||||
pids
|
||||
*.pid
|
||||
*.seed
|
||||
|
||||
# Coverage directory used by tools like istanbul
|
||||
coverage
|
||||
.eslintcache
|
||||
|
||||
# Dependency directory
|
||||
# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
|
||||
node_modules
|
||||
|
||||
# OSX
|
||||
.DS_Store
|
||||
|
||||
src/i18n
|
||||
release/app/dist
|
||||
release/build
|
||||
.erb/dll
|
||||
|
||||
.idea
|
||||
npm-debug.log.*
|
||||
*.css.d.ts
|
||||
*.sass.d.ts
|
||||
*.scss.d.ts
|
||||
|
||||
# eslint ignores hidden directories by default:
|
||||
# https://github.com/eslint/eslint/issues/8429
|
||||
!.erb
|
||||
@@ -1,97 +0,0 @@
|
||||
module.exports = {
|
||||
extends: ['erb', 'plugin:typescript-sort-keys/recommended'],
|
||||
ignorePatterns: ['.erb/*', 'server'],
|
||||
parser: '@typescript-eslint/parser',
|
||||
parserOptions: {
|
||||
createDefaultProgram: true,
|
||||
ecmaVersion: 12,
|
||||
parser: '@typescript-eslint/parser',
|
||||
project: './tsconfig.json',
|
||||
sourceType: 'module',
|
||||
tsconfigRootDir: './',
|
||||
},
|
||||
plugins: ['@typescript-eslint', 'import', 'sort-keys-fix'],
|
||||
rules: {
|
||||
'@typescript-eslint/naming-convention': 'off',
|
||||
'@typescript-eslint/no-explicit-any': 'off',
|
||||
'@typescript-eslint/no-non-null-assertion': 'off',
|
||||
'@typescript-eslint/no-shadow': ['off'],
|
||||
'@typescript-eslint/no-unused-vars': ['error'],
|
||||
'@typescript-eslint/no-use-before-define': ['error'],
|
||||
'default-case': 'off',
|
||||
'import/extensions': 'off',
|
||||
'import/no-absolute-path': 'off',
|
||||
// A temporary hack related to IDE not resolving correct package.json
|
||||
'import/no-extraneous-dependencies': 'off',
|
||||
'import/no-unresolved': 'error',
|
||||
'import/order': [
|
||||
'error',
|
||||
{
|
||||
alphabetize: {
|
||||
caseInsensitive: true,
|
||||
order: 'asc',
|
||||
},
|
||||
groups: ['builtin', 'external', 'internal', ['parent', 'sibling']],
|
||||
'newlines-between': 'never',
|
||||
pathGroups: [
|
||||
{
|
||||
group: 'external',
|
||||
pattern: 'react',
|
||||
position: 'before',
|
||||
},
|
||||
],
|
||||
pathGroupsExcludedImportTypes: ['react'],
|
||||
},
|
||||
],
|
||||
'import/prefer-default-export': 'off',
|
||||
'jsx-a11y/click-events-have-key-events': 'off',
|
||||
'jsx-a11y/interactive-supports-focus': 'off',
|
||||
'jsx-a11y/media-has-caption': 'off',
|
||||
'no-await-in-loop': 'off',
|
||||
'no-console': 'off',
|
||||
'no-nested-ternary': 'off',
|
||||
'no-restricted-syntax': 'off',
|
||||
'no-shadow': 'off',
|
||||
'no-underscore-dangle': 'off',
|
||||
'no-unused-vars': 'off',
|
||||
'no-use-before-define': 'off',
|
||||
'prefer-destructuring': 'off',
|
||||
'react/function-component-definition': 'off',
|
||||
'react/jsx-filename-extension': [2, { extensions: ['.js', '.jsx', '.ts', '.tsx'] }],
|
||||
'react/jsx-no-useless-fragment': 'off',
|
||||
'react/jsx-props-no-spreading': 'off',
|
||||
'react/jsx-sort-props': [
|
||||
'error',
|
||||
{
|
||||
callbacksLast: true,
|
||||
ignoreCase: false,
|
||||
noSortAlphabetically: false,
|
||||
reservedFirst: true,
|
||||
shorthandFirst: true,
|
||||
shorthandLast: false,
|
||||
},
|
||||
],
|
||||
'react/no-array-index-key': 'off',
|
||||
'react/react-in-jsx-scope': 'off',
|
||||
'react/require-default-props': 'off',
|
||||
'sort-keys-fix/sort-keys-fix': 'warn',
|
||||
},
|
||||
settings: {
|
||||
'import/parsers': {
|
||||
'@typescript-eslint/parser': ['.ts', '.tsx'],
|
||||
},
|
||||
'import/resolver': {
|
||||
// See https://github.com/benmosher/eslint-plugin-import/issues/1396#issuecomment-575727774 for line below
|
||||
node: {
|
||||
extensions: ['.js', '.jsx', '.ts', '.tsx'],
|
||||
},
|
||||
typescript: {
|
||||
alwaysTryTypes: true,
|
||||
project: './tsconfig.json',
|
||||
},
|
||||
webpack: {
|
||||
config: require.resolve('./.erb/configs/webpack.config.eslint.ts'),
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,33 @@
|
||||
name: Feature request
|
||||
description: Request a feature to be added to Feishin
|
||||
title: '[Feature]: '
|
||||
labels: ['enhancement']
|
||||
body:
|
||||
- type: checkboxes
|
||||
id: check-duplicate
|
||||
attributes:
|
||||
label: I have already checked through the existing feature requests and found no duplicates
|
||||
options:
|
||||
- label: 'Yes'
|
||||
required: true
|
||||
|
||||
- type: dropdown
|
||||
id: server-specific
|
||||
attributes:
|
||||
label: Is this a server-specific feature?
|
||||
options:
|
||||
- Not server-specific
|
||||
- OpenSubsonic
|
||||
- Jellyfin
|
||||
- Navidrome
|
||||
default: 0
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: solution
|
||||
attributes:
|
||||
label: What do you want to be added?
|
||||
placeholder: I would like to see [...]
|
||||
validations:
|
||||
required: true
|
||||
@@ -0,0 +1,74 @@
|
||||
name: Bug report
|
||||
description: You're having technical issues.
|
||||
title: '[Bug]: '
|
||||
labels: ['bug']
|
||||
body:
|
||||
- type: checkboxes
|
||||
id: check-duplicate
|
||||
attributes:
|
||||
label: I have already checked through the existing bug reports and found no duplicates
|
||||
options:
|
||||
- label: 'Yes'
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
id: version
|
||||
attributes:
|
||||
label: App Version
|
||||
description: What version of the app are you running?
|
||||
placeholder: ex. 1.0.0
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
id: server-version
|
||||
attributes:
|
||||
label: Music Server and Version
|
||||
description: What music server are you using?
|
||||
placeholder: ex. Navidrome v0.55.0, LMS v3.67.0, Jellyfin v10.10.7, etc.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: dropdown
|
||||
id: environments
|
||||
attributes:
|
||||
label: What local environments are you seeing the problem on?
|
||||
multiple: true
|
||||
options:
|
||||
- Desktop Windows
|
||||
- Desktop macOS
|
||||
- Desktop Linux
|
||||
- Web Firefox
|
||||
- Web Chrome
|
||||
- Web Safari
|
||||
- Web Microsoft Edge
|
||||
- Other (please specify in the next field)
|
||||
|
||||
- type: textarea
|
||||
id: what-happened
|
||||
attributes:
|
||||
label: What happened?
|
||||
description: Also tell us, what did you expect to happen?
|
||||
placeholder: Include screenshots and error logs if possible. The browser devtools can be opened using CTRL + SHIFT + I (Windows/Linux) or CMD + SHIFT + I (macOS).
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: reproduction
|
||||
attributes:
|
||||
label: Steps to reproduce
|
||||
description: How can we reproduce this issue? Are there any specific settings that are enabled that could be the cause?
|
||||
placeholder: |
|
||||
1. Go to '...'
|
||||
2. Click on '....'
|
||||
3. Scroll down to '....'
|
||||
4. See error
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: logs
|
||||
attributes:
|
||||
label: Relevant log output
|
||||
description: Please copy and paste any relevant log output. This will be automatically formatted into code.
|
||||
render: shell
|
||||
@@ -1,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,22 +0,0 @@
|
||||
name: Feature request
|
||||
description: Request a feature to be added to Feishin 🎉
|
||||
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
|
||||
validations:
|
||||
required: false
|
||||
@@ -3,6 +3,7 @@ name: Publish Docker to GHCR
|
||||
permissions: write-all
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
tags:
|
||||
- 'v*.*.*'
|
||||
@@ -49,6 +50,6 @@ jobs:
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
platforms: |
|
||||
linux/amd64
|
||||
linux/arm/v7
|
||||
linux/arm64/v8
|
||||
linux/amd64
|
||||
linux/arm/v7
|
||||
linux/arm64/v8
|
||||
|
||||
@@ -24,11 +24,9 @@ jobs:
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Extract metadata (tags, labels) for Docker
|
||||
id: meta
|
||||
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||
tags: |
|
||||
type=raw,value=latest,enable={{is_default_branch}}
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3
|
||||
- name: Setup Docker buildx
|
||||
@@ -41,6 +39,6 @@ jobs:
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
platforms: |
|
||||
linux/amd64
|
||||
linux/arm/v7
|
||||
linux/arm64/v8
|
||||
linux/amd64
|
||||
linux/arm/v7
|
||||
linux/arm64/v8
|
||||
|
||||
@@ -14,17 +14,15 @@ jobs:
|
||||
- name: Checkout git repo
|
||||
uses: actions/checkout@v1
|
||||
|
||||
- name: Install Node and NPM
|
||||
uses: actions/setup-node@v1
|
||||
- name: Install Node and PNPM
|
||||
uses: pnpm/action-setup@v4
|
||||
with:
|
||||
node-version: 18
|
||||
cache: npm
|
||||
version: 9
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
npm install --legacy-peer-deps
|
||||
run: pnpm install
|
||||
|
||||
- name: Publish releases
|
||||
- name: Build and Publish releases
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
uses: nick-invision/retry@v2.8.2
|
||||
@@ -33,12 +31,11 @@ jobs:
|
||||
max_attempts: 3
|
||||
retry_on: error
|
||||
command: |
|
||||
npm run postinstall
|
||||
npm run build
|
||||
npm exec electron-builder -- --publish always --linux
|
||||
on_retry_command: npm cache clean --force
|
||||
pnpm run package:linux
|
||||
pnpm run publish:linux
|
||||
on_retry_command: pnpm cache delete
|
||||
|
||||
- name: Publish releases (arm64)
|
||||
- name: Build and Publish releases (arm64)
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
uses: nick-invision/retry@v2.8.2
|
||||
@@ -47,7 +44,6 @@ jobs:
|
||||
max_attempts: 3
|
||||
retry_on: error
|
||||
command: |
|
||||
npm run postinstall
|
||||
npm run build
|
||||
npm exec electron-builder -- --publish always --arm64
|
||||
on_retry_command: npm cache clean --force
|
||||
pnpm run package:linux-arm64
|
||||
pnpm run publish:linux-arm64
|
||||
on_retry_command: pnpm cache delete
|
||||
|
||||
@@ -14,17 +14,15 @@ jobs:
|
||||
- name: Checkout git repo
|
||||
uses: actions/checkout@v1
|
||||
|
||||
- name: Install Node and NPM
|
||||
uses: actions/setup-node@v1
|
||||
- name: Install Node and PNPM
|
||||
uses: pnpm/action-setup@v4
|
||||
with:
|
||||
node-version: 18
|
||||
cache: npm
|
||||
version: 9
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
npm install --legacy-peer-deps
|
||||
run: pnpm install
|
||||
|
||||
- name: Publish releases
|
||||
- name: Build and Publish releases
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
uses: nick-invision/retry@v2.8.2
|
||||
@@ -33,7 +31,6 @@ jobs:
|
||||
max_attempts: 3
|
||||
retry_on: error
|
||||
command: |
|
||||
npm run postinstall
|
||||
npm run build
|
||||
npm exec electron-builder -- --publish always --mac
|
||||
on_retry_command: npm cache clean --force
|
||||
pnpm run package:mac
|
||||
pnpm run publish:mac
|
||||
on_retry_command: pnpm cache delete
|
||||
|
||||
@@ -11,50 +11,83 @@ jobs:
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
os: [macos-latest]
|
||||
os: [macos-latest, ubuntu-latest, windows-latest]
|
||||
|
||||
steps:
|
||||
- name: Checkout git repo
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Install Node and NPM
|
||||
uses: actions/setup-node@v3
|
||||
- name: Install Node and PNPM
|
||||
uses: pnpm/action-setup@v4
|
||||
with:
|
||||
node-version: 18
|
||||
cache: npm
|
||||
version: 9
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
npm install --legacy-peer-deps
|
||||
run: pnpm install
|
||||
|
||||
- name: Build releases
|
||||
- name: Build for Windows
|
||||
if: ${{ matrix.os == 'windows-latest' }}
|
||||
uses: nick-invision/retry@v2.8.2
|
||||
with:
|
||||
timeout_minutes: 30
|
||||
max_attempts: 3
|
||||
retry_on: error
|
||||
command: |
|
||||
npm run postinstall
|
||||
npm run build
|
||||
npm run package:pr
|
||||
on_retry_command: npm cache clean --force
|
||||
pnpm run package:win:pr
|
||||
|
||||
- uses: actions/upload-artifact@v3
|
||||
- name: Build for Linux
|
||||
if: ${{ matrix.os == 'ubuntu-latest' }}
|
||||
uses: nick-invision/retry@v2.8.2
|
||||
with:
|
||||
timeout_minutes: 30
|
||||
max_attempts: 3
|
||||
retry_on: error
|
||||
command: |
|
||||
pnpm run package:linux:pr
|
||||
|
||||
- name: Build for MacOS
|
||||
if: ${{ matrix.os == 'macos-latest' }}
|
||||
uses: nick-invision/retry@v2.8.2
|
||||
with:
|
||||
timeout_minutes: 30
|
||||
max_attempts: 3
|
||||
retry_on: error
|
||||
command: |
|
||||
pnpm run package:mac:pr
|
||||
|
||||
- name: Zip Windows Binaries
|
||||
if: ${{ matrix.os == 'windows-latest' }}
|
||||
shell: pwsh
|
||||
run: |
|
||||
Compress-Archive -Path "dist/*.exe" -DestinationPath "dist/windows-binaries.zip" -Force
|
||||
|
||||
- name: Zip Linux Binaries
|
||||
if: ${{ matrix.os == 'ubuntu-latest' }}
|
||||
run: |
|
||||
zip -r dist/linux-binaries.zip dist/*.{AppImage,deb,rpm}
|
||||
|
||||
- name: Zip MacOS Binaries
|
||||
if: ${{ matrix.os == 'macos-latest' }}
|
||||
run: |
|
||||
zip -r dist/macos-binaries.zip dist/*.dmg
|
||||
|
||||
- name: Upload Windows Binaries
|
||||
if: ${{ matrix.os == 'windows-latest' }}
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: windows-binaries
|
||||
path: |
|
||||
release/build/*.exe
|
||||
path: dist/windows-binaries.zip
|
||||
|
||||
- uses: actions/upload-artifact@v3
|
||||
- name: Upload Linux Binaries
|
||||
if: ${{ matrix.os == 'ubuntu-latest' }}
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: linux-binaries
|
||||
path: |
|
||||
release/build/*.AppImage
|
||||
release/build/*.deb
|
||||
release/build/*.rpm
|
||||
path: dist/linux-binaries.zip
|
||||
|
||||
- uses: actions/upload-artifact@v3
|
||||
- name: Upload MacOS Binaries
|
||||
if: ${{ matrix.os == 'macos-latest' }}
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: macos-binaries
|
||||
path: |
|
||||
release/build/*.dmg
|
||||
path: dist/macos-binaries.zip
|
||||
|
||||
@@ -14,17 +14,15 @@ jobs:
|
||||
- name: Checkout git repo
|
||||
uses: actions/checkout@v1
|
||||
|
||||
- name: Install Node and NPM
|
||||
uses: actions/setup-node@v1
|
||||
- name: Install Node and PNPM
|
||||
uses: pnpm/action-setup@v4
|
||||
with:
|
||||
node-version: 18
|
||||
cache: npm
|
||||
version: 9
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
npm install --legacy-peer-deps
|
||||
run: pnpm install
|
||||
|
||||
- name: Publish releases
|
||||
- name: Build and Publish releases
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
uses: nick-invision/retry@v2.8.2
|
||||
@@ -33,7 +31,6 @@ jobs:
|
||||
max_attempts: 3
|
||||
retry_on: error
|
||||
command: |
|
||||
npm run postinstall
|
||||
npm run build
|
||||
npm exec electron-builder -- --publish always --win
|
||||
on_retry_command: npm cache clean --force
|
||||
pnpm run package:win
|
||||
pnpm run publish:win
|
||||
on_retry_command: pnpm cache delete
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
name: 'Close stale issues and PRs'
|
||||
on:
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
- cron: '30 1 * * *'
|
||||
permissions:
|
||||
contents: read
|
||||
jobs:
|
||||
stale:
|
||||
permissions:
|
||||
issues: write
|
||||
pull-requests: write
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: dessant/lock-threads@v5
|
||||
with:
|
||||
process-only: 'issues, prs'
|
||||
issue-inactive-days: 120
|
||||
pr-inactive-days: 120
|
||||
log-output: true
|
||||
add-issue-labels: 'frozen-due-to-age'
|
||||
add-pr-labels: 'frozen-due-to-age'
|
||||
- uses: actions/stale@v9
|
||||
with:
|
||||
operations-per-run: 999
|
||||
days-before-issue-stale: 180
|
||||
days-before-pr-stale: 180
|
||||
days-before-issue-close: 30
|
||||
days-before-pr-close: 30
|
||||
stale-issue-message: >
|
||||
This issue has been automatically marked as stale because it has not had recent activity. The resources of the Feishin team are limited, and so we are asking for your help.
|
||||
|
||||
If this is a **bug** and you can still reproduce this error on the <code>development</code> branch, please reply with all of the information you have about it in order to keep the issue open.
|
||||
|
||||
This issue will automatically be closed in the near future if no further activity occurs. Thank you for all your contributions.
|
||||
|
||||
|
||||
stale-pr-message: >
|
||||
This PR has been automatically marked as stale because it has not had recent activity. The resources of the Feishin team are limited, and so we are asking for your help.
|
||||
|
||||
This PR will automatically be closed in the near future if no further activity occurs. Thank you for all your contributions.
|
||||
|
||||
|
||||
stale-issue-label: 'stale'
|
||||
exempt-issue-labels: 'enhancement,keep,security'
|
||||
stale-pr-label: 'stale'
|
||||
exempt-pr-labels: 'keep,security'
|
||||
@@ -14,21 +14,13 @@ jobs:
|
||||
- name: Check out Git repository
|
||||
uses: actions/checkout@v1
|
||||
|
||||
- name: Install Node.js and NPM
|
||||
uses: actions/setup-node@v2
|
||||
- name: Install Node.js and PNPM
|
||||
uses: pnpm/action-setup@v4
|
||||
with:
|
||||
node-version: 16
|
||||
cache: npm
|
||||
version: 9
|
||||
|
||||
- name: npm install
|
||||
run: |
|
||||
npm install --legacy-peer-deps
|
||||
- name: Install dependencies
|
||||
run: pnpm install
|
||||
|
||||
- name: npm test
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
npm run lint
|
||||
npm run package
|
||||
npm exec tsc
|
||||
npm test
|
||||
- name: Lint Files
|
||||
run: pnpm run lint
|
||||
|
||||
+5
-29
@@ -1,31 +1,7 @@
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
|
||||
# Runtime data
|
||||
pids
|
||||
*.pid
|
||||
*.seed
|
||||
|
||||
# Coverage directory used by tools like istanbul
|
||||
coverage
|
||||
.eslintcache
|
||||
|
||||
# Dependency directory
|
||||
# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
|
||||
node_modules
|
||||
|
||||
# OSX
|
||||
dist
|
||||
out
|
||||
.DS_Store
|
||||
|
||||
release/app/dist
|
||||
release/build
|
||||
.erb/dll
|
||||
|
||||
.idea
|
||||
npm-debug.log.*
|
||||
*.css.d.ts
|
||||
*.sass.d.ts
|
||||
*.scss.d.ts
|
||||
|
||||
.env*
|
||||
.eslintcache
|
||||
*.log*
|
||||
release
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
#!/bin/sh
|
||||
. "$(dirname "$0")/_/husky.sh"
|
||||
|
||||
npx lint-staged
|
||||
@@ -0,0 +1,6 @@
|
||||
out
|
||||
dist
|
||||
pnpm-lock.yaml
|
||||
LICENSE.md
|
||||
tsconfig.json
|
||||
tsconfig.*.json
|
||||
-22
@@ -1,22 +0,0 @@
|
||||
{
|
||||
"printWidth": 100,
|
||||
"semi": true,
|
||||
"singleQuote": true,
|
||||
"tabWidth": 4,
|
||||
"useTabs": false,
|
||||
"overrides": [
|
||||
{
|
||||
"files": ["**/*.css", "**/*.scss", "**/*.html"],
|
||||
"options": {
|
||||
"singleQuote": true
|
||||
}
|
||||
}
|
||||
],
|
||||
"trailingComma": "all",
|
||||
"bracketSpacing": true,
|
||||
"arrowParens": "always",
|
||||
"proseWrap": "never",
|
||||
"htmlWhitespaceSensitivity": "strict",
|
||||
"endOfLine": "lf",
|
||||
"singleAttributePerLine": true
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
singleQuote: true
|
||||
semi: true
|
||||
printWidth: 100
|
||||
tabWidth: 4
|
||||
trailingComma: all
|
||||
useTabs: false
|
||||
arrowParens: always
|
||||
proseWrap: never
|
||||
htmlWhitespaceSensitivity: strict
|
||||
endOfLine: lf
|
||||
singleAttributePerLine: false
|
||||
bracketSpacing: true
|
||||
plugins:
|
||||
- prettier-plugin-packagejson
|
||||
+9
-7
@@ -1,17 +1,19 @@
|
||||
{
|
||||
"customSyntax": "postcss-styled-syntax",
|
||||
"extends": [
|
||||
"stylelint-config-standard",
|
||||
"stylelint-config-styled-components",
|
||||
"stylelint-config-css-modules",
|
||||
"stylelint-config-recess-order"
|
||||
],
|
||||
"rules": {
|
||||
"declaration-empty-line-before": null,
|
||||
"declaration-block-no-redundant-longhand-properties": null,
|
||||
"selector-class-pattern": null,
|
||||
"block-no-empty": null,
|
||||
"selector-type-case": ["lower", { "ignoreTypes": ["/^\\$\\w+/"] }],
|
||||
"selector-type-no-unknown": [true, { "ignoreTypes": ["/-styled-mixin/", "/^\\$\\w+/"] }],
|
||||
"declaration-colon-newline-after": null,
|
||||
"property-no-vendor-prefix": null
|
||||
"declaration-block-no-shorthand-property-overrides": null,
|
||||
"declaration-block-no-redundant-longhand-properties": null,
|
||||
"at-rule-no-unknown": [true, { "ignoreAtRules": ["mixin", "value"] }],
|
||||
"function-no-unknown": [true, { "ignoreFunctions": ["darken", "alpha", "lighten"] }],
|
||||
"declaration-property-value-no-unknown": null,
|
||||
"no-descending-specificity": null,
|
||||
"no-empty-source": null
|
||||
}
|
||||
}
|
||||
|
||||
Vendored
+1
-8
@@ -1,10 +1,3 @@
|
||||
{
|
||||
"recommendations": [
|
||||
"dbaeumer.vscode-eslint",
|
||||
"EditorConfig.EditorConfig",
|
||||
"stylelint.vscode-stylelint",
|
||||
"esbenp.prettier-vscode",
|
||||
"clinyong.vscode-css-modules",
|
||||
"Huuums.vscode-fast-folder-structure"
|
||||
]
|
||||
"recommendations": ["dbaeumer.vscode-eslint"]
|
||||
}
|
||||
|
||||
Vendored
+37
-26
@@ -1,28 +1,39 @@
|
||||
{
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Electron: Main",
|
||||
"type": "node",
|
||||
"request": "launch",
|
||||
"protocol": "inspector",
|
||||
"runtimeExecutable": "npm",
|
||||
"runtimeArgs": ["run start:main --inspect=5858 --remote-debugging-port=9223"],
|
||||
"preLaunchTask": "Start Webpack Dev"
|
||||
},
|
||||
{
|
||||
"name": "Electron: Renderer",
|
||||
"type": "chrome",
|
||||
"request": "attach",
|
||||
"port": 9223,
|
||||
"webRoot": "${workspaceFolder}",
|
||||
"timeout": 15000
|
||||
}
|
||||
],
|
||||
"compounds": [
|
||||
{
|
||||
"name": "Electron: All",
|
||||
"configurations": ["Electron: Main", "Electron: Renderer"]
|
||||
}
|
||||
]
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Debug Main Process",
|
||||
"type": "node",
|
||||
"request": "launch",
|
||||
"cwd": "${workspaceRoot}",
|
||||
"runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron-vite",
|
||||
"windows": {
|
||||
"runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron-vite.cmd"
|
||||
},
|
||||
"runtimeArgs": ["--sourcemap"],
|
||||
"env": {
|
||||
"REMOTE_DEBUGGING_PORT": "9222"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Debug Renderer Process",
|
||||
"port": 9222,
|
||||
"request": "attach",
|
||||
"type": "chrome",
|
||||
"webRoot": "${workspaceFolder}/src/renderer",
|
||||
"timeout": 60000,
|
||||
"presentation": {
|
||||
"hidden": true
|
||||
}
|
||||
}
|
||||
],
|
||||
"compounds": [
|
||||
{
|
||||
"name": "Debug All",
|
||||
"configurations": ["Debug Main Process", "Debug Renderer Process"],
|
||||
"presentation": {
|
||||
"order": 1
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
Vendored
+22
-10
@@ -1,4 +1,13 @@
|
||||
{
|
||||
"[typescript]": {
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||
},
|
||||
"[javascript]": {
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||
},
|
||||
"[json]": {
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||
},
|
||||
"files.associations": {
|
||||
".eslintrc": "jsonc",
|
||||
".prettierrc": "jsonc",
|
||||
@@ -9,7 +18,7 @@
|
||||
{ "directory": "./", "changeProcessCWD": true },
|
||||
{ "directory": "./server", "changeProcessCWD": true }
|
||||
],
|
||||
"typescript.tsserver.experimental.enableProjectDiagnostics": true,
|
||||
"typescript.tsserver.experimental.enableProjectDiagnostics": false,
|
||||
"editor.codeActionsOnSave": {
|
||||
"source.fixAll.eslint": "explicit",
|
||||
"source.fixAll.stylelint": "explicit",
|
||||
@@ -17,10 +26,6 @@
|
||||
"source.formatDocument": "explicit"
|
||||
},
|
||||
"css.validate": true,
|
||||
"less.validate": false,
|
||||
"scss.validate": true,
|
||||
"scss.lint.unknownAtRules": "warning",
|
||||
"scss.lint.unknownProperties": "warning",
|
||||
"javascript.validate.enable": false,
|
||||
"javascript.format.enable": false,
|
||||
"typescript.format.enable": false,
|
||||
@@ -33,14 +38,21 @@
|
||||
"npm-debug.log.*": true,
|
||||
"test/**/__snapshots__": true,
|
||||
"package-lock.json": true,
|
||||
"*.{css,sass,scss}.d.ts": true
|
||||
"*.{css,sass,scss}.d.ts": true,
|
||||
"out/**/*": true,
|
||||
"dist/**/*": true
|
||||
},
|
||||
"i18n-ally.localesPaths": ["src/i18n", "src/i18n/locales"],
|
||||
"typescript.tsdk": "node_modules\\typescript\\lib",
|
||||
"typescript.preferences.importModuleSpecifier": "non-relative",
|
||||
"stylelint.validate": ["css", "scss", "typescript", "typescriptreact"],
|
||||
"stylelint.config": null,
|
||||
"stylelint.validate": ["css", "postcss"],
|
||||
"typescript.updateImportsOnFileMove.enabled": "always",
|
||||
"[typescript]": { "editor.defaultFormatter": "esbenp.prettier-vscode" },
|
||||
"typescript.preferences.autoImportFileExcludePatterns": [
|
||||
"@mantine/core",
|
||||
"@mantine/modals",
|
||||
"@mantine/dates"
|
||||
],
|
||||
"[typescriptreact]": { "editor.defaultFormatter": "esbenp.prettier-vscode" },
|
||||
"typescript.format.insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces": true,
|
||||
"folderTemplates.structures": [
|
||||
@@ -53,14 +65,14 @@
|
||||
"template": "Functional Component with CSS Modules"
|
||||
},
|
||||
{
|
||||
"fileName": "<FTName | kebabcase>.module.scss"
|
||||
"fileName": "<FTName | kebabcase>.module.css"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"folderTemplates.fileTemplates": {
|
||||
"Functional Component with CSS Modules": [
|
||||
"import styles from './<FTName | kebabcase>.module.scss';",
|
||||
"import styles from './<FTName | kebabcase>.module.css';",
|
||||
"",
|
||||
"interface <FTName | pascalcase>Props {}",
|
||||
"",
|
||||
|
||||
Vendored
-25
@@ -1,25 +0,0 @@
|
||||
{
|
||||
"version": "2.0.0",
|
||||
"tasks": [
|
||||
{
|
||||
"type": "npm",
|
||||
"label": "Start Webpack Dev",
|
||||
"script": "start:renderer",
|
||||
"options": {
|
||||
"cwd": "${workspaceFolder}"
|
||||
},
|
||||
"isBackground": true,
|
||||
"problemMatcher": {
|
||||
"owner": "custom",
|
||||
"pattern": {
|
||||
"regexp": "____________"
|
||||
},
|
||||
"background": {
|
||||
"activeOnStart": true,
|
||||
"beginsPattern": "Compiling\\.\\.\\.$",
|
||||
"endsPattern": "(Compiled successfully|Failed to compile)\\.$"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
+11
-8
@@ -1,19 +1,22 @@
|
||||
# --- Builder stage
|
||||
FROM node:18-alpine as builder
|
||||
FROM node:23-alpine as builder
|
||||
WORKDIR /app
|
||||
|
||||
#Copy package.json first to cache node_modules
|
||||
COPY package.json package-lock.json .
|
||||
# Scripts include electron-specific dependencies, which we don't need
|
||||
RUN npm install --legacy-peer-deps --ignore-scripts
|
||||
#Copy code and build with cached modules
|
||||
# Copy package.json first to cache node_modules
|
||||
COPY package.json pnpm-lock.yaml .
|
||||
|
||||
RUN npm install -g pnpm
|
||||
|
||||
RUN pnpm install
|
||||
|
||||
# Copy code and build with cached modules
|
||||
COPY . .
|
||||
RUN npm run build:web
|
||||
RUN pnpm run build:web
|
||||
|
||||
# --- Production stage
|
||||
FROM nginx:alpine-slim
|
||||
|
||||
COPY --chown=nginx:nginx --from=builder /app/release/app/dist/web /usr/share/nginx/html
|
||||
COPY --chown=nginx:nginx --from=builder /app/out/web /usr/share/nginx/html
|
||||
COPY ./settings.js.template /etc/nginx/templates/settings.js.template
|
||||
COPY ng.conf.template /etc/nginx/templates/default.conf.template
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<img src="assets/icons/icon.png" alt="logo" title="feishin" align="right" height="60px" />
|
||||
<img src="assets/icons/icon.png" alt="logo" title="feishin" align="right" height="60px" width="60px" />
|
||||
|
||||
# Feishin
|
||||
|
||||
@@ -27,17 +27,19 @@
|
||||
</a>
|
||||
</p>
|
||||
|
||||
---
|
||||
|
||||
Rewrite of [Sonixd](https://github.com/jeffvli/sonixd).
|
||||
|
||||
## Features
|
||||
|
||||
- [x] MPV player backend
|
||||
- [x] Web player backend
|
||||
- [x] Modern UI
|
||||
- [x] Scrobble playback to your server
|
||||
- [x] Smart playlist editor (Navidrome)
|
||||
- [x] Synchronized and unsynchronized lyrics support
|
||||
- [ ] [Request a feature](https://github.com/jeffvli/feishin/issues) or [view taskboard](https://github.com/users/jeffvli/projects/5/views/1)
|
||||
- [x] MPV player backend
|
||||
- [x] Web player backend
|
||||
- [x] Modern UI
|
||||
- [x] Scrobble playback to your server
|
||||
- [x] Smart playlist editor (Navidrome)
|
||||
- [x] Synchronized and unsynchronized lyrics support
|
||||
- [ ] [Request a feature](https://github.com/jeffvli/feishin/issues) or [view taskboard](https://github.com/users/jeffvli/projects/5/views/1)
|
||||
|
||||
## Screenshots
|
||||
|
||||
@@ -49,7 +51,7 @@ Rewrite of [Sonixd](https://github.com/jeffvli/sonixd).
|
||||
|
||||
Download the [latest desktop client](https://github.com/jeffvli/feishin/releases). The desktop client is the recommended way to use Feishin. It supports both the MPV and web player backends, as well as includes built-in fetching for lyrics.
|
||||
|
||||
#### MacOS Notes
|
||||
#### macOS Notes
|
||||
|
||||
If you're using a device running macOS 12 (Monterey) or higher, [check here](https://github.com/jeffvli/feishin/issues/104#issuecomment-1553914730) for instructions on how to remove the app from quarantine.
|
||||
|
||||
@@ -74,24 +76,23 @@ docker run --name feishin -p 9180:9180 feishin
|
||||
|
||||
To install via Docker Compose use the following snippit. This also works on Portainer.
|
||||
|
||||
```
|
||||
version: '3'
|
||||
```yaml
|
||||
services:
|
||||
feishin:
|
||||
container_name: feishin
|
||||
image: 'ghcr.io/jeffvli/feishin:latest'
|
||||
environment:
|
||||
- SERVER_NAME=jellyfin # pre defined server name
|
||||
- SERVER_LOCK=true # When true AND name/type/url are set, only username/password can be toggled
|
||||
- SERVER_TYPE=jellyfin # navidrome also works
|
||||
- SERVER_URL= # http://address:port
|
||||
- PUID=1000
|
||||
- PGID=1000
|
||||
- UMASK=002
|
||||
- TZ=America/Los_Angeles
|
||||
ports:
|
||||
- 9180:9180
|
||||
restart: unless-stopped
|
||||
feishin:
|
||||
container_name: feishin
|
||||
image: 'ghcr.io/jeffvli/feishin:latest'
|
||||
environment:
|
||||
- SERVER_NAME=jellyfin # pre defined server name
|
||||
- SERVER_LOCK=true # When true AND name/type/url are set, only username/password can be toggled
|
||||
- SERVER_TYPE=jellyfin # navidrome also works
|
||||
- SERVER_URL= # http://address:port
|
||||
- PUID=1000
|
||||
- PGID=1000
|
||||
- UMASK=002
|
||||
- TZ=America/Los_Angeles
|
||||
ports:
|
||||
- 9180:9180
|
||||
restart: unless-stopped
|
||||
```
|
||||
|
||||
### Configuration
|
||||
@@ -100,8 +101,8 @@ services:
|
||||
|
||||
2. After restarting the app, you will be prompted to select a server. Click the `Open menu` button and select `Manage servers`. Click the `Add server` button in the popup and fill out all applicable details. You will need to enter the full URL to your server, including the protocol and port if applicable (e.g. `https://navidrome.my-server.com` or `http://192.168.0.1:4533`).
|
||||
|
||||
- **Navidrome** - For the best experience, select "Save password" when creating the server and configure the `SessionTimeout` setting in your Navidrome config to a larger value (e.g. 72h).
|
||||
- **Linux users** - The default password store uses `libsecret`. `kwallet4/5/6` are also supported, but must be explicitly set in Settings > Window > Passwords/secret score.
|
||||
- **Navidrome** - For the best experience, select "Save password" when creating the server and configure the `SessionTimeout` setting in your Navidrome config to a larger value (e.g. 72h).
|
||||
- **Linux users** - The default password store uses `libsecret`. `kwallet4/5/6` are also supported, but must be explicitly set in Settings > Window > Passwords/secret score.
|
||||
|
||||
3. _Optional_ - If you want to host Feishin on a subpath (not `/`), then pass in the following environment variable: `PUBLIC_PATH=PATH`. For example, to host on `/feishin`, pass in `PUBLIC_PATH=/feishin`.
|
||||
|
||||
@@ -115,12 +116,21 @@ First thing to do is check that your MPV binary path is correct. Navigate to the
|
||||
|
||||
### What music servers does Feishin support?
|
||||
|
||||
Feishin supports any music server that implements a [Navidrome](https://www.navidrome.org/) or [Jellyfin](https://jellyfin.org/) API. **Subsonic API is not currently supported**. This will likely be added in [later when the new Subsonic API is decided on](https://support.symfonium.app/t/subsonic-servers-participation/1233).
|
||||
Feishin supports any music server that implements a [Navidrome](https://www.navidrome.org/), [Jellyfin](https://jellyfin.org/), or [OpenSubsonic compatible](https://opensubsonic.netlify.app/) API.
|
||||
|
||||
- [Navidrome](https://github.com/navidrome/navidrome)
|
||||
- [Jellyfin](https://github.com/jellyfin/jellyfin)
|
||||
- [Funkwhale](https://funkwhale.audio/) - TBD
|
||||
- Subsonic-compatible servers - TBD
|
||||
- [Navidrome](https://github.com/navidrome/navidrome)
|
||||
- [Jellyfin](https://github.com/jellyfin/jellyfin)
|
||||
- [OpenSubsonic](https://opensubsonic.netlify.app/) compatible servers, such as...
|
||||
- [Airsonic-Advanced](https://github.com/airsonic-advanced/airsonic-advanced)
|
||||
- [Ampache](https://ampache.org)
|
||||
- [Astiga](https://asti.ga/)
|
||||
- [Funkwhale](https://www.funkwhale.audio/)
|
||||
- [Gonic](https://github.com/sentriz/gonic)
|
||||
- [LMS](https://github.com/epoupon/lms)
|
||||
- [Nextcloud Music](https://apps.nextcloud.com/apps/music)
|
||||
- [Supysonic](https://github.com/spl0k/supysonic)
|
||||
- [Qm-Music](https://github.com/chenqimiao/qm-music)
|
||||
- More (?)
|
||||
|
||||
### I have the issue "The SUID sandbox helper binary was found, but is not configured correctly" on Linux
|
||||
|
||||
@@ -135,9 +145,32 @@ Ubunutu 24.04 specifically introduced breaking changes that affect how namespace
|
||||
|
||||
## Development
|
||||
|
||||
Built and tested using Node `v16.15.0`.
|
||||
Built and tested using Node `v23.11.0`.
|
||||
|
||||
This project is built off of [electron-react-boilerplate](https://github.com/electron-react-boilerplate/electron-react-boilerplate) v4.6.0.
|
||||
This project is built off of [electron-vite](https://github.com/alex8088/electron-vite)
|
||||
|
||||
- `pnpm run dev` - Start the development server
|
||||
- `pnpm run dev:watch` - Start the development server in watch mode (for main / preload HMR)
|
||||
- `pnpm run start` - Starts the app in production preview mode
|
||||
- `pnpm run build` - Builds the app for desktop
|
||||
- `pnpm run build:electron` - Build the electron app (main, preload, and renderer)
|
||||
- `pnpm run build:remote` - Build the remote app (remote)
|
||||
- `pnpm run build:web` - Build the standalone web app (renderer)
|
||||
- `pnpm run package` - Package the project
|
||||
- `pnpm run package:dev` - Package the project for development
|
||||
- `pnpm run package:linux` - Package the project for Linux
|
||||
- `pnpm run package:mac` - Package the project for Mac
|
||||
- `pnpm run package:win` - Package the project for Windows
|
||||
- `pnpm run publish:linux` - Publish the project for Linux
|
||||
- `pnpm run publish:linux-arm64` - Publish the project for Linux ARM64
|
||||
- `pnpm run publish:mac` - Publish the project for Mac
|
||||
- `pnpm run publish:win` - Publish the project for Windows
|
||||
- `pnpm run typecheck` - Type check the project
|
||||
- `pnpm run typecheck:node` - Type check the project with tsconfig.node.json
|
||||
- `pnpm run typecheck:web` - Type check the project with tsconfig.web.json
|
||||
- `pnpm run lint` - Lint the project
|
||||
- `pnpm run lint:fix` - Lint the project and fix linting errors
|
||||
- `pnpm run i18next` - Generate i18n files
|
||||
|
||||
## Translation
|
||||
|
||||
|
||||
@@ -2,9 +2,11 @@
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>com.apple.security.cs.allow-jit</key>
|
||||
<true/>
|
||||
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
|
||||
<true/>
|
||||
<key>com.apple.security.cs.allow-jit</key>
|
||||
<key>com.apple.security.cs.allow-dyld-environment-variables</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
Binary file not shown.
@@ -0,0 +1,3 @@
|
||||
provider: generic
|
||||
url: https://example.com/auto-updates
|
||||
updaterCacheDirName: feishin-updater
|
||||
@@ -0,0 +1,49 @@
|
||||
appId: org.jeffvli.feishin
|
||||
productName: Feishin
|
||||
artifactName: ${productName}-${version}-${os}-${arch}.${ext}
|
||||
electronVersion: 35.1.5
|
||||
directories:
|
||||
buildResources: assets
|
||||
files:
|
||||
- 'out/**/*'
|
||||
- 'package.json'
|
||||
extraResources:
|
||||
- assets/**
|
||||
asarUnpack:
|
||||
- resources/**
|
||||
win:
|
||||
target:
|
||||
- zip
|
||||
- nsis
|
||||
icon: assets/icons/icon.png
|
||||
nsis:
|
||||
shortcutName: ${productName}
|
||||
uninstallDisplayName: ${productName}
|
||||
createDesktopShortcut: always
|
||||
mac:
|
||||
target:
|
||||
target: default
|
||||
arch:
|
||||
- arm64
|
||||
- x64
|
||||
icon: assets/icons/icon.icns
|
||||
type: distribution
|
||||
hardenedRuntime: true
|
||||
entitlements: assets/entitlements.mac.plist
|
||||
entitlementsInherit: assets/entitlements.mac.plist
|
||||
gatekeeperAssess: false
|
||||
notarize: false
|
||||
dmg:
|
||||
contents: [{ x: 130, y: 220 }, { x: 410, y: 220, type: link, path: /Applications }]
|
||||
linux:
|
||||
target:
|
||||
- AppImage
|
||||
- tar.xz
|
||||
category: AudioVideo;Audio;Player
|
||||
icon: assets/icons/icon.png
|
||||
artifactName: ${productName}-${os}-${arch}.${ext}
|
||||
npmRebuild: false
|
||||
publish:
|
||||
provider: github
|
||||
owner: jeffvli
|
||||
repo: feishin
|
||||
@@ -0,0 +1,66 @@
|
||||
import react from '@vitejs/plugin-react';
|
||||
import { externalizeDepsPlugin, UserConfig } from 'electron-vite';
|
||||
import { resolve } from 'path';
|
||||
import conditionalImportPlugin from 'vite-plugin-conditional-import';
|
||||
import dynamicImportPlugin from 'vite-plugin-dynamic-import';
|
||||
import { ViteEjsPlugin } from 'vite-plugin-ejs';
|
||||
|
||||
const currentOSEnv = process.platform;
|
||||
|
||||
const config: UserConfig = {
|
||||
main: {
|
||||
build: {
|
||||
rollupOptions: {
|
||||
external: ['source-map-support'],
|
||||
},
|
||||
sourcemap: true,
|
||||
},
|
||||
define: {
|
||||
'import.meta.env.IS_LINUX': JSON.stringify(currentOSEnv === 'linux'),
|
||||
'import.meta.env.IS_MACOS': JSON.stringify(currentOSEnv === 'darwin'),
|
||||
'import.meta.env.IS_WIN': JSON.stringify(currentOSEnv === 'win32'),
|
||||
},
|
||||
plugins: [
|
||||
externalizeDepsPlugin(),
|
||||
dynamicImportPlugin(),
|
||||
conditionalImportPlugin({
|
||||
currentEnv: currentOSEnv,
|
||||
envs: ['win32', 'linux', 'darwin'],
|
||||
}),
|
||||
],
|
||||
resolve: {
|
||||
alias: {
|
||||
'/@/main': resolve('src/main'),
|
||||
'/@/shared': resolve('src/shared'),
|
||||
},
|
||||
},
|
||||
},
|
||||
preload: {
|
||||
plugins: [externalizeDepsPlugin()],
|
||||
resolve: {
|
||||
alias: {
|
||||
'/@/preload': resolve('src/preload'),
|
||||
'/@/shared': resolve('src/shared'),
|
||||
},
|
||||
},
|
||||
},
|
||||
renderer: {
|
||||
css: {
|
||||
modules: {
|
||||
generateScopedName: 'fs-[name]-[local]',
|
||||
localsConvention: 'camelCase',
|
||||
},
|
||||
},
|
||||
plugins: [react(), ViteEjsPlugin({ web: false })],
|
||||
resolve: {
|
||||
alias: {
|
||||
'/@/i18n': resolve('src/i18n'),
|
||||
'/@/remote': resolve('src/remote'),
|
||||
'/@/renderer': resolve('src/renderer'),
|
||||
'/@/shared': resolve('src/shared'),
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default config;
|
||||
@@ -0,0 +1,53 @@
|
||||
import eslintConfigPrettier from '@electron-toolkit/eslint-config-prettier';
|
||||
import tseslint from '@electron-toolkit/eslint-config-ts';
|
||||
import perfectionist from 'eslint-plugin-perfectionist';
|
||||
import eslintPluginReact from 'eslint-plugin-react';
|
||||
import eslintPluginReactHooks from 'eslint-plugin-react-hooks';
|
||||
import eslintPluginReactRefresh from 'eslint-plugin-react-refresh';
|
||||
|
||||
export default tseslint.config(
|
||||
{ ignores: ['**/node_modules', '**/dist', '**/out'] },
|
||||
tseslint.configs.recommended,
|
||||
perfectionist.configs['recommended-natural'],
|
||||
eslintPluginReact.configs.flat.recommended,
|
||||
eslintPluginReact.configs.flat['jsx-runtime'],
|
||||
{
|
||||
settings: {
|
||||
react: {
|
||||
version: 'detect',
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
files: ['**/*.{ts,tsx}'],
|
||||
plugins: {
|
||||
'react-hooks': eslintPluginReactHooks,
|
||||
'react-refresh': eslintPluginReactRefresh,
|
||||
},
|
||||
rules: {
|
||||
...eslintPluginReactHooks.configs.recommended.rules,
|
||||
...eslintPluginReactRefresh.configs.vite.rules,
|
||||
'@typescript-eslint/explicit-function-return-type': 'off',
|
||||
'@typescript-eslint/no-duplicate-enum-values': 'off',
|
||||
'@typescript-eslint/no-explicit-any': 'off',
|
||||
'@typescript-eslint/no-unused-vars': 'warn',
|
||||
curly: ['error', 'all'],
|
||||
indent: [
|
||||
'error',
|
||||
'tab',
|
||||
{
|
||||
offsetTernaryExpressions: true,
|
||||
SwitchCase: 1,
|
||||
},
|
||||
],
|
||||
'no-unused-vars': 'off',
|
||||
'no-use-before-define': 'off',
|
||||
quotes: ['error', 'single'],
|
||||
'react-refresh/only-export-components': 'off',
|
||||
'react/display-name': 'off',
|
||||
semi: ['error', 'always'],
|
||||
'single-attribute-per-line': 'off',
|
||||
},
|
||||
},
|
||||
eslintConfigPrettier,
|
||||
);
|
||||
+1
-1
@@ -24,4 +24,4 @@ server {
|
||||
location ${PUBLIC_PATH}/settings.js {
|
||||
alias /etc/nginx/conf.d/settings.js;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Generated
-41030
File diff suppressed because it is too large
Load Diff
+118
-313
@@ -1,294 +1,57 @@
|
||||
{
|
||||
"name": "feishin",
|
||||
"productName": "Feishin",
|
||||
"description": "Feishin music server",
|
||||
"version": "0.9.0",
|
||||
"scripts": {
|
||||
"build": "concurrently \"npm run build:main\" \"npm run build:renderer\" \"npm run build:remote\"",
|
||||
"build:main": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.main.prod.ts",
|
||||
"build:remote": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.remote.prod.ts",
|
||||
"build:renderer": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.renderer.prod.ts",
|
||||
"build:web": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.web.prod.ts",
|
||||
"build:docker": "docker build -t jeffvli/feishin .",
|
||||
"rebuild": "electron-rebuild --parallel --types prod,dev,optional --module-dir release/app",
|
||||
"lint": "concurrently \"npm run lint:code\" \"npm run lint:styles\"",
|
||||
"lint:code": "cross-env NODE_ENV=development eslint . --ext .js,.jsx,.ts,.tsx --fix",
|
||||
"lint:styles": "npx stylelint **/*.tsx --fix",
|
||||
"package": "node --import tsx ./.erb/scripts/clean.js dist && npm run build && electron-builder build --publish never",
|
||||
"package:pr": "node --import tsx ./.erb/scripts/clean.js dist && npm run build && electron-builder build --publish never --win --mac --linux",
|
||||
"package:dev": "node --import tsx ./.erb/scripts/clean.js dist && npm run build && electron-builder build --publish never --dir",
|
||||
"postinstall": "node --import tsx .erb/scripts/check-native-dep.js && electron-builder install-app-deps && cross-env NODE_ENV=development TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.renderer.dev.dll.ts",
|
||||
"start": "node --import tsx ./.erb/scripts/check-port-in-use.js && npm run start:renderer",
|
||||
"start:main": "cross-env NODE_ENV=development NODE_OPTIONS=\"--import tsx\" electron -r ts-node/register/transpile-only ./src/main/main.ts",
|
||||
"start:preload": "cross-env NODE_ENV=development TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.preload.dev.ts",
|
||||
"start:remote": "cross-env NODE_ENV=developemnt TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.remote.dev.ts",
|
||||
"start:renderer": "cross-env NODE_ENV=development TS_NODE_TRANSPILE_ONLY=true webpack serve --config ./.erb/configs/webpack.config.renderer.dev.ts",
|
||||
"start:web": "cross-env NODE_ENV=development TS_NODE_TRANSPILE_ONLY=true webpack serve --config ./.erb/configs/webpack.config.renderer.web.ts",
|
||||
"test": "jest",
|
||||
"prepare": "husky install",
|
||||
"i18next": "i18next -c src/i18n/i18next-parser.config.js",
|
||||
"prod:buildserver": "pwsh -c \"./scripts/server-build.ps1\"",
|
||||
"prod:publishserver": "pwsh -c \"./scripts/server-publish.ps1\""
|
||||
},
|
||||
"lint-staged": {
|
||||
"*.{js,jsx,ts,tsx}": [
|
||||
"cross-env NODE_ENV=development eslint --cache"
|
||||
],
|
||||
"*.json,.{eslintrc,prettierrc}": [
|
||||
"prettier --ignore-path .eslintignore --parser json --write"
|
||||
],
|
||||
"*.{css,scss}": [
|
||||
"prettier --ignore-path .eslintignore --single-quote --write"
|
||||
],
|
||||
"*.{html,md,yml}": [
|
||||
"prettier --ignore-path .eslintignore --single-quote --write"
|
||||
]
|
||||
},
|
||||
"build": {
|
||||
"productName": "Feishin",
|
||||
"appId": "org.jeffvli.feishin",
|
||||
"artifactName": "${productName}-${version}-${os}-${arch}.${ext}",
|
||||
"asar": true,
|
||||
"asarUnpack": "**\\*.{node,dll}",
|
||||
"files": [
|
||||
"dist",
|
||||
"node_modules",
|
||||
"package.json"
|
||||
],
|
||||
"afterSign": ".erb/scripts/notarize.js",
|
||||
"electronVersion": "31.2.0",
|
||||
"mac": {
|
||||
"target": {
|
||||
"target": "default",
|
||||
"arch": [
|
||||
"arm64",
|
||||
"x64"
|
||||
]
|
||||
},
|
||||
"icon": "assets/icons/icon.icns",
|
||||
"type": "distribution",
|
||||
"hardenedRuntime": true,
|
||||
"entitlements": "assets/entitlements.mac.plist",
|
||||
"entitlementsInherit": "assets/entitlements.mac.plist",
|
||||
"gatekeeperAssess": false
|
||||
},
|
||||
"dmg": {
|
||||
"contents": [
|
||||
{
|
||||
"x": 130,
|
||||
"y": 220
|
||||
},
|
||||
{
|
||||
"x": 410,
|
||||
"y": 220,
|
||||
"type": "link",
|
||||
"path": "/Applications"
|
||||
}
|
||||
]
|
||||
},
|
||||
"win": {
|
||||
"target": [
|
||||
"nsis",
|
||||
"zip"
|
||||
],
|
||||
"icon": "assets/icons/icon.ico"
|
||||
},
|
||||
"deb": {
|
||||
"depends": [
|
||||
"libgssapi_krb5.so.2",
|
||||
"libavahi-common.so.3",
|
||||
"libavahi-client.so.3",
|
||||
"libkrb5.so.3",
|
||||
"libkrb5support.so.0",
|
||||
"libkeyutils.so.1",
|
||||
"libcups.so.2"
|
||||
]
|
||||
},
|
||||
"rpm": {
|
||||
"depends": [
|
||||
"libgssapi_krb5.so.2",
|
||||
"libavahi-common.so.3",
|
||||
"libavahi-client.so.3",
|
||||
"libkrb5.so.3",
|
||||
"libkrb5support.so.0",
|
||||
"libkeyutils.so.1",
|
||||
"libcups.so.2"
|
||||
]
|
||||
},
|
||||
"freebsd": {
|
||||
"depends": [
|
||||
"libgssapi_krb5.so.2",
|
||||
"libavahi-common.so.3",
|
||||
"libavahi-client.so.3",
|
||||
"libkrb5.so.3",
|
||||
"libkrb5support.so.0",
|
||||
"libkeyutils.so.1",
|
||||
"libcups.so.2"
|
||||
]
|
||||
},
|
||||
"linux": {
|
||||
"target": [
|
||||
"AppImage",
|
||||
"tar.xz"
|
||||
],
|
||||
"icon": "assets/icons/icon.png",
|
||||
"category": "AudioVideo;Audio;Player"
|
||||
},
|
||||
"directories": {
|
||||
"app": "release/app",
|
||||
"buildResources": "assets",
|
||||
"output": "release/build"
|
||||
},
|
||||
"extraResources": [
|
||||
"./assets/**"
|
||||
],
|
||||
"publish": {
|
||||
"provider": "github",
|
||||
"owner": "jeffvli",
|
||||
"repo": "feishin"
|
||||
}
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/jeffvli/feishin.git"
|
||||
},
|
||||
"author": {
|
||||
"name": "jeffvli",
|
||||
"url": "https://github.com/jeffvli/"
|
||||
},
|
||||
"contributors": [],
|
||||
"license": "GPL-3.0",
|
||||
"bugs": {
|
||||
"url": "https://github.com/jeffvli/feishin/issues"
|
||||
},
|
||||
"version": "0.19.0",
|
||||
"description": "A modern self-hosted music player.",
|
||||
"keywords": [
|
||||
"subsonic",
|
||||
"navidrome",
|
||||
"airsonic",
|
||||
"jellyfin",
|
||||
"react",
|
||||
"electron"
|
||||
],
|
||||
"homepage": "https://github.com/jeffvli/feishin",
|
||||
"jest": {
|
||||
"testURL": "http://localhost/",
|
||||
"testEnvironment": "jsdom",
|
||||
"transform": {
|
||||
"\\.(ts|tsx|js|jsx)$": "ts-jest"
|
||||
},
|
||||
"moduleNameMapper": {
|
||||
"\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/.erb/mocks/fileMock.js",
|
||||
"\\.(css|less|sass|scss)$": "identity-obj-proxy"
|
||||
},
|
||||
"moduleFileExtensions": [
|
||||
"js",
|
||||
"jsx",
|
||||
"ts",
|
||||
"tsx",
|
||||
"json"
|
||||
],
|
||||
"moduleDirectories": [
|
||||
"node_modules",
|
||||
"release/app/node_modules"
|
||||
],
|
||||
"testPathIgnorePatterns": [
|
||||
"release/app/dist"
|
||||
],
|
||||
"setupFiles": [
|
||||
"./.erb/scripts/check-build-exists.ts"
|
||||
]
|
||||
"bugs": {
|
||||
"url": "https://github.com/jeffvli/feishin/issues"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@electron/rebuild": "^3.6.0",
|
||||
"@pmmmwh/react-refresh-webpack-plugin": "0.5.5",
|
||||
"@stylelint/postcss-css-in-js": "^0.38.0",
|
||||
"@teamsupercell/typings-for-css-modules-loader": "^2.5.1",
|
||||
"@testing-library/jest-dom": "^5.16.4",
|
||||
"@testing-library/react": "^13.0.0",
|
||||
"@types/dompurify": "^3.0.5",
|
||||
"@types/electron-localshortcut": "^3.1.0",
|
||||
"@types/jest": "^27.4.1",
|
||||
"@types/lodash": "^4.14.188",
|
||||
"@types/md5": "^2.3.2",
|
||||
"@types/node": "^17.0.23",
|
||||
"@types/react": "^18.0.25",
|
||||
"@types/react-dom": "^18.0.8",
|
||||
"@types/react-test-renderer": "^17.0.1",
|
||||
"@types/react-virtualized-auto-sizer": "^1.0.1",
|
||||
"@types/react-window": "^1.8.5",
|
||||
"@types/react-window-infinite-loader": "^1.0.6",
|
||||
"@types/styled-components": "^5.1.26",
|
||||
"@types/terser-webpack-plugin": "^5.0.4",
|
||||
"@types/webpack-bundle-analyzer": "^4.4.1",
|
||||
"@types/webpack-env": "^1.16.3",
|
||||
"@typescript-eslint/eslint-plugin": "^5.47.0",
|
||||
"@typescript-eslint/parser": "^5.47.0",
|
||||
"browserslist-config-erb": "^0.0.3",
|
||||
"chalk": "^4.1.2",
|
||||
"concurrently": "^7.1.0",
|
||||
"core-js": "^3.21.1",
|
||||
"cross-env": "^7.0.3",
|
||||
"css-loader": "^6.7.1",
|
||||
"css-minimizer-webpack-plugin": "^3.4.1",
|
||||
"detect-port": "^1.3.0",
|
||||
"electron": "^31.2.0",
|
||||
"electron-builder": "^24.13.3",
|
||||
"electron-devtools-installer": "^3.2.0",
|
||||
"electron-notarize": "^1.2.1",
|
||||
"electronmon": "^2.0.2",
|
||||
"eslint": "^8.30.0",
|
||||
"eslint-config-airbnb-base": "^15.0.0",
|
||||
"eslint-config-erb": "^4.0.3",
|
||||
"eslint-import-resolver-typescript": "^2.7.1",
|
||||
"eslint-import-resolver-webpack": "^0.13.2",
|
||||
"eslint-plugin-compat": "^4.2.0",
|
||||
"eslint-plugin-import": "^2.26.0",
|
||||
"eslint-plugin-jest": "^26.1.3",
|
||||
"eslint-plugin-jsx-a11y": "^6.5.1",
|
||||
"eslint-plugin-promise": "^6.0.0",
|
||||
"eslint-plugin-react": "^7.29.4",
|
||||
"eslint-plugin-react-hooks": "^4.4.0",
|
||||
"eslint-plugin-sort-keys-fix": "^1.1.2",
|
||||
"eslint-plugin-typescript-sort-keys": "^2.1.0",
|
||||
"file-loader": "^6.2.0",
|
||||
"html-webpack-plugin": "^5.5.0",
|
||||
"husky": "^7.0.4",
|
||||
"i18next-parser": "^9.0.2",
|
||||
"identity-obj-proxy": "^3.0.0",
|
||||
"jest": "^27.5.1",
|
||||
"lint-staged": "^12.3.7",
|
||||
"mini-css-extract-plugin": "^2.6.0",
|
||||
"postcss-scss": "^4.0.4",
|
||||
"postcss-styled-syntax": "^0.5.0",
|
||||
"postcss-syntax": "^0.36.2",
|
||||
"prettier": "^3.3.3",
|
||||
"react-refresh": "^0.12.0",
|
||||
"react-refresh-typescript": "^2.0.4",
|
||||
"react-test-renderer": "^18.0.0",
|
||||
"rimraf": "^3.0.2",
|
||||
"sass": "^1.49.11",
|
||||
"sass-loader": "^12.6.0",
|
||||
"style-loader": "^3.3.1",
|
||||
"stylelint": "^15.10.3",
|
||||
"stylelint-config-css-modules": "^4.3.0",
|
||||
"stylelint-config-recess-order": "^4.3.0",
|
||||
"stylelint-config-standard": "^34.0.0",
|
||||
"stylelint-config-standard-scss": "^4.0.0",
|
||||
"stylelint-config-styled-components": "^0.1.1",
|
||||
"terser-webpack-plugin": "^5.3.1",
|
||||
"ts-jest": "^27.1.4",
|
||||
"ts-loader": "^9.2.8",
|
||||
"ts-node": "^10.9.2",
|
||||
"tsconfig-paths-webpack-plugin": "^4.0.0",
|
||||
"tsx": "^4.16.2",
|
||||
"typescript": "^5.2.2",
|
||||
"typescript-plugin-styled-components": "^3.0.0",
|
||||
"url-loader": "^4.1.1",
|
||||
"webpack": "^5.94.0",
|
||||
"webpack-bundle-analyzer": "^4.5.0",
|
||||
"webpack-cli": "^4.9.2",
|
||||
"webpack-dev-server": "^4.8.0",
|
||||
"webpack-merge": "^5.8.0"
|
||||
"license": "GPL-3.0",
|
||||
"author": {
|
||||
"name": "jeffvli",
|
||||
"url": "https://github.com/jeffvli/"
|
||||
},
|
||||
"main": "./out/main/index.js",
|
||||
"scripts": {
|
||||
"build": "pnpm run typecheck && pnpm run build:electron && pnpm run build:remote",
|
||||
"build:electron": "electron-vite build",
|
||||
"build:remote": "vite build --config remote.vite.config.ts",
|
||||
"build:web": "vite build --config web.vite.config.ts",
|
||||
"dev": "electron-vite dev",
|
||||
"dev:remote": "vite dev --config remote.vite.config.ts",
|
||||
"dev:watch": "electron-vite dev --watch",
|
||||
"i18next": "i18next -c src/i18n/i18next-parser.config.js",
|
||||
"postinstall": "electron-builder install-app-deps",
|
||||
"lint": "pnpm run lint-code && pnpm run lint-styles",
|
||||
"lint-code": "eslint --cache .",
|
||||
"lint-code:fix": "eslint --cache --fix .",
|
||||
"lint-styles": "stylelint 'src/**/*.{css,scss}'",
|
||||
"lint-styles:fix": "stylelint 'src/**/*.{css,scss}' --fix",
|
||||
"lint:fix": "pnpm run lint-code:fix && pnpm run lint-styles:fix",
|
||||
"package": "pnpm run build && electron-builder",
|
||||
"package:dev": "pnpm run build && electron-builder --dir",
|
||||
"package:linux": "pnpm run build && electron-builder --linux",
|
||||
"package:linux-arm64:pr": "pnpm run build && electron-builder --linux --arm64 --publish never",
|
||||
"package:linux:pr": "pnpm run build && electron-builder --linux --publish never",
|
||||
"package:mac": "pnpm run build && electron-builder --mac",
|
||||
"package:mac:pr": "pnpm run build && electron-builder --mac --publish never",
|
||||
"package:win": "pnpm run build && electron-builder --win",
|
||||
"package:win:pr": "pnpm run build && electron-builder --win --publish never",
|
||||
"publish:linux": "electron-builder --publish always --linux",
|
||||
"publish:linux-arm64": "electron-builder --publish always --linux --arm64",
|
||||
"publish:mac": "electron-builder --publish always --mac",
|
||||
"publish:win": "electron-builder --publish always --win",
|
||||
"start": "electron-vite preview",
|
||||
"typecheck": "pnpm run typecheck:node && pnpm run typecheck:web",
|
||||
"typecheck:node": "tsc --noEmit -p tsconfig.node.json --composite false",
|
||||
"typecheck:web": "tsc --noEmit -p tsconfig.web.json --composite false"
|
||||
},
|
||||
"dependencies": {
|
||||
"@ag-grid-community/client-side-row-model": "^28.2.1",
|
||||
@@ -296,22 +59,27 @@
|
||||
"@ag-grid-community/infinite-row-model": "^28.2.1",
|
||||
"@ag-grid-community/react": "^28.2.1",
|
||||
"@ag-grid-community/styles": "^28.2.1",
|
||||
"@emotion/react": "^11.10.4",
|
||||
"@mantine/core": "^6.0.17",
|
||||
"@mantine/dates": "^6.0.17",
|
||||
"@mantine/form": "^6.0.17",
|
||||
"@mantine/hooks": "^6.0.17",
|
||||
"@mantine/modals": "^6.0.17",
|
||||
"@mantine/notifications": "^6.0.17",
|
||||
"@mantine/utils": "^6.0.17",
|
||||
"@atlaskit/pragmatic-drag-and-drop": "1.4.0",
|
||||
"@atlaskit/pragmatic-drag-and-drop-auto-scroll": "^2.1.0",
|
||||
"@atlaskit/pragmatic-drag-and-drop-hitbox": "^1.0.3",
|
||||
"@electron-toolkit/preload": "^3.0.1",
|
||||
"@electron-toolkit/utils": "^4.0.0",
|
||||
"@mantine/colors-generator": "^8.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",
|
||||
"@ts-rest/core": "^3.23.0",
|
||||
"@xhayper/discord-rpc": "^1.0.24",
|
||||
"auto-text-size": "^0.2.3",
|
||||
"audiomotion-analyzer": "^4.5.0",
|
||||
"auto-text-size": "^0.2.3",
|
||||
"axios": "^1.6.0",
|
||||
"cheerio": "^1.0.0",
|
||||
"clsx": "^2.0.0",
|
||||
"cmdk": "^0.2.0",
|
||||
"dayjs": "^1.11.6",
|
||||
@@ -320,12 +88,10 @@
|
||||
"electron-localshortcut": "^3.2.1",
|
||||
"electron-log": "^5.1.1",
|
||||
"electron-store": "^8.1.0",
|
||||
"electron-updater": "^6.3.1",
|
||||
"electron-updater": "^6.3.9",
|
||||
"fast-average-color": "^9.3.0",
|
||||
"format-duration": "^2.0.0",
|
||||
"framer-motion": "^11.0.0",
|
||||
"fuse.js": "^6.6.2",
|
||||
"history": "^5.3.0",
|
||||
"i18next": "^21.10.0",
|
||||
"idb-keyval": "^6.2.1",
|
||||
"immer": "^9.0.21",
|
||||
@@ -333,41 +99,80 @@
|
||||
"lodash": "^4.17.21",
|
||||
"md5": "^2.3.0",
|
||||
"memoize-one": "^6.0.0",
|
||||
"motion": "^12.18.1",
|
||||
"mpris-service": "^2.1.2",
|
||||
"nanoid": "^3.3.3",
|
||||
"net": "^1.0.2",
|
||||
"node-mpv": "github:jeffvli/Node-MPV#32b4d64395289ad710c41d481d2707a7acfc228f",
|
||||
"overlayscrollbars": "^2.2.1",
|
||||
"overlayscrollbars-react": "^0.5.1",
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.2.0",
|
||||
"overlayscrollbars": "^2.11.1",
|
||||
"overlayscrollbars-react": "^0.5.6",
|
||||
"qs": "^6.14.0",
|
||||
"react": "^19.1.0",
|
||||
"react-dom": "^19.1.0",
|
||||
"react-error-boundary": "^3.1.4",
|
||||
"react-i18next": "^11.18.6",
|
||||
"react-icons": "^4.10.1",
|
||||
"react-icons": "^5.5.0",
|
||||
"react-image": "^4.1.0",
|
||||
"react-loading-skeleton": "^3.5.0",
|
||||
"react-player": "^2.11.0",
|
||||
"react-router": "^6.16.0",
|
||||
"react-router-dom": "^6.16.0",
|
||||
"react-simple-img": "^3.0.0",
|
||||
"react-virtualized-auto-sizer": "^1.0.17",
|
||||
"react-window": "^1.8.9",
|
||||
"react-window-infinite-loader": "^1.0.9",
|
||||
"semver": "^7.5.4",
|
||||
"styled-components": "^6.0.8",
|
||||
"swiper": "^9.3.1",
|
||||
"use-sync-external-store": "^1.5.0",
|
||||
"ws": "^8.18.2",
|
||||
"zod": "^3.22.3",
|
||||
"zustand": "^4.3.9"
|
||||
"zustand": "^5.0.5"
|
||||
},
|
||||
"resolutions": {
|
||||
"styled-components": "^6"
|
||||
"devDependencies": {
|
||||
"@electron-toolkit/eslint-config-prettier": "^3.0.0",
|
||||
"@electron-toolkit/eslint-config-ts": "^3.0.0",
|
||||
"@electron-toolkit/tsconfig": "^1.0.1",
|
||||
"@types/electron-localshortcut": "^3.1.0",
|
||||
"@types/lodash": "^4.17.18",
|
||||
"@types/md5": "^2.3.5",
|
||||
"@types/node": "^22.15.32",
|
||||
"@types/react": "^18.3.23",
|
||||
"@types/react-dom": "^18.3.7",
|
||||
"@types/react-window": "^1.8.5",
|
||||
"@types/react-window-infinite-loader": "^1.0.6",
|
||||
"@types/source-map-support": "^0.5.10",
|
||||
"@types/ws": "^8.18.1",
|
||||
"@vitejs/plugin-react": "^4.3.4",
|
||||
"concurrently": "^7.1.0",
|
||||
"cross-env": "^7.0.3",
|
||||
"electron": "^35.1.5",
|
||||
"electron-builder": "^26.0.12",
|
||||
"electron-devtools-installer": "^3.2.0",
|
||||
"electron-vite": "^3.1.0",
|
||||
"eslint": "^9.24.0",
|
||||
"eslint-plugin-perfectionist": "^4.13.0",
|
||||
"eslint-plugin-prettier": "^5.4.0",
|
||||
"eslint-plugin-react": "^7.37.5",
|
||||
"eslint-plugin-react-hooks": "^5.2.0",
|
||||
"eslint-plugin-react-refresh": "^0.4.19",
|
||||
"i18next-parser": "^9.0.2",
|
||||
"postcss-preset-mantine": "^1.17.0",
|
||||
"prettier": "^3.5.3",
|
||||
"prettier-plugin-packagejson": "^2.5.14",
|
||||
"sass-embedded": "^1.89.0",
|
||||
"stylelint": "^16.14.1",
|
||||
"stylelint-config-css-modules": "^4.4.0",
|
||||
"stylelint-config-recess-order": "^7.1.0",
|
||||
"stylelint-config-standard": "^38.0.0",
|
||||
"typescript": "^5.8.3",
|
||||
"vite": "^6.3.5",
|
||||
"vite-plugin-conditional-import": "^0.1.7",
|
||||
"vite-plugin-dynamic-import": "^1.6.0",
|
||||
"vite-plugin-ejs": "^1.7.0"
|
||||
},
|
||||
"devEngines": {
|
||||
"node": ">=18.x",
|
||||
"npm": ">=7.x"
|
||||
},
|
||||
"browserslist": [],
|
||||
"electronmon": {
|
||||
"patterns": [
|
||||
"!server",
|
||||
"!src/renderer"
|
||||
"pnpm": {
|
||||
"onlyBuiltDependencies": [
|
||||
"electron",
|
||||
"esbuild"
|
||||
]
|
||||
}
|
||||
},
|
||||
"productName": "feishin"
|
||||
}
|
||||
|
||||
Generated
+9669
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,5 @@
|
||||
module.exports = {
|
||||
plugins: {
|
||||
'postcss-preset-mantine': {},
|
||||
},
|
||||
};
|
||||
Generated
-2348
File diff suppressed because it is too large
Load Diff
@@ -1,24 +0,0 @@
|
||||
{
|
||||
"name": "feishin",
|
||||
"version": "0.9.0",
|
||||
"description": "",
|
||||
"main": "./dist/main/main.js",
|
||||
"author": {
|
||||
"name": "jeffvli",
|
||||
"url": "https://github.com/jeffvli/"
|
||||
},
|
||||
"scripts": {
|
||||
"electron-rebuild": "node -r ts-node/register ../../.erb/scripts/electron-rebuild.js",
|
||||
"link-modules": "node -r ts-node/register ../../.erb/scripts/link-modules.ts",
|
||||
"postinstall": "npm run electron-rebuild && npm run link-modules"
|
||||
},
|
||||
"dependencies": {
|
||||
"cheerio": "^1.0.0-rc.12",
|
||||
"mpris-service": "^2.1.2",
|
||||
"ws": "^8.18.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"electron": "31.1.0"
|
||||
},
|
||||
"license": "GPL-3.0"
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
import react from '@vitejs/plugin-react';
|
||||
import path from 'path';
|
||||
import { defineConfig, normalizePath } from 'vite';
|
||||
import { ViteEjsPlugin } from 'vite-plugin-ejs';
|
||||
|
||||
import { version } from './package.json';
|
||||
|
||||
export default defineConfig({
|
||||
build: {
|
||||
emptyOutDir: true,
|
||||
outDir: path.resolve(__dirname, './out/remote'),
|
||||
rollupOptions: {
|
||||
input: {
|
||||
favicon: normalizePath(path.resolve(__dirname, './assets/icons/favicon.ico')),
|
||||
index: normalizePath(path.resolve(__dirname, './src/remote/index.html')),
|
||||
manifest: normalizePath(path.resolve(__dirname, './src/remote/manifest.json')),
|
||||
remote: normalizePath(path.resolve(__dirname, './src/remote/index.tsx')),
|
||||
worker: normalizePath(path.resolve(__dirname, './src/remote/service-worker.ts')),
|
||||
},
|
||||
output: {
|
||||
assetFileNames: '[name].[ext]',
|
||||
chunkFileNames: '[name].js',
|
||||
entryFileNames: '[name].js',
|
||||
},
|
||||
},
|
||||
sourcemap: true,
|
||||
},
|
||||
css: {
|
||||
modules: {
|
||||
generateScopedName: 'fs-[name]-[local]',
|
||||
localsConvention: 'camelCase',
|
||||
},
|
||||
},
|
||||
plugins: [
|
||||
react(),
|
||||
ViteEjsPlugin({
|
||||
prod: process.env.NODE_ENV === 'production',
|
||||
root: normalizePath(path.resolve(__dirname, './src/remote')),
|
||||
version,
|
||||
}),
|
||||
],
|
||||
resolve: {
|
||||
alias: {
|
||||
'/@/i18n': path.resolve(__dirname, './src/i18n'),
|
||||
'/@/remote': path.resolve(__dirname, './src/remote'),
|
||||
'/@/renderer': path.resolve(__dirname, './src/renderer'),
|
||||
'/@/shared': path.resolve(__dirname, './src/shared'),
|
||||
},
|
||||
},
|
||||
root: path.resolve(__dirname, './src/remote'),
|
||||
});
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 48 KiB |
@@ -1,9 +0,0 @@
|
||||
import '@testing-library/jest-dom';
|
||||
import { render } from '@testing-library/react';
|
||||
import { App } from '../renderer/app';
|
||||
|
||||
describe('App', () => {
|
||||
it('should render', () => {
|
||||
expect(render(<App />)).toBeTruthy();
|
||||
});
|
||||
});
|
||||
+56
-25
@@ -1,44 +1,55 @@
|
||||
import { PostProcessorModule, TOptions, StringMap } from 'i18next';
|
||||
import { PostProcessorModule, StringMap, TOptions } from 'i18next';
|
||||
import i18n from 'i18next';
|
||||
import { initReactI18next } from 'react-i18next';
|
||||
|
||||
import cs from './locales/cs.json';
|
||||
import de from './locales/de.json';
|
||||
import en from './locales/en.json';
|
||||
import es from './locales/es.json';
|
||||
import fa from './locales/fa.json';
|
||||
import fi from './locales/fi.json';
|
||||
import fr from './locales/fr.json';
|
||||
import ja from './locales/ja.json';
|
||||
import pl from './locales/pl.json';
|
||||
import zhHans from './locales/zh-Hans.json';
|
||||
import de from './locales/de.json';
|
||||
import hu from './locales/hu.json';
|
||||
import id from './locales/id.json';
|
||||
import it from './locales/it.json';
|
||||
import ru from './locales/ru.json';
|
||||
import ptBr from './locales/pt-BR.json';
|
||||
import sr from './locales/sr.json';
|
||||
import sv from './locales/sv.json';
|
||||
import cs from './locales/cs.json';
|
||||
import ja from './locales/ja.json';
|
||||
import ko from './locales/ko.json';
|
||||
import nbNO from './locales/nb-NO.json';
|
||||
import nl from './locales/nl.json';
|
||||
import pl from './locales/pl.json';
|
||||
import ptBr from './locales/pt-BR.json';
|
||||
import 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 zhHans from './locales/zh-Hans.json';
|
||||
import zhHant from './locales/zh-Hant.json';
|
||||
import fa from './locales/fa.json';
|
||||
import ko from './locales/ko.json';
|
||||
|
||||
const resources = {
|
||||
cs: { translation: cs },
|
||||
de: { translation: de },
|
||||
en: { translation: en },
|
||||
es: { translation: es },
|
||||
de: { translation: de },
|
||||
it: { translation: it },
|
||||
ru: { translation: ru },
|
||||
'pt-BR': { translation: ptBr },
|
||||
fa: { translation: fa },
|
||||
fi: { translation: fi },
|
||||
fr: { translation: fr },
|
||||
hu: { translation: hu },
|
||||
id: { translation: id },
|
||||
it: { translation: it },
|
||||
ja: { translation: ja },
|
||||
ko: { translation: ko },
|
||||
'nb-NO': { translation: nbNO },
|
||||
nl: { translation: nl },
|
||||
pl: { translation: pl },
|
||||
'zh-Hans': { translation: zhHans },
|
||||
'zh-Hant': { translation: zhHant },
|
||||
'pt-BR': { translation: ptBr },
|
||||
ru: { translation: ru },
|
||||
sl: { translation: sl },
|
||||
sr: { translation: sr },
|
||||
sv: { translation: sv },
|
||||
cs: { translation: cs },
|
||||
nl: { translation: nl },
|
||||
'nb-NO': { translation: nbNO },
|
||||
ta: { translation: ta },
|
||||
'zh-Hans': { translation: zhHans },
|
||||
'zh-Hant': { translation: zhHant },
|
||||
};
|
||||
|
||||
export const languages = [
|
||||
@@ -62,6 +73,18 @@ export const languages = [
|
||||
label: 'Français',
|
||||
value: 'fr',
|
||||
},
|
||||
{
|
||||
label: 'Bahasa Indonesia',
|
||||
value: 'id',
|
||||
},
|
||||
{
|
||||
label: 'Suomeksi',
|
||||
value: 'fi',
|
||||
},
|
||||
{
|
||||
label: 'Magyar',
|
||||
value: 'hu',
|
||||
},
|
||||
{
|
||||
label: 'Italiano',
|
||||
value: 'it',
|
||||
@@ -98,6 +121,10 @@ export const languages = [
|
||||
label: 'Русский',
|
||||
value: 'ru',
|
||||
},
|
||||
{
|
||||
label: 'Slovenščina',
|
||||
value: 'sl',
|
||||
},
|
||||
{
|
||||
label: 'Srpski',
|
||||
value: 'sr',
|
||||
@@ -106,6 +133,10 @@ export const languages = [
|
||||
label: 'Svenska',
|
||||
value: 'sv',
|
||||
},
|
||||
{
|
||||
label: 'Tamil',
|
||||
value: 'ta',
|
||||
},
|
||||
{
|
||||
label: '简体中文',
|
||||
value: 'zh-Hans',
|
||||
@@ -117,35 +148,34 @@ export const languages = [
|
||||
];
|
||||
|
||||
const lowerCasePostProcessor: PostProcessorModule = {
|
||||
type: 'postProcessor',
|
||||
name: 'lowerCase',
|
||||
process: (value: string) => {
|
||||
return value.toLocaleLowerCase();
|
||||
},
|
||||
type: 'postProcessor',
|
||||
};
|
||||
|
||||
const upperCasePostProcessor: PostProcessorModule = {
|
||||
type: 'postProcessor',
|
||||
name: 'upperCase',
|
||||
process: (value: string) => {
|
||||
return value.toLocaleUpperCase();
|
||||
},
|
||||
type: 'postProcessor',
|
||||
};
|
||||
|
||||
const titleCasePostProcessor: PostProcessorModule = {
|
||||
type: 'postProcessor',
|
||||
name: 'titleCase',
|
||||
process: (value: string) => {
|
||||
return value.replace(/\S\S*/g, (txt) => {
|
||||
return txt.charAt(0).toLocaleUpperCase() + txt.slice(1).toLowerCase();
|
||||
});
|
||||
},
|
||||
type: 'postProcessor',
|
||||
};
|
||||
|
||||
const ignoreSentenceCaseLanguages = ['de'];
|
||||
|
||||
const sentenceCasePostProcessor: PostProcessorModule = {
|
||||
type: 'postProcessor',
|
||||
name: 'sentenceCase',
|
||||
process: (value: string, _key: string, _options: TOptions<StringMap>, translator: any) => {
|
||||
const sentences = value.split('. ');
|
||||
@@ -161,6 +191,7 @@ const sentenceCasePostProcessor: PostProcessorModule = {
|
||||
})
|
||||
.join('. ');
|
||||
},
|
||||
type: 'postProcessor',
|
||||
};
|
||||
i18n.use(lowerCasePostProcessor)
|
||||
.use(upperCasePostProcessor)
|
||||
|
||||
@@ -5,7 +5,7 @@ module.exports = {
|
||||
createOldCatalogs: true,
|
||||
customValueTemplate: null,
|
||||
defaultNamespace: 'translation',
|
||||
defaultValue: function (locale, namespace, key, value) {
|
||||
defaultValue: function (locale, namespace, key) {
|
||||
return key;
|
||||
},
|
||||
failOnUpdate: false,
|
||||
|
||||
+78
-23
@@ -29,7 +29,8 @@
|
||||
"addLast": "přidat poslední",
|
||||
"mute": "ztlumit",
|
||||
"skip_forward": "přeskočit dopředu",
|
||||
"playSimilarSongs": "přehrát podobné skladby"
|
||||
"playSimilarSongs": "přehrát podobné skladby",
|
||||
"viewQueue": "zobrazit frontu"
|
||||
},
|
||||
"setting": {
|
||||
"crossfadeStyle_description": "vyberte způsob prolnutí u přehrávače zvuku",
|
||||
@@ -123,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",
|
||||
@@ -170,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í",
|
||||
@@ -221,14 +222,14 @@
|
||||
"volumeWidth": "šířka posuvníku hlasitosti",
|
||||
"volumeWidth_description": "horizontální velikost posuvníku hlasitosti",
|
||||
"discordListening": "zobrazit stav jako „Poslouchá“",
|
||||
"discordListening_description": "zobrazit stav jako „Poslouchá“ namísto „Hraje“. tato funkce v současné době není kompatibilní s lištou s časem",
|
||||
"discordListening_description": "zobrazit stav jako „Poslouchá“ namísto „Hraje“",
|
||||
"contextMenu": "nastavení kontextové nabídky (kliknutí pravým)",
|
||||
"contextMenu_description": "umožňuje skrýt položky, které se zobrazí v nabídce po kliknutí pravým tlačítkem myši na položku. položky, které nejsou zaškrtnuté, se skryjí",
|
||||
"customCssEnable": "povolit vlastní css",
|
||||
"customCssEnable_description": "povolti psaní vlastního css.",
|
||||
"customCssEnable": "povolit vlastní CSS",
|
||||
"customCssEnable_description": "povolit vlastní CSS.",
|
||||
"customCssNotice": "Varování: i když provádíme určitou sanitizaci (zakázáním url() a content:), může používání CSS stále představovat riziko změnami rozhraní.",
|
||||
"customCss_description": "vlastní css obsah. Upozornění: vlastnosti content a vzdálené url jsou zakázané. Níže je zobrazen náhled vašeho obsahu. Další pole, která jste nenastavili, jsou přítomna z důvodu sanitizace.",
|
||||
"customCss": "vlastní css",
|
||||
"customCss_description": "vlastní CSS obsah. Upozornění: vlastnosti content a vzdálené url jsou zakázané. Níže je zobrazen náhled vašeho obsahu. Další pole, která jste nenastavili, jsou přítomna z důvodu sanitizace.",
|
||||
"customCss": "vlastní CSS",
|
||||
"webAudio": "použít webový zvuk",
|
||||
"webAudio_description": "použít webový zvuk. tím povolíte pokročilé funkce jako replaygain. zakažte, pokud se objeví problémy",
|
||||
"transcodeNote": "projeví se po 1 (web) - 2 (mpv) skladbách",
|
||||
@@ -248,7 +249,31 @@
|
||||
"artistConfiguration_description": "nastavit, které položky na stránce umělce alba budou zobrazeny a v jakém pořadí",
|
||||
"playButtonBehavior_optionPlayShuffled": "$t(player.shuffle)",
|
||||
"trayEnabled": "zobrazit v oznamovací oblasti",
|
||||
"trayEnabled_description": "zobrazit/skrýt ikonu/nabídku v oznamovací oblasti. pokud je zakázáno, vypne také minimalizaci/ukončení do oznamovací oblasti"
|
||||
"trayEnabled_description": "zobrazit/skrýt ikonu/nabídku v oznamovací oblasti. pokud je zakázáno, vypne také minimalizaci/ukončení do oznamovací oblasti",
|
||||
"translationApiProvider": "poskytovatel api překladů",
|
||||
"translationApiProvider_description": "poskytovatel api pro překlady",
|
||||
"translationApiKey": "klíč api překladů",
|
||||
"translationApiKey_description": "klíč api pro překlady (podporuje pouze koncový bod globální služby)",
|
||||
"translationTargetLanguage": "cílový jazyk překladu",
|
||||
"translationTargetLanguage_description": "cílový jazyk pro překlad",
|
||||
"lastfmApiKey": "klíč API {{lastfm}}",
|
||||
"lastfmApiKey_description": "klíč API pro {{lastfm}}. vyžadováno pro obaly alb",
|
||||
"discordServeImage": "načítat obrázky {{discord}} ze serveru",
|
||||
"discordServeImage_description": "sdílet obaly alb pro {{discord}} rich presence ze samotného serveru, dostupné pouze pro jellyfin a navidrome",
|
||||
"lastfm": "zobrazit odkazy na last.fm",
|
||||
"lastfm_description": "na stránkách umělců a alb zobrazit odkazy na last.fm",
|
||||
"musicbrainz": "zobrazit odkazy na musicbrainz",
|
||||
"musicbrainz_description": "na stránkách umělců a alb, kde existuje mbid, zobrazit odkazy na musicbrainz",
|
||||
"neteaseTranslation": "Povolit překlady NetEase",
|
||||
"neteaseTranslation_description": "Pokud je povoleno, načte a zobrazí přeložené texty ze služby NetEase, pokud jsou dostupné.",
|
||||
"preferLocalLyrics": "preferovat místní texty",
|
||||
"preferLocalLyrics_description": "preferovat místní texty před vzdálenými, pokud jsou dostupné",
|
||||
"discordPausedStatus": "zobrazit rich presence při pozastavení",
|
||||
"discordPausedStatus_description": "pokud je povoleno, bude při pozastavení přehrávače zobrazen stav",
|
||||
"preservePitch": "zachovat výšku",
|
||||
"preservePitch_description": "zachová výšku při úpravě rychlosti přehrávání",
|
||||
"notify": "povolit oznámení o skladbách",
|
||||
"notify_description": "zobrazit oznámení při změně aktuální skladby"
|
||||
},
|
||||
"action": {
|
||||
"editPlaylist": "upravit $t(entity.playlist_one)",
|
||||
@@ -271,7 +296,8 @@
|
||||
"openIn": {
|
||||
"lastfm": "Otevřít v Last.fm",
|
||||
"musicbrainz": "Otevřít v MusicBrainz"
|
||||
}
|
||||
},
|
||||
"moveToNext": "přesunout na další"
|
||||
},
|
||||
"common": {
|
||||
"backward": "zpátky",
|
||||
@@ -355,7 +381,7 @@
|
||||
"size": "velikost",
|
||||
"biography": "biografie",
|
||||
"note": "poznámka",
|
||||
"albumGain": "zisk (gain) alba",
|
||||
"albumGain": "gain alba",
|
||||
"albumPeak": "vrchol alba",
|
||||
"close": "zavřít",
|
||||
"mbid": "ID MusicBrainz",
|
||||
@@ -364,14 +390,23 @@
|
||||
"share": "sdílet",
|
||||
"codec": "kodek",
|
||||
"trackPeak": "vrchol skladby",
|
||||
"preview": "náhled"
|
||||
"preview": "náhled",
|
||||
"translation": "překlad",
|
||||
"additionalParticipants": "další přispívající",
|
||||
"tags": "štítky",
|
||||
"viewReleaseNotes": "zobrazit seznam změn",
|
||||
"newVersion": "byla nainstalována nová verze ({{version}})",
|
||||
"bitDepth": "bitová hloubka",
|
||||
"sampleRate": "vzorkovací frekvence"
|
||||
},
|
||||
"table": {
|
||||
"config": {
|
||||
"view": {
|
||||
"card": "karta",
|
||||
"table": "tabulka",
|
||||
"poster": "plakát"
|
||||
"poster": "plakát",
|
||||
"list": "seznam",
|
||||
"grid": "mřížka"
|
||||
},
|
||||
"general": {
|
||||
"displayType": "typ zobrazení",
|
||||
@@ -380,7 +415,8 @@
|
||||
"autoFitColumns": "automaticky přizpůsobit sloupce",
|
||||
"size": "$t(common.size)",
|
||||
"itemGap": "mezera mezi položkami (px)",
|
||||
"itemSize": "velikost položek (px)"
|
||||
"itemSize": "velikost položek (px)",
|
||||
"followCurrentSong": "následovat aktuální skladbu"
|
||||
},
|
||||
"label": {
|
||||
"releaseDate": "datum vydání",
|
||||
@@ -462,7 +498,9 @@
|
||||
"loginRateError": "příliš mnoho pokusů o přihlášení, zkuste to znovu za pár vteřin",
|
||||
"badAlbum": "tuto stránku vidíte, protože tato skladba není součástí alba. tento problém může nastat, pokud máte skladbu na nejvyšší úrovni vaší složky s hudbou. jellyfin seskupuje skladby pouze, pokud se nacházejí ve složce.",
|
||||
"networkError": "vyskytla se chyba sítě",
|
||||
"openError": "nepodařilo se otevřít soubor"
|
||||
"openError": "nepodařilo se otevřít soubor",
|
||||
"badValue": "neplatná možnost „{{value}}“. tato možnost již neexistuje",
|
||||
"notificationDenied": "oprávnění k posílání oznámení byla zamítnuta. toto nastavení nemá žádný vliv"
|
||||
},
|
||||
"filter": {
|
||||
"mostPlayed": "nejvíce přehráváno",
|
||||
@@ -521,7 +559,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": {
|
||||
@@ -537,11 +576,14 @@
|
||||
"useImageAspectRatio": "použít poměr stran obrázku",
|
||||
"lyricGap": "mezera textů",
|
||||
"dynamicImageBlur": "velikost rozostření obrázku",
|
||||
"dynamicIsImage": "povolit obrázek na pozadí"
|
||||
"dynamicIsImage": "povolit obrázek na pozadí",
|
||||
"lyricOffset": "posunutí textů (ms)"
|
||||
},
|
||||
"upNext": "další",
|
||||
"lyrics": "texty",
|
||||
"related": "související"
|
||||
"related": "související",
|
||||
"visualizer": "vizualizér",
|
||||
"noLyrics": "nenalezeny žádné texty"
|
||||
},
|
||||
"appMenu": {
|
||||
"selectServer": "vybrat server",
|
||||
@@ -576,7 +618,8 @@
|
||||
"shareItem": "sdílet položku",
|
||||
"playSimilarSongs": "$t(player.playSimilarSongs)",
|
||||
"download": "stáhnout",
|
||||
"playShuffled": "$t(player.shuffle)"
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"moveToNext": "$t(action.moveToNext)"
|
||||
},
|
||||
"home": {
|
||||
"mostPlayed": "nejpřehrávanější",
|
||||
@@ -644,6 +687,14 @@
|
||||
},
|
||||
"playlist": {
|
||||
"reorder": "změna pořadí povolena pouze při řazení podle id"
|
||||
},
|
||||
"manageServers": {
|
||||
"url": "URL",
|
||||
"username": "uživatelské jméno",
|
||||
"editServerDetailsTooltip": "upravit podrobnosti o serveru",
|
||||
"removeServer": "odstranit server",
|
||||
"serverDetails": "podrobnosti o serveru",
|
||||
"title": "správa serverů"
|
||||
}
|
||||
},
|
||||
"form": {
|
||||
@@ -685,7 +736,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)",
|
||||
@@ -723,8 +775,8 @@
|
||||
"folderWithCount_few": "{{count}} složky",
|
||||
"folderWithCount_other": "{{count}} složek",
|
||||
"albumArtist_one": "umělec alba",
|
||||
"albumArtist_few": "umělci alba",
|
||||
"albumArtist_other": "umělců alba",
|
||||
"albumArtist_few": "umělci alb",
|
||||
"albumArtist_other": "umělci alb",
|
||||
"track_one": "skladba",
|
||||
"track_few": "skladby",
|
||||
"track_other": "skladby",
|
||||
@@ -755,6 +807,9 @@
|
||||
"trackWithCount_other": "{{count}} skladeb",
|
||||
"play_one": "{{count}} přehrání",
|
||||
"play_few": "{{count}} přehrání",
|
||||
"play_other": "{{count}} přehrání"
|
||||
"play_other": "{{count}} přehrání",
|
||||
"song_one": "píseň",
|
||||
"song_few": "písničky",
|
||||
"song_other": "písní"
|
||||
}
|
||||
}
|
||||
|
||||
+77
-22
@@ -107,7 +107,15 @@
|
||||
"reload": "Neu Laden",
|
||||
"mbid": "MusicBrainz ID",
|
||||
"close": "schliessen",
|
||||
"share": "Teilen"
|
||||
"share": "Teilen",
|
||||
"translation": "Übersetzung",
|
||||
"trackGain": "Track-Pegelverstärkung",
|
||||
"trackPeak": "Track-Spitzenpegel",
|
||||
"codec": "Codec",
|
||||
"albumPeak": "Album-Spitzenpegel",
|
||||
"albumGain": "Album-Pegelverstärkung",
|
||||
"tags": "tags",
|
||||
"viewReleaseNotes": "Release Notes anzeigen"
|
||||
},
|
||||
"error": {
|
||||
"remotePortWarning": "Starten Sie den Server neu, um den neuen Port anzuwenden",
|
||||
@@ -179,13 +187,13 @@
|
||||
},
|
||||
"form": {
|
||||
"deletePlaylist": {
|
||||
"title": "Lösche $t(entity.playlist_one)",
|
||||
"title": "$t(entity.playlist_one) löschen",
|
||||
"success": "$t(entity.playlist_one) erfolgreich gelöscht",
|
||||
"input_confirm": "Geben Sie zur Bestätigung den Namen von $t(entity.playlist_one) ein"
|
||||
},
|
||||
"createPlaylist": {
|
||||
"input_description": "$t(common.description)",
|
||||
"title": "Erstellen $t(entity.playlist_one)",
|
||||
"title": "$t(entity.playlist_one) erstellen",
|
||||
"input_public": "öffentlich",
|
||||
"success": "$t(entity.playlist_one) erfolgreich erstellt",
|
||||
"input_name": "$t(common.name)",
|
||||
@@ -231,7 +239,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": {
|
||||
@@ -267,7 +276,9 @@
|
||||
"trackWithCount_other": "{{count}} Tracks",
|
||||
"smartPlaylist": "Smart $t(entity.playlist_one)",
|
||||
"play_one": "{{count}} Wiedergabe",
|
||||
"play_other": "{{count}} Wiedergaben"
|
||||
"play_other": "{{count}} Wiedergaben",
|
||||
"song_one": "Lied",
|
||||
"song_other": "Lieder"
|
||||
},
|
||||
"table": {
|
||||
"config": {
|
||||
@@ -348,11 +359,13 @@
|
||||
"unsynchronized": "nicht synchronisiert",
|
||||
"lyricAlignment": "Songtext-Ausrichtung",
|
||||
"useImageAspectRatio": "Bildseitenverhältnis verwenden",
|
||||
"lyricGap": "Songtext-Lücke"
|
||||
"lyricGap": "Songtext-Lücke",
|
||||
"dynamicIsImage": "Hintergrundbild aktivieren"
|
||||
},
|
||||
"upNext": "als nächstes",
|
||||
"lyrics": "Songtexte",
|
||||
"related": "Ähnliche"
|
||||
"related": "Ähnliche",
|
||||
"noLyrics": "Keine Liedtexte gefunden"
|
||||
},
|
||||
"appMenu": {
|
||||
"selectServer": "Server auswählen",
|
||||
@@ -375,18 +388,19 @@
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "Mehr von diesem $t(entity.artist_one)",
|
||||
"moreFromGeneric": "Mehr von {{item}}"
|
||||
"moreFromGeneric": "Mehr von {{item}}",
|
||||
"released": "erschienen"
|
||||
},
|
||||
"globalSearch": {
|
||||
"commands": {
|
||||
"serverCommands": "Serverbefehle",
|
||||
"goToPage": "Gehe zur Seite",
|
||||
"searchFor": "Suche nach {{query}}"
|
||||
"searchFor": "Nach {{query}} suchen"
|
||||
},
|
||||
"title": "Befehle"
|
||||
},
|
||||
"contextMenu": {
|
||||
"numberSelected": "{{count}} Ausgewählte",
|
||||
"numberSelected": "{{count}} ausgewählt",
|
||||
"addToPlaylist": "$t(action.addToPlaylist)",
|
||||
"addToFavorites": "$t(action.addToFavorites)",
|
||||
"setRating": "$t(action.setRating)",
|
||||
@@ -401,7 +415,10 @@
|
||||
"addLast": "$t(player.addLast)",
|
||||
"addFavorite": "$t(action.addToFavorites)",
|
||||
"play": "$t(player.play)",
|
||||
"removeFromQueue": "$t(action.removeFromQueue)"
|
||||
"removeFromQueue": "$t(action.removeFromQueue)",
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"download": "Download",
|
||||
"playSimilarSongs": "$t(player.playSimilarSongs)"
|
||||
},
|
||||
"sidebar": {
|
||||
"nowPlaying": "läuft gerade",
|
||||
@@ -414,34 +431,60 @@
|
||||
"settings": "$t(common.setting_other)",
|
||||
"home": "$t(common.home)",
|
||||
"artists": "$t(entity.artist_other)",
|
||||
"albumArtists": "$t(entity.albumArtist_other)"
|
||||
"albumArtists": "$t(entity.albumArtist_other)",
|
||||
"shared": "$t(entity.playlist_other) geteilt",
|
||||
"myLibrary": "meine bibliothek"
|
||||
},
|
||||
"setting": {
|
||||
"playbackTab": "Wiedergabe",
|
||||
"generalTab": "allgemein",
|
||||
"generalTab": "Allgemein",
|
||||
"hotkeysTab": "Kurzbefehle",
|
||||
"windowTab": "Fenster"
|
||||
"windowTab": "Fenster",
|
||||
"advanced": "Erweitert"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
},
|
||||
"genreList": {
|
||||
"title": "$t(entity.genre_other)"
|
||||
"title": "$t(entity.genre_other)",
|
||||
"showTracks": "$t(entity.genre_one) $t(entity.track_other) anzeigen",
|
||||
"showAlbums": "$t(entity.genre_one) $t(entity.album_other) anzeigen"
|
||||
},
|
||||
"trackList": {
|
||||
"title": "$t(entity.track_other)"
|
||||
"title": "$t(entity.track_other)",
|
||||
"artistTracks": "Tracks von {{artist}}",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track_other)"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist_other)"
|
||||
},
|
||||
"albumList": {
|
||||
"title": "$t(entity.album_other)"
|
||||
"title": "$t(entity.album_other)",
|
||||
"artistAlbums": "Alben von {{artist}}",
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)"
|
||||
},
|
||||
"albumArtistDetail": {
|
||||
"about": "Über {{artist}}",
|
||||
"appearsOn": "erscheint auf",
|
||||
"recentReleases": "Kürzliche Veröffentlichungen",
|
||||
"viewDiscography": "Diskographie ansehen"
|
||||
"viewDiscography": "Diskographie ansehen",
|
||||
"viewAllTracks": "Alle $t(entity.track_other) ansehen",
|
||||
"topSongsFrom": "Toplieder von {{title}}",
|
||||
"viewAll": "Alles ansehen",
|
||||
"topSongs": "Toplieder"
|
||||
},
|
||||
"manageServers": {
|
||||
"title": "Servers verwalten",
|
||||
"editServerDetailsTooltip": "Serverdetails editieren",
|
||||
"removeServer": "Server entfernen",
|
||||
"url": "URL",
|
||||
"serverDetails": "Serverdetails",
|
||||
"username": "Benutzername"
|
||||
},
|
||||
"itemDetail": {
|
||||
"copyPath": "Pfad in Zwischenablage kopieren",
|
||||
"copiedPath": "Pfad erfolgreich kopiert",
|
||||
"openFile": "Track im Dateiexplorer anzeigen"
|
||||
}
|
||||
},
|
||||
"player": {
|
||||
@@ -473,10 +516,11 @@
|
||||
"pause": "Pause",
|
||||
"unfavorite": "Aus Favoriten entfernen",
|
||||
"skip_forward": "Vorspulen",
|
||||
"skip": "Überspringen"
|
||||
"skip": "Überspringen",
|
||||
"playSimilarSongs": "Ähnliche Lieder abspielen"
|
||||
},
|
||||
"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",
|
||||
@@ -630,12 +674,23 @@
|
||||
"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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
"deselectAll": "deselect all",
|
||||
"editPlaylist": "edit $t(entity.playlist_one)",
|
||||
"goToPage": "go to page",
|
||||
"moveToNext": "move to next",
|
||||
"moveToBottom": "move to bottom",
|
||||
"moveToTop": "move to top",
|
||||
"refresh": "$t(common.refresh)",
|
||||
@@ -26,12 +27,16 @@
|
||||
"action_one": "action",
|
||||
"action_other": "actions",
|
||||
"add": "add",
|
||||
"additionalParticipants": "additional participants",
|
||||
"newVersion": "a new version has been installed ({{version}})",
|
||||
"viewReleaseNotes": "view release notes",
|
||||
"albumGain": "album gain",
|
||||
"albumPeak": "album peak",
|
||||
"areYouSure": "are you sure?",
|
||||
"ascending": "ascending",
|
||||
"backward": "backward",
|
||||
"biography": "biography",
|
||||
"bitDepth": "bit depth",
|
||||
"bitrate": "bitrate",
|
||||
"bpm": "bpm",
|
||||
"cancel": "cancel",
|
||||
@@ -95,6 +100,7 @@
|
||||
"resetToDefault": "reset to default",
|
||||
"restartRequired": "restart required",
|
||||
"right": "right",
|
||||
"sampleRate": "sample rate",
|
||||
"save": "save",
|
||||
"saveAndReplace": "save and replace",
|
||||
"saveAs": "save as",
|
||||
@@ -105,10 +111,12 @@
|
||||
"share": "share",
|
||||
"size": "size",
|
||||
"sortOrder": "order",
|
||||
"tags": "tags",
|
||||
"title": "title",
|
||||
"trackNumber": "track",
|
||||
"trackGain": "track gain",
|
||||
"trackPeak": "track peak",
|
||||
"translation": "translation",
|
||||
"unknown": "unknown",
|
||||
"version": "version",
|
||||
"year": "year",
|
||||
@@ -146,6 +154,8 @@
|
||||
"smartPlaylist": "smart $t(entity.playlist_one)",
|
||||
"track_one": "track",
|
||||
"track_other": "tracks",
|
||||
"song_one": "song",
|
||||
"song_other": "songs",
|
||||
"trackWithCount_one": "{{count}} track",
|
||||
"trackWithCount_other": "{{count}} tracks"
|
||||
},
|
||||
@@ -154,6 +164,7 @@
|
||||
"audioDeviceFetchError": "an error occurred when trying to get audio devices",
|
||||
"authenticationFailed": "authentication failed",
|
||||
"badAlbum": "you are seeing this page because this song is not part of an album. you are most likely seeing this issue if you have a song at the top level of your music folder. jellyfin only groups tracks if they are in a folder.",
|
||||
"badValue": "invalid option \"{{value}}\". this value no longer exists",
|
||||
"credentialsRequired": "credentials required",
|
||||
"endpointNotImplementedError": "endpoint {{endpoint}} is not implemented for {{serverType}}",
|
||||
"genericError": "an error occurred",
|
||||
@@ -162,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",
|
||||
@@ -261,6 +273,7 @@
|
||||
"title": "lyric search"
|
||||
},
|
||||
"queryEditor": {
|
||||
"title": "query editor",
|
||||
"input_optionMatchAll": "match all",
|
||||
"input_optionMatchAny": "match any"
|
||||
},
|
||||
@@ -314,6 +327,14 @@
|
||||
"settings": "$t(common.setting_other)",
|
||||
"version": "version {{version}}"
|
||||
},
|
||||
"manageServers": {
|
||||
"title": "manage servers",
|
||||
"serverDetails": "server details",
|
||||
"url": "URL",
|
||||
"username": "username",
|
||||
"editServerDetailsTooltip": "edit server details",
|
||||
"removeServer": "remove server"
|
||||
},
|
||||
"contextMenu": {
|
||||
"addFavorite": "$t(action.addToFavorites)",
|
||||
"addLast": "$t(player.addLast)",
|
||||
@@ -324,6 +345,7 @@
|
||||
"deletePlaylist": "$t(action.deletePlaylist)",
|
||||
"deselectAll": "$t(action.deselectAll)",
|
||||
"download": "download",
|
||||
"moveToNext": "$t(action.moveToNext)",
|
||||
"moveToBottom": "$t(action.moveToBottom)",
|
||||
"moveToTop": "$t(action.moveToTop)",
|
||||
"numberSelected": "{{count}} selected",
|
||||
@@ -344,6 +366,7 @@
|
||||
"dynamicIsImage": "enable background image",
|
||||
"followCurrentLyric": "follow current lyric",
|
||||
"lyricAlignment": "lyric alignment",
|
||||
"lyricOffset": "lyrics offset (ms)",
|
||||
"lyricGap": "lyric gap",
|
||||
"lyricSize": "lyric size",
|
||||
"opacity": "opacity",
|
||||
@@ -355,7 +378,9 @@
|
||||
},
|
||||
"lyrics": "lyrics",
|
||||
"related": "related",
|
||||
"upNext": "up next"
|
||||
"upNext": "up next",
|
||||
"visualizer": "visualizer",
|
||||
"noLyrics": "no lyrics found"
|
||||
},
|
||||
"genreList": {
|
||||
"showAlbums": "show $t(entity.genre_one) $t(entity.album_other)",
|
||||
@@ -402,6 +427,7 @@
|
||||
"folders": "$t(entity.folder_other)",
|
||||
"genres": "$t(entity.genre_other)",
|
||||
"home": "$t(common.home)",
|
||||
"myLibrary": "my library",
|
||||
"nowPlaying": "now playing",
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"search": "$t(common.search)",
|
||||
@@ -447,7 +473,8 @@
|
||||
"stop": "stop",
|
||||
"toggleFullscreenPlayer": "toggle fullscreen player",
|
||||
"unfavorite": "unfavorite",
|
||||
"pause": "pause"
|
||||
"pause": "pause",
|
||||
"viewQueue": "view queue"
|
||||
},
|
||||
"setting": {
|
||||
"accentColor": "accent color",
|
||||
@@ -490,12 +517,16 @@
|
||||
"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. note that this currently breaks timer bar",
|
||||
"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)",
|
||||
"doubleClickBehavior": "queue all searched tracks when double clicking",
|
||||
@@ -510,6 +541,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",
|
||||
@@ -565,12 +598,18 @@
|
||||
"imageAspectRatio_description": "if enabled, cover art will be shown using their native aspect ratio. for art that is not 1:1, the remaining space will be empty",
|
||||
"language": "language",
|
||||
"language_description": "sets the language for the application ($t(common.restartRequired))",
|
||||
"lastfm": "show last.fm links",
|
||||
"lastfm_description": "show links to last.fm on artist/album pages",
|
||||
"lastfmApiKey": "{{lastfm}} API key",
|
||||
"lastfmApiKey_description": "the API key for {{lastfm}}. required for cover art",
|
||||
"lyricFetch": "fetch lyrics from the internet",
|
||||
"lyricFetch_description": "fetch lyrics from various internet sources",
|
||||
"lyricFetchProvider": "providers to fetch lyrics from",
|
||||
"lyricFetchProvider_description": "select the providers to fetch lyrics from. the order of the providers is the order in which they will be queried",
|
||||
"lyricOffset": "lyric offset (ms)",
|
||||
"lyricOffset_description": "offset the lyric by the specified amount of milliseconds",
|
||||
"notify": "enable song notifications",
|
||||
"notify_description": "show notifications when changing the current song",
|
||||
"minimizeToTray": "minimize to tray",
|
||||
"minimizeToTray_description": "minimize the application to the system tray",
|
||||
"minimumScrobblePercentage": "minimum scrobble duration (percentage)",
|
||||
@@ -581,6 +620,10 @@
|
||||
"mpvExecutablePath_description": "sets the path to the mpv executable. if left empty, the default path will be used",
|
||||
"mpvExtraParameters": "mpv parameters",
|
||||
"mpvExtraParameters_help": "one per line",
|
||||
"musicbrainz": "show musicbrainz links",
|
||||
"musicbrainz_description": "show links to musicbrainz on artist/album pages, where mbid exists",
|
||||
"neteaseTranslation": "Enable NetEase translations",
|
||||
"neteaseTranslation_description": "When enabled, fetches and displays translated lyrics from NetEase if available.",
|
||||
"passwordStore": "passwords/secret store",
|
||||
"passwordStore_description": "what password/secret store to use. change this if you are having issues storing passwords.",
|
||||
"playbackStyle": "playback style",
|
||||
@@ -653,6 +696,12 @@
|
||||
"transcodeBitrate_description": "selects the bitrate to transcode. 0 means let the server pick",
|
||||
"transcodeFormat": "format to transcode",
|
||||
"transcodeFormat_description": "selects the format to transcode. leave empty to let the server decide",
|
||||
"translationApiProvider": "translation api provider",
|
||||
"translationApiProvider_description": "api provider for translation",
|
||||
"translationApiKey": "translation api key",
|
||||
"translationApiKey_description": "api key for translation (Support global service endpoint only)",
|
||||
"translationTargetLanguage": "translation target language",
|
||||
"translationTargetLanguage_description": "target language for translation",
|
||||
"trayEnabled": "show tray",
|
||||
"trayEnabled_description": "show/hide tray icon/menu. if disabled, also disables minimize/exit to tray",
|
||||
"useSystemTheme": "use system theme",
|
||||
@@ -663,6 +712,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",
|
||||
@@ -698,6 +749,7 @@
|
||||
"config": {
|
||||
"general": {
|
||||
"autoFitColumns": "auto fit columns",
|
||||
"followCurrentSong": "follow current song",
|
||||
"displayType": "display type",
|
||||
"gap": "$t(common.gap)",
|
||||
"itemGap": "item gap (px)",
|
||||
@@ -737,6 +789,8 @@
|
||||
},
|
||||
"view": {
|
||||
"card": "card",
|
||||
"grid": "grid",
|
||||
"list": "list",
|
||||
"poster": "poster",
|
||||
"table": "table"
|
||||
}
|
||||
|
||||
+120
-65
@@ -21,22 +21,23 @@
|
||||
"repeat_off": "repetir desactivado",
|
||||
"queue_clear": "limpiar cola",
|
||||
"muted": "silenciado",
|
||||
"unfavorite": "no favorito",
|
||||
"queue_moveToTop": "mover seleccionado al fondo",
|
||||
"unfavorite": "no favorita",
|
||||
"queue_moveToTop": "mover seleccionado al final",
|
||||
"queue_moveToBottom": "mover seleccionado al principio",
|
||||
"shuffle_off": "mezclar desactivado",
|
||||
"addLast": "añadir último",
|
||||
"mute": "silencio",
|
||||
"skip_forward": "saltar hacia delante",
|
||||
"pause": "pausa",
|
||||
"playSimilarSongs": "Reproducir canciones similares"
|
||||
"playSimilarSongs": "Reproducir canciones similares",
|
||||
"viewQueue": "ver cola"
|
||||
},
|
||||
"setting": {
|
||||
"crossfadeStyle_description": "selecciona el estilo de crossfade a usar por el reproductor de audio",
|
||||
"remotePort_description": "establece el puerto para el control remoto del servidor",
|
||||
"hotkey_skipBackward": "retroceder",
|
||||
"replayGainMode_description": "ajusta el volumen de ganancia acorde a los valores de {{ReplayGain}} almacenados en los metadatos del archivo",
|
||||
"audioDevice_description": "selecciona el dispositivo de audio para usar en la reproducción (solo reproductor web)",
|
||||
"audioDevice_description": "selecciona el dispositivo de audio a usar durante la reproducción (solo reproductor web)",
|
||||
"theme_description": "establece el tema a usar por la aplicación",
|
||||
"hotkey_playbackPause": "pausa",
|
||||
"replayGainFallback": "{{ReplayGain}} alternativa",
|
||||
@@ -67,7 +68,7 @@
|
||||
"scrobble_description": "hace scrobble de las reproducciones en tu servidor de medios",
|
||||
"audioExclusiveMode_description": "activa el modo de audio exclusivo. En este modo, el sistema es normalmente bloqueado, y solo se permitirá mpv en la salida de audio",
|
||||
"discordUpdateInterval": "intervalo de actualización del estado de actividad de {{discord}}",
|
||||
"themeLight": "tema (luminoso)",
|
||||
"themeLight": "tema (claro)",
|
||||
"fontType_optionBuiltIn": "fuente incorporada",
|
||||
"hotkey_playbackPlayPause": "play / pausa",
|
||||
"hotkey_rate1": "calificar con 1 estrella",
|
||||
@@ -81,8 +82,8 @@
|
||||
"hotkey_playbackPlay": "reproducir",
|
||||
"hotkey_togglePreviousSongFavorite": "cambia $t(common.previousSong) a favorito",
|
||||
"hotkey_volumeDown": "bajar volumen",
|
||||
"hotkey_unfavoritePreviousSong": "$t(common.previousSong) no favorito",
|
||||
"audioPlayer_description": "selecciona el reproductor de audio a usar en la reproducción",
|
||||
"hotkey_unfavoritePreviousSong": "$t(common.previousSong) no favorita",
|
||||
"audioPlayer_description": "selecciona el reproductor de audio a usar durante la reproducción",
|
||||
"globalMediaHotkeys": "teclas de acceso rápido globales a medios",
|
||||
"hotkey_globalSearch": "búsqueda global",
|
||||
"gaplessAudio_description": "establece la configuración de audio sin pausas para mpv",
|
||||
@@ -105,11 +106,11 @@
|
||||
"font": "fuente",
|
||||
"mpvExtraParameters": "parámetros de mpv",
|
||||
"replayGainMode_optionTrack": "$t(entity.track_one)",
|
||||
"themeLight_description": "establece el tema luminoso a usar por la aplicación",
|
||||
"themeLight_description": "establece el tema claro a usar por la aplicación",
|
||||
"hotkey_toggleFullScreenPlayer": "cambia el reproductor a pantalla completa",
|
||||
"hotkey_localSearch": "búsqueda en la página",
|
||||
"hotkey_toggleQueue": "cambia la cola",
|
||||
"remotePassword_description": "establece la contraseña para el control remoto del servidor. Esas credenciales son transferidas de forma insegura por defecto, por lo que deberías usar una contraseña única para que no tengas nada de qué preocuparte",
|
||||
"remotePassword_description": "establece la contraseña para el control remoto del servidor. Esas credenciales son transferidas de forma insegura por defecto, por lo que deberías usar una contraseña única para que no tengas nada de lo que preocuparte",
|
||||
"hotkey_rate5": "calificar con 5 estrellas",
|
||||
"hotkey_playbackPrevious": "pista anterior",
|
||||
"showSkipButtons_description": "muestra o esconde los botones de saltar en la barra del reproductor",
|
||||
@@ -119,13 +120,13 @@
|
||||
"hotkey_toggleShuffle": "alterna aleatorio",
|
||||
"theme": "tema",
|
||||
"playbackStyle_description": "selecciona el estilo de reproducción a usar por el reproductor de audio",
|
||||
"discordRichPresence_description": "activa el estado de reproducción en el estado de actividad de {{discord}}. Las teclas de imagen son: {{icon}}, {{playing}}, y {{paused}} ",
|
||||
"discordRichPresence_description": "activa el estado de reproducción en el estado de actividad de {{discord}}. Las teclas de imagen son: {{icon}}, {{playing}}, y {{paused}}",
|
||||
"mpvExecutablePath": "ruta del ejecutable mpv",
|
||||
"audioDevice": "dispositivo de audio",
|
||||
"hotkey_rate2": "calificar con 2 estrellas",
|
||||
"playButtonBehavior_description": "establece el comportamiento por defecto del botón de reproducción cuando se añaden canciones a la cola",
|
||||
"minimumScrobblePercentage_description": "el porcentaje mínimo de la canción que debe ser reproducido antes de hacer scrobble",
|
||||
"exitToTray": "salida a bandeja",
|
||||
"exitToTray": "salir a la bandeja",
|
||||
"hotkey_rate4": "calificar con 4 estrellas",
|
||||
"enableRemote": "activar control remoto del servidor",
|
||||
"showSkipButton_description": "muestra o esconde los botones de saltar en la barra del reproductor",
|
||||
@@ -141,13 +142,13 @@
|
||||
"replayGainFallback_description": "ganancia en db a aplicar si el archivo no tiene etiquetas de {{ReplayGain}}",
|
||||
"replayGainPreamp_description": "ajusta la ganancia del preamplificador aplicada a los valores de {{ReplayGain}}",
|
||||
"hotkey_toggleRepeat": "alterna repetir",
|
||||
"lyricOffset_description": "desfasa la letra por la cantidad de milisegundos especificada",
|
||||
"lyricOffset_description": "desfasa la letra en la cantidad de milisegundos especificada",
|
||||
"sidebarConfiguration_description": "selecciona los elementos y el orden en que aparecerán en la barra lateral",
|
||||
"fontType": "tipo de fuente",
|
||||
"remotePort": "puerto del control remoto del servidor",
|
||||
"applicationHotkeys": "teclas de acceso rápido de la aplicación",
|
||||
"hotkey_playbackNext": "pista siguiente",
|
||||
"useSystemTheme_description": "sigue la preferencia luminosa u oscura definida por el sistema",
|
||||
"useSystemTheme_description": "sigue la preferencia clara u oscura definida por el sistema",
|
||||
"playButtonBehavior_optionAddNext": "$t(player.addNext)",
|
||||
"lyricFetch_description": "busca letras en varias fuentes de Internet",
|
||||
"lyricFetchProvider_description": "selecciona los proveedores para buscar letras. el orden de los proveedores es el orden en el que se consultarán",
|
||||
@@ -159,13 +160,13 @@
|
||||
"sidePlayQueueStyle_optionDetached": "separada",
|
||||
"audioPlayer": "reproductor de audio",
|
||||
"hotkey_zoomOut": "reducir",
|
||||
"hotkey_unfavoriteCurrentSong": "$t(common.currentSong) no favorito",
|
||||
"hotkey_unfavoriteCurrentSong": "$t(common.currentSong) no favorita",
|
||||
"hotkey_rate0": "Limpiar calificación",
|
||||
"discordApplicationId": "id de aplicación {{discord}}",
|
||||
"applicationHotkeys_description": "configura las teclas de acceso rápido de la aplicación. marca la casilla para establecerlas como teclas de acceso rápido globales (solo escritorio)",
|
||||
"floatingQueueArea_description": "muestra un icono flotante en el lado derecho de la pantalla para ver la cola de reproducción",
|
||||
"hotkey_volumeMute": "silenciar volumen",
|
||||
"hotkey_toggleCurrentSongFavorite": "cambia $t(common.currentSong) a favorito",
|
||||
"hotkey_toggleCurrentSongFavorite": "$t(common.currentSong) cambia a favorita",
|
||||
"remoteUsername": "nombre de usuario del control remoto del servidor",
|
||||
"showSkipButton": "mostrar botones de saltar",
|
||||
"sidebarPlaylistList": "listas de reproducción de la barra lateral",
|
||||
@@ -194,12 +195,12 @@
|
||||
"hotkey_browserBack": "retroceso",
|
||||
"clearCache": "Limpiar la caché del navegador",
|
||||
"clearQueryCache": "Limpiar la caché de Feishin",
|
||||
"clearQueryCache_description": "Una 'limpieza suave' de Feishin. Esto refrescará las listas de reproducción, metadatos de pistas y restablecerá las letras guardadas. Se mantienen los ajustes, credenciales del servidor y las imágenes en caché",
|
||||
"clearQueryCache_description": "Una 'limpieza suave' de Feishin. Esto refrescará las listas de reproducción, los metadatos de las pistas y restablecerá las letras guardadas. Se mantienen los ajustes, credenciales del servidor y las imágenes en caché",
|
||||
"buttonSize": "tamaño del botón de la barra de reproducción",
|
||||
"clearCache_description": "Una 'limpieza fuerte' de Feishin. Para limpiar la caché de Feishin, vacía la caché del navegador (imágenes guardadas y otros elementos). Se mantienen las credenciales y ajustes del servidor",
|
||||
"buttonSize_description": "el tamaño de los botones de la barra de reproducción",
|
||||
"passwordStore_description": "qué método de almacenamiento de contraseñas/claves secretas utilizar. cambie esta opción si tiene problemas para guardar contraseñas.",
|
||||
"startMinimized_description": "iniciar la aplicación en la bandeja del sistema",
|
||||
"passwordStore_description": "qué método de almacenamiento de contraseñas/claves secretas utilizar. cambia esta opción si tienes problemas para guardar contraseñas.",
|
||||
"startMinimized_description": "inicia la aplicación en la bandeja del sistema",
|
||||
"startMinimized": "iniciar minimizado",
|
||||
"passwordStore": "contraseñas/almacenamiento secreto",
|
||||
"playerAlbumArtResolution_description": "la resolución para la vista previa de la carátula del álbum del reproductor grande. más grande hace que parezca más nítido, pero puede ralentizar la carga. El valor predeterminado es 0, lo que significa automático",
|
||||
@@ -207,8 +208,8 @@
|
||||
"homeConfiguration": "Configuración de la página de inicio",
|
||||
"mpvExtraParameters_help": "Uno por línea",
|
||||
"genreBehavior": "Comportamiento predeterminado de la página de géneros",
|
||||
"externalLinks_description": "Permite mostrar enlaces externos (Last.fm, MusicBrainz) en páginas de artista/álbum",
|
||||
"genreBehavior_description": "Determina si al pulsar en un género se abre por defecto la lista de pistas o de álbumes",
|
||||
"externalLinks_description": "Permite mostrar enlaces externos (Last.fm, MusicBrainz) en las páginas del artista/álbum",
|
||||
"genreBehavior_description": "Determina si al hacer clic en un género se abre por defecto la lista de pistas o de álbumes",
|
||||
"homeConfiguration_description": "Configura qué elementos son mostrados y en qué orden en la página de inicio",
|
||||
"clearCacheSuccess": "Caché limpiada correctamente",
|
||||
"externalLinks": "Mostrar enlaces externos",
|
||||
@@ -217,15 +218,15 @@
|
||||
"imageAspectRatio_description": "Si está habilitado, la portada será mostrada usando su relación de aspecto nativa. Para arte que no es 1:1, el espacio restante estará vacío",
|
||||
"imageAspectRatio": "Usar relación de aspecto nativa de portada",
|
||||
"doubleClickBehavior": "poner en cola todas las pistas buscadas al hacer doble clic",
|
||||
"doubleClickBehavior_description": "si es true, se pondrán en cola todas las pistas que coincidan en una búsqueda de pistas. De lo contrario, solo se pondrá en cola la pista seleccionada",
|
||||
"doubleClickBehavior_description": "si está activado, se pondrán en cola todas las pistas que coincidan en una búsqueda de pistas. De lo contrario, solo se pondrán en cola las pistas seleccionadas",
|
||||
"volumeWidth": "Ancho del deslizador de volumen",
|
||||
"volumeWidth_description": "La anchura del deslizador de volumen",
|
||||
"discordListening_description": "Muestra el estado como escuchando en lugar de reproduciendo. Ten en cuenta que esto actualmente rompe la barra de tiempo",
|
||||
"discordListening_description": "muestra el estado como Escuchando en lugar de Jugando a",
|
||||
"discordListening": "Mostrar estado como escuchando",
|
||||
"contextMenu": "Configuración del menú de contexto (clic derecho)",
|
||||
"contextMenu_description": "Te permite esconder elementos que son mostrados en el menú cuando haces clic derecho en un elemento. Los elementos que no estén seleccionados serán escondidos",
|
||||
"customCssEnable": "Habilitar CSS personalizado",
|
||||
"customCssEnable_description": "Permite la escritura de CSS personalizado.",
|
||||
"customCssEnable_description": "Permite escribir CSS personalizado.",
|
||||
"customCss": "CSS personalizado",
|
||||
"customCssNotice": "Aviso: mientras hay alguna sanitización (rechazar url() y content:), usar CSS personalizado puede aún entrañar riesgos cambiando la interfaz.",
|
||||
"customCss_description": "Content CSS personalizado. Nota: content y urls remotas son propiedades rechazadas. Una vista previa de tu content se muestra debajo. Las entradas adicionales que no estableciste están presentes debido a la sanitización.",
|
||||
@@ -235,20 +236,44 @@
|
||||
"transcode_description": "permite la transcodificación a distintos formatos",
|
||||
"transcodeBitrate": "tasa de bits a transcodificar",
|
||||
"transcodeBitrate_description": "selecciona el bitrate a transcodificar. 0 significa dejar que el servidor elija",
|
||||
"transcodeNote": "Se mostrará después de 1 (web) - 2 (mpv) pistas",
|
||||
"transcodeNote": "tendrá efecto después de 1 (web) - 2 (mpv) canciones",
|
||||
"transcodeFormat": "formato a transcodificar",
|
||||
"transcodeFormat_description": "selecciona el formato a transcodificar. dejar vacío para que el servidor decida",
|
||||
"albumBackground": "imagen de fondo del álbum",
|
||||
"albumBackground_description": "Agregar una imagen de fondo a las páginas del álbum que contienen la carátula del álbum",
|
||||
"albumBackground_description": "Añade una imagen de fondo a las páginas del álbum que contienen la carátula del álbum",
|
||||
"albumBackgroundBlur": "Tamaño de desenfoque de la imagen de fondo del álbum",
|
||||
"albumBackgroundBlur_description": "Ajustar el nivel de desenfoque de la imagen de fondo del álbum",
|
||||
"albumBackgroundBlur_description": "Ajusta la cantidad de desenfoque aplicado a la imagen de fondo del álbum",
|
||||
"playerbarOpenDrawer": "Cambiar la barra del reproductor a pantalla completa",
|
||||
"playerbarOpenDrawer_description": "Permitir hacer clic en la barra del reproductor para abrir el reproductor en pantalla completa",
|
||||
"playerbarOpenDrawer_description": "Permite hacer clic en la barra del reproductor para abrir el reproductor a pantalla completa",
|
||||
"artistConfiguration": "Configuración de la página del artista del álbum",
|
||||
"artistConfiguration_description": "Configurar qué elementos se muestran y en qué orden en la página del artista del álbum",
|
||||
"artistConfiguration_description": "Configura qué elementos se muestran y en qué orden en la página del artista del álbum",
|
||||
"playButtonBehavior_optionPlayShuffled": "$t(player.shuffle)",
|
||||
"trayEnabled": "Mostrar en el área de notificación",
|
||||
"trayEnabled_description": "mostrar/ocultar el icono/menú del área de notificación. si está deshabilitado, también deshabilita minimizar/salir a la bandeja"
|
||||
"trayEnabled_description": "muestra/oculta el icono/menú del área de notificación. si está deshabilitado, también deshabilita minimizar/salir a la bandeja",
|
||||
"translationApiProvider": "Proveedor de API de traducción",
|
||||
"translationApiProvider_description": "Proveedor de API para traducción",
|
||||
"translationApiKey": "clave api de traducción",
|
||||
"translationApiKey_description": "Clave API para la traducción (solo para el punto final del servicio global)",
|
||||
"translationTargetLanguage": "idioma final de la traducción",
|
||||
"translationTargetLanguage_description": "lengua de destino de la traducción",
|
||||
"lastfmApiKey_description": "la clave API para {{lastfm}}. Requerida para la portada",
|
||||
"lastfmApiKey": "Clave API para {{lastfm}}",
|
||||
"discordServeImage": "Servir imágenes de {{discord}} desde el servidor",
|
||||
"discordServeImage_description": "Comparte el arte de la portada para el estado de actividad de {{discord}} desde el propio servidor, solo disponible para Jellyfin y Navidrome",
|
||||
"lastfm": "Mostrar enlaces de last.fm",
|
||||
"lastfm_description": "Muestra enlaces a last.fm en las páginas de artistas/álbumes",
|
||||
"musicbrainz": "Mostrar enlaces de MusicBrainz",
|
||||
"musicbrainz_description": "Muestra enlaces a MusicBrainz en las páginas de artistas/álbumes, donde exista mbid",
|
||||
"neteaseTranslation": "Activar traducciones de NetEase",
|
||||
"neteaseTranslation_description": "Cuando se habilita, busca y muestra letras traducidas desde NetEase si está disponible.",
|
||||
"preferLocalLyrics_description": "Prefiere letras locales sobre letras remotas cuando esté disponible",
|
||||
"preferLocalLyrics": "Preferir letras locales",
|
||||
"discordPausedStatus": "Mostrar estado de actividad cuando esté en pausa",
|
||||
"discordPausedStatus_description": "Cuando está activado, el estado mostrará cuando el reproductor esté en pausa",
|
||||
"preservePitch": "Mantener el tono",
|
||||
"preservePitch_description": "Mantiene el tono cuando se modifica la velocidad de reproducción",
|
||||
"notify": "Activar notificaciones de canciones",
|
||||
"notify_description": "Muestra notificaciones cuando se cambia la canción actual"
|
||||
},
|
||||
"action": {
|
||||
"editPlaylist": "editar $t(entity.playlist_one)",
|
||||
@@ -264,14 +289,15 @@
|
||||
"deletePlaylist": "eliminar $t(entity.playlist_one)",
|
||||
"removeFromQueue": "eliminar de la cola",
|
||||
"deselectAll": "desmarcar todo",
|
||||
"moveToBottom": "mover al fondo",
|
||||
"moveToBottom": "mover al final",
|
||||
"setRating": "establecer calificación",
|
||||
"toggleSmartPlaylistEditor": "cambiar editor $t(entity.smartPlaylist)",
|
||||
"removeFromFavorites": "eliminar de $t(entity.favorite_other)",
|
||||
"openIn": {
|
||||
"lastfm": "Abrir en Last.fm",
|
||||
"musicbrainz": "Abrir en MusicBrainz"
|
||||
}
|
||||
},
|
||||
"moveToNext": "pasar al siguiente"
|
||||
},
|
||||
"common": {
|
||||
"backward": "hacia atrás",
|
||||
@@ -286,7 +312,7 @@
|
||||
"left": "izquierda",
|
||||
"save": "guardar",
|
||||
"right": "derecha",
|
||||
"currentSong": "actual $t(entity.track_one)",
|
||||
"currentSong": "$t(entity.track_one) actual",
|
||||
"collapse": "contraer",
|
||||
"trackNumber": "pista",
|
||||
"descending": "descendiente",
|
||||
@@ -324,7 +350,7 @@
|
||||
"saveAndReplace": "guardar y reemplazar",
|
||||
"playerMustBePaused": "el reproductor debe pausarse",
|
||||
"confirm": "confirmar",
|
||||
"resetToDefault": "restablecer a valor por defecto",
|
||||
"resetToDefault": "restablecer al valor predeterminado",
|
||||
"home": "inicio",
|
||||
"comingSoon": "próximamente…",
|
||||
"reset": "restablecer",
|
||||
@@ -355,8 +381,8 @@
|
||||
"channel_one": "Canal",
|
||||
"channel_many": "Canales",
|
||||
"channel_other": "Canales",
|
||||
"trackPeak": "la más alta de la canción",
|
||||
"albumPeak": "lo más destacado del álbum",
|
||||
"trackPeak": "pico de pista",
|
||||
"albumPeak": "pico del álbum",
|
||||
"albumGain": "Ganancia de álbum",
|
||||
"mbid": "ID de MusicBrainz",
|
||||
"codec": "Códec",
|
||||
@@ -364,7 +390,14 @@
|
||||
"reload": "Recargar",
|
||||
"share": "Compartir",
|
||||
"trackGain": "Ganancia de pista",
|
||||
"preview": "Vista previa"
|
||||
"preview": "Vista previa",
|
||||
"translation": "traducción",
|
||||
"additionalParticipants": "Participantes adicionales",
|
||||
"tags": "Etiquetas",
|
||||
"newVersion": "Una nueva versión ha sido instalada ({{version}})",
|
||||
"viewReleaseNotes": "Ver notas de lanzamiento",
|
||||
"bitDepth": "Profundidad de bit",
|
||||
"sampleRate": "Frecuencia de muestreo"
|
||||
},
|
||||
"error": {
|
||||
"remotePortWarning": "reiniciar el servidor para aplicar el nuevo puerto",
|
||||
@@ -386,13 +419,15 @@
|
||||
"audioDeviceFetchError": "un error ocurrió cuando se intentó obtener los dispositivos de audio",
|
||||
"invalidServer": "servidor inválido",
|
||||
"loginRateError": "demasiados intentos de inicio de sesión, por favor inténtalo en unos segundos",
|
||||
"badAlbum": "Estás viendo esta página porque esta canción no forma parte de un álbum. Este problema puede ocurrir si tiene una canción en el nivel superior de su carpeta de música. Jellyfin solo agrupa pistas si están en una carpeta.",
|
||||
"badAlbum": "Estás viendo esta página porque esta canción no forma parte de un álbum. Este problema puede ocurrir si tienes una canción en el nivel superior de tu carpeta de música. Jellyfin solo agrupa pistas si están en una carpeta.",
|
||||
"networkError": "Ocurrió un error de red",
|
||||
"openError": "No se pudo abrir el archivo"
|
||||
"openError": "No se pudo abrir el archivo",
|
||||
"badValue": "Opción inválida \"{{value}}\". Este valor ya no existe",
|
||||
"notificationDenied": "Se denegaron los permisos para notificaciones. Esta configuración no tiene efecto"
|
||||
},
|
||||
"filter": {
|
||||
"mostPlayed": "más reproducido",
|
||||
"isCompilation": "es compilación",
|
||||
"isCompilation": "es una compilación",
|
||||
"recentlyPlayed": "recientemente reproducido",
|
||||
"isRated": "es clasificado",
|
||||
"title": "título",
|
||||
@@ -423,7 +458,7 @@
|
||||
"criticRating": "calificación de la crítica",
|
||||
"trackNumber": "pista",
|
||||
"comment": "comentarios",
|
||||
"playCount": "número de reproducción",
|
||||
"playCount": "número de reproducciones",
|
||||
"recentlyUpdated": "actualizado recientemente",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"owner": "$t(common.owner)",
|
||||
@@ -447,7 +482,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",
|
||||
@@ -482,14 +518,15 @@
|
||||
"showDetails": "Obtener información",
|
||||
"playSimilarSongs": "$t(player.playSimilarSongs)",
|
||||
"download": "descargar",
|
||||
"playShuffled": "$t(player.shuffle)"
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"moveToNext": "$t(action.moveToNext)"
|
||||
},
|
||||
"home": {
|
||||
"mostPlayed": "más reproducidos",
|
||||
"newlyAdded": "nuevos lanzamientos añadidos",
|
||||
"title": "$t(common.home)",
|
||||
"explore": "explorar desde tu biblioteca",
|
||||
"recentlyPlayed": "recientemente reproducidos"
|
||||
"explore": "explora desde tu biblioteca",
|
||||
"recentlyPlayed": "reproducidos recientemente"
|
||||
},
|
||||
"fullscreenPlayer": {
|
||||
"upNext": "siguiente",
|
||||
@@ -506,15 +543,18 @@
|
||||
"showLyricMatch": "mostrar coincidencia de letras",
|
||||
"lyricGap": "desfase de letra",
|
||||
"dynamicImageBlur": "tamaño de desenfoque de imagen",
|
||||
"dynamicIsImage": "habilitar imagen de fondo"
|
||||
"dynamicIsImage": "habilitar imagen de fondo",
|
||||
"lyricOffset": "desplazamiento de letras (ms)"
|
||||
},
|
||||
"lyrics": "letras",
|
||||
"related": "relacionado"
|
||||
"related": "relacionado",
|
||||
"visualizer": "visualizador",
|
||||
"noLyrics": "sin letras"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "más de este $t(entity.artist_one)",
|
||||
"moreFromGeneric": "más de {{item}}",
|
||||
"released": "publicado"
|
||||
"released": "publicado el"
|
||||
},
|
||||
"setting": {
|
||||
"playbackTab": "reproducción",
|
||||
@@ -534,7 +574,7 @@
|
||||
"trackList": {
|
||||
"title": "$t(entity.track_other)",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track_other)",
|
||||
"artistTracks": "pistas por {{artist}}"
|
||||
"artistTracks": "Pistas de {{artist}}"
|
||||
},
|
||||
"globalSearch": {
|
||||
"commands": {
|
||||
@@ -550,11 +590,11 @@
|
||||
"albumList": {
|
||||
"title": "$t(entity.album_other)",
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)",
|
||||
"artistAlbums": "álbumes de {{artist}}"
|
||||
"artistAlbums": "Álbumes de {{artist}}"
|
||||
},
|
||||
"albumArtistDetail": {
|
||||
"viewAllTracks": "ver todo de $t(entity.track_other)",
|
||||
"relatedArtists": "$t(entity.artist_other) similar",
|
||||
"viewAllTracks": "ver todas las $t(entity.track_other)",
|
||||
"relatedArtists": "$t(entity.artist_other) similares",
|
||||
"topSongs": "mejores canciones",
|
||||
"topSongsFrom": "las mejores canciones de {{title}}",
|
||||
"viewAll": "Ver todo",
|
||||
@@ -570,6 +610,14 @@
|
||||
},
|
||||
"playlist": {
|
||||
"reorder": "la reordenación solo se activa al ordenar por id"
|
||||
},
|
||||
"manageServers": {
|
||||
"removeServer": "eliminar servidor",
|
||||
"title": "administrar servidores",
|
||||
"serverDetails": "detalles del servidor",
|
||||
"username": "nombre de usuario",
|
||||
"editServerDetailsTooltip": "editar detalles del servidor",
|
||||
"url": "URL"
|
||||
}
|
||||
},
|
||||
"form": {
|
||||
@@ -621,7 +669,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?)",
|
||||
@@ -652,7 +701,7 @@
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"trackNumber": "pista",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"albumArtist": "artista de álbum",
|
||||
"albumArtist": "artista del álbum",
|
||||
"path": "ruta",
|
||||
"discNumber": "disco",
|
||||
"channels": "$t(common.channel_other)",
|
||||
@@ -683,7 +732,7 @@
|
||||
"note": "$t(common.note)",
|
||||
"owner": "$t(common.owner)",
|
||||
"path": "$t(common.path)",
|
||||
"playCount": "número de reproducción",
|
||||
"playCount": "número de reproducciones",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"favorite": "$t(common.favorite)",
|
||||
"year": "$t(common.year)",
|
||||
@@ -697,12 +746,15 @@
|
||||
"size": "$t(common.size)",
|
||||
"displayType": "tipo de visualización",
|
||||
"itemGap": "espacio entre elementos (px)",
|
||||
"itemSize": "tamaño del elemento (px)"
|
||||
"itemSize": "tamaño del elemento (px)",
|
||||
"followCurrentSong": "seguir la canción actual"
|
||||
},
|
||||
"view": {
|
||||
"card": "tarjeta",
|
||||
"table": "tabla",
|
||||
"poster": "cartel"
|
||||
"poster": "cartel",
|
||||
"list": "Lista",
|
||||
"grid": "Cuadrícula"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -723,15 +775,15 @@
|
||||
"folderWithCount_one": "{{count}} carpeta",
|
||||
"folderWithCount_many": "{{count}} carpetas",
|
||||
"folderWithCount_other": "{{count}} carpetas",
|
||||
"albumArtist_one": "artista de álbum",
|
||||
"albumArtist_many": "artistas de álbum",
|
||||
"albumArtist_other": "artistas de álbum",
|
||||
"albumArtist_one": "artista del álbum",
|
||||
"albumArtist_many": "artistas del álbum",
|
||||
"albumArtist_other": "artistas del álbum",
|
||||
"track_one": "pista",
|
||||
"track_many": "pistas",
|
||||
"track_other": "pistas",
|
||||
"albumArtistCount_one": "{{count}} artista de álbum",
|
||||
"albumArtistCount_many": "{{count}} artistas de álbum",
|
||||
"albumArtistCount_other": "{{count}} artistas de álbum",
|
||||
"albumArtistCount_one": "{{count}} artista del álbum",
|
||||
"albumArtistCount_many": "{{count}} artistas del álbum",
|
||||
"albumArtistCount_other": "{{count}} artistas del álbum",
|
||||
"albumWithCount_one": "{{count}} álbum",
|
||||
"albumWithCount_many": "{{count}} álbumes",
|
||||
"albumWithCount_other": "{{count}} álbumes",
|
||||
@@ -753,8 +805,11 @@
|
||||
"trackWithCount_one": "{{count}} pista",
|
||||
"trackWithCount_many": "{{count}} pistas",
|
||||
"trackWithCount_other": "{{count}} pistas",
|
||||
"play_one": "Reproducir {{count}}",
|
||||
"play_many": "Reproducir {{count}}",
|
||||
"play_other": "Reproducir {{count}}"
|
||||
"play_one": "{{count}} reproducción",
|
||||
"play_many": "{{count}} reproducciones",
|
||||
"play_other": "{{count}} reproducciones",
|
||||
"song_one": "canción",
|
||||
"song_many": "canciones",
|
||||
"song_other": "canciones"
|
||||
}
|
||||
}
|
||||
|
||||
+354
-33
@@ -6,12 +6,31 @@
|
||||
"skip": "رد کن",
|
||||
"toggleFullscreenPlayer": "تغییر به پخشکنندهٔ تمامصفحه",
|
||||
"skip_back": "برو عقب",
|
||||
"shuffle": "شافل",
|
||||
"shuffle": "پخش تصادفی",
|
||||
"repeat_off": "تکرار غیرفعال",
|
||||
"pause": "pause",
|
||||
"pause": "ایست",
|
||||
"unfavorite": "حذف از موردعلاقهها",
|
||||
"shuffle_off": "شافل غیرفعال",
|
||||
"skip_forward": "برو جلو"
|
||||
"shuffle_off": "پخش تصادفی غیر فعال",
|
||||
"skip_forward": "برو جلو",
|
||||
"queue_moveToTop": "جابجا کردن انتخاب شده به پایین",
|
||||
"queue_clear": "خالی کردن صف",
|
||||
"queue_remove": "حذف انتخاب شده",
|
||||
"addLast": "افزودن به پایان",
|
||||
"next": "پسین",
|
||||
"play": "پخش",
|
||||
"playbackSpeed": "تندی پخش",
|
||||
"playRandom": "پخش تصادفی",
|
||||
"previous": "پیشین",
|
||||
"mute": "بیصدا کردن",
|
||||
"playbackFetchCancel": "دارد طول میکشد... برای لفو کردن اعلان را ببندید",
|
||||
"playbackFetchInProgress": "بارگذاری قطعهها…",
|
||||
"queue_moveToBottom": "جابجا کردن انتخاب شده به بالا",
|
||||
"addNext": "افزودن به پسین",
|
||||
"favorite": "مورد علاقه",
|
||||
"playSimilarSongs": "پخش آهنگهای همگون",
|
||||
"playbackFetchNoResults": "هیچ آهنگی پیدا نشد",
|
||||
"viewQueue": "دیدن صف",
|
||||
"muted": "بیصدا"
|
||||
},
|
||||
"action": {
|
||||
"editPlaylist": "ویرایش $t(entity.playlist_one)",
|
||||
@@ -29,8 +48,13 @@
|
||||
"deselectAll": "لغو انتخاب همه",
|
||||
"moveToBottom": "انتقال به پایین",
|
||||
"setRating": "تعیین امتیاز",
|
||||
"toggleSmartPlaylistEditor": "تغییر $t(entity.smartPlaylist) ویرایشگر",
|
||||
"removeFromFavorites": "حذف از $t(entity.favorite_other)"
|
||||
"toggleSmartPlaylistEditor": "تغییر ویرایشگر $t(entity.smartPlaylist)",
|
||||
"removeFromFavorites": "حذف از $t(entity.favorite_other)",
|
||||
"openIn": {
|
||||
"lastfm": "باز کردن در Last.fm",
|
||||
"musicbrainz": "باز کردن در MusicBranz"
|
||||
},
|
||||
"moveToNext": "جابجا کردن به بعدی"
|
||||
},
|
||||
"setting": {
|
||||
"hotkey_skipBackward": "برو عقب",
|
||||
@@ -72,7 +96,7 @@
|
||||
"mpvExecutablePath": "مسیر اجرای MPV",
|
||||
"audioDevice": "دستگاه صوتی",
|
||||
"hotkey_rate2": "امتیاز ۲ ستاره",
|
||||
"playButtonBehavior_description": "رفتار پیشفرض دکمهٔ پخش را هنگامی که آهنگی به صف اضافه میشود معین میکند",
|
||||
"playButtonBehavior_description": "رفتار پیشفرض دکمهٔ پخش را هنگامی که آهنگی به صف افزوده میشود را معین میکند",
|
||||
"exitToTray": "خروج به tray",
|
||||
"hotkey_rate4": "امتیاز ۴ ستاره",
|
||||
"enableRemote": "فعال کردن کنترل از راه دور سرویسدهنده",
|
||||
@@ -93,7 +117,64 @@
|
||||
"customFontPath_description": "مسیر قلم سفارشی را برای استفاده در اپلیکیشن مشخص کنید",
|
||||
"gaplessAudio_optionWeak": "ضعیف (توصیه شده)",
|
||||
"hotkey_playbackStop": "توقف",
|
||||
"font_description": "قلم مورد استفادهٔ اپلیکیشن را معین میکند"
|
||||
"font_description": "قلم مورد استفادهٔ اپلیکیشن را معین میکند",
|
||||
"accentColor_description": "رنگ شاخص را برای نرمافزار مشخص میکند",
|
||||
"applicationHotkeys": "کلیدهای میانبر نرمافزار",
|
||||
"accentColor": "رنگ شاخص",
|
||||
"albumBackgroundBlur": "اندازهی مبهمی نگارهی پسزمینهی آلبوم",
|
||||
"albumBackgroundBlur_description": "مقدار مبهمیای که روی نگارهی پسزمینهی آلبوم اعمال میشود را تنظیم میکند",
|
||||
"albumBackground": "نگارهی پسزمینهی آلبوم",
|
||||
"albumBackground_description": "یک نگارهی پسزمینه برای صفحات آلبوم دارای نگار آلبوم هستند، میافزاید",
|
||||
"artistConfiguration": "پیکربندی صفحهی هنرمند آلبوم",
|
||||
"applicationHotkeys_description": "پیکربندی کلیدهای میانبر نرمافزار. برای تنظیم یک کلید میانبر عمومی مربع چک را فعال کنید (فقط پخشکنندهی میزکار)",
|
||||
"clearCache": "پاکسازی کَش مرورگر",
|
||||
"clearQueryCache": "پاکسازی کَش فیشین",
|
||||
"clearCacheSuccess": "با موفقیت کَش پاک شد",
|
||||
"artistConfiguration_description": "پیکربندی اینکه چه آیتمیهایی و در چه ترتیبی در صفحهی هنرمند آلبوم نمایش داده شوند",
|
||||
"buttonSize": "اندازهی دکمهی پخش نوار",
|
||||
"contextMenu": "پیکربندی فهرست زمینه (کلیک راست)",
|
||||
"buttonSize_description": "اندازهی دکمههای پخش نوار",
|
||||
"audioExclusiveMode_description": "حالت اختصاصی خروجی را فعال میکند. در این حالت، سامانه معمولاً قفل است و فقط mpv میتواند خروجی صدا دهد",
|
||||
"clearQueryCache_description": "یک 'پاکسازی نرم' از فیشین. این فهرستهای پخش و فرادادهی قطعهها را تازه میکند و متن شعرهای ذخیره شده را بازنشانی میکند. پیکربندیها، اعتبارنامههای سرویسدهنده و نگارههای کَش شده حفظ میشوند",
|
||||
"clearCache_description": "یک 'پاکسازی سخت' فیشین. افزون بر پاکسازی کَش فیشین، کَش مرورگر هم تهی میشود (نگارههای ذخیره شده و باقی داراییها). اعتبارنامهها و پیکربندیها حفظ میشوند",
|
||||
"contextMenu_description": "به شما اجازه میدهد که آیتمهای نمایش داده شده در فهرستی که وقتی روی یک آیتم کلیک راست میکنید پدیدار میشود، را پنهان کنید. آیتمهایی که منتخب نیستند پنهان میشوند",
|
||||
"crossfadeStyle": "شیوهی crossfade",
|
||||
"customCssEnable_description": "اجازه دادن برای نوشتن css سفارشی.",
|
||||
"translationApiKey": "کلید API ترجمه",
|
||||
"webAudio_description": "از صدای وب بهرهمند میشود. این قابلیتهای پیشرفتهای مانند گین بازپخش (replygain) را فعال میکند. غیرفعال کنید اگر غیر از این را تجربه میکنید",
|
||||
"windowBarStyle_description": "گزینش سبک نوار پنجره",
|
||||
"translationApiKey_description": "کلید API برای ترجمه (پشتیبانی فقط برای نقطهی پایانی سرویسدهندهی جهانی)",
|
||||
"theme": "تم",
|
||||
"hotkey_togglePreviousSongFavorite": "تغییر وضعیت برای مورد علاقهی $t(common.previousSong)",
|
||||
"transcode": "فعالسازی رمزگردانی",
|
||||
"transcode_description": "رمزگردانی به فرمتهای گوناگون را فعال میکند",
|
||||
"transcodeBitrate": "نرخ انتقال رمزگردانی",
|
||||
"startMinimized": "پنهانشده آغاز کن",
|
||||
"theme_description": "تم مورد استفاده در نرمافزار را میگزیند",
|
||||
"themeLight": "تم (روشن)",
|
||||
"transcodeBitrate_description": "نرخ انتقال برای رمزگردانی را انتخاب میکند. 0 بدان معناست سرور آن را انتخاب کند",
|
||||
"transcodeFormat": "فرمت رمزگردانی",
|
||||
"transcodeFormat_description": "فرمت رمزگردانی را انتخاب میکند. برای اینکه سرور آن را انتخاب کند، خالی بگذارید",
|
||||
"customCssEnable": "فعال کردن css سفارشی",
|
||||
"translationTargetLanguage": "زبان هدف ترجمه",
|
||||
"hotkey_toggleCurrentSongFavorite": "تغییر وضعیت مورد علاقه برای $t(common.currentSong)",
|
||||
"themeDark_description": "تم تاریک را برای استفادهی نرمافزار میگزیند",
|
||||
"volumeWheelStep_description": "اندازهای از حجم صدا را در زمان اسکرول کردن روی نوار لغزنده تغییر داده شود",
|
||||
"trayEnabled": "نمایش سینی",
|
||||
"trayEnabled_description": "نمایش/پنهان کردن آیکون/فهرست در سینی. اگر غیرفعال باشد، کوچک کردن/خروج به سینی را نیز غیرفعال میکند",
|
||||
"useSystemTheme_description": "از روشنی یا تاریکی که سیستم تعریف کرده است، پیروی میکند",
|
||||
"crossfadeDuration": "زمان محو کردن گذار قطعه به قطعهی بعدی",
|
||||
"themeLight_description": "تم روشن را برای استفادهی نرمافزار میگزیند",
|
||||
"volumeWidth": "عرض نوار لغزندهی حجم صدا",
|
||||
"crossfadeStyle_description": "شیوهی crossfade که میخواهید پخشکننده از آن استفاده کند را انتخاب کنید",
|
||||
"startMinimized_description": "نرمافزار را در سینی اجرا کن",
|
||||
"volumeWidth_description": "عرضی که نوار لغزندهی حجم صدا داشته باشد",
|
||||
"themeDark": "تم (تاریک)",
|
||||
"useSystemTheme": "استفاده از تم سیستم",
|
||||
"volumeWheelStep": "گام چرخ حجم صدا",
|
||||
"webAudio": "استفاده از صدای وب",
|
||||
"windowBarStyle": "سبک نوار پنجره",
|
||||
"crossfadeDuration_description": "زمان افکت crossfade را مشخص میکند"
|
||||
},
|
||||
"common": {
|
||||
"backward": "به عقب",
|
||||
@@ -140,9 +221,9 @@
|
||||
"forceRestartRequired": "برای اعمال تغییرها دوباره راهاندازی کنید… اعلان را برای راهاندازی دوباره ببندید",
|
||||
"version": "نسخه",
|
||||
"title": "عنوان",
|
||||
"filter_one": "فیلتر",
|
||||
"filter_other": "فیلتر",
|
||||
"filters": "فیلتر",
|
||||
"filter_one": "پالایش",
|
||||
"filter_other": "پالایش",
|
||||
"filters": "پالایش",
|
||||
"create": "ساختن",
|
||||
"bitrate": "بیتریت",
|
||||
"saveAndReplace": "ذخیره و جایگزین",
|
||||
@@ -162,17 +243,29 @@
|
||||
"menu": "منو",
|
||||
"restartRequired": "راهاندازی دوباره لازم است",
|
||||
"previousSong": "$t(entity.track_one) پیشین",
|
||||
"noResultsFromQuery": "جست و جو نتیجهای نداشت",
|
||||
"noResultsFromQuery": "جستوجو نتیجهای نداشت",
|
||||
"quit": "خروج",
|
||||
"expand": "گسترش",
|
||||
"search": "جست و جو",
|
||||
"search": "جستوجو",
|
||||
"saveAs": "ذخیره کن با اسم",
|
||||
"disc": "دیسک",
|
||||
"yes": "بله",
|
||||
"random": "تصادفی",
|
||||
"size": "حجم",
|
||||
"biography": "زندگینامه",
|
||||
"note": "توجه"
|
||||
"note": "توجه",
|
||||
"albumGain": "گین آلبوم",
|
||||
"close": "بستن",
|
||||
"albumPeak": "اوج آلبوم",
|
||||
"mbid": "شناسهی MusicBrainz",
|
||||
"reload": "بارگذاری مجدد",
|
||||
"setting": "پیکربندی",
|
||||
"trackGain": "گین قطعه",
|
||||
"trackPeak": "اوج قطعه",
|
||||
"translation": "ترجمه",
|
||||
"preview": "پیشنمایش",
|
||||
"share": "اشتراکگذاری",
|
||||
"codec": "کدک"
|
||||
},
|
||||
"error": {
|
||||
"remotePortWarning": "برای تعیین port تازه، سرویس دهنده را دوباره راهاندازی کنید",
|
||||
@@ -188,7 +281,15 @@
|
||||
"serverNotSelectedError": "سرویسدهندهای انتخاب نشده",
|
||||
"remoteDisableError": "هنگام $t(common.disable) سرویس دهنده خطایی رخ داد",
|
||||
"mpvRequired": "وجود MPV ضروری است",
|
||||
"audioDeviceFetchError": "هنگام دسترسی به دستگاه صوتی خطایی رخ داد"
|
||||
"audioDeviceFetchError": "هنگام دسترسی به دستگاه صوتی خطایی رخ داد",
|
||||
"localFontAccessDenied": "دسترسی به فونتهای محلی پذیرفته نشد",
|
||||
"loginRateError": "تلاشهای بسیار برای ورود انجام دادهاید،لطفاً بعد از چند ثانیه دوباره امتحان کنید",
|
||||
"networkError": "خطای شبکه رخ داد",
|
||||
"badAlbum": "شما این صفحه را میبینید چونکه این آهنگ قسمتی از یک آلبوم نیست. شما احتمالا این مسأله را به این خاطر میبینید که آهنگی در پوشهی سطح بالای آهنگهایتان دارید. جلیفین فقط قطعههایی را گروهبندی میکند که در یک پوشه قرار دارند.",
|
||||
"invalidServer": "سرویسدهندهی نامعتبر",
|
||||
"openError": "نمیتوان پرونده را باز کرد",
|
||||
"endpointNotImplementedError": "نقطهی پایان {{endpoint}} برای {{serverType}} قرار داده نشده است",
|
||||
"systemFontError": "خطایی هنگام تلاش برای دریافت فونتهای سیستم رخ داد"
|
||||
},
|
||||
"filter": {
|
||||
"mostPlayed": "بیشتر پخش شده",
|
||||
@@ -201,13 +302,13 @@
|
||||
"owner": "$t(common.owner)",
|
||||
"title": "عنوان",
|
||||
"rating": "امتیاز",
|
||||
"search": "جست و جو",
|
||||
"search": "جستوجو",
|
||||
"bitrate": "بیتریت",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"recentlyAdded": "به تازگی اضافه شده",
|
||||
"recentlyAdded": "به تازگی افزوده شده",
|
||||
"note": "توجه",
|
||||
"name": "نام",
|
||||
"dateAdded": "تاریخ اضافه شدن",
|
||||
"dateAdded": "تاریخ افزوده شدن",
|
||||
"releaseDate": "تاریخ انتشار",
|
||||
"albumCount": "$t(entity.album_other) عدد",
|
||||
"path": "مسیر",
|
||||
@@ -230,7 +331,9 @@
|
||||
"fromYear": "از سال",
|
||||
"criticRating": "امتیاز منتقدین",
|
||||
"album": "$t(entity.album_one)",
|
||||
"trackNumber": "قطعه"
|
||||
"trackNumber": "قطعه",
|
||||
"communityRating": "رتبه بندی جامعه",
|
||||
"isCompilation": "مخلوط است"
|
||||
},
|
||||
"form": {
|
||||
"deletePlaylist": {
|
||||
@@ -252,38 +355,61 @@
|
||||
"input_url": "نشانی",
|
||||
"input_password": "رمز عبور",
|
||||
"input_name": "نام سرویسدهنده",
|
||||
"success": "سرویسدهنده اضافه شد",
|
||||
"success": "سرویسدهنده افزوده شد",
|
||||
"input_savePassword": "ذخیرهٔ رمز",
|
||||
"error_savePassword": "هنگام ذخیره رمز خطایی رخ داد"
|
||||
"error_savePassword": "هنگام ذخیره رمز خطایی رخ داد",
|
||||
"ignoreCors": "نادیده گرفتن هستهها ($t(common.restartRequired))",
|
||||
"input_legacyAuthentication": "فعالسازی احراز هویت سنتی",
|
||||
"ignoreSsl": "نادیده گرفتن ssl ($t(common.restartRequired))"
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"success": "$t(entity.song_other) به {{numOfPlaylists}}$t(entity.playlist_other) اضافه شد",
|
||||
"success": "$t(entity.song_other) به {{numOfPlaylists}}$t(entity.playlist_other) افزوده شد",
|
||||
"title": "افزودن به $t(entity.playlist_one)",
|
||||
"input_playlists": "$t(entity.playlist_other)"
|
||||
"input_playlists": "$t(entity.playlist_other)",
|
||||
"input_skipDuplicates": "پرش از تکراریها"
|
||||
},
|
||||
"lyricSearch": {
|
||||
"input_name": "$t(common.name)",
|
||||
"input_artist": "$t(entity.artist_one)"
|
||||
"input_artist": "$t(entity.artist_one)",
|
||||
"title": "جستوجو در متن شعر"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"title": "ویرایش $t(entity.playlist_one)"
|
||||
"title": "ویرایش $t(entity.playlist_one)",
|
||||
"success": "$t(entity.playlist_one) با موفقیت بروزرسانی شد",
|
||||
"publicJellyfinNote": "جلیفین به دلیلی اینکه فهرست پخش عمومیست یا خصوصی را فاش نمیکند. اگر میخواهید این عمومی باقی بماند، لطفاٌ ورودی پیشرو را منتخب داشته باشید"
|
||||
},
|
||||
"queryEditor": {
|
||||
"input_optionMatchAny": "همخوانی داشتن هر کدام",
|
||||
"input_optionMatchAll": "همخوانی داشتن همه"
|
||||
},
|
||||
"shareItem": {
|
||||
"expireInvalid": "انقضا باید در آینده باشد",
|
||||
"description": "بازنمود",
|
||||
"setExpiration": "تنظیم انقضا",
|
||||
"success": "پیوند اشتراکگذاری در کلیپبورد کپی شد (یا اینجا را کلیک کنید تا باز شود)",
|
||||
"allowDownloading": "اجازه دادن بارگیری",
|
||||
"createFailed": "ناکامی در ساخت پیوند اشتراکگذاری (آیا اشتراکگذاری فعال است؟)"
|
||||
},
|
||||
"updateServer": {
|
||||
"success": "سرویسدهنده با موفقیت بروزرسانی شد",
|
||||
"title": "بروزرسانی سرویسدهنده"
|
||||
}
|
||||
},
|
||||
"entity": {
|
||||
"genre_one": "ژانر",
|
||||
"genre_other": "ژانر",
|
||||
"genre_other": "ژانرها",
|
||||
"playlistWithCount_one": "{{count}} فهرست پخش",
|
||||
"playlistWithCount_other": "{{count}} فهرست پخش",
|
||||
"playlist_one": "فهرست پخش",
|
||||
"playlist_other": "فهرست پخش",
|
||||
"playlist_other": "فهرستهای پخش",
|
||||
"artist_one": "هنرمند",
|
||||
"artist_other": "هنرمند",
|
||||
"artist_other": "هنرمندان",
|
||||
"folderWithCount_one": "{{count}} پوشه",
|
||||
"folderWithCount_other": "{{count}} پوشه",
|
||||
"albumArtist_one": "هنرمند آلبوم",
|
||||
"albumArtist_other": "هنرمند آلبوم",
|
||||
"albumArtist_other": "هنرمندان آلبوم",
|
||||
"track_one": "قطعه",
|
||||
"track_other": "قطعه",
|
||||
"track_other": "قطعهها",
|
||||
"albumArtistCount_one": "{{count}} هنرمند آلبوم",
|
||||
"albumArtistCount_other": "{{count}} هنرمند آلبوم",
|
||||
"albumWithCount_one": "{{count}} آلبوم",
|
||||
@@ -293,13 +419,208 @@
|
||||
"artistWithCount_one": "{{count}} هنرمند",
|
||||
"artistWithCount_other": "{{count}} هنرمند",
|
||||
"folder_one": "پوشه",
|
||||
"folder_other": "پوشه",
|
||||
"folder_other": "پوشهها",
|
||||
"smartPlaylist": "$t(entity.playlist_one) هوشمند",
|
||||
"album_one": "آلبوم",
|
||||
"album_other": "آلبوم",
|
||||
"album_other": "آلبومها",
|
||||
"genreWithCount_one": "{{count}} ژانر",
|
||||
"genreWithCount_other": "{{count}} ژانر",
|
||||
"trackWithCount_one": "{{count}} قطعه",
|
||||
"trackWithCount_other": "{{count}} قطعه"
|
||||
"trackWithCount_other": "{{count}} قطعه",
|
||||
"play_one": "{{count}} بار پخش",
|
||||
"play_other": "{{count}} بار پخش",
|
||||
"song_one": "آهنگ",
|
||||
"song_other": "آهنگها"
|
||||
},
|
||||
"page": {
|
||||
"albumList": {
|
||||
"title": "$t(entity.album_other)",
|
||||
"artistAlbums": "آلبومهای {{artist}}",
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)"
|
||||
},
|
||||
"appMenu": {
|
||||
"settings": "$t(common.setting_other)",
|
||||
"selectServer": "گزینش سرویسدهنده",
|
||||
"expandSidebar": "گسترش نوار کناری",
|
||||
"collapseSidebar": "فروکش نوار کناری",
|
||||
"goBack": "بازگشت",
|
||||
"openBrowserDevtools": "باز کردن ابزارهای توسعه مرورگر",
|
||||
"quit": "$t(common.quit)",
|
||||
"goForward": "پیش رفتن",
|
||||
"manageServers": "مدیریت سرویسدهندهها",
|
||||
"version": "نسخهی {{version}}"
|
||||
},
|
||||
"albumArtistDetail": {
|
||||
"appearsOn": "مشاهده میشود در",
|
||||
"about": "دربارهی {{artist}}",
|
||||
"recentReleases": "عرضههای اخیر",
|
||||
"viewAllTracks": "نمایش همهی $t(entity.track_other)",
|
||||
"topSongsFrom": "قطعههای برتر از {{title}}",
|
||||
"viewAll": "نمایش همه",
|
||||
"viewDiscography": "نمایش کاتالوگ",
|
||||
"relatedArtists": "$t(entity.artist_other) مربوطه",
|
||||
"topSongs": "قطعههای برتر"
|
||||
},
|
||||
"contextMenu": {
|
||||
"addFavorite": "$t(action.addToFavorites)",
|
||||
"addLast": "$t(player.addLast)",
|
||||
"addNext": "$t(player.addNext)",
|
||||
"addToFavorites": "$t(action.addToFavorites)",
|
||||
"numberSelected": "{{count}} تا انتخاب شده",
|
||||
"play": "$t(player.play)",
|
||||
"removeFromFavorites": "$t(action.removeFromFavorites)",
|
||||
"deselectAll": "$t(action.deselectAll)",
|
||||
"download": "بارگیری",
|
||||
"shareItem": "اشتراکگذاری آیتم",
|
||||
"removeFromPlaylist": "$t(action.removeFromPlaylist)",
|
||||
"showDetails": "دریافت داده",
|
||||
"playSimilarSongs": "$t(player.playSimilarSongs)",
|
||||
"removeFromQueue": "$t(action.removeFromQueue)",
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"addToPlaylist": "$t(action.addToPlaylist)",
|
||||
"createPlaylist": "$t(action.createPlaylist)",
|
||||
"moveToBottom": "$t(action.moveToBottom)",
|
||||
"moveToTop": "$t(action.moveToTop)",
|
||||
"setRating": "$t(action.setRating)",
|
||||
"deletePlaylist": "$t(action.deletePlaylist)",
|
||||
"moveToNext": "$t(action.moveToNext)"
|
||||
},
|
||||
"fullscreenPlayer": {
|
||||
"related": "موارد مربوطه",
|
||||
"visualizer": "تجسم یافته",
|
||||
"config": {
|
||||
"dynamicImageBlur": "اندازه مبهمی نگاره",
|
||||
"dynamicIsImage": "فعالسازی نگاره به عنوان پسزمینه",
|
||||
"lyricOffset": "انحراف متن شعر (میلیثانیه)",
|
||||
"unsynchronized": "همگام نشده",
|
||||
"dynamicBackground": "پسزمینه پویا",
|
||||
"followCurrentLyric": "دنبال کردن متن شعر کنونی",
|
||||
"lyricAlignment": "همترازی متن شعر",
|
||||
"lyricGap": "فاصلهی متن شعر",
|
||||
"showLyricProvider": "نمایش فراهمگر متن شعر",
|
||||
"useImageAspectRatio": "استفاده از نسبت نمای نگاره",
|
||||
"lyricSize": "اندازهی متن شعر",
|
||||
"opacity": "شفافی",
|
||||
"showLyricMatch": "نمایش همخوانی متن شعر",
|
||||
"synchronized": "همگام شده"
|
||||
},
|
||||
"noLyrics": "هیچ متن شعری پیدا نشد",
|
||||
"lyrics": "متن شعر",
|
||||
"upNext": "در ادامه"
|
||||
},
|
||||
"home": {
|
||||
"mostPlayed": "بیشترین پخششدهها",
|
||||
"title": "$t(common.home)",
|
||||
"explore": "در کتابخانهی خود کاوش کنید",
|
||||
"newlyAdded": "عرضههای تازه افزوده شده",
|
||||
"recentlyPlayed": "تازه پخش شدهها"
|
||||
},
|
||||
"playlist": {
|
||||
"reorder": "مرتب کردن دوباره زمانی فقط زمانی فعال شود که مرتبسازی بر اساس شناسه است"
|
||||
},
|
||||
"setting": {
|
||||
"advanced": "پیشرفته",
|
||||
"windowTab": "پنجره",
|
||||
"generalTab": "همگانی",
|
||||
"hotkeysTab": "کلیدهای میانبر",
|
||||
"playbackTab": "پخش"
|
||||
},
|
||||
"sidebar": {
|
||||
"genres": "$t(entity.genre_other)",
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"search": "$t(common.search)",
|
||||
"albumArtists": "$t(entity.albumArtist_other)",
|
||||
"albums": "$t(entity.album_other)",
|
||||
"folders": "$t(entity.folder_other)",
|
||||
"artists": "$t(entity.artist_other)",
|
||||
"home": "$t(common.home)",
|
||||
"nowPlaying": "پخش کنونی",
|
||||
"tracks": "$t(entity.track_other)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"shared": "$t(entity.playlist_other) اشتراکگذاری شده"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "موارد بیشتر از این $t(entity.artist_one)",
|
||||
"moreFromGeneric": "موارد بیشتر از {{item}}",
|
||||
"released": "عرضه شده"
|
||||
},
|
||||
"manageServers": {
|
||||
"title": "مدیریت سرویسدهندهها",
|
||||
"url": "آدرس",
|
||||
"serverDetails": "ریزگان سرویسدهنده",
|
||||
"removeServer": "حذف سرویسدهنده",
|
||||
"username": "نام کاربری",
|
||||
"editServerDetailsTooltip": "ویرایش ریزگان سرویسدهنده"
|
||||
},
|
||||
"genreList": {
|
||||
"showAlbums": "نمایش $t(entity.genre_one) $t(entity.album_other)",
|
||||
"title": "$t(entity.genre_other)",
|
||||
"showTracks": "نمایش $t(entity.genre_one) $t(entity.track_other)"
|
||||
},
|
||||
"globalSearch": {
|
||||
"commands": {
|
||||
"goToPage": "رفتن به صفحهی",
|
||||
"searchFor": "جستوجو برای {{query}}",
|
||||
"serverCommands": "فرمانهای سرویسدهنده"
|
||||
},
|
||||
"title": "فرمانها"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist_other)"
|
||||
},
|
||||
"trackList": {
|
||||
"title": "$t(entity.track_other)",
|
||||
"artistTracks": "قطعههای {{artist}}",
|
||||
"genreTracks": "$t(entity.track_other) \"{{genre}}\""
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
},
|
||||
"itemDetail": {
|
||||
"copyPath": "کپی کردن مسیر در کلیپبورد",
|
||||
"copiedPath": "مسیر با موفقیت کپی شد",
|
||||
"openFile": "نمایش قطعه در مدیر پرونده"
|
||||
}
|
||||
},
|
||||
"table": {
|
||||
"column": {
|
||||
"size": "$t(common.size)",
|
||||
"lastPlayed": "آخرین بار پخش شده",
|
||||
"discNumber": "دیسک",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"title": "عنوان",
|
||||
"trackNumber": "قطعه",
|
||||
"favorite": "مورد علاقه",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"comment": "دیدگاه",
|
||||
"playCount": "تعداد پخش",
|
||||
"rating": "امتیاز",
|
||||
"path": "مسیر",
|
||||
"releaseYear": "سال",
|
||||
"dateAdded": "تاریخ افزوده شدن",
|
||||
"releaseDate": "تاریخ عرضه"
|
||||
},
|
||||
"config": {
|
||||
"general": {
|
||||
"followCurrentSong": "آهنگ کنونی را دنبال کن",
|
||||
"displayType": "نوع نمایش",
|
||||
"itemSize": "اندازهی آیتم (px)",
|
||||
"size": "$t(common.size)",
|
||||
"tableColumns": "ستونهای جدول",
|
||||
"autoFitColumns": "تطبیق دادن ستونها به شیوهی خودکار",
|
||||
"gap": "$t(common.gap)",
|
||||
"itemGap": "فاصلهی آیتم (px)"
|
||||
},
|
||||
"view": {
|
||||
"card": "کارت"
|
||||
},
|
||||
"label": {
|
||||
"playCount": "تعداد پخش",
|
||||
"dateAdded": "تاریخ افزوده شدن",
|
||||
"discNumber": "شمارهی دیسک",
|
||||
"lastPlayed": "آخرین بار پخش شده",
|
||||
"actions": "$t(common.action_other)"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+668
-22
@@ -24,7 +24,7 @@
|
||||
"dismiss": "hylkää",
|
||||
"favorite": "suosikki",
|
||||
"filter_one": "suodatin",
|
||||
"filter_other": "suodatinta",
|
||||
"filter_other": "suodattimet",
|
||||
"filters": "suodattimet",
|
||||
"forceRestartRequired": "käynnistä uudelleen ottaaksesi muutokset käyttöön… sulje ilmoitus käynnistääksesi uudelleen",
|
||||
"gap": "väli",
|
||||
@@ -38,15 +38,15 @@
|
||||
"name": "nimi",
|
||||
"no": "ei",
|
||||
"none": "ei mitään",
|
||||
"noResultsFromQuery": "kysely palautti ei tuloksia",
|
||||
"noResultsFromQuery": "kysely ei tuottanut tuloksia",
|
||||
"note": "huomautus",
|
||||
"ok": "ok",
|
||||
"owner": "omistaja",
|
||||
"path": "reitti",
|
||||
"path": "polku",
|
||||
"preview": "esikatsele",
|
||||
"previousSong": "edellinen $t(entity.track_one)",
|
||||
"resetToDefault": "palauta oletusarvoihin",
|
||||
"restartRequired": "uudelleen käynnistys vaaditaan",
|
||||
"restartRequired": "vaatii uudelleenkäynnistyksen",
|
||||
"right": "oikea",
|
||||
"save": "tallenna",
|
||||
"saveAndReplace": "tallenna ja korvaa",
|
||||
@@ -57,7 +57,7 @@
|
||||
"yes": "kyllä",
|
||||
"close": "sulje",
|
||||
"descending": "laskeva",
|
||||
"biography": "elämänkerta",
|
||||
"biography": "biografia",
|
||||
"cancel": "peruuta",
|
||||
"bpm": "bpm",
|
||||
"decrease": "pienennä",
|
||||
@@ -83,45 +83,58 @@
|
||||
"rating": "arvostelu",
|
||||
"refresh": "virkistä",
|
||||
"reset": "nollaa",
|
||||
"playerMustBePaused": "soitin täytyy olla pysäytetty"
|
||||
"playerMustBePaused": "soittimen täytyy olla pysäytetty",
|
||||
"translation": "käännös",
|
||||
"albumGain": "albumin vahvistus (gain)",
|
||||
"albumPeak": "albumin huippu (peak)",
|
||||
"trackGain": "raidan vahvistus (gain)",
|
||||
"trackPeak": "kappaleen huippu (peak)",
|
||||
"additionalParticipants": "muut osallistujat",
|
||||
"tags": "tägit",
|
||||
"newVersion": "uusi versio on asennettu ({{version}})",
|
||||
"viewReleaseNotes": "katsele julkaisutietoja"
|
||||
},
|
||||
"entity": {
|
||||
"album_one": "albumi",
|
||||
"album_other": "albumia",
|
||||
"albumArtist_one": "albumi artisti",
|
||||
"albumArtist_other": "albumi artistia",
|
||||
"album_other": "albumit",
|
||||
"albumArtist_one": "albumin artisti",
|
||||
"albumArtist_other": "albumin artistit",
|
||||
"artistWithCount_one": "{{count}} artisti",
|
||||
"artistWithCount_other": "{{count}} artistia",
|
||||
"playlist_one": "soittolista",
|
||||
"playlist_other": "soittolistaa",
|
||||
"playlist_other": "soittolistat",
|
||||
"playlistWithCount_one": "{{count}} soittolista",
|
||||
"playlistWithCount_other": "{{count}} soittolistaa",
|
||||
"albumArtistCount_one": "{{count}} albumi artisti",
|
||||
"albumArtistCount_other": "{{count}} albumi artistia",
|
||||
"albumArtistCount_one": "{{count}} albumin artisti",
|
||||
"albumArtistCount_other": "{{count}} albumin artistia",
|
||||
"albumWithCount_one": "{{count}} albumi",
|
||||
"albumWithCount_other": "{{count}} albumia",
|
||||
"artist_one": "artisti",
|
||||
"artist_other": "artistia",
|
||||
"artist_other": "artistit",
|
||||
"favorite_one": "suosikki",
|
||||
"favorite_other": "suosikkia",
|
||||
"favorite_other": "suosikit",
|
||||
"folder_one": "kansio",
|
||||
"folder_other": "kansiota",
|
||||
"folder_other": "kansiot",
|
||||
"folderWithCount_one": "{{count}} kansio",
|
||||
"folderWithCount_other": "{{count}} kansiota",
|
||||
"genre_one": "genre",
|
||||
"genre_other": "genreä",
|
||||
"genre_other": "genret",
|
||||
"genreWithCount_one": "{{count}} genre",
|
||||
"genreWithCount_other": "{{count}} genreä",
|
||||
"smartPlaylist": "älykäs $t(entity.playlist_one)",
|
||||
"track_one": "raita",
|
||||
"track_other": "raitaa",
|
||||
"track_other": "raidat",
|
||||
"trackWithCount_one": "{{count}} raita",
|
||||
"trackWithCount_other": "{{count}} raitaa"
|
||||
"trackWithCount_other": "{{count}} raitaa",
|
||||
"play_one": "{{count}} toisto",
|
||||
"play_other": "{{count}} toistoa",
|
||||
"song_one": "kappale",
|
||||
"song_other": "kappaleet"
|
||||
},
|
||||
"action": {
|
||||
"clearQueue": "tyhjennä jono",
|
||||
"createPlaylist": "luo $t(entity.playlist_one)",
|
||||
"deselectAll": "poista valinta kaikista",
|
||||
"deselectAll": "poista kaikkien valinta",
|
||||
"editPlaylist": "muokkaa $t(entity.playlist_one)",
|
||||
"removeFromQueue": "poista jonosta",
|
||||
"viewPlaylists": "katsele $t(entity.playlist_other)",
|
||||
@@ -132,13 +145,646 @@
|
||||
"goToPage": "mene sivulle",
|
||||
"moveToBottom": "siirry pohjalle",
|
||||
"moveToTop": "siirry ylös",
|
||||
"addToFavorites": "lisää $t(entity.favorite_other)",
|
||||
"addToPlaylist": "lisää $t(entity.playlist_one)",
|
||||
"addToFavorites": "lisää kohteeseen $t(entity.favorite_other)",
|
||||
"addToPlaylist": "lisää kohteeseen $t(entity.playlist_one)",
|
||||
"refresh": "$t(common.refresh)",
|
||||
"removeFromFavorites": "poista kohteesta $t(entity.favorite_other)",
|
||||
"toggleSmartPlaylistEditor": "kytke $t(entity.smartPlaylist) editori",
|
||||
"deletePlaylist": "poista $t(entity.playlist_one)",
|
||||
"removeFromPlaylist": "poista kohteesta $t(entity.playlist_one)",
|
||||
"setRating": "aseta arvostelu"
|
||||
"setRating": "aseta arvostelu",
|
||||
"moveToNext": "siirry seuraavaan"
|
||||
},
|
||||
"error": {
|
||||
"remoteEnableError": "virhe tapahtui yrittäessä $t(common.enable) etäpalvelinta",
|
||||
"remotePortError": "virhe tapahtui etäpalvelimen porttia määrittäessä",
|
||||
"serverNotSelectedError": "palvelinta ei ole valittu",
|
||||
"remoteDisableError": "virhe tapahtui yrittäessä $t(common.disable) etäpalvelinta",
|
||||
"serverRequired": "palvelin vaadittu",
|
||||
"systemFontError": "virhe tapahtui yrittäessä hakea järjestelmän fontteja",
|
||||
"sessionExpiredError": "istuntosi on vanhentunut",
|
||||
"genericError": "tapahtui virhe",
|
||||
"invalidServer": "virheellinen palvelin",
|
||||
"audioDeviceFetchError": "äänentoistolaitteita haettaessa tapahtui virhe",
|
||||
"authenticationFailed": "tunnistautuminen epäonnistui",
|
||||
"badAlbum": "näet tämän sivun koska tämä kappale ei ole osa albumia. Näet tämän todennäköisesti jos kappaleesi on päämusiikkikansiosi juuressa. jellyfin ryhmittää kappaleet vain jos ne ovat kansiossa.",
|
||||
"apiRouteError": "pyynnön reititys epäonnistui",
|
||||
"credentialsRequired": "käyttäjätunnuksia vaaditaan",
|
||||
"loginRateError": "liian monta kirjautumisyritystä, kokeile muutaman sekuntin päästä uudestaan",
|
||||
"mpvRequired": "MPV vaadittu",
|
||||
"networkError": "verkkoyhteysvirhe",
|
||||
"openError": "tiedostoa ei voitu avata",
|
||||
"localFontAccessDenied": "paikallisiin fontteihin pääsy on kielletty",
|
||||
"playbackError": "mediaa toistaessa tapahtui virhe",
|
||||
"remotePortWarning": "käynnistä palvelin uudestaan ottaaksesi uuden portin käyttöön",
|
||||
"endpointNotImplementedError": "päätepiste {{endpoint}} ei ole toteutettu {{serverType}} varten",
|
||||
"badValue": "kelpaamaton optio \"{{value}}\". tätä arvoa ei ole enää olemassa"
|
||||
},
|
||||
"filter": {
|
||||
"album": "$t(entity.album_one)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"biography": "biografia",
|
||||
"bitrate": "bittinopeus",
|
||||
"bpm": "lyöntiä minuutissa (bpm)",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"title": "otsikko",
|
||||
"playCount": "toistomäärä",
|
||||
"dateAdded": "lisätty päivänä",
|
||||
"lastPlayed": "viimeksi toistettu",
|
||||
"mostPlayed": "eniten toistettu",
|
||||
"isRecentlyPlayed": "on äskettäin toistettu",
|
||||
"rating": "arvostelu",
|
||||
"recentlyAdded": "äskettäin lisätty",
|
||||
"recentlyUpdated": "äskettäin päivitetty",
|
||||
"releaseDate": "julkaisupäivä",
|
||||
"toYear": "vuoteen",
|
||||
"releaseYear": "julkaisuvuosi",
|
||||
"search": "haku",
|
||||
"trackNumber": "raita",
|
||||
"isPublic": "on julkinen",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"favorited": "suosikeissa",
|
||||
"fromYear": "vuodelta",
|
||||
"isRated": "on arvosteltu",
|
||||
"recentlyPlayed": "äskettäin toistetut",
|
||||
"albumCount": "$t(entity.album_other) määrä",
|
||||
"disc": "levy",
|
||||
"duration": "kesto",
|
||||
"id": "tunnus",
|
||||
"random": "satunnainen",
|
||||
"isFavorited": "on suosikeissa",
|
||||
"isCompilation": "on osa kokoelmaa",
|
||||
"comment": "kommentti",
|
||||
"communityRating": "yhteisön arvostelu",
|
||||
"criticRating": "kriitikon arvostelu",
|
||||
"name": "nimi",
|
||||
"note": "muistiinpano",
|
||||
"owner": "$t(common.owner)",
|
||||
"path": "polku",
|
||||
"songCount": "kappalemäärä"
|
||||
},
|
||||
"form": {
|
||||
"addServer": {
|
||||
"input_legacyAuthentication": "käytä vanhaa kirjautumistapaa",
|
||||
"ignoreCors": "ohita CORS ($t(common.restartRequired))",
|
||||
"input_name": "palvelimen nimi",
|
||||
"ignoreSsl": "ohita SSL ($t(common.restartRequired))",
|
||||
"input_savePassword": "tallenna salasana",
|
||||
"input_url": "url-osoite",
|
||||
"title": "lisää palvelin",
|
||||
"error_savePassword": "salasanaa tallentaessa tapahtui virhe",
|
||||
"input_password": "salasana",
|
||||
"input_username": "käyttäjänimi",
|
||||
"success": "palvelin lisätty onnistuneesti"
|
||||
},
|
||||
"createPlaylist": {
|
||||
"input_public": "julkinen",
|
||||
"input_name": "$t(common.name)",
|
||||
"input_owner": "$t(common.owner)",
|
||||
"success": "$t(entity.playlist_one) luotu onnistuneesti",
|
||||
"title": "luo $t(entity.playlist_one)",
|
||||
"input_description": "$t(common.description)"
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"input_skipDuplicates": "ohita kaksoiskappaleet",
|
||||
"success": "$t(entity.trackWithCount, {\"count\": {{message}} }) lisätty $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })",
|
||||
"title": "lisää soittolistalle $t(entity.playlist_one)",
|
||||
"input_playlists": "$t(entity.playlist_other)"
|
||||
},
|
||||
"updateServer": {
|
||||
"success": "palvelin on päivitetty onnistuneesti",
|
||||
"title": "päivitä palvelin"
|
||||
},
|
||||
"deletePlaylist": {
|
||||
"success": "$t(entity.playlist_one) poistettu onnistuneesti",
|
||||
"title": "poista $t(entity.playlist_one)",
|
||||
"input_confirm": "kirjoita soittolistan $t(entity.playlist_one) nimi vahvistaaksesi"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"success": "$t(entity.playlist_one) päivitetty onnistuneesti",
|
||||
"title": "muokkaa $t(entity.playlist_one)",
|
||||
"publicJellyfinNote": "Jellyfin ei jostain syystä kerro onko soittolista julkinen vai ei. Jos haluat sen pysyvän julkisena, pidä seuraava valinta valittuna"
|
||||
},
|
||||
"lyricSearch": {
|
||||
"input_artist": "$t(entity.artist_one)",
|
||||
"input_name": "$t(common.name)",
|
||||
"title": "sanojen haku"
|
||||
},
|
||||
"shareItem": {
|
||||
"createFailed": "jaon luonti epäonnistui (onko jako päällä?)",
|
||||
"allowDownloading": "salli lataus",
|
||||
"description": "kuvaus",
|
||||
"setExpiration": "aseta vanheneminen",
|
||||
"success": "jakolinkki kopioitu leikepöydälle (tai klikkaa tästä avataksesi)",
|
||||
"expireInvalid": "vanhetumisen pitää olla tulevaisuudessa"
|
||||
},
|
||||
"queryEditor": {
|
||||
"input_optionMatchAny": "sovita joku",
|
||||
"input_optionMatchAll": "sovita kaikki",
|
||||
"title": "kyselyeditori"
|
||||
}
|
||||
},
|
||||
"setting": {
|
||||
"clearCacheSuccess": "välimuisti on tyhjennetty onnistuneesti",
|
||||
"artistConfiguration_description": "valise näytettävät asiat ja niiden järjestys albumin artistin sivulla",
|
||||
"audioDevice": "äänilaite",
|
||||
"clearQueryCache_description": "feishinin 'pehmeä tyhjennys'. tämä tyhjentää soittolistat, raitojen metadatat ja tallennetut sanoitukset. asetukset, palvelimien käyttäjätunnukset ja välimuistissa olevat kuvat säilyvät",
|
||||
"crossfadeDuration": "ristihäivytyksen kesto",
|
||||
"audioPlayer_description": "valitse toistossa käytettävä soitin",
|
||||
"buttonSize": "soittimen palkin nappien koko",
|
||||
"buttonSize_description": "soittimen palkin nappien koko",
|
||||
"clearCache": "tyhjennä selaimen välimuisti",
|
||||
"clearQueryCache": "tyhjennä feishinin välimuisti",
|
||||
"crossfadeDuration_description": "aseta ristihäivytystehosteen kesto",
|
||||
"applicationHotkeys_description": "aseta sovelluksen pikanäppäimet. vaihda valintaruutua asettaaksesi valinta globaaliksi pikanäppäimeksi (vain työpöydällä)",
|
||||
"crossfadeStyle": "ristihäivytyksen tyyli",
|
||||
"crossfadeStyle_description": "valitse soittimessa käytettävän ristihäivytyksen tyyli",
|
||||
"contextMenu_description": "mahdollistaa sinun piilottaa asiat, jotka näytetään valikossa klikatessasi objektia hiiren väärällä painikkella. poistetut valinnat piilotetaan",
|
||||
"customCssEnable_description": "mahdollista oman css:n kirjoittaminen.",
|
||||
"accentColor": "korostusväri",
|
||||
"customCssEnable": "käytä omaa css:ää",
|
||||
"albumBackgroundBlur_description": "säätää albumin taustakuvan sumennuksen määrää",
|
||||
"audioExclusiveMode_description": "käytä yksinomaista ulostulotilaa. Tässä tilassa järjestelmä on yleensä lukittuna ja vain mpv voi tuottaa ääntä",
|
||||
"albumBackgroundBlur": "albumin taustakuvan sumennuksen koko",
|
||||
"clearCache_description": "feishinin 'kova tyhjennys'. feishinin välimuistin lisäksi tyhjennä selaimen välimuisti (tallennetut kuvat ja muut kohteet). palvelimien käyttäjättunnukset ja asetukset säilyvät",
|
||||
"audioExclusiveMode": "äänen yksinomainen tila",
|
||||
"audioPlayer": "soitin",
|
||||
"contextMenu": "kontekstivalikon (hiiren väärä näppäin) asetukset",
|
||||
"accentColor_description": "aseta sovelluksen korostusväri",
|
||||
"albumBackground_description": "lisää taustakuva albumin sivuille, jotka sisältävät albumin kuvitusta",
|
||||
"artistConfiguration": "albumin artistin sivun hallinta",
|
||||
"audioDevice_description": "valitse toistossa käytettävä äänilaite (vain verkkosoittimessa)",
|
||||
"applicationHotkeys": "sovelluksen pikanäppäimet",
|
||||
"albumBackground": "albumin taustakuva",
|
||||
"customCss": "oma css",
|
||||
"customFontPath_description": "asettaa polun mukautetulle fontille jota sovellus käyttää",
|
||||
"homeConfiguration": "koti sivun muokkaus",
|
||||
"homeConfiguration_description": "määritä mitä osioita näkyy, ja missä järjestyksessä, koti sivulla",
|
||||
"gaplessAudio_optionWeak": "heikko (suositus)",
|
||||
"genreBehavior_description": "määrittää avautuuko generä painettaessa oletuksena ääniraita vaiko albumi listassa",
|
||||
"hotkey_browserBack": "selain takaisin",
|
||||
"hotkey_playbackPlay": "toista",
|
||||
"hotkey_playbackPlayPause": "toista / tauko",
|
||||
"hotkey_playbackPrevious": "edellinen ääniraita",
|
||||
"hotkey_rate3": "arvostelu 3 tähteä",
|
||||
"hotkey_playbackStop": "lopeta",
|
||||
"hotkey_rate4": "arvostelu 4 tähteä",
|
||||
"hotkey_rate1": "arvostelu 1 tähti",
|
||||
"hotkey_rate2": "arvostelu 2 tähteä",
|
||||
"hotkey_unfavoriteCurrentSong": "poista suosikeista $t(common.currentSong)",
|
||||
"fontType_description": "sisäänrakennettu fontti valitsee yhden Feishinin tuomista fonteista. järjestelmän fontti antaa sinun valita minkä tahansa käyttöjärjestelmään asennetun fontin. mukautettu antaa sinun tuoda oman fontin",
|
||||
"fontType_optionBuiltIn": "sisäänrakennettu fontti",
|
||||
"fontType_optionSystem": "järjestelmän fontti",
|
||||
"fontType_optionCustom": "mukautettu fontti",
|
||||
"hotkey_favoriteCurrentSong": "lisää suosikiksi $t(common.currentSong)",
|
||||
"hotkey_favoritePreviousSong": "lisää suosikiksi $t(common.previousSong)",
|
||||
"hotkey_rate5": "arvostelu 5 tähteä",
|
||||
"hotkey_skipBackward": "ohita taaksepäin",
|
||||
"hotkey_skipForward": "ohita eteenpäin",
|
||||
"font": "kirjaisin",
|
||||
"font_description": "asettaa fontin jota sovellus käyttää",
|
||||
"discordApplicationId": "{{discord}} sovelluksen tunnus",
|
||||
"hotkey_globalSearch": "globaali haku",
|
||||
"hotkey_playbackNext": "seuraava ääniraita",
|
||||
"hotkey_browserForward": "selain eteenpäin",
|
||||
"hotkey_playbackPause": "tauko",
|
||||
"hotkey_localSearch": "hae sivulta",
|
||||
"customFontPath": "mukautetun fontin polku",
|
||||
"fontType": "fonttityyppi",
|
||||
"hotkey_unfavoritePreviousSong": "poista suosikeista $t(common.previousSong)",
|
||||
"customCss_description": "mukautettu CSS-sisältö. Huomautus: content- ja etä-URL-osoitteet ovat estettyjä ominaisuuksia. Esikatselu sisällöstäsi on alla. Lisäkenttiä, joita et ole määrittänyt, on näkyvissä puhdistuksen vuoksi.",
|
||||
"customCssNotice": "Varoitus: vaikka jonkinlainen puhdistus onkin tehty (url()- ja content:-komentojen estäminen), mukautetun CSS:n käyttäminen voi silti aiheuttaa riskejä muuttamalla käyttöliittymää.",
|
||||
"disableLibraryUpdateOnStartup": "poista uusimman version tarkistus käynnistyksen yhteydessä käytöstä",
|
||||
"disableAutomaticUpdates": "poista automaattiset päivitykset käytöstä",
|
||||
"discordIdleStatus": "näytä rich presencen käyttämätön tila",
|
||||
"discordIdleStatus_description": "kun käytössä, päivitä tila kun soitin on käyttämättömänä",
|
||||
"doubleClickBehavior": "lisää kaikki haetut kappaleet soittojonoon tuplaklikkauksella",
|
||||
"discordUpdateInterval_description": "päivitysväli sekunnteina (vähintään 15 sekunttia)",
|
||||
"discordRichPresence": "{{discord}} rich presence",
|
||||
"discordRichPresence_description": "ota toiston tila käyttöön {{discord}}n rich presence-toiminnossa. Kuvakkeiden avaimet ovat {{icon}}, {{playing}} ja {{paused}}",
|
||||
"discordUpdateInterval": "{{discord}} rich presencen päivitysväli",
|
||||
"enableRemote": "aktivoi etäohjauspalvelin",
|
||||
"externalLinks_description": "ottaa ulkoiset linkit (Last.fm, MusicBrainz) artistien/albumien sivuilla",
|
||||
"exitToTray": "sulje tehtäväpalkkiin",
|
||||
"doubleClickBehavior_description": "jos päällä, kaikki hakutuloksissa olevat kappaleet lisätään soittojonoon. muuten vain napsautettu kappale lisätään jonoon",
|
||||
"discordApplicationId_description": "{{discord}}n ohjelma-ID rich presenceä varten (oletuksena {{defaultId}})",
|
||||
"enableRemote_description": "aktivoi etäohjauspalvelimen, jolla muut laitteet voivat ohjata sovellusta",
|
||||
"externalLinks": "näytä ulkoiset linkit",
|
||||
"exitToTray_description": "sovellus suljetaan tehtäväpalkkiin",
|
||||
"discordListening_description": "näytä status kuuntelee pelaa sijaan",
|
||||
"discordListening": "näytä status kuuntelee",
|
||||
"playButtonBehavior_optionPlayShuffled": "$t(player.shuffle)",
|
||||
"playButtonBehavior_optionAddNext": "$t(player.addNext)",
|
||||
"lastfmApiKey_description": "API-avain {{lastfm}}:lle. tarvitaan kansikuvia varten",
|
||||
"passwordStore_description": "mitä salasanojen/avaimien tallennusta käytetään. muuta tätä, jos sinulla on ongelmia salasanojen tallennuksessa.",
|
||||
"floatingQueueArea_description": "näyttää ikonin ikkunan oikealla reunalla jonon katselua varten",
|
||||
"homeFeature_description": "ohjaa näytetäänkö suuri esittelykaruselli kotisivulla",
|
||||
"hotkey_rate0": "arvostelun tyhjennys",
|
||||
"hotkey_togglePreviousSongFavorite": "vaihda $t(common.previousSong) suosikkiasetus",
|
||||
"imageAspectRatio_description": "jos käytössä, kansikuvat näytetään niiden alkuperäisellä kuvasuhteella. jos kuvasuhde ei ole 1:1, jäljelle jäävä tila jää tyhjäksi",
|
||||
"language_description": "asettaa sovelluksen kielen $t(common.restartRequired)",
|
||||
"lyricFetch": "hae sanoitukset internetistä",
|
||||
"lyricFetchProvider_description": "valitse lähteet sanoituksien hakua varten. lähteiden järjestys on se järjestys, jossa ne tiedustellaan",
|
||||
"minimumScrobblePercentage": "pienin skrobblauksen kesto (prosenttia)",
|
||||
"mpvExecutablePath": "mpv:n suoritettavan tiedoston polku",
|
||||
"mpvExecutablePath_description": "asettaa mpv:n suoritettavan tiedoston polun. ollessa tyhjä, käytetään oletuspolkua",
|
||||
"mpvExtraParameters_help": "yksi per rivi",
|
||||
"playButtonBehavior_optionPlay": "$t(player.play)",
|
||||
"genreBehavior": "genre-sivun oletustoiminta",
|
||||
"globalMediaHotkeys": "globaalit median pikanäppäimet",
|
||||
"globalMediaHotkeys_description": "ota käyttöön tai poista käytöstä järjestelmän median pikanäppäinten käyttö toiston hallintaa",
|
||||
"hotkey_toggleCurrentSongFavorite": "vaihda $t(common.currentSong) suosikkiasetus",
|
||||
"imageAspectRatio": "käytä alkuperäistä kansikuvan kuvasuhdetta",
|
||||
"language": "kieli",
|
||||
"lyricOffset_description": "siirrä sanoituksia valitun ajan millisekuntteina",
|
||||
"minimizeToTray": "pienennä ilmaisinalueelle",
|
||||
"gaplessAudio_description": "asettaa tauottoman toiston asetukset mpv:hen",
|
||||
"hotkey_volumeDown": "äänenvoimakkuuden vähentäminen",
|
||||
"hotkey_zoomIn": "lähennä",
|
||||
"lyricFetch_description": "hae sanoitukset eri lähteistä internetissä",
|
||||
"lyricFetchProvider": "lähteet sanoituksia varten",
|
||||
"lyricOffset": "sanotuksien siirto (ms)",
|
||||
"mpvExtraParameters": "mpv:n parametrit",
|
||||
"followLyric": "seuraa lyriikoita",
|
||||
"followLyric_description": "vieritä lyriikat tämänhetkiseen paikkaan",
|
||||
"hotkey_toggleQueue": "vaihda jono",
|
||||
"minimumScrobblePercentage_description": "vähimmäisprosentti kappaleesta, joka on soitettava ennen kuin se skrobblataan",
|
||||
"minimumScrobbleSeconds": "pienin skrobblaus (sekunttia)",
|
||||
"minimumScrobbleSeconds_description": "vähimmäisaika kappaleesta, joka on soitettava ennen kuin se skrobblataan",
|
||||
"passwordStore": "salasanojen/avaimien tallennus",
|
||||
"hotkey_volumeUp": "äänenvoimakkuuden lisääminen",
|
||||
"hotkey_toggleShuffle": "vaihda sekoitus",
|
||||
"hotkey_volumeMute": "mykistäminen",
|
||||
"lastfmApiKey": "{{lastfm}} API-avain",
|
||||
"minimizeToTray_description": "pienennä sovellus ilmaisinalueelle",
|
||||
"playButtonBehavior_optionAddLast": "$t(player.addLast)",
|
||||
"hotkey_zoomOut": "loitonna",
|
||||
"floatingQueueArea": "näytä kelluvan jonon avausalue",
|
||||
"homeFeature": "kodin esittelykaruselli",
|
||||
"hotkey_toggleFullScreenPlayer": "vaihda kokonäytön toistin",
|
||||
"hotkey_toggleRepeat": "vaihda kertaus",
|
||||
"gaplessAudio": "tauoton toisto",
|
||||
"transcodeFormat_description": "valitsee transkoodattavan formaatin. jätä tyhjäksi palvelimen valintaa varten",
|
||||
"replayGainMode_optionNone": "$t(common.none)",
|
||||
"replayGainMode_optionTrack": "$t(entity.track_one)",
|
||||
"themeDark": "teema (tumma)",
|
||||
"transcodeNote": "tulee voimaan 1 (web) - 2 (mpv) kappaleen jälkeen",
|
||||
"translationApiKey_description": "API-avain käännöstä varten (tukee vain globaalia palvelun palvelupistettä)",
|
||||
"playbackStyle_description": "valitse toiston tyyli, jota käytetään soittimessa",
|
||||
"transcode_description": "ottaa transkoodaksen käyttöön eri formaateille",
|
||||
"transcodeBitrate": "transkoodattava bittinopeus",
|
||||
"translationApiProvider": "käännös-API:n palveluntarjoaja",
|
||||
"trayEnabled_description": "näytä/piilota järjestelmäpalkin kuvake/valikko. jos poistettu käytöstä, myös pienennä/sulje järjestelmäpalkkiin -toiminto poistetaan käytöstä",
|
||||
"windowBarStyle_description": "valitse ikkunapalkin tyyli",
|
||||
"webAudio": "käytä web-ääntä",
|
||||
"windowBarStyle": "ikkunapalkin tyyli",
|
||||
"zoom": "zoomausprosentti",
|
||||
"playbackStyle": "toiston tyyli",
|
||||
"remotePassword": "kauko-ohjauspalvelimen salasana",
|
||||
"remoteUsername_description": "asettaa käyttäjänimen kauko-ohjauspalvelimelle. jos sekä käyttäjätunnus, että salasana ovat tyhjänä, todennus poistetaan käytöstä",
|
||||
"skipPlaylistPage": "ohita soittolistojen sivu",
|
||||
"themeDark_description": "asettaa tumman teeman käytettäväksi sovelluksessa",
|
||||
"playbackStyle_optionCrossFade": "ristivaihto",
|
||||
"playbackStyle_optionNormal": "normaali",
|
||||
"playButtonBehavior": "toistopainikkeen toiminta",
|
||||
"playButtonBehavior_description": "asettaa toistopainikkeen oletustoiminnan lisättäessä kappaleita jonoon",
|
||||
"remotePort": "kauko-ohjauspalvelimen portti",
|
||||
"replayGainMode": "{{ReplayGain}} tila",
|
||||
"sampleRate_description": "valitse käytettävä näytteenottotaajuus, jos valittu näytetaajuus poikkeaa nykyisen median taajuudesta. arvo, joka on alle 8 000, käyttää oletustaajuutta",
|
||||
"skipDuration": "ohituksen kesto",
|
||||
"sidePlayQueueStyle_description": "asettaa tyylin sivupalkin toistojonolle",
|
||||
"sidePlayQueueStyle_optionAttached": "liitetty",
|
||||
"sidePlayQueueStyle_optionDetached": "irrotettu",
|
||||
"startMinimized_description": "käynnistä sovellus järjestelmäpalkissa",
|
||||
"theme": "teema",
|
||||
"useSystemTheme_description": "seuraa järjestelmän määrittämää asetusta vaalealle tai tummalle asetukselle",
|
||||
"remoteUsername": "kauko-ohjauspalvelimen käyttäjänimi",
|
||||
"remotePort_description": "asettaa kauko-ohjauspalvelimen portin",
|
||||
"remotePassword_description": "asettaa kauko-ohjauspalvelimen salasanan. Nämä tunnukset siirretään oletuksena turvattomasti, joten sinun kuuluisi käyttää uniikkia salasanaa, josta et välitä",
|
||||
"replayGainClipping": "{{ReplayGain}} leikkaus",
|
||||
"replayGainClipping_description": "Estää {{ReplayGain}}n aiheuttaman leikkauksen laskemalla vahvistusta automaatisesti",
|
||||
"replayGainFallback": "{{ReplayGain}} palautus",
|
||||
"playerAlbumArtResolution_description": "suurien kansikuvien resoluutio soittimen esikatselussa. suurempi tekee niistä terävempiä, mutta voi hidastaa latausta. oletuksena on 0, joka tarkoittaa automaattista",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album_one)",
|
||||
"replayGainPreamp": "{{ReplayGain}} esivahvistus (dB)",
|
||||
"scrobble_description": "skrobblaa toistot mediapalvelimellesi",
|
||||
"replayGainPreamp_description": "säätää esivahvistuksen määrää {{ReplayGain}} arvoon",
|
||||
"showSkipButtons": "näytä ohituspainikkeet",
|
||||
"showSkipButtons_description": "näytä tai piilota soitinpalkin ohituspainikkeet",
|
||||
"showSkipButton": "näytä ohituspainikkeet",
|
||||
"showSkipButton_description": "näytä tai piilota soitinpalkin ohituspainikkeet",
|
||||
"sidebarPlaylistList": "sivupakin soittolistojen lista",
|
||||
"skipDuration_description": "asettaa ohitettavan ajan käytettäessä soitinpalkin ohituspainikkeita",
|
||||
"volumeWidth": "äänenvoimakkuuden säätimen leveys",
|
||||
"sidebarCollapsedNavigation_description": "näytä tai piilota navigointi romautetussa sivupalkissa",
|
||||
"sidebarConfiguration": "sivupalkin asetukset",
|
||||
"sidebarConfiguration_description": "valitse kohteet ja niiden järjestys sivupalkissa",
|
||||
"volumeWidth_description": "äänenvoimakkuuden säätimen leveys",
|
||||
"playerAlbumArtResolution": "soittimen kansikuvien resoluutio",
|
||||
"playerbarOpenDrawer": "toistipalkin kokoruudun kytkin",
|
||||
"playerbarOpenDrawer_description": "sallii toistopalkin klikkaamisen avaamaan kokonäytön soittimen",
|
||||
"replayGainFallback_description": "asetettava vahvistus desibelinä (dB), jos tiedostolla ei ole {{ReplayGain}} tageja",
|
||||
"replayGainMode_description": "säätää äänenvoimmakkuutta {{ReplayGain}} arvojen mukaisesti tiedoston metadatasta",
|
||||
"sampleRate": "näytteenottotaajuus",
|
||||
"savePlayQueue": "tallenna toistojono",
|
||||
"savePlayQueue_description": "tallenna toistojono, kun sovellus suljetaan ja avaa se uudestaan, kun sovellus avataan",
|
||||
"scrobble": "skrobblaus",
|
||||
"sidebarCollapsedNavigation": "sivupalkin (romautettu) navigointi",
|
||||
"sidebarPlaylistList_description": "näytä tai piilota soittolistojen lista sivupalkissa",
|
||||
"sidePlayQueueStyle": "sivupalkin jonon tyyli",
|
||||
"skipPlaylistPage_description": "navigoidessa soittolistaan, mene soittolistan kappaleiden listaan oletussivun sijaan",
|
||||
"theme_description": "asettaa ohjelmassa käytettävän teeman",
|
||||
"themeLight": "teema (vaalea)",
|
||||
"themeLight_description": "asettaa vaalean teeman käytettäväksi sovelluksessa",
|
||||
"transcode": "ota transkoodaus käyttöön",
|
||||
"transcodeBitrate_description": "valitsee transkoodattavan bittinopeuden. 0 tarkoittaa palvelimen valintaa",
|
||||
"transcodeFormat": "transkoodattava formaatti",
|
||||
"translationApiProvider_description": "palveluntarjoajan API käännöstä varten",
|
||||
"translationApiKey": "käännöksen API-avain",
|
||||
"translationTargetLanguage": "käännöksen kohdekieli",
|
||||
"translationTargetLanguage_description": "kohdekieli käännöstä varten",
|
||||
"trayEnabled": "näytä järjestelmäpalkki",
|
||||
"volumeWheelStep_description": "äänenvoimakkuuden muutoksen suuruus rullattaessa hiiren rullalla äänenvoimakkuuden säätimen päällä",
|
||||
"zoom_description": "asettaa sovelluksen zoomausprosentin",
|
||||
"webAudio_description": "käytä web-ääntä. tämä mahdollistaa edistyneet ominaisuudet, kuten replaygainin. poista käytöstä, jos koet ongelmia",
|
||||
"startMinimized": "käynnistä pienennettynä",
|
||||
"useSystemTheme": "käytä järjestelmän teemaa",
|
||||
"volumeWheelStep": "äänenvoimakkuusrullan askel",
|
||||
"discordServeImage": "jaa {{discord}} kuvat palvelimelta",
|
||||
"discordServeImage_description": "jaa kansikuvat {{discord}}n rich presenceä varten suoraan palvelimelta. saatavilla vain jellyfinille ja navidromelle",
|
||||
"musicbrainz_description": "näytä linkit musicbrainz sivulle artistin/albumin sivuilla, jos musicbrainz-id löytyy",
|
||||
"lastfm": "näytä last.fm linkit",
|
||||
"lastfm_description": "näytä linkit last.fm sivulle artistin/albumin sivuilla",
|
||||
"musicbrainz": "näytä musicbrainz linkit",
|
||||
"neteaseTranslation": "Ota NetEasen käännökset käyttöön",
|
||||
"neteaseTranslation_description": "Käytöss ollessa noutaa ja näyttää käännetyt sanat NetEasesta, jos ne ovat saatavilla.",
|
||||
"preferLocalLyrics_description": "suosi paikallisia sanoituksia ulkoisten sijasta, kun saatavilla",
|
||||
"preferLocalLyrics": "suosi paikallisia sanoituksia",
|
||||
"discordPausedStatus": "näytä rich presence tauotettuna",
|
||||
"discordPausedStatus_description": "ollessak käytössä, status näyttää milloin soitin on tautotettuna",
|
||||
"preservePitch": "säilytä sävelkorkeus",
|
||||
"preservePitch_description": "säilytä sävelkorkeus toistonopeutta muokatessa"
|
||||
},
|
||||
"page": {
|
||||
"itemDetail": {
|
||||
"copiedPath": "polku on kopioitu onnistuneesti",
|
||||
"copyPath": "kopioi reitti leikepöytälle",
|
||||
"openFile": "näytä kappale tiedostonhallinnassa"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "siirrä kohteesta $t(entity.artist_one)",
|
||||
"moreFromGeneric": "listää kohteesta {{item}}",
|
||||
"released": "julkaistu"
|
||||
},
|
||||
"albumList": {
|
||||
"artistAlbums": "artistin {{artist}} albumit",
|
||||
"genreAlbums": "\"{{genre}}\"$t(entity.album_other)",
|
||||
"title": "$t(entity.album_other)"
|
||||
},
|
||||
"appMenu": {
|
||||
"goBack": "mene takaisin",
|
||||
"openBrowserDevtools": "avaa selaimen kehitystyökalut",
|
||||
"quit": "$t(common.quit)",
|
||||
"selectServer": "valitse palvelin",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"expandSidebar": "laajenna sivupalkki",
|
||||
"goForward": "mene eteenpäin",
|
||||
"manageServers": "hallitse palvelimia",
|
||||
"collapseSidebar": "kutista sivupalkki",
|
||||
"version": "versio {{version}}"
|
||||
},
|
||||
"contextMenu": {
|
||||
"playSimilarSongs": "$t(player.playSimilarSongs)",
|
||||
"addNext": "$t(player.addNext)",
|
||||
"addToFavorites": "$t(action.addToFavorites)",
|
||||
"addToPlaylist": "$t(action.addToPlaylist)",
|
||||
"createPlaylist": "$t(action.createPlaylist)",
|
||||
"deletePlaylist": "$t(action.deletePlaylist)",
|
||||
"deselectAll": "$t(action.deselectAll)",
|
||||
"removeFromPlaylist": "$t(action.removeFromPlaylist)",
|
||||
"setRating": "$t(action.setRating)",
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"numberSelected": "{{count}} valittuna",
|
||||
"play": "$t(player.play)",
|
||||
"download": "lataa",
|
||||
"moveToBottom": "$t(action.moveToBottom)",
|
||||
"moveToTop": "$t(action.moveToTop)",
|
||||
"removeFromFavorites": "$t(action.removeFromFavorites)",
|
||||
"shareItem": "jaa kohde",
|
||||
"showDetails": "lisätietoa",
|
||||
"addFavorite": "$t(action.addToFavorites)",
|
||||
"addLast": "$t(player.addLast)",
|
||||
"moveToNext": "$t(action.moveToNext)",
|
||||
"removeFromQueue": "$t(action.removeFromQueue)"
|
||||
},
|
||||
"sidebar": {
|
||||
"albumArtists": "$t(entity.albumArtist_other)",
|
||||
"albums": "$t(entity.album_other)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"shared": "$t(entity.playlist_other) jaettu",
|
||||
"tracks": "$t(entity.track_other)",
|
||||
"artists": "$t(entity.artist_other)",
|
||||
"folders": "$t(entity.folder_other)",
|
||||
"genres": "$t(entity.genre_other)",
|
||||
"home": "$t(common.home)",
|
||||
"nowPlaying": "nyt soi",
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"search": "$t(common.search)",
|
||||
"myLibrary": "oma kirjasto"
|
||||
},
|
||||
"setting": {
|
||||
"generalTab": "yleinen",
|
||||
"windowTab": "ikkuna",
|
||||
"hotkeysTab": "pikanäppäimet",
|
||||
"playbackTab": "toisto",
|
||||
"advanced": "edistyneet"
|
||||
},
|
||||
"fullscreenPlayer": {
|
||||
"upNext": "seuraavaksi",
|
||||
"visualizer": "visualisaattori",
|
||||
"noLyrics": "sanoja ei löytynyt",
|
||||
"config": {
|
||||
"showLyricMatch": "näytä sanojen yhteneväisyys",
|
||||
"showLyricProvider": "näytä sanojen tarjoaja",
|
||||
"lyricGap": "sanojen rako",
|
||||
"synchronized": "synkronoitu",
|
||||
"lyricSize": "sanojen koko",
|
||||
"opacity": "läpinäkyvyys",
|
||||
"unsynchronized": "synkronoimaton",
|
||||
"useImageAspectRatio": "käytä kuvan kuvasuhdetta",
|
||||
"dynamicBackground": "liikkuva tausta",
|
||||
"dynamicImageBlur": "kuvan sumennuksen koko",
|
||||
"dynamicIsImage": "käytä taustakuvaa",
|
||||
"lyricOffset": "sanojen kompensointi (ms)",
|
||||
"followCurrentLyric": "seuraa nykyisiä sanoja",
|
||||
"lyricAlignment": "sanojen kohdistus"
|
||||
},
|
||||
"lyrics": "sanat",
|
||||
"related": "liittyvät"
|
||||
},
|
||||
"genreList": {
|
||||
"showAlbums": "näytä $t(entity.genre_one) $t(entity.album_other)",
|
||||
"showTracks": "näytä $t(entity.genre_one) $t(entity.track_other)",
|
||||
"title": "$t(entity.genre_other)"
|
||||
},
|
||||
"globalSearch": {
|
||||
"commands": {
|
||||
"searchFor": "hae {{query}}",
|
||||
"serverCommands": "palvelimen komennot",
|
||||
"goToPage": "mene sivulle"
|
||||
},
|
||||
"title": "komennot"
|
||||
},
|
||||
"home": {
|
||||
"explore": "tutki kirjastotasi",
|
||||
"recentlyPlayed": "hiljattain soitetut",
|
||||
"title": "$t(common.home)",
|
||||
"mostPlayed": "eniten soitetut",
|
||||
"newlyAdded": "hiljattain lisätyt julkaisut"
|
||||
},
|
||||
"albumArtistDetail": {
|
||||
"about": "{{artist}}{sta/stä",
|
||||
"viewDiscography": "katsele diskografiaa",
|
||||
"relatedArtists": "liittyvät $t(entity.artist_other)",
|
||||
"appearsOn": "esiintyy",
|
||||
"topSongs": "parhaat kappaleet",
|
||||
"topSongsFrom": "parhaat kappaleet albumilta {{title}}",
|
||||
"recentReleases": "hiljattaiset julkaisut",
|
||||
"viewAll": "katsele kaikkia",
|
||||
"viewAllTracks": "katsele kaikkia $t(entity.track_other)"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist_other)"
|
||||
},
|
||||
"manageServers": {
|
||||
"title": "hallitse palvelimia",
|
||||
"serverDetails": "palvelimen lisätiedot",
|
||||
"url": "URL",
|
||||
"username": "käyttäjänimi",
|
||||
"editServerDetailsTooltip": "muokkaa palvelimen lisätietoja",
|
||||
"removeServer": "etäpalvelin"
|
||||
},
|
||||
"playlist": {
|
||||
"reorder": "uudelleenjärjestely mahdollista vain, kun järjestellään id:n mukaan"
|
||||
},
|
||||
"trackList": {
|
||||
"artistTracks": "artistin {{artist}} kappaleet",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track_other)",
|
||||
"title": "$t(entity.track_other)"
|
||||
}
|
||||
},
|
||||
"player": {
|
||||
"addLast": "lisää viimeinen",
|
||||
"addNext": "lisää seuraava",
|
||||
"favorite": "suosikki",
|
||||
"queue_moveToTop": "siirrä valittu alas",
|
||||
"queue_remove": "poista valittu",
|
||||
"repeat": "kertaus",
|
||||
"previous": "edellinen",
|
||||
"queue_clear": "tyhjennä jono",
|
||||
"skip": "ohita",
|
||||
"skip_forward": "ohita eteenpäin",
|
||||
"stop": "pysäytä",
|
||||
"skip_back": "ohita taaksepäin",
|
||||
"unfavorite": "poista suosikeista",
|
||||
"playbackFetchNoResults": "kappaleita ei löytynyt",
|
||||
"queue_moveToBottom": "siittä valittu ylös",
|
||||
"pause": "tauota",
|
||||
"playbackSpeed": "toistonopeus",
|
||||
"repeat_all": "kertaa kaikki",
|
||||
"playbackFetchCancel": "tämä vie aikaa... sulje ilmoitus peruaksesi",
|
||||
"mute": "mykistä",
|
||||
"shuffle": "soita sekoitettuna",
|
||||
"next": "seuraava",
|
||||
"play": "toista",
|
||||
"playbackFetchInProgress": "ladataan kappaleita…",
|
||||
"viewQueue": "katsele jonoa",
|
||||
"muted": "mykistetty",
|
||||
"playRandom": "toista satunnainen",
|
||||
"playSimilarSongs": "toista samanlaisia kappaleita",
|
||||
"repeat_off": "kertaus pois päältä",
|
||||
"shuffle_off": "sekoitus pois päältä",
|
||||
"toggleFullscreenPlayer": "vaihda kokoruudun soittimeen"
|
||||
},
|
||||
"table": {
|
||||
"config": {
|
||||
"general": {
|
||||
"gap": "$t(common.gap)",
|
||||
"size": "$t(common.size)",
|
||||
"autoFitColumns": "sovita sarakkeet",
|
||||
"followCurrentSong": "seuraa nykyistä kappaletta",
|
||||
"displayType": "näytön tyyppi",
|
||||
"itemGap": "kohteiden väli (px)",
|
||||
"itemSize": "kohteiden koko (px)",
|
||||
"tableColumns": "taulukon sarakkeet"
|
||||
},
|
||||
"label": {
|
||||
"channels": "$t(common.channel_other)",
|
||||
"trackNumber": "raidan numero",
|
||||
"album": "$t(entity.album_one)",
|
||||
"actions": "$t(common.action_other)",
|
||||
"codec": "$t(common.codec)",
|
||||
"dateAdded": "lisäyspäivämäärä",
|
||||
"owner": "$t(common.owner)",
|
||||
"path": "$t(common.path)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"discNumber": "levyn numero",
|
||||
"duration": "$t(common.duration)",
|
||||
"favorite": "$t(common.favorite)",
|
||||
"lastPlayed": "viimeksi soitettu",
|
||||
"note": "$t(common.note)",
|
||||
"titleCombined": "$t(common.title) (yhdistetty)",
|
||||
"rowIndex": "rivin indeksi",
|
||||
"biography": "$t(common.biography)",
|
||||
"bitrate": "$t(common.bitrate)",
|
||||
"bpm": "$t(common.bpm)",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"playCount": "toistojen lukumäärä",
|
||||
"rating": "$t(common.rating)",
|
||||
"releaseDate": "julkaisupäivämäärä",
|
||||
"size": "$t(common.size)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"title": "$t(common.title)",
|
||||
"year": "$t(common.year)"
|
||||
},
|
||||
"view": {
|
||||
"table": "taulukko",
|
||||
"card": "kortti",
|
||||
"poster": "juliste",
|
||||
"grid": "ruudukko",
|
||||
"list": "lista"
|
||||
}
|
||||
},
|
||||
"column": {
|
||||
"releaseYear": "vuosi",
|
||||
"bpm": "bpm",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"biography": "biografia",
|
||||
"dateAdded": "lisäyspäivämäärä",
|
||||
"album": "albumi",
|
||||
"albumArtist": "albumin artisti",
|
||||
"lastPlayed": "viimeksi toistettu",
|
||||
"path": "polku",
|
||||
"size": "$t(common.size)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"title": "nimi",
|
||||
"trackNumber": "raita",
|
||||
"codec": "$t(common.codec)",
|
||||
"comment": "kommentti",
|
||||
"albumCount": "$t(entity.album_other)",
|
||||
"bitrate": "bittinopeus",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"discNumber": "levy",
|
||||
"favorite": "suosikki",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"playCount": "toistoja",
|
||||
"rating": "arvostelu",
|
||||
"releaseDate": "julkaisupäivämäärä"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+117
-31
@@ -11,7 +11,7 @@
|
||||
"skip_back": "reculer",
|
||||
"favorite": "favori",
|
||||
"next": "suivant",
|
||||
"shuffle": "aléatoire",
|
||||
"shuffle": "lecture aléatoire",
|
||||
"playbackFetchNoResults": "aucune chansons trouvées",
|
||||
"playbackFetchInProgress": "chargement des chansons…",
|
||||
"addNext": "ajouter ensuite",
|
||||
@@ -29,13 +29,14 @@
|
||||
"skip_forward": "avancer",
|
||||
"pause": "pause",
|
||||
"unfavorite": "retirer des favoris",
|
||||
"playSimilarSongs": "jouer des chansons similaires"
|
||||
"playSimilarSongs": "jouer des chansons similaires",
|
||||
"viewQueue": "voir la file d'attente"
|
||||
},
|
||||
"action": {
|
||||
"editPlaylist": "éditer $t(entity.playlist_one)",
|
||||
"goToPage": "aller à la page",
|
||||
"moveToTop": "déplacer en haut",
|
||||
"clearQueue": "effacer la liste de lecture",
|
||||
"clearQueue": "vider la file d'attente",
|
||||
"addToFavorites": "ajouter aux $t(entity.favorite_other)",
|
||||
"addToPlaylist": "ajouter à $t(entity.playlist_one)",
|
||||
"createPlaylist": "créer $t(entity.playlist_one)",
|
||||
@@ -52,7 +53,8 @@
|
||||
"openIn": {
|
||||
"lastfm": "Ouvrir dans Last.fm",
|
||||
"musicbrainz": "Ouvrir dans MusicBrainz"
|
||||
}
|
||||
},
|
||||
"moveToNext": "passer au suivant"
|
||||
},
|
||||
"common": {
|
||||
"backward": "en arrière",
|
||||
@@ -65,7 +67,7 @@
|
||||
"edit": "éditer",
|
||||
"favorite": "favoris",
|
||||
"left": "gauche",
|
||||
"save": "sauvegarder",
|
||||
"save": "enregistrer",
|
||||
"right": "droite",
|
||||
"currentSong": "$t(entity.track_one) actuelle",
|
||||
"collapse": "réduire",
|
||||
@@ -92,12 +94,15 @@
|
||||
"no": "non",
|
||||
"owner": "propriétaire",
|
||||
"enable": "activer",
|
||||
"clear": "effacer",
|
||||
"clear": "vider",
|
||||
"forward": "avancer",
|
||||
"delete": "supprimer",
|
||||
"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",
|
||||
@@ -106,7 +111,7 @@
|
||||
"filters": "filtres",
|
||||
"create": "créer",
|
||||
"bitrate": "bitrate",
|
||||
"saveAndReplace": "sauvegarder et remplacer",
|
||||
"saveAndReplace": "enregistrer et remplacer",
|
||||
"action_one": "action",
|
||||
"action_many": "actions",
|
||||
"action_other": "actions",
|
||||
@@ -124,12 +129,12 @@
|
||||
"none": "aucun",
|
||||
"menu": "menu",
|
||||
"restartRequired": "redémarrage requis",
|
||||
"previousSong": "précédant $t(entity.track_one)",
|
||||
"previousSong": "$t(entity.track_one) précédente",
|
||||
"noResultsFromQuery": "la requête n'a retourné aucun résultat",
|
||||
"quit": "quitter",
|
||||
"expand": "étendre",
|
||||
"search": "recherche",
|
||||
"saveAs": "sauvegarder en tant que",
|
||||
"saveAs": "enregistrer en tant que",
|
||||
"disc": "disque",
|
||||
"yes": "oui",
|
||||
"random": "aléatoire",
|
||||
@@ -145,35 +150,44 @@
|
||||
"reload": "recharger",
|
||||
"trackGain": "gain de la piste",
|
||||
"trackPeak": "crête de la piste",
|
||||
"codec": "codec"
|
||||
"codec": "codec",
|
||||
"translation": "traduction",
|
||||
"additionalParticipants": "participants additionnels",
|
||||
"tags": "tags",
|
||||
"newVersion": "une nouvelle version vient d'être installé ({{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",
|
||||
"systemFontError": "une erreur s’est produite lors de la tentative d’obtenir les polices système",
|
||||
"playbackError": "une erreur s'est produite lors de la tentative de lecture du média",
|
||||
"endpointNotImplementedError": "endpoint {{endpoint}} n'est pas implémenté pour {{serverType}}",
|
||||
"endpointNotImplementedError": "l'endpoint {{endpoint}} n'est pas implémenté pour {{serverType}}",
|
||||
"remotePortError": "une erreur s'est produite lors de la tentative de définir le port du serveur distant",
|
||||
"serverRequired": "serveur requis",
|
||||
"authenticationFailed": "l'authentification à échoué",
|
||||
"authenticationFailed": "l'authentification a échoué",
|
||||
"apiRouteError": "incapable d’acheminer la demande",
|
||||
"genericError": "une erreur s'est produite",
|
||||
"credentialsRequired": "identifiants requis",
|
||||
"sessionExpiredError": "votre session a expiré",
|
||||
"remoteEnableError": "une erreur s'est produite lors de la tentative de $t(common.enable) le serveur distant",
|
||||
"localFontAccessDenied": "accès refusé aux polices locales",
|
||||
"serverNotSelectedError": "aucun serveur sélectionner",
|
||||
"serverNotSelectedError": "aucun serveur sélectionné",
|
||||
"remoteDisableError": "une erreur s'est produite lors de la tentative de $t(common.disable) le serveur distant",
|
||||
"mpvRequired": "MPV requis",
|
||||
"audioDeviceFetchError": "une erreur s’est produite lors de la tentative d’obtenir les périphériques audio",
|
||||
"invalidServer": "serveur invalide",
|
||||
"loginRateError": "trop de tentative de connexion, merci d'essayer dans quelque secondes",
|
||||
"loginRateError": "trop de tentative de connexion, merci de réessayer dans quelques secondes",
|
||||
"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)\"."
|
||||
"badAlbum": "vous voyez cette page parce que cette chanson ne fait pas parti d'un album. vous rencontrez probablement cette erreur si vous avez une chanson qui n'est pas dans votre répertoire de musique. jellyfin gère les chansons uniquement si elles sont dans un sous-dossier, qui est lui-même dans un dossier \"Musique(s)\".",
|
||||
"badValue": "option {{value}} invalide. Cette valeur n'existe plus",
|
||||
"notificationDenied": "les autorisations pour les notifications ont été refusées. ce paramètre n'a aucun effet"
|
||||
},
|
||||
"filter": {
|
||||
"mostPlayed": "plus joués",
|
||||
"playCount": "nombre d'écoutes",
|
||||
"playCount": "nombre d'écoute",
|
||||
"isCompilation": "est une compilation",
|
||||
"recentlyPlayed": "récemment joué",
|
||||
"isRated": "est noté",
|
||||
@@ -190,7 +204,7 @@
|
||||
"path": "chemin",
|
||||
"favorited": "favoris",
|
||||
"isRecentlyPlayed": "est récemment joué",
|
||||
"isFavorited": "est favoris",
|
||||
"isFavorited": "est favori",
|
||||
"bpm": "bpm",
|
||||
"releaseYear": "année de sortie",
|
||||
"disc": "disque",
|
||||
@@ -198,7 +212,7 @@
|
||||
"songCount": "nombre de chansons",
|
||||
"duration": "durée",
|
||||
"random": "aléatoire",
|
||||
"lastPlayed": "dernière joué",
|
||||
"lastPlayed": "dernier joué",
|
||||
"toYear": "à l'année",
|
||||
"fromYear": "depuis l'année",
|
||||
"criticRating": "note des critiques",
|
||||
@@ -228,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": {
|
||||
@@ -244,11 +259,14 @@
|
||||
"lyricSize": "Taille des paroles",
|
||||
"lyricGap": "espacement des lettres",
|
||||
"dynamicIsImage": "activer l'image d'arrière-plan",
|
||||
"dynamicImageBlur": "intensité de flou sur image d'arrière-plan"
|
||||
"dynamicImageBlur": "intensité de flou sur image d'arrière-plan",
|
||||
"lyricOffset": "paroles décalées (ms)"
|
||||
},
|
||||
"upNext": "à suivre",
|
||||
"lyrics": "paroles",
|
||||
"related": "similaire"
|
||||
"related": "similaire",
|
||||
"visualizer": "visualisateur",
|
||||
"noLyrics": "aucune parole trouvée"
|
||||
},
|
||||
"appMenu": {
|
||||
"selectServer": "sélectionner le serveur",
|
||||
@@ -271,7 +289,8 @@
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "plus de $t(entity.artist_one)",
|
||||
"moreFromGeneric": "plus de {{item}}"
|
||||
"moreFromGeneric": "plus de {{item}}",
|
||||
"released": "publié"
|
||||
},
|
||||
"setting": {
|
||||
"generalTab": "général",
|
||||
@@ -308,7 +327,9 @@
|
||||
"shareItem": "partager un élément",
|
||||
"playSimilarSongs": "$t(player.playSimilarSongs)",
|
||||
"showDetails": "obtenir des informations",
|
||||
"download": "télécharger"
|
||||
"download": "télécharger",
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"moveToNext": "$t(action.moveToNext)"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
@@ -346,6 +367,17 @@
|
||||
"copyPath": "copier le chemin dans le presse-papiers",
|
||||
"openFile": "afficher la piste dans le gestionnaire de fichiers",
|
||||
"copiedPath": "chemin copié avec succès"
|
||||
},
|
||||
"playlist": {
|
||||
"reorder": "le tri n'est possible que lorsque l'on trie par identifiant"
|
||||
},
|
||||
"manageServers": {
|
||||
"serverDetails": "détails du serveur",
|
||||
"removeServer": "supprimer le serveur",
|
||||
"url": "URL du serveur",
|
||||
"title": "gérer les serveurs",
|
||||
"username": "nom d'utilisateur",
|
||||
"editServerDetailsTooltip": "modifier les détails du serveur"
|
||||
}
|
||||
},
|
||||
"setting": {
|
||||
@@ -372,7 +404,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",
|
||||
@@ -423,7 +455,7 @@
|
||||
"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",
|
||||
@@ -546,7 +578,50 @@
|
||||
"webAudio": "utiliser l'audio web",
|
||||
"transcodeBitrate": "débit binaire du transcodage",
|
||||
"transcodeFormat": "format de transcodage",
|
||||
"webAudio_description": "utiliser l'audio web. cela permet d'utiliser des fonctions avancées comme le replaygain. désactivez si vous rencontrez d'autres problèmes"
|
||||
"webAudio_description": "utiliser l'audio web. cela permet d'utiliser des fonctions avancées comme le replaygain. désactivez si vous rencontrez d'autres problèmes",
|
||||
"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 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",
|
||||
"albumBackgroundBlur_description": "ajuste le niveau de flou appliqué à l'image d'arrière-plan de l'album",
|
||||
"playButtonBehavior_optionPlayShuffled": "$t(player.shuffle)",
|
||||
"playerbarOpenDrawer": "basculement plein écran de la barre de lecteur",
|
||||
"playerbarOpenDrawer_description": "permet de cliquer sur la barre du lecteur pour ouvrir le lecteur plein écran",
|
||||
"translationApiProvider": "fournisseur d'api de traduction",
|
||||
"discordListening": "afficher le statut d'écoute",
|
||||
"discordListening_description": "afficher le statut comme étant en écoute au lieu de lecture",
|
||||
"translationApiKey_description": "clé api à utiliser pour traduire les paroles (ne prend en charge que les points de terminaison de service globaux)",
|
||||
"translationTargetLanguage": "traduction langue cible",
|
||||
"trayEnabled": "montrer le plateau",
|
||||
"translationApiProvider_description": "le fournisseur d'api à utiliser pour la traduction des paroles",
|
||||
"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",
|
||||
"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",
|
||||
"lastfmApiKey": "clé API {{lastfm}}",
|
||||
"lastfmApiKey_description": "la clé API pour {{lastfm}} . requise pour la pochette d'album",
|
||||
"discordServeImage": "servir l'image {{discord}} depuis le serveur",
|
||||
"discordServeImage_description": "partage pochette du status d'activité {{discord}} depuis le serveur lui même, disponible uniquement pour jellyfin et navidrome",
|
||||
"lastfm": "affiche les liens de last.fm",
|
||||
"musicbrainz_description": "affiches les liens vers musicbrainz sur les pages des artistes/albums, quand mbid existes",
|
||||
"lastfm_description": "affiche les liens vers last.fm sur les pages des artistes/albums",
|
||||
"musicbrainz": "affiches les liens musicbrainz",
|
||||
"neteaseTranslation": "Activer les traductions NetEase",
|
||||
"neteaseTranslation_description": "Lorsque cette option est activée, récupère et affiche les paroles traduites de NetEase si elles sont disponibles.",
|
||||
"preferLocalLyrics_description": "privilégier les paroles locales aux paroles distantes lorsqu'elles sont disponibles",
|
||||
"preferLocalLyrics": "privilégier les paroles locales",
|
||||
"discordPausedStatus_description": "quand activé, le status s'affichera lorsque le lecteur est en pause",
|
||||
"discordPausedStatus": "afficher le status d'activité en pause",
|
||||
"preservePitch": "préserver la hauteur",
|
||||
"preservePitch_description": "préserver la hauteur lors du changement de la vitesse de lecture",
|
||||
"notify": "activer les notifications des chansons",
|
||||
"notify_description": "affiche une notification lors du changement de chanson"
|
||||
},
|
||||
"form": {
|
||||
"deletePlaylist": {
|
||||
@@ -587,11 +662,13 @@
|
||||
},
|
||||
"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 playlist est publique ou non. Si vous souhaitez que cette playlist reste publique, veuillez sélectionner l'entrée suivante",
|
||||
"success": "$t(entity.playlist_one) mis à jour avec succès"
|
||||
},
|
||||
"lyricSearch": {
|
||||
"title": "rechercher parole",
|
||||
@@ -653,7 +730,13 @@
|
||||
"genreWithCount_other": "{{count}} genres",
|
||||
"trackWithCount_one": "{{count}} piste",
|
||||
"trackWithCount_many": "{{count}} pistes",
|
||||
"trackWithCount_other": "{{count}} pistes"
|
||||
"trackWithCount_other": "{{count}} pistes",
|
||||
"play_one": "{{count}} écouter",
|
||||
"play_many": "{{count}} écoute",
|
||||
"play_other": "{{count}} écoute",
|
||||
"song_one": "chanson",
|
||||
"song_many": "chansons",
|
||||
"song_other": "chansons"
|
||||
},
|
||||
"table": {
|
||||
"config": {
|
||||
@@ -664,12 +747,15 @@
|
||||
"gap": "$t(common.gap)",
|
||||
"size": "$t(common.size)",
|
||||
"itemGap": "écart entre les éléments (en pixel)",
|
||||
"itemSize": "taille des élements (en pixel)"
|
||||
"itemSize": "taille des élements (en pixel)",
|
||||
"followCurrentSong": "suivre la chanson actuelle"
|
||||
},
|
||||
"view": {
|
||||
"table": "liste",
|
||||
"poster": "poster",
|
||||
"card": "Carte"
|
||||
"card": "Carte",
|
||||
"grid": "grille",
|
||||
"list": "liste"
|
||||
},
|
||||
"label": {
|
||||
"releaseDate": "date de sortie",
|
||||
|
||||
@@ -0,0 +1,254 @@
|
||||
{
|
||||
"action": {
|
||||
"moveToNext": "ugrás a következőre",
|
||||
"deletePlaylist": "$t(entity.playlist_one) törlése",
|
||||
"removeFromFavorites": "eltávolítás innen: $t(entity.favorite_other)",
|
||||
"setRating": "értékelés",
|
||||
"viewPlaylists": "$t(entity.playlist_other) megtekintése",
|
||||
"openIn": {
|
||||
"lastfm": "Megnyitás Last.fm-ben",
|
||||
"musicbrainz": "Megnyitás MusicBrainz-ben"
|
||||
},
|
||||
"clearQueue": "műsorlista kiürítése",
|
||||
"createPlaylist": "$t(entity.playlist_one) létrehozása",
|
||||
"deselectAll": "kijelölések törlése",
|
||||
"editPlaylist": "$t(entity.playlist_one) szerkesztése",
|
||||
"goToPage": "oldal meglátogatása",
|
||||
"moveToBottom": "ugrás az utolsóhoz",
|
||||
"moveToTop": "ugrás az elsőhöz",
|
||||
"removeFromPlaylist": "eltávolítás innen: $t(entity.playlist_one)",
|
||||
"removeFromQueue": "eltávolítás a műsorlistáról",
|
||||
"toggleSmartPlaylistEditor": "$t(entity.smartPlaylist) szerkesztője",
|
||||
"addToFavorites": "$t(entity.favorite_other) kedvelése",
|
||||
"addToPlaylist": "hozzáadás lejátszási listához: $t(entity.playlist_one)"
|
||||
},
|
||||
"common": {
|
||||
"collapse": "összecsukás",
|
||||
"currentSong": "jelenlegi: $t(entity.track_one)",
|
||||
"no": "nem",
|
||||
"close": "bezárás",
|
||||
"confirm": "rendben",
|
||||
"create": "létrehozás",
|
||||
"codec": "kodek",
|
||||
"delete": "törlés",
|
||||
"description": "leírás",
|
||||
"comingSoon": "hamarosan…",
|
||||
"decrease": "csökkentés",
|
||||
"enable": "engedélyes",
|
||||
"disable": "letiltás",
|
||||
"disc": "lemez",
|
||||
"modified": "módosult",
|
||||
"forceRestartRequired": "a módosítások alkalmazásához újra kell indulnunk... zárd be az értesítést az újraindításhoz",
|
||||
"home": "főoldal",
|
||||
"name": "név",
|
||||
"action_one": "művelet",
|
||||
"action_other": "műveletek",
|
||||
"add": "hozzáadás",
|
||||
"albumGain": "album erősség",
|
||||
"albumPeak": "album csúcs",
|
||||
"areYouSure": "biztos vagy benne?",
|
||||
"ascending": "növekvő",
|
||||
"backward": "visszafelé",
|
||||
"biography": "biográfia",
|
||||
"bitrate": "bitráta",
|
||||
"cancel": "mégse",
|
||||
"center": "közép",
|
||||
"channel_one": "csatorna",
|
||||
"channel_other": "csatornák",
|
||||
"clear": "törlés",
|
||||
"configure": "konfigurálás",
|
||||
"descending": "csökkenő",
|
||||
"dismiss": "figyelmen kívül hagyás",
|
||||
"duration": "hossz",
|
||||
"edit": "szerkesztés",
|
||||
"expand": "megnyitás",
|
||||
"favorite": "kedvenc",
|
||||
"filter_one": "szűrő",
|
||||
"filter_other": "szűrők",
|
||||
"filters": "szűrők",
|
||||
"forward": "előre",
|
||||
"gap": "rés",
|
||||
"increase": "megnövelés",
|
||||
"left": "bal",
|
||||
"limit": "korlát",
|
||||
"manage": "kezelés",
|
||||
"maximize": "maximalizálás",
|
||||
"menu": "menü",
|
||||
"minimize": "minimalizálás",
|
||||
"mbid": "MusicBrainz azonosító",
|
||||
"noResultsFromQuery": "nincsenek találatok a keresett kifejezésre",
|
||||
"note": "jegyzet",
|
||||
"ok": "rendben",
|
||||
"owner": "tulajdonos",
|
||||
"path": "elérési út",
|
||||
"playerMustBePaused": "a lejátszónak szüneteltetve kell lennie",
|
||||
"preview": "előnézet",
|
||||
"previousSong": "előző $t(entity.track_one)",
|
||||
"quit": "kilépés",
|
||||
"random": "véletlenszerű",
|
||||
"refresh": "frissítés",
|
||||
"reset": "reszetelés",
|
||||
"resetToDefault": "visszaállítás alapértelmezettekre",
|
||||
"right": "jobb",
|
||||
"save": "mentés",
|
||||
"search": "keresés",
|
||||
"title": "cím",
|
||||
"trackNumber": "dalszám",
|
||||
"unknown": "ismeretlen",
|
||||
"version": "verzió",
|
||||
"yes": "igen",
|
||||
"none": "egyik sem",
|
||||
"restartRequired": "újraindítás szükséges",
|
||||
"setting": "beállítás",
|
||||
"translation": "fordítás",
|
||||
"rating": "értékelések",
|
||||
"reload": "újratöltés",
|
||||
"share": "megosztás",
|
||||
"sortOrder": "sorrend",
|
||||
"saveAndReplace": "mentés és felülírás",
|
||||
"saveAs": "mentés másként",
|
||||
"size": "méret",
|
||||
"year": "év",
|
||||
"trackGain": "dal erősség",
|
||||
"trackPeak": "dal csúcs"
|
||||
},
|
||||
"entity": {
|
||||
"albumArtist_one": "album szerzője",
|
||||
"albumArtist_other": "album szerzői",
|
||||
"albumArtistCount_one": "{{count}} album szerző",
|
||||
"albumArtistCount_other": "{{count}} album szerzők",
|
||||
"albumWithCount_one": "{{count}} album",
|
||||
"albumWithCount_other": "{{count}} album",
|
||||
"artist_one": "előadó",
|
||||
"artist_other": "előadók",
|
||||
"favorite_one": "kedvelés",
|
||||
"favorite_other": "kedvelések",
|
||||
"folder_one": "mappa",
|
||||
"folder_other": "mappák",
|
||||
"genreWithCount_one": "{{count}} műfaj",
|
||||
"genreWithCount_other": "{{count}} műfaj",
|
||||
"track_one": "dal",
|
||||
"track_other": "dalok",
|
||||
"song_one": "zene",
|
||||
"song_other": "zenék",
|
||||
"album_one": "album",
|
||||
"album_other": "albumok",
|
||||
"smartPlaylist": "intelligens $t(entity.playlist_one)",
|
||||
"artistWithCount_one": "{{count}} előadó",
|
||||
"artistWithCount_other": "{{count}} előadó",
|
||||
"playlist_one": "lejátszási lista",
|
||||
"playlist_other": "lejátszási listák",
|
||||
"playlistWithCount_one": "{{count}} lejátszási lista",
|
||||
"playlistWithCount_other": "{{count}} lejátszási lista",
|
||||
"folderWithCount_one": "{{count}} mappa",
|
||||
"folderWithCount_other": "{{count}} mappa",
|
||||
"genre_one": "műfaj",
|
||||
"genre_other": "műfajok",
|
||||
"play_one": "{{count}} lejátszás",
|
||||
"play_other": "{{count}} lejátszás",
|
||||
"trackWithCount_one": "{{count}} dal",
|
||||
"trackWithCount_other": "{{count}} dal"
|
||||
},
|
||||
"error": {
|
||||
"apiRouteError": "a kérést nem sikerült célbajuttatni",
|
||||
"audioDeviceFetchError": "hiba történt a hangeszközök lekérésekor",
|
||||
"authenticationFailed": "sikertelen hitelesítés",
|
||||
"credentialsRequired": "hitelesítési adatok szükségesek",
|
||||
"localFontAccessDenied": "hozzáférés megtagadásra került a helyi betűtípusokhoz",
|
||||
"networkError": "hálózati hibába ütköztünk",
|
||||
"openError": "a fájl megnyitása sikertelen volt",
|
||||
"playbackError": "hiba történt a média lejátszásakor",
|
||||
"remoteEnableError": "hiba történt a távoli szerver műveletkor: $t(common.enable)",
|
||||
"remotePortError": "hiba történt a távoli szerver PORT-jának beállításakor",
|
||||
"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.",
|
||||
"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",
|
||||
"remoteDisableError": "hiba történt a távoli szerver műveletkor: $t(common.disable)",
|
||||
"sessionExpiredError": "a munkameneted lejárt",
|
||||
"systemFontError": "hiba történt a rendszer betűtípusainak lekérésekor",
|
||||
"serverRequired": "szerver szükséges",
|
||||
"serverNotSelectedError": "nincs szerver kiválasztva"
|
||||
},
|
||||
"filter": {
|
||||
"albumCount": "$t(entity.album_other) darab",
|
||||
"bitrate": "bitráta",
|
||||
"comment": "megjegyzés",
|
||||
"dateAdded": "hozzáadva",
|
||||
"duration": "hossz",
|
||||
"fromYear": "évtől",
|
||||
"isCompilation": "gyűjtemény",
|
||||
"isRated": "értékelt",
|
||||
"lastPlayed": "utoljára lejátszva",
|
||||
"mostPlayed": "legtöbbször lejátszott",
|
||||
"note": "megjegyzés",
|
||||
"random": "véletlenszerű",
|
||||
"rating": "értékelések",
|
||||
"recentlyAdded": "nemrég hozzáadott",
|
||||
"releaseDate": "megjelenési dátum",
|
||||
"releaseYear": "megjelenés éve",
|
||||
"songCount": "dal szám",
|
||||
"title": "cím",
|
||||
"disc": "lemez",
|
||||
"criticRating": "kritikusok értékelése",
|
||||
"communityRating": "közösségi értékelés",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"biography": "biográfia",
|
||||
"album": "$t(entity.album_one)",
|
||||
"favorited": "kedvelt",
|
||||
"isRecentlyPlayed": "mostanában lejátszott",
|
||||
"name": "név",
|
||||
"owner": "$t(common.owner)",
|
||||
"id": "azonosító",
|
||||
"recentlyPlayed": "nemrég lejátszott",
|
||||
"isFavorited": "kedvelt",
|
||||
"search": "keresés",
|
||||
"isPublic": "nyilvános",
|
||||
"playCount": "lejátszások száma",
|
||||
"recentlyUpdated": "nemrég módosult",
|
||||
"path": "elérési út",
|
||||
"toYear": "évhez",
|
||||
"trackNumber": "dalszám"
|
||||
},
|
||||
"form": {
|
||||
"addServer": {
|
||||
"error_savePassword": "hiba történt a jelszó mentésekor",
|
||||
"ignoreCors": "CORS figyelmen kívül hagyása $t(common.restartRequired)",
|
||||
"ignoreSsl": "SSL figyelmen kívül hagyása $t(common.restartRequired)",
|
||||
"input_password": "jelszó",
|
||||
"input_url": "url",
|
||||
"input_username": "felhasználónév",
|
||||
"success": "szerver sikeresen hozzáadva",
|
||||
"title": "szerver hozzáadása",
|
||||
"input_name": "szervernév",
|
||||
"input_savePassword": "jelszó mentése",
|
||||
"input_legacyAuthentication": "klasszikus hitelesítés bekapcsolása"
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"input_skipDuplicates": "duplikátumok átugrása",
|
||||
"input_playlists": "$t(entity.playlist_other)",
|
||||
"success": "hozzáadtuk ezt: $t(entity.trackWithCount, {\"count\": {{message}} }) a következőhöz: $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })",
|
||||
"title": "hozzáadás a következőhöz: $t(entity.playlist_one)"
|
||||
},
|
||||
"createPlaylist": {
|
||||
"input_description": "$t(common.description)",
|
||||
"input_name": "$t(common.name)",
|
||||
"input_owner": "$t(common.owner)",
|
||||
"input_public": "nyilvános",
|
||||
"title": "$t(entity.playlist_one) létrehozása",
|
||||
"success": "$t(entity.playlist_one) sikeresen létrehozva"
|
||||
},
|
||||
"deletePlaylist": {
|
||||
"input_confirm": "a megerősítéshez írd be a(z) $t(entity.playlist_one) nevét",
|
||||
"success": "$t(entity.playlist_one) sikeresen törölve",
|
||||
"title": "$t(entity.playlist_one) törlése"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"success": "$t(entity.playlist_one) sikeresen módosítva",
|
||||
"publicJellyfinNote": "A Jellyfin valamiért nem teszi közzé, hogy egy lejátszási lista nyilvános-e. Amennyiben azt szeretnéd, hogy nyilvános maradjon, válaszd ki az alábbi beviteli mezőt"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,747 @@
|
||||
{
|
||||
"action": {
|
||||
"createPlaylist": "buat $t(entity.playlist_one)",
|
||||
"toggleSmartPlaylistEditor": "ubah editor $t(entity.smartPlaylist)",
|
||||
"goToPage": "pergi ke halaman",
|
||||
"moveToTop": "pindah ke atas",
|
||||
"addToPlaylist": "tambahkan ke $t(entity.playlist_one)",
|
||||
"removeFromFavorites": "hapus dari $t(entity.favorite_other)",
|
||||
"removeFromPlaylist": "hapus dari $t(entity.playlist_one)",
|
||||
"deselectAll": "batalkan pilih semua",
|
||||
"editPlaylist": "ubah $t(entity.playlist_one)",
|
||||
"moveToNext": "pindah ke berikutnya",
|
||||
"refresh": "$t(common.refresh)",
|
||||
"removeFromQueue": "hapus dari antrean",
|
||||
"setRating": "setel penilaian",
|
||||
"viewPlaylists": "lihat $t(entity.playlist_other)",
|
||||
"openIn": {
|
||||
"lastfm": "Buka di Last.fm",
|
||||
"musicbrainz": "Buka di MusicBrainz"
|
||||
},
|
||||
"addToFavorites": "tambahkan ke $t(entity.favorite_other)",
|
||||
"clearQueue": "kosongkan antrian",
|
||||
"deletePlaylist": "hapus $t(entity.playlist_one)",
|
||||
"moveToBottom": "pindah ke bawah"
|
||||
},
|
||||
"common": {
|
||||
"clear": "bersihkan",
|
||||
"action_other": "aksi",
|
||||
"codec": "Koded",
|
||||
"channel_other": "Saluran",
|
||||
"duration": "durasi",
|
||||
"create": "buat",
|
||||
"center": "tengah",
|
||||
"areYouSure": "apakah Anda yakin?",
|
||||
"add": "tambah",
|
||||
"albumGain": "perolehan album",
|
||||
"albumPeak": "Puncak album",
|
||||
"cancel": "batal",
|
||||
"close": "Tutup",
|
||||
"configure": "konfigurasi",
|
||||
"currentSong": "lagu saat ini $t(entity.track_one)",
|
||||
"delete": "hapus",
|
||||
"description": "deskripsi",
|
||||
"edit": "ubah",
|
||||
"biography": "biografi",
|
||||
"confirm": "konfirmasi",
|
||||
"descending": "menurun",
|
||||
"disable": "nonaktifkan",
|
||||
"disc": "disk",
|
||||
"enable": "aktifkan",
|
||||
"expand": "perbesar",
|
||||
"favorite": "favorit",
|
||||
"filter_other": "filter",
|
||||
"filters": "filter",
|
||||
"forceRestartRequired": "perlu restart untuk menerapkan perubahan... tutup pemberitahuan untuk memulai ulang",
|
||||
"forward": "maju",
|
||||
"gap": "jarak",
|
||||
"home": "beranda",
|
||||
"increase": "tingkatkan",
|
||||
"left": "kiri",
|
||||
"limit": "batasi",
|
||||
"manage": "kelola",
|
||||
"maximize": "maksimalkan",
|
||||
"menu": "menu",
|
||||
"minimize": "minimalisasi",
|
||||
"modified": "dimodifikasi",
|
||||
"mbid": "ID MusicBrainz",
|
||||
"name": "nama",
|
||||
"no": "tidak",
|
||||
"none": "tidak ada",
|
||||
"noResultsFromQuery": "permintaan tidak menghasilkan hasil",
|
||||
"note": "catatan",
|
||||
"ok": "oke",
|
||||
"owner": "pemilik",
|
||||
"playerMustBePaused": "pemain harus dijeda",
|
||||
"preview": "Pratinjau",
|
||||
"previousSong": "lagu sebelumnya $t(entity.track_one)",
|
||||
"quit": "keluar",
|
||||
"random": "acak",
|
||||
"rating": "penilaian",
|
||||
"refresh": "segarkan",
|
||||
"reload": "Muat Ulang",
|
||||
"reset": "reset",
|
||||
"resetToDefault": "reset ke default",
|
||||
"restartRequired": "restart diperlukan",
|
||||
"right": "kanan",
|
||||
"save": "simpan",
|
||||
"saveAndReplace": "simpan dan ganti",
|
||||
"saveAs": "simpan sebagai",
|
||||
"search": "cari",
|
||||
"setting": "pengaturan",
|
||||
"share": "Bagikan",
|
||||
"size": "ukuran",
|
||||
"sortOrder": "urutkan",
|
||||
"title": "judul",
|
||||
"trackNumber": "pista",
|
||||
"trackGain": "Gain pista",
|
||||
"trackPeak": "puncak lagu",
|
||||
"unknown": "tidak dikenal",
|
||||
"version": "versi",
|
||||
"year": "tahun",
|
||||
"yes": "ya",
|
||||
"path": "path(jalur)",
|
||||
"ascending": "menaik",
|
||||
"bpm": "bpm",
|
||||
"bitrate": "kecepatan bit",
|
||||
"collapse": "lipat",
|
||||
"comingSoon": "segera hadir…",
|
||||
"decrease": "kurangi",
|
||||
"dismiss": "abaikan",
|
||||
"translation": "terjemahan",
|
||||
"backward": "mundur"
|
||||
},
|
||||
"entity": {
|
||||
"album_other": "album",
|
||||
"albumArtist_other": "artis album",
|
||||
"albumArtistCount_other": "{{count}} artis album",
|
||||
"albumWithCount_other": "{{count}} album",
|
||||
"artist_other": "artis",
|
||||
"artistWithCount_other": "{{count}} artis",
|
||||
"favorite_other": "favorit",
|
||||
"folder_other": "folder",
|
||||
"folderWithCount_other": "{{count}} folder",
|
||||
"genre_other": "genre",
|
||||
"genreWithCount_other": "{{count}} genre",
|
||||
"playlist_other": "daftar putar",
|
||||
"play_other": "Putar {{count}}",
|
||||
"playlistWithCount_other": "{{count}} daftar putar",
|
||||
"smartPlaylist": "$t(entity.playlist_one) pintar",
|
||||
"track_other": "pista",
|
||||
"song_other": "lagu",
|
||||
"trackWithCount_other": "{{count}} pista"
|
||||
},
|
||||
"error": {
|
||||
"apiRouteError": "tidak dapat mengarahkan permintaan",
|
||||
"audioDeviceFetchError": "terjadi kesalahan saat mencoba mengambil perangkat audio",
|
||||
"authenticationFailed": "autentikasi gagal",
|
||||
"badAlbum": "Anda melihat halaman ini karena lagu ini tidak termasuk dalam album. Masalah ini bisa terjadi jika Anda memiliki lagu di tingkat atas folder musik Anda. Jellyfin hanya mengelompokkan lagu jika mereka berada di dalam folder.",
|
||||
"credentialsRequired": "kredensial diperlukan",
|
||||
"endpointNotImplementedError": "endpoint {{endpoint}} tidak diimplementasikan untuk {{serverType}}",
|
||||
"genericError": "terjadi kesalahan",
|
||||
"invalidServer": "server tidak valid",
|
||||
"localFontAccessDenied": "akses ke font lokal ditolak",
|
||||
"loginRateError": "terlalu banyak percobaan login, coba beberapa detik lagi",
|
||||
"mpvRequired": "MPV diperlukan",
|
||||
"networkError": "terjadi kesalahan jaringan",
|
||||
"openError": "Tidak dapat membuka file",
|
||||
"playbackError": "terjadi kesalahan saat mencoba memutar media",
|
||||
"remoteDisableError": "terjadi kesalahan saat mencoba $t(common.disable) server jarak jauh",
|
||||
"remoteEnableError": "terjadi kesalahan saat mencoba $t(common.enable) server jarak jauh",
|
||||
"remotePortError": "terjadi kesalahan saat mencoba mengatur port server jarak jauh",
|
||||
"remotePortWarning": "restart server untuk menerapkan port baru",
|
||||
"serverNotSelectedError": "tidak ada server yang dipilih",
|
||||
"serverRequired": "server diperlukan",
|
||||
"sessionExpiredError": "sesi Anda telah kedaluwarsa",
|
||||
"systemFontError": "terjadi kesalahan saat mencoba mendapatkan font sistem"
|
||||
},
|
||||
"filter": {
|
||||
"album": "$t(entity.album_one)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"albumCount": "Hitung $t(entity.album_other)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"biography": "biografi",
|
||||
"bitrate": "bitrate",
|
||||
"bpm": "lpm",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"comment": "komentar",
|
||||
"communityRating": "penilaian komunitas",
|
||||
"criticRating": "penilaian kritik",
|
||||
"dateAdded": "tanggal ditambahkan",
|
||||
"disc": "disk",
|
||||
"duration": "durasi",
|
||||
"favorited": "favorit",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"id": "id",
|
||||
"isCompilation": "apakah ini kompilasi",
|
||||
"isFavorited": "apakah ini favorit",
|
||||
"isPublic": "apakah ini publik",
|
||||
"isRated": "apakah ini terklasifikasi",
|
||||
"isRecentlyPlayed": "baru saja diputar",
|
||||
"lastPlayed": "terakhir diputar",
|
||||
"mostPlayed": "paling sering diputar",
|
||||
"name": "nama",
|
||||
"note": "catatan",
|
||||
"owner": "$t(common.owner)",
|
||||
"playCount": "jumlah putar",
|
||||
"random": "acak",
|
||||
"rating": "penilaian",
|
||||
"recentlyAdded": "baru saja ditambahkan",
|
||||
"recentlyPlayed": "baru saja diputar",
|
||||
"recentlyUpdated": "baru saja diperbarui",
|
||||
"releaseDate": "tanggal rilis",
|
||||
"releaseYear": "tahun rilis",
|
||||
"search": "cari",
|
||||
"songCount": "jumlah lagu",
|
||||
"toYear": "hingga tahun",
|
||||
"trackNumber": "nomor pista",
|
||||
"fromYear": "dari tahun",
|
||||
"title": "judul",
|
||||
"path": "path(jalur)"
|
||||
},
|
||||
"form": {
|
||||
"addServer": {
|
||||
"error_savePassword": "terjadi kesalahan saat mencoba menyimpan kata sandi",
|
||||
"ignoreCors": "abaikan cors ($t(common.restartRequired))",
|
||||
"ignoreSsl": "abaikan ssl ($t(common.restartRequired))",
|
||||
"input_legacyAuthentication": "izinkan autentikasi warisan",
|
||||
"input_name": "nama server",
|
||||
"input_password": "kata sandi",
|
||||
"input_savePassword": "simpan kata sandi",
|
||||
"input_url": "url",
|
||||
"input_username": "nama pengguna",
|
||||
"success": "server berhasil ditambahkan",
|
||||
"title": "tambah server"
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"input_playlists": "$t(entity.playlist_other)",
|
||||
"input_skipDuplicates": "lewati duplikat",
|
||||
"success": "ditambahkan $t(entity.trackWithCount, {\"count\": {{message}} }) ke $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })",
|
||||
"title": "tambahkan ke $t(entity.playlist_one)"
|
||||
},
|
||||
"createPlaylist": {
|
||||
"input_description": "$t(common.description)",
|
||||
"input_name": "$t(common.name)",
|
||||
"input_owner": "$t(common.owner)",
|
||||
"input_public": "publik",
|
||||
"success": "$t(entity.playlist_one) berhasil dibuat",
|
||||
"title": "buat $t(entity.playlist_one)"
|
||||
},
|
||||
"deletePlaylist": {
|
||||
"input_confirm": "ketik nama $t(entity.playlist_one) untuk mengonfirmasi",
|
||||
"success": "$t(entity.playlist_one) berhasil dihapus",
|
||||
"title": "hapus $t(entity.playlist_one)"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"publicJellyfinNote": "Jellyfin entah bagaimana tidak menampilkan apakah playlist ini publik atau tidak. Jika Anda ingin playlist ini tetap publik, harap pilih entri berikut",
|
||||
"success": "$t(entity.playlist_one) berhasil diperbarui",
|
||||
"title": "ubah $t(entity.playlist_one)"
|
||||
},
|
||||
"lyricSearch": {
|
||||
"input_artist": "$t(entity.artist_one)",
|
||||
"input_name": "$t(common.name)",
|
||||
"title": "cari lirik"
|
||||
},
|
||||
"queryEditor": {
|
||||
"input_optionMatchAll": "cocokkan semua",
|
||||
"input_optionMatchAny": "cocokkan salah satu"
|
||||
},
|
||||
"shareItem": {
|
||||
"allowDownloading": "Izinkan unduhan",
|
||||
"description": "Deskripsi",
|
||||
"setExpiration": "Atur masa berlaku",
|
||||
"success": "Tautan berbagi berhasil disalin ke papan klip (atau klik di sini untuk membuka)",
|
||||
"expireInvalid": "Masa berlaku harus di masa depan",
|
||||
"createFailed": "Tidak dapat membuat sumber daya berbagi (Apakah berbagi diaktifkan?)"
|
||||
},
|
||||
"updateServer": {
|
||||
"success": "Server berhasil diperbarui",
|
||||
"title": "perbarui server"
|
||||
}
|
||||
},
|
||||
"page": {
|
||||
"albumArtistDetail": {
|
||||
"about": "Tentang {{artist}}",
|
||||
"recentReleases": "Rilis terbaru",
|
||||
"viewDiscography": "Lihat diskografi",
|
||||
"relatedArtists": "$t(entity.artist_other) serupa",
|
||||
"topSongs": "Lagu terbaik",
|
||||
"topSongsFrom": "Lagu terbaik dari {{title}}",
|
||||
"viewAll": "Lihat semua",
|
||||
"viewAllTracks": "Lihat semua $t(entity.track_other)",
|
||||
"appearsOn": "Tampil di"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "lebih banyak dari $t(entity.artist_one) ini",
|
||||
"moreFromGeneric": "lebih banyak dari {{item}}",
|
||||
"released": "dirilis"
|
||||
},
|
||||
"albumList": {
|
||||
"artistAlbums": "album dari {{artist}}",
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)",
|
||||
"title": "$t(entity.album_other)"
|
||||
},
|
||||
"appMenu": {
|
||||
"collapseSidebar": "perkecil sidebar",
|
||||
"expandSidebar": "perluas sidebar",
|
||||
"goBack": "kembali",
|
||||
"goForward": "maju",
|
||||
"manageServers": "kelola server",
|
||||
"openBrowserDevtools": "buka alat pengembang browser",
|
||||
"quit": "$t(common.quit)",
|
||||
"selectServer": "pilih server",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"version": "versi {{version}}"
|
||||
},
|
||||
"manageServers": {
|
||||
"title": "kelola server",
|
||||
"serverDetails": "detail server",
|
||||
"url": "URL",
|
||||
"username": "nama pengguna",
|
||||
"editServerDetailsTooltip": "edit detail server",
|
||||
"removeServer": "hapus 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": "unduh",
|
||||
"moveToNext": "$t(action.moveToNext)",
|
||||
"moveToBottom": "$t(action.moveToBottom)",
|
||||
"numberSelected": "{{count}} terpilih",
|
||||
"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": "Bagikan item",
|
||||
"showDetails": "Lihat detail",
|
||||
"moveToTop": "$t(action.moveToTop)",
|
||||
"play": "$t(player.play)"
|
||||
},
|
||||
"fullscreenPlayer": {
|
||||
"config": {
|
||||
"dynamicBackground": "latar belakang dinamis",
|
||||
"dynamicImageBlur": "ukuran blur gambar",
|
||||
"dynamicIsImage": "aktifkan gambar latar belakang",
|
||||
"followCurrentLyric": "ikuti lirik saat ini",
|
||||
"lyricAlignment": "penyelarasan lirik",
|
||||
"lyricSize": "ukuran lirik",
|
||||
"opacity": "opasitas",
|
||||
"showLyricMatch": "tampilkan kecocokan lirik",
|
||||
"showLyricProvider": "tampilkan penyedia lirik",
|
||||
"synchronized": "sinkronisasi",
|
||||
"unsynchronized": "tidak sinkronisasi",
|
||||
"useImageAspectRatio": "gunakan rasio aspek gambar",
|
||||
"lyricOffset": "offset lirik (ms)",
|
||||
"lyricGap": "jarak lirik"
|
||||
},
|
||||
"lyrics": "lirik",
|
||||
"related": "terkait",
|
||||
"upNext": "berikutnya",
|
||||
"noLyrics": "tanpa lirik",
|
||||
"visualizer": "visualisasi"
|
||||
},
|
||||
"genreList": {
|
||||
"showAlbums": "Tampilkan $t(entity.genre_one) $t(entity.album_other)",
|
||||
"showTracks": "Tampilkan $t(entity.genre_one) $t(entity.track_other)",
|
||||
"title": "$t(entity.genre_other)"
|
||||
},
|
||||
"globalSearch": {
|
||||
"commands": {
|
||||
"goToPage": "pergi ke halaman",
|
||||
"searchFor": "cari {{query}}",
|
||||
"serverCommands": "perintah server"
|
||||
},
|
||||
"title": "perintah"
|
||||
},
|
||||
"home": {
|
||||
"explore": "jelajahi dari pustaka Anda",
|
||||
"mostPlayed": "paling banyak diputar",
|
||||
"newlyAdded": "rilis baru ditambahkan",
|
||||
"recentlyPlayed": "baru saja diputar",
|
||||
"title": "$t(common.home)"
|
||||
},
|
||||
"itemDetail": {
|
||||
"copyPath": "Salin jalur ke papan klip",
|
||||
"copiedPath": "Jalur berhasil disalin",
|
||||
"openFile": "Tampilkan lagu di pengelola file"
|
||||
},
|
||||
"playlist": {
|
||||
"reorder": "penataan ulang hanya aktif saat mengurutkan berdasarkan ID"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist_other)"
|
||||
},
|
||||
"setting": {
|
||||
"advanced": "Lanjutan",
|
||||
"generalTab": "umum",
|
||||
"hotkeysTab": "tombol pintasan",
|
||||
"playbackTab": "pemutaran",
|
||||
"windowTab": "jendela"
|
||||
},
|
||||
"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)",
|
||||
"nowPlaying": "sedang diputar",
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"search": "$t(common.search)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"shared": "berbagi $t(entity.playlist_other)",
|
||||
"tracks": "$t(entity.track_other)"
|
||||
},
|
||||
"trackList": {
|
||||
"artistTracks": "lagu oleh {{artist}}",
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track_other)",
|
||||
"title": "$t(entity.track_other)"
|
||||
}
|
||||
},
|
||||
"player": {
|
||||
"addLast": "tambahkan terakhir",
|
||||
"favorite": "favorit",
|
||||
"mute": "bisukan",
|
||||
"muted": "terbisukan",
|
||||
"next": "berikutnya",
|
||||
"play": "putar",
|
||||
"playbackFetchCancel": "ini memerlukan waktu... tutup pemberitahuan untuk membatalkan",
|
||||
"playbackFetchInProgress": "memuat lagu…",
|
||||
"playbackFetchNoResults": "tidak ada lagu ditemukan",
|
||||
"playbackSpeed": "kecepatan pemutaran",
|
||||
"playRandom": "putar acak",
|
||||
"playSimilarSongs": "putar lagu serupa",
|
||||
"previous": "sebelumnya",
|
||||
"queue_clear": "bersihkan antrean",
|
||||
"queue_moveToBottom": "pindahkan yang terpilih ke bawah",
|
||||
"queue_moveToTop": "pindahkan yang terpilih ke atas",
|
||||
"queue_remove": "hapus yang terpilih",
|
||||
"repeat": "ulang",
|
||||
"repeat_all": "ulang semua",
|
||||
"repeat_off": "ulang dimatikan",
|
||||
"shuffle": "putar acak",
|
||||
"shuffle_off": "acak dimatikan",
|
||||
"skip": "lewati",
|
||||
"skip_back": "mundur",
|
||||
"skip_forward": "lewati maju",
|
||||
"stop": "berhenti",
|
||||
"toggleFullscreenPlayer": "aktifkan pemutar layar penuh",
|
||||
"unfavorite": "bukan favorit",
|
||||
"pause": "jeda",
|
||||
"viewQueue": "lihat antrean",
|
||||
"addNext": "tambahkan berikutnya"
|
||||
},
|
||||
"setting": {
|
||||
"accentColor": "warna sorotan",
|
||||
"accentColor_description": "menetapkan warna sorotan aplikasi",
|
||||
"albumBackground": "gambar latar belakang album",
|
||||
"albumBackground_description": "Tambahkan gambar latar belakang ke halaman album yang berisi sampul album",
|
||||
"albumBackgroundBlur": "Ukuran blur gambar latar belakang album",
|
||||
"albumBackgroundBlur_description": "Atur tingkat blur gambar latar belakang album",
|
||||
"applicationHotkeys": "tombol pintasan aplikasi",
|
||||
"applicationHotkeys_description": "menetapkan tombol pintasan aplikasi. centang untuk menjadikannya tombol pintasan global (desktop saja)",
|
||||
"artistConfiguration": "Pengaturan halaman artis album",
|
||||
"artistConfiguration_description": "Atur elemen apa yang ditampilkan dan urutannya di halaman artis album",
|
||||
"audioDevice": "perangkat audio",
|
||||
"audioDevice_description": "pilih perangkat audio yang digunakan untuk pemutaran (hanya pemutar web)",
|
||||
"audioExclusiveMode": "mode audio eksklusif",
|
||||
"audioExclusiveMode_description": "aktifkan mode audio eksklusif. Dalam mode ini, sistem biasanya diblokir, dan hanya mpv yang akan diizinkan untuk output audio",
|
||||
"audioPlayer": "pemutar audio",
|
||||
"audioPlayer_description": "pilih pemutar audio yang digunakan untuk pemutaran",
|
||||
"buttonSize": "ukuran tombol bilah pemutaran",
|
||||
"buttonSize_description": "ukuran tombol pada bilah pemutaran",
|
||||
"webAudio_description": "Menggunakan audio web. Ini mengaktifkan fitur lanjutan seperti Replaygain. Nonaktifkan opsi ini jika Anda mengalami masalah",
|
||||
"windowBarStyle": "gaya bilah jendela",
|
||||
"windowBarStyle_description": "pilih gaya bilah jendela",
|
||||
"zoom": "persentase zoom",
|
||||
"zoom_description": "tentukan persentase zoom aplikasi",
|
||||
"clearCache_description": "'Pembersihan keras' Feishin. Untuk membersihkan cache Feishin, kosongkan cache browser (gambar yang disimpan dan elemen lainnya). Kredensial dan pengaturan server tetap terjaga",
|
||||
"clearQueryCache": "Bersihkan cache Feishin",
|
||||
"clearQueryCache_description": "'Pembersihan lunak' Feishin. Ini akan menyegarkan daftar putar, metadata lagu, dan mengatur ulang lirik yang disimpan. Pengaturan, kredensial server, dan gambar cache tetap terjaga",
|
||||
"clearCacheSuccess": "Cache berhasil dibersihkan",
|
||||
"contextMenu": "Pengaturan menu konteks (klik kanan)",
|
||||
"contextMenu_description": "Memungkinkan Anda menyembunyikan elemen yang ditampilkan dalam menu saat Anda klik kanan pada elemen. Elemen yang tidak dipilih akan disembunyikan",
|
||||
"crossfadeDuration": "durasi crossfade",
|
||||
"crossfadeDuration_description": "atur durasi efek crossfade",
|
||||
"crossfadeStyle": "gaya crossfade",
|
||||
"crossfadeStyle_description": "pilih gaya crossfade yang digunakan oleh pemutar audio",
|
||||
"customCssEnable": "Aktifkan CSS kustom",
|
||||
"customCssEnable_description": "Memungkinkan penulisan CSS kustom.",
|
||||
"customCssNotice": "Pemberitahuan: meskipun ada sanitasi (menolak url() dan content:), menggunakan CSS kustom masih dapat berisiko mengubah antarmuka.",
|
||||
"customCss": "CSS kustom",
|
||||
"customCss_description": "CSS kustom konten. Catatan: content dan url eksternal adalah properti yang ditolak. Pratinjau konten Anda ditampilkan di bawah. Entri tambahan yang tidak Anda tentukan hadir karena sanitasi.",
|
||||
"customFontPath": "jalur font kustom",
|
||||
"customFontPath_description": "tentukan jalur font kustom yang akan digunakan aplikasi",
|
||||
"disableAutomaticUpdates": "nonaktifkan pembaruan otomatis",
|
||||
"discordApplicationId": "ID aplikasi {{discord}}",
|
||||
"discordApplicationId_description": "ID aplikasi untuk status aktivitas {{discord}} (defaultnya adalah {{defaultId}})",
|
||||
"discordIdleStatus": "tampilkan status tidak aktif dalam status aktivitas",
|
||||
"discordIdleStatus_description": "ketika diaktifkan, memperbarui status saat pemutar tidak aktif",
|
||||
"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}}",
|
||||
"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",
|
||||
"doubleClickBehavior_description": "jika true, semua lagu yang cocok dalam pencarian lagu akan dimasukkan ke dalam antrean. Jika tidak, hanya lagu yang dipilih yang akan dimasukkan ke dalam antrean",
|
||||
"enableRemote": "aktifkan kontrol jarak jauh server",
|
||||
"enableRemote_description": "aktifkan kontrol jarak jauh server untuk memungkinkan perangkat lain mengontrol aplikasi",
|
||||
"externalLinks": "Tampilkan tautan eksternal",
|
||||
"externalLinks_description": "Izinkan untuk menampilkan tautan eksternal (Last.fm, MusicBrainz) di halaman artis/album",
|
||||
"exitToTray": "keluar ke baki",
|
||||
"exitToTray_description": "keluar dari aplikasi ke baki sistem",
|
||||
"floatingQueueArea": "tampilkan area antrean mengambang",
|
||||
"floatingQueueArea_description": "menampilkan ikon mengambang di sisi kanan layar untuk melihat antrean pemutaran",
|
||||
"followLyric": "ikuti lirik saat ini",
|
||||
"followLyric_description": "gulir lirik ke posisi pemutaran saat ini",
|
||||
"font": "font",
|
||||
"font_description": "tentukan font yang digunakan aplikasi",
|
||||
"fontType": "jenis font",
|
||||
"fontType_description": "font bawaan memilih salah satu font yang disediakan oleh Feishin. font sistem memungkinkan Anda memilih font apa pun yang disediakan oleh sistem operasi Anda. kustom memungkinkan Anda memberikan font Anda sendiri",
|
||||
"fontType_optionBuiltIn": "font bawaan",
|
||||
"fontType_optionCustom": "font kustom",
|
||||
"fontType_optionSystem": "font sistem",
|
||||
"gaplessAudio": "audio tanpa jeda",
|
||||
"gaplessAudio_description": "tentukan pengaturan audio tanpa jeda untuk mpv",
|
||||
"gaplessAudio_optionWeak": "lemah (disarankan)",
|
||||
"genreBehavior": "Perilaku default halaman genre",
|
||||
"genreBehavior_description": "Menentukan apakah klik pada genre akan membuka daftar lagu atau album secara default",
|
||||
"globalMediaHotkeys": "tombol pintasan media global",
|
||||
"globalMediaHotkeys_description": "aktifkan atau nonaktifkan penggunaan tombol pintasan sistem media untuk mengontrol pemutaran",
|
||||
"homeConfiguration": "Pengaturan halaman beranda",
|
||||
"homeConfiguration_description": "Mengatur elemen mana yang ditampilkan dan urutannya di halaman beranda",
|
||||
"homeFeature": "Karusel fitur beranda",
|
||||
"homeFeature_description": "Mengontrol apakah karusel besar fitur ditampilkan di halaman beranda",
|
||||
"hotkey_browserBack": "mundur",
|
||||
"hotkey_browserForward": "maju",
|
||||
"hotkey_favoriteCurrentSong": "$t(common.currentSong) favorit",
|
||||
"hotkey_favoritePreviousSong": "$t(common.previousSong) favorit",
|
||||
"hotkey_globalSearch": "pencarian global",
|
||||
"hotkey_localSearch": "pencarian di halaman",
|
||||
"hotkey_playbackNext": "lagu berikutnya",
|
||||
"hotkey_playbackPause": "jeda",
|
||||
"hotkey_playbackPlay": "putar",
|
||||
"hotkey_playbackPlayPause": "putar / jeda",
|
||||
"hotkey_playbackPrevious": "lagu sebelumnya",
|
||||
"hotkey_playbackStop": "berhenti",
|
||||
"hotkey_rate0": "Bersihkan penilaian",
|
||||
"hotkey_rate1": "beri penilaian 1 bintang",
|
||||
"hotkey_rate2": "beri penilaian 2 bintang",
|
||||
"hotkey_rate3": "beri penilaian 3 bintang",
|
||||
"hotkey_rate4": "beri penilaian 4 bintang",
|
||||
"hotkey_rate5": "beri penilaian 5 bintang",
|
||||
"hotkey_skipBackward": "mundur",
|
||||
"hotkey_skipForward": "lompat ke depan",
|
||||
"hotkey_toggleCurrentSongFavorite": "ubah $t(common.currentSong) menjadi favorit",
|
||||
"hotkey_toggleFullScreenPlayer": "ubah pemutar menjadi layar penuh",
|
||||
"hotkey_togglePreviousSongFavorite": "ubah $t(common.previousSong) menjadi favorit",
|
||||
"hotkey_toggleQueue": "ubah antrean",
|
||||
"hotkey_toggleRepeat": "toggle ulangi",
|
||||
"hotkey_toggleShuffle": "toggle acak",
|
||||
"hotkey_unfavoriteCurrentSong": "$t(common.currentSong) tidak favorit",
|
||||
"hotkey_unfavoritePreviousSong": "$t(common.previousSong) tidak favorit",
|
||||
"hotkey_volumeDown": "turunkan volume",
|
||||
"hotkey_volumeMute": "senyapkan volume",
|
||||
"hotkey_volumeUp": "naikkan volume",
|
||||
"hotkey_zoomIn": "perbesar",
|
||||
"hotkey_zoomOut": "perkecil",
|
||||
"imageAspectRatio": "Gunakan rasio aspek sampul asli",
|
||||
"imageAspectRatio_description": "Jika diaktifkan, sampul akan ditampilkan dengan rasio aspek aslinya. Untuk seni yang tidak 1:1, ruang yang tersisa akan kosong",
|
||||
"language_description": "menetapkan bahasa untuk aplikasi ($t(common.restartRequired))",
|
||||
"lastfmApiKey": "Kunci API untuk {{lastfm}}",
|
||||
"lastfmApiKey_description": "kunci API untuk {{lastfm}}. Diperlukan untuk sampul",
|
||||
"lyricFetch": "cari lirik di Internet",
|
||||
"lyricFetch_description": "mencari lirik dari berbagai sumber di Internet",
|
||||
"lyricFetchProvider": "penyedia untuk mencari lirik",
|
||||
"lyricFetchProvider_description": "pilih penyedia untuk mencari lirik. urutan penyedia adalah urutan pencarian",
|
||||
"lyricOffset": "geser lirik (ms)",
|
||||
"lyricOffset_description": "geser lirik sebanyak jumlah milidetik yang ditentukan",
|
||||
"minimizeToTray": "minimalkan ke baki",
|
||||
"minimizeToTray_description": "minimalkan aplikasi ke baki sistem",
|
||||
"minimumScrobblePercentage": "persentase durasi scrobble minimum",
|
||||
"minimumScrobblePercentage_description": "persentase minimum lagu yang harus diputar sebelum melakukan scrobble",
|
||||
"minimumScrobbleSeconds": "scrobble minimum (detik)",
|
||||
"minimumScrobbleSeconds_description": "durasi minimum dalam detik dari lagu yang harus diputar sebelum melakukan scrobble",
|
||||
"mpvExecutablePath_description": "tentukan jalur executable mpv. jika dibiarkan kosong, jalur default akan digunakan",
|
||||
"mpvExtraParameters_help": "Satu per baris",
|
||||
"passwordStore": "kata sandi/penyimpanan rahasia",
|
||||
"passwordStore_description": "metode penyimpanan kata sandi/kunci rahasia yang akan digunakan. ubah opsi ini jika Anda mengalami masalah dalam menyimpan kata sandi.",
|
||||
"playbackStyle": "gaya pemutaran",
|
||||
"playbackStyle_description": "pilih gaya pemutaran yang akan digunakan oleh pemutar audio",
|
||||
"playbackStyle_optionCrossFade": "crossfade",
|
||||
"playbackStyle_optionNormal": "normal",
|
||||
"playButtonBehavior": "perilaku tombol putar",
|
||||
"playButtonBehavior_description": "tentukan perilaku default tombol putar saat lagu ditambahkan ke antrean",
|
||||
"playButtonBehavior_optionAddLast": "$t(player.addLast)",
|
||||
"playButtonBehavior_optionAddNext": "$t(player.addNext)",
|
||||
"playButtonBehavior_optionPlayShuffled": "$t(player.shuffle)",
|
||||
"playerAlbumArtResolution": "resolusi sampul album pemutar",
|
||||
"playerAlbumArtResolution_description": "resolusi untuk pratinjau sampul album pemutar besar. semakin besar akan membuatnya lebih tajam, tetapi dapat memperlambat pemuatan. Nilai default adalah 0, yang berarti otomatis",
|
||||
"playerbarOpenDrawer": "Buka pemutar ke layar penuh",
|
||||
"playerbarOpenDrawer_description": "Izinkan mengklik bilah pemutar untuk membuka pemutar di layar penuh",
|
||||
"remotePassword": "kata sandi kontrol jarak jauh server",
|
||||
"remotePassword_description": "tentukan kata sandi untuk kontrol jarak jauh server. Kredensial ini dikirimkan dengan tidak aman secara default, jadi Anda harus menggunakan kata sandi unik untuk menghindari masalah",
|
||||
"remotePort": "port kontrol jarak jauh server",
|
||||
"remotePort_description": "tentukan port untuk kontrol jarak jauh server",
|
||||
"remoteUsername": "nama pengguna kontrol jarak jauh server",
|
||||
"remoteUsername_description": "tentukan nama pengguna untuk kontrol jarak jauh server. jika nama pengguna dan kata sandi kosong, otentikasi akan dinonaktifkan",
|
||||
"replayGainClipping": "potong {{ReplayGain}}",
|
||||
"replayGainClipping_description": "mencegah pemotongan yang disebabkan oleh {{ReplayGain}} dengan menurunkan gain secara otomatis",
|
||||
"replayGainFallback": "alternatif {{ReplayGain}}",
|
||||
"replayGainFallback_description": "gain dalam dB yang akan diterapkan jika file tidak memiliki tag {{ReplayGain}}",
|
||||
"replayGainMode": "mode {{ReplayGain}}",
|
||||
"replayGainMode_description": "menyesuaikan volume gain sesuai dengan nilai {{ReplayGain}} yang disimpan dalam metadata file",
|
||||
"replayGainMode_optionAlbum": "$t(entity.album_one)",
|
||||
"replayGainMode_optionNone": "$t(common.none)",
|
||||
"replayGainMode_optionTrack": "$t(entity.track_one)",
|
||||
"replayGainPreamp": "preamplifier (dB) {{ReplayGain}}",
|
||||
"replayGainPreamp_description": "menyesuaikan gain preamplifier yang diterapkan ke nilai {{ReplayGain}}",
|
||||
"sampleRate_description": "pilih rasio sampel output yang akan digunakan jika frekuensi sampel yang dipilih berbeda dari media yang sedang diputar. nilai di bawah 8000 akan menggunakan frekuensi default",
|
||||
"savePlayQueue_description": "menyimpan antrean pemutaran saat aplikasi ditutup dan mengembalikannya saat dibuka",
|
||||
"scrobble": "scrobble",
|
||||
"scrobble_description": "melakukan scrobble pemutaran di server media Anda",
|
||||
"showSkipButton": "tampilkan tombol lompat",
|
||||
"showSkipButton_description": "menampilkan atau menyembunyikan tombol lompat di bilah pemutar",
|
||||
"showSkipButtons": "tampilkan tombol lompat",
|
||||
"showSkipButtons_description": "menampilkan atau menyembunyikan tombol lompat di bilah pemutar",
|
||||
"sidebarCollapsedNavigation": "navigasi sidebar (terlipat)",
|
||||
"sidebarCollapsedNavigation_description": "tampilkan atau sembunyikan navigasi di sidebar yang terlipat",
|
||||
"sidebarConfiguration": "pengaturan sidebar",
|
||||
"sidebarConfiguration_description": "pilih elemen dan urutan tampilannya di sidebar",
|
||||
"sidebarPlaylistList": "daftar putar sidebar",
|
||||
"sidebarPlaylistList_description": "tampilkan atau sembunyikan daftar putar di sidebar",
|
||||
"sidePlayQueueStyle": "gaya antrean pemutaran samping",
|
||||
"sidePlayQueueStyle_description": "menetapkan gaya antrean pemutaran samping",
|
||||
"sidePlayQueueStyle_optionAttached": "terpasang",
|
||||
"sidePlayQueueStyle_optionDetached": "terpisah",
|
||||
"skipDuration": "durasi lompat",
|
||||
"skipDuration_description": "tentukan durasi untuk lompat saat menggunakan tombol lompat di bilah pemutar",
|
||||
"skipPlaylistPage": "lompat halaman daftar putar",
|
||||
"skipPlaylistPage_description": "saat menavigasi ke daftar putar, pergi ke halaman daftar lagu dari daftar putar alih-alih halaman default",
|
||||
"startMinimized": "mulai dengan minimalkan",
|
||||
"startMinimized_description": "mulai aplikasi di baki sistem",
|
||||
"theme": "tema",
|
||||
"theme_description": "tentukan tema yang digunakan oleh aplikasi",
|
||||
"themeDark": "tema (gelap)",
|
||||
"themeDark_description": "tentukan tema gelap yang digunakan oleh aplikasi",
|
||||
"themeLight": "tema (terang)",
|
||||
"themeLight_description": "tentukan tema terang yang digunakan oleh aplikasi",
|
||||
"transcodeNote": "Akan ditampilkan setelah 1 (web) - 2 (mpv) lagu",
|
||||
"transcode": "aktifkan transkode",
|
||||
"transcode_description": "mengaktifkan transkode ke berbagai format",
|
||||
"transcodeBitrate": "bitrate untuk transkode",
|
||||
"transcodeBitrate_description": "pilih bitrate untuk ditranskode. 0 berarti biarkan server yang memilih",
|
||||
"transcodeFormat": "format untuk ditranskode",
|
||||
"transcodeFormat_description": "pilih format untuk ditranskode. biarkan kosong agar server yang memutuskan",
|
||||
"translationApiProvider": "Penyedia API penerjemahan",
|
||||
"translationApiProvider_description": "Penyedia API untuk penerjemahan",
|
||||
"translationApiKey": "kunci API penerjemahan",
|
||||
"translationApiKey_description": "Kunci API untuk penerjemahan (hanya untuk endpoint layanan global)",
|
||||
"translationTargetLanguage": "bahasa tujuan penerjemahan",
|
||||
"translationTargetLanguage_description": "bahasa tujuan untuk penerjemahan",
|
||||
"trayEnabled": "Tampilkan di area pemberitahuan",
|
||||
"trayEnabled_description": "tampilkan/sembunyikan ikon/menu di area pemberitahuan. Jika dinonaktifkan, juga menonaktifkan meminimalkan/keluar ke baki",
|
||||
"useSystemTheme": "gunakan tema sistem",
|
||||
"useSystemTheme_description": "ikuti preferensi terang atau gelap yang ditetapkan oleh sistem",
|
||||
"volumeWheelStep": "langkah roda volume",
|
||||
"volumeWheelStep_description": "jumlah volume yang berubah saat menggulirkan roda mouse pada penggeser volume",
|
||||
"volumeWidth": "Lebar penggeser volume",
|
||||
"volumeWidth_description": "Lebar penggeser volume",
|
||||
"webAudio": "gunakan audio web",
|
||||
"clearCache": "Bersihkan cache browser",
|
||||
"disableLibraryUpdateOnStartup": "nonaktifkan pemeriksaan versi baru saat startup",
|
||||
"language": "bahasa",
|
||||
"mpvExecutablePath": "jalur executable mpv",
|
||||
"mpvExtraParameters": "parameter tambahan mpv",
|
||||
"playButtonBehavior_optionPlay": "$t(player.play)",
|
||||
"sampleRate": "rasio sampel",
|
||||
"savePlayQueue": "simpan antrean pemutaran"
|
||||
},
|
||||
"table": {
|
||||
"column": {
|
||||
"album": "album",
|
||||
"albumArtist": "artis album",
|
||||
"albumCount": "$t(entity.album_other)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"biography": "biografi",
|
||||
"bitrate": "bitrate",
|
||||
"bpm": "lpm",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"codec": "$t(common.codec)",
|
||||
"comment": "komentar",
|
||||
"dateAdded": "tanggal ditambahkan",
|
||||
"discNumber": "nomor disk",
|
||||
"favorite": "favorit",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"lastPlayed": "terakhir diputar",
|
||||
"path": "jalur",
|
||||
"playCount": "putaran",
|
||||
"rating": "penilaian",
|
||||
"releaseDate": "tanggal rilis",
|
||||
"releaseYear": "tahun",
|
||||
"size": "$t(common.size)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"title": "judul",
|
||||
"trackNumber": "pista"
|
||||
},
|
||||
"config": {
|
||||
"general": {
|
||||
"autoFitColumns": "sesuaikan kolom otomatis",
|
||||
"followCurrentSong": "ikuti lagu saat ini",
|
||||
"displayType": "tipe tampilan",
|
||||
"gap": "$t(common.gap)",
|
||||
"itemGap": "jarak antar elemen (px)",
|
||||
"itemSize": "ukuran elemen (px)",
|
||||
"size": "$t(common.size)",
|
||||
"tableColumns": "kolom tabel"
|
||||
},
|
||||
"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": "tanggal ditambahkan",
|
||||
"discNumber": "nomor disk",
|
||||
"duration": "$t(common.duration)",
|
||||
"favorite": "$t(common.favorite)",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"lastPlayed": "terakhir diputar",
|
||||
"note": "$t(common.note)",
|
||||
"owner": "$t(common.owner)",
|
||||
"path": "$t(common.path)",
|
||||
"playCount": "jumlah putaran",
|
||||
"rating": "$t(common.rating)",
|
||||
"releaseDate": "tanggal rilis",
|
||||
"rowIndex": "indeks baris",
|
||||
"size": "$t(common.size)",
|
||||
"songCount": "$t(entity.track_other)",
|
||||
"title": "$t(common.title)",
|
||||
"titleCombined": "$t(common.title) (digabungkan)",
|
||||
"trackNumber": "nomor pista",
|
||||
"year": "$t(common.year)"
|
||||
},
|
||||
"view": {
|
||||
"card": "kartu",
|
||||
"poster": "poster",
|
||||
"table": "tabel"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+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つ星で評価",
|
||||
|
||||
+273
-1
@@ -9,6 +9,278 @@
|
||||
"editPlaylist": "$t(entity.playlist_one) 편집",
|
||||
"goToPage": "페이지 이동",
|
||||
"moveToBottom": "맨 아래로 이동",
|
||||
"moveToTop": "맨 위로 이동"
|
||||
"moveToTop": "맨 위로 이동",
|
||||
"moveToNext": "다음으로 이동",
|
||||
"removeFromQueue": "대기열에서 제거",
|
||||
"refresh": "$t(common.refresh)",
|
||||
"removeFromFavorites": "$t(entity.favorite_other)에서 제거",
|
||||
"removeFromPlaylist": "$t(entity.playlist_one)에서 제거",
|
||||
"openIn": {
|
||||
"musicbrainz": "MusicBrainz에서 보기",
|
||||
"lastfm": "Last.fm에서 보기"
|
||||
},
|
||||
"viewPlaylists": "$t(entity.playlist_other) 보기",
|
||||
"setRating": "평점 지정"
|
||||
},
|
||||
"common": {
|
||||
"translation": "번역",
|
||||
"resetToDefault": "기본 설정으로 되돌리기",
|
||||
"right": "오른쪽",
|
||||
"save": "저장",
|
||||
"increase": "증가",
|
||||
"version": "버전",
|
||||
"year": "년",
|
||||
"reset": "초기화",
|
||||
"random": "랜덤",
|
||||
"close": "닫기",
|
||||
"codec": "코덱",
|
||||
"create": "만들기",
|
||||
"disc": "디스크",
|
||||
"gap": "갭",
|
||||
"left": "왼쪽",
|
||||
"add": "추가",
|
||||
"backward": "뒤로",
|
||||
"saveAs": "(으)로 저장하기",
|
||||
"search": "검색",
|
||||
"setting": "설정",
|
||||
"share": "공유",
|
||||
"size": "크기",
|
||||
"sortOrder": "순서",
|
||||
"title": "곡명",
|
||||
"trackNumber": "트랙번호",
|
||||
"trackGain": "트랙 게인",
|
||||
"trackPeak": "트랙 피크",
|
||||
"unknown": "알 수 없음",
|
||||
"cancel": "취소",
|
||||
"clear": "지우기",
|
||||
"collapse": "접기",
|
||||
"comingSoon": "조만간…",
|
||||
"configure": "설정",
|
||||
"confirm": "확인",
|
||||
"currentSong": "현재 $t(entity.track_one)",
|
||||
"decrease": "감소",
|
||||
"delete": "삭제",
|
||||
"descending": "내림차순",
|
||||
"description": "설명",
|
||||
"disable": "비활성",
|
||||
"edit": "편집",
|
||||
"enable": "활성",
|
||||
"expand": "확장",
|
||||
"favorite": "즐겨찾기",
|
||||
"forceRestartRequired": "변경 사항을 적용하려면 재실행 하세요... 알림을 닫으면 재실행합니다",
|
||||
"forward": "앞으로",
|
||||
"limit": "제한",
|
||||
"manage": "관리하다",
|
||||
"maximize": "최대화",
|
||||
"menu": "메뉴",
|
||||
"minimize": "최소화",
|
||||
"modified": "수정된",
|
||||
"name": "이름",
|
||||
"path": "경로",
|
||||
"playerMustBePaused": "플레이어가 일시정지 되어야 합니다",
|
||||
"preview": "미리보기",
|
||||
"previousSong": "이전곡 $t(entity.track_one)",
|
||||
"quit": "종료",
|
||||
"refresh": "새로고침",
|
||||
"reload": "리로드",
|
||||
"restartRequired": "반드시 재실행되어야 합니다",
|
||||
"saveAndReplace": "저장하고 변경하기",
|
||||
"yes": "네",
|
||||
"ascending": "오름차순",
|
||||
"areYouSure": "확실한가요?",
|
||||
"bitrate": "비트 전송률",
|
||||
"bpm": "bpm",
|
||||
"biography": "바이오그래피",
|
||||
"center": "중앙",
|
||||
"channel_other": "채널",
|
||||
"filter_other": "필터",
|
||||
"mbid": "MusicBrainz ID",
|
||||
"dismiss": "닫기",
|
||||
"duration": "길이",
|
||||
"home": "홈",
|
||||
"no": "아니오",
|
||||
"none": "없음",
|
||||
"rating": "평점"
|
||||
},
|
||||
"entity": {
|
||||
"albumWithCount_other": "{{count}} 앨범",
|
||||
"artist_other": "아티스트",
|
||||
"artistWithCount_other": "{{count}} 아티스트",
|
||||
"favorite_other": "즐겨찾기",
|
||||
"folder_other": "폴더",
|
||||
"genre_other": "장르",
|
||||
"genreWithCount_other": "{{count}} 장르",
|
||||
"playlist_other": "플레이리스트",
|
||||
"album_other": "앨범",
|
||||
"albumArtist_other": "앨범 아티스트",
|
||||
"albumArtistCount_other": "{{count}} 앨범 아티스트",
|
||||
"folderWithCount_other": "{{count}} 폴더",
|
||||
"trackWithCount_other": "{{count}} 트랙",
|
||||
"song_other": "곡",
|
||||
"play_other": "{{count}} 재생",
|
||||
"playlistWithCount_other": "{{count}} 재생목록",
|
||||
"smartPlaylist": "스마트 $t(entity.playlist_one)",
|
||||
"track_other": "트랙"
|
||||
},
|
||||
"error": {
|
||||
"systemFontError": "시스템 폰트를 가져오는데 실패하였습니다",
|
||||
"loginRateError": "너무 많은 로그인 시도하였습니다 잠시 후 다시 시도해 주세요",
|
||||
"mpvRequired": "MPV 필요",
|
||||
"openError": "파일을 열 수 없습니다",
|
||||
"remoteDisableError": "원격 서버를 $t(common.disable) 하는데 실패하였습니다",
|
||||
"playbackError": "미디어를 재생하는 도중에 에러가 발생하였습니다",
|
||||
"remoteEnableError": "원격 서버를 $t(common.enable) 하는데 실패하였습니다",
|
||||
"serverNotSelectedError": "선택된 서버가 없습니다",
|
||||
"serverRequired": "서버가 필요합니다",
|
||||
"sessionExpiredError": "세션이 만료되었습니다",
|
||||
"networkError": "네트워크 에러가 발생하였습니다",
|
||||
"remotePortError": "원격 서버의 포트 설정하는데 실패하였습니다",
|
||||
"remotePortWarning": "새로 설정한 포트를 적용하기 위해 서버를 재실행 해 주세요",
|
||||
"audioDeviceFetchError": "오디오 장치를 불러올 수 없습니다",
|
||||
"authenticationFailed": "인증 실패",
|
||||
"badAlbum": "이 곡은 앨범의 일부가 아니기 때문에 표시되는 것입니다. 음악 폴더의 최상위에 곡이 있는 경우 이런 문제가 발생할 가능성이 높습니다. Jellyfin은 폴더 내 그룹만 추적합니다.",
|
||||
"credentialsRequired": "인증서가 필요함",
|
||||
"endpointNotImplementedError": "엔드포인트 {{endpoint}} 는 {{serverType}} 에 대해 구현되지 않았습니다",
|
||||
"genericError": "에러가 발생했습니다",
|
||||
"invalidServer": "잘못된 서버",
|
||||
"localFontAccessDenied": "로컬 글꼴에 접근 거부되었습니다"
|
||||
},
|
||||
"filter": {
|
||||
"title": "곡명",
|
||||
"isRecentlyPlayed": "최근에 재생한",
|
||||
"name": "이름",
|
||||
"path": "경로",
|
||||
"playCount": "재생 횟수",
|
||||
"random": "무작위",
|
||||
"recentlyAdded": "최근에 추가된",
|
||||
"releaseDate": "발매일",
|
||||
"recentlyPlayed": "최근에 재생된",
|
||||
"recentlyUpdated": "최근에 업데이트된",
|
||||
"search": "검색",
|
||||
"dateAdded": "추가된 날짜",
|
||||
"lastPlayed": "마지막으로 재생한",
|
||||
"mostPlayed": "가장 많이 재생한",
|
||||
"album": "$t(entity.album_one)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"communityRating": "커뮤니티 평점",
|
||||
"criticRating": "비평가 평점",
|
||||
"disc": "디스크",
|
||||
"bitrate": "비트 전송률",
|
||||
"biography": "바이오그래피",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"duration": "길이",
|
||||
"bpm": "bpm"
|
||||
},
|
||||
"form": {
|
||||
"addServer": {
|
||||
"title": "서버 추가하기",
|
||||
"success": "서버 추가하였습니다",
|
||||
"input_name": "서버 이름",
|
||||
"input_password": "비밀번호",
|
||||
"input_savePassword": "비밀번호 저장하기",
|
||||
"input_url": "url",
|
||||
"error_savePassword": "비밀번호를 저장하는 도중 오류가 발생했습니다",
|
||||
"ignoreCors": "CORS 무시 ($t(common.restartRequired))",
|
||||
"ignoreSsl": "SSL 무시 ($t(common.restartRequired))",
|
||||
"input_legacyAuthentication": "레거시 인증 사용",
|
||||
"input_username": "유저 이름"
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"input_skipDuplicates": "중복 건너뛰기",
|
||||
"title": "$t(entity.playlist_one) 에 추가",
|
||||
"input_playlists": "$t(entity.playlist_other)"
|
||||
},
|
||||
"lyricSearch": {
|
||||
"title": "가사 검색",
|
||||
"input_name": "$t(common.name)",
|
||||
"input_artist": "$t(entity.artist_one)"
|
||||
},
|
||||
"queryEditor": {
|
||||
"input_optionMatchAll": "모두 일치",
|
||||
"input_optionMatchAny": "무엇이든 일치"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"title": "$t(entity.playlist_one) 편집",
|
||||
"publicJellyfinNote": "Jellyfin은 재생목록 공개 여부를 노출하지 않습니다. 만약 공개되길 원한다면 다음을 선택하세요",
|
||||
"success": "$t(entity.playlist_one) 업데이트 되었습니다"
|
||||
},
|
||||
"shareItem": {
|
||||
"allowDownloading": "다운로드 허용",
|
||||
"description": "설명",
|
||||
"success": "클립보드에 공유 링크를 복사했습니다 (또는 열어보려면 클릭하세요)",
|
||||
"expireInvalid": "만료 날짜는 미래 날짜여야만 합니다",
|
||||
"createFailed": "공유 링크를 생성하는데 실패하였습니다 (혹시 공유하기 설정되어 있나요?)",
|
||||
"setExpiration": "만료 기간 설정하기"
|
||||
},
|
||||
"updateServer": {
|
||||
"title": "서버 업데이트",
|
||||
"success": "서버 업데이트 되었습니다"
|
||||
},
|
||||
"createPlaylist": {
|
||||
"input_description": "$t(common.description)",
|
||||
"input_name": "$t(common.name)",
|
||||
"success": "$t(entity.playlist_one)를 생성했습니다",
|
||||
"input_owner": "$t(common.owner)",
|
||||
"input_public": "공개",
|
||||
"title": "$t(entity.playlist_one) 생성"
|
||||
},
|
||||
"deletePlaylist": {
|
||||
"input_confirm": "확인을 위해 $t(entity.playlist_one)의 이름을 적어주세요",
|
||||
"success": "$t(entity.playlist_one)가 삭제되었습니다",
|
||||
"title": "$t(entity.playlist_one) 삭제"
|
||||
}
|
||||
},
|
||||
"page": {
|
||||
"appMenu": {
|
||||
"goBack": "뒤로",
|
||||
"selectServer": "서버를 선택하세요",
|
||||
"goForward": "앞으로",
|
||||
"manageServers": "서버 설정하기",
|
||||
"openBrowserDevtools": "브라우저 개발자 도구 열기",
|
||||
"version": "버전 {{version}}"
|
||||
},
|
||||
"manageServers": {
|
||||
"title": "서버 설정하기",
|
||||
"serverDetails": "서버 세부설정",
|
||||
"editServerDetailsTooltip": "서버 세부설정 편집하기",
|
||||
"url": "URL",
|
||||
"username": "username",
|
||||
"removeServer": "서버 제거하기"
|
||||
},
|
||||
"fullscreenPlayer": {
|
||||
"config": {
|
||||
"opacity": "투명도",
|
||||
"lyricAlignment": "가사 정렬",
|
||||
"useImageAspectRatio": "이미지 종횡비 사용",
|
||||
"synchronized": "동기화",
|
||||
"unsynchronized": "비동기화"
|
||||
},
|
||||
"lyrics": "가사"
|
||||
},
|
||||
"contextMenu": {
|
||||
"download": "다운로드",
|
||||
"numberSelected": "{{count}}개 선택됨"
|
||||
},
|
||||
"albumArtistDetail": {
|
||||
"about": "{{artist}}에 대해",
|
||||
"viewDiscography": "디스코그래피 보기",
|
||||
"appearsOn": "참여 앨범",
|
||||
"recentReleases": "최근 앨범",
|
||||
"relatedArtists": "연관 $t(entity.artist_other)"
|
||||
}
|
||||
},
|
||||
"table": {
|
||||
"config": {
|
||||
"label": {
|
||||
"playCount": "재생 횟수",
|
||||
"dateAdded": "추가된 날짜"
|
||||
},
|
||||
"view": {
|
||||
"card": "카드",
|
||||
"poster": "포스터",
|
||||
"table": "표"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+515
-1
@@ -1 +1,515 @@
|
||||
{}
|
||||
{
|
||||
"action": {
|
||||
"openIn": {
|
||||
"lastfm": "Åpne i Last.fm",
|
||||
"musicbrainz": "Åpne i MusicBrainz"
|
||||
},
|
||||
"moveToBottom": "flytt til bunnen",
|
||||
"deletePlaylist": "slett $t(entity.playlist_one)",
|
||||
"deselectAll": "avmarker alle",
|
||||
"editPlaylist": "rediger $t(entity.playlist_one)",
|
||||
"addToFavorites": "legg til $t(entity.favorite_other)",
|
||||
"addToPlaylist": "legg til $t(entity.playlist_one)",
|
||||
"clearQueue": "tøm kø",
|
||||
"createPlaylist": "opprett $t(entity.playlist_one)",
|
||||
"goToPage": "gå til side",
|
||||
"moveToTop": "flytt til toppen",
|
||||
"refresh": "$t(common.refresh)",
|
||||
"removeFromFavorites": "fjern fra $t(entity.favorite_other)",
|
||||
"moveToNext": "flytt til neste",
|
||||
"setRating": "angi vurdering",
|
||||
"removeFromQueue": "fjern fra kø",
|
||||
"removeFromPlaylist": "fjern fra $t(entity.playlist_one)",
|
||||
"viewPlaylists": "vise $t(entity.playlist_other)",
|
||||
"toggleSmartPlaylistEditor": "bytt $t(entity.smartPlaylist) editor"
|
||||
},
|
||||
"common": {
|
||||
"bpm": "bpm",
|
||||
"cancel": "avbryt",
|
||||
"center": "midtstill",
|
||||
"clear": "tøm",
|
||||
"collapse": "slå sammen",
|
||||
"configure": "konfigurer",
|
||||
"confirm": "bekreft",
|
||||
"currentSong": "gjeldende $t(entity.track_one)",
|
||||
"version": "versjon",
|
||||
"areYouSure": "er du sikker?",
|
||||
"ascending": "stigende",
|
||||
"backward": "bakover",
|
||||
"biography": "biografi",
|
||||
"bitrate": "bithastighet",
|
||||
"close": "lukk",
|
||||
"codec": "kodek",
|
||||
"comingSoon": "kommer snart…",
|
||||
"create": "opprett",
|
||||
"decrease": "minsk",
|
||||
"disable": "deaktiver",
|
||||
"disc": "skive",
|
||||
"duration": "lengde",
|
||||
"enable": "aktiver",
|
||||
"expand": "utvid",
|
||||
"favorite": "favoritt",
|
||||
"filters": "filter",
|
||||
"forceRestartRequired": "ta omstart for å la endringene trå i kraft... lukk meldingen for å ta omstart",
|
||||
"forward": "fremover",
|
||||
"gap": "avstand",
|
||||
"home": "hjem",
|
||||
"increase": "øke",
|
||||
"left": "venstre",
|
||||
"limit": "grense",
|
||||
"menu": "meny",
|
||||
"minimize": "minimer",
|
||||
"modified": "modifisert",
|
||||
"mbid": "MusicBrainz ID",
|
||||
"name": "navn",
|
||||
"no": "nei",
|
||||
"none": "ingen",
|
||||
"noResultsFromQuery": "spørringen ga ikke noe resultat",
|
||||
"note": "merke",
|
||||
"owner": "eier",
|
||||
"playerMustBePaused": "spilleren må settes på pause",
|
||||
"path": "sti",
|
||||
"previousSong": "forrige $t(entity.track_one)",
|
||||
"refresh": "frisk opp",
|
||||
"rating": "vurdering",
|
||||
"random": "vilkårlig",
|
||||
"reset": "tilbakestill",
|
||||
"restartRequired": "omstart nødvendig",
|
||||
"save": "lagre",
|
||||
"saveAs": "lagre som",
|
||||
"saveAndReplace": "lagre og overskriv",
|
||||
"search": "søk",
|
||||
"trackGain": "forsterkningsgrad spor",
|
||||
"trackPeak": "maksnivå spor",
|
||||
"translation": "oversettelse",
|
||||
"unknown": "ukjent",
|
||||
"preview": "forhåndsvisning",
|
||||
"share": "del",
|
||||
"quit": "avslutt",
|
||||
"size": "størrelse",
|
||||
"setting": "innstilling",
|
||||
"trackNumber": "spor",
|
||||
"title": "tittel",
|
||||
"channel_one": "kanal",
|
||||
"channel_other": "kanaler",
|
||||
"filter_one": "filter",
|
||||
"filter_other": "filter",
|
||||
"add": "legg til",
|
||||
"edit": "rediger",
|
||||
"resetToDefault": "nullstill",
|
||||
"ok": "ok",
|
||||
"reload": "last inn på nytt",
|
||||
"action_one": "handling",
|
||||
"action_other": "handlinger",
|
||||
"year": "år",
|
||||
"yes": "ja",
|
||||
"descending": "synkende",
|
||||
"dismiss": "lukk",
|
||||
"delete": "slett",
|
||||
"description": "beskrivelse",
|
||||
"manage": "håndtere",
|
||||
"maximize": "maksimer",
|
||||
"right": "høyre",
|
||||
"sortOrder": "rekkefølge",
|
||||
"tags": "tagger"
|
||||
},
|
||||
"entity": {
|
||||
"smartPlaylist": "smart $t(entity.playlist_one)",
|
||||
"album_one": "album",
|
||||
"album_other": "album",
|
||||
"albumArtist_one": "albumartist",
|
||||
"albumArtist_other": "albumartister",
|
||||
"albumArtistCount_one": "{{count}} albumartist",
|
||||
"albumArtistCount_other": "{{count}} albumartister",
|
||||
"albumWithCount_one": "{{count}} album",
|
||||
"albumWithCount_other": "{{count}} album",
|
||||
"favorite_one": "favoritt",
|
||||
"favorite_other": "favoritter",
|
||||
"folder_one": "mappe",
|
||||
"folder_other": "mapper",
|
||||
"play_one": "{{count}} avspilling",
|
||||
"play_other": "{{count}} avspillinger",
|
||||
"playlistWithCount_one": "{{count}} spilleliste",
|
||||
"playlistWithCount_other": "{{count}} spillelister",
|
||||
"artistWithCount_one": "{{count}} artist",
|
||||
"artistWithCount_other": "{{count}} artister",
|
||||
"genre_one": "sjanger",
|
||||
"genre_other": "sjangere",
|
||||
"track_one": "spor",
|
||||
"track_other": "spor",
|
||||
"genreWithCount_one": "{{count}} sjanger",
|
||||
"genreWithCount_other": "{{count}} sjangere",
|
||||
"playlist_one": "spilleliste",
|
||||
"playlist_other": "spillelister",
|
||||
"folderWithCount_one": "{{count}} mappe",
|
||||
"folderWithCount_other": "{{count}} mapper",
|
||||
"trackWithCount_one": "{{count}} spor",
|
||||
"trackWithCount_other": "{{count}} spor",
|
||||
"artist_one": "artist",
|
||||
"artist_other": "artister",
|
||||
"song_one": "sang",
|
||||
"song_other": "sanger"
|
||||
},
|
||||
"error": {
|
||||
"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.",
|
||||
"endpointNotImplementedError": "endepunkt {{endpoint}} er ikke implementert for {{serverType}}",
|
||||
"credentialsRequired": "innloggingsdetaljer er påkrevd",
|
||||
"genericError": "en feil har oppstått",
|
||||
"invalidServer": "ugyldig server",
|
||||
"playbackError": "et problem oppstod ved avspilling av media",
|
||||
"localFontAccessDenied": "ingen tilgang til lokale skrifttyper",
|
||||
"loginRateError": "for mange innloggingsforsøk, vennligst prøv igjen om noen få sekunder",
|
||||
"audioDeviceFetchError": "en feil oppstod ved innhenting av lydenheter",
|
||||
"networkError": "at nettverksproblem har oppstått",
|
||||
"openError": "kunne ikke åpne fil",
|
||||
"serverNotSelectedError": "ingen server er valgt",
|
||||
"remotePortError": "et problem oppstod med å sette serverport",
|
||||
"systemFontError": "et problem oppstod med innlasting av systemskrifttyper",
|
||||
"serverRequired": "server er påkrevd",
|
||||
"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"
|
||||
},
|
||||
"filter": {
|
||||
"bpm": "bpm",
|
||||
"criticRating": "kritikervurdering",
|
||||
"id": "id",
|
||||
"name": "navn",
|
||||
"bitrate": "bithastighet",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"artist": "$t(entity.artist_one)",
|
||||
"biography": "biografi",
|
||||
"album": "$t(entity.album_one)",
|
||||
"duration": "lengde",
|
||||
"favorited": "merket som favoritt",
|
||||
"comment": "kommentar",
|
||||
"communityRating": "fellesskapsvurdering",
|
||||
"dateAdded": "lagt til dato",
|
||||
"disc": "skive",
|
||||
"isPublic": "er offentlig",
|
||||
"isRecentlyPlayed": "er avspilt nylig",
|
||||
"mostPlayed": "mest avspilt",
|
||||
"owner": "$t(common.owner)",
|
||||
"path": "sti",
|
||||
"lastPlayed": "sist avspilt",
|
||||
"rating": "vurdering",
|
||||
"recentlyPlayed": "nylig avspilt",
|
||||
"playCount": "antall avspillinger",
|
||||
"recentlyUpdated": "nylig oppdatert",
|
||||
"random": "vilkårlig",
|
||||
"search": "søk",
|
||||
"songCount": "antall sanger",
|
||||
"title": "tittel",
|
||||
"toYear": "til år",
|
||||
"releaseDate": "utgivelsesdato",
|
||||
"releaseYear": "utgivelsesår",
|
||||
"note": "notat",
|
||||
"isRated": "er vurdert",
|
||||
"fromYear": "fra år",
|
||||
"isCompilation": "er samling",
|
||||
"isFavorited": "er merket som favoritt",
|
||||
"recentlyAdded": "nylig lagt til",
|
||||
"channels": "$t(common.channel_other)",
|
||||
"genre": "$t(entity.genre_one)",
|
||||
"trackNumber": "spor"
|
||||
},
|
||||
"form": {
|
||||
"createPlaylist": {
|
||||
"input_description": "$t(common.description)",
|
||||
"input_owner": "$t(common.owner)",
|
||||
"input_public": "offentlig",
|
||||
"title": "opprett $t(entity.playlist_one)",
|
||||
"input_name": "$t(common.name)",
|
||||
"success": "$t(entity.playlist_one) opprettet"
|
||||
},
|
||||
"lyricSearch": {
|
||||
"input_artist": "$t(entity.artist_one)",
|
||||
"input_name": "$t(common.name)",
|
||||
"title": "sangtekstsøk"
|
||||
},
|
||||
"addServer": {
|
||||
"ignoreCors": "ignorer cors ($t(common.restartRequired))",
|
||||
"ignoreSsl": "ignorer ssl ($t(common.restartRequired))",
|
||||
"error_savePassword": "et problem oppstod ved lagring av passord",
|
||||
"input_savePassword": "lagre passord",
|
||||
"input_url": "lenke",
|
||||
"input_username": "brukernavn",
|
||||
"success": "serveren er lagt til",
|
||||
"input_legacyAuthentication": "aktiver tradisjonell autentisering",
|
||||
"input_name": "servernavn",
|
||||
"title": "legg til server",
|
||||
"input_password": "passord"
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"success": "la $t(entity.trackWithCount, {\"count\": {{message}} }) til $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })",
|
||||
"title": "legg til i $t(entity.playlist_one)",
|
||||
"input_skipDuplicates": "hopp over duplikater",
|
||||
"input_playlists": "$t(entity.playlist_other)"
|
||||
},
|
||||
"deletePlaylist": {
|
||||
"title": "slett $t(entity.playlist_one)",
|
||||
"success": "$t(entity.playlist_one) er slettet",
|
||||
"input_confirm": "skrive inn navnet på $t(entity.playlist_one) for å bekrefte"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"title": "rediger $t(entity.playlist_one)",
|
||||
"success": "$t(entity.playlist_one) er oppdatert"
|
||||
},
|
||||
"shareItem": {
|
||||
"allowDownloading": "tillat nedlasting",
|
||||
"description": "beskrivelse",
|
||||
"createFailed": "opprettelse av delt ressurs feilet (er deling aktivert?)",
|
||||
"setExpiration": "angi utløpstid",
|
||||
"success": "del lenke som er kopiert til utklippstavlen (eller klikk her for å åpne)",
|
||||
"expireInvalid": "utløpstid må være et fremtidig tidspunkt"
|
||||
},
|
||||
"updateServer": {
|
||||
"success": "vellykket oppdatering av serveren",
|
||||
"title": "oppdater server"
|
||||
},
|
||||
"queryEditor": {
|
||||
"input_optionMatchAll": "match alle",
|
||||
"input_optionMatchAny": "matche hvilken som helst"
|
||||
}
|
||||
},
|
||||
"page": {
|
||||
"appMenu": {
|
||||
"collapseSidebar": "slå sammen sidefelt",
|
||||
"quit": "$t(common.quit)",
|
||||
"selectServer": "velg server",
|
||||
"version": "versjon {{version}}",
|
||||
"manageServers": "administrere servere",
|
||||
"goBack": "gå tilbake",
|
||||
"openBrowserDevtools": "åpne utviklingsverktøy i nettleser",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"expandSidebar": "utvid sidefelt",
|
||||
"goForward": "gå fremover"
|
||||
},
|
||||
"contextMenu": {
|
||||
"addToPlaylist": "$t(action.addToPlaylist)",
|
||||
"showDetails": "hent info",
|
||||
"moveToTop": "$t(action.moveToTop)",
|
||||
"moveToBottom": "$t(action.moveToBottom)",
|
||||
"numberSelected": "{{count}} valgt",
|
||||
"addLast": "$t(player.addLast)",
|
||||
"addNext": "$t(player.addNext)",
|
||||
"createPlaylist": "$t(action.createPlaylist)",
|
||||
"play": "$t(player.play)",
|
||||
"removeFromFavorites": "$t(action.removeFromFavorites)",
|
||||
"download": "last ned",
|
||||
"playSimilarSongs": "$t(player.playSimilarSongs)",
|
||||
"removeFromPlaylist": "$t(action.removeFromPlaylist)",
|
||||
"removeFromQueue": "$t(action.removeFromQueue)",
|
||||
"setRating": "$t(action.setRating)",
|
||||
"addToFavorites": "$t(action.addToFavorites)",
|
||||
"moveToNext": "$t(action.moveToNext)",
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"shareItem": "del element",
|
||||
"addFavorite": "$t(action.addToFavorites)",
|
||||
"deletePlaylist": "$t(action.deletePlaylist)",
|
||||
"deselectAll": "$t(action.deselectAll)"
|
||||
},
|
||||
"albumArtistDetail": {
|
||||
"topSongs": "beste sanger",
|
||||
"viewDiscography": "se diskografi",
|
||||
"recentReleases": "nylige utgivelser",
|
||||
"topSongsFrom": "beste sanger fra {{title}}",
|
||||
"viewAllTracks": "se alle $t(entity.track_other)",
|
||||
"viewAll": "se alle",
|
||||
"about": "Om {{artist}}",
|
||||
"appearsOn": "opptrer på",
|
||||
"relatedArtists": "relatert $t(entity.artist_other)"
|
||||
},
|
||||
"albumList": {
|
||||
"artistAlbums": "album av {{artist}}",
|
||||
"genreAlbums": "\"{{genre}}\" $t(entity.album_other)",
|
||||
"title": "$t(entity.album_other)"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "mer fra denne $t(entity.artist_one)",
|
||||
"moreFromGeneric": "mer fra {{item}}",
|
||||
"released": "utgitt"
|
||||
},
|
||||
"fullscreenPlayer": {
|
||||
"config": {
|
||||
"dynamicIsImage": "aktiver bakgrunnsbilde",
|
||||
"lyricGap": "sangtekstavstand",
|
||||
"dynamicImageBlur": "bilduskarphetstørrelse",
|
||||
"lyricAlignment": "sangtekstjustering",
|
||||
"lyricOffset": "sangtekstforskyvning (ms)",
|
||||
"lyricSize": "sangtekststørrelse",
|
||||
"opacity": "absorpsjon",
|
||||
"showLyricMatch": "vis sangteksttreff",
|
||||
"showLyricProvider": "vis sangteksttilbyder",
|
||||
"synchronized": "synkronisert",
|
||||
"unsynchronized": "usynkronisert",
|
||||
"dynamicBackground": "dynamisk bakgrunn",
|
||||
"useImageAspectRatio": "bruk sideforhold til bildet",
|
||||
"followCurrentLyric": "følg sangtekst"
|
||||
},
|
||||
"noLyrics": "fant ikke sangtekst",
|
||||
"lyrics": "sangtekst",
|
||||
"upNext": "kommende",
|
||||
"visualizer": "fremviser",
|
||||
"related": "relatert"
|
||||
},
|
||||
"genreList": {
|
||||
"title": "$t(entity.genre_other)",
|
||||
"showAlbums": "vis $t(entity.genre_one) $t(entity.album_other)",
|
||||
"showTracks": "vis $t(entity.genre_one) $t(entity.track_other)"
|
||||
},
|
||||
"globalSearch": {
|
||||
"title": "kommandoer",
|
||||
"commands": {
|
||||
"goToPage": "gå til side",
|
||||
"searchFor": "søk etter {{query}}",
|
||||
"serverCommands": "serverkommandoer"
|
||||
}
|
||||
},
|
||||
"home": {
|
||||
"recentlyPlayed": "nylig avspilt",
|
||||
"explore": "utforsk biblioteket ditt",
|
||||
"mostPlayed": "mest spilt",
|
||||
"newlyAdded": "utgivelser nylig lagt til",
|
||||
"title": "$t(common.home)"
|
||||
},
|
||||
"manageServers": {
|
||||
"title": "administrere servere",
|
||||
"url": "lenke",
|
||||
"username": "brukernavn",
|
||||
"editServerDetailsTooltip": "rediger serverdetaljer",
|
||||
"removeServer": "fjern server",
|
||||
"serverDetails": "serverdetaljer"
|
||||
},
|
||||
"itemDetail": {
|
||||
"openFile": "vis spor i filbhehandleren",
|
||||
"copiedPath": "vellykket kopiering av stien",
|
||||
"copyPath": "kopier stien til utklippstavlen"
|
||||
},
|
||||
"trackList": {
|
||||
"genreTracks": "\"{{genre}}\" $t(entity.track_other)",
|
||||
"title": "$t(entity.track_other)",
|
||||
"artistTracks": "spor fra {{artist}}"
|
||||
},
|
||||
"sidebar": {
|
||||
"albumArtists": "$t(entity.albumArtist_other)",
|
||||
"tracks": "$t(entity.track_other)",
|
||||
"nowPlaying": "spilles nå",
|
||||
"folders": "$t(entity.folder_other)",
|
||||
"genres": "$t(entity.genre_other)",
|
||||
"home": "$t(common.home)",
|
||||
"albums": "$t(entity.album_other)",
|
||||
"playlists": "$t(entity.playlist_other)",
|
||||
"search": "$t(common.search)",
|
||||
"settings": "$t(common.setting_other)",
|
||||
"shared": "delt $t(entity.playlist_other)",
|
||||
"artists": "$t(entity.artist_other)",
|
||||
"myLibrary": "mitt bibliotek"
|
||||
},
|
||||
"setting": {
|
||||
"generalTab": "generelt",
|
||||
"advanced": "avansert",
|
||||
"hotkeysTab": "hurtigtaster",
|
||||
"playbackTab": "avspilling",
|
||||
"windowTab": "vindu"
|
||||
},
|
||||
"playlistList": {
|
||||
"title": "$t(entity.playlist_other)"
|
||||
},
|
||||
"playlist": {
|
||||
"reorder": "omorganisering kun mulig ved sortering på id"
|
||||
}
|
||||
},
|
||||
"player": {
|
||||
"addLast": "legg til sist",
|
||||
"queue_remove": "fjern valgte",
|
||||
"queue_moveToBottom": "flytt valgte til toppen",
|
||||
"addNext": "legg til som neste",
|
||||
"favorite": "favoritt",
|
||||
"mute": "skru av lyden",
|
||||
"muted": "lyden er skrudd av",
|
||||
"next": "neste",
|
||||
"repeat_all": "gjenta alle",
|
||||
"playbackFetchCancel": "dette kommer til å ta en stund... lukk denne meldingen for å avbryte",
|
||||
"playRandom": "spill vilkårlig",
|
||||
"queue_clear": "tøm kø",
|
||||
"repeat_off": "gjentakelse er deaktivert",
|
||||
"playbackFetchInProgress": "laster sanger…",
|
||||
"repeat": "gjenta",
|
||||
"play": "spill",
|
||||
"previous": "forrige",
|
||||
"queue_moveToTop": "flytt valgte til bunnen",
|
||||
"playbackFetchNoResults": "ingen sanger funnet",
|
||||
"playbackSpeed": "avspillingshastighet",
|
||||
"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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+98
-19
@@ -20,7 +20,8 @@
|
||||
"openIn": {
|
||||
"lastfm": "Otwórz w Last.fm",
|
||||
"musicbrainz": "Otwórz w MusicBrainz"
|
||||
}
|
||||
},
|
||||
"moveToNext": "przesuń na następne"
|
||||
},
|
||||
"common": {
|
||||
"increase": "zwiększ",
|
||||
@@ -113,7 +114,8 @@
|
||||
"trackPeak": "peak utworu",
|
||||
"codec": "kodek",
|
||||
"preview": "podgląd",
|
||||
"close": "zamknij"
|
||||
"close": "zamknij",
|
||||
"translation": "tłumaczenie"
|
||||
},
|
||||
"entity": {
|
||||
"genre_one": "gatunek",
|
||||
@@ -161,7 +163,13 @@
|
||||
"genreWithCount_many": "{{count}} gatunków",
|
||||
"trackWithCount_one": "{{count}} utwór",
|
||||
"trackWithCount_few": "{{count}} utwory",
|
||||
"trackWithCount_many": "{{count}} utworów"
|
||||
"trackWithCount_many": "{{count}} utworów",
|
||||
"play_one": "{{count}} odtworzenie",
|
||||
"play_few": "{{count}} odtworzenia",
|
||||
"play_many": "{{count}} odtworzeń",
|
||||
"song_one": "piosenka",
|
||||
"song_few": "piosenki",
|
||||
"song_many": "piosenek"
|
||||
},
|
||||
"error": {
|
||||
"remotePortWarning": "uruchom ponownie serwer aby używać nowego portu",
|
||||
@@ -259,7 +267,7 @@
|
||||
"error_savePassword": "wystąpił błąd podczas próby zapisania hasła"
|
||||
},
|
||||
"addToPlaylist": {
|
||||
"success": "dodano {{message}} $t(entity.track_other) do {{numOfPlaylists}} $t(entity.playlist_other)",
|
||||
"success": "dodano $t(entity.trackWithCount, {\"count\": {{message}} }) do $t(entity.playlistWithCount, {\"count\": {{numOfPlaylists}} })",
|
||||
"title": "dodano do $t(entity.playlist_one)",
|
||||
"input_skipDuplicates": "pomiń duplikaty",
|
||||
"input_playlists": "$t(entity.playlist_other)"
|
||||
@@ -278,7 +286,9 @@
|
||||
"title": "wyszukiwanie tekstów"
|
||||
},
|
||||
"editPlaylist": {
|
||||
"title": "edytuj $t(entity.playlist_one)"
|
||||
"title": "edytuj $t(entity.playlist_one)",
|
||||
"success": "$t(entity.playlist_one) zaktualizowana pomyślnie",
|
||||
"publicJellyfinNote": "Z jakiegoś powodu Jellyfin nie udostępnia informacji na temat publiczności playlisty. Jeżeli chcesz, aby ta pozostała publiczna, mniej wybraną poniższą opcję"
|
||||
},
|
||||
"shareItem": {
|
||||
"allowDownloading": "zezwól na pobieranie",
|
||||
@@ -304,11 +314,14 @@
|
||||
"useImageAspectRatio": "użyj współczynnika proporcji obrazu",
|
||||
"lyricGap": "odstępy tekstu",
|
||||
"dynamicImageBlur": "rozmiar rozmycia obrazu",
|
||||
"dynamicIsImage": "włącz obraz w tle"
|
||||
"dynamicIsImage": "włącz obraz w tle",
|
||||
"lyricOffset": "opóźnienie tekstów (ms)"
|
||||
},
|
||||
"upNext": "następny",
|
||||
"lyrics": "tekst",
|
||||
"related": "powiązane"
|
||||
"related": "powiązane",
|
||||
"visualizer": "wizualizer",
|
||||
"noLyrics": "nie znaleziono tekstu"
|
||||
},
|
||||
"appMenu": {
|
||||
"selectServer": "wybierz serwer",
|
||||
@@ -340,11 +353,16 @@
|
||||
"numberSelected": "zaznaczono {{count}}",
|
||||
"removeFromQueue": "$t(action.removeFromQueue)",
|
||||
"shareItem": "udostępnij pozycję",
|
||||
"showDetails": "zobacz informacje"
|
||||
"showDetails": "zobacz informacje",
|
||||
"download": "pobierz",
|
||||
"playShuffled": "$t(player.shuffle)",
|
||||
"playSimilarSongs": "$t(player.playSimilarSongs)",
|
||||
"moveToNext": "$t(action.moveToNext)"
|
||||
},
|
||||
"albumDetail": {
|
||||
"moreFromArtist": "więcej od $t(entity.artist_one)",
|
||||
"moreFromGeneric": "więcej od {{item}}"
|
||||
"moreFromGeneric": "więcej od {{item}}",
|
||||
"released": "wydany"
|
||||
},
|
||||
"albumArtistList": {
|
||||
"title": "$t(entity.albumArtist_other)"
|
||||
@@ -384,7 +402,8 @@
|
||||
"playbackTab": "odtworzenia",
|
||||
"generalTab": "ogólne",
|
||||
"hotkeysTab": "skróty klawiszowe",
|
||||
"windowTab": "okno"
|
||||
"windowTab": "okno",
|
||||
"advanced": "zaawansowane"
|
||||
},
|
||||
"trackList": {
|
||||
"title": "$t(entity.track_other)",
|
||||
@@ -417,6 +436,17 @@
|
||||
"copyPath": "kopiuj ścieżkę do schowka",
|
||||
"copiedPath": "ścieżka została skopiowana pomyślnie",
|
||||
"openFile": "pokaż utwór w menedżerze plików"
|
||||
},
|
||||
"manageServers": {
|
||||
"title": "zarządzaj serwerami",
|
||||
"url": "URL",
|
||||
"username": "nazwa użytkownika",
|
||||
"removeServer": "usuń serwer",
|
||||
"serverDetails": "szczegóły serwera",
|
||||
"editServerDetailsTooltip": "edytuj szczegóły serwera"
|
||||
},
|
||||
"playlist": {
|
||||
"reorder": "zmiana kolejności jest możliwa tylko podczas sortowania według id"
|
||||
}
|
||||
},
|
||||
"player": {
|
||||
@@ -431,7 +461,7 @@
|
||||
"skip_back": "przeskocz do tyłu",
|
||||
"favorite": "ulubione",
|
||||
"next": "następny",
|
||||
"shuffle": "losowa kolejność",
|
||||
"shuffle": "odtwarzaj losowo",
|
||||
"playbackFetchNoResults": "nie znaleziono utworów",
|
||||
"playbackFetchInProgress": "wczytywanie utworów…",
|
||||
"addNext": "dodaj następny",
|
||||
@@ -448,7 +478,9 @@
|
||||
"shuffle_off": "losowa kolejność wyłączona",
|
||||
"addLast": "dodaj na końcu",
|
||||
"mute": "wycisz",
|
||||
"skip_forward": "przeskocz do przodu"
|
||||
"skip_forward": "przeskocz do przodu",
|
||||
"viewQueue": "zobacz kolejkę",
|
||||
"playSimilarSongs": "odtwarzaj podobne"
|
||||
},
|
||||
"setting": {
|
||||
"crossfadeStyle_description": "wybierz styl przenikania, który ma być używany do odtwarzania dźwięku",
|
||||
@@ -471,7 +503,7 @@
|
||||
"hotkey_rate1": "oceń na 1 gwiazdkę",
|
||||
"hotkey_skipForward": "przeskocz do przodu",
|
||||
"disableLibraryUpdateOnStartup": "wyłącz wyszukiwanie aktualizacji podczas uruchamiania aplikacji",
|
||||
"discordApplicationId_description": "id dla aplikacji {{discord}} obszernie obecne (domyślnie {{defaultId}})",
|
||||
"discordApplicationId_description": "id dla aplikacji {{discord}} rich presence (domyślnie {{defaultId}})",
|
||||
"gaplessAudio": "dźwięk bez przerw",
|
||||
"hotkey_playbackPlay": "odtwarzaj",
|
||||
"hotkey_togglePreviousSongFavorite": "dodaj $t(common.previousSong) do ulubionych",
|
||||
@@ -501,7 +533,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",
|
||||
@@ -522,7 +554,7 @@
|
||||
"customFontPath": "niestandardowa ścieżka czcionki",
|
||||
"followLyric": "podążaj za tekstem",
|
||||
"crossfadeDuration": "czas trwania przenikania",
|
||||
"discordIdleStatus": "pokaż obszerne informacje w stanie bezczynności",
|
||||
"discordIdleStatus": "pokaż status w stanie bezczynności",
|
||||
"audioPlayer": "odtwarzacz dźwięku",
|
||||
"hotkey_zoomOut": "oddal",
|
||||
"hotkey_unfavoriteCurrentSong": "usuń $t(common.currentSong) z ulubionych",
|
||||
@@ -537,7 +569,7 @@
|
||||
"customFontPath_description": "ustaw ścieżkę dla niestandardowych czcionek dla aplikacji",
|
||||
"gaplessAudio_optionWeak": "słabe (rekomendowane)",
|
||||
"hotkey_playbackStop": "zatrzymaj",
|
||||
"discordRichPresence": "{{discord}} obszernie obecny",
|
||||
"discordRichPresence": "Status {{discord}} (rich presence)",
|
||||
"font_description": "ustaw czcionkę dla aplikacji",
|
||||
"playButtonBehavior_optionPlay": "$t(player.play)",
|
||||
"minimumScrobblePercentage": "minimalny czas trwania scrobble (procentowy)",
|
||||
@@ -630,7 +662,52 @@
|
||||
"genreBehavior": "domyślne zachowanie strony gatunek",
|
||||
"externalLinks_description": "umożliwia wyświetlanie linków zewnętrznych (Last.fm, MusicBrainz) na stronach artystów/albumów",
|
||||
"homeConfiguration": "konfiguracja strony głównej",
|
||||
"homeConfiguration_description": "konfiguracja elementów wyświetlanych na stronie głównej i ich kolejności"
|
||||
"homeConfiguration_description": "konfiguracja elementów wyświetlanych na stronie głównej i ich kolejności",
|
||||
"albumBackground_description": "dodaje obraz tła dla stron albumu zawierających grafikę albumu",
|
||||
"albumBackgroundBlur": "rozmiar rozmycia obrazu tła albumu",
|
||||
"albumBackgroundBlur_description": "dostosowywuje ilość rozmycia nakladanego na obraz tła albumu",
|
||||
"albumBackground": "obraz tła albumu",
|
||||
"artistConfiguration_description": "skonfiguruj jakie elementy są pokazywane, i w jakiej kolejności, na stronie albumu wykonawcy",
|
||||
"discordListening_description": "pokazuje status jako słucha zamiast w grze",
|
||||
"transcodeNote": "przynosi efekt po 1 (web) - 2 (mpv) piosenkach",
|
||||
"transcode_description": "włącza transkodowanie na inne formaty",
|
||||
"transcodeBitrate": "bitrate do transkodowania",
|
||||
"transcode": "włącz transkodowanie",
|
||||
"translationApiProvider": "usługodawca do api tłumaczeń",
|
||||
"translationApiProvider_description": "wybór usługodawcy do api tłumaczeń",
|
||||
"translationApiKey": "klucz api do tłumaczeń",
|
||||
"transcodeFormat_description": "wybiera format do transkodowania. zostaw pusty aby serwer wybrał format",
|
||||
"translationApiKey_description": "klucz api do tłumaczenia (Obsługuje tylko globalny endpoint)",
|
||||
"homeFeature": "karuzela polecanych na stronie głównej",
|
||||
"customCssEnable": "włącz niestandardowy css",
|
||||
"customCssEnable_description": "pozwalaj na pisanie niestandardowego css.",
|
||||
"customCssNotice": "Ostrzeżenie: chociaż istnieje pewne filtrowanie (uniemożliwia używanie url() i content:), używanie niestandardowego CSS-a może stwarzać ryzyko przez zmiany w interfejsie.",
|
||||
"customCss_description": "zawartość niestandardowego css. Uwaga: content i zdalne url są niedozwolonymi właściwościami. Podgląd twojej zawartości jest pokazana poniżej. Dodatkowe pola których nie ustawiłeś, są obecne z powodu sanityzacji.",
|
||||
"customCss": "niestandardowy css",
|
||||
"doubleClickBehavior": "zakolejkuj wszystkie wyszukane utwory gdy podwójnie kliknięto",
|
||||
"trayEnabled_description": "pokaż/ukryj ikonę/menu w zasobniku. jeżeli wyłączone, wyłącza też minimalizowanie.wyjście do zasobnika",
|
||||
"webAudio_description": "używaj web audio. włącza to zaawansowane funkcje takie jak replaygain. wyłącz jeżeli nie działa poprawnie",
|
||||
"artistConfiguration": "konfiguracja strony albumu wykonawcy",
|
||||
"playButtonBehavior_optionPlayShuffled": "$t(player.shuffle)",
|
||||
"playerbarOpenDrawer_description": "pozwala przełączyć na odtwarzacz pełnoekranowy po kliknięciu paska odtwarzania",
|
||||
"playerbarOpenDrawer": "przełącznik pełnego ekranu na pasku odtwarzania",
|
||||
"imageAspectRatio": "używaj natywnych proporcji okładki",
|
||||
"volumeWidth": "szerokość paska głośności",
|
||||
"discordListening": "pokazuj status jako słucha",
|
||||
"imageAspectRatio_description": "jeżeli włączone, okładka będzie pokazywana z użyciem jej natywnych proporcji. dla okładek które nie mają proporcji 1:1, pozostałe miejsce będzie puste",
|
||||
"volumeWidth_description": "szerokość paska głośności",
|
||||
"contextMenu_description": "pozwala ci na ukrycie elementów które są pokazywane w menu po kliknięciu prawym przyciskiem myszy na element. elementy które zostały odznaczone będą ukryte",
|
||||
"contextMenu": "konfiguracja menu kontekstowego (pod prawym przyciskiem myszy)",
|
||||
"transcodeBitrate_description": "wybiera bitrate do transkodowania. 0 pozwala wybrać to serwerowi",
|
||||
"transcodeFormat": "format do transkodowania",
|
||||
"translationTargetLanguage_description": "język do którego będzie tłumaczona treść",
|
||||
"trayEnabled": "pokazuj w zasobniku",
|
||||
"webAudio": "używaj web audio",
|
||||
"homeFeature_description": "ustawienie powoduje to czy wyświetlana jest karuzela z polecanymi utworami na stronie głównej",
|
||||
"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"
|
||||
},
|
||||
"table": {
|
||||
"config": {
|
||||
@@ -646,7 +723,8 @@
|
||||
"autoFitColumns": "automatyczne dopasowanie kolumn",
|
||||
"size": "$t(common.size)",
|
||||
"itemSize": "rozmiar elementu (px)",
|
||||
"itemGap": "odstęp między elementami (px)"
|
||||
"itemGap": "odstęp między elementami (px)",
|
||||
"followCurrentSong": "śledź aktualną piosenkę"
|
||||
},
|
||||
"label": {
|
||||
"releaseDate": "data premiery",
|
||||
@@ -675,7 +753,8 @@
|
||||
"favorite": "$t(common.favorite)",
|
||||
"year": "$t(common.year)",
|
||||
"albumArtist": "$t(entity.albumArtist_one)",
|
||||
"codec": "$t(common.codec)"
|
||||
"codec": "$t(common.codec)",
|
||||
"songCount": "$t(entity.track_other)"
|
||||
}
|
||||
},
|
||||
"column": {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user