mirror of
https://github.com/fallenbagel/jellyseerr.git
synced 2025-12-24 02:39:18 -05:00
Compare commits
22 Commits
preview-je
...
feat-serve
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dd2c752cf7 | ||
|
|
dc34d6c1f6 | ||
|
|
d868082b56 | ||
|
|
e531765dac | ||
|
|
58eb91530b | ||
|
|
80f63017ac | ||
|
|
0c7e652672 | ||
|
|
bd4da6d5fc | ||
|
|
12f908de7f | ||
|
|
61dcd8e487 | ||
|
|
9aee8887d3 | ||
|
|
2348f23f43 | ||
|
|
74a2d25f15 | ||
|
|
a2c2d261fc | ||
|
|
71acfb1b1f | ||
|
|
29a32d0391 | ||
|
|
f7be4789a2 | ||
|
|
181cb19048 | ||
|
|
32c77f9e94 | ||
|
|
b43c1e350e | ||
|
|
64453320d3 | ||
|
|
36d98a2681 |
@@ -403,6 +403,42 @@
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "mobihen",
|
||||
"name": "Nir Israel Hen",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/35529491?v=4",
|
||||
"profile": "https://mobihen.com",
|
||||
"contributions": [
|
||||
"translation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "XDark187",
|
||||
"name": "Baraa",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/39034192?v=4",
|
||||
"profile": "https://github.com/XDark187",
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "franciscofsales",
|
||||
"name": "Francisco Sales",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/7977645?v=4",
|
||||
"profile": "https://github.com/franciscofsales",
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "myselfolli",
|
||||
"name": "Oliver Laing",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/37535998?v=4",
|
||||
"profile": "https://github.com/myselfolli",
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
2
.github/CODEOWNERS
vendored
2
.github/CODEOWNERS
vendored
@@ -1,2 +1,2 @@
|
||||
# Global code ownership
|
||||
* @Fallenbagel
|
||||
* @Fallenbagel @gauthier-th
|
||||
|
||||
11
README.md
11
README.md
@@ -11,7 +11,7 @@
|
||||
<a href="http://jellyseerr.borgcube.de/engage/jellyseerr/"><img src="http://jellyseerr.borgcube.de/widget/jellyseerr/jellyseerr-frontend/svg-badge.svg" alt="Translation status" /></a>
|
||||
<a href="https://github.com/fallenbagel/jellyseerr/blob/develop/LICENSE"><img alt="GitHub" src="https://img.shields.io/github/license/fallenbagel/jellyseerr"></a>
|
||||
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
|
||||
<a href="#contributors-"><img alt="All Contributors" src="https://img.shields.io/badge/all_contributors-40-orange.svg"/></a>
|
||||
<a href="#contributors-"><img alt="All Contributors" src="https://img.shields.io/badge/all_contributors-47-orange.svg"/></a>
|
||||
<!-- ALL-CONTRIBUTORS-BADGE:END -->
|
||||
|
||||
**Jellyseerr** is a free and open source software application for managing requests for your media library.
|
||||
@@ -137,6 +137,15 @@ Thanks goes to these wonderful people from Overseerr ([emoji key](https://allcon
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://joaquinolivero.com"><img src="https://avatars.githubusercontent.com/u/66050823?v=4?s=100" width="100px;" alt="Joaquin Olivero"/><br /><sub><b>Joaquin Olivero</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=JoaquinOlivero" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Bretterteig"><img src="https://avatars.githubusercontent.com/u/47298401?v=4?s=100" width="100px;" alt="Julian Behr"/><br /><sub><b>Julian Behr</b></sub></a><br /><a href="#translation-Bretterteig" title="Translation">🌍</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ThowZzy"><img src="https://avatars.githubusercontent.com/u/61882536?v=4?s=100" width="100px;" alt="ThowZzy"/><br /><sub><b>ThowZzy</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=ThowZzy" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="http://josephrisk.com"><img src="https://avatars.githubusercontent.com/u/18372584?v=4?s=100" width="100px;" alt="Joseph Risk"/><br /><sub><b>Joseph Risk</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=j0srisk" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Loetwiek"><img src="https://avatars.githubusercontent.com/u/79059734?v=4?s=100" width="100px;" alt="Loetwiek"/><br /><sub><b>Loetwiek</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=Loetwiek" title="Code">💻</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Fuochi"><img src="https://avatars.githubusercontent.com/u/4720478?v=4?s=100" width="100px;" alt="Fuochi"/><br /><sub><b>Fuochi</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=Fuochi" title="Documentation">📖</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://mobihen.com"><img src="https://avatars.githubusercontent.com/u/35529491?v=4?s=100" width="100px;" alt="Nir Israel Hen"/><br /><sub><b>Nir Israel Hen</b></sub></a><br /><a href="#translation-mobihen" title="Translation">🌍</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/XDark187"><img src="https://avatars.githubusercontent.com/u/39034192?v=4?s=100" width="100px;" alt="Baraa"/><br /><sub><b>Baraa</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=XDark187" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/franciscofsales"><img src="https://avatars.githubusercontent.com/u/7977645?v=4?s=100" width="100px;" alt="Francisco Sales"/><br /><sub><b>Francisco Sales</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=franciscofsales" title="Code">💻</a></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/myselfolli"><img src="https://avatars.githubusercontent.com/u/37535998?v=4?s=100" width="100px;" alt="Oliver Laing"/><br /><sub><b>Oliver Laing</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=myselfolli" title="Code">💻</a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
@@ -248,6 +248,7 @@ git checkout main
|
||||
```
|
||||
3. Install the dependencies:
|
||||
```powershell
|
||||
npm install -g win-node-env
|
||||
set CYPRESS_INSTALL_BINARY=0 && yarn install --frozen-lockfile --network-timeout 1000000
|
||||
```
|
||||
4. Build the project:
|
||||
@@ -272,6 +273,7 @@ git checkout develop # by default, you are on the develop branch so this step is
|
||||
```
|
||||
3. Install the dependencies:
|
||||
```powershell
|
||||
npm install -g win-node-env
|
||||
set CYPRESS_INSTALL_BINARY=0 && pnpm install --frozen-lockfile
|
||||
```
|
||||
4. Build the project:
|
||||
|
||||
@@ -6,10 +6,6 @@ module.exports = {
|
||||
commitTag: process.env.COMMIT_TAG || 'local',
|
||||
forceIpv4First: process.env.FORCE_IPV4_FIRST === 'true' ? 'true' : 'false',
|
||||
},
|
||||
publicRuntimeConfig: {
|
||||
// Will be available on both server and client
|
||||
JELLYFIN_TYPE: process.env.JELLYFIN_TYPE,
|
||||
},
|
||||
images: {
|
||||
remotePatterns: [
|
||||
{ hostname: 'gravatar.com' },
|
||||
|
||||
@@ -85,7 +85,7 @@ class ExternalAPI {
|
||||
|
||||
protected async post<T>(
|
||||
endpoint: string,
|
||||
data: Record<string, unknown>,
|
||||
data?: Record<string, unknown>,
|
||||
params?: Record<string, string>,
|
||||
ttl?: number,
|
||||
config?: RequestInit
|
||||
@@ -107,7 +107,7 @@ class ExternalAPI {
|
||||
...this.defaultHeaders,
|
||||
...config?.headers,
|
||||
},
|
||||
body: JSON.stringify(data),
|
||||
body: data ? JSON.stringify(data) : undefined,
|
||||
});
|
||||
if (!response.ok) {
|
||||
const text = await response.text();
|
||||
@@ -178,6 +178,7 @@ class ExternalAPI {
|
||||
): Promise<T> {
|
||||
const url = this.formatUrl(endpoint, params);
|
||||
const response = await this.fetch(url, {
|
||||
method: 'DELETE',
|
||||
...config,
|
||||
headers: {
|
||||
...this.defaultHeaders,
|
||||
@@ -285,7 +286,12 @@ class ExternalAPI {
|
||||
...this.params,
|
||||
...params,
|
||||
});
|
||||
return `${href}?${searchParams.toString()}`;
|
||||
return (
|
||||
href +
|
||||
(searchParams.toString().length
|
||||
? '?' + searchParams.toString()
|
||||
: searchParams.toString())
|
||||
);
|
||||
}
|
||||
|
||||
private serializeCacheKey(
|
||||
@@ -313,7 +319,11 @@ class ExternalAPI {
|
||||
try {
|
||||
return await response.json();
|
||||
} catch {
|
||||
return await response.blob();
|
||||
try {
|
||||
return await response.blob();
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -93,9 +93,7 @@ export interface JellyfinLibraryItemExtended extends JellyfinLibraryItem {
|
||||
}
|
||||
|
||||
class JellyfinAPI extends ExternalAPI {
|
||||
private authToken?: string;
|
||||
private userId?: string;
|
||||
private jellyfinHost: string;
|
||||
|
||||
constructor(jellyfinHost: string, authToken?: string, deviceId?: string) {
|
||||
let authHeaderVal: string;
|
||||
@@ -114,9 +112,6 @@ class JellyfinAPI extends ExternalAPI {
|
||||
},
|
||||
}
|
||||
);
|
||||
|
||||
this.jellyfinHost = jellyfinHost;
|
||||
this.authToken = authToken;
|
||||
}
|
||||
|
||||
public async login(
|
||||
@@ -405,6 +400,23 @@ class JellyfinAPI extends ExternalAPI {
|
||||
throw new ApiError(e.cause?.status, ApiErrorCode.InvalidAuthToken);
|
||||
}
|
||||
}
|
||||
|
||||
public async createApiToken(appName: string): Promise<string> {
|
||||
try {
|
||||
await this.post(`/Auth/Keys?App=${appName}`);
|
||||
const apiKeys = await this.get<any>(`/Auth/Keys`);
|
||||
return apiKeys.Items.reverse().find(
|
||||
(item: any) => item.AppName === appName
|
||||
).AccessToken;
|
||||
} catch (e) {
|
||||
logger.error(
|
||||
`Something went wrong while creating an API key the Jellyfin server: ${e.message}`,
|
||||
{ label: 'Jellyfin API' }
|
||||
);
|
||||
|
||||
throw new ApiError(e.response?.status, ApiErrorCode.InvalidAuthToken);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export default JellyfinAPI;
|
||||
|
||||
@@ -175,7 +175,11 @@ class IMDBRadarrProxy extends ExternalAPI {
|
||||
`/movie/imdb/${IMDBid}`
|
||||
);
|
||||
|
||||
if (!data?.length || data[0].ImdbId !== IMDBid) {
|
||||
if (
|
||||
!data?.length ||
|
||||
data[0].ImdbId !== IMDBid ||
|
||||
!data[0].MovieRatings.Imdb
|
||||
) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@@ -63,7 +63,7 @@ app
|
||||
}
|
||||
|
||||
// Load Settings
|
||||
const settings = getSettings();
|
||||
const settings = await getSettings().load();
|
||||
restartFlag.initializeSettings(settings.main);
|
||||
|
||||
// Migrate library types
|
||||
|
||||
@@ -8,3 +8,16 @@ interface PageInfo {
|
||||
export interface PaginatedResponse {
|
||||
pageInfo: PageInfo;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the keys of an object that are not functions
|
||||
*/
|
||||
type NonFunctionPropertyNames<T> = {
|
||||
// eslint-disable-next-line @typescript-eslint/ban-types
|
||||
[K in keyof T]: T[K] extends Function ? never : K;
|
||||
}[keyof T];
|
||||
|
||||
/**
|
||||
* Get the properties of an object that are not functions
|
||||
*/
|
||||
export type NonFunctionProperties<T> = Pick<T, NonFunctionPropertyNames<T>>;
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import type { MediaType } from '@server/constants/media';
|
||||
import type { MediaRequest } from '@server/entity/MediaRequest';
|
||||
import type { PaginatedResponse } from './common';
|
||||
import type { NonFunctionProperties, PaginatedResponse } from './common';
|
||||
|
||||
export interface RequestResultsResponse extends PaginatedResponse {
|
||||
results: MediaRequest[];
|
||||
results: NonFunctionProperties<MediaRequest>[];
|
||||
}
|
||||
|
||||
export type MediaRequestBody = {
|
||||
@@ -14,6 +14,7 @@ export type MediaRequestBody = {
|
||||
is4k?: boolean;
|
||||
serverId?: number;
|
||||
profileId?: number;
|
||||
profileName?: string;
|
||||
rootFolder?: string;
|
||||
languageProfileId?: number;
|
||||
userId?: number;
|
||||
|
||||
@@ -63,12 +63,7 @@ class AvailabilitySync {
|
||||
) {
|
||||
admin = await userRepository.findOne({
|
||||
where: { id: 1 },
|
||||
select: [
|
||||
'id',
|
||||
'jellyfinAuthToken',
|
||||
'jellyfinUserId',
|
||||
'jellyfinDeviceId',
|
||||
],
|
||||
select: ['id', 'jellyfinUserId', 'jellyfinDeviceId'],
|
||||
order: { id: 'ASC' },
|
||||
});
|
||||
}
|
||||
@@ -86,7 +81,7 @@ class AvailabilitySync {
|
||||
if (admin) {
|
||||
this.jellyfinClient = new JellyfinAPI(
|
||||
getHostname(),
|
||||
admin.jellyfinAuthToken,
|
||||
settings.jellyfin.apiKey,
|
||||
admin.jellyfinDeviceId
|
||||
);
|
||||
|
||||
|
||||
@@ -20,6 +20,7 @@ export interface DownloadingItem {
|
||||
timeLeft: string;
|
||||
estimatedCompletionTime: Date;
|
||||
title: string;
|
||||
downloadId: string;
|
||||
episode?: EpisodeNumberResult;
|
||||
}
|
||||
|
||||
@@ -95,6 +96,7 @@ class DownloadTracker {
|
||||
status: item.status,
|
||||
timeLeft: item.timeleft,
|
||||
title: item.title,
|
||||
downloadId: item.downloadId,
|
||||
}));
|
||||
|
||||
if (queueItems.length > 0) {
|
||||
@@ -172,6 +174,7 @@ class DownloadTracker {
|
||||
timeLeft: item.timeleft,
|
||||
title: item.title,
|
||||
episode: item.episode,
|
||||
downloadId: item.downloadId,
|
||||
}));
|
||||
|
||||
if (queueItems.length > 0) {
|
||||
|
||||
@@ -585,12 +585,7 @@ class JellyfinScanner {
|
||||
const userRepository = getRepository(User);
|
||||
const admin = await userRepository.findOne({
|
||||
where: { id: 1 },
|
||||
select: [
|
||||
'id',
|
||||
'jellyfinAuthToken',
|
||||
'jellyfinUserId',
|
||||
'jellyfinDeviceId',
|
||||
],
|
||||
select: ['id', 'jellyfinUserId', 'jellyfinDeviceId'],
|
||||
order: { id: 'ASC' },
|
||||
});
|
||||
|
||||
@@ -600,7 +595,7 @@ class JellyfinScanner {
|
||||
|
||||
this.jfClient = new JellyfinAPI(
|
||||
getHostname(),
|
||||
admin.jellyfinAuthToken,
|
||||
settings.jellyfin.apiKey,
|
||||
admin.jellyfinDeviceId
|
||||
);
|
||||
|
||||
|
||||
@@ -47,6 +47,7 @@ export interface JellyfinSettings {
|
||||
jellyfinForgotPasswordUrl?: string;
|
||||
libraries: Library[];
|
||||
serverId: string;
|
||||
apiKey: string;
|
||||
}
|
||||
export interface TautulliSettings {
|
||||
hostname?: string;
|
||||
@@ -342,6 +343,7 @@ class Settings {
|
||||
jellyfinForgotPasswordUrl: '',
|
||||
libraries: [],
|
||||
serverId: '',
|
||||
apiKey: '',
|
||||
},
|
||||
tautulli: {},
|
||||
radarr: [],
|
||||
@@ -629,7 +631,7 @@ class Settings {
|
||||
* @param overrideSettings If passed in, will override all existing settings with these
|
||||
* values
|
||||
*/
|
||||
public load(overrideSettings?: AllSettings): Settings {
|
||||
public async load(overrideSettings?: AllSettings): Promise<Settings> {
|
||||
if (overrideSettings) {
|
||||
this.data = overrideSettings;
|
||||
return this;
|
||||
@@ -642,7 +644,7 @@ class Settings {
|
||||
|
||||
if (data) {
|
||||
const parsedJson = JSON.parse(data);
|
||||
this.data = runMigrations(parsedJson);
|
||||
this.data = await runMigrations(parsedJson);
|
||||
|
||||
this.data = merge(this.data, parsedJson);
|
||||
|
||||
@@ -656,7 +658,6 @@ class Settings {
|
||||
}
|
||||
}
|
||||
|
||||
let loaded = false;
|
||||
let settings: Settings | undefined;
|
||||
|
||||
export const getSettings = (initialSettings?: AllSettings): Settings => {
|
||||
@@ -664,11 +665,6 @@ export const getSettings = (initialSettings?: AllSettings): Settings => {
|
||||
settings = new Settings(initialSettings);
|
||||
}
|
||||
|
||||
if (!loaded) {
|
||||
settings.load();
|
||||
loaded = true;
|
||||
}
|
||||
|
||||
return settings;
|
||||
};
|
||||
|
||||
|
||||
36
server/lib/settings/migrations/0002_migrate_apitokens.ts
Normal file
36
server/lib/settings/migrations/0002_migrate_apitokens.ts
Normal file
@@ -0,0 +1,36 @@
|
||||
import JellyfinAPI from '@server/api/jellyfin';
|
||||
import { MediaServerType } from '@server/constants/server';
|
||||
import { getRepository } from '@server/datasource';
|
||||
import { User } from '@server/entity/User';
|
||||
import type { AllSettings } from '@server/lib/settings';
|
||||
import { getHostname } from '@server/utils/getHostname';
|
||||
|
||||
const migrateApiTokens = async (settings: any): Promise<AllSettings> => {
|
||||
const mediaServerType = settings.main.mediaServerType;
|
||||
if (
|
||||
!settings.jellyfin.apiKey &&
|
||||
(mediaServerType === MediaServerType.JELLYFIN ||
|
||||
mediaServerType === MediaServerType.EMBY)
|
||||
) {
|
||||
const userRepository = getRepository(User);
|
||||
const admin = await userRepository.findOne({
|
||||
where: { id: 1 },
|
||||
select: ['id', 'jellyfinAuthToken', 'jellyfinUserId', 'jellyfinDeviceId'],
|
||||
order: { id: 'ASC' },
|
||||
});
|
||||
if (!admin) {
|
||||
return settings;
|
||||
}
|
||||
const jellyfinClient = new JellyfinAPI(
|
||||
getHostname(settings.jellyfin),
|
||||
admin.jellyfinAuthToken,
|
||||
admin.jellyfinDeviceId
|
||||
);
|
||||
jellyfinClient.setUserId(admin.jellyfinUserId ?? '');
|
||||
const apiKey = await jellyfinClient.createApiToken('Jellyseerr');
|
||||
settings.jellyfin.apiKey = apiKey;
|
||||
}
|
||||
return settings;
|
||||
};
|
||||
|
||||
export default migrateApiTokens;
|
||||
@@ -1,10 +1,13 @@
|
||||
import type { AllSettings } from '@server/lib/settings';
|
||||
import logger from '@server/logger';
|
||||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
|
||||
const migrationsDir = path.join(__dirname, 'migrations');
|
||||
|
||||
export const runMigrations = (settings: AllSettings): AllSettings => {
|
||||
export const runMigrations = async (
|
||||
settings: AllSettings
|
||||
): Promise<AllSettings> => {
|
||||
const migrations = fs
|
||||
.readdirSync(migrationsDir)
|
||||
.filter((file) => file.endsWith('.js') || file.endsWith('.ts'))
|
||||
@@ -13,8 +16,15 @@ export const runMigrations = (settings: AllSettings): AllSettings => {
|
||||
|
||||
let migrated = settings;
|
||||
|
||||
for (const migration of migrations) {
|
||||
migrated = migration(migrated);
|
||||
try {
|
||||
for (const migration of migrations) {
|
||||
migrated = await migration(migrated);
|
||||
}
|
||||
} catch (e) {
|
||||
logger.error(
|
||||
`Something went wrong while running settings migrations: ${e.message}`,
|
||||
{ label: 'Settings Migrator' }
|
||||
);
|
||||
}
|
||||
|
||||
return migrated;
|
||||
|
||||
@@ -85,6 +85,7 @@ export interface MovieDetails {
|
||||
mediaUrl?: string;
|
||||
watchProviders?: WatchProviders[];
|
||||
keywords: Keyword[];
|
||||
onUserWatchlist?: boolean;
|
||||
}
|
||||
|
||||
export const mapProductionCompany = (
|
||||
@@ -101,7 +102,8 @@ export const mapProductionCompany = (
|
||||
|
||||
export const mapMovieDetails = (
|
||||
movie: TmdbMovieDetails,
|
||||
media?: Media
|
||||
media?: Media,
|
||||
userWatchlist?: boolean
|
||||
): MovieDetails => ({
|
||||
id: movie.id,
|
||||
adult: movie.adult,
|
||||
@@ -148,4 +150,5 @@ export const mapMovieDetails = (
|
||||
id: keyword.id,
|
||||
name: keyword.name,
|
||||
})),
|
||||
onUserWatchlist: userWatchlist,
|
||||
});
|
||||
|
||||
@@ -111,6 +111,7 @@ export interface TvDetails {
|
||||
keywords: Keyword[];
|
||||
mediaInfo?: Media;
|
||||
watchProviders?: WatchProviders[];
|
||||
onUserWatchlist?: boolean;
|
||||
}
|
||||
|
||||
const mapEpisodeResult = (episode: TmdbTvEpisodeResult): Episode => ({
|
||||
@@ -161,7 +162,8 @@ export const mapNetwork = (network: TmdbNetwork): TvNetwork => ({
|
||||
|
||||
export const mapTvDetails = (
|
||||
show: TmdbTvDetails,
|
||||
media?: Media
|
||||
media?: Media,
|
||||
userWatchlist?: boolean
|
||||
): TvDetails => ({
|
||||
createdBy: show.created_by,
|
||||
episodeRunTime: show.episode_run_time,
|
||||
@@ -223,4 +225,5 @@ export const mapTvDetails = (
|
||||
})),
|
||||
mediaInfo: media,
|
||||
watchProviders: mapWatchProviders(show['watch/providers']?.results ?? {}),
|
||||
onUserWatchlist: userWatchlist,
|
||||
});
|
||||
|
||||
@@ -365,6 +365,14 @@ authRoutes.post('/jellyfin', async (req, res, next) => {
|
||||
throw new Error('select_server_type');
|
||||
}
|
||||
|
||||
// Create an API key on Jellyfin from this admin user
|
||||
const jellyfinClient = new JellyfinAPI(
|
||||
hostname,
|
||||
account.AccessToken,
|
||||
deviceId
|
||||
);
|
||||
const apiKey = await jellyfinClient.createApiToken('Jellyseerr');
|
||||
|
||||
const serverName = await jellyfinserver.getServerName();
|
||||
|
||||
settings.jellyfin.name = serverName;
|
||||
@@ -373,6 +381,7 @@ authRoutes.post('/jellyfin', async (req, res, next) => {
|
||||
settings.jellyfin.port = body.port ?? 8096;
|
||||
settings.jellyfin.urlBase = body.urlBase ?? '';
|
||||
settings.jellyfin.useSsl = body.useSsl ?? false;
|
||||
settings.jellyfin.apiKey = apiKey;
|
||||
settings.save();
|
||||
startJobs();
|
||||
|
||||
@@ -396,10 +405,6 @@ authRoutes.post('/jellyfin', async (req, res, next) => {
|
||||
jellyfinUsername: account.User.Name,
|
||||
}
|
||||
);
|
||||
// Let's check if their authtoken is up to date
|
||||
if (user.jellyfinAuthToken !== account.AccessToken) {
|
||||
user.jellyfinAuthToken = account.AccessToken;
|
||||
}
|
||||
// Update the users avatar with their jellyfin profile pic (incase it changed)
|
||||
if (account.User.PrimaryImageTag) {
|
||||
user.avatar = `${jellyfinHost}/Users/${account.User.Id}/Images/Primary/?tag=${account.User.PrimaryImageTag}&quality=90`;
|
||||
@@ -415,12 +420,6 @@ authRoutes.post('/jellyfin', async (req, res, next) => {
|
||||
user.username = '';
|
||||
}
|
||||
|
||||
// TODO: If JELLYFIN_TYPE is set to 'emby' then set mediaServerType to EMBY
|
||||
// if (process.env.JELLYFIN_TYPE === 'emby') {
|
||||
// settings.main.mediaServerType = MediaServerType.EMBY;
|
||||
// settings.save();
|
||||
// }
|
||||
|
||||
await userRepository.save(user);
|
||||
} else if (!settings.main.newPlexLogin) {
|
||||
logger.warn(
|
||||
@@ -451,7 +450,6 @@ authRoutes.post('/jellyfin', async (req, res, next) => {
|
||||
jellyfinUsername: account.User.Name,
|
||||
jellyfinUserId: account.User.Id,
|
||||
jellyfinDeviceId: deviceId,
|
||||
jellyfinAuthToken: account.AccessToken,
|
||||
permissions: settings.main.defaultPermissions,
|
||||
avatar: account.User.PrimaryImageTag
|
||||
? `${jellyfinHost}/Users/${account.User.Id}/Images/Primary/?tag=${account.User.PrimaryImageTag}&quality=90`
|
||||
|
||||
@@ -3,7 +3,9 @@ import RottenTomatoes from '@server/api/rating/rottentomatoes';
|
||||
import { type RatingResponse } from '@server/api/ratings';
|
||||
import TheMovieDb from '@server/api/themoviedb';
|
||||
import { MediaType } from '@server/constants/media';
|
||||
import { getRepository } from '@server/datasource';
|
||||
import Media from '@server/entity/Media';
|
||||
import { Watchlist } from '@server/entity/Watchlist';
|
||||
import logger from '@server/logger';
|
||||
import { mapMovieDetails } from '@server/models/Movie';
|
||||
import { mapMovieResult } from '@server/models/Search';
|
||||
@@ -22,7 +24,24 @@ movieRoutes.get('/:id', async (req, res, next) => {
|
||||
|
||||
const media = await Media.getMedia(tmdbMovie.id, MediaType.MOVIE);
|
||||
|
||||
return res.status(200).json(mapMovieDetails(tmdbMovie, media));
|
||||
const onUserWatchlist = await getRepository(Watchlist).exist({
|
||||
where: {
|
||||
tmdbId: Number(req.params.id),
|
||||
requestedBy: {
|
||||
id: req.user?.id,
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
const data = mapMovieDetails(tmdbMovie, media, onUserWatchlist);
|
||||
|
||||
// TMDB issue where it doesnt fallback to English when no overview is available in requested locale.
|
||||
if (!data.overview) {
|
||||
const tvEnglish = await tmdb.getMovie({ movieId: Number(req.params.id) });
|
||||
data.overview = tvEnglish.overview;
|
||||
}
|
||||
|
||||
return res.status(200).json(data);
|
||||
} catch (e) {
|
||||
logger.debug('Something went wrong retrieving movie', {
|
||||
label: 'API',
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import RadarrAPI from '@server/api/servarr/radarr';
|
||||
import SonarrAPI from '@server/api/servarr/sonarr';
|
||||
import {
|
||||
MediaRequestStatus,
|
||||
MediaStatus,
|
||||
@@ -19,6 +21,7 @@ import type {
|
||||
RequestResultsResponse,
|
||||
} from '@server/interfaces/api/requestInterfaces';
|
||||
import { Permission } from '@server/lib/permissions';
|
||||
import { getSettings } from '@server/lib/settings';
|
||||
import logger from '@server/logger';
|
||||
import { isAuthenticated } from '@server/middleware/auth';
|
||||
import { Router } from 'express';
|
||||
@@ -143,6 +146,62 @@ requestRoutes.get<Record<string, unknown>, RequestResultsResponse>(
|
||||
.skip(skip)
|
||||
.getManyAndCount();
|
||||
|
||||
const settings = getSettings();
|
||||
|
||||
// get all quality profiles for every configured sonarr server
|
||||
const sonarrServers = await Promise.all(
|
||||
settings.sonarr.map(async (sonarrSetting) => {
|
||||
const sonarr = new SonarrAPI({
|
||||
apiKey: sonarrSetting.apiKey,
|
||||
url: SonarrAPI.buildUrl(sonarrSetting, '/api/v3'),
|
||||
});
|
||||
|
||||
return {
|
||||
id: sonarrSetting.id,
|
||||
profiles: await sonarr.getProfiles(),
|
||||
};
|
||||
})
|
||||
);
|
||||
|
||||
// get all quality profiles for every configured radarr server
|
||||
const radarrServers = await Promise.all(
|
||||
settings.radarr.map(async (radarrSetting) => {
|
||||
const radarr = new RadarrAPI({
|
||||
apiKey: radarrSetting.apiKey,
|
||||
url: RadarrAPI.buildUrl(radarrSetting, '/api/v3'),
|
||||
});
|
||||
|
||||
return {
|
||||
id: radarrSetting.id,
|
||||
profiles: await radarr.getProfiles(),
|
||||
};
|
||||
})
|
||||
);
|
||||
|
||||
// add profile names to the media requests, with undefined if not found
|
||||
const requestsWithProfileNames = requests.map((r) => {
|
||||
switch (r.type) {
|
||||
case MediaType.MOVIE: {
|
||||
const profileName = radarrServers
|
||||
.find((serverr) => serverr.id === r.serverId)
|
||||
?.profiles.find((profile) => profile.id === r.profileId)?.name;
|
||||
|
||||
return {
|
||||
...r,
|
||||
profileName,
|
||||
};
|
||||
}
|
||||
case MediaType.TV: {
|
||||
return {
|
||||
...r,
|
||||
profileName: sonarrServers
|
||||
.find((serverr) => serverr.id === r.serverId)
|
||||
?.profiles.find((profile) => profile.id === r.profileId)?.name,
|
||||
};
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return res.status(200).json({
|
||||
pageInfo: {
|
||||
pages: Math.ceil(requestCount / pageSize),
|
||||
@@ -150,7 +209,7 @@ requestRoutes.get<Record<string, unknown>, RequestResultsResponse>(
|
||||
results: requestCount,
|
||||
page: Math.ceil(skip / pageSize) + 1,
|
||||
},
|
||||
results: requests,
|
||||
results: requestsWithProfileNames,
|
||||
});
|
||||
} catch (e) {
|
||||
next({ status: 500, message: e.message });
|
||||
|
||||
@@ -262,7 +262,7 @@ settingsRoutes.post('/jellyfin', async (req, res, next) => {
|
||||
try {
|
||||
const admin = await userRepository.findOneOrFail({
|
||||
where: { id: 1 },
|
||||
select: ['id', 'jellyfinAuthToken', 'jellyfinUserId', 'jellyfinDeviceId'],
|
||||
select: ['id', 'jellyfinUserId', 'jellyfinDeviceId'],
|
||||
order: { id: 'ASC' },
|
||||
});
|
||||
|
||||
@@ -270,7 +270,7 @@ settingsRoutes.post('/jellyfin', async (req, res, next) => {
|
||||
|
||||
const jellyfinClient = new JellyfinAPI(
|
||||
getHostname(tempJellyfinSettings),
|
||||
admin.jellyfinAuthToken ?? '',
|
||||
tempJellyfinSettings.apiKey,
|
||||
admin.jellyfinDeviceId ?? ''
|
||||
);
|
||||
|
||||
@@ -318,13 +318,13 @@ settingsRoutes.get('/jellyfin/library', async (req, res, next) => {
|
||||
if (req.query.sync) {
|
||||
const userRepository = getRepository(User);
|
||||
const admin = await userRepository.findOneOrFail({
|
||||
select: ['id', 'jellyfinAuthToken', 'jellyfinDeviceId', 'jellyfinUserId'],
|
||||
select: ['id', 'jellyfinDeviceId', 'jellyfinUserId'],
|
||||
where: { id: 1 },
|
||||
order: { id: 'ASC' },
|
||||
});
|
||||
const jellyfinClient = new JellyfinAPI(
|
||||
getHostname(),
|
||||
admin.jellyfinAuthToken ?? '',
|
||||
settings.jellyfin.apiKey,
|
||||
admin.jellyfinDeviceId ?? ''
|
||||
);
|
||||
|
||||
@@ -376,7 +376,8 @@ settingsRoutes.get('/jellyfin/library', async (req, res, next) => {
|
||||
});
|
||||
|
||||
settingsRoutes.get('/jellyfin/users', async (req, res) => {
|
||||
const { externalHostname } = getSettings().jellyfin;
|
||||
const settings = getSettings();
|
||||
const { externalHostname } = settings.jellyfin;
|
||||
const jellyfinHost =
|
||||
externalHostname && externalHostname.length > 0
|
||||
? externalHostname
|
||||
@@ -384,13 +385,13 @@ settingsRoutes.get('/jellyfin/users', async (req, res) => {
|
||||
|
||||
const userRepository = getRepository(User);
|
||||
const admin = await userRepository.findOneOrFail({
|
||||
select: ['id', 'jellyfinAuthToken', 'jellyfinDeviceId', 'jellyfinUserId'],
|
||||
select: ['id', 'jellyfinDeviceId', 'jellyfinUserId'],
|
||||
where: { id: 1 },
|
||||
order: { id: 'ASC' },
|
||||
});
|
||||
const jellyfinClient = new JellyfinAPI(
|
||||
getHostname(),
|
||||
admin.jellyfinAuthToken ?? '',
|
||||
settings.jellyfin.apiKey,
|
||||
admin.jellyfinDeviceId ?? ''
|
||||
);
|
||||
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
import RottenTomatoes from '@server/api/rating/rottentomatoes';
|
||||
import TheMovieDb from '@server/api/themoviedb';
|
||||
import { MediaType } from '@server/constants/media';
|
||||
import { getRepository } from '@server/datasource';
|
||||
import Media from '@server/entity/Media';
|
||||
import { Watchlist } from '@server/entity/Watchlist';
|
||||
import logger from '@server/logger';
|
||||
import { mapTvResult } from '@server/models/Search';
|
||||
import { mapSeasonWithEpisodes, mapTvDetails } from '@server/models/Tv';
|
||||
@@ -19,7 +21,24 @@ tvRoutes.get('/:id', async (req, res, next) => {
|
||||
|
||||
const media = await Media.getMedia(tv.id, MediaType.TV);
|
||||
|
||||
return res.status(200).json(mapTvDetails(tv, media));
|
||||
const onUserWatchlist = await getRepository(Watchlist).exist({
|
||||
where: {
|
||||
tmdbId: Number(req.params.id),
|
||||
requestedBy: {
|
||||
id: req.user?.id,
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
const data = mapTvDetails(tv, media, onUserWatchlist);
|
||||
|
||||
// TMDB issue where it doesnt fallback to English when no overview is available in requested locale.
|
||||
if (!data.overview) {
|
||||
const tvEnglish = await tmdb.getTvShow({ tvId: Number(req.params.id) });
|
||||
data.overview = tvEnglish.overview;
|
||||
}
|
||||
|
||||
return res.status(200).json(data);
|
||||
} catch (e) {
|
||||
logger.debug('Something went wrong retrieving series', {
|
||||
label: 'API',
|
||||
|
||||
@@ -501,17 +501,14 @@ router.post(
|
||||
// taken from auth.ts
|
||||
const admin = await userRepository.findOneOrFail({
|
||||
where: { id: 1 },
|
||||
select: [
|
||||
'id',
|
||||
'jellyfinAuthToken',
|
||||
'jellyfinDeviceId',
|
||||
'jellyfinUserId',
|
||||
],
|
||||
select: ['id', 'jellyfinDeviceId', 'jellyfinUserId'],
|
||||
order: { id: 'ASC' },
|
||||
});
|
||||
|
||||
const hostname = getHostname();
|
||||
const jellyfinClient = new JellyfinAPI(
|
||||
getHostname(),
|
||||
admin.jellyfinAuthToken ?? '',
|
||||
hostname,
|
||||
settings.jellyfin.apiKey,
|
||||
admin.jellyfinDeviceId ?? ''
|
||||
);
|
||||
jellyfinClient.setUserId(admin.jellyfinUserId ?? '');
|
||||
@@ -519,7 +516,6 @@ router.post(
|
||||
//const jellyfinUsersResponse = await jellyfinClient.getUsers();
|
||||
const createdUsers: User[] = [];
|
||||
const { externalHostname } = getSettings().jellyfin;
|
||||
const hostname = getHostname();
|
||||
|
||||
const jellyfinHost =
|
||||
externalHostname && externalHostname.length > 0
|
||||
|
||||
@@ -3,6 +3,7 @@ import RTAudRotten from '@app/assets/rt_aud_rotten.svg';
|
||||
import RTFresh from '@app/assets/rt_fresh.svg';
|
||||
import RTRotten from '@app/assets/rt_rotten.svg';
|
||||
import ImdbLogo from '@app/assets/services/imdb.svg';
|
||||
import Spinner from '@app/assets/spinner.svg';
|
||||
import TmdbLogo from '@app/assets/tmdb_logo.svg';
|
||||
import Button from '@app/components/Common/Button';
|
||||
import CachedImage from '@app/components/Common/CachedImage';
|
||||
@@ -25,7 +26,7 @@ import useLocale from '@app/hooks/useLocale';
|
||||
import useSettings from '@app/hooks/useSettings';
|
||||
import { Permission, useUser } from '@app/hooks/useUser';
|
||||
import globalMessages from '@app/i18n/globalMessages';
|
||||
import Error from '@app/pages/_error';
|
||||
import ErrorPage from '@app/pages/_error';
|
||||
import { sortCrewPriority } from '@app/utils/creditHelpers';
|
||||
import defineMessages from '@app/utils/defineMessages';
|
||||
import { refreshIntervalHelper } from '@app/utils/refreshIntervalHelper';
|
||||
@@ -41,10 +42,12 @@ import {
|
||||
import {
|
||||
ChevronDoubleDownIcon,
|
||||
ChevronDoubleUpIcon,
|
||||
MinusCircleIcon,
|
||||
StarIcon,
|
||||
} from '@heroicons/react/24/solid';
|
||||
import { type RatingResponse } from '@server/api/ratings';
|
||||
import { IssueStatus } from '@server/constants/issue';
|
||||
import { MediaStatus } from '@server/constants/media';
|
||||
import { MediaStatus, MediaType } from '@server/constants/media';
|
||||
import { MediaServerType } from '@server/constants/server';
|
||||
import type { MovieDetails as MovieDetailsType } from '@server/models/Movie';
|
||||
import { countries } from 'country-flag-icons';
|
||||
@@ -54,6 +57,7 @@ import Link from 'next/link';
|
||||
import { useRouter } from 'next/router';
|
||||
import { useEffect, useMemo, useState } from 'react';
|
||||
import { useIntl } from 'react-intl';
|
||||
import { useToasts } from 'react-toast-notifications';
|
||||
import useSWR from 'swr';
|
||||
|
||||
const messages = defineMessages('components.MovieDetails', {
|
||||
@@ -93,6 +97,12 @@ const messages = defineMessages('components.MovieDetails', {
|
||||
rtaudiencescore: 'Rotten Tomatoes Audience Score',
|
||||
tmdbuserscore: 'TMDB User Score',
|
||||
imdbuserscore: 'IMDB User Score',
|
||||
watchlistSuccess: '<strong>{title}</strong> added to watchlist successfully!',
|
||||
watchlistDeleted:
|
||||
'<strong>{title}</strong> Removed from watchlist successfully!',
|
||||
watchlistError: 'Something went wrong try again.',
|
||||
removefromwatchlist: 'Remove From Watchlist',
|
||||
addtowatchlist: 'Add To Watchlist',
|
||||
});
|
||||
|
||||
interface MovieDetailsProps {
|
||||
@@ -111,6 +121,11 @@ const MovieDetails = ({ movie }: MovieDetailsProps) => {
|
||||
const minStudios = 3;
|
||||
const [showMoreStudios, setShowMoreStudios] = useState(false);
|
||||
const [showIssueModal, setShowIssueModal] = useState(false);
|
||||
const [isUpdating, setIsUpdating] = useState<boolean>(false);
|
||||
const [toggleWatchlist, setToggleWatchlist] = useState<boolean>(
|
||||
!movie?.onUserWatchlist
|
||||
);
|
||||
const { addToast } = useToasts();
|
||||
|
||||
const {
|
||||
data,
|
||||
@@ -152,7 +167,7 @@ const MovieDetails = ({ movie }: MovieDetailsProps) => {
|
||||
}
|
||||
|
||||
if (!data) {
|
||||
return <Error statusCode={404} />;
|
||||
return <ErrorPage statusCode={404} />;
|
||||
}
|
||||
|
||||
const showAllStudios = data.productionCompanies.length <= minStudios + 1;
|
||||
@@ -285,6 +300,80 @@ const MovieDetails = ({ movie }: MovieDetailsProps) => {
|
||||
return intl.formatMessage(messages.play4k, { mediaServerName: 'Jellyfin' });
|
||||
}
|
||||
|
||||
const onClickWatchlistBtn = async (): Promise<void> => {
|
||||
setIsUpdating(true);
|
||||
|
||||
const res = await fetch('/api/v1/watchlist', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify({
|
||||
tmdbId: movie?.id,
|
||||
mediaType: MediaType.MOVIE,
|
||||
title: movie?.title,
|
||||
}),
|
||||
});
|
||||
|
||||
if (!res.ok) {
|
||||
addToast(intl.formatMessage(messages.watchlistError), {
|
||||
appearance: 'error',
|
||||
autoDismiss: true,
|
||||
});
|
||||
|
||||
setIsUpdating(false);
|
||||
return;
|
||||
}
|
||||
|
||||
const data = await res.json();
|
||||
|
||||
if (data) {
|
||||
addToast(
|
||||
<span>
|
||||
{intl.formatMessage(messages.watchlistSuccess, {
|
||||
title: movie?.title,
|
||||
strong: (msg: React.ReactNode) => <strong>{msg}</strong>,
|
||||
})}
|
||||
</span>,
|
||||
{ appearance: 'success', autoDismiss: true }
|
||||
);
|
||||
}
|
||||
|
||||
setIsUpdating(false);
|
||||
setToggleWatchlist((prevState) => !prevState);
|
||||
};
|
||||
|
||||
const onClickDeleteWatchlistBtn = async (): Promise<void> => {
|
||||
setIsUpdating(true);
|
||||
try {
|
||||
const res = await fetch(`/api/v1/watchlist/${movie?.id}`, {
|
||||
method: 'DELETE',
|
||||
});
|
||||
if (!res.ok) throw new Error();
|
||||
|
||||
if (res.status === 204) {
|
||||
addToast(
|
||||
<span>
|
||||
{intl.formatMessage(messages.watchlistDeleted, {
|
||||
title: movie?.title,
|
||||
strong: (msg: React.ReactNode) => <strong>{msg}</strong>,
|
||||
})}
|
||||
</span>,
|
||||
{ appearance: 'info', autoDismiss: true }
|
||||
);
|
||||
}
|
||||
} catch (e) {
|
||||
addToast(intl.formatMessage(messages.watchlistError), {
|
||||
appearance: 'error',
|
||||
autoDismiss: true,
|
||||
});
|
||||
} finally {
|
||||
setIsUpdating(false);
|
||||
setToggleWatchlist((prevState) => !prevState);
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<div
|
||||
className="media-page"
|
||||
@@ -406,6 +495,40 @@ const MovieDetails = ({ movie }: MovieDetailsProps) => {
|
||||
</span>
|
||||
</div>
|
||||
<div className="media-actions">
|
||||
<>
|
||||
{toggleWatchlist ? (
|
||||
<Tooltip content={intl.formatMessage(messages.addtowatchlist)}>
|
||||
<Button
|
||||
buttonType={'ghost'}
|
||||
className="z-40 mr-2"
|
||||
buttonSize={'md'}
|
||||
onClick={onClickWatchlistBtn}
|
||||
>
|
||||
{isUpdating ? (
|
||||
<Spinner className="h-3" />
|
||||
) : (
|
||||
<StarIcon className={'h-3 text-amber-300'} />
|
||||
)}
|
||||
</Button>
|
||||
</Tooltip>
|
||||
) : (
|
||||
<Tooltip
|
||||
content={intl.formatMessage(messages.removefromwatchlist)}
|
||||
>
|
||||
<Button
|
||||
className="z-40 mr-2"
|
||||
buttonSize={'md'}
|
||||
onClick={onClickDeleteWatchlistBtn}
|
||||
>
|
||||
{isUpdating ? (
|
||||
<Spinner className="h-3" />
|
||||
) : (
|
||||
<MinusCircleIcon className={'h-3'} />
|
||||
)}
|
||||
</Button>
|
||||
</Tooltip>
|
||||
)}
|
||||
</>
|
||||
<PlayButton links={mediaLinks} />
|
||||
<RequestButton
|
||||
mediaType="movie"
|
||||
|
||||
@@ -19,6 +19,7 @@ import {
|
||||
} from '@heroicons/react/24/solid';
|
||||
import { MediaRequestStatus } from '@server/constants/media';
|
||||
import type { MediaRequest } from '@server/entity/MediaRequest';
|
||||
import type { NonFunctionProperties } from '@server/interfaces/api/common';
|
||||
import type { MovieDetails } from '@server/models/Movie';
|
||||
import type { TvDetails } from '@server/models/Tv';
|
||||
import Image from 'next/image';
|
||||
@@ -58,7 +59,7 @@ const RequestCardPlaceholder = () => {
|
||||
};
|
||||
|
||||
interface RequestCardErrorProps {
|
||||
requestData?: MediaRequest;
|
||||
requestData?: NonFunctionProperties<MediaRequest>;
|
||||
}
|
||||
|
||||
const RequestCardError = ({ requestData }: RequestCardErrorProps) => {
|
||||
@@ -213,7 +214,7 @@ const RequestCardError = ({ requestData }: RequestCardErrorProps) => {
|
||||
};
|
||||
|
||||
interface RequestCardProps {
|
||||
request: MediaRequest;
|
||||
request: NonFunctionProperties<MediaRequest>;
|
||||
onTitleData?: (requestId: number, title: MovieDetails | TvDetails) => void;
|
||||
}
|
||||
|
||||
@@ -238,16 +239,19 @@ const RequestCard = ({ request, onTitleData }: RequestCardProps) => {
|
||||
data: requestData,
|
||||
error: requestError,
|
||||
mutate: revalidate,
|
||||
} = useSWR<MediaRequest>(`/api/v1/request/${request.id}`, {
|
||||
fallbackData: request,
|
||||
refreshInterval: refreshIntervalHelper(
|
||||
{
|
||||
downloadStatus: request.media.downloadStatus,
|
||||
downloadStatus4k: request.media.downloadStatus4k,
|
||||
},
|
||||
15000
|
||||
),
|
||||
});
|
||||
} = useSWR<NonFunctionProperties<MediaRequest>>(
|
||||
`/api/v1/request/${request.id}`,
|
||||
{
|
||||
fallbackData: request,
|
||||
refreshInterval: refreshIntervalHelper(
|
||||
{
|
||||
downloadStatus: request.media.downloadStatus,
|
||||
downloadStatus4k: request.media.downloadStatus4k,
|
||||
},
|
||||
15000
|
||||
),
|
||||
}
|
||||
);
|
||||
|
||||
const { mediaUrl: plexUrl, mediaUrl4k: plexUrl4k } = useDeepLinks({
|
||||
mediaUrl: requestData?.media?.mediaUrl,
|
||||
|
||||
@@ -18,6 +18,7 @@ import {
|
||||
} from '@heroicons/react/24/solid';
|
||||
import { MediaRequestStatus } from '@server/constants/media';
|
||||
import type { MediaRequest } from '@server/entity/MediaRequest';
|
||||
import type { NonFunctionProperties } from '@server/interfaces/api/common';
|
||||
import type { MovieDetails } from '@server/models/Movie';
|
||||
import type { TvDetails } from '@server/models/Tv';
|
||||
import Image from 'next/image';
|
||||
@@ -42,6 +43,7 @@ const messages = defineMessages('components.RequestList.RequestItem', {
|
||||
tmdbid: 'TMDB ID',
|
||||
tvdbid: 'TheTVDB ID',
|
||||
unknowntitle: 'Unknown Title',
|
||||
profileName: 'Profile',
|
||||
});
|
||||
|
||||
const isMovie = (movie: MovieDetails | TvDetails): movie is MovieDetails => {
|
||||
@@ -49,7 +51,7 @@ const isMovie = (movie: MovieDetails | TvDetails): movie is MovieDetails => {
|
||||
};
|
||||
|
||||
interface RequestItemErrorProps {
|
||||
requestData?: MediaRequest;
|
||||
requestData?: NonFunctionProperties<MediaRequest>;
|
||||
revalidateList: () => void;
|
||||
}
|
||||
|
||||
@@ -285,7 +287,7 @@ const RequestItemError = ({
|
||||
};
|
||||
|
||||
interface RequestItemProps {
|
||||
request: MediaRequest;
|
||||
request: NonFunctionProperties<MediaRequest> & { profileName?: string };
|
||||
revalidateList: () => void;
|
||||
}
|
||||
|
||||
@@ -304,19 +306,18 @@ const RequestItem = ({ request, revalidateList }: RequestItemProps) => {
|
||||
const { data: title, error } = useSWR<MovieDetails | TvDetails>(
|
||||
inView ? url : null
|
||||
);
|
||||
const { data: requestData, mutate: revalidate } = useSWR<MediaRequest>(
|
||||
`/api/v1/request/${request.id}`,
|
||||
{
|
||||
fallbackData: request,
|
||||
refreshInterval: refreshIntervalHelper(
|
||||
{
|
||||
downloadStatus: request.media.downloadStatus,
|
||||
downloadStatus4k: request.media.downloadStatus4k,
|
||||
},
|
||||
15000
|
||||
),
|
||||
}
|
||||
);
|
||||
const { data: requestData, mutate: revalidate } = useSWR<
|
||||
NonFunctionProperties<MediaRequest>
|
||||
>(`/api/v1/request/${request.id}`, {
|
||||
fallbackData: request,
|
||||
refreshInterval: refreshIntervalHelper(
|
||||
{
|
||||
downloadStatus: request.media.downloadStatus,
|
||||
downloadStatus4k: request.media.downloadStatus4k,
|
||||
},
|
||||
15000
|
||||
),
|
||||
});
|
||||
|
||||
const [isRetrying, setRetrying] = useState(false);
|
||||
|
||||
@@ -401,7 +402,7 @@ const RequestItem = ({ request, revalidateList }: RequestItemProps) => {
|
||||
setShowEditModal(false);
|
||||
}}
|
||||
/>
|
||||
<div className="relative flex w-full flex-col justify-between overflow-hidden rounded-xl bg-gray-800 py-4 text-gray-400 shadow-md ring-1 ring-gray-700 xl:h-28 xl:flex-row">
|
||||
<div className="relative flex w-full flex-col justify-between overflow-hidden rounded-xl bg-gray-800 py-2 text-gray-400 shadow-md ring-1 ring-gray-700 xl:h-28 xl:flex-row">
|
||||
{title.backdropPath && (
|
||||
<div className="absolute inset-0 z-0 w-full bg-cover bg-center xl:w-2/3">
|
||||
<CachedImage
|
||||
@@ -482,7 +483,7 @@ const RequestItem = ({ request, revalidateList }: RequestItemProps) => {
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
<div className="z-10 mt-4 ml-4 flex w-full flex-col justify-center overflow-hidden pr-4 text-sm sm:ml-2 sm:mt-0 xl:flex-1 xl:pr-0">
|
||||
<div className="z-10 mt-4 ml-4 flex w-full flex-col justify-center gap-1 overflow-hidden pr-4 text-sm sm:ml-2 sm:mt-0 xl:flex-1 xl:pr-0">
|
||||
<div className="card-field">
|
||||
<span className="card-field-name">
|
||||
{intl.formatMessage(globalMessages.status)}
|
||||
@@ -632,6 +633,16 @@ const RequestItem = ({ request, revalidateList }: RequestItemProps) => {
|
||||
</span>
|
||||
</div>
|
||||
)}
|
||||
{request.profileName && (
|
||||
<div className="card-field">
|
||||
<span className="card-field-name">
|
||||
{intl.formatMessage(messages.profileName)}
|
||||
</span>
|
||||
<span className="flex truncate text-sm text-gray-300">
|
||||
{request.profileName}
|
||||
</span>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
<div className="z-10 mt-4 flex w-full flex-col justify-center space-y-2 pl-4 pr-4 xl:mt-0 xl:w-96 xl:items-end xl:pl-0">
|
||||
|
||||
@@ -8,6 +8,7 @@ import globalMessages from '@app/i18n/globalMessages';
|
||||
import defineMessages from '@app/utils/defineMessages';
|
||||
import { MediaStatus } from '@server/constants/media';
|
||||
import type { MediaRequest } from '@server/entity/MediaRequest';
|
||||
import type { NonFunctionProperties } from '@server/interfaces/api/common';
|
||||
import type { QuotaResponse } from '@server/interfaces/api/userInterfaces';
|
||||
import { Permission } from '@server/lib/permissions';
|
||||
import type { MovieDetails } from '@server/models/Movie';
|
||||
@@ -38,7 +39,7 @@ const messages = defineMessages('components.RequestModal', {
|
||||
interface RequestModalProps extends React.HTMLAttributes<HTMLDivElement> {
|
||||
tmdbId: number;
|
||||
is4k?: boolean;
|
||||
editRequest?: MediaRequest;
|
||||
editRequest?: NonFunctionProperties<MediaRequest>;
|
||||
onCancel?: () => void;
|
||||
onComplete?: (newStatus: MediaStatus) => void;
|
||||
onUpdating?: (isUpdating: boolean) => void;
|
||||
|
||||
@@ -13,6 +13,7 @@ import { ANIME_KEYWORD_ID } from '@server/api/themoviedb/constants';
|
||||
import { MediaRequestStatus, MediaStatus } from '@server/constants/media';
|
||||
import type { MediaRequest } from '@server/entity/MediaRequest';
|
||||
import type SeasonRequest from '@server/entity/SeasonRequest';
|
||||
import type { NonFunctionProperties } from '@server/interfaces/api/common';
|
||||
import type { QuotaResponse } from '@server/interfaces/api/userInterfaces';
|
||||
import { Permission } from '@server/lib/permissions';
|
||||
import type { TvDetails } from '@server/models/Tv';
|
||||
@@ -57,7 +58,7 @@ interface RequestModalProps extends React.HTMLAttributes<HTMLDivElement> {
|
||||
onComplete?: (newStatus: MediaStatus) => void;
|
||||
onUpdating?: (isUpdating: boolean) => void;
|
||||
is4k?: boolean;
|
||||
editRequest?: MediaRequest;
|
||||
editRequest?: NonFunctionProperties<MediaRequest>;
|
||||
}
|
||||
|
||||
const TvRequestModal = ({
|
||||
|
||||
@@ -4,13 +4,14 @@ import TvRequestModal from '@app/components/RequestModal/TvRequestModal';
|
||||
import { Transition } from '@headlessui/react';
|
||||
import type { MediaStatus } from '@server/constants/media';
|
||||
import type { MediaRequest } from '@server/entity/MediaRequest';
|
||||
import type { NonFunctionProperties } from '@server/interfaces/api/common';
|
||||
|
||||
interface RequestModalProps {
|
||||
show: boolean;
|
||||
type: 'movie' | 'tv' | 'collection';
|
||||
tmdbId: number;
|
||||
is4k?: boolean;
|
||||
editRequest?: MediaRequest;
|
||||
editRequest?: NonFunctionProperties<MediaRequest>;
|
||||
onComplete?: (newStatus: MediaStatus) => void;
|
||||
onCancel?: () => void;
|
||||
onUpdating?: (isUpdating: boolean) => void;
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import Badge from '@app/components/Common/Badge';
|
||||
import Button from '@app/components/Common/Button';
|
||||
import LoadingSpinner from '@app/components/Common/LoadingSpinner';
|
||||
import SensitiveInput from '@app/components/Common/SensitiveInput';
|
||||
import LibraryItem from '@app/components/Settings/LibraryItem';
|
||||
import useSettings from '@app/hooks/useSettings';
|
||||
import globalMessages from '@app/i18n/globalMessages';
|
||||
@@ -31,13 +32,14 @@ const messages = defineMessages('components.Settings', {
|
||||
jellyfinSettingsSuccess: '{mediaServerName} settings saved successfully!',
|
||||
jellyfinSettings: '{mediaServerName} Settings',
|
||||
jellyfinSettingsDescription:
|
||||
'Optionally configure the internal and external endpoints for your {mediaServerName} server. In most cases, the external URL is different to the internal URL. A custom password reset URL can also be set for {mediaServerName} login, in case you would like to redirect to a different password reset page.',
|
||||
'Optionally configure the internal and external endpoints for your {mediaServerName} server. In most cases, the external URL is different to the internal URL. A custom password reset URL can also be set for {mediaServerName} login, in case you would like to redirect to a different password reset page. You can also change the Jellyfin API key, which was automatically generated previously.',
|
||||
externalUrl: 'External URL',
|
||||
hostname: 'Hostname or IP Address',
|
||||
port: 'Port',
|
||||
enablessl: 'Use SSL',
|
||||
urlBase: 'URL Base',
|
||||
jellyfinForgotPasswordUrl: 'Forgot Password URL',
|
||||
apiKey: 'API key',
|
||||
jellyfinSyncFailedNoLibrariesFound: 'No libraries were found',
|
||||
jellyfinSyncFailedAutomaticGroupedFolders:
|
||||
'Custom authentication with Automatic Library Grouping not supported',
|
||||
@@ -60,6 +62,9 @@ const messages = defineMessages('components.Settings', {
|
||||
validationUrlTrailingSlash: 'URL must not end in a trailing slash',
|
||||
validationUrlBaseLeadingSlash: 'URL base must have a leading slash',
|
||||
validationUrlBaseTrailingSlash: 'URL base must not end in a trailing slash',
|
||||
tip: 'Tip',
|
||||
scanbackground:
|
||||
'Scanning will run in the background. You can continue the setup process in the meantime.',
|
||||
});
|
||||
|
||||
interface Library {
|
||||
@@ -77,13 +82,13 @@ interface SyncStatus {
|
||||
}
|
||||
|
||||
interface SettingsJellyfinProps {
|
||||
showAdvancedSettings?: boolean;
|
||||
isSetupSettings?: boolean;
|
||||
onComplete?: () => void;
|
||||
}
|
||||
|
||||
const SettingsJellyfin: React.FC<SettingsJellyfinProps> = ({
|
||||
onComplete,
|
||||
showAdvancedSettings,
|
||||
isSetupSettings,
|
||||
}) => {
|
||||
const [isSyncing, setIsSyncing] = useState(false);
|
||||
const toasts = useToasts();
|
||||
@@ -445,110 +450,117 @@ const SettingsJellyfin: React.FC<SettingsJellyfinProps> = ({
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{showAdvancedSettings && (
|
||||
<>
|
||||
<div className="mt-10 mb-6">
|
||||
<h3 className="heading">
|
||||
{intl.formatMessage(
|
||||
messages.jellyfinSettings,
|
||||
mediaServerFormatValues
|
||||
)}
|
||||
</h3>
|
||||
<p className="description">
|
||||
{intl.formatMessage(
|
||||
messages.jellyfinSettingsDescription,
|
||||
mediaServerFormatValues
|
||||
)}
|
||||
</p>
|
||||
</div>
|
||||
<Formik
|
||||
initialValues={{
|
||||
hostname: data?.ip,
|
||||
port: data?.port ?? 8096,
|
||||
useSsl: data?.useSsl,
|
||||
urlBase: data?.urlBase || '',
|
||||
jellyfinExternalUrl: data?.externalHostname || '',
|
||||
jellyfinForgotPasswordUrl: data?.jellyfinForgotPasswordUrl || '',
|
||||
}}
|
||||
validationSchema={JellyfinSettingsSchema}
|
||||
onSubmit={async (values) => {
|
||||
try {
|
||||
const res = await fetch('/api/v1/settings/jellyfin', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify({
|
||||
ip: values.hostname,
|
||||
port: Number(values.port),
|
||||
useSsl: values.useSsl,
|
||||
urlBase: values.urlBase,
|
||||
externalHostname: values.jellyfinExternalUrl,
|
||||
jellyfinForgotPasswordUrl: values.jellyfinForgotPasswordUrl,
|
||||
} as JellyfinSettings),
|
||||
});
|
||||
if (!res.ok) throw new Error(res.statusText, { cause: res });
|
||||
{isSetupSettings && (
|
||||
<div className="text-sm text-gray-500">
|
||||
<span className="mr-2">
|
||||
<Badge>{intl.formatMessage(messages.tip)}</Badge>
|
||||
</span>
|
||||
{intl.formatMessage(messages.scanbackground)}
|
||||
</div>
|
||||
)}
|
||||
<div className="mt-10 mb-6">
|
||||
<h3 className="heading">
|
||||
{intl.formatMessage(
|
||||
messages.jellyfinSettings,
|
||||
mediaServerFormatValues
|
||||
)}
|
||||
</h3>
|
||||
<p className="description">
|
||||
{intl.formatMessage(
|
||||
messages.jellyfinSettingsDescription,
|
||||
mediaServerFormatValues
|
||||
)}
|
||||
</p>
|
||||
</div>
|
||||
<Formik
|
||||
initialValues={{
|
||||
hostname: data?.ip,
|
||||
port: data?.port ?? 8096,
|
||||
useSsl: data?.useSsl,
|
||||
urlBase: data?.urlBase || '',
|
||||
jellyfinExternalUrl: data?.externalHostname || '',
|
||||
jellyfinForgotPasswordUrl: data?.jellyfinForgotPasswordUrl || '',
|
||||
apiKey: data?.apiKey,
|
||||
}}
|
||||
validationSchema={JellyfinSettingsSchema}
|
||||
onSubmit={async (values) => {
|
||||
try {
|
||||
const res = await fetch('/api/v1/settings/jellyfin', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify({
|
||||
ip: values.hostname,
|
||||
port: Number(values.port),
|
||||
useSsl: values.useSsl,
|
||||
urlBase: values.urlBase,
|
||||
externalHostname: values.jellyfinExternalUrl,
|
||||
jellyfinForgotPasswordUrl: values.jellyfinForgotPasswordUrl,
|
||||
apiKey: values.apiKey,
|
||||
} as JellyfinSettings),
|
||||
});
|
||||
if (!res.ok) throw new Error(res.statusText, { cause: res });
|
||||
|
||||
addToast(
|
||||
intl.formatMessage(messages.jellyfinSettingsSuccess, {
|
||||
mediaServerName:
|
||||
settings.currentSettings.mediaServerType ===
|
||||
MediaServerType.EMBY
|
||||
? 'Emby'
|
||||
: 'Jellyfin',
|
||||
}),
|
||||
{
|
||||
autoDismiss: true,
|
||||
appearance: 'success',
|
||||
}
|
||||
);
|
||||
} catch (e) {
|
||||
let errorData;
|
||||
try {
|
||||
errorData = await e.cause?.text();
|
||||
errorData = JSON.parse(errorData);
|
||||
} catch {
|
||||
/* empty */
|
||||
}
|
||||
if (errorData?.message === ApiErrorCode.InvalidUrl) {
|
||||
addToast(
|
||||
intl.formatMessage(
|
||||
messages.invalidurlerror,
|
||||
mediaServerFormatValues
|
||||
),
|
||||
{
|
||||
autoDismiss: true,
|
||||
appearance: 'error',
|
||||
}
|
||||
);
|
||||
} else {
|
||||
addToast(
|
||||
intl.formatMessage(
|
||||
messages.jellyfinSettingsFailure,
|
||||
mediaServerFormatValues
|
||||
),
|
||||
{
|
||||
autoDismiss: true,
|
||||
appearance: 'error',
|
||||
}
|
||||
);
|
||||
}
|
||||
} finally {
|
||||
revalidate();
|
||||
addToast(
|
||||
intl.formatMessage(
|
||||
messages.jellyfinSettingsSuccess,
|
||||
mediaServerFormatValues
|
||||
),
|
||||
{
|
||||
autoDismiss: true,
|
||||
appearance: 'success',
|
||||
}
|
||||
}}
|
||||
>
|
||||
{({
|
||||
errors,
|
||||
touched,
|
||||
values,
|
||||
setFieldValue,
|
||||
handleSubmit,
|
||||
isSubmitting,
|
||||
isValid,
|
||||
}) => {
|
||||
return (
|
||||
<form className="section" onSubmit={handleSubmit}>
|
||||
);
|
||||
} catch (e) {
|
||||
let errorData;
|
||||
try {
|
||||
errorData = await e.cause?.text();
|
||||
errorData = JSON.parse(errorData);
|
||||
} catch {
|
||||
/* empty */
|
||||
}
|
||||
if (errorData?.message === ApiErrorCode.InvalidUrl) {
|
||||
addToast(
|
||||
intl.formatMessage(
|
||||
messages.invalidurlerror,
|
||||
mediaServerFormatValues
|
||||
),
|
||||
{
|
||||
autoDismiss: true,
|
||||
appearance: 'error',
|
||||
}
|
||||
);
|
||||
} else {
|
||||
addToast(
|
||||
intl.formatMessage(
|
||||
messages.jellyfinSettingsFailure,
|
||||
mediaServerFormatValues
|
||||
),
|
||||
{
|
||||
autoDismiss: true,
|
||||
appearance: 'error',
|
||||
}
|
||||
);
|
||||
}
|
||||
} finally {
|
||||
revalidate();
|
||||
}
|
||||
}}
|
||||
>
|
||||
{({
|
||||
errors,
|
||||
touched,
|
||||
values,
|
||||
setFieldValue,
|
||||
handleSubmit,
|
||||
isSubmitting,
|
||||
isValid,
|
||||
}) => {
|
||||
return (
|
||||
<form className="section" onSubmit={handleSubmit}>
|
||||
{!isSetupSettings && (
|
||||
<>
|
||||
<div className="form-row">
|
||||
<label htmlFor="hostname" className="text-label">
|
||||
{intl.formatMessage(messages.hostname)}
|
||||
@@ -610,6 +622,29 @@ const SettingsJellyfin: React.FC<SettingsJellyfinProps> = ({
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
<div className="form-row">
|
||||
<label htmlFor="apiKey" className="text-label">
|
||||
{intl.formatMessage(messages.apiKey)}
|
||||
</label>
|
||||
<div className="form-input-area">
|
||||
<div className="form-input-field">
|
||||
<SensitiveInput
|
||||
as="field"
|
||||
type="text"
|
||||
inputMode="url"
|
||||
id="apiKey"
|
||||
name="apiKey"
|
||||
/>
|
||||
</div>
|
||||
{errors.apiKey && touched.apiKey && (
|
||||
<div className="error">{errors.apiKey}</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
{!isSetupSettings && (
|
||||
<>
|
||||
<div className="form-row">
|
||||
<label htmlFor="urlBase" className="text-label">
|
||||
{intl.formatMessage(messages.urlBase)}
|
||||
@@ -630,75 +665,75 @@ const SettingsJellyfin: React.FC<SettingsJellyfinProps> = ({
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
<div className="form-row">
|
||||
<label htmlFor="jellyfinExternalUrl" className="text-label">
|
||||
{intl.formatMessage(messages.externalUrl)}
|
||||
</label>
|
||||
<div className="form-input-area">
|
||||
<div className="form-input-field">
|
||||
<Field
|
||||
type="text"
|
||||
inputMode="url"
|
||||
id="jellyfinExternalUrl"
|
||||
name="jellyfinExternalUrl"
|
||||
/>
|
||||
</div>
|
||||
{errors.jellyfinExternalUrl &&
|
||||
touched.jellyfinExternalUrl && (
|
||||
<div className="error">
|
||||
{errors.jellyfinExternalUrl}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
<div className="form-row">
|
||||
<label htmlFor="jellyfinExternalUrl" className="text-label">
|
||||
{intl.formatMessage(messages.externalUrl)}
|
||||
</label>
|
||||
<div className="form-input-area">
|
||||
<div className="form-input-field">
|
||||
<Field
|
||||
type="text"
|
||||
inputMode="url"
|
||||
id="jellyfinExternalUrl"
|
||||
name="jellyfinExternalUrl"
|
||||
/>
|
||||
</div>
|
||||
<div className="form-row">
|
||||
<label
|
||||
htmlFor="jellyfinForgotPasswordUrl"
|
||||
className="text-label"
|
||||
{errors.jellyfinExternalUrl &&
|
||||
touched.jellyfinExternalUrl && (
|
||||
<div className="error">{errors.jellyfinExternalUrl}</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
<div className="form-row">
|
||||
<label
|
||||
htmlFor="jellyfinForgotPasswordUrl"
|
||||
className="text-label"
|
||||
>
|
||||
{intl.formatMessage(messages.jellyfinForgotPasswordUrl)}
|
||||
</label>
|
||||
<div className="form-input-area">
|
||||
<div className="form-input-field">
|
||||
<Field
|
||||
type="text"
|
||||
inputMode="url"
|
||||
id="jellyfinForgotPasswordUrl"
|
||||
name="jellyfinForgotPasswordUrl"
|
||||
/>
|
||||
</div>
|
||||
{errors.jellyfinForgotPasswordUrl &&
|
||||
touched.jellyfinForgotPasswordUrl && (
|
||||
<div className="error">
|
||||
{errors.jellyfinForgotPasswordUrl}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
className={`actions ${isSetupSettings ? 'mt-0 border-0' : ''}`}
|
||||
>
|
||||
<div className="flex justify-end">
|
||||
<span className="ml-3 inline-flex rounded-md shadow-sm">
|
||||
<Button
|
||||
buttonType="primary"
|
||||
type="submit"
|
||||
disabled={isSubmitting || !isValid}
|
||||
>
|
||||
{intl.formatMessage(messages.jellyfinForgotPasswordUrl)}
|
||||
</label>
|
||||
<div className="form-input-area">
|
||||
<div className="form-input-field">
|
||||
<Field
|
||||
type="text"
|
||||
inputMode="url"
|
||||
id="jellyfinForgotPasswordUrl"
|
||||
name="jellyfinForgotPasswordUrl"
|
||||
/>
|
||||
</div>
|
||||
{errors.jellyfinForgotPasswordUrl &&
|
||||
touched.jellyfinForgotPasswordUrl && (
|
||||
<div className="error">
|
||||
{errors.jellyfinForgotPasswordUrl}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
<div className="actions">
|
||||
<div className="flex justify-end">
|
||||
<span className="ml-3 inline-flex rounded-md shadow-sm">
|
||||
<Button
|
||||
buttonType="primary"
|
||||
type="submit"
|
||||
disabled={isSubmitting || !isValid}
|
||||
>
|
||||
<ArrowDownOnSquareIcon />
|
||||
<span>
|
||||
{isSubmitting
|
||||
? intl.formatMessage(globalMessages.saving)
|
||||
: intl.formatMessage(globalMessages.save)}
|
||||
</span>
|
||||
</Button>
|
||||
<ArrowDownOnSquareIcon />
|
||||
<span>
|
||||
{isSubmitting
|
||||
? intl.formatMessage(globalMessages.saving)
|
||||
: intl.formatMessage(globalMessages.save)}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
);
|
||||
}}
|
||||
</Formik>
|
||||
</>
|
||||
)}
|
||||
</Button>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
);
|
||||
}}
|
||||
</Formik>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -2,7 +2,6 @@ import EmbyLogo from '@app/assets/services/emby.svg';
|
||||
import JellyfinLogo from '@app/assets/services/jellyfin.svg';
|
||||
import PlexLogo from '@app/assets/services/plex.svg';
|
||||
import AppDataWarning from '@app/components/AppDataWarning';
|
||||
import Badge from '@app/components/Common/Badge';
|
||||
import Button from '@app/components/Common/Button';
|
||||
import ImageFader from '@app/components/Common/ImageFader';
|
||||
import PageTitle from '@app/components/Common/PageTitle';
|
||||
@@ -12,11 +11,12 @@ import SettingsPlex from '@app/components/Settings/SettingsPlex';
|
||||
import SettingsServices from '@app/components/Settings/SettingsServices';
|
||||
import SetupSteps from '@app/components/Setup/SetupSteps';
|
||||
import useLocale from '@app/hooks/useLocale';
|
||||
import useSettings from '@app/hooks/useSettings';
|
||||
import defineMessages from '@app/utils/defineMessages';
|
||||
import { MediaServerType } from '@server/constants/server';
|
||||
import Image from 'next/image';
|
||||
import { useRouter } from 'next/router';
|
||||
import { useState } from 'react';
|
||||
import { useEffect, useState } from 'react';
|
||||
import { useIntl } from 'react-intl';
|
||||
import useSWR, { mutate } from 'swr';
|
||||
import SetupLogin from './SetupLogin';
|
||||
@@ -35,9 +35,6 @@ const messages = defineMessages('components.Setup', {
|
||||
signin: 'Sign In',
|
||||
configuremediaserver: 'Configure Media Server',
|
||||
configureservices: 'Configure Services',
|
||||
tip: 'Tip',
|
||||
scanbackground:
|
||||
'Scanning will run in the background. You can continue the setup process in the meantime.',
|
||||
});
|
||||
|
||||
const Setup = () => {
|
||||
@@ -51,6 +48,7 @@ const Setup = () => {
|
||||
);
|
||||
const router = useRouter();
|
||||
const { locale } = useLocale();
|
||||
const settings = useSettings();
|
||||
|
||||
const finishSetup = async () => {
|
||||
setIsUpdating(true);
|
||||
@@ -85,6 +83,23 @@ const Setup = () => {
|
||||
revalidateOnFocus: false,
|
||||
});
|
||||
|
||||
useEffect(() => {
|
||||
if (settings.currentSettings.initialized) {
|
||||
router.push('/');
|
||||
}
|
||||
if (
|
||||
settings.currentSettings.mediaServerType !==
|
||||
MediaServerType.NOT_CONFIGURED
|
||||
) {
|
||||
setCurrentStep(3);
|
||||
setMediaServerType(settings.currentSettings.mediaServerType);
|
||||
}
|
||||
}, [
|
||||
settings.currentSettings.mediaServerType,
|
||||
settings.currentSettings.initialized,
|
||||
router,
|
||||
]);
|
||||
|
||||
return (
|
||||
<div className="relative flex min-h-screen flex-col justify-center bg-gray-900 py-12">
|
||||
<PageTitle title={intl.formatMessage(messages.setup)} />
|
||||
@@ -213,16 +228,10 @@ const Setup = () => {
|
||||
/>
|
||||
) : (
|
||||
<SettingsJellyfin
|
||||
showAdvancedSettings={false}
|
||||
isSetupSettings
|
||||
onComplete={() => setMediaServerSettingsComplete(true)}
|
||||
/>
|
||||
)}
|
||||
<div className="mt-4 text-sm text-gray-500">
|
||||
<span className="mr-2">
|
||||
<Badge>{intl.formatMessage(messages.tip)}</Badge>
|
||||
</span>
|
||||
{intl.formatMessage(messages.scanbackground)}
|
||||
</div>
|
||||
<div className="actions">
|
||||
<div className="flex justify-end">
|
||||
<span className="ml-3 inline-flex rounded-md shadow-sm">
|
||||
|
||||
@@ -17,6 +17,7 @@ const messages = defineMessages('components.StatusBadge', {
|
||||
playonplex: 'Play on {mediaServerName}',
|
||||
openinarr: 'Open in {arr}',
|
||||
managemedia: 'Manage {mediaType}',
|
||||
seasonnumber: 'S{seasonNumber}',
|
||||
seasonepisodenumber: 'S{seasonNumber}E{episodeNumber}',
|
||||
});
|
||||
|
||||
@@ -105,22 +106,34 @@ const StatusBadge = ({
|
||||
}
|
||||
}
|
||||
|
||||
const tooltipContent = (
|
||||
<ul>
|
||||
{downloadItem.map((status, index) => (
|
||||
<li
|
||||
key={`dl-status-${status.externalId}-${index}`}
|
||||
className="border-b border-gray-700 last:border-b-0"
|
||||
>
|
||||
<DownloadBlock
|
||||
downloadItem={status}
|
||||
title={Array.isArray(title) ? title[index] : title}
|
||||
is4k={is4k}
|
||||
/>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
);
|
||||
const tooltipContent =
|
||||
mediaType === 'tv' &&
|
||||
downloadItem.length > 1 &&
|
||||
downloadItem.every(
|
||||
(item) =>
|
||||
item.downloadId && item.downloadId === downloadItem[0].downloadId
|
||||
) ? (
|
||||
<DownloadBlock
|
||||
downloadItem={downloadItem[0]}
|
||||
title={Array.isArray(title) ? title[0] : title}
|
||||
is4k={is4k}
|
||||
/>
|
||||
) : (
|
||||
<ul>
|
||||
{downloadItem.map((status, index) => (
|
||||
<li
|
||||
key={`dl-status-${status.externalId}-${index}`}
|
||||
className="border-b border-gray-700 last:border-b-0"
|
||||
>
|
||||
<DownloadBlock
|
||||
downloadItem={status}
|
||||
title={Array.isArray(title) ? title[index] : title}
|
||||
is4k={is4k}
|
||||
/>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
);
|
||||
|
||||
const badgeDownloadProgress = (
|
||||
<div
|
||||
@@ -175,14 +188,27 @@ const StatusBadge = ({
|
||||
</span>
|
||||
{inProgress && (
|
||||
<>
|
||||
{mediaType === 'tv' && downloadItem[0].episode && (
|
||||
<span className="ml-1">
|
||||
{intl.formatMessage(messages.seasonepisodenumber, {
|
||||
seasonNumber: downloadItem[0].episode.seasonNumber,
|
||||
episodeNumber: downloadItem[0].episode.episodeNumber,
|
||||
})}
|
||||
</span>
|
||||
)}
|
||||
{mediaType === 'tv' &&
|
||||
downloadItem[0].episode &&
|
||||
(downloadItem.length > 1 &&
|
||||
downloadItem.every(
|
||||
(item) =>
|
||||
item.downloadId &&
|
||||
item.downloadId === downloadItem[0].downloadId
|
||||
) ? (
|
||||
<span className="ml-1">
|
||||
{intl.formatMessage(messages.seasonnumber, {
|
||||
seasonNumber: downloadItem[0].episode.seasonNumber,
|
||||
})}
|
||||
</span>
|
||||
) : (
|
||||
<span className="ml-1">
|
||||
{intl.formatMessage(messages.seasonepisodenumber, {
|
||||
seasonNumber: downloadItem[0].episode.seasonNumber,
|
||||
episodeNumber: downloadItem[0].episode.episodeNumber,
|
||||
})}
|
||||
</span>
|
||||
))}
|
||||
<Spinner className="ml-1 h-3 w-3" />
|
||||
</>
|
||||
)}
|
||||
@@ -228,14 +254,27 @@ const StatusBadge = ({
|
||||
</span>
|
||||
{inProgress && (
|
||||
<>
|
||||
{mediaType === 'tv' && downloadItem[0].episode && (
|
||||
<span className="ml-1">
|
||||
{intl.formatMessage(messages.seasonepisodenumber, {
|
||||
seasonNumber: downloadItem[0].episode.seasonNumber,
|
||||
episodeNumber: downloadItem[0].episode.episodeNumber,
|
||||
})}
|
||||
</span>
|
||||
)}
|
||||
{mediaType === 'tv' &&
|
||||
downloadItem[0].episode &&
|
||||
(downloadItem.length > 1 &&
|
||||
downloadItem.every(
|
||||
(item) =>
|
||||
item.downloadId &&
|
||||
item.downloadId === downloadItem[0].downloadId
|
||||
) ? (
|
||||
<span className="ml-1">
|
||||
{intl.formatMessage(messages.seasonnumber, {
|
||||
seasonNumber: downloadItem[0].episode.seasonNumber,
|
||||
})}
|
||||
</span>
|
||||
) : (
|
||||
<span className="ml-1">
|
||||
{intl.formatMessage(messages.seasonepisodenumber, {
|
||||
seasonNumber: downloadItem[0].episode.seasonNumber,
|
||||
episodeNumber: downloadItem[0].episode.episodeNumber,
|
||||
})}
|
||||
</span>
|
||||
))}
|
||||
<Spinner className="ml-1 h-3 w-3" />
|
||||
</>
|
||||
)}
|
||||
@@ -281,14 +320,27 @@ const StatusBadge = ({
|
||||
</span>
|
||||
{inProgress && (
|
||||
<>
|
||||
{mediaType === 'tv' && downloadItem[0].episode && (
|
||||
<span className="ml-1">
|
||||
{intl.formatMessage(messages.seasonepisodenumber, {
|
||||
seasonNumber: downloadItem[0].episode.seasonNumber,
|
||||
episodeNumber: downloadItem[0].episode.episodeNumber,
|
||||
})}
|
||||
</span>
|
||||
)}
|
||||
{mediaType === 'tv' &&
|
||||
downloadItem[0].episode &&
|
||||
(downloadItem.length > 1 &&
|
||||
downloadItem.every(
|
||||
(item) =>
|
||||
item.downloadId &&
|
||||
item.downloadId === downloadItem[0].downloadId
|
||||
) ? (
|
||||
<span className="ml-1">
|
||||
{intl.formatMessage(messages.seasonnumber, {
|
||||
seasonNumber: downloadItem[0].episode.seasonNumber,
|
||||
})}
|
||||
</span>
|
||||
) : (
|
||||
<span className="ml-1">
|
||||
{intl.formatMessage(messages.seasonepisodenumber, {
|
||||
seasonNumber: downloadItem[0].episode.seasonNumber,
|
||||
episodeNumber: downloadItem[0].episode.episodeNumber,
|
||||
})}
|
||||
</span>
|
||||
))}
|
||||
<Spinner className="ml-1 h-3 w-3" />
|
||||
</>
|
||||
)}
|
||||
|
||||
@@ -2,6 +2,7 @@ import RTAudFresh from '@app/assets/rt_aud_fresh.svg';
|
||||
import RTAudRotten from '@app/assets/rt_aud_rotten.svg';
|
||||
import RTFresh from '@app/assets/rt_fresh.svg';
|
||||
import RTRotten from '@app/assets/rt_rotten.svg';
|
||||
import Spinner from '@app/assets/spinner.svg';
|
||||
import TmdbLogo from '@app/assets/tmdb_logo.svg';
|
||||
import Badge from '@app/components/Common/Badge';
|
||||
import Button from '@app/components/Common/Button';
|
||||
@@ -40,11 +41,19 @@ import {
|
||||
FilmIcon,
|
||||
PlayIcon,
|
||||
} from '@heroicons/react/24/outline';
|
||||
import { ChevronDownIcon } from '@heroicons/react/24/solid';
|
||||
import {
|
||||
ChevronDownIcon,
|
||||
MinusCircleIcon,
|
||||
StarIcon,
|
||||
} from '@heroicons/react/24/solid';
|
||||
import type { RTRating } from '@server/api/rating/rottentomatoes';
|
||||
import { ANIME_KEYWORD_ID } from '@server/api/themoviedb/constants';
|
||||
import { IssueStatus } from '@server/constants/issue';
|
||||
import { MediaRequestStatus, MediaStatus } from '@server/constants/media';
|
||||
import {
|
||||
MediaRequestStatus,
|
||||
MediaStatus,
|
||||
MediaType,
|
||||
} from '@server/constants/media';
|
||||
import { MediaServerType } from '@server/constants/server';
|
||||
import type { Crew } from '@server/models/common';
|
||||
import type { TvDetails as TvDetailsType } from '@server/models/Tv';
|
||||
@@ -54,6 +63,7 @@ import Link from 'next/link';
|
||||
import { useRouter } from 'next/router';
|
||||
import { useEffect, useMemo, useState } from 'react';
|
||||
import { useIntl } from 'react-intl';
|
||||
import { useToasts } from 'react-toast-notifications';
|
||||
import useSWR from 'swr';
|
||||
|
||||
const messages = defineMessages('components.TvDetails', {
|
||||
@@ -88,6 +98,12 @@ const messages = defineMessages('components.TvDetails', {
|
||||
rtcriticsscore: 'Rotten Tomatoes Tomatometer',
|
||||
rtaudiencescore: 'Rotten Tomatoes Audience Score',
|
||||
tmdbuserscore: 'TMDB User Score',
|
||||
watchlistSuccess: '<strong>{title}</strong> added to watchlist successfully!',
|
||||
watchlistDeleted:
|
||||
'<strong>{title}</strong> Removed from watchlist successfully!',
|
||||
watchlistError: 'Something went wrong try again.',
|
||||
removefromwatchlist: 'Remove From Watchlist',
|
||||
addtowatchlist: 'Add To Watchlist',
|
||||
});
|
||||
|
||||
interface TvDetailsProps {
|
||||
@@ -105,6 +121,11 @@ const TvDetails = ({ tv }: TvDetailsProps) => {
|
||||
router.query.manage == '1' ? true : false
|
||||
);
|
||||
const [showIssueModal, setShowIssueModal] = useState(false);
|
||||
const [isUpdating, setIsUpdating] = useState<boolean>(false);
|
||||
const [toggleWatchlist, setToggleWatchlist] = useState<boolean>(
|
||||
!tv?.onUserWatchlist
|
||||
);
|
||||
const { addToast } = useToasts();
|
||||
|
||||
const {
|
||||
data,
|
||||
@@ -300,6 +321,82 @@ const TvDetails = ({ tv }: TvDetailsProps) => {
|
||||
return intl.formatMessage(messages.play, { mediaServerName: 'Jellyfin' });
|
||||
}
|
||||
|
||||
const onClickWatchlistBtn = async (): Promise<void> => {
|
||||
setIsUpdating(true);
|
||||
|
||||
const res = await fetch('/api/v1/watchlist', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify({
|
||||
tmdbId: tv?.id,
|
||||
mediaType: MediaType.TV,
|
||||
title: tv?.name,
|
||||
}),
|
||||
});
|
||||
|
||||
if (!res.ok) {
|
||||
addToast(intl.formatMessage(messages.watchlistError), {
|
||||
appearance: 'error',
|
||||
autoDismiss: true,
|
||||
});
|
||||
|
||||
setIsUpdating(false);
|
||||
return;
|
||||
}
|
||||
|
||||
const data = await res.json();
|
||||
|
||||
if (data) {
|
||||
addToast(
|
||||
<span>
|
||||
{intl.formatMessage(messages.watchlistSuccess, {
|
||||
title: tv?.name,
|
||||
strong: (msg: React.ReactNode) => <strong>{msg}</strong>,
|
||||
})}
|
||||
</span>,
|
||||
{ appearance: 'success', autoDismiss: true }
|
||||
);
|
||||
}
|
||||
|
||||
setIsUpdating(false);
|
||||
setToggleWatchlist((prevState) => !prevState);
|
||||
};
|
||||
|
||||
const onClickDeleteWatchlistBtn = async (): Promise<void> => {
|
||||
setIsUpdating(true);
|
||||
|
||||
const res = await fetch('/api/v1/watchlist/' + tv?.id, {
|
||||
method: 'DELETE',
|
||||
});
|
||||
|
||||
if (!res.ok) {
|
||||
addToast(intl.formatMessage(messages.watchlistError), {
|
||||
appearance: 'error',
|
||||
autoDismiss: true,
|
||||
});
|
||||
|
||||
setIsUpdating(false);
|
||||
return;
|
||||
}
|
||||
|
||||
if (res.status === 204) {
|
||||
addToast(
|
||||
<span>
|
||||
{intl.formatMessage(messages.watchlistDeleted, {
|
||||
title: tv?.name,
|
||||
strong: (msg: React.ReactNode) => <strong>{msg}</strong>,
|
||||
})}
|
||||
</span>,
|
||||
{ appearance: 'info', autoDismiss: true }
|
||||
);
|
||||
setIsUpdating(false);
|
||||
setToggleWatchlist((prevState) => !prevState);
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<div
|
||||
className="media-page"
|
||||
@@ -431,6 +528,40 @@ const TvDetails = ({ tv }: TvDetailsProps) => {
|
||||
</span>
|
||||
</div>
|
||||
<div className="media-actions">
|
||||
<>
|
||||
{toggleWatchlist ? (
|
||||
<Tooltip content={intl.formatMessage(messages.addtowatchlist)}>
|
||||
<Button
|
||||
buttonType={'ghost'}
|
||||
className="z-40 mr-2"
|
||||
buttonSize={'md'}
|
||||
onClick={onClickWatchlistBtn}
|
||||
>
|
||||
{isUpdating ? (
|
||||
<Spinner className="h-3" />
|
||||
) : (
|
||||
<StarIcon className={'h-3 text-amber-300'} />
|
||||
)}
|
||||
</Button>
|
||||
</Tooltip>
|
||||
) : (
|
||||
<Tooltip
|
||||
content={intl.formatMessage(messages.removefromwatchlist)}
|
||||
>
|
||||
<Button
|
||||
className="z-40 mr-2"
|
||||
buttonSize={'md'}
|
||||
onClick={onClickDeleteWatchlistBtn}
|
||||
>
|
||||
{isUpdating ? (
|
||||
<Spinner className="h-3" />
|
||||
) : (
|
||||
<MinusCircleIcon className={'h-3'} />
|
||||
)}
|
||||
</Button>
|
||||
</Tooltip>
|
||||
)}
|
||||
</>
|
||||
<PlayButton links={mediaLinks} />
|
||||
<RequestButton
|
||||
mediaType="tv"
|
||||
|
||||
@@ -55,14 +55,6 @@ const JellyfinImportModal: React.FC<JellyfinImportProps> = ({
|
||||
`/api/v1/user?take=${children}`
|
||||
);
|
||||
|
||||
data?.forEach((user, pos) => {
|
||||
if (
|
||||
existingUsers?.results.some((data) => data.jellyfinUserId === user.id)
|
||||
) {
|
||||
data?.splice(pos, 1);
|
||||
}
|
||||
});
|
||||
|
||||
const importUsers = async () => {
|
||||
setImporting(true);
|
||||
|
||||
@@ -215,64 +207,71 @@ const JellyfinImportModal: React.FC<JellyfinImportProps> = ({
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody className="divide-y divide-gray-700 bg-gray-600">
|
||||
{data?.map((user) => (
|
||||
<tr key={`user-${user.id}`}>
|
||||
<td className="whitespace-nowrap px-4 py-4 text-sm font-medium leading-5 text-gray-100">
|
||||
<span
|
||||
role="checkbox"
|
||||
tabIndex={0}
|
||||
aria-checked={isSelectedUser(user.id)}
|
||||
onClick={() => toggleUser(user.id)}
|
||||
onKeyDown={(e) => {
|
||||
if (e.key === 'Enter' || e.key === 'Space') {
|
||||
toggleUser(user.id);
|
||||
}
|
||||
}}
|
||||
className="relative inline-flex h-5 w-10 flex-shrink-0 cursor-pointer items-center justify-center pt-2 focus:outline-none"
|
||||
>
|
||||
{data
|
||||
?.filter(
|
||||
(user) =>
|
||||
!existingUsers?.results.some(
|
||||
(u) => u.jellyfinUserId === user.id
|
||||
)
|
||||
)
|
||||
.map((user) => (
|
||||
<tr key={`user-${user.id}`}>
|
||||
<td className="whitespace-nowrap px-4 py-4 text-sm font-medium leading-5 text-gray-100">
|
||||
<span
|
||||
aria-hidden="true"
|
||||
className={`${
|
||||
isSelectedUser(user.id)
|
||||
? 'bg-indigo-500'
|
||||
: 'bg-gray-800'
|
||||
} absolute mx-auto h-4 w-9 rounded-full transition-colors duration-200 ease-in-out`}
|
||||
></span>
|
||||
<span
|
||||
aria-hidden="true"
|
||||
className={`${
|
||||
isSelectedUser(user.id)
|
||||
? 'translate-x-5'
|
||||
: 'translate-x-0'
|
||||
} absolute left-0 inline-block h-5 w-5 transform rounded-full border border-gray-200 bg-white shadow transition-transform duration-200 ease-in-out group-focus:border-blue-300 group-focus:ring`}
|
||||
></span>
|
||||
</span>
|
||||
</td>
|
||||
<td className="whitespace-nowrap px-1 py-4 text-sm font-medium leading-5 text-gray-100 md:px-6">
|
||||
<div className="flex items-center">
|
||||
<Image
|
||||
className="h-10 w-10 flex-shrink-0 rounded-full"
|
||||
src={user.thumb}
|
||||
alt=""
|
||||
width={40}
|
||||
height={40}
|
||||
/>
|
||||
<div className="ml-4">
|
||||
<div className="text-base font-bold leading-5">
|
||||
{user.username}
|
||||
</div>
|
||||
{/* {user.username &&
|
||||
role="checkbox"
|
||||
tabIndex={0}
|
||||
aria-checked={isSelectedUser(user.id)}
|
||||
onClick={() => toggleUser(user.id)}
|
||||
onKeyDown={(e) => {
|
||||
if (e.key === 'Enter' || e.key === 'Space') {
|
||||
toggleUser(user.id);
|
||||
}
|
||||
}}
|
||||
className="relative inline-flex h-5 w-10 flex-shrink-0 cursor-pointer items-center justify-center pt-2 focus:outline-none"
|
||||
>
|
||||
<span
|
||||
aria-hidden="true"
|
||||
className={`${
|
||||
isSelectedUser(user.id)
|
||||
? 'bg-indigo-500'
|
||||
: 'bg-gray-800'
|
||||
} absolute mx-auto h-4 w-9 rounded-full transition-colors duration-200 ease-in-out`}
|
||||
></span>
|
||||
<span
|
||||
aria-hidden="true"
|
||||
className={`${
|
||||
isSelectedUser(user.id)
|
||||
? 'translate-x-5'
|
||||
: 'translate-x-0'
|
||||
} absolute left-0 inline-block h-5 w-5 transform rounded-full border border-gray-200 bg-white shadow transition-transform duration-200 ease-in-out group-focus:border-blue-300 group-focus:ring`}
|
||||
></span>
|
||||
</span>
|
||||
</td>
|
||||
<td className="whitespace-nowrap px-1 py-4 text-sm font-medium leading-5 text-gray-100 md:px-6">
|
||||
<div className="flex items-center">
|
||||
<Image
|
||||
className="h-10 w-10 flex-shrink-0 rounded-full"
|
||||
src={user.thumb}
|
||||
alt=""
|
||||
width={40}
|
||||
height={40}
|
||||
/>
|
||||
<div className="ml-4">
|
||||
<div className="text-base font-bold leading-5">
|
||||
{user.username}
|
||||
</div>
|
||||
{/* {user.username &&
|
||||
user.username.toLowerCase() !==
|
||||
user.email && (
|
||||
<div className="text-sm leading-5 text-gray-300">
|
||||
{user.email}
|
||||
</div>
|
||||
)} */}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
))}
|
||||
</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
@@ -191,7 +191,7 @@
|
||||
"components.Discover.TvGenreSlider.tvgenres": "Gèneres de Sèries",
|
||||
"components.Discover.TvGenreList.seriesgenres": "Gèneres de Sèries",
|
||||
"components.Discover.StudioSlider.studios": "Estudis",
|
||||
"components.Discover.NetworkSlider.networks": "Plataformes",
|
||||
"components.Discover.NetworkSlider.networks": "Emissors",
|
||||
"components.Discover.MovieGenreSlider.moviegenres": "Gèneres de Pel·lícules",
|
||||
"components.Discover.MovieGenreList.moviegenres": "Gèneres de Pel·lícules",
|
||||
"components.Discover.DiscoverTvLanguage.languageSeries": "Sèries en {language}",
|
||||
@@ -397,7 +397,7 @@
|
||||
"components.TvDetails.originaltitle": "Títol original",
|
||||
"components.TvDetails.originallanguage": "Idioma original",
|
||||
"components.TvDetails.nextAirDate": "Pròxima data d'emissió",
|
||||
"components.TvDetails.network": "{networkCount, plural, one {Plataforma} other {Plataformes}}",
|
||||
"components.TvDetails.network": "{networkCount, plural, one {Emissor} other {Emissors}}",
|
||||
"components.TvDetails.firstAirDate": "Primera data d'emissió",
|
||||
"components.TvDetails.episodeRuntimeMinutes": "{runtime} minuts",
|
||||
"components.TvDetails.episodeRuntime": "Duració de l'episodi",
|
||||
@@ -494,7 +494,7 @@
|
||||
"components.Settings.SonarrModal.validationNameRequired": "Heu de proporcionar un nom de servidor",
|
||||
"components.Settings.SonarrModal.validationLanguageProfileRequired": "Heu de seleccionar un perfil d'idioma",
|
||||
"components.Settings.SonarrModal.validationHostnameRequired": "Heu de proporcionar un nom d’amfitrió o una adreça IP vàlides",
|
||||
"components.Settings.SonarrModal.validationBaseUrlTrailingSlash": "L'URL base no ha d'acabar amb una barra inclinada final",
|
||||
"components.Settings.SonarrModal.validationBaseUrlTrailingSlash": "L'URL base no pot acabar amb una barra inclinada final",
|
||||
"components.Settings.SonarrModal.validationBaseUrlLeadingSlash": "L'URL base ha de tenir una barra inclinada",
|
||||
"components.Settings.SonarrModal.validationApplicationUrlTrailingSlash": "L'URL no pot acabar amb una barra inclinada final",
|
||||
"components.Settings.SonarrModal.validationApplicationUrl": "Heu de proporcionar un URL vàlid",
|
||||
@@ -1135,7 +1135,7 @@
|
||||
"components.Discover.CreateSlider.needresults": "Cal tenir almenys 1 resultat.",
|
||||
"components.Discover.CreateSlider.nooptions": "Sense resultats.",
|
||||
"components.Discover.CreateSlider.providetmdbgenreid": "Proporciona un ID de categoria TMDB",
|
||||
"components.Discover.CreateSlider.providetmdbnetwork": "Proporciona l'ID de la plataforma TMDB",
|
||||
"components.Discover.CreateSlider.providetmdbnetwork": "Proporciona l'ID d'emissor TMDB",
|
||||
"components.Discover.CreateSlider.providetmdbstudio": "Proporciona l'ID d'estudi TMDB",
|
||||
"components.Discover.CreateSlider.searchGenres": "Cercar per gènere…",
|
||||
"components.Discover.CreateSlider.searchKeywords": "Cercar per paraules clau…",
|
||||
@@ -1167,7 +1167,7 @@
|
||||
"components.Discover.networks": "Emissors",
|
||||
"components.Discover.resetwarning": "Restablir tots els controls lliscants al valor predeterminat. Això també suprimirà els controls lliscants personalitzats!",
|
||||
"components.Discover.tmdbmoviekeyword": "Paraula clau de pel·lícula TMDB",
|
||||
"components.Discover.tmdbnetwork": "Plataformes TMDB",
|
||||
"components.Discover.tmdbnetwork": "Emissors TMDB",
|
||||
"components.Discover.FilterSlideover.tmdbuserscore": "Puntuació d'usuaris TMDB",
|
||||
"components.Discover.tvgenres": "Gèneres de sèries",
|
||||
"components.Discover.DiscoverTvKeyword.keywordSeries": "Sèries {keywordTitle}",
|
||||
@@ -1241,18 +1241,11 @@
|
||||
"components.Settings.SettingsJobsCache.availability-sync": "Sincronització de disponibilitat de contingut",
|
||||
"components.Discover.tmdbmoviestreamingservices": "Serveis de transmissió de pel·lícules TMDB",
|
||||
"components.Discover.tmdbtvstreamingservices": "Serveis de transmissió de TV TMDB",
|
||||
"components.Discover.FilterSlideover.tmdbuservotecount": "Recompte de vots dels usuaris de TMDB",
|
||||
"components.Discover.FilterSlideover.voteCount": "Número de vots entre {minValue} i {maxValue}",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.sound": "So per a les notificacions",
|
||||
"components.Settings.Notifications.NotificationsPushover.deviceDefault": "Dispositiu per defecte",
|
||||
"components.Settings.Notifications.NotificationsPushover.sound": "So per a les notificacions",
|
||||
"components.Settings.SonarrModal.animeSeriesType": "Tipus d'Anime",
|
||||
"components.Settings.SonarrModal.seriesType": "Tipus de sèrie",
|
||||
"components.Settings.SonarrModal.tagRequests": "Sol·licituds d'etiquetes",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.deviceDefault": "Dispositiu per defecte",
|
||||
"i18n.collection": "Col·lecció",
|
||||
"components.MovieDetails.imdbuserscore": "Puntuació dels usuaris de IMDB",
|
||||
"components.Settings.RadarrModal.tagRequests": "Sol·licituds d'etiqueta",
|
||||
"components.Settings.RadarrModal.tagRequestsInfo": "Automàticament afegeix una etiqueta addicional amb el nom d'usuari i nom complet del sol·licitant",
|
||||
"components.Settings.SonarrModal.tagRequestsInfo": "Automàticament afegeix una etiqueta addicional amb el nom d'usuari i nom complet del sol·licitant"
|
||||
"components.Layout.UserWarnings.emailRequired": "És requereix un n correu electrònic.",
|
||||
"components.Layout.UserWarnings.passwordRequired": "Es requereix una contrasenya.",
|
||||
"components.Login.description": "Com que és la primera vegada que inicieu sessió a {applicationName}, es necessita afegir un correu electrònic vàlid.",
|
||||
"components.Discover.FilterSlideover.tmdbuservotecount": "Recompte de vots d'usuaris de TMDB",
|
||||
"components.Discover.FilterSlideover.voteCount": "Nombre de vots entre {minValue} i {maxValue}",
|
||||
"components.Layout.UserWarnings.emailInvalid": "El correu electrònic no és vàlid.",
|
||||
"components.Login.credentialerror": "El nom d'usuari o la contrasenya són incorrectes."
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -289,6 +289,7 @@
|
||||
"components.MediaSlider.ShowMoreCard.seemore": "See More",
|
||||
"components.MovieDetails.MovieCast.fullcast": "Full Cast",
|
||||
"components.MovieDetails.MovieCrew.fullcrew": "Full Crew",
|
||||
"components.MovieDetails.addtowatchlist": "Add To Watchlist",
|
||||
"components.MovieDetails.budget": "Budget",
|
||||
"components.MovieDetails.cast": "Cast",
|
||||
"components.MovieDetails.digitalrelease": "Digital Release",
|
||||
@@ -309,6 +310,7 @@
|
||||
"components.MovieDetails.productioncountries": "Production {countryCount, plural, one {Country} other {Countries}}",
|
||||
"components.MovieDetails.recommendations": "Recommendations",
|
||||
"components.MovieDetails.releasedate": "{releaseCount, plural, one {Release Date} other {Release Dates}}",
|
||||
"components.MovieDetails.removefromwatchlist": "Remove From Watchlist",
|
||||
"components.MovieDetails.reportissue": "Report an Issue",
|
||||
"components.MovieDetails.revenue": "Revenue",
|
||||
"components.MovieDetails.rtaudiencescore": "Rotten Tomatoes Audience Score",
|
||||
@@ -322,6 +324,9 @@
|
||||
"components.MovieDetails.theatricalrelease": "Theatrical Release",
|
||||
"components.MovieDetails.tmdbuserscore": "TMDB User Score",
|
||||
"components.MovieDetails.viewfullcrew": "View Full Crew",
|
||||
"components.MovieDetails.watchlistDeleted": "<strong>{title}</strong> Removed from watchlist successfully!",
|
||||
"components.MovieDetails.watchlistError": "Something went wrong try again.",
|
||||
"components.MovieDetails.watchlistSuccess": "<strong>{title}</strong> added to watchlist successfully!",
|
||||
"components.MovieDetails.watchtrailer": "Watch Trailer",
|
||||
"components.NotificationTypeSelector.adminissuecommentDescription": "Get notified when other users comment on issues.",
|
||||
"components.NotificationTypeSelector.adminissuereopenedDescription": "Get notified when issues are reopened by other users.",
|
||||
@@ -468,6 +473,7 @@
|
||||
"components.RequestList.RequestItem.mediaerror": "{mediaType} Not Found",
|
||||
"components.RequestList.RequestItem.modified": "Modified",
|
||||
"components.RequestList.RequestItem.modifieduserdate": "{date} by {user}",
|
||||
"components.RequestList.RequestItem.profileName": "Profile",
|
||||
"components.RequestList.RequestItem.requested": "Requested",
|
||||
"components.RequestList.RequestItem.requesteddate": "Requested",
|
||||
"components.RequestList.RequestItem.seasons": "{seasonCount, plural, one {Season} other {Seasons}}",
|
||||
@@ -952,7 +958,7 @@
|
||||
"components.Settings.is4k": "4K",
|
||||
"components.Settings.jellyfinForgotPasswordUrl": "Forgot Password URL",
|
||||
"components.Settings.jellyfinSettings": "{mediaServerName} Settings",
|
||||
"components.Settings.jellyfinSettingsDescription": "Optionally configure the internal and external endpoints for your {mediaServerName} server. In most cases, the external URL is different to the internal URL. A custom password reset URL can also be set for {mediaServerName} login, in case you would like to redirect to a different password reset page.",
|
||||
"components.Settings.jellyfinSettingsDescription": "Optionally configure the internal and external endpoints for your {mediaServerName} server. In most cases, the external URL is different to the internal URL. A custom password reset URL can also be set for {mediaServerName} login, in case you would like to redirect to a different password reset page. You can also change the Jellyfin API key, which was automatically generated previously.",
|
||||
"components.Settings.jellyfinSettingsFailure": "Something went wrong while saving {mediaServerName} settings.",
|
||||
"components.Settings.jellyfinSettingsSuccess": "{mediaServerName} settings saved successfully!",
|
||||
"components.Settings.jellyfinSyncFailedAutomaticGroupedFolders": "Custom authentication with Automatic Library Grouping not supported",
|
||||
@@ -1060,6 +1066,7 @@
|
||||
"components.StatusBadge.openinarr": "Open in {arr}",
|
||||
"components.StatusBadge.playonplex": "Play on {mediaServerName}",
|
||||
"components.StatusBadge.seasonepisodenumber": "S{seasonNumber}E{episodeNumber}",
|
||||
"components.StatusBadge.seasonnumber": "S{seasonNumber}",
|
||||
"components.StatusBadge.status": "{status}",
|
||||
"components.StatusBadge.status4k": "4K {status}",
|
||||
"components.StatusChecker.appUpdated": "{applicationTitle} Updated",
|
||||
@@ -1080,6 +1087,7 @@
|
||||
"components.TvDetails.Season.somethingwentwrong": "Something went wrong while retrieving season data.",
|
||||
"components.TvDetails.TvCast.fullseriescast": "Full Series Cast",
|
||||
"components.TvDetails.TvCrew.fullseriescrew": "Full Series Crew",
|
||||
"components.TvDetails.addtowatchlist": "Add To Watchlist",
|
||||
"components.TvDetails.anime": "Anime",
|
||||
"components.TvDetails.cast": "Cast",
|
||||
"components.TvDetails.episodeCount": "{episodeCount, plural, one {# Episode} other {# Episodes}}",
|
||||
@@ -1097,6 +1105,7 @@
|
||||
"components.TvDetails.play4k": "Play 4K on {mediaServerName}",
|
||||
"components.TvDetails.productioncountries": "Production {countryCount, plural, one {Country} other {Countries}}",
|
||||
"components.TvDetails.recommendations": "Recommendations",
|
||||
"components.TvDetails.removefromwatchlist": "Remove From Watchlist",
|
||||
"components.TvDetails.reportissue": "Report an Issue",
|
||||
"components.TvDetails.rtaudiencescore": "Rotten Tomatoes Audience Score",
|
||||
"components.TvDetails.rtcriticsscore": "Rotten Tomatoes Tomatometer",
|
||||
@@ -1109,6 +1118,9 @@
|
||||
"components.TvDetails.streamingproviders": "Currently Streaming On",
|
||||
"components.TvDetails.tmdbuserscore": "TMDB User Score",
|
||||
"components.TvDetails.viewfullcrew": "View Full Crew",
|
||||
"components.TvDetails.watchlistDeleted": "<strong>{title}</strong> Removed from watchlist successfully!",
|
||||
"components.TvDetails.watchlistError": "Something went wrong try again.",
|
||||
"components.TvDetails.watchlistSuccess": "<strong>{title}</strong> added to watchlist successfully!",
|
||||
"components.TvDetails.watchtrailer": "Watch Trailer",
|
||||
"components.UserList.accounttype": "Type",
|
||||
"components.UserList.admin": "Admin",
|
||||
|
||||
@@ -201,7 +201,7 @@
|
||||
"components.Settings.SonarrModal.animerootfolder": "Carpeta raíz de anime",
|
||||
"components.Settings.SonarrModal.animequalityprofile": "Perfil de calidad de anime",
|
||||
"components.Settings.SettingsAbout.timezone": "Zona horaria",
|
||||
"components.Settings.SettingsAbout.supportoverseerr": "Apoya a Jellyseerr",
|
||||
"components.Settings.SettingsAbout.supportoverseerr": "Apoya a Overseerr",
|
||||
"components.Settings.SettingsAbout.helppaycoffee": "Ayúdame invitándome a un café",
|
||||
"components.Settings.SettingsAbout.Releases.viewongithub": "Ver en GitHub",
|
||||
"components.Settings.SettingsAbout.Releases.viewchangelog": "Ver registro de cambios",
|
||||
@@ -299,14 +299,14 @@
|
||||
"components.RequestButton.viewrequest": "Ver Solicitud",
|
||||
"components.RequestButton.requestmore4k": "Solicitar más en 4K",
|
||||
"components.RequestButton.requestmore": "Solicitar más",
|
||||
"components.RequestButton.declinerequests": "Rechazar {requestCount, plural, one {solicitud} other {{requestCount} solicitudes}}",
|
||||
"components.RequestButton.declinerequests": "Rechazar {requestCount, plural, one {Request} other {{requestCount} Requests}}",
|
||||
"components.RequestButton.declinerequest4k": "Rechazar Solicitud 4K",
|
||||
"components.RequestButton.declinerequest": "Rechazar Solicitud",
|
||||
"components.RequestButton.decline4krequests": "Rechazar {requestCount, plural, one {solicitud en 4K} other {{requestCount} solicitudes en 4K}}",
|
||||
"components.RequestButton.approverequests": "Aprobar {requestCount, plural, one {solicitud} other {{requestCount} solicitudes}}",
|
||||
"components.RequestButton.decline4krequests": "Rechazar {requestCount, plural, one {4K Request} other {{requestCount} 4K Requests}}",
|
||||
"components.RequestButton.approverequests": "Aprobar {requestCount, plural, one {Request} other {{requestCount} Requests}}",
|
||||
"components.RequestButton.approverequest4k": "Aprobar Solicitud 4K",
|
||||
"components.RequestButton.approverequest": "Aprobar Solicitud",
|
||||
"components.RequestButton.approve4krequests": "Aprobar {requestCount, plural, one {petición en 4K} other {requestCount} peticiones en 4K}}",
|
||||
"components.RequestButton.approve4krequests": "Aprobar {requestCount, plural, one {4K Request} other {{requestCount} 4K Requests}}",
|
||||
"components.RequestBlock.server": "Servidor de Destino",
|
||||
"components.RequestBlock.rootfolder": "Carpeta Raíz",
|
||||
"components.RequestBlock.profilechanged": "Perfil de Calidad",
|
||||
@@ -656,7 +656,7 @@
|
||||
"components.QuotaSelector.unlimited": "Ilimitadas",
|
||||
"components.MovieDetails.originaltitle": "Título Original",
|
||||
"components.LanguageSelector.originalLanguageDefault": "Todos los Idiomas",
|
||||
"components.LanguageSelector.languageServerDefault": "({Language}) por defecto",
|
||||
"components.LanguageSelector.languageServerDefault": "({language}) por defecto",
|
||||
"components.Layout.VersionStatus.commitsbehind": "{commitsBehind} {commitsBehind, plural, one {cambio} other {cambios}} por detrás",
|
||||
"components.UserProfile.UserSettings.UserPasswordChange.noPasswordSetOwnAccount": "Tu cuenta no tiene configurada una contraseña actualmente. Configure una contraseña a continuación para habilitar el acceso como \"usuario local\" utilizando tu dirección de email.",
|
||||
"components.UserProfile.UserSettings.UserPasswordChange.noPasswordSet": "Esta cuenta de usuario no tiene configurada una contraseña actualmente. Configure una contraseña a continuación para habilitar el acceso como \"usuario local\"",
|
||||
@@ -784,7 +784,7 @@
|
||||
"components.DownloadBlock.estimatedtime": "Estimación de {time}",
|
||||
"components.Settings.Notifications.encryptionOpportunisticTls": "Usa siempre STARTTLS",
|
||||
"components.TvDetails.streamingproviders": "Emisión Actual en",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.languageDefault": "{{Language}} por defecto",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.languageDefault": "({language}) por defecto",
|
||||
"components.Settings.Notifications.NotificationsWebPush.httpsRequirement": "Para recibir notificaciones web push, Jellyseerr debe servirse mediante HTTPS.",
|
||||
"components.Settings.Notifications.NotificationsWebhook.validationTypes": "Debes seleccionar, al menos, un tipo de notificación",
|
||||
"components.Settings.Notifications.validationTypes": "Debes seleccionar, al menos, un tipo de notificación",
|
||||
@@ -816,10 +816,10 @@
|
||||
"components.Settings.Notifications.encryptionTip": "Normalmente, TLS Implícito usa el puerto 465 y STARTTLS usa el puerto 587",
|
||||
"components.UserList.localLoginDisabled": "El ajuste para <strong>Habilitar el Inicio de Sesión Local</strong> está actualmente deshabilitado.",
|
||||
"components.Settings.SettingsUsers.defaultPermissionsTip": "Permisos iniciales asignados a nuevos usuarios",
|
||||
"components.Settings.SettingsAbout.runningDevelop": "Estás utilizando la rama de <code>develop</code> de Jellyseerr, la cual solo se recomienda para aquellos que contribuyen al desarrollo o al soporte de las pruebas de nuevos desarrollos.",
|
||||
"components.Settings.SettingsAbout.runningDevelop": "Estás utilizando la rama de <code>desarrollo</code> de Jellyseerr, la cual solo se recomienda para aquellos que contribuyen al desarrollo o al soporte de las pruebas de nuevos desarrollos.",
|
||||
"components.StatusBadge.status": "{status}",
|
||||
"components.Settings.SettingsJobsCache.editJobScheduleSelectorMinutes": "Cada {jobScheduleMinutes, plural, one {minuto} other {{jobScheduleMinutes} minutos}}",
|
||||
"components.Settings.SettingsJobsCache.editJobScheduleSelectorHours": "Cada {jobScheduleHours, plural, one {hora} other {{jobScheduleHours} horas}}",
|
||||
"components.Settings.SettingsJobsCache.editJobScheduleSelectorMinutes": "Cada {jobScheduleMinutes, plural, one {minute} other {{jobScheduleMinutes} minutes}}",
|
||||
"components.Settings.SettingsJobsCache.editJobScheduleSelectorHours": "Cada {jobScheduleHours, plural, one {hour} other {{jobScheduleHours} hours}}",
|
||||
"components.Settings.SettingsJobsCache.jobScheduleEditFailed": "Algo fue mal al guardar la tarea programada.",
|
||||
"components.Settings.SettingsJobsCache.editJobSchedule": "Modificar tarea programada",
|
||||
"components.Settings.SettingsJobsCache.editJobSchedulePrompt": "Nueva frecuencia",
|
||||
@@ -848,7 +848,7 @@
|
||||
"components.IssueDetails.nocomments": "Sin comentarios.",
|
||||
"components.IssueDetails.openedby": "#{issueId} abierta {relativeTime} por {username}",
|
||||
"components.IssueDetails.openin4karr": "Abrir en {arr} 4K",
|
||||
"components.IssueDetails.openinarr": "Abierta en {arr}",
|
||||
"components.IssueDetails.openinarr": "Abrir en {arr}",
|
||||
"components.IssueDetails.play4konplex": "Ver en 4K en {mediaServerName}",
|
||||
"components.IssueDetails.playonplex": "Ver en {mediaServerName}",
|
||||
"components.IssueDetails.problemepisode": "Episodio Afectado",
|
||||
@@ -1193,7 +1193,7 @@
|
||||
"components.RequestList.RequestItem.tvdbid": "Identificador de TheTVDB",
|
||||
"components.Settings.SettingsJobsCache.image-cache-cleanup": "Limpieza de la caché de imágenes",
|
||||
"components.Settings.SettingsJobsCache.imagecache": "Caché de imágenes",
|
||||
"components.Settings.SettingsJobsCache.editJobScheduleSelectorSeconds": "Cada {jobScheduleSeconds, plural, one {segundo} other {{jobScheduleSeconds} segundos}}",
|
||||
"components.Settings.SettingsJobsCache.editJobScheduleSelectorSeconds": "Cada {jobScheduleSeconds, plural, one {second} other {{jobScheduleSeconds} seconds}}",
|
||||
"components.Settings.SettingsJobsCache.availability-sync": "Sincronización de la disponibilidad de medios",
|
||||
"components.Discover.tmdbmoviestreamingservices": "Servicios de streaming de películas TMDB",
|
||||
"components.Discover.tmdbtvstreamingservices": "Servicios de TV en streaming TMDB",
|
||||
@@ -1205,10 +1205,110 @@
|
||||
"components.Settings.RadarrModal.tagRequestsInfo": "Añadir automáticamente una etiqueta adicional con el nombre de usuario y el nombre para mostrar del solicitante",
|
||||
"components.Settings.SonarrModal.tagRequestsInfo": "Añadir automáticamente una etiqueta adicional con el nombre de usuario y el nombre para mostrar del solicitante",
|
||||
"components.MovieDetails.imdbuserscore": "Puntuación de los usuarios de IMDB",
|
||||
"components.Settings.SonarrModal.animeSeriesType": "Tipo de anime",
|
||||
"components.Settings.SonarrModal.seriesType": "Tipo de series",
|
||||
"components.Settings.Notifications.NotificationsPushover.sound": "Sonido para las notificaciones",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.deviceDefault": "Dispositivo predeterminado",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.sound": "Sonido para las notificaciones",
|
||||
"components.Settings.Notifications.NotificationsPushover.deviceDefault": "Dispositivo predeterminado"
|
||||
"components.Layout.UserWarnings.passwordRequired": "Se requiere una contraseña.",
|
||||
"components.Login.credentialerror": "El usuario o contraseña es incorrecto.",
|
||||
"components.Login.host": "{mediaServerName} URL",
|
||||
"components.Login.initialsignin": "Conectar",
|
||||
"components.Login.initialsigningin": "Conectando…",
|
||||
"components.Login.emailtooltip": "No es necesario asociar la dirección con su instancia de {mediaServerName}.",
|
||||
"components.Login.saving": "Añadiendo…",
|
||||
"components.Login.title": "Añadir Email",
|
||||
"components.Login.username": "Nombre de usuario",
|
||||
"components.Login.validationEmailFormat": "El email es inválido",
|
||||
"components.Login.validationEmailRequired": "Debes proporcional un email",
|
||||
"components.Login.validationemailformat": "Se requiere de un email válido",
|
||||
"components.Login.validationhostformat": "Se requiere de una URL válida",
|
||||
"components.Login.validationusernamerequired": "Se requiere un nombre de usuario",
|
||||
"components.ManageSlideOver.manageModalRemoveMediaWarning": "* Esto eliminará de manera irreversible esta {mediaType} de {arr}, incluyendo todos los archivos.",
|
||||
"i18n.open": "Abierto",
|
||||
"components.MovieDetails.downloadstatus": "Estado de la descarga",
|
||||
"components.MovieDetails.openradarr": "Abrir Película en Radarr",
|
||||
"components.MovieDetails.openradarr4k": "Abrir Película 4K en Radarr",
|
||||
"components.MovieDetails.play": "Reproducir en {mediaServerName}",
|
||||
"components.MovieDetails.play4k": "Reproducir 4K en {mediaServerName}",
|
||||
"components.NotificationTypeSelector.issueresolved": "Incidencia Resuelta",
|
||||
"components.NotificationTypeSelector.userissuecommentDescription": "Notificame cuando haya nuevos comentarios en incidencias que haya abierto.",
|
||||
"components.NotificationTypeSelector.userissuecreatedDescription": "Notificame cuando otros usuarios reporten incidencias.",
|
||||
"components.PermissionEdit.viewissues": "Ver incidencias",
|
||||
"components.PermissionEdit.manageissuesDescription": "Dar permiso para administrar incidencias.",
|
||||
"components.PermissionEdit.viewissuesDescription": "Dar permiso para ver incidencias reportadas por otros usuarios.",
|
||||
"components.Settings.Notifications.NotificationsPushover.sound": "Sonido de Notificacion",
|
||||
"components.Settings.SettingsJobsCache.jellyfin-recently-added-scan": "Escanear Añadidos Recientemente de Jellyfin",
|
||||
"components.Settings.SettingsJobsCache.jellyfin-full-scan": "Escaneo Completo de la libreria de Jellyfin",
|
||||
"components.Settings.jellyfinSettings": "Ajustes de {mediaServerName}",
|
||||
"components.Settings.jellyfinsettings": "Ajustes de {mediaServerName}",
|
||||
"components.Settings.jellyfinSettingsFailure": "Algo salió mal al guardar la configuración de {mediaServerName}.",
|
||||
"components.Settings.jellyfinSettingsSuccess": "¡La configuración de {mediaServerName} se guardó correctamente!",
|
||||
"components.Settings.jellyfinlibraries": "Bibliotecas {mediaServerName}",
|
||||
"components.Settings.jellyfinlibrariesDescription": "La biblioteca {mediaServerName} busca títulos. Haga clic en el botón a continuación si no aparece ninguna biblioteca.",
|
||||
"components.Settings.manualscanDescriptionJellyfin": "Normalmente, esto sólo se ejecutará una vez cada 24 horas. Jellyseerr comprobará de forma más agresiva los añadidos recientemente de su servidor {mediaServerName}. ¡Si es la primera vez que configura Jellyseerr, se recomienda un escaneo manual completo de la biblioteca!",
|
||||
"components.Settings.save": "Guardar Cambios",
|
||||
"components.Settings.saving": "Guardando…",
|
||||
"components.Settings.syncing": "Sincronizando",
|
||||
"components.Settings.timeout": "Tiempo agotado",
|
||||
"components.Setup.signinWithPlex": "Usa tu cuenta de Plex",
|
||||
"components.Setup.configuremediaserver": "Configurar servidor multimedia",
|
||||
"components.TitleCard.addToWatchList": "Añadir a lista de seguimiento",
|
||||
"components.TitleCard.watchlistCancel": "Lista de seguimiento para <strong>{title}</strong> cancelada.",
|
||||
"components.TitleCard.watchlistError": "Algo salió mal, intenta de nuevo.",
|
||||
"components.TitleCard.watchlistSuccess": "<strong>{title}</strong> añadido correctamente a la lista de seguimiento!",
|
||||
"components.TvDetails.play": "Reproducir en {mediaServerName}",
|
||||
"components.UserList.importfromJellyfin": "Importar Usuarios de {mediaServerName}",
|
||||
"components.UserList.mediaServerUser": "Usuario de {mediaServerName}",
|
||||
"components.UserList.importedfromJellyfin": "<strong>{userCount}</strong> {mediaServerName} {userCount, plural, one {user} other {users}} importado correctamente!",
|
||||
"components.UserList.importfromJellyfinerror": "Se produjo un error al importar usuarios de {mediaServerName}.",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.save": "Guardar Cambios",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.email": "Email",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.deviceDefault": "Dispositivo Predeterminado",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.sound": "Sonido de Notificacion",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.pushbulletsettingsfailed": "Fallo al guardar los ajustes de la notificación Pushbullet.",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.pushbulletsettingssaved": "¡Los ajustes de notificación Pushbullet se han guardado con éxito!",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.pushoverApplicationToken": "Token de aplicación API",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.pushoverUserKey": "Clave de usuario o grupo",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.pushoverUserKeyTip": "Tu <UsersGroupsLink>identificador de usuario o grupo</UsersGroupsLink> de 30 caracteres",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.pushoversettingssaved": "¡Se han guardado los ajustes de notificación de Pushover!",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.pushoverApplicationTokenTip": "<ApplicationRegistrationLink>Registrar una aplicación</ApplicationRegistrationLink> para usar con {applicationTitle}",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.validationPushoverUserKey": "Debes proporcionar una clave de usuario o grupo válida",
|
||||
"components.Login.validationhostrequired": "{mediaServerName} URL requerida",
|
||||
"i18n.resolved": "Resuelto",
|
||||
"components.UserList.importfrommediaserver": "Importar Usuarios de {mediaServerName}",
|
||||
"components.Settings.Notifications.NotificationsPushover.deviceDefault": "Dispositivo Predeterminado",
|
||||
"components.ManageSlideOver.removearr": "Eliminar de {arr}",
|
||||
"components.NotificationTypeSelector.issuereopenedDescription": "Enviar notificación cuando se reabran incidencias.",
|
||||
"components.Layout.UserWarnings.emailRequired": "Se requiere una dirección de email.",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.pushbulletAccessToken": "Token de Acceso",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.validationPushoverApplicationToken": "Debes proporcionar un token de aplicación válido",
|
||||
"components.Settings.syncJellyfin": "Sincronizar Bibliotecas",
|
||||
"components.Layout.UserWarnings.emailInvalid": "La dirección de correo es inválida.",
|
||||
"components.Login.description": "Como es la primera vez que inicias sesión en {applicationName}, es necesario añadir una dirección de email válida.",
|
||||
"components.Login.save": "Añadir",
|
||||
"components.NotificationTypeSelector.issueresolvedDescription": "Enviar notificación cuando se resuelvan incidencias.",
|
||||
"components.PermissionEdit.manageissues": "Administrar incidencias",
|
||||
"components.PermissionEdit.createissues": "Notificar incidencia",
|
||||
"components.Settings.menuJellyfinSettings": "{mediaServerName}",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.saving": "Guardando…",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.validationPushbulletAccessToken": "Debes indicar un token de acceso",
|
||||
"components.Login.signinwithjellyfin": "Utiliza tu cuenta de {mediaServerName}",
|
||||
"components.ManageSlideOver.removearr4k": "Eliminar de {arr} 4K",
|
||||
"components.Settings.internalUrl": "URL Interna",
|
||||
"components.TvDetails.play4k": "Reproducir 4K en {mediaServerName}",
|
||||
"components.Setup.signin": "Iniciar Sesión",
|
||||
"components.Setup.signinWithJellyfin": "Utiliza tu cuenta de {mediaServerName}",
|
||||
"components.UserList.noJellyfinuserstoimport": "No hay usuarios de {mediaServerName} que importar.",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.mediaServerUser": "Usuario de {mediaServerName}",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.pushbulletAccessTokenTip": "Crea un token desde tu <PushbulletSettingsLink>Opciones de Cuenta</PushbulletSettingsLink>",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.pushoversettingsfailed": "No se pudo guardar la configuración de notificaciones de Pushover.",
|
||||
"components.NotificationTypeSelector.userissuereopenedDescription": "Recibir notificaciones cuando se vuelvan a abrir incidencias que haya reportado.",
|
||||
"components.NotificationTypeSelector.userissueresolvedDescription": "Reciba notificaciones cuando se resuelvan las incidencias que haya reportado.",
|
||||
"components.PermissionEdit.createissuesDescription": "Dar permiso para informar incidencias.",
|
||||
"components.Settings.SettingsAbout.supportjellyseerr": "Apoya a Jellyseerr",
|
||||
"components.Settings.Notifications.userEmailRequired": "Requerir email de usuario",
|
||||
"components.Settings.SonarrModal.animeSeriesType": "Tipo de Serie Anime",
|
||||
"components.Settings.SonarrModal.seriesType": "Tipo Serie",
|
||||
"components.Settings.jellyfinSettingsDescription": "Opcionalmente, configure los puntos finales internos y externos para su servidor {mediaServerName}. En la mayoría de los casos, la URL externa es diferente a la URL interna. También se puede configurar una URL de restablecimiento de contraseña personalizada para el inicio de sesión de {mediaServerName}, en caso de que desee redirigir a una página de restablecimiento de contraseña diferente.",
|
||||
"components.Settings.jellyfinsettingsDescription": "Configure los ajustes para su servidor {mediaServerName}. {mediaServerName} escanea sus bibliotecas de {mediaServerName} para ver qué contenido está disponible.",
|
||||
"components.Settings.manualscanJellyfin": "Escanear Libreria Manualmente",
|
||||
"components.TitleCard.watchlistDeleted": "<strong>{title}</strong> Eliminado correctamente de la lista de seguimiento!",
|
||||
"components.UserList.newJellyfinsigninenabled": "La configuración <strong>Habilitar nuevo inicio de sesión de {mediaServerName}</strong> está actualmente habilitada. Los usuarios de {mediaServerName} con acceso a la biblioteca no necesitan ser importados para poder iniciar sesión.",
|
||||
"components.UserProfile.localWatchlist": "Lista de seguimiento de {username}"
|
||||
}
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
"components.Discover.DiscoverTvGenre.genreSeries": "Séries {genre}",
|
||||
"components.Discover.DiscoverTvKeyword.keywordSeries": "{keywordTitle} Séries",
|
||||
"components.Discover.DiscoverTvLanguage.languageSeries": "Séries en {language}",
|
||||
"components.Discover.DiscoverWatchlist.discoverwatchlist": "Votre watchlist Plex",
|
||||
"components.Discover.DiscoverWatchlist.discoverwatchlist": "Votre watchlist",
|
||||
"components.Discover.DiscoverWatchlist.watchlist": "Watchlist Plex",
|
||||
"components.Discover.FilterSlideover.activefilters": "{count, plural, one {# Filtre actif} other {# Filtres actifs}}",
|
||||
"components.Discover.FilterSlideover.clearfilters": "Effacer les filtres actifs",
|
||||
@@ -176,7 +176,7 @@
|
||||
"components.Settings.RadarrModal.port": "Port",
|
||||
"components.Settings.RadarrModal.qualityprofile": "Profil de qualité",
|
||||
"components.Settings.RadarrModal.rootfolder": "Dossier racine",
|
||||
"components.Settings.RadarrModal.selectMinimumAvailability": "Sélectionner une disponibilité minimale",
|
||||
"components.Settings.RadarrModal.selectMinimumAvailability": "Sélectionner une disponibilté minimale",
|
||||
"components.Settings.RadarrModal.selectQualityProfile": "Sélectionner un profil qualité",
|
||||
"components.Settings.RadarrModal.selectRootFolder": "Sélectionner un dossier racine",
|
||||
"components.Settings.RadarrModal.server4k": "Serveur 4K",
|
||||
@@ -277,7 +277,7 @@
|
||||
"i18n.tvshows": "Séries",
|
||||
"i18n.unavailable": "Indisponible",
|
||||
"pages.oops": "Oups",
|
||||
"pages.returnHome": "Retourner à l'accueil",
|
||||
"pages.returnHome": "Retourner à l'acceuil",
|
||||
"components.TvDetails.TvCast.fullseriescast": "Casting complet de la série",
|
||||
"components.MovieDetails.MovieCast.fullcast": "Casting complet",
|
||||
"components.Settings.Notifications.emailsettingssaved": "Paramètres de notification par e-mail enregistrés avec succès !",
|
||||
@@ -323,7 +323,7 @@
|
||||
"components.Settings.SettingsAbout.Releases.viewchangelog": "Voir le journal des modifications",
|
||||
"components.Settings.SettingsAbout.Releases.versionChangelog": "Journal des modifications de la version {version}",
|
||||
"components.Settings.SettingsAbout.Releases.releases": "Versions",
|
||||
"components.Settings.SettingsAbout.Releases.releasedataMissing": "Les données de version sont actuellement indisponibles.",
|
||||
"components.Settings.SettingsAbout.Releases.releasedataMissing": "Les données de version sont actuellement indisponible.",
|
||||
"components.Settings.SettingsAbout.Releases.latestversion": "Dernière version",
|
||||
"components.Settings.SettingsAbout.Releases.currentversion": "Actuelle",
|
||||
"components.UserList.importfromplexerror": "Une erreur s'est produite durant l'importation des utilisateurs de Plex.",
|
||||
@@ -1071,7 +1071,7 @@
|
||||
"components.ManageSlideOver.manageModalMedia4k": "Média(s) 4K",
|
||||
"components.ManageSlideOver.markallseasons4kavailable": "Marquer toutes les saisons comme disponibles en 4K",
|
||||
"components.ManageSlideOver.playedby": "Joué par",
|
||||
"components.Settings.validationUrlTrailingSlash": "L'URL ne doit pas se terminer par un slash",
|
||||
"components.Settings.validationUrlTrailingSlash": "L'URL ne doit pas ce terminer par un slash",
|
||||
"components.Settings.externalUrl": "URL externe",
|
||||
"components.Settings.tautulliApiKey": "Clé API",
|
||||
"components.Settings.tautulliSettings": "Paramètres Tautulli",
|
||||
@@ -1252,10 +1252,70 @@
|
||||
"components.Settings.SonarrModal.tagRequestsInfo": "Ajouter automatiquement un tag supplémentaire avec l'ID utilisateur et le nom d'affichage du demandeur",
|
||||
"i18n.collection": "Collection",
|
||||
"components.Settings.RadarrModal.tagRequestsInfo": "Ajouter automatiquement un tag supplémentaire avec l'ID utilisateur et le nom d'affichage du demandeur",
|
||||
"components.Settings.SonarrModal.seriesType": "Type de série",
|
||||
"components.Settings.SonarrModal.animeSeriesType": "Types d'anime",
|
||||
"components.IssueModal.issueVideo": "Vidéo",
|
||||
"components.Settings.Notifications.NotificationsPushover.sound": "Son de notification",
|
||||
"components.Settings.jellyfinSettings": "Paramètres pour {mediaServerName}",
|
||||
"components.Settings.jellyfinSettingsFailure": "Une erreur est survenue lors de l'enregistrement des paramètres pour {mediaServerName}.",
|
||||
"components.Settings.jellyfinSettingsSuccess": "Les paramètres pour {mediaServerName} ont été enregistrés avec succès !",
|
||||
"components.Settings.jellyfinlibraries": "Bibliothèques {mediaServerName}",
|
||||
"components.Settings.jellyfinlibrariesDescription": "Les bibliothèques de {mediaServerName} sont en cours d'analyze. Cliquez sur le bouton ci-dessous si aucune bibliothèque n'est répertoriée.",
|
||||
"components.Settings.jellyfinsettings": "Paramètres pour {mediaServerName}",
|
||||
"components.Settings.manualscanJellyfin": "Analyse manuelle de la bibliothèque",
|
||||
"components.Settings.menuJellyfinSettings": "{mediaServerName}",
|
||||
"components.Settings.save": "Enregistrer les modifications",
|
||||
"components.Settings.saving": "Sauvegarde en cours…",
|
||||
"components.Settings.syncing": "Synchronisation en cours",
|
||||
"components.Setup.signin": "Se connecter",
|
||||
"components.Setup.signinWithPlex": "Utilisez votre compte Plex",
|
||||
"components.StatusBadge.managemedia": "Gérer {mediaType}",
|
||||
"components.StatusBadge.openinarr": "Ouvrir dans {arr}",
|
||||
"components.StatusBadge.playonplex": "Lire sur {mediaServerName}",
|
||||
"components.TitleCard.addToWatchList": "Ajouter à votre watchlist",
|
||||
"components.TitleCard.watchlistCancel": "Watchlist pour <strong>{title}</strong> annulée.",
|
||||
"components.TitleCard.watchlistError": "Une erreur est survenue. Veuillez réessayer.",
|
||||
"components.TitleCard.watchlistSuccess": "<strong>{title}</strong> a été ajouté à votre watchlist avec succès !",
|
||||
"components.TvDetails.Season.somethingwentwrong": "Une erreur est survenue lors de la récupération des données de la saison.",
|
||||
"components.TvDetails.manageseries": "Gérer les séries",
|
||||
"components.TvDetails.play": "Jouer sur {mediaServerName}",
|
||||
"components.TvDetails.play4k": "Jouer en 4K sur {mediaServerName}",
|
||||
"components.TvDetails.rtcriticsscore": "Tomatometer sur Rotten Tomatoes",
|
||||
"components.TvDetails.seasonnumber": "Saison {seasonNumber}",
|
||||
"components.TvDetails.seasonstitle": "Saisons",
|
||||
"components.TvDetails.status4k": "{status} 4K",
|
||||
"components.TvDetails.tmdbuserscore": "Score utilisateur sur TMDB",
|
||||
"components.UserList.importfromJellyfin": "Importer les utilisateurs de {mediaServerName}",
|
||||
"components.UserList.importfromJellyfinerror": "Une erreur est survenue lors de l'importation des utilisateurs de {mediaServerName}.",
|
||||
"components.UserList.importfrommediaserver": "Importer les utilisateurs de {mediaServerName}",
|
||||
"components.UserList.noJellyfinuserstoimport": "Il n'y a aucun utilisateur à importer pour {mediaServerName}.",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.saving": "Sauvegarde en cours…",
|
||||
"components.UserProfile.plexwatchlist": "Watchlist Plex",
|
||||
"components.Settings.syncJellyfin": "Synchroniser les bibliothèques",
|
||||
"components.TitleCard.watchlistDeleted": "<strong>{title}</strong> a été retiré de votre watchlist avec succès !",
|
||||
"components.IssueModal.issueSubtitles": "Sous-titre",
|
||||
"components.Login.emailtooltip": "L'adresse ne nécessite pas d'être associée avec votre instance {mediaServerName}.",
|
||||
"components.Settings.Notifications.NotificationsPushover.deviceDefault": "Appareil par défaut",
|
||||
"components.Settings.Notifications.userEmailRequired": "E-mail utilisateur requis",
|
||||
"components.Settings.SettingsAbout.supportjellyseerr": "Soutenez Jellyseerr",
|
||||
"components.Settings.SettingsJobsCache.jellyfin-full-scan": "Scan complet des bibliothèques Jellyfin",
|
||||
"components.Settings.SettingsJobsCache.jellyfin-recently-added-scan": "Scan des ajouts récents aux bibliothèques Jellyfin",
|
||||
"components.Settings.SonarrModal.animeSeriesType": "Type de série anime",
|
||||
"components.Settings.SonarrModal.seriesType": "Type de série",
|
||||
"components.Settings.internalUrl": "URL interne",
|
||||
"components.Settings.jellyfinsettingsDescription": "Configurez les paramètres de votre serveur {mediaServerName}. {mediaServerName} analyse vos bibliothèques {mediaServerName} pour voir quel contenu est disponible.",
|
||||
"components.Settings.jellyfinSettingsDescription": "Configurez facultativement les URL internes et externes pour votre serveur {mediaServerName}. Dans la plupart des cas, l'URL externe est différente de l'URL interne. Vous pouvez également définir une URL de réinitialisation de mot de passe personnalisée pour la connexion à {mediaServerName}, au cas où vous souhaiteriez rediriger vers une page de réinitialisation de mot de passe différente.",
|
||||
"components.Settings.manualscanDescriptionJellyfin": "Normalement, cette tâche est executée qu'une fois toutes les 24 heures. Jellyseerr vérifiera plus agressivement les éléments récemment ajoutés à votre serveur {mediaServerName}. Si c'est la première fois que vous configurez Jellyseerr, une analyse complète manuelle de la bibliothèque est recommandée !",
|
||||
"components.Settings.timeout": "Temps écoulé",
|
||||
"components.Setup.configuremediaserver": "Configurer le serveur multimédia",
|
||||
"components.TvDetails.rtaudiencescore": "Score de l'audience sur Rotten Tomatoes",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.mediaServerUser": "Utilisateur pour {mediaServerName}",
|
||||
"components.Setup.signinWithJellyfin": "Utilisez votre compte {mediaServerName}",
|
||||
"components.UserList.mediaServerUser": "Utilisateur de {mediaServerName}",
|
||||
"components.TvDetails.episodeCount": "{episodeCount, plural, one {# Épisode} other {# Épisodes}}",
|
||||
"components.UserList.newJellyfinsigninenabled": "Le paramètre <strong>Activer la nouvelle connexion à {mediaServerName}</strong> est actuellement activé. Les utilisateurs de {mediaServerName} avec accès à la bibliothèque n'ont pas besoin d'être importés pour se connecter.",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.email": "E-mail",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.save": "Enregistrer les modifications",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.deviceDefault": "Appareil par défaut",
|
||||
"components.UserList.importedfromJellyfin": "<strong>{userCount}</strong> {mediaServerName} {userCount, plural, one {user} other {users}} importé(s) avec succès !",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.sound": "Son de notification",
|
||||
"components.Settings.Notifications.NotificationsPushover.sound": "Son de notification"
|
||||
"components.UserProfile.localWatchlist": "Watchlist de {username}"
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -3,12 +3,12 @@
|
||||
"components.Discover.discovertv": "Populaire series",
|
||||
"components.Discover.popularmovies": "Populaire films",
|
||||
"components.Discover.populartv": "Populaire series",
|
||||
"components.Discover.recentlyAdded": "Recent toegevoegd",
|
||||
"components.Discover.recentlyAdded": "Onlangs toegevoegd",
|
||||
"components.Discover.recentrequests": "Recente verzoeken",
|
||||
"components.Discover.trending": "Trending",
|
||||
"components.Discover.upcoming": "Verwachte films",
|
||||
"components.Discover.upcomingmovies": "Verwachte films",
|
||||
"components.Layout.SearchInput.searchPlaceholder": "Zoek films en series",
|
||||
"components.Layout.SearchInput.searchPlaceholder": "Films en series zoeken",
|
||||
"components.Layout.Sidebar.dashboard": "Ontdekken",
|
||||
"components.Layout.Sidebar.requests": "Verzoeken",
|
||||
"components.Layout.Sidebar.settings": "Instellingen",
|
||||
@@ -16,7 +16,7 @@
|
||||
"components.Layout.UserDropdown.signout": "Uitloggen",
|
||||
"components.MovieDetails.budget": "Budget",
|
||||
"components.MovieDetails.cast": "Cast",
|
||||
"components.MovieDetails.originallanguage": "Originele taal",
|
||||
"components.MovieDetails.originallanguage": "Oorspronkelijke taal",
|
||||
"components.MovieDetails.overview": "Overzicht",
|
||||
"components.MovieDetails.overviewunavailable": "Overzicht niet beschikbaar.",
|
||||
"components.MovieDetails.recommendations": "Aanbevelingen",
|
||||
@@ -114,7 +114,7 @@
|
||||
"components.Settings.hostname": "Hostnaam of IP-adres",
|
||||
"components.Settings.librariesRemaining": "Resterende bibliotheken: {count}",
|
||||
"components.Settings.manualscan": "Handmatige bibliotheekscan",
|
||||
"components.Settings.manualscanDescription": "Normaal wordt dit eens elke 24 uur uitgevoerd. Jellyseerr controleert de recent toegevoegde items van je Plex-server agressiever. Als je Plex voor de eerste keer configureert, is een eenmalige handmatige volledige bibliotheekscan aanbevolen!",
|
||||
"components.Settings.manualscanDescription": "Normaliter wordt dit eenmaal per 24 uur uitgevoerd. Jellyseerr zal de lijst met onlangs toegevoegde media op je Plex-server vaker controleren. Als dit de eerste keer is dat je Jellyseerr instelt, wordt aanbevolen eenmalig een handmatige, volledige bibliotheekscan uit te voeren!",
|
||||
"components.Settings.menuAbout": "Over",
|
||||
"components.Settings.menuGeneralSettings": "Algemeen",
|
||||
"components.Settings.menuJobs": "Taken en cache",
|
||||
@@ -127,7 +127,7 @@
|
||||
"components.Settings.plexlibraries": "Plex-bibliotheken",
|
||||
"components.Settings.plexlibrariesDescription": "De bibliotheken die Jellyseerr scant voor titels. Stel je Plex-verbinding in en sla ze op. Klik daarna op de onderstaande knop als er geen bibliotheken staan.",
|
||||
"components.Settings.plexsettings": "Plex-instellingen",
|
||||
"components.Settings.plexsettingsDescription": "Configureer de instellingen voor je Plex-server. Jellyseerr scant je Plex-bibliotheken om te zien welke content beschikbaar is.",
|
||||
"components.Settings.plexsettingsDescription": "Configureer de instellingen voor je Plex-server. Jellyseerr scant je Plex-bibliotheken om te zien welke inhoud beschikbaar is.",
|
||||
"components.Settings.port": "Poort",
|
||||
"components.Settings.radarrsettings": "Radarr-instellingen",
|
||||
"components.Settings.sonarrsettings": "Sonarr-instellingen",
|
||||
@@ -137,12 +137,12 @@
|
||||
"components.Setup.configureservices": "Diensten configureren",
|
||||
"components.Setup.continue": "Doorgaan",
|
||||
"components.Setup.finish": "Installatie voltooien",
|
||||
"components.Setup.finishing": "Bezig met voltooien…",
|
||||
"components.Setup.finishing": "Voltooien…",
|
||||
"components.Setup.loginwithplex": "Inloggen met Plex",
|
||||
"components.Setup.signinMessage": "Ga aan de slag door in te loggen met je Plex-account",
|
||||
"components.Setup.signinMessage": "Ga aan de slag door je aan te melden",
|
||||
"components.Setup.welcome": "Welkom bij Jellyseerr",
|
||||
"components.TvDetails.cast": "Cast",
|
||||
"components.TvDetails.originallanguage": "Originele taal",
|
||||
"components.TvDetails.originallanguage": "Oorspronkelijke taal",
|
||||
"components.TvDetails.overview": "Overzicht",
|
||||
"components.TvDetails.overviewunavailable": "Overzicht niet beschikbaar.",
|
||||
"components.TvDetails.recommendations": "Aanbevelingen",
|
||||
@@ -164,7 +164,7 @@
|
||||
"i18n.movies": "Films",
|
||||
"i18n.partiallyavailable": "Deels beschikbaar",
|
||||
"i18n.pending": "In behandeling",
|
||||
"i18n.processing": "Bezig met verwerken",
|
||||
"i18n.processing": "Verwerken",
|
||||
"i18n.tvshows": "Series",
|
||||
"i18n.unavailable": "Niet beschikbaar",
|
||||
"pages.oops": "Oeps",
|
||||
@@ -187,14 +187,14 @@
|
||||
"components.Setup.tip": "Tip",
|
||||
"components.Settings.SonarrModal.testFirstRootFolders": "Test verbinding om hoofdmappen te laden",
|
||||
"components.Settings.SonarrModal.testFirstQualityProfiles": "Test verbinding om kwaliteitsprofielen te laden",
|
||||
"components.Settings.SonarrModal.loadingrootfolders": "Bezig met laden van hoofdmappen…",
|
||||
"components.Settings.SonarrModal.loadingprofiles": "Bezig met laden van kwaliteitsprofielen…",
|
||||
"components.Settings.SonarrModal.loadingrootfolders": "Hoofdmappen laden…",
|
||||
"components.Settings.SonarrModal.loadingprofiles": "Kwaliteitsprofielen laden…",
|
||||
"components.Settings.SettingsAbout.gettingsupport": "Ondersteuning krijgen",
|
||||
"components.Settings.RadarrModal.validationMinimumAvailabilityRequired": "Je moet een minimale beschikbaarheid selecteren",
|
||||
"components.Settings.RadarrModal.testFirstRootFolders": "Test verbinding om hoofdmappen te laden",
|
||||
"components.Settings.RadarrModal.testFirstQualityProfiles": "Test verbinding om kwaliteitsprofielen te laden",
|
||||
"components.Settings.RadarrModal.loadingrootfolders": "Bezig met laden van hoofdmappen…",
|
||||
"components.Settings.RadarrModal.loadingprofiles": "Bezig met laden van kwaliteitsprofielen…",
|
||||
"components.Settings.RadarrModal.loadingrootfolders": "Hoofdmappen laden…",
|
||||
"components.Settings.RadarrModal.loadingprofiles": "Kwaliteitsprofielen laden…",
|
||||
"components.Settings.SettingsAbout.Releases.releasedataMissing": "Versiegegevens zijn momenteel niet beschikbaar.",
|
||||
"components.Settings.SettingsAbout.Releases.latestversion": "Nieuwste",
|
||||
"components.Settings.SettingsAbout.Releases.currentversion": "Huidig",
|
||||
@@ -208,7 +208,7 @@
|
||||
"i18n.retry": "Opnieuw proberen",
|
||||
"i18n.requested": "Aangevraagd",
|
||||
"i18n.failed": "Mislukt",
|
||||
"i18n.deleting": "Bezig met verwijderen…",
|
||||
"i18n.deleting": "Verwijderen…",
|
||||
"i18n.close": "Sluiten",
|
||||
"components.UserList.userdeleteerror": "Er ging iets mis bij het verwijderen van de gebruiker.",
|
||||
"components.UserList.userdeleted": "Gebruiker succesvol verwijderd!",
|
||||
@@ -223,7 +223,7 @@
|
||||
"components.TvDetails.network": "{networkCount, plural, one {Netwerk} other {Netwerken}}",
|
||||
"components.TvDetails.firstAirDate": "Datum eerste uitzending",
|
||||
"components.TvDetails.anime": "Anime",
|
||||
"components.StatusChacker.reloadOverseerr": "Herladen",
|
||||
"components.StatusChacker.reloadJellyseerr": "Herladen",
|
||||
"components.StatusChacker.newversionavailable": "Toepassingsupdate",
|
||||
"components.StatusChacker.newversionDescription": "Jellyseerr is geüpdatet! Klik op de onderstaande knop om de pagina opnieuw te laden.",
|
||||
"components.Settings.toastSettingsSuccess": "Instellingen succesvol opgeslagen!",
|
||||
@@ -303,10 +303,10 @@
|
||||
"components.UserList.create": "Aanmaken",
|
||||
"components.UserList.createlocaluser": "Lokale gebruiker aanmaken",
|
||||
"components.UserList.usercreatedfailed": "Er ging iets mis bij het aanmaken van de gebruiker.",
|
||||
"components.UserList.creating": "Bezig met aanmaken…",
|
||||
"components.UserList.creating": "Aanmaken…",
|
||||
"components.UserList.validationpasswordminchars": "Wachtwoord is te kort; moet minimaal 8 tekens bevatten",
|
||||
"components.UserList.usercreatedsuccess": "Gebruiker succesvol aangemaakt!",
|
||||
"components.UserList.passwordinfodescription": "Configureer een applicatie-URL en schakel e-mailmeldingen in om automatische wachtwoordgeneratie mogelijk te maken.",
|
||||
"components.UserList.passwordinfodescription": "Stel een applicatie-URL in en schakel e-mailmeldingen in om automatische wachtwoordgeneratie mogelijk te maken.",
|
||||
"components.UserList.password": "Wachtwoord",
|
||||
"components.UserList.localuser": "Lokale gebruiker",
|
||||
"components.UserList.email": "E-mailadres",
|
||||
@@ -340,23 +340,23 @@
|
||||
"components.RequestModal.SearchByNameModal.notvdbiddescription": "We kunnen deze serie niet automatisch matchen. Selecteer hieronder de juiste match.",
|
||||
"components.Login.signinwithplex": "Plex-account gebruiken",
|
||||
"components.Login.signinheader": "Log in om verder te gaan",
|
||||
"components.Login.signingin": "Bezig met inloggen…",
|
||||
"components.Login.signingin": "Aanmelden…",
|
||||
"components.Login.signin": "Inloggen",
|
||||
"components.Settings.notificationAgentSettingsDescription": "Meldingsagenten configureren en inschakelen.",
|
||||
"components.PlexLoginButton.signinwithplex": "Inloggen",
|
||||
"components.PlexLoginButton.signingin": "Bezig met inloggen…",
|
||||
"components.PlexLoginButton.signingin": "Aanmelden…",
|
||||
"components.PermissionEdit.advancedrequest": "Geavanceerde aanvragen",
|
||||
"components.PermissionEdit.admin": "Beheerder",
|
||||
"components.UserList.userssaved": "Gebruikersrechten succesvol opgeslagen!",
|
||||
"components.Settings.toastPlexRefreshSuccess": "Serverlijst van Plex succesvol opgehaald!",
|
||||
"components.Settings.toastPlexRefresh": "Bezig met serverlijst ophalen van Plex…",
|
||||
"components.Settings.toastPlexConnecting": "Bezig met verbinden met Plex-server…",
|
||||
"components.Settings.toastPlexConnecting": "Verbinden met Plex…",
|
||||
"components.UserList.bulkedit": "Meerdere bewerken",
|
||||
"components.Settings.toastPlexRefreshFailure": "Kan serverlijst van Plex niet ophalen.",
|
||||
"components.Settings.toastPlexConnectingSuccess": "Succesvol verbonden met Plex-server!",
|
||||
"components.Settings.toastPlexConnectingFailure": "Kan geen verbinding maken met Plex.",
|
||||
"components.Settings.settingUpPlexDescription": "Om Plex in te stellen, kan je de gegevens handmatig invoeren of een server selecteren die is opgehaald van <RegisterPlexTVLink>plex.tv</RegisterPlexTVLink>. Druk op de knop rechts van de vervolgkeuzelijst om de lijst van beschikbare servers op te halen.",
|
||||
"components.Settings.serverpresetRefreshing": "Bezig met servers ophalen…",
|
||||
"components.Settings.serverpresetRefreshing": "Servers ophalen…",
|
||||
"components.Settings.serverpresetManualMessage": "Handmatige configuratie",
|
||||
"components.Settings.serverpresetLoad": "Klik op de knop om de beschikbare servers te laden",
|
||||
"components.Settings.serverpreset": "Server",
|
||||
@@ -431,7 +431,7 @@
|
||||
"components.RequestModal.AdvancedRequester.requestas": "Aanvragen als",
|
||||
"components.Discover.discover": "Ontdekken",
|
||||
"components.Settings.validationApplicationTitle": "Je moet een toepassingstitel opgeven",
|
||||
"components.AppDataWarning.dockerVolumeMissingDescription": "De volumekoppeling <code>{appDataPath}</code> was niet correct geconfigureerd. Alle gegevens zullen worden gewist wanneer de container wordt gestopt of opnieuw wordt gestart.",
|
||||
"components.AppDataWarning.dockerVolumeMissingDescription": "De volumekoppeling <code>{appDataPath}</code> is niet correct geconfigureerd. Alle gegevens zullen worden gewist wanneer de container wordt gestopt of opnieuw wordt gestart.",
|
||||
"components.Settings.validationApplicationUrlTrailingSlash": "URL mag niet eindigen op een schuine streep",
|
||||
"components.Settings.validationApplicationUrl": "Je moet een geldige URL opgeven",
|
||||
"components.Settings.SonarrModal.validationApplicationUrlTrailingSlash": "URL mag niet eindigen op een schuine streep",
|
||||
@@ -520,7 +520,7 @@
|
||||
"components.Layout.UserDropdown.myprofile": "Profiel",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.validationDiscordId": "Je moet een geldige gebruikers-ID opgeven",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.discordIdTip": "Het <FindDiscordIdLink>meercijferige ID-nummer</FindDiscordIdLink> van je gebruikersaccount",
|
||||
"components.CollectionDetails.requestcollection4k": "Collectie in 4K aanvragen",
|
||||
"components.CollectionDetails.requestcollection4k": "Collectie aanvragen in 4K",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.regionTip": "Inhoud filteren op regionale beschikbaarheid",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.region": "Regio van Ontdekken",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.originallanguageTip": "Inhoud filteren op oorspronkelijke taal",
|
||||
@@ -546,7 +546,7 @@
|
||||
"components.Settings.SettingsJobsCache.download-sync-reset": "Reset download sync",
|
||||
"components.Settings.SettingsJobsCache.download-sync": "Synchronisatie downloads",
|
||||
"components.TvDetails.seasons": "{seasonCount, plural, one {# seizoen} other {# seizoenen}}",
|
||||
"i18n.loading": "Bezig met laden…",
|
||||
"i18n.loading": "Laden…",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.validationTelegramChatId": "Je moet een geldige chat-ID opgeven",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.telegramChatIdTipLong": "<TelegramBotLink>Een chat starten</TelegramBotLink>, <GetIdBotLink>@get_id_bot</GetIdBotLink> toevoegen en de opdracht <code>/my_id</code> geven",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.telegramChatId": "Chat-ID",
|
||||
@@ -558,14 +558,14 @@
|
||||
"components.Discover.DiscoverNetwork.networkSeries": "Series van {network}",
|
||||
"components.Discover.DiscoverMovieGenre.genreMovies": "{genre} films",
|
||||
"components.Setup.scanbackground": "Het scannen wordt op de achtergrond uitgevoerd. Je kunt in de tussentijd doorgaan met het installatieproces.",
|
||||
"components.Settings.scanning": "Bezig met synchroniseren…",
|
||||
"components.Settings.scanning": "Synchroniseren…",
|
||||
"components.Settings.scan": "Bibliotheken synchroniseren",
|
||||
"components.Settings.SettingsJobsCache.sonarr-scan": "Sonarr-scan",
|
||||
"components.Settings.SettingsJobsCache.radarr-scan": "Radarr-scan",
|
||||
"components.Settings.SettingsJobsCache.plex-recently-added-scan": "Plex recent toegevoegde scan",
|
||||
"components.Settings.SettingsJobsCache.plex-full-scan": "Plex volledige bibliotheekscan",
|
||||
"components.Settings.SettingsJobsCache.jellyfin-full-scan": "volledige bibliotheekscan Jellyfin",
|
||||
"components.Settings.SettingsJobsCache.jellyfin-recently-added-scan": "Jellyfin recent toegevoegde scan",
|
||||
"components.Settings.SettingsJobsCache.jellyfin-recently-added-scan": "Scan van 'onlangs toegevoegd' in Jellyfin",
|
||||
"components.Settings.Notifications.validationUrl": "Je moet een geldige URL opgeven",
|
||||
"components.Settings.Notifications.botAvatarUrl": "URL bot-avatar",
|
||||
"components.RequestList.RequestItem.requested": "Aangevraagd",
|
||||
@@ -670,27 +670,27 @@
|
||||
"components.QuotaSelector.unlimited": "Onbeperkt",
|
||||
"i18n.view": "Bekijken",
|
||||
"i18n.tvshow": "Serie",
|
||||
"i18n.testing": "Bezig met testen…",
|
||||
"i18n.testing": "Testen…",
|
||||
"i18n.test": "Test",
|
||||
"i18n.status": "Status",
|
||||
"i18n.showingresults": "<strong>{from}</strong> tot <strong>{to}</strong> van de <strong>{total}</strong> resultaten worden weergegeven",
|
||||
"i18n.saving": "Bezig met opslaan…",
|
||||
"i18n.saving": "Opslaan…",
|
||||
"i18n.save": "Wijzigingen opslaan",
|
||||
"i18n.resultsperpage": "{pageSize} resultaten per pagina weergeven",
|
||||
"i18n.requesting": "Bezig met aanvragen…",
|
||||
"i18n.requesting": "Aanvragen…",
|
||||
"i18n.request4k": "Aanvragen in 4K",
|
||||
"i18n.previous": "Vorige",
|
||||
"i18n.notrequested": "Niet aangevraagd",
|
||||
"i18n.noresults": "Geen resultaten.",
|
||||
"i18n.next": "Volgende",
|
||||
"i18n.movie": "Film",
|
||||
"i18n.canceling": "Bezig met annuleren…",
|
||||
"i18n.canceling": "Annuleren…",
|
||||
"i18n.back": "Terug",
|
||||
"i18n.areyousure": "Weet je het zeker?",
|
||||
"i18n.all": "Alle",
|
||||
"components.RequestModal.QuotaDisplay.requiredquotaUser": "Deze gebruiker heeft nog minstens <strong>{seasons}</strong> {seasons, plural, one {seizoensverzoek} other {seizoensverzoeken}} nodig om deze serie aan te vragen.",
|
||||
"components.TvDetails.originaltitle": "Originele titel",
|
||||
"components.MovieDetails.originaltitle": "Originele titel",
|
||||
"components.TvDetails.originaltitle": "Oorspronkelijke titel",
|
||||
"components.MovieDetails.originaltitle": "Oorspronkelijke titel",
|
||||
"components.LanguageSelector.originalLanguageDefault": "Alle talen",
|
||||
"components.LanguageSelector.languageServerDefault": "Standaard ({language})",
|
||||
"components.Settings.SonarrModal.testFirstTags": "Test de verbinding om labels te laden",
|
||||
@@ -733,9 +733,9 @@
|
||||
"components.RequestModal.pendingapproval": "Je verzoek is in afwachting van goedkeuring.",
|
||||
"components.RequestList.RequestItem.cancelRequest": "Verzoek annuleren",
|
||||
"components.NotificationTypeSelector.notificationTypes": "Meldingtypes",
|
||||
"components.UserProfile.UserSettings.UserPasswordChange.noPasswordSetOwnAccount": "Er is voor jouw account momenteel geen wachtwoord ingesteld. Configureer hieronder een wachtwoord om in te kunnen loggen als een \"lokale gebruiker\" met uw e-mailadres.",
|
||||
"components.UserProfile.UserSettings.UserPasswordChange.noPasswordSetOwnAccount": "Er is voor jouw account momenteel geen wachtwoord ingesteld. Configureer hieronder een wachtwoord om in te kunnen loggen als een \"lokale gebruiker\" met je e-mailadres.",
|
||||
"components.UserProfile.UserSettings.UserPasswordChange.noPasswordSet": "Deze gebruikersaccount heeft momenteel geen wachtwoord ingesteld. Configureer hieronder een wachtwoord zodat deze account in staat is om zich aan te melden als een \"lokale gebruiker\".",
|
||||
"components.Settings.serviceSettingsDescription": "Configureer je {serverType} server(s) hieronder. Je kunt meerdere {serverType} servers verbinden, maar slechts twee ervan kunnen als standaard worden gemarkeerd (één niet-4K en één 4K). Beheerders kunnen vóór de goedkeuring de server die gebruikt wordt om nieuwe aanvragen te verwerken aanpassen.",
|
||||
"components.Settings.serviceSettingsDescription": "Stel je {serverType}-server(s) hieronder in. Je kunt meerdere {serverType}-servers verbinden, maar slechts twee ervan kunnen als standaard worden gemarkeerd (één niet-4K en één 4K). Beheerders kunnen vóór goedkeuring de server aanpassen die voor nieuwe aanvragen gebruikt wordt.",
|
||||
"components.Settings.noDefaultServer": "Ten minste één {serverType} server moet als standaard worden gemarkeerd om {mediaType}verzoeken te kunnen verwerken.",
|
||||
"components.Settings.noDefaultNon4kServer": "Als je slechts één enkele {serverType} server hebt voor zowel niet-4K als 4K-inhoud (of als je alleen 4K-inhoud downloadt), dan moet je {serverType} server <strong>NIET</strong> aangeduid worden als een 4K-server.",
|
||||
"components.Settings.mediaTypeSeries": "serie",
|
||||
@@ -747,7 +747,7 @@
|
||||
"components.Layout.VersionStatus.outofdate": "Verouderd",
|
||||
"components.Layout.VersionStatus.commitsbehind": "{commitsBehind} {commitsBehind, plural, one {commit} other {commits}} achter",
|
||||
"components.UserList.autogeneratepasswordTip": "Een door de server gegenereerd wachtwoord naar de gebruiker e-mailen",
|
||||
"i18n.retrying": "Bezig met opnieuw proberen…",
|
||||
"i18n.retrying": "Opnieuw proberen…",
|
||||
"components.Settings.serverSecure": "veilig",
|
||||
"components.UserList.usercreatedfailedexisting": "Het opgegeven e-mailadres wordt al gebruikt door een andere gebruiker.",
|
||||
"components.RequestModal.edit": "Verzoek bewerken",
|
||||
@@ -847,7 +847,7 @@
|
||||
"components.NotificationTypeSelector.usermediadeclinedDescription": "Een melding ontvangen wanneer je mediaverzoeken worden geweigerd.",
|
||||
"components.NotificationTypeSelector.usermediaavailableDescription": "Een melding ontvangen wanneer je mediaverzoeken beschikbaar zijn.",
|
||||
"components.NotificationTypeSelector.usermediaAutoApprovedDescription": "Een melding ontvangen wanneer andere gebruikers nieuwe mediaverzoeken indienen die automatisch worden goedgekeurd.",
|
||||
"components.Settings.SettingsAbout.betawarning": "Dit is BETA software. Functies kunnen kapot en/of instabiel zijn. Meld eventuele problemen op GitHub!",
|
||||
"components.Settings.SettingsAbout.betawarning": "Dit is BETA-software. Functies kunnen kapot en/of instabiel zijn. Meld eventuele problemen op GitHub!",
|
||||
"components.Layout.LanguagePicker.displaylanguage": "Weergavetaal",
|
||||
"components.MovieDetails.showmore": "Meer tonen",
|
||||
"components.MovieDetails.showless": "Minder tonen",
|
||||
@@ -971,7 +971,7 @@
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.validationPushoverUserKey": "Je moet een geldige gebruikers- of groepssleutel opgeven",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.pushbulletsettingssaved": "Instellingen voor Pushbullet-meldingen succesvol opgeslagen!",
|
||||
"components.IssueDetails.playonplex": "Afspelen op {mediaServerName}",
|
||||
"components.IssueDetails.play4konplex": "Afspelen in 4K op {mediaServerName}",
|
||||
"components.IssueDetails.play4konplex": "Afspelen op {mediaServerName} in 4K",
|
||||
"components.IssueDetails.openin4karr": "Openen in 4K {arr}",
|
||||
"components.IssueList.IssueItem.episodes": "{episodeCount, plural, one {aflevering} other {afleveringen}}",
|
||||
"components.IssueList.IssueItem.seasons": "{seasonCount, plural, one {seizoen} other {seizoenen}}",
|
||||
@@ -982,7 +982,7 @@
|
||||
"components.NotificationTypeSelector.adminissuereopenedDescription": "Ontvang een melding wanneer problemen door andere gebruikers opnieuw worden ingediend.",
|
||||
"components.NotificationTypeSelector.issuereopenedDescription": "Stuur meldingen wanneer problemen opnieuw worden ingediend.",
|
||||
"components.NotificationTypeSelector.userissuereopenedDescription": "Ontvang een bericht wanneer problemen die jij hebt gemeld, opnieuw worden ingediend.",
|
||||
"components.RequestModal.requestseasons4k": "{seasonCount} {seasonCount, plural, one {seizoen} other {seizoenen}} in 4K aanvragen",
|
||||
"components.RequestModal.requestseasons4k": "{seasonCount} {seasonCount, plural, one {seizoen} other {seizoenen}} aanvragen in 4K",
|
||||
"components.RequestModal.requestmovies": "{count} {count, plural, one {film} other {films}} aanvragen",
|
||||
"components.RequestModal.selectmovies": "Film(s) selecteren",
|
||||
"components.MovieDetails.productioncountries": "Productie{countryCount, plural, one {land} other {landen}}",
|
||||
@@ -998,7 +998,7 @@
|
||||
"components.Settings.Notifications.NotificationsGotify.agentenabled": "Agent inschakelen",
|
||||
"components.Settings.Notifications.NotificationsGotify.gotifysettingssaved": "Instellingen voor meldingen Gotify succesvol opgeslagen!",
|
||||
"components.Settings.Notifications.NotificationsGotify.token": "Toepassingstoken",
|
||||
"i18n.importing": "Bezig met importeren…",
|
||||
"i18n.importing": "Importeren…",
|
||||
"components.Settings.Notifications.NotificationsGotify.gotifysettingsfailed": "Instellingen voor meldingen Gotify niet opgeslagen.",
|
||||
"components.Settings.Notifications.NotificationsGotify.toastGotifyTestFailed": "Testmelding Gotify niet verzonden.",
|
||||
"components.Settings.Notifications.NotificationsGotify.toastGotifyTestSuccess": "Testmelding Gotify verzonden!",
|
||||
@@ -1012,7 +1012,7 @@
|
||||
"components.UserList.newplexsigninenabled": "De instelling <strong>Nieuwe Plex-aanmelding inschakelen</strong> is momenteel ingeschakeld. Plex-gebruikers met bibliotheektoegang hoeven niet te worden geïmporteerd om in te loggen.",
|
||||
"components.ManageSlideOver.manageModalAdvanced": "Geavanceerd",
|
||||
"components.ManageSlideOver.alltime": "Altijd",
|
||||
"components.ManageSlideOver.markallseasons4kavailable": "Alle seizoenen als beschikbaar in 4K markeren",
|
||||
"components.ManageSlideOver.markallseasons4kavailable": "Alle seizoenen markeren als beschikbaar in 4K",
|
||||
"components.ManageSlideOver.opentautulli": "In Tautulli openen",
|
||||
"components.ManageSlideOver.pastdays": "Afgelopen {days, number} dagen",
|
||||
"components.ManageSlideOver.playedby": "Afgespeeld door",
|
||||
@@ -1046,8 +1046,8 @@
|
||||
"components.UserProfile.emptywatchlist": "Media die zijn toegevoegd aan je <PlexWatchlistSupportLink>Plex Kijklijst</PlexWatchlistSupportLink> verschijnen hier.",
|
||||
"components.MovieDetails.digitalrelease": "Digitale release",
|
||||
"i18n.restartRequired": "Opnieuw opstarten vereist",
|
||||
"components.PermissionEdit.viewrecentDescription": "Toestemming geven om de lijst met recent toegevoegde media te bekijken.",
|
||||
"components.PermissionEdit.viewrecent": "Recent toegevoegd bekijken",
|
||||
"components.PermissionEdit.viewrecentDescription": "Toestemming geven om de lijst met onlangs toegevoegde media weer te geven.",
|
||||
"components.PermissionEdit.viewrecent": "Onlangs toegevoegd weergeven",
|
||||
"components.Settings.deleteServer": "{serverType}-server verwijderen",
|
||||
"components.StatusChecker.appUpdated": "{applicationTitle} bijgewerkt",
|
||||
"components.RequestList.RequestItem.tmdbid": "TMDB ID",
|
||||
@@ -1072,8 +1072,8 @@
|
||||
"components.TvDetails.seasonnumber": "Seizoen {seasonNumber}",
|
||||
"components.TvDetails.Season.somethingwentwrong": "Er ging iets mis bij het ophalen van de seizoensgegevens.",
|
||||
"components.TvDetails.seasonstitle": "Seizoenen",
|
||||
"components.Discover.DiscoverWatchlist.discoverwatchlist": "Je Plex-kijklijst",
|
||||
"components.Discover.plexwatchlist": "Je Plex Kijklijst",
|
||||
"components.Discover.DiscoverWatchlist.discoverwatchlist": "Jouw kijklijst",
|
||||
"components.Discover.plexwatchlist": "Jouw kijklijst",
|
||||
"components.MovieDetails.physicalrelease": "Fysieke release",
|
||||
"components.PermissionEdit.autorequest": "Automatisch aanvragen",
|
||||
"components.Settings.SettingsJobsCache.plex-watchlist-sync": "Plex Kijklijst synchroniseren",
|
||||
@@ -1099,7 +1099,7 @@
|
||||
"components.TvDetails.manageseries": "Serie beheren",
|
||||
"components.MovieDetails.managemovie": "Film beheren",
|
||||
"components.MovieDetails.reportissue": "Probleem melden",
|
||||
"components.PermissionEdit.autorequestMoviesDescription": "Toestemming geven om niet-4K films in je Plex Kijklijst automatisch aan te vragen.",
|
||||
"components.PermissionEdit.autorequestMoviesDescription": "Toestemming geven om niet-4K films in je Plex-kijklijst automatisch aan te vragen.",
|
||||
"components.PermissionEdit.autorequestSeries": "Series automatisch aanvragen",
|
||||
"components.PermissionEdit.autorequestMovies": "Films automatisch aanvragen",
|
||||
"components.Settings.experimentalTooltip": "Deze instelling inschakelen, kan leiden tot onverwacht gedrag van de toepassing",
|
||||
@@ -1152,8 +1152,8 @@
|
||||
"components.Discover.DiscoverSliderEdit.remove": "Verwijderen",
|
||||
"components.Discover.resetfailed": "Er is iets fout gegaan bij het resetten van de instellingen van Ontdekken.",
|
||||
"components.Discover.PlexWatchlistSlider.emptywatchlist": "Media die zijn toegevoegd aan je <PlexWatchlistSupportLink>Plex Kijklijst</PlexWatchlistSupportLink> verschijnen hier.",
|
||||
"components.Discover.PlexWatchlistSlider.plexwatchlist": "Je Plex Kijklijst",
|
||||
"components.Discover.RecentlyAddedSlider.recentlyAdded": "Recent toegevoegd",
|
||||
"components.Discover.PlexWatchlistSlider.plexwatchlist": "Jouw kijklijst",
|
||||
"components.Discover.RecentlyAddedSlider.recentlyAdded": "Onlangs toegevoegd",
|
||||
"components.Discover.networks": "Netwerken",
|
||||
"components.Discover.CreateSlider.searchStudios": "Studio's zoeken…",
|
||||
"components.Discover.CreateSlider.starttyping": "Begin met typen om te zoeken.",
|
||||
@@ -1184,8 +1184,8 @@
|
||||
"components.Discover.DiscoverMovies.sortPopularityAsc": "Populariteit oplopend",
|
||||
"components.Discover.DiscoverMovies.sortPopularityDesc": "Populariteit aflopend",
|
||||
"components.Discover.DiscoverMovies.sortReleaseDateAsc": "Releasedatum oplopend",
|
||||
"components.Discover.DiscoverMovies.sortTitleAsc": "Titel (A-Z) oplopend",
|
||||
"components.Discover.DiscoverMovies.sortTitleDesc": "Titel (Z-A) aflopend",
|
||||
"components.Discover.DiscoverMovies.sortTitleAsc": "Titel oplopend (A-Z)",
|
||||
"components.Discover.DiscoverMovies.sortTitleDesc": "Titel aflopend (Z-A)",
|
||||
"components.Discover.DiscoverMovies.sortTmdbRatingAsc": "TMDB-beoordeling oplopend",
|
||||
"components.Discover.DiscoverMovies.sortTmdbRatingDesc": "TMDB-beoordeling aflopend",
|
||||
"components.Discover.DiscoverSliderEdit.deletefail": "Slider verwijderen mislukt.",
|
||||
@@ -1202,7 +1202,7 @@
|
||||
"components.Discover.FilterSlideover.from": "Van",
|
||||
"components.Discover.FilterSlideover.genres": "Genres",
|
||||
"components.Discover.FilterSlideover.keywords": "Trefwoorden",
|
||||
"components.Discover.FilterSlideover.originalLanguage": "Originele taal",
|
||||
"components.Discover.FilterSlideover.originalLanguage": "Oorspronkelijke taal",
|
||||
"components.Discover.FilterSlideover.ratingText": "Beoordelingen tussen {minValue} en {maxValue}",
|
||||
"components.Discover.FilterSlideover.releaseDate": "Releasedatum",
|
||||
"components.Discover.FilterSlideover.runtime": "Duur",
|
||||
@@ -1262,18 +1262,87 @@
|
||||
"components.Settings.SettingsJobsCache.availability-sync": "Synchronisatie van mediabeschikbaarheid",
|
||||
"components.Discover.tmdbmoviestreamingservices": "Streamingdiensten voor films TMDB",
|
||||
"components.Discover.tmdbtvstreamingservices": "Streamingdiensten voor series TMDB",
|
||||
"components.Discover.FilterSlideover.tmdbuservotecount": "Aantal stemmen TMDB-gebruikers",
|
||||
"components.Discover.FilterSlideover.voteCount": "Aantal stemmen tussen {minValue} en {maxValue}",
|
||||
"components.Settings.RadarrModal.tagRequests": "Tagverzoeken",
|
||||
"components.Settings.RadarrModal.tagRequestsInfo": "Voeg automatisch een extra tag toe met de gebruikers-ID en weergavenaam van de aanvrager",
|
||||
"components.MovieDetails.imdbuserscore": "Gebruikersscore IMDB",
|
||||
"components.Settings.SonarrModal.tagRequests": "Tagverzoeken",
|
||||
"components.Settings.SonarrModal.tagRequestsInfo": "Voeg automatisch een extra tag toe met de gebruikers-ID en weergavenaam van de aanvrager",
|
||||
"i18n.collection": "Collectie",
|
||||
"components.Settings.Notifications.NotificationsPushover.sound": "Meldingsgeluid",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.deviceDefault": "Apparaatstandaard",
|
||||
"components.Login.validationhostrequired": "{mediaServerName}-URL vereist",
|
||||
"components.Layout.UserWarnings.emailInvalid": "E-mailadres is ongeldig.",
|
||||
"components.Login.description": "Aangezien dit de eerste keer is dat je je aanmeldt bij {applicationName}, dien je een geldig e-mailadres op te geven.",
|
||||
"components.Login.saving": "Toevoegen…",
|
||||
"components.ManageSlideOver.removearr": "Verwijderen van {arr}",
|
||||
"components.Settings.RadarrModal.tagRequests": "Aanvragen taggen",
|
||||
"components.MovieDetails.openradarr4k": "Film openen in 4K-Radarr",
|
||||
"components.Settings.RadarrModal.tagRequestsInfo": "Automatisch een extra label toevoegen met de gebruikers-id en weergavenaam van de aanvrager",
|
||||
"components.Settings.SonarrModal.animeSeriesType": "Serietype anime",
|
||||
"components.Settings.SonarrModal.tagRequestsInfo": "Automatisch een extra label toevoegen met de gebruikers-id en weergavenaam van de aanvrager",
|
||||
"components.Settings.internalUrl": "Interne URL",
|
||||
"components.Settings.jellyfinsettings": "{mediaServerName}-instellingen",
|
||||
"components.Settings.jellyfinlibrariesDescription": "De {mediaServerName}-bibliotheken die op titels worden gescand. Klik op onderstaande knop als er geen bibliotheken in de lijst staan.",
|
||||
"components.Settings.manualscanDescriptionJellyfin": "Normaliter wordt dit eenmaal per 24 uur uitgevoerd. Jellyseerr zal de lijst met onlangs toegevoegde media op je {mediaServerName}-server vaker controleren. Als dit de eerste keer is dat je Jellyseerr instelt, wordt aanbevolen eenmalig een handmatige, volledige bibliotheekscan uit te voeren!",
|
||||
"components.Settings.save": "Wijzigingen opslaan",
|
||||
"components.Settings.syncJellyfin": "Bibliotheken synchoniseren",
|
||||
"components.TvDetails.play": "Afspelen op {mediaServerName}",
|
||||
"components.Discover.FilterSlideover.tmdbuservotecount": "Aantal gebruikersstemmen TMDB",
|
||||
"components.Login.save": "Toevoegen",
|
||||
"components.ManageSlideOver.manageModalRemoveMediaWarning": "* Hiermee wordt deze {mediaType} onomkeerbaar verwijderd van {arr}, inclusief alle bestanden.",
|
||||
"components.Settings.Notifications.NotificationsPushover.deviceDefault": "Apparaatstandaard",
|
||||
"components.Settings.Notifications.userEmailRequired": "Gebruikerse-mail vereisen",
|
||||
"components.Settings.SettingsAbout.supportjellyseerr": "Jellyseerr ondersteunen",
|
||||
"components.Settings.SonarrModal.seriesType": "Serietype",
|
||||
"components.Settings.jellyfinSettings": "{mediaServerName}-instellingen",
|
||||
"components.Setup.configuremediaserver": "Mediaserver instellen",
|
||||
"components.TvDetails.play4k": "Afspelen op {mediaServerName} in 4K",
|
||||
"components.UserList.mediaServerUser": "{mediaServerName}-gebruiker",
|
||||
"components.UserList.noJellyfinuserstoimport": "Er zijn geen {mediaServerName}-gebruikers om te importeren.",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.email": "E-mail",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.deviceDefault": "Apparaatstandaard",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.sound": "Meldingsgeluid",
|
||||
"components.Settings.Notifications.NotificationsPushover.deviceDefault": "Apparaatstandaard"
|
||||
"components.Login.signinwithjellyfin": "{mediaServerName}-account gebruiken",
|
||||
"components.Discover.FilterSlideover.voteCount": "Aantal stemmen tussen {minValue} en {maxValue}",
|
||||
"components.Layout.UserWarnings.emailRequired": "Een e-mailadres is vereist.",
|
||||
"components.Layout.UserWarnings.passwordRequired": "Een wachtwoord is vereist.",
|
||||
"components.Login.credentialerror": "Gebruikersnaam of wachtwoord is onjuist.",
|
||||
"components.Login.emailtooltip": "Het adres hoeft niet gelieerd te zijn aan je {mediaServerName}-instantie.",
|
||||
"components.Login.host": "{mediaServerName}-URL",
|
||||
"components.Login.initialsignin": "Verbinden",
|
||||
"components.Login.initialsigningin": "Verbinden…",
|
||||
"components.Login.title": "E-mail toevoegen",
|
||||
"components.Login.username": "Gebruikersnaam",
|
||||
"components.Login.validationEmailRequired": "Je moet een e-mailadres opgeven",
|
||||
"components.Login.validationEmailFormat": "Ongeldig e-mailadres",
|
||||
"components.Login.validationemailformat": "Geldig e-mailadres vereist",
|
||||
"components.Login.validationhostformat": "Geldige URL vereist",
|
||||
"components.Login.validationusernamerequired": "Gebruikersnaam vereist",
|
||||
"components.ManageSlideOver.removearr4k": "Verwijderen van 4K-{arr}",
|
||||
"components.MovieDetails.downloadstatus": "Downloadstatus",
|
||||
"components.MovieDetails.imdbuserscore": "Gebruikersbeoordeling IMDB",
|
||||
"components.MovieDetails.openradarr": "Film openen in Radarr",
|
||||
"components.MovieDetails.play": "Afspelen op {mediaServerName}",
|
||||
"components.MovieDetails.play4k": "Afspelen op {mediaServerName} in 4K",
|
||||
"components.Settings.Notifications.NotificationsPushover.sound": "Meldingsgeluid",
|
||||
"components.Settings.SonarrModal.tagRequests": "Aanvragen taggen",
|
||||
"components.Settings.jellyfinSettingsFailure": "Er is iets misgegaan bij het opslaan van de {mediaServerName}-instellingen.",
|
||||
"components.Settings.jellyfinSettingsSuccess": "{mediaServerName}-instellingen opgeslagen!",
|
||||
"components.Settings.jellyfinlibraries": "{mediaServerName}-bibliotheken",
|
||||
"components.Settings.manualscanJellyfin": "Handmatige bibliotheekscan",
|
||||
"components.Settings.menuJellyfinSettings": "{mediaServerName}",
|
||||
"components.Settings.saving": "Opslaan…",
|
||||
"components.Settings.syncing": "Synchroniseren",
|
||||
"components.Settings.timeout": "Time-out",
|
||||
"components.Setup.signin": "Aanmelden",
|
||||
"components.Setup.signinWithJellyfin": "{mediaServerName}-account gebruiken",
|
||||
"components.TitleCard.addToWatchList": "Toevoegen aan kijklijst",
|
||||
"components.TitleCard.watchlistError": "Er is iets misgegaan. Probeer het opnieuw.",
|
||||
"components.UserList.importfromJellyfin": "{mediaServerName}-gebruikers importeren",
|
||||
"components.UserList.importfromJellyfinerror": "Er is iets misgegaan bij het importeren van {mediaServerName}-gebruikers.",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.mediaServerUser": "{mediaServerName}-gebruiker",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.save": "Wijzigingen opslaan",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.saving": "Opslaan…",
|
||||
"i18n.collection": "Collectie",
|
||||
"components.UserProfile.localWatchlist": "Kijklijst van {username}",
|
||||
"components.Setup.signinWithPlex": "Plex-account gebruiken",
|
||||
"components.Settings.jellyfinSettingsDescription": "Optioneel, configureer de interne en externe eindpunten voor uw {mediaServerName} server. In de meeste gevallen verschilt de externe URL met de interne URL. Een aangepaste wachtwoord reset URL kan ook gebruikt worden voor de {mediaServerName} login, voor het geval dat u doorverwezen wilt worden naar een andere wachtwoord reset pagina.",
|
||||
"components.Settings.jellyfinsettingsDescription": "Configureer de instellingen voor uw {mediaServerName} server. {mediaServerName} scanned uw {mediaServerName} bibliotheken om te zien welke content beschikbaar is.",
|
||||
"components.TitleCard.watchlistDeleted": "<strong>{title}</strong> Is succesvol verwijderd van de kijklijst!",
|
||||
"components.TitleCard.watchlistSuccess": "<strong>{title}</strong> succesvol toegevoegd aan de kijklijst!",
|
||||
"components.TitleCard.watchlistCancel": "kijklijst voor <strong>{title}</strong> is geannuleerd.",
|
||||
"components.UserList.importedfromJellyfin": "<strong>{userCount}</strong> {mediaServerName} {userCount, plural, one {user} other {users}} succesvol geimporteerd!",
|
||||
"components.UserList.newJellyfinsigninenabled": "De <strong>Gebruik Nieuwe {mediaServerName} Login</strong> instelling staat momenteel aan. {mediaServerName} gebruikers met toegang tot de bibliotheek, hoeven niet geïmporteerd te worden om in te kunnen loggen."
|
||||
}
|
||||
|
||||
@@ -1061,196 +1061,212 @@
|
||||
"components.MovieDetails.rtaudiencescore": "Ocena Rotten Tomatoes",
|
||||
"components.MovieDetails.rtcriticsscore": "Tomatometer Rotten Tomatoes",
|
||||
"components.MovieDetails.tmdbuserscore": "Ocena użytkowników TMDB",
|
||||
"components.Settings.SettingsJobsCache.editJobScheduleCurrent": "Bieżąca częstotliwość",
|
||||
"components.TvDetails.seasonnumber": "Sezon {seasonNumber}",
|
||||
"components.TvDetails.seasonstitle": "Sezony",
|
||||
"components.Settings.SettingsJobsCache.imagecache": "Pamięć podręczna obrazów",
|
||||
"components.PermissionEdit.viewrecent": "Wyświetl ostatnio dodane",
|
||||
"components.PermissionEdit.viewrecentDescription": "Przyznaj uprawnienia do przeglądania listy ostatnio dodanych multimediów.",
|
||||
"components.TitleCard.cleardata": "Wyczyść dane",
|
||||
"components.RequestList.RequestItem.tmdbid": "Identyfikator TMDB",
|
||||
"components.RequestList.RequestItem.tvdbid": "Identyfikator TVDB",
|
||||
"components.TitleCard.tmdbid": "Identyfikator TMDB",
|
||||
"components.Settings.SettingsJobsCache.plex-watchlist-sync": "Synchronizacja listy obserwowanych Plex",
|
||||
"components.TitleCard.mediaerror": "Nie znaleziono {mediaType}",
|
||||
"components.TitleCard.tvdbid": "Identyfikator TVDB",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncseriestip": "Automatyczne zamawianie filmów z <PlexWatchlistSupportLink>listy obserwowanych Plex</PlexWatchlistSupportLink>",
|
||||
"components.PermissionEdit.autorequestSeriesDescription": "Udziel zgody na automatyczne przesyłanie próśb dotyczących multimediów innych niż 4K za pośrednictwem listy obserwowanych Plex.",
|
||||
"components.PermissionEdit.viewwatchlists": "Wyświetlanie list obserwacyjnych Plex",
|
||||
"components.PermissionEdit.viewwatchlistsDescription": "Przyznaj uprawnienia do przeglądania list obserwowanych Plex innych użytkowników.",
|
||||
"components.RequestCard.tmdbid": "Identyfikator TMDB",
|
||||
"components.RequestCard.tvdbid": "Identyfikator TVDB",
|
||||
"components.Settings.SettingsLogs.viewdetails": "Zobacz szczegóły",
|
||||
"components.Settings.restartrequiredTooltip": "Overseerr musi zostać ponownie uruchomiony, aby zmiany tego ustawienia zaczęły obowiązywać",
|
||||
"components.TvDetails.reportissue": "Zgłoś problem",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncseries": "Automatyczna prośba o serial",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncmoviestip": "Automatyczne zamawianie filmów z <PlexWatchlistSupportLink>listy obserwowanych Plex</PlexWatchlistSupportLink>",
|
||||
"components.UserProfile.plexwatchlist": "Lista obserwowanych Plex",
|
||||
"components.RequestCard.cancelrequest": "Anuluj prośbę",
|
||||
"components.RequestCard.declinerequest": "Odrzuć prośbę",
|
||||
"components.RequestCard.approverequest": "Zatwierdź prośbę",
|
||||
"components.DownloadBlock.formattedTitle": "{title}: Sezon {seasonNumber} Odcinek {episodeNumber}",
|
||||
"components.RequestBlock.approve": "Zatwierdź prośbę",
|
||||
"components.RequestBlock.decline": "Odrzuć prośbę",
|
||||
"components.RequestBlock.delete": "Usuń prośbę",
|
||||
"components.RequestBlock.edit": "Edytuj prośbę",
|
||||
"components.RequestBlock.lastmodifiedby": "Ostatnio zmodyfikowane przez",
|
||||
"components.RequestBlock.requestdate": "Data złożenia prośby",
|
||||
"components.RequestBlock.requestedby": "Prośba zgłoszona przez",
|
||||
"components.RequestCard.editrequest": "Edytuj prośbę",
|
||||
"components.RequestModal.requestcollection4ktitle": "Poproś o kolekcję w 4K",
|
||||
"components.RequestModal.requestcollectiontitle": "Poproś o kolekcję",
|
||||
"components.RequestModal.requestmovie4ktitle": "Poproś o film w 4K",
|
||||
"components.RequestModal.requestmovietitle": "Poproś o film",
|
||||
"components.RequestModal.requestseries4ktitle": "Poproś o serial w 4K",
|
||||
"components.RequestModal.requestseriestitle": "Poproś o serial",
|
||||
"components.Settings.SettingsJobsCache.image-cache-cleanup": "Czyszczenie pamięci podręcznej obrazów",
|
||||
"components.Settings.SettingsJobsCache.imagecacheDescription": "Po włączeniu w ustawieniach Overseerr będzie pośredniczyć i buforować obrazy ze wstępnie skonfigurowanych źródeł zewnętrznych. Obrazy z pamięci podręcznej są zapisywane w folderze konfiguracji. Możesz znaleźć pliki w <code>{appDataPath}/cache/images</code>.",
|
||||
"components.Settings.SettingsJobsCache.imagecachecount": "Obrazy zapisane w pamięci podręcznej",
|
||||
"components.Settings.SettingsJobsCache.imagecachesize": "Całkowity rozmiar pamięci podręcznej",
|
||||
"components.Settings.advancedTooltip": "Nieprawidłowe skonfigurowanie tego ustawienia może spowodować nieprawidłowe działanie",
|
||||
"components.Settings.experimentalTooltip": "Włączenie tego ustawienia może spowodować nieoczekiwane zachowanie aplikacji",
|
||||
"components.TvDetails.rtaudiencescore": "Ocena publiczności Rotten Tomatoes",
|
||||
"components.TvDetails.rtcriticsscore": "Rotten Tomatoes Tomatometr",
|
||||
"components.TvDetails.status4k": "4K {status}",
|
||||
"components.TvDetails.tmdbuserscore": "Ocena użytkowników TMDB",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncmovies": "Filmy z próśb automatycznych",
|
||||
"components.UserProfile.emptywatchlist": "W tym miejscu pojawią się multimedia dodane do <PlexWatchlistSupportLink>listy obserwowanych Plex</PlexWatchlistSupportLink>.",
|
||||
"components.RequestCard.unknowntitle": "Nieznany tytuł",
|
||||
"components.RequestList.RequestItem.unknowntitle": "Nieznany tytuł",
|
||||
"components.StatusBadge.playonplex": "Odtwórz na Plex",
|
||||
"components.StatusBadge.seasonepisodenumber": "S{seasonNumber}E{episodeNumber}",
|
||||
"components.TvDetails.Season.noepisodes": "Lista odcinków jest niedostępna.",
|
||||
"components.TvDetails.Season.somethingwentwrong": "Coś poszło nie tak podczas pobierania danych o sezonie.",
|
||||
"components.TvDetails.manageseries": "Zarządzaj serialem",
|
||||
"components.Discover.emptywatchlist": "W tym miejscu pojawią się multimedia dodane do <PlexWatchlistSupportLink>listy obserwowanych Plex</PlexWatchlistSupportLink>.",
|
||||
"components.RequestModal.SearchByNameModal.nomatches": "Nie udało nam się znaleźć dopasowania do tej serii.",
|
||||
"components.StatusBadge.managemedia": "Zarządzaj {mediaType}",
|
||||
"components.StatusBadge.openinarr": "Otwórz w {arr}",
|
||||
"components.TvDetails.episodeCount": "{episodeCount, plural, one {# Odcinek} other {# Odcinki}}",
|
||||
"components.Discover.CreateSlider.addSlider": "Dodaj Suwak",
|
||||
"components.Discover.CreateSlider.addcustomslider": "Utwórz niestandardowy Suwak",
|
||||
"components.Discover.CreateSlider.addfail": "Nie udało się utworzyć nowego Suwaka.",
|
||||
"components.Discover.CreateSlider.addsuccess": "Utworzono nowy Suwaki zapisano ustawienia dostosowywania odnajdywania.",
|
||||
"components.Discover.CreateSlider.editSlider": "Edytuj Suwak",
|
||||
"components.Discover.CreateSlider.editfail": "Nie udało się edytować Suwaka.",
|
||||
"components.Discover.CreateSlider.editsuccess": "Edytowano Suwak i zapisano ustawienia odkrywania.",
|
||||
"components.Discover.CreateSlider.needresults": "Musisz mieć co najmniej 1 wynik.",
|
||||
"components.Discover.CreateSlider.addSlider": "Dodaj suwak",
|
||||
"components.Discover.CreateSlider.addcustomslider": "Utwórz niestandardowy suwak",
|
||||
"components.Discover.CreateSlider.addfail": "Nie udało się utworzyć nowego suwaka.",
|
||||
"components.Discover.CreateSlider.addsuccess": "Stworzony nowy suwak i zapisano dostosowywania odkrywania.",
|
||||
"components.Discover.CreateSlider.editSlider": "Edytuj suwak",
|
||||
"components.Discover.CreateSlider.editfail": "Nie udało się edytować suwaka.",
|
||||
"components.Discover.CreateSlider.needresults": "Musisz mieć przynajmniej 1 wynik.",
|
||||
"components.Discover.CreateSlider.nooptions": "Brak wyników.",
|
||||
"components.Discover.CreateSlider.providetmdbgenreid": "Podaj identyfikator gatunku TMDB",
|
||||
"components.Discover.CreateSlider.providetmdbkeywordid": "Podaj identyfikator słowa kluczowego TMDB",
|
||||
"components.Discover.CreateSlider.providetmdbnetwork": "Podaj identyfikator platformy TMDB",
|
||||
"components.Discover.CreateSlider.providetmdbgenreid": "Podaj ID gatunku TMDB",
|
||||
"components.Discover.CreateSlider.providetmdbnetwork": "Podaj ID stacji TMDB",
|
||||
"components.Discover.CreateSlider.providetmdbsearch": "Podaj zapytanie wyszukiwania",
|
||||
"components.Discover.CreateSlider.providetmdbstudio": "Podaj identyfikator studia TMDB",
|
||||
"components.Discover.CreateSlider.providetmdbstudio": "Podaj ID studia TMDB",
|
||||
"components.Discover.CreateSlider.searchGenres": "Szukaj gatunków…",
|
||||
"components.Discover.CreateSlider.searchKeywords": "Szukaj słów kluczowych…",
|
||||
"components.Discover.CreateSlider.slidernameplaceholder": "Nazwa slidera",
|
||||
"components.Discover.CreateSlider.starttyping": "Zacznij pisać, aby wyszukać.",
|
||||
"components.Discover.CreateSlider.validationDatarequired": "Musisz uzyskać wartość danych.",
|
||||
"components.Discover.CreateSlider.validationTitlerequired": "Musisz podać tytuł.",
|
||||
"components.Discover.DiscoverMovieKeyword.keywordMovies": "{keywordTitle} Filmy",
|
||||
"components.Discover.DiscoverSliderEdit.deletefail": "Nie udało się usunąć slidera.",
|
||||
"components.Discover.DiscoverSliderEdit.remove": "Usuń",
|
||||
"components.Discover.DiscoverTvKeyword.keywordSeries": "Serial {keywordTitle}",
|
||||
"components.Discover.DiscoverMovies.activefilters": "{count, plural, one {# aktywny filtr} other {# aktywnych filtrów}}",
|
||||
"components.Discover.CreateSlider.searchStudios": "Wyszukaj studia…",
|
||||
"components.Discover.CreateSlider.slidernameplaceholder": "Nazwa suwaka",
|
||||
"components.Discover.CreateSlider.starttyping": "Zacznij pisać aby wyszukać.",
|
||||
"components.Discover.CreateSlider.validationDatarequired": "Należy wprowadzić wartość danych.",
|
||||
"components.Discover.CreateSlider.validationTitlerequired": "Należy podać tytuł.",
|
||||
"components.Discover.DiscoverMovieKeyword.keywordMovies": "Filmy: {keywordTitle}",
|
||||
"components.Discover.DiscoverMovies.discovermovies": "Filmy",
|
||||
"components.Discover.DiscoverMovies.sortPopularityAsc": "Popularność rosnąco",
|
||||
"components.Discover.DiscoverMovies.sortPopularityDesc": "Popularność malejąco",
|
||||
"components.Discover.DiscoverMovies.sortReleaseDateAsc": "Data wydania rosnąco",
|
||||
"components.Discover.DiscoverMovies.sortReleaseDateDesc": "Data wydania malejąco",
|
||||
"components.Discover.DiscoverMovies.sortTitleAsc": "Tytuł (A-Z) rosnąco",
|
||||
"components.Discover.DiscoverMovies.sortTitleDesc": "Tytuł (Z-A) malejąco",
|
||||
"components.Discover.DiscoverMovies.sortTmdbRatingAsc": "Ocena TMDB rosnąco",
|
||||
"components.Discover.DiscoverMovies.sortTmdbRatingDesc": "Ocena TMDB malejąco",
|
||||
"components.Discover.DiscoverSliderEdit.deletesuccess": "Pomyślnie usunięto slider.",
|
||||
"components.Discover.DiscoverSliderEdit.deletefail": "Nie udało się usunąć suwaka.",
|
||||
"components.Discover.DiscoverSliderEdit.deletesuccess": "Pomyślnie usunięto suwak.",
|
||||
"components.Discover.DiscoverSliderEdit.enable": "Przełącz widoczność",
|
||||
"components.Discover.DiscoverTv.activefilters": "{count, plural, one {# aktywny filtr} other {# aktywnych filtrów}}",
|
||||
"components.Discover.DiscoverTv.discovertv": "Seriale",
|
||||
"components.Discover.DiscoverTv.sortFirstAirDateAsc": "Data pierwszej emisji rosnąco",
|
||||
"components.Discover.DiscoverTv.sortFirstAirDateDesc": "Pierwsza data emisji malejąco",
|
||||
"components.Discover.DiscoverSliderEdit.remove": "Usuń",
|
||||
"components.Discover.DiscoverTv.sortFirstAirDateAsc": "Data premiery rosnąco",
|
||||
"components.Discover.DiscoverTv.sortFirstAirDateDesc": "Data premiery malejąco",
|
||||
"components.Discover.DiscoverTv.sortPopularityAsc": "Popularność rosnąco",
|
||||
"components.Discover.DiscoverTv.sortPopularityDesc": "Popularność malejąco",
|
||||
"components.Discover.DiscoverTv.sortTitleAsc": "Tytuł (A-Z) rosnąco",
|
||||
"components.Discover.DiscoverTv.sortTitleDesc": "Tytuł (Z-A) malejąco",
|
||||
"components.Discover.DiscoverTv.sortTmdbRatingAsc": "Ocena TMDB rosnąco",
|
||||
"components.Discover.DiscoverTv.sortTmdbRatingDesc": "Ocena TMDB malejąco",
|
||||
"components.Discover.CreateSlider.searchStudios": "Szukaj studiów…",
|
||||
"components.Settings.SettingsMain.general": "Ogólne",
|
||||
"components.Settings.SettingsMain.generalsettings": "Ustawienia ogólne",
|
||||
"components.Settings.SettingsMain.originallanguageTip": "Filtruj zawartość według języka oryginału",
|
||||
"components.Discover.PlexWatchlistSlider.emptywatchlist": "W tym miejscu pojawią się multimedia dodane do <PlexWatchlistSupportLink>listy obserwowanych Plex</PlexWatchlistSupportLink>.",
|
||||
"components.Discover.networks": "Platformy",
|
||||
"components.Discover.moviegenres": "Gatunki filmowe",
|
||||
"components.Discover.tmdbnetwork": "Platforma TMDB",
|
||||
"components.Discover.tmdbstudio": "Studio TMDB",
|
||||
"components.Discover.PlexWatchlistSlider.plexwatchlist": "Twoja lista obserwowanych Plex",
|
||||
"components.Discover.createnewslider": "Utwórz nowy suwak",
|
||||
"components.Discover.customizediscover": "Dostosowywanie funkcji Odkryj",
|
||||
"components.Discover.resetfailed": "Wystąpił problem podczas resetowania ustawień odnajdywania.",
|
||||
"components.Discover.resetsuccess": "Pomyślnie zresetowano ustawienia odnajdywania.",
|
||||
"components.Discover.resetwarning": "Przywróć wszystkie Suwaki do ustawień domyślnych. Spowoduje to również usunięcie wszystkich niestandardowych Suwaków!",
|
||||
"components.Discover.resettodefault": "Przywróć ustawienia domyślne",
|
||||
"components.Discover.studios": "Studia",
|
||||
"components.Discover.tmdbmoviegenre": "Gatunek filmu TMDB",
|
||||
"components.Discover.tvgenres": "Gatunki serialu",
|
||||
"components.Settings.SettingsMain.csrfProtectionTip": "Ustaw zewnętrzny dostęp api na tylko do odczytu (wymaga HTTPS)",
|
||||
"components.Settings.SettingsMain.csrfProtectionHoverTip": "NIE włączaj tego ustawienia, chyba że rozumiesz, co robisz!",
|
||||
"components.Settings.SettingsMain.generalsettingsDescription": "Skonfiguruj globalne i domyślne ustawienia dla Overseerr.",
|
||||
"components.Settings.SettingsMain.hideAvailable": "Ukryj dostępne multimedia",
|
||||
"components.Settings.SettingsMain.trustProxyTip": "Pozwól Overseerr poprawnie rejestrować adresy IP klientów za serwerem proxy",
|
||||
"components.Settings.SettingsMain.toastSettingsSuccess": "Ustawienia zostały zapisane pomyślnie!",
|
||||
"components.Settings.SettingsMain.trustProxy": "Włącz obsługę proxy",
|
||||
"components.Settings.SettingsMain.validationApplicationUrlTrailingSlash": "Adres URL nie może kończyć się ukośnikiem",
|
||||
"components.Discover.FilterSlideover.activefilters": "{count, plural, one {# aktywny filtr} other {# aktywnych filtrów}}",
|
||||
"components.Discover.FilterSlideover.clearfilters": "Wyczyść aktywne filtry",
|
||||
"components.Discover.FilterSlideover.filters": "Filtry",
|
||||
"components.Discover.FilterSlideover.firstAirDate": "Pierwsza data emisji",
|
||||
"components.Discover.FilterSlideover.firstAirDate": "Data pierwszego wyemitowania",
|
||||
"components.Discover.FilterSlideover.from": "Od",
|
||||
"components.Discover.FilterSlideover.genres": "Gatunki",
|
||||
"components.Discover.FilterSlideover.keywords": "Słowa kluczowe",
|
||||
"components.Discover.FilterSlideover.originalLanguage": "Język oryginalny",
|
||||
"components.Discover.FilterSlideover.ratingText": "Oceny pomiędzy {minValue} a {maxValue}",
|
||||
"components.Discover.FilterSlideover.ratingText": "Oceny między {minValue} a {maxValue}",
|
||||
"components.Discover.CreateSlider.providetmdbkeywordid": "Podaj ID słowa kluczowego TMDB",
|
||||
"components.Discover.CreateSlider.searchKeywords": "Wyszukaj słowa kluczowe…",
|
||||
"components.Discover.DiscoverMovies.sortReleaseDateAsc": "Data wydania rosnąco",
|
||||
"components.Discover.DiscoverTv.discovertv": "Seriale",
|
||||
"components.Discover.DiscoverTv.sortTmdbRatingAsc": "Ocena TMDB rosnąco",
|
||||
"components.Discover.DiscoverTvKeyword.keywordSeries": "Seriale: {keywordTitle}",
|
||||
"components.Discover.FilterSlideover.originalLanguage": "Oryginalny język",
|
||||
"components.Discover.FilterSlideover.releaseDate": "Data wydania",
|
||||
"components.Discover.FilterSlideover.runtimeText": "{minValue}-{maxValue} czas odtwarzania w minutach",
|
||||
"components.Discover.FilterSlideover.runtime": "Czas odtwarzania",
|
||||
"components.Discover.FilterSlideover.tmdbuserscore": "Ocena użytkowników TMDB",
|
||||
"components.Discover.FilterSlideover.runtime": "Długość",
|
||||
"components.Discover.FilterSlideover.runtimeText": "{minValue}-{maxValue} minut trwania",
|
||||
"components.Discover.FilterSlideover.streamingservices": "Serwisy streamingowe",
|
||||
"components.Discover.FilterSlideover.studio": "Studio",
|
||||
"components.Discover.FilterSlideover.tmdbuservotecount": "Liczba głosów użytkowników TMDB",
|
||||
"components.Discover.FilterSlideover.to": "Do",
|
||||
"components.Discover.RecentlyAddedSlider.recentlyAdded": "Ostatnio dodane",
|
||||
"components.Discover.stopediting": "Zatrzymaj edycję",
|
||||
"components.Discover.tmdbmoviekeyword": "Słowo kluczowe filmu TMDB",
|
||||
"components.Discover.tmdbsearch": "Wyszukiwanie TMDB",
|
||||
"components.Layout.Sidebar.browsemovies": "Filmy",
|
||||
"components.Layout.Sidebar.browsetv": "Seriale",
|
||||
"components.Selector.searchGenres": "Wybierz gatunki…",
|
||||
"components.Selector.searchKeywords": "Szukaj słów kluczowych…",
|
||||
"components.Selector.showmore": "Pokaż więcej",
|
||||
"components.Selector.starttyping": "Zacznij pisać, aby wyszukać.",
|
||||
"components.Settings.SettingsMain.applicationTitle": "Tytuł aplikacji",
|
||||
"components.Settings.SettingsMain.applicationurl": "Adres URL aplikacji",
|
||||
"components.Settings.SettingsMain.cacheImages": "Włącz buforowanie obrazów",
|
||||
"components.Settings.SettingsMain.csrfProtection": "Włącz ochronę CSRF",
|
||||
"components.Settings.SettingsMain.locale": "Język wyświetlania",
|
||||
"components.Settings.SettingsMain.originallanguage": "Odkryj język",
|
||||
"components.Settings.SettingsMain.partialRequestsEnabled": "Zezwalaj na prośby o część serialu",
|
||||
"components.Settings.SettingsMain.region": "Odkryj region",
|
||||
"components.Settings.SettingsMain.regionTip": "Filtruj zawartość według dostępności regionalnej",
|
||||
"components.Settings.SettingsMain.toastApiKeyFailure": "Coś poszło nie tak podczas generowania nowego klucza API.",
|
||||
"components.Settings.SettingsMain.toastApiKeySuccess": "Nowy klucz API został pomyślnie wygenerowany!",
|
||||
"components.Settings.SettingsMain.validationApplicationTitle": "Należy podać tytuł aplikacji",
|
||||
"components.Settings.SettingsMain.validationApplicationUrl": "Musisz podać prawidłowy adres URL",
|
||||
"components.Discover.FilterSlideover.streamingservices": "Usługi streamingowe",
|
||||
"components.Discover.FilterSlideover.studio": "Studia",
|
||||
"components.Discover.tmdbtvgenre": "Gatunek serialu TMDB",
|
||||
"components.Discover.FilterSlideover.voteCount": "Liczba głosów między {minValue} a {maxValue}",
|
||||
"components.Discover.PlexWatchlistSlider.plexwatchlist": "Twoja lista obserwowanych Plex",
|
||||
"components.Discover.RecentlyAddedSlider.recentlyAdded": "Niedawno dodane",
|
||||
"components.Discover.createnewslider": "Dodaj nowy suwak",
|
||||
"components.Discover.customizediscover": "Dostosuj Odkryj",
|
||||
"components.Discover.PlexWatchlistSlider.emptywatchlist": "Media dodane do twojej <PlexWatchlistSupportLink>listy obserwowanych Plex</PlexWatchlistSupportLink> zostaną wyświetlone tutaj.",
|
||||
"components.Discover.emptywatchlist": "Media dodane do twojej <PlexWatchlistSupportLink>listy obserwowanych Plex</PlexWatchlistSupportLink> zostaną wyświetlone tutaj.",
|
||||
"components.Discover.tmdbstudio": "Studio TMDB",
|
||||
"components.Discover.tmdbtvkeyword": "Słowo kluczowe serialu TMDB",
|
||||
"components.Discover.updatesuccess": "Zaktualizowano ustawienia odnajdywania.",
|
||||
"components.Selector.nooptions": "Brak wyników.",
|
||||
"components.Discover.tmdbtvgenre": "Gatunek serialu TMDB",
|
||||
"components.Discover.tmdbsearch": "Wyszukiwanie TMDB",
|
||||
"components.Discover.FilterSlideover.tmdbuserscore": "Ocena użytkownika TMDB",
|
||||
"components.Discover.moviegenres": "Gatunki filmu",
|
||||
"components.Discover.networks": "Kanały",
|
||||
"components.Discover.CreateSlider.editsuccess": "Edytowano suwak i zapisano ustawienia personalizacji.",
|
||||
"components.Discover.stopediting": "Zakończ edytowanie",
|
||||
"components.Discover.studios": "Studia",
|
||||
"components.DownloadBlock.formattedTitle": "{title}: Sezon {seasonNumber} Odcinek {episodeNumber}",
|
||||
"components.Discover.tvgenres": "Gatunki seriali",
|
||||
"components.Discover.updatefailed": "Coś poszło nie tak podczas aktualizacji ustawień personalizacji wykrywania.",
|
||||
"components.Discover.updatesuccess": "Zaktualizowano ustawienia personalizacji wykrywania.",
|
||||
"components.Discover.resettodefault": "Przywróć domyślne",
|
||||
"components.Discover.resetfailed": "Coś poszło nie tak podczas resetowania ustawień personalizacji wykrywania.",
|
||||
"components.Discover.resetsuccess": "Pomyślnie zresetowano ustawienia wykrywania.",
|
||||
"components.Discover.tmdbmoviegenre": "Gatunek filmu TMDB",
|
||||
"components.Layout.Sidebar.browsetv": "Seriale",
|
||||
"components.Layout.UserWarnings.emailInvalid": "Adres e-mail jest nieprawidłowy.",
|
||||
"components.Layout.UserWarnings.passwordRequired": "Wymagane jest podanie hasła.",
|
||||
"components.Login.credentialerror": "Nazwa użytkownika lub hasło są nieprawidłowe.",
|
||||
"components.Login.emailtooltip": "Adres nie musi być powiązany z instancją {mediaServerName}.",
|
||||
"components.Login.host": "{mediaServerName} URL",
|
||||
"components.Login.initialsignin": "Połącz",
|
||||
"components.Login.initialsigningin": "Łączenie…",
|
||||
"components.Login.save": "Reklama",
|
||||
"components.Login.saving": "Dodaję…",
|
||||
"components.Login.signinwithjellyfin": "Użyj swojego konta {mediaServerName}",
|
||||
"components.Login.title": "Dodaj e-mail",
|
||||
"components.Login.username": "Nazwa użytkownika",
|
||||
"components.Login.validationEmailRequired": "Musisz podać adres e-mail",
|
||||
"components.Login.validationemailformat": "Wymagany poprawny adres e-mail",
|
||||
"components.Login.validationhostformat": "Wymagany poprawny adres URL",
|
||||
"components.Login.validationhostrequired": "{mediaServerName} URL wymagany",
|
||||
"components.Login.validationusernamerequired": "Wymagana nazwa użytkownika",
|
||||
"components.ManageSlideOver.removearr4k": "Usuń z 4k {arr}",
|
||||
"components.MovieDetails.downloadstatus": "Status pobierania",
|
||||
"components.MovieDetails.openradarr4k": "Otwórz film 4k w Radarr",
|
||||
"components.MovieDetails.play": "Odtwórz na {mediaServerName}",
|
||||
"components.MovieDetails.play4k": "Odtwórz w 4K na {mediaServerName}",
|
||||
"components.PermissionEdit.viewrecent": "Wyświetl ostatnio dodane",
|
||||
"components.PermissionEdit.viewrecentDescription": "Zezwolenie na wyświetlanie listy ostatnio dodanych multimediów.",
|
||||
"components.RequestBlock.approve": "Zatwierdź żądanie",
|
||||
"components.RequestBlock.decline": "Odrzuć żądanie",
|
||||
"components.RequestBlock.delete": "Usuń żądanie",
|
||||
"components.RequestBlock.lastmodifiedby": "Ostatnio modyfikowany przez",
|
||||
"components.RequestBlock.requestdate": "Data żądania",
|
||||
"components.RequestBlock.requestedby": "Żądany przez",
|
||||
"components.RequestCard.cancelrequest": "Anuluj prośbę",
|
||||
"components.RequestCard.declinerequest": "Odrzuć prośbę",
|
||||
"components.RequestCard.editrequest": "Edytuj prośbę",
|
||||
"components.RequestCard.unknowntitle": "Nieznany tytuł",
|
||||
"components.RequestModal.requestcollectiontitle": "Poproś o kolekcję",
|
||||
"components.RequestModal.requestmovie4ktitle": "Poproś o film w 4K",
|
||||
"components.RequestModal.requestmovietitle": "Poproś o film",
|
||||
"components.RequestModal.requestseries4ktitle": "Poproś o serial w 4K",
|
||||
"components.RequestModal.requestseriestitle": "Poproś o serial",
|
||||
"components.Selector.searchGenres": "Wybierz gatunki…",
|
||||
"components.Selector.searchKeywords": "Wyszukaj słowa kluczowe…",
|
||||
"components.Selector.searchStudios": "Szukaj studiów…",
|
||||
"components.Selector.showless": "Pokaż mniej",
|
||||
"components.Discover.updatefailed": "Wystąpił problem podczas aktualizowania ustawień odnajdywania.",
|
||||
"components.Selector.starttyping": "Rozpocznij wpisywanie, aby wyszukać.",
|
||||
"components.Settings.SettingsJobsCache.jellyfin-recently-added-scan": "Ostatnio dodane skanowanie Jellyfin",
|
||||
"components.Settings.SettingsMain.apikey": "Klucz API",
|
||||
"components.Settings.SettingsMain.cacheImagesTip": "Pamięć podręczna dla obrazów pochodzących z zewnętrznych źródeł (wymaga znacznej ilości miejsca na dysku)",
|
||||
"components.Settings.SettingsMain.applicationTitle": "Nazwa aplikacji",
|
||||
"components.Settings.SettingsMain.applicationurl": "URL aplikacji",
|
||||
"components.Settings.SettingsMain.csrfProtection": "Włącz ochronę CSRF",
|
||||
"components.Settings.SettingsMain.csrfProtectionHoverTip": "NIE włączaj tego ustawienia, jeśli nie rozumiesz, co robisz!",
|
||||
"components.Settings.SettingsMain.csrfProtectionTip": "Ustawienie dostępu do zewnętrznego API tylko do odczytu (wymaga HTTPS)",
|
||||
"components.Settings.SettingsMain.general": "Ogólne",
|
||||
"components.Settings.SettingsMain.generalsettings": "Ustawienia ogólne",
|
||||
"components.Settings.SettingsMain.generalsettingsDescription": "Konfiguracja globalnych i domyślnych ustawień Overseerr.",
|
||||
"components.Settings.SettingsMain.hideAvailable": "Ukryj dostępne media",
|
||||
"components.Settings.SettingsMain.locale": "Wyświetlany język",
|
||||
"components.Settings.SettingsMain.partialRequestsEnabled": "Zezwalaj na częściowe żądania seriali",
|
||||
"components.Settings.SettingsMain.region": "Region odkrywania",
|
||||
"components.Settings.SettingsMain.regionTip": "Filtrowanie zawartości według dostępności regionalnej",
|
||||
"components.Settings.SettingsMain.toastSettingsFailure": "Coś poszło nie tak podczas zapisywania ustawień.",
|
||||
"i18n.collection": "Kolekcja",
|
||||
"components.MovieDetails.imdbuserscore": "Ocena użytkowników IMDB",
|
||||
"components.Settings.SonarrModal.seriesType": "Typ serialu"
|
||||
"components.Settings.SettingsMain.trustProxyTip": "Umożliwienie Overseerr poprawnego rejestrowania adresów IP klientów za serwerem proxy",
|
||||
"components.Settings.jellyfinSettings": "{mediaServerName} Ustawienia",
|
||||
"components.Settings.jellyfinSettingsFailure": "Coś poszło nie tak podczas zapisywania ustawień {mediaServerName}.",
|
||||
"components.Settings.jellyfinSettingsSuccess": "Ustawienia {mediaServerName} zostały pomyślnie zapisane!",
|
||||
"components.Settings.jellyfinlibrariesDescription": "Biblioteki {mediaServerName} skanują w poszukiwaniu tytułów. Kliknij poniższy przycisk, jeśli na liście nie ma żadnych bibliotek.",
|
||||
"components.Settings.jellyfinsettings": "{mediaServerName} ustawienia",
|
||||
"components.Settings.jellyfinsettingsDescription": "Konfiguracja ustawień serwera {mediaServerName}. {mediaServerName} skanuje biblioteki {mediaServerName}, aby sprawdzić, jaka zawartość jest dostępna.",
|
||||
"components.Settings.manualscanJellyfin": "Ręczne skanowanie biblioteki",
|
||||
"components.Settings.saving": "Zapisywanie…",
|
||||
"components.Settings.syncing": "Synchronizowanie",
|
||||
"components.Setup.signinWithPlex": "Użyj konta Plex",
|
||||
"components.StatusBadge.openinarr": "Otwórz w {arr}",
|
||||
"components.StatusBadge.playonplex": "Odtwórz na {mediaServerName}",
|
||||
"components.TitleCard.watchlistError": "Coś poszło nie tak, spróbuj ponownie.",
|
||||
"components.TvDetails.Season.somethingwentwrong": "Coś poszło nie tak podczas pobierania danych sezonu.",
|
||||
"components.TvDetails.seasonnumber": "Sezon {seasonNumber}",
|
||||
"components.TvDetails.seasonstitle": "Sezony",
|
||||
"components.TvDetails.status4k": "4K {status}",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncmovies": "Automatyczne żądania filmów",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.save": "Zapisz zmiany",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.saving": "Zapisywanie…",
|
||||
"components.Layout.Sidebar.browsemovies": "Filmy",
|
||||
"components.Login.validationEmailFormat": "Nieprawidłowy adres e-mail",
|
||||
"components.RequestModal.SearchByNameModal.nomatches": "Nie udało nam się znaleźć odpowiednika dla tego serialu.",
|
||||
"components.Selector.showmore": "Pokaż więcej",
|
||||
"components.Settings.SettingsMain.cacheImagesTip": "Pamięć podręczna obrazów pochodzących z zewnątrz (wymaga znacznej ilości miejsca na dysku)",
|
||||
"components.Settings.SettingsMain.originallanguageTip": "Filtrowanie zawartości według oryginalnego języka",
|
||||
"components.Settings.SettingsMain.toastSettingsSuccess": "Ustawienia zapisane pomyślnie!",
|
||||
"components.Settings.experimentalTooltip": "Włączenie tego ustawienia może spowodować nieoczekiwane zachowanie aplikacji",
|
||||
"components.UserList.mediaServerUser": "{mediaServerName} Użytkownik",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.email": "Email",
|
||||
"components.Discover.resetwarning": "Przywróć domyślne ustawienia wszystkich suwaków. Spowoduje to również usunięcie wszystkich niestandardowych suwaków!",
|
||||
"components.Layout.UserWarnings.emailRequired": "Wymagany jest adres e-mail.",
|
||||
"components.MovieDetails.openradarr": "Otwórz film w Radarr",
|
||||
"components.RequestModal.requestcollection4ktitle": "Poproś o kolekcję w 4K",
|
||||
"components.Setup.signinWithJellyfin": "Użyj konta {mediaServerName}",
|
||||
"components.Login.description": "Ponieważ logujesz się do {applicationName} po raz pierwszy, musisz dodać prawidłowy adres e-mail.",
|
||||
"components.ManageSlideOver.manageModalRemoveMediaWarning": "* Spowoduje to nieodwracalne usunięcie tego {mediaType} z {arr}, w tym wszystkich plików.",
|
||||
"components.ManageSlideOver.removearr": "Usuń z {arr}",
|
||||
"components.PermissionEdit.autorequestSeriesDescription": "Zezwolenie na automatyczne przesyłanie żądań dotyczących seriali innych niż 4K za pośrednictwem listy obserwowanych Plex.",
|
||||
"components.PermissionEdit.viewwatchlists": "Wyświetl {mediaServerName} watchlistę",
|
||||
"components.RequestCard.approverequest": "Zaakceptuj prośbę",
|
||||
"components.Settings.RadarrModal.tagRequestsInfo": "Automatycznie dodawaj dodatkowy znacznik z identyfikatorem użytkownika i wyświetlaną nazwą użytkownika",
|
||||
"components.Settings.SettingsAbout.supportjellyseerr": "Wspomóż Jellyseerr",
|
||||
"components.Settings.SettingsJobsCache.jellyfin-full-scan": "Pełne skanowanie bibliotek Jellyfin",
|
||||
"components.Settings.SettingsLogs.viewdetails": "Zobacz szczegóły",
|
||||
"components.Settings.jellyfinSettingsDescription": "Opcjonalnie skonfiguruj wewnętrzne i zewnętrzne punkty końcowe dla serwera {mediaServerName}. W większości przypadków zewnętrzny adres URL różni się od wewnętrznego adresu URL. Niestandardowy adres URL resetowania hasła można również ustawić dla logowania {mediaServerName}, na wypadek gdybyś chciał przekierować na inną stronę resetowania hasła.",
|
||||
"components.Settings.save": "Zapisz zmiany",
|
||||
"components.Settings.syncJellyfin": "Synchronizuj biblioteki",
|
||||
"components.TvDetails.Season.noepisodes": "Lista odcinków jest niedostępna.",
|
||||
"components.Settings.Notifications.NotificationsPushover.sound": "Dźwięk powiadomień",
|
||||
"components.Settings.RadarrModal.tagRequests": "Żądania tagów",
|
||||
"components.Settings.SettingsJobsCache.editJobScheduleCurrent": "Aktualna częstotliwość",
|
||||
"components.Settings.SettingsMain.validationApplicationTitle": "Musisz podać tytuł aplikacji",
|
||||
"components.Settings.SonarrModal.seriesType": "Typ seriali",
|
||||
"components.Settings.advancedTooltip": "Nieprawidłowe skonfigurowanie tego ustawienia może spowodować nieprawidłowe działanie",
|
||||
"components.TvDetails.reportissue": "Zgłoś problem",
|
||||
"components.RequestBlock.edit": "Edytuj żądanie",
|
||||
"components.RequestList.RequestItem.unknowntitle": "Nieznany tytuł",
|
||||
"components.Selector.nooptions": "Brak wyników.",
|
||||
"components.Settings.Notifications.NotificationsPushover.deviceDefault": "Domyślne urządzenie",
|
||||
"components.Settings.Notifications.userEmailRequired": "Wymagaj adresu e-mail użytkownika",
|
||||
"components.Settings.manualscanDescriptionJellyfin": "Zwykle będzie to uruchamiane tylko raz na 24 godziny. Jellyseerr będzie bardziej agresywnie sprawdzać ostatnio dodane biblioteki serwera {mediaServerName}. Jeśli po raz pierwszy konfigurujesz Jellyseerr, zalecane jest jednorazowe pełne ręczne skanowanie biblioteki!"
|
||||
}
|
||||
|
||||
@@ -1257,9 +1257,35 @@
|
||||
"components.Discover.FilterSlideover.tmdbuservotecount": "Qtd de Votos de Usuários TMDB",
|
||||
"components.Discover.FilterSlideover.voteCount": "Qtd the votos entre {minValue} e {maxValue}",
|
||||
"components.Settings.RadarrModal.tagRequestsInfo": "Adicione automaticamente uma tag extra com o ID de usuário e o nome de exibição do solicitante",
|
||||
"i18n.collection": "Coleção",
|
||||
"components.MovieDetails.imdbuserscore": "Pontuação de usuário IMDB",
|
||||
"components.Settings.SonarrModal.tagRequestsInfo": "Adiciona automaticamente uma tag adicional com o ID de usuário e nome de exibição de quem pediu",
|
||||
"components.Settings.SonarrModal.tagRequests": "Marcar Pedidos",
|
||||
"components.Settings.RadarrModal.tagRequests": "Marcar Pedidos"
|
||||
"components.Layout.UserWarnings.emailRequired": "Um endereço de e-mail é necessário.",
|
||||
"components.Login.credentialerror": "O nome de usuário ou senha está incorreto.",
|
||||
"components.Login.description": "Já que é sua primeira vez entrando em {applicationName}, você precisa adicionar um e-mail válido.",
|
||||
"components.Login.host": "URL de {mediaServerName}",
|
||||
"components.Login.initialsignin": "Conectar",
|
||||
"components.Login.initialsigningin": "Conectando…",
|
||||
"components.Login.save": "Adicionar",
|
||||
"components.Login.saving": "Adicionando…",
|
||||
"components.Login.signinwithjellyfin": "Use sua conta de {mediaServerName}",
|
||||
"components.Login.title": "Adicionar E-Mail",
|
||||
"components.Login.username": "Nome de usuário",
|
||||
"components.Login.validationEmailFormat": "E-mail inválido",
|
||||
"components.Login.validationEmailRequired": "Você precisa providenciar um e-mail",
|
||||
"components.Login.validationemailformat": "E-mail válido necessário",
|
||||
"components.Login.validationhostformat": "URL válido necessário",
|
||||
"components.Login.validationusernamerequired": "Nome de usuário necessário",
|
||||
"components.ManageSlideOver.removearr": "Remover de {arr}",
|
||||
"components.ManageSlideOver.removearr4k": "Remover de {arr} 4K",
|
||||
"components.MovieDetails.downloadstatus": "Status de download",
|
||||
"components.MovieDetails.imdbuserscore": "Avaliação de usuário no IMDB",
|
||||
"components.MovieDetails.openradarr": "Abrir filme no Radarr",
|
||||
"components.Settings.Notifications.NotificationsPushover.sound": "Som de notificação",
|
||||
"components.Login.emailtooltip": "Endereço não precisa ser associado à sua instância de {mediaServerName}.",
|
||||
"components.Layout.UserWarnings.emailInvalid": "Endereço de e-mail inválido.",
|
||||
"components.Layout.UserWarnings.passwordRequired": "Uma senha é necessária.",
|
||||
"components.Settings.Notifications.NotificationsPushover.deviceDefault": "Padrão do dispositivo",
|
||||
"components.Login.validationhostrequired": "URL de {mediaServerName} necessário",
|
||||
"components.MovieDetails.openradarr4k": "Abrir filme em Radarr 4K",
|
||||
"components.MovieDetails.play": "Reproduzir em {mediaServerName}",
|
||||
"components.ManageSlideOver.manageModalRemoveMediaWarning": "* Isto irá remover este {mediaType} de {arr}, incluindo todos os arquivos.",
|
||||
"components.MovieDetails.play4k": "Reproduzir em 4K em {mediaServerName}"
|
||||
}
|
||||
|
||||
@@ -370,7 +370,7 @@
|
||||
"components.PlexLoginButton.signinwithplex": "Conectat",
|
||||
"components.QuotaSelector.movieRequests": "{quotaLimit} <quotaUnits>{movies} per {quotaDays} {days}</quotaUnits>",
|
||||
"components.PersonDetails.lifespan": "{birthdate} – {deathdate}",
|
||||
"components.RequestBlock.seasons": "{seasonCount, plural, one {Sezon} other {Sezoane}}",
|
||||
"components.RequestBlock.seasons": "{seasonCount, plural, un {Season} alte {Seasons}}",
|
||||
"components.PermissionEdit.requestMoviesDescription": "Acordați permisiunea de a trimite solicitări pentru filme non-4K.",
|
||||
"components.PermissionEdit.viewissuesDescription": "Acordați permisiunea de a vizualiza problemele media raportate de alți utilizatori.",
|
||||
"components.PermissionEdit.viewwatchlistsDescription": "Acordați permisiunea de a vizualiza listele de urmărire Plex ale altor utilizatori.",
|
||||
@@ -403,62 +403,40 @@
|
||||
"components.RequestBlock.approve": "Aprobă Solicitarea",
|
||||
"components.RequestBlock.decline": "Respinge Solicitarea",
|
||||
"components.RequestBlock.requestedby": "Solicitat de",
|
||||
"components.RequestButton.approve4krequests": "Aprobă {requestCount, plural, one {Cerere 4K} other {{requestCount} Cereri 4K}}",
|
||||
"components.RequestButton.approve4krequests": "Aprobă {requestCount, plural, o {4K Request} alte {{requestCount} 4K Requests}}",
|
||||
"components.RequestBlock.lastmodifiedby": "Ultima Dată Modificat de",
|
||||
"components.RequestBlock.profilechanged": "Profil Calitate",
|
||||
"components.RequestBlock.requestdate": "Dată Solicitare",
|
||||
"components.RequestButton.approverequests": "Aprobă {requestCount, plural, one {Cerere} other {{requestCount} Cereri}}",
|
||||
"components.RequestButton.requestmore4k": "Cere mai mult în 4K",
|
||||
"components.RequestButton.approverequest4k": "Aproba Cereri 4K",
|
||||
"components.RequestCard.tmdbid": "ID TMDB",
|
||||
"components.RequestCard.failedretry": "A apărut o eroare la reîncercarea solicitării.",
|
||||
"components.RequestButton.declinerequest": "Respinge Cerere",
|
||||
"components.RequestCard.seasons": "{seasonCount, plural, one {Sezon} other {Sezoane}}",
|
||||
"components.RequestCard.declinerequest": "Respinge Cererea",
|
||||
"components.RequestButton.viewrequest": "Vezi Cerere",
|
||||
"components.RequestButton.declinerequests": "Respinge {requestCount, plural, one {Cererea} other {{requestCount} Cererile}}",
|
||||
"components.RequestCard.mediaerror": "{mediaType} Nu a fost găsit",
|
||||
"components.RequestCard.editrequest": "Editează Cererea",
|
||||
"components.RequestButton.viewrequest4k": "Vezi Cerere 4K",
|
||||
"components.RequestButton.decline4krequests": "Respinge {requestCount, plural, one {Cererea 4K} other {{requestCount} Cererile 4K}}",
|
||||
"components.RequestButton.declinerequest4k": "Respinge Cerere 4K",
|
||||
"components.RequestCard.approverequest": "Aprobă Cererea",
|
||||
"components.RequestButton.approverequest": "Cereri Aprobate",
|
||||
"components.RequestCard.deleterequest": "Șterge Cererea",
|
||||
"components.RequestCard.unknowntitle": "Titlu necunoscut",
|
||||
"components.RequestList.RequestItem.cancelRequest": "Anulează Cerere",
|
||||
"components.RequestCard.tvdbid": "ID TheTVDB",
|
||||
"components.RequestButton.requestmore": "Cere mai mult",
|
||||
"components.RequestList.RequestItem.deleterequest": "Șterge Cerere",
|
||||
"components.RequestCard.cancelrequest": "Anulează Cererea",
|
||||
"components.RequestModal.AdvancedRequester.folder": "{path} ({space})",
|
||||
"components.RequestList.RequestItem.modified": "Modificat",
|
||||
"components.RequestList.RequestItem.editrequest": "Editează Cererea",
|
||||
"components.RequestModal.AdvancedRequester.qualityprofile": "Profil de Calitate",
|
||||
"components.RequestList.requests": "Cereri",
|
||||
"components.RequestModal.AdvancedRequester.advancedoptions": "Avansat",
|
||||
"components.RequestModal.AdvancedRequester.notagoptions": "Fără etichete.",
|
||||
"components.RequestList.RequestItem.modifieduserdate": "{date} de {user}",
|
||||
"components.RequestModal.AdvancedRequester.requestas": "Cere ca",
|
||||
"components.RequestList.showallrequests": "Afișează toate cererile",
|
||||
"components.RequestList.RequestItem.tmdbid": "ID-ul TMDB",
|
||||
"components.RequestList.RequestItem.requesteddate": "Solicitat",
|
||||
"components.RequestModal.QuotaDisplay.movie": "film",
|
||||
"components.RequestList.RequestItem.failedretry": "Ceva a mers greșit în timpul reîncercării cererii.",
|
||||
"components.RequestList.RequestItem.unknowntitle": "Titlu Necunoscut",
|
||||
"components.RequestModal.AdvancedRequester.destinationserver": "Server Destinație",
|
||||
"components.RequestModal.AdvancedRequester.rootfolder": "Folder Rădăcină",
|
||||
"components.RequestList.sortAdded": "Cele Mai Recente",
|
||||
"components.RequestModal.AdvancedRequester.tags": "Etichete",
|
||||
"components.RequestList.RequestItem.mediaerror": "{mediaType} nu a fost găsit",
|
||||
"components.RequestList.sortModified": "Ultima Modificată",
|
||||
"components.RequestList.RequestItem.tvdbid": "ID-ul TheTVDB",
|
||||
"components.RequestModal.AdvancedRequester.selecttags": "Selectați Etichetele",
|
||||
"components.RequestList.RequestItem.requested": "Solicitat",
|
||||
"components.RequestModal.QuotaDisplay.notenoughseasonrequests": "Nu sunt suficiente cereri de sezon rămase",
|
||||
"components.RequestModal.AdvancedRequester.default": "{name} (Implicit)",
|
||||
"components.RequestModal.AdvancedRequester.languageprofile": "Profil de Limbă",
|
||||
"components.RequestModal.QuotaDisplay.allowedRequestsUser": "Acest utilizator are voie sa ceara <strong>{limit}</strong> {type} la fiecare <strong>{days}</strong> zile.",
|
||||
"components.RequestList.RequestItem.seasons": "",
|
||||
"components.RequestModal.QuotaDisplay.allowedRequests": "Aveți voie să cereți <strong>{limit}</strong> de {type} la fiecare <strong>{days}</strong> zile."
|
||||
"components.Layout.UserWarnings.emailRequired": "Este necesara o adresa de email.",
|
||||
"components.Layout.UserWarnings.passwordRequired": "Este necesara o parola.",
|
||||
"components.Login.credentialerror": "Numele de utilizator sau parola sunt incorecte.",
|
||||
"components.Login.emailtooltip": "Nu este necesar ca adresa ta sa fie asociata cu instanta ta {mediaServerName} .",
|
||||
"components.Login.save": "Adauga",
|
||||
"components.Login.signinwithjellyfin": "Foloseste-ti contul de {mediaServerName}",
|
||||
"components.Login.title": "Adauga email",
|
||||
"components.Login.username": "Nume utilizator",
|
||||
"components.Login.validationEmailFormat": "Adresa email invalida",
|
||||
"components.Login.validationemailformat": "Necesar email valid",
|
||||
"components.Login.validationhostformat": "Necesar URL valid",
|
||||
"components.Login.validationhostrequired": "{mediaServerName} URL necesar",
|
||||
"components.Login.validationusernamerequired": "Nume utilizator necesar",
|
||||
"components.MovieDetails.downloadstatus": "Status descarcare",
|
||||
"components.MovieDetails.openradarr": "Deschide film in Radarr",
|
||||
"components.MovieDetails.openradarr4k": "Deschide film in 4K Radarr",
|
||||
"components.MovieDetails.play": "Ruleaza pe {mediaServerName}",
|
||||
"components.MovieDetails.play4k": "Ruleaza 4k pe {mediaServerName}",
|
||||
"components.RequestButton.declinerequest": "Refuza cerere",
|
||||
"components.RequestButton.declinerequest4k": "Refuza cerere 4k",
|
||||
"components.Layout.UserWarnings.emailInvalid": "Adresa de email este invalida.",
|
||||
"components.Login.description": "Deoarece este prima ta authentificare in {applicationName}, este necesara sa introduci o adresa de email valida.",
|
||||
"components.Login.initialsigningin": "Se conecteaza…",
|
||||
"components.Login.saving": "Se adauga…",
|
||||
"components.RequestButton.approverequest": "Aproba cerere",
|
||||
"components.RequestButton.approverequest4k": "Aproba cerere 4k",
|
||||
"components.Login.host": "{mediaServerName} URL",
|
||||
"components.Login.initialsignin": "Conecteaza-te",
|
||||
"components.ManageSlideOver.removearr4k": "Elimina din 4K {arr}",
|
||||
"components.ManageSlideOver.manageModalRemoveMediaWarning": "* Acesta va elimina ireversibil {mediaType} din {arr}, incluzand toate fisierele asociate.",
|
||||
"components.Login.validationEmailRequired": "Trebuie sa introduci o adresa email",
|
||||
"components.ManageSlideOver.removearr": "Elimina din {arr}"
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
"components.RequestModal.cancel": "Отменить запрос",
|
||||
"components.RequestModal.extras": "Дополнительно",
|
||||
"components.RequestModal.numberofepisodes": "# эпизодов",
|
||||
"components.RequestModal.pendingrequest": "",
|
||||
"components.RequestModal.pendingrequest": "Ожидающий запрос",
|
||||
"components.RequestModal.requestCancel": "Запрос на <strong>{title}</strong> отменён.",
|
||||
"components.RequestModal.requestSuccess": "<strong>{title}</strong> успешно запрошен!",
|
||||
"components.RequestModal.requestadmin": "Этот запрос будет одобрен автоматически.",
|
||||
@@ -170,7 +170,7 @@
|
||||
"pages.oops": "Упс",
|
||||
"pages.returnHome": "Вернуться домой",
|
||||
"components.CollectionDetails.overview": "Обзор",
|
||||
"components.CollectionDetails.numberofmovies": "{count} {count, plural, one {фильм} few {фильма} other {фильмов}}",
|
||||
"components.CollectionDetails.numberofmovies": "{count} фильмов",
|
||||
"components.CollectionDetails.requestcollection": "Запросить Коллекцию",
|
||||
"components.Login.email": "Адрес электронной почты",
|
||||
"components.UserList.users": "Пользователи",
|
||||
@@ -427,9 +427,9 @@
|
||||
"components.Settings.RadarrModal.testFirstRootFolders": "Протестировать подключение для загрузки корневых каталогов",
|
||||
"components.Settings.RadarrModal.loadingrootfolders": "Загрузка корневых каталогов…",
|
||||
"components.RequestModal.AdvancedRequester.destinationserver": "Сервер-получатель",
|
||||
"components.RequestList.RequestItem.mediaerror": "Название, связанное с этим запросом, больше недоступно.",
|
||||
"components.RequestList.RequestItem.mediaerror": "{mediaType} не найдено",
|
||||
"components.RequestList.RequestItem.failedretry": "Что-то пошло не так при попытке повторить запрос.",
|
||||
"components.RequestCard.mediaerror": "Название, связанное с этим запросом, больше недоступно.",
|
||||
"components.RequestCard.mediaerror": "{mediaType} не найдено",
|
||||
"components.RequestCard.failedretry": "Что-то пошло не так при попытке повторить запрос.",
|
||||
"components.RequestButton.viewrequest4k": "Посмотреть 4К запрос",
|
||||
"components.RequestButton.requestmore4k": "Запросить больше в 4К",
|
||||
@@ -570,7 +570,7 @@
|
||||
"components.TvDetails.seasons": "{seasonCount, plural, one {# сезон} other {# сезонов}}",
|
||||
"components.RequestModal.QuotaDisplay.requiredquotaUser": "Этому пользователю необходимо иметь по крайней мере <strong>{seasons}</strong> {seasons, plural, one {запрос на сезоны} other {запроса(ов) на сезоны}} для того, чтобы отправить запрос на этот сериал.",
|
||||
"components.RequestModal.QuotaDisplay.requiredquota": "Вам необходимо иметь по крайней мере <strong>{seasons}</strong> {seasons, plural, one {запрос на сезоны} other {запроса(ов) на сезоны}} для того, чтобы отправить запрос на этот сериал.",
|
||||
"components.RequestModal.pending4krequest": "",
|
||||
"components.RequestModal.pending4krequest": "Ожидающий 4K запрос",
|
||||
"components.RequestModal.autoapproval": "Автоматическое одобрение",
|
||||
"i18n.usersettings": "Настройки пользователя",
|
||||
"i18n.showingresults": "Показываются результаты с <strong>{from}</strong> по <strong>{to}</strong> из <strong>{total}</strong>",
|
||||
@@ -790,7 +790,7 @@
|
||||
"components.UserList.importfromplexerror": "Что-то пошло не так при импорте пользователей из Plex.",
|
||||
"components.UserList.importfrommediaserver": "Импортировать пользователей из {mediaServerName}",
|
||||
"components.UserList.importfromplex": "Импортировать пользователей из Plex",
|
||||
"components.UserList.importedfromplex": "{userCount, plural, one {# новый пользователь} other {# новых пользователя(ей)}} успешно импортированы из Plex!",
|
||||
"components.UserList.importedfromplex": "<strong>{userCount}</strong> {userCount, plural, one {# новый пользователь} other {# новых пользователя(ей)}} успешно импортированы из Plex!",
|
||||
"components.UserList.edituser": "Изменить разрешения пользователя",
|
||||
"components.UserList.displayName": "Отображаемое имя",
|
||||
"components.UserList.deleteconfirm": "Вы уверены, что хотите удалить этого пользователя? Все данные о его запросах будут удалены без возможности восстановления.",
|
||||
@@ -1018,7 +1018,7 @@
|
||||
"components.Discover.CreateSlider.addcustomslider": "Создать слайдер",
|
||||
"components.Discover.CreateSlider.nooptions": "Нет результатов.",
|
||||
"components.Discover.CreateSlider.providetmdbgenreid": "Введите TMDB ID жанра",
|
||||
"components.Discover.CreateSlider.needresults": "Должен быть хотя бы 1 результат.",
|
||||
"components.Discover.CreateSlider.needresults": "Должен быть хотя-бы 1 результат.",
|
||||
"components.Discover.CreateSlider.providetmdbkeywordid": "Введите TMDB ID ключевого слова",
|
||||
"components.Discover.CreateSlider.providetmdbnetwork": "Введите TMDB ID сети",
|
||||
"components.Discover.CreateSlider.providetmdbsearch": "Введите поисковой запрос",
|
||||
@@ -1027,7 +1027,7 @@
|
||||
"components.Discover.CreateSlider.searchKeywords": "Поиск ключевых слов…",
|
||||
"components.Discover.CreateSlider.searchStudios": "Поиск студий…",
|
||||
"components.Discover.CreateSlider.slidernameplaceholder": "Название слайдера",
|
||||
"components.Discover.CreateSlider.starttyping": "Начните писать для поиска.",
|
||||
"components.Discover.CreateSlider.starttyping": "Начините писать для поиска.",
|
||||
"components.Discover.CreateSlider.validationDatarequired": "Вы должны ввести дату.",
|
||||
"components.Discover.CreateSlider.validationTitlerequired": "Вы должны ввести заголовок.",
|
||||
"components.Discover.DiscoverMovieKeyword.keywordMovies": "Фильмы по ключевому слову \"{keywordTitle}\"",
|
||||
@@ -1059,7 +1059,7 @@
|
||||
"components.Discover.DiscoverSliderEdit.deletesuccess": "Слайдер успешно удален.",
|
||||
"components.Discover.DiscoverSliderEdit.enable": "Изменить видимость",
|
||||
"components.Discover.DiscoverSliderEdit.remove": "Удалить",
|
||||
"components.Discover.DiscoverTv.activefilters": "{count, plural, one {# Активен фильтр} other {# Активные фильтры }}",
|
||||
"components.Discover.DiscoverTv.activefilters": "{count, plural, one {# Активный фильтр} other {# Активные фильтры}}",
|
||||
"components.Discover.DiscoverTv.discovertv": "Сериалы",
|
||||
"components.Discover.DiscoverTv.sortPopularityAsc": "Популярность по возрастанию",
|
||||
"components.Discover.DiscoverTv.sortPopularityDesc": "Популярность по убыванию",
|
||||
@@ -1117,7 +1117,7 @@
|
||||
"components.MovieDetails.digitalrelease": "Цифровой релиз",
|
||||
"components.MovieDetails.physicalrelease": "Физический релиз",
|
||||
"components.Settings.SettingsMain.toastSettingsFailure": "Что-то пошло не так при сохранении настроек.",
|
||||
"components.Settings.SettingsMain.trustProxyTip": "Разрешить Overserr правильно регистрировать IP-адреса клиентов за прокси-сервером",
|
||||
"components.Settings.SettingsMain.trustProxyTip": "Разрешить Jellyseerr правильно регистрировать IP-адреса клиентов за прокси-сервером",
|
||||
"components.Settings.experimentalTooltip": "Включение этого параметра может привести к неожиданному поведению приложения",
|
||||
"components.Settings.advancedTooltip": "Неправильная настройка этого параметра может привести к нарушению функциональности",
|
||||
"components.Settings.externalUrl": "Внешний URL-адрес",
|
||||
@@ -1131,7 +1131,7 @@
|
||||
"components.Settings.validationApiKey": "Вы должны предоставить ключ API",
|
||||
"components.TitleCard.mediaerror": "{mediaType} не найдено",
|
||||
"components.TitleCard.tmdbid": "TMDB ID",
|
||||
"components.Settings.restartrequiredTooltip": "Чтобы изменения этого параметра вступили в силу, необходимо перезапустить Overserr",
|
||||
"components.Settings.restartrequiredTooltip": "Чтобы изменения этого параметра вступили в силу, необходимо перезапустить Jellyseerr",
|
||||
"components.ManageSlideOver.alltime": "Все время",
|
||||
"components.ManageSlideOver.plays": "<strong>{playCount, number}</strong> {playCount, plural, one {просмотр} other {просмотров}}",
|
||||
"components.Settings.Notifications.NotificationsGotify.agentenabled": "Включить агент",
|
||||
@@ -1214,13 +1214,13 @@
|
||||
"components.Settings.Notifications.NotificationsGotify.toastGotifyTestSending": "Отправка тестового уведомления Gotify…",
|
||||
"components.Settings.SettingsMain.cacheImages": "Включить кэширование изображений",
|
||||
"components.Settings.SettingsMain.generalsettings": "Общие настройки",
|
||||
"components.Settings.SettingsMain.generalsettingsDescription": "Настройте глобальные параметры и параметры по умолчанию для Overserr.",
|
||||
"components.Settings.SettingsMain.generalsettingsDescription": "Настройте глобальные параметры и параметры по умолчанию для Jellyseerr.",
|
||||
"components.Settings.SettingsMain.hideAvailable": "Скрыть доступные медиа",
|
||||
"components.Settings.SettingsMain.regionTip": "Фильтровать контент по региональной доступности",
|
||||
"components.Settings.SettingsMain.toastApiKeyFailure": "Что-то пошло не так при создании нового ключа API.",
|
||||
"components.Settings.SettingsMain.locale": "Язык приложения",
|
||||
"components.Settings.SettingsMain.originallanguage": "Регион поиска",
|
||||
"components.Settings.tautulliSettingsDescription": "При желании настройте параметры для вашего сервера Tautulli. Overserr извлекает данные истории просмотров Plex из Tautulli.",
|
||||
"components.Settings.tautulliSettingsDescription": "При желании настройте параметры для вашего сервера Tautulli. Jellyseerr извлекает данные истории просмотров Plex из Tautulli.",
|
||||
"components.Settings.toastTautulliSettingsFailure": "Что-то пошло не так при сохранении настроек Tautulli.",
|
||||
"components.Settings.toastTautulliSettingsSuccess": "Настройки Tautulli успешно сохранены!",
|
||||
"components.Settings.validationUrlBaseTrailingSlash": "База URL не должна заканчиваться косой чертой",
|
||||
@@ -1241,7 +1241,7 @@
|
||||
"components.Settings.Notifications.NotificationsGotify.validationTypes": "Вы должны выбрать как минимум один тип уведомления",
|
||||
"components.Settings.Notifications.NotificationsGotify.validationUrlRequired": "Вы должны указать действующий URL",
|
||||
"components.Settings.Notifications.NotificationsGotify.validationUrlTrailingSlash": "URL не должен заканчиваться слешем",
|
||||
"components.Settings.SettingsJobsCache.imagecacheDescription": "Если включено, Overserr будет проксировать и кэшировать изображения из предварительно настроенных внешних источников. Кэшированные изображения сохраняются в папку конфигурации. Вы можете найти файлы в <code>{appDataPath}/cache/images</code>.",
|
||||
"components.Settings.SettingsJobsCache.imagecacheDescription": "Если включено, Jellyseerr будет проксировать и кэшировать изображения из предварительно настроенных внешних источников. Кэшированные изображения сохраняются в папку конфигурации. Вы можете найти файлы в <code>{appDataPath}/cache/images</code>.",
|
||||
"components.Settings.tautulliSettings": "Настройки Tautulli",
|
||||
"components.StatusBadge.seasonepisodenumber": "S{seasonNumber}E{episodeNumber}",
|
||||
"components.Discover.customizediscover": "Настроить Обнаружение",
|
||||
@@ -1257,21 +1257,92 @@
|
||||
"components.Selector.showmore": "Показать больше",
|
||||
"components.Settings.SettingsJobsCache.imagecachesize": "Размер кэша",
|
||||
"components.Settings.validationUrlBaseLeadingSlash": "Базовый URL должен начинаться с косой черты",
|
||||
"components.Discover.FilterSlideover.tmdbuservotecount": "Количество голосов пользователей TMDB",
|
||||
"components.Discover.FilterSlideover.voteCount": "Количество голосов между {minValue} и {maxValue}",
|
||||
"components.Discover.tmdbmoviestreamingservices": "Стриминговые сервисы фильмов TMDB",
|
||||
"components.Discover.tmdbtvstreamingservices": "Стриминговые сервисы сериалов TMDB",
|
||||
"components.Settings.RadarrModal.tagRequestsInfo": "Автоматически добавлять дополнительный тег с ID и именем запросившего пользователя",
|
||||
"components.Settings.RadarrModal.tagRequests": "Теги запросов",
|
||||
"components.Layout.UserWarnings.emailRequired": "Требуется указать email адрес.",
|
||||
"components.Layout.UserWarnings.passwordRequired": "Требуется указать пароль.",
|
||||
"components.Login.emailtooltip": "Адрес не обязательно должен быть связан с вашим {mediaServerName} сервером.",
|
||||
"components.Login.initialsignin": "Подключиться",
|
||||
"components.Login.initialsigningin": "Подключение…",
|
||||
"components.Login.save": "Добавить",
|
||||
"components.Login.saving": "Добавление…",
|
||||
"components.Login.signinwithjellyfin": "Используйте свой {mediaServerName} аккаунт",
|
||||
"components.Login.host": "{mediaServerName} URL",
|
||||
"components.Login.username": "Имя пользователя",
|
||||
"components.Login.validationEmailFormat": "Неверный email",
|
||||
"components.Login.validationemailformat": "Необходим корректный email",
|
||||
"components.Login.validationhostformat": "Необходим корректный URL",
|
||||
"components.Login.validationhostrequired": "Необходим {mediaServerName} URL",
|
||||
"components.Login.validationusernamerequired": "Необходимо имя пользователя",
|
||||
"components.ManageSlideOver.removearr": "Удалить из {arr}",
|
||||
"components.ManageSlideOver.removearr4k": "Удалить из 4К {arr}",
|
||||
"components.MovieDetails.imdbuserscore": "Оценка пользователей IMDB",
|
||||
"components.Settings.SettingsJobsCache.availability-sync": "Синхронизация доступности медиа",
|
||||
"components.Settings.SonarrModal.tagRequests": "Теги запросов",
|
||||
"components.Settings.SonarrModal.tagRequestsInfo": "Автоматически добавлять тег с ID и именем запросившего пользователя",
|
||||
"i18n.collection": "Коллекция",
|
||||
"components.Settings.Notifications.NotificationsPushover.sound": "Звук уведомления",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.deviceDefault": "Устройство по умолчанию",
|
||||
"components.Settings.SonarrModal.animeSeriesType": "Тип аниме-сериала",
|
||||
"components.MovieDetails.openradarr": "Открыть фильм в Radarr",
|
||||
"components.MovieDetails.play": "Запустить на {mediaServerName}",
|
||||
"components.MovieDetails.play4k": "Запустить 4К на {mediaServerName}",
|
||||
"components.Settings.RadarrModal.tagRequests": "Тег запросов",
|
||||
"components.Layout.UserWarnings.emailInvalid": "Неверный email адрес.",
|
||||
"components.Settings.SonarrModal.seriesType": "Тип сериала",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.sound": "Звук уведомления",
|
||||
"components.Settings.Notifications.NotificationsPushover.deviceDefault": "Устройство по умолчанию"
|
||||
"components.Discover.FilterSlideover.voteCount": "Количество голосов от {minValue} до {maxValue}",
|
||||
"components.Login.validationEmailRequired": "Вы должны указать адрес электронной почты",
|
||||
"components.Settings.Notifications.userEmailRequired": "Требуется email пользователя",
|
||||
"components.Settings.SettingsJobsCache.jellyfin-recently-added-scan": "Сканировать недавно добавленное в Jellyfin",
|
||||
"components.Discover.tmdbmoviestreamingservices": "Сервисы потоковой передачи фильмов TMDB",
|
||||
"components.Discover.tmdbtvstreamingservices": "Сервисы потоковой передачи сериалов TMDB",
|
||||
"components.Login.description": "Поскольку вы впервые входите в систему {ApplicationName}, вам необходимо добавить адрес электронной почты.",
|
||||
"components.Settings.Notifications.NotificationsPushover.sound": "Звук уведомлений",
|
||||
"components.Settings.RadarrModal.tagRequestsInfo": "Автодобавление тега с именем и ID пользователя, отправившего запрос",
|
||||
"components.Settings.SonarrModal.animeSeriesType": "Тип аниме",
|
||||
"components.Discover.FilterSlideover.tmdbuservotecount": "Количество голосов от пользователей TMDB",
|
||||
"components.Login.credentialerror": "Введено неверное имя пользователя или пароль.",
|
||||
"components.Login.title": "Добавить email",
|
||||
"components.ManageSlideOver.manageModalRemoveMediaWarning": "* Это приведет к необратимому удалению {MediaType} из {arr}, включая все файлы.",
|
||||
"components.Settings.SettingsAbout.supportjellyseerr": "Поддержать Jellyseerr",
|
||||
"components.Settings.SonarrModal.tagRequests": "Тег запросов",
|
||||
"components.MovieDetails.downloadstatus": "Статус загрузки",
|
||||
"components.MovieDetails.openradarr4k": "Открыть фильм в 4К Radarr",
|
||||
"components.Settings.Notifications.NotificationsPushover.deviceDefault": "Устройство по умолчанию",
|
||||
"components.Settings.SettingsJobsCache.jellyfin-full-scan": "Сканировать всю библиотеку Jellyfin",
|
||||
"components.Settings.SettingsJobsCache.availability-sync": "Синхронизировать доступность медиа",
|
||||
"components.Settings.jellyfinSettingsFailure": "Что-то пошло не так во время сохранения настроек {mediaServerName}.",
|
||||
"components.Settings.jellyfinSettingsSuccess": "Настройки {mediaServerName} успешно сохранены!",
|
||||
"components.Settings.jellyfinlibraries": "Библиотеки {mediaServerName}",
|
||||
"components.Settings.jellyfinlibrariesDescription": "Библиотеки {mediaServerName} проверяются на наличие заголовков. Нажмите кнопку ниже, если в списке не хватает библиотек.",
|
||||
"components.Settings.jellyfinsettings": "Настройки {mediaServerName}",
|
||||
"components.Settings.internalUrl": "Внутренний URL-адрес",
|
||||
"components.Settings.SonarrModal.tagRequestsInfo": "Автодобавление тега с именем и ID пользователя, отправившего запрос",
|
||||
"components.Settings.jellyfinSettings": "Настройки {mediaServerName}",
|
||||
"components.Settings.jellyfinSettingsDescription": "Необязательно настраивать внутреннюю и внешнюю конечные точки для вашего сервера {mediaServerName}. В большинстве случаев внешний URL-адрес отличается от внутреннего. Пользовательский URL-адрес для сброса пароля также может быть задан для входа в систему {mediaServerName}, на случай, если вы хотите перенаправить на другую страницу для сброса пароля.",
|
||||
"components.Settings.jellyfinsettingsDescription": "Настройте свой {mediaServerName} сервер. {mediaServerName} отсканирует ваши библиотеки, чтобы увидеть, какие библиотеки доступны.",
|
||||
"components.Settings.manualscanJellyfin": "Сканировать библиотеки вручную",
|
||||
"components.Settings.menuJellyfinSettings": "{mediaServerName}",
|
||||
"components.Settings.syncJellyfin": "Синхронизировать библиотеки",
|
||||
"components.Settings.syncing": "Синхронизация",
|
||||
"components.Settings.timeout": "Время ожидания",
|
||||
"components.Setup.signin": "Войти",
|
||||
"components.Setup.signinWithPlex": "Используйте свой Plex аккаунт",
|
||||
"components.TitleCard.watchlistDeleted": "<strong>{title}</strong> успешно удален из списка наблюдения!",
|
||||
"components.TitleCard.watchlistError": "Что-то пошло не так, попробуйте еще раз.",
|
||||
"components.TvDetails.play": "Запустить в {mediaServerName}",
|
||||
"components.TvDetails.play4k": "Запустить 4К в {mediaServerName}",
|
||||
"components.UserList.importedfromJellyfin": "<strong>{userCount}</strong> {userCount, plural, one {# новый пользователь} other {# новых пользователя(ей)}} успешно импортированы из {mediaServerName}!",
|
||||
"components.UserList.importfromJellyfin": "Добавить пользователей из {mediaServerName}",
|
||||
"components.UserList.noJellyfinuserstoimport": "Нет пользователей {mediaServerName} для импорта.",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.mediaServerUser": "Пользователь {mediaServerName}",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.saving": "Сохранение…",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.sound": "Звук уведомлений",
|
||||
"i18n.collection": "Коллекция",
|
||||
"components.Setup.configuremediaserver": "Настройте медиасервер",
|
||||
"components.UserList.importfromJellyfinerror": "Что-то пошло не так при импорте пользователей из {mediaServerName}.",
|
||||
"components.UserList.newJellyfinsigninenabled": "Параметр <strong>Включить новый вход в {mediaServerName}</strong> в настоящее время включен. Пользователей {mediaServerName} с доступом к библиотеке не нужно импортировать для входа.",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.email": "Электронная почта",
|
||||
"components.UserProfile.localWatchlist": "Список наблюдения {username}",
|
||||
"components.Settings.manualscanDescriptionJellyfin": "Обычно это выполняется только раз в 24 часа. Jellyseerr будет более настойчиво проверять недавно добавленный сервер {mediaServerName}. Если вы впервые настраиваете Jellyseerr, то рекомендуем однократное полное сканирование библиотеки!",
|
||||
"components.TitleCard.watchlistCancel": "наблюдение за <strong>{title}</strong> отменено.",
|
||||
"components.Settings.saving": "Сохранение…",
|
||||
"components.TitleCard.addToWatchList": "Добавить в список наблюдения",
|
||||
"components.TitleCard.watchlistSuccess": "<strong>{title}</strong> успешно добавлен в список наблюдения!",
|
||||
"components.Settings.save": "Сохранить изменения",
|
||||
"components.Setup.signinWithJellyfin": "Используйте свой {mediaServerName} аккаунт",
|
||||
"components.UserList.mediaServerUser": "Пользователь {mediaServerName}",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.save": "Сохранить изменения",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.deviceDefault": "Устройство по умолчанию"
|
||||
}
|
||||
|
||||
59
src/i18n/locale/sl.json
Normal file
59
src/i18n/locale/sl.json
Normal file
@@ -0,0 +1,59 @@
|
||||
{
|
||||
"components.Discover.CreateSlider.editsuccess": "Urejen drsnik in shranjene nastavitve prilagajanja odkrivanja.",
|
||||
"components.CollectionDetails.numberofmovies": "{count} film/ov",
|
||||
"components.Discover.CreateSlider.slidernameplaceholder": "Ime drsnika",
|
||||
"components.Discover.DiscoverTv.sortFirstAirDateAsc": "Premiera ↓",
|
||||
"components.AppDataWarning.dockerVolumeMissingDescription": "Pripenjanje nosilca <code>{appDataPath}</code> ni bilo pravilno konfigurirano. Vsi podatki bodo izbrisani, ko se vsebnik zaustavi ali znova zažene.",
|
||||
"components.Discover.DiscoverMovies.sortPopularityDesc": "Priljubljenost ↑",
|
||||
"components.AirDateBadge.airsrelative": "Predvajanje {relativeTime}",
|
||||
"components.CollectionDetails.overview": "Pregled",
|
||||
"components.Discover.DiscoverMovies.activefilters": "{count, plural, one {# Active Filter} drugo {# Active Filters}}",
|
||||
"components.Discover.DiscoverMovies.sortTmdbRatingAsc": "Ocena TMDB ↓",
|
||||
"components.AirDateBadge.airedrelative": "Predvajano {relativeTime}",
|
||||
"components.Discover.CreateSlider.searchStudios": "Iskanje studiev …",
|
||||
"components.Discover.DiscoverMovies.sortReleaseDateDesc": "Datum izdaje ↑",
|
||||
"components.Discover.CreateSlider.providetmdbnetwork": "Navedite ID omrežja TMDB",
|
||||
"components.Discover.CreateSlider.addfail": "Novega drsnika ni bilo mogoče ustvariti.",
|
||||
"components.CollectionDetails.requestcollection": "Zahtevaj zbirko",
|
||||
"components.Discover.DiscoverMovieGenre.genreMovies": "Filmi: {genre}",
|
||||
"components.Discover.DiscoverMovieLanguage.languageMovies": "Filmi: {language}",
|
||||
"components.Discover.DiscoverTv.activefilters": "{count, plural, one {# Active Filter} other {# Active Filters}}",
|
||||
"components.Discover.DiscoverMovies.sortPopularityAsc": "Priljubljenost ↓",
|
||||
"components.Discover.CreateSlider.needresults": "Imeti morate vsaj 1 rezultat.",
|
||||
"components.Discover.CreateSlider.addcustomslider": "Ustvari drsnik po meri",
|
||||
"components.Discover.DiscoverTv.sortPopularityAsc": "Priljubljenost ↓",
|
||||
"components.Discover.CreateSlider.editSlider": "Uredi drsnik",
|
||||
"components.Discover.DiscoverTv.sortTitleAsc": "Naslov (a-ž) ↓",
|
||||
"components.Discover.CreateSlider.validationDatarequired": "Navesti morate vrednost podatkov.",
|
||||
"components.Discover.DiscoverTv.sortFirstAirDateDesc": "Premiera ↑",
|
||||
"components.Discover.DiscoverTv.discovertv": "Serije",
|
||||
"components.Discover.DiscoverSliderEdit.deletefail": "Drsnika ni bilo mogoče izbrisati.",
|
||||
"components.Discover.CreateSlider.providetmdbstudio": "Navedite ID studia v TMDB",
|
||||
"components.Discover.DiscoverMovies.sortTitleDesc": "Naslov (a-ž) ↑",
|
||||
"components.Discover.DiscoverStudio.studioMovies": "{studio} filmi",
|
||||
"components.Discover.DiscoverTv.sortPopularityDesc": "Priljubljenost ↑",
|
||||
"components.Discover.CreateSlider.searchGenres": "Išči žanre …",
|
||||
"components.Discover.CreateSlider.editfail": "Drsnika ni bilo mogoče urediti.",
|
||||
"components.Discover.CreateSlider.starttyping": "Tipkajte za iskanje.",
|
||||
"components.Discover.DiscoverSliderEdit.enable": "Preklopi vidnost",
|
||||
"components.Discover.CreateSlider.addSlider": "Dodaj drsnik",
|
||||
"components.CollectionDetails.requestcollection4k": "Zahtevaj zbirko 4K",
|
||||
"components.Discover.CreateSlider.providetmdbsearch": "Vnesite iskalno poizvedbo",
|
||||
"components.Discover.DiscoverNetwork.networkSeries": "{network} serije",
|
||||
"components.Discover.CreateSlider.providetmdbkeywordid": "Navedite ID ključne besede TMDB",
|
||||
"components.Discover.DiscoverMovieKeyword.keywordMovies": "Filmi: {keywordTitle}",
|
||||
"components.Discover.CreateSlider.validationTitlerequired": "Navesti morate naslov.",
|
||||
"components.Discover.DiscoverMovies.sortReleaseDateAsc": "Datum izdaje ↓",
|
||||
"components.Discover.CreateSlider.nooptions": "Ni zadetkov.",
|
||||
"components.Discover.DiscoverMovies.sortTmdbRatingDesc": "Ocena TMDB ↑",
|
||||
"components.Discover.CreateSlider.searchKeywords": "Iskanje po ključnih besedah …",
|
||||
"components.Discover.CreateSlider.addsuccess": "Ustvarjen nov drsnik in shranjene nastavitve prilagajanja odkrivanja.",
|
||||
"components.Discover.DiscoverSliderEdit.deletesuccess": "Drsnik je bil uspešno izbrisan.",
|
||||
"components.Discover.DiscoverMovies.discovermovies": "Filmi",
|
||||
"components.Discover.DiscoverMovies.sortTitleAsc": "Naslov (a-ž) ↓",
|
||||
"components.Discover.CreateSlider.providetmdbgenreid": "Navedite ID žanra TMDB",
|
||||
"components.Discover.DiscoverTv.sortTitleDesc": "Naslov (a-ž) ↑",
|
||||
"components.Discover.DiscoverSliderEdit.remove": "Odstrani",
|
||||
"components.Discover.DiscoverTv.sortTmdbRatingAsc": "Ocena TMDB ↓",
|
||||
"components.Discover.DiscoverTvGenre.genreSeries": "{genre} Series"
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
1308
src/i18n/locale/tr.json
Normal file
1308
src/i18n/locale/tr.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -10,10 +10,10 @@
|
||||
"components.Discover.DiscoverMovieLanguage.languageMovies": "Фільми мовою \"{language}\"",
|
||||
"components.Discover.DiscoverNetwork.networkSeries": "Серіали {network}",
|
||||
"components.Discover.DiscoverStudio.studioMovies": "Фільми {studio}",
|
||||
"components.Discover.DiscoverTvGenre.genreSeries": "Серіали в жанрі \"{genre}\"",
|
||||
"components.Discover.DiscoverTvLanguage.languageSeries": "Серіали мовою \"{language}\"",
|
||||
"components.Discover.DiscoverWatchlist.discoverwatchlist": "Your Watchlist",
|
||||
"components.Discover.DiscoverWatchlist.watchlist": "Список спостереження Plex",
|
||||
"components.Discover.DiscoverTvGenre.genreSeries": "Серіали в жанрі {genre}",
|
||||
"components.Discover.DiscoverTvLanguage.languageSeries": "Серіали мовою {language}",
|
||||
"components.Discover.DiscoverWatchlist.discoverwatchlist": "Ваш список перегляду Plex",
|
||||
"components.Discover.DiscoverWatchlist.watchlist": "Список перегляду Plex",
|
||||
"components.Discover.MovieGenreList.moviegenres": "Фільми за жанрами",
|
||||
"components.Discover.MovieGenreSlider.moviegenres": "Фільми за жанрами",
|
||||
"components.Discover.NetworkSlider.networks": "Телеканали",
|
||||
@@ -25,7 +25,7 @@
|
||||
"components.Discover.discovertv": "Популярні серіали",
|
||||
"components.Discover.emptywatchlist": "Тут з’являться медіафайли, додані до вашого <PlexWatchlistSupportLink>списку спостереження Plex</PlexWatchlistSupportLink>.",
|
||||
"components.Discover.noRequests": "Жодних запитів.",
|
||||
"components.Discover.plexwatchlist": "Ваш список спостереження Plex",
|
||||
"components.Discover.plexwatchlist": "Ваш список перегляду Plex",
|
||||
"components.Discover.popularmovies": "Популярні фільми",
|
||||
"components.Discover.populartv": "Популярні серіали",
|
||||
"components.Discover.recentlyAdded": "Нещодавно додані",
|
||||
@@ -118,7 +118,7 @@
|
||||
"components.Layout.Sidebar.settings": "Налаштування",
|
||||
"components.Layout.Sidebar.users": "Користувачі",
|
||||
"components.Layout.UserDropdown.MiniQuotaDisplay.movierequests": "Запити на фільми",
|
||||
"components.Layout.UserDropdown.MiniQuotaDisplay.seriesrequests": "Запити на серіали",
|
||||
"components.Layout.UserDropdown.MiniQuotaDisplay.seriesrequests": "Запити на сезони",
|
||||
"components.Layout.UserDropdown.myprofile": "Профіль",
|
||||
"components.Layout.UserDropdown.requests": "Запити",
|
||||
"components.Layout.UserDropdown.settings": "Налаштування",
|
||||
@@ -142,24 +142,24 @@
|
||||
"components.ManageSlideOver.downloadstatus": "Завантаження",
|
||||
"components.ManageSlideOver.manageModalAdvanced": "Просунутий",
|
||||
"components.ManageSlideOver.manageModalClearMedia": "Очистити дані",
|
||||
"components.ManageSlideOver.manageModalClearMediaWarning": "* Це призведе до незворотного видалення всіх даних для цього {mediaType}а, включаючи будь-які запити. Якщо цей елемент існує у вашій бібліотеці {mediaServerName}, мультимедійна інформація про нього буде відтворена під час наступного сканування. ",
|
||||
"components.ManageSlideOver.manageModalClearMediaWarning": "* Це призведе до незворотного видалення всіх даних для цього {mediaType}а, включаючи будь-які запити. Якщо цей елемент існує у вашій бібліотеці {mediaServerName}, мультимедійна інформація про нього буде відтворена під час наступного сканування.",
|
||||
"components.ManageSlideOver.manageModalIssues": "Відкриті проблеми",
|
||||
"components.ManageSlideOver.manageModalMedia": "Media",
|
||||
"components.ManageSlideOver.manageModalMedia4k": "4K Media",
|
||||
"components.ManageSlideOver.manageModalNoRequests": "Запитів немає.",
|
||||
"components.ManageSlideOver.manageModalRequests": "Запити",
|
||||
"components.ManageSlideOver.manageModalTitle": "Управління {mediaType}",
|
||||
"components.ManageSlideOver.manageModalTitle": "Управління {mediaType}ом",
|
||||
"components.ManageSlideOver.mark4kavailable": "Позначити як доступний у 4К",
|
||||
"components.ManageSlideOver.markallseasons4kavailable": "Позначити всі сезони як доступні в 4K",
|
||||
"components.ManageSlideOver.markallseasonsavailable": "Mark All Seasons as Available",
|
||||
"components.ManageSlideOver.markallseasonsavailable": "Позначити всі сезони як доступні",
|
||||
"components.ManageSlideOver.markavailable": "Позначити як доступний",
|
||||
"components.ManageSlideOver.movie": "фільм",
|
||||
"components.ManageSlideOver.openarr": "Відкрити в {arr}",
|
||||
"components.ManageSlideOver.openarr4k": "Відкрити в 4К {arr}",
|
||||
"components.ManageSlideOver.opentautulli": "Відкрити в Tautulli",
|
||||
"components.ManageSlideOver.pastdays": "Останні {days, number} днів",
|
||||
"components.ManageSlideOver.playedby": "Грає",
|
||||
"components.ManageSlideOver.plays": "<strong>{playCount, number}</strong> {playCount, plural, one {грає} other {грають}}",
|
||||
"components.ManageSlideOver.playedby": "Переглядає",
|
||||
"components.ManageSlideOver.plays": "<strong>{playCount, number}</strong> {playCount, plural, one {перегляд} other {переглядів}}",
|
||||
"components.ManageSlideOver.tvshow": "серіал",
|
||||
"components.MediaSlider.ShowMoreCard.seemore": "Подивитися більше",
|
||||
"components.MovieDetails.MovieCast.fullcast": "Повний акторський склад",
|
||||
@@ -210,7 +210,7 @@
|
||||
"components.NotificationTypeSelector.mediaapproved": "Схвалення медіа-запитів",
|
||||
"components.NotificationTypeSelector.mediaapprovedDescription": "Надсилати повідомлення, коли медіа-запити схвалюються вручну.",
|
||||
"components.NotificationTypeSelector.mediaautorequested": "Запит надіслано автоматично",
|
||||
"components.NotificationTypeSelector.mediaautorequestedDescription": "Отримуйте сповіщення, коли нові медіа-запити автоматично надсилаються для елементів у вашому списку спостереження Plex.",
|
||||
"components.NotificationTypeSelector.mediaautorequestedDescription": "Отримуйте сповіщення, коли нові медіа-запити автоматично надсилаються для елементів у вашому списку перегляду Plex.",
|
||||
"components.NotificationTypeSelector.mediaavailable": "Доступні нові медіафайли",
|
||||
"components.NotificationTypeSelector.mediaavailableDescription": "Надсилати повідомлення, коли запитані медіафайли стають доступними.",
|
||||
"components.NotificationTypeSelector.mediadeclined": "Відхилення медіа-запитів",
|
||||
@@ -245,13 +245,13 @@
|
||||
"components.PermissionEdit.autoapproveMovies": "Автоматичне схвалення фільмів",
|
||||
"components.PermissionEdit.autoapproveMoviesDescription": "Надати дозвіл на автоматичне схвалення всіх фільмів, відмінних від 4К.",
|
||||
"components.PermissionEdit.autoapproveSeries": "Автоматичне схвалення серіалів",
|
||||
"components.PermissionEdit.autoapproveSeriesDescription": "Надати дозвіл на автоматичне схвалення всіх серіалів, відмінних від 4К.",
|
||||
"components.PermissionEdit.autoapproveSeriesDescription": "Надати дозвіл на автоматичне схвалення всіх серіалів, відмінних від 4K.",
|
||||
"components.PermissionEdit.autorequest": "Автоматичний запит",
|
||||
"components.PermissionEdit.autorequestDescription": "Надайте дозвіл на автоматичне надсилання запитів на медіафайли, відмінні від 4K, через Plex Watchlist.",
|
||||
"components.PermissionEdit.autorequestDescription": "Надайте дозвіл на автоматичне надсилання запитів на медіафайли, відмінні від 4K, через список перегляду Plex.",
|
||||
"components.PermissionEdit.autorequestMovies": "Автоматичний запит фільмів",
|
||||
"components.PermissionEdit.autorequestMoviesDescription": "Надайте дозвіл на автоматичне надсилання запитів на фільми, відмінні від 4K, через Plex Watchlist.",
|
||||
"components.PermissionEdit.autorequestMoviesDescription": "Надайте дозвіл на автоматичне надсилання запитів на фільми, відмінні від 4K, через список перегляду Plex.",
|
||||
"components.PermissionEdit.autorequestSeries": "Автоматичний запит Серіалів",
|
||||
"components.PermissionEdit.autorequestSeriesDescription": "Надайте дозвіл на автоматичне надсилання запитів на серіали, відмінні від 4K, через Plex Watchlist.",
|
||||
"components.PermissionEdit.autorequestSeriesDescription": "Надайте дозвіл на автоматичне надсилання запитів на серіали, відмінні від 4K, через список перегляду Plex.",
|
||||
"components.PermissionEdit.createissues": "Повідомлення про проблеми",
|
||||
"components.PermissionEdit.createissuesDescription": "Надати дозвіл на повідомлення про проблеми з медіафайлами.",
|
||||
"components.PermissionEdit.manageissues": "Управління проблемами",
|
||||
@@ -266,7 +266,7 @@
|
||||
"components.PermissionEdit.request4kTv": "Запити серіалів у 4К",
|
||||
"components.PermissionEdit.request4kTvDescription": "Надати дозвіл на надсилання запитів серіалів у 4К.",
|
||||
"components.PermissionEdit.requestDescription": "Надати дозвіл на надсилання запитів усіх медіафайлів, відмінних від 4К.",
|
||||
"components.PermissionEdit.requestMovies": "Замовити фільми",
|
||||
"components.PermissionEdit.requestMovies": "Запити фільмів",
|
||||
"components.PermissionEdit.requestMoviesDescription": "Надати дозвіл на надсилання запитів усіх фільмів, відмінних від 4К.",
|
||||
"components.PermissionEdit.requestTv": "Запити серіалів",
|
||||
"components.PermissionEdit.requestTvDescription": "Надати дозвіл на надсилання запитів усіх серіалів, відмінних від 4К.",
|
||||
@@ -280,8 +280,8 @@
|
||||
"components.PermissionEdit.viewrecentDescription": "Надайте дозвіл на перегляд списку нещодавно доданих медіа.",
|
||||
"components.PermissionEdit.viewrequests": "Перегляд запитів",
|
||||
"components.PermissionEdit.viewrequestsDescription": "Надати дозвіл на перегляд медіа-запитів, надісланих іншими користувачами.",
|
||||
"components.PermissionEdit.viewwatchlists": "Перегляньте списки спостереження Plex",
|
||||
"components.PermissionEdit.viewwatchlistsDescription": "Надайте дозвіл на перегляд списків спостереження Plex інших користувачів.",
|
||||
"components.PermissionEdit.viewwatchlists": "Перегляд списків переглядів Plex",
|
||||
"components.PermissionEdit.viewwatchlistsDescription": "Надайте дозвіл на перегляд списків перегляду Plex інших користувачів.",
|
||||
"components.PersonDetails.alsoknownas": "Також відомий(а) як: {names}",
|
||||
"components.PersonDetails.appearsin": "Появи у фільмах та серіалах",
|
||||
"components.PersonDetails.ascharacter": "в ролі {character}",
|
||||
@@ -291,10 +291,10 @@
|
||||
"components.PlexLoginButton.signingin": "Виконується вхід...",
|
||||
"components.PlexLoginButton.signinwithplex": "Увійти",
|
||||
"components.QuotaSelector.days": "{count, plural, one {день} other {днів}}",
|
||||
"components.QuotaSelector.movieRequests": "{quotaLimit} <quotaUnits>{фільмів} за {quotaDays} {днів}</quotaUnits>",
|
||||
"components.QuotaSelector.movieRequests": "{quotaLimit} <quotaUnits>{movies} на {quotaDays} {days}</quotaUnits>",
|
||||
"components.QuotaSelector.movies": "{count, plural, one {фільм} other {фільми}}",
|
||||
"components.QuotaSelector.seasons": "{count, plural, one {сезон} other {сезони}}",
|
||||
"components.QuotaSelector.tvRequests": "{quotaLimit} <quotaUnits>{сезонів} за {quotaDays} {днів}</quotaUnits>",
|
||||
"components.QuotaSelector.tvRequests": "{quotaLimit} <quotaUnits>{seasons} на {quotaDays} {days}</quotaUnits>",
|
||||
"components.QuotaSelector.unlimited": "Необмежено",
|
||||
"components.RegionSelector.regionDefault": "Всі регіони",
|
||||
"components.RegionSelector.regionServerDefault": "За замовчуванням ({region})",
|
||||
@@ -329,7 +329,7 @@
|
||||
"components.RequestCard.deleterequest": "Видалити запит",
|
||||
"components.RequestCard.editrequest": "Редагувати запит",
|
||||
"components.RequestCard.failedretry": "Щось пішло не так при спробі повторити запит.",
|
||||
"components.RequestCard.mediaerror": "Назва, пов'язана з цим запитом, більше недоступна.",
|
||||
"components.RequestCard.mediaerror": "{mediaType} Не знайдено",
|
||||
"components.RequestCard.seasons": "{seasonCount, plural, one {Сезон} other {Сезони}}",
|
||||
"components.RequestCard.tmdbid": "TMDB ID",
|
||||
"components.RequestCard.tvdbid": "TheTVDB ID",
|
||||
@@ -338,7 +338,7 @@
|
||||
"components.RequestList.RequestItem.deleterequest": "Видалити запит",
|
||||
"components.RequestList.RequestItem.editrequest": "Редагувати запит",
|
||||
"components.RequestList.RequestItem.failedretry": "Щось пішло не так при спробі повторити запит.",
|
||||
"components.RequestList.RequestItem.mediaerror": "Назва, пов'язана з цим запитом, більше недоступна.",
|
||||
"components.RequestList.RequestItem.mediaerror": "{mediaType} Не знайдено",
|
||||
"components.RequestList.RequestItem.modified": "Змінено",
|
||||
"components.RequestList.RequestItem.modifieduserdate": "{date} користувачем {user}",
|
||||
"components.RequestList.RequestItem.requested": "Запрошений",
|
||||
@@ -366,17 +366,17 @@
|
||||
"components.RequestModal.QuotaDisplay.allowedRequests": "Вам дозволено запитувати <strong>{limit}</strong> {type} кожні <strong>{days}</strong> днів.",
|
||||
"components.RequestModal.QuotaDisplay.allowedRequestsUser": "Цьому користувачеві дозволено запитувати <strong>{limit}</strong> {type} кожні <strong>{days}</strong> днів.",
|
||||
"components.RequestModal.QuotaDisplay.movie": "фільм",
|
||||
"components.RequestModal.QuotaDisplay.movielimit": "{limit, plural, one {фільм} other {фільми}}",
|
||||
"components.RequestModal.QuotaDisplay.movielimit": "{limit, plural, one {фільм} other {фільмів}}",
|
||||
"components.RequestModal.QuotaDisplay.notenoughseasonrequests": "Залишилося недостатньо запитів на сезони",
|
||||
"components.RequestModal.QuotaDisplay.quotaLink": "Ви можете переглянути зведення ваших обмежень на кількість запитів на <ProfileLink>сторінці вашого профілю</ProfileLink>.",
|
||||
"components.RequestModal.QuotaDisplay.quotaLinkUser": "Ви можете переглянути зведення обмежень на кількість запитів цього користувача на <ProfileLink>сторінці його профілю</ProfileLink>.",
|
||||
"components.RequestModal.QuotaDisplay.requestsremaining": "{remaining, plural, =0 {запитів {type} не залишилося} other {залишилось <strong>#</strong> запиту(ів) {type}}}",
|
||||
"components.RequestModal.QuotaDisplay.requiredquota": "Вам необхідно мати принаймні <strong>{seasons}</strong> {seasons, plural, one {запит на сезони} other {запиту(ів) на сезони}} для того , щоб надіслати запит на цей серіал.",
|
||||
"components.RequestModal.QuotaDisplay.requestsremaining": "{remaining, plural, =0 {Запитів на {type} не залишилося} other {Залишилось <strong>#</strong> запити(ів) на {type}}}",
|
||||
"components.RequestModal.QuotaDisplay.requiredquota": "Вам необхідно мати принаймні <strong>{seasons}</strong> {seasons, plural, one {запит на сезони} other {запиту(ів) на сезони}} для того, щоб надіслати запит на цей серіал.",
|
||||
"components.RequestModal.QuotaDisplay.requiredquotaUser": "Цьому користувачеві необхідно мати принаймні <strong>{seasons}</strong> {seasons, plural, one {запит на сезони} other {запиту(ів) на сезони}} для того, щоб надіслати запит на цей серіал.",
|
||||
"components.RequestModal.QuotaDisplay.season": "сезон",
|
||||
"components.RequestModal.QuotaDisplay.seasonlimit": "{limit, plural, one {сезон} other {сезони}}",
|
||||
"components.RequestModal.SearchByNameModal.nomatches": "Нам не вдалося знайти відповідність для цієї серії.",
|
||||
"components.RequestModal.SearchByNameModal.notvdbiddescription": "Ми не змогли автоматично виконати ваш запит. Будь ласка, виберіть правильний збіг зі списку нижче.",
|
||||
"components.RequestModal.QuotaDisplay.seasonlimit": "{limit, plural, one {сезон} other {сезонів}}",
|
||||
"components.RequestModal.SearchByNameModal.nomatches": "Нам не вдалося знайти відповідність для цього серіалу.",
|
||||
"components.RequestModal.SearchByNameModal.notvdbiddescription": "Нам не вдалося автоматично знайти цей серіал. Будь ласка, виберіть правильний збіг зі списку нижче.",
|
||||
"components.RequestModal.alreadyrequested": "Вже запрошений",
|
||||
"components.RequestModal.approve": "Схвалити запит",
|
||||
"components.RequestModal.autoapproval": "Автоматичне схвалення",
|
||||
@@ -385,9 +385,9 @@
|
||||
"components.RequestModal.errorediting": "Щось пішло не так під час редагування запиту.",
|
||||
"components.RequestModal.extras": "Додатково",
|
||||
"components.RequestModal.numberofepisodes": "# епізодів",
|
||||
"components.RequestModal.pending4krequest": "",
|
||||
"components.RequestModal.pending4krequest": "Очікуючий запит в 4К",
|
||||
"components.RequestModal.pendingapproval": "Ваш запит чекає схвалення.",
|
||||
"components.RequestModal.pendingrequest": "",
|
||||
"components.RequestModal.pendingrequest": "Очікуючий запит",
|
||||
"components.RequestModal.requestApproved": "Запит на <strong>{title}</strong> схвалений!",
|
||||
"components.RequestModal.requestCancel": "Запит на <strong>{title}</strong> скасовано.",
|
||||
"components.RequestModal.requestSuccess": "<strong>{title}</strong> успішно запрошений!",
|
||||
@@ -404,7 +404,7 @@
|
||||
"components.RequestModal.requestmovietitle": "Запит на фільм",
|
||||
"components.RequestModal.requestseasons": "Запросити {seasonCount} {seasonCount, plural, one {сезон} other {сезону(ів)}}",
|
||||
"components.RequestModal.requestseasons4k": "Запит {seasonCount} {seasonCount, plural, one {сезону} other {сезонів}} у 4К",
|
||||
"components.RequestModal.requestseries4ktitle": "Надіслати запит на серіал у 4K",
|
||||
"components.RequestModal.requestseries4ktitle": "Запросити серіал у 4K",
|
||||
"components.RequestModal.requestseriestitle": "Запит на серіал",
|
||||
"components.RequestModal.season": "Сезон",
|
||||
"components.RequestModal.seasonnumber": "Сезон {number}",
|
||||
@@ -452,7 +452,7 @@
|
||||
"components.Settings.Notifications.NotificationsPushbullet.accessToken": "Токен доступу",
|
||||
"components.Settings.Notifications.NotificationsPushbullet.accessTokenTip": "Створіть токен у <PushbulletSettingsLink>налаштуваннях облікового запису</PushbulletSettingsLink>",
|
||||
"components.Settings.Notifications.NotificationsPushbullet.agentEnabled": "Активувати службу",
|
||||
"components.Settings.Notifications.NotificationsPushbullet.channelTag": "Channel Tag",
|
||||
"components.Settings.Notifications.NotificationsPushbullet.channelTag": "Тег каналу",
|
||||
"components.Settings.Notifications.NotificationsPushbullet.pushbulletSettingsFailed": "Не вдалося зберегти налаштування сповіщень Pushbullet.",
|
||||
"components.Settings.Notifications.NotificationsPushbullet.pushbulletSettingsSaved": "Налаштування сповіщень Pushbullet успішно збережено!",
|
||||
"components.Settings.Notifications.NotificationsPushbullet.toastPushbulletTestFailed": "Не вдалося надіслати тестове повідомлення до Pushbullet.",
|
||||
@@ -609,7 +609,7 @@
|
||||
"components.Settings.RadarrModal.validationRootFolderRequired": "Ви повинні вибрати кореневий каталог",
|
||||
"components.Settings.SettingsAbout.Releases.currentversion": "Поточна",
|
||||
"components.Settings.SettingsAbout.Releases.latestversion": "Остання",
|
||||
"components.Settings.SettingsAbout.Releases.releasedataMissing": "Дані про дозвіл в даний час недоступні.",
|
||||
"components.Settings.SettingsAbout.Releases.releasedataMissing": "Дані про реліз наразі недоступні.",
|
||||
"components.Settings.SettingsAbout.Releases.releases": "Релізи",
|
||||
"components.Settings.SettingsAbout.Releases.versionChangelog": "Зміни у версії {version}",
|
||||
"components.Settings.SettingsAbout.Releases.viewchangelog": "Переглянути список змін",
|
||||
@@ -626,7 +626,7 @@
|
||||
"components.Settings.SettingsAbout.preferredmethod": "Переважний спосіб",
|
||||
"components.Settings.SettingsAbout.runningDevelop": "Ви використовуєте гілку <code>develop</code> проекту Jellyseerr, яка рекомендується тільки для тих, хто робить внесок у розробку або допомагає в тестуванні.",
|
||||
"components.Settings.SettingsAbout.supportoverseerr": "Підтримати Jellyseerr",
|
||||
"components.Settings.SettingsAbout.timezone": "Годинний пояс",
|
||||
"components.Settings.SettingsAbout.timezone": "Часовий пояс",
|
||||
"components.Settings.SettingsAbout.totalmedia": "Усього мультимедіа",
|
||||
"components.Settings.SettingsAbout.totalrequests": "Усього запитів",
|
||||
"components.Settings.SettingsAbout.uptodate": "Актуальна",
|
||||
@@ -645,7 +645,7 @@
|
||||
"components.Settings.SettingsJobsCache.download-sync": "Синхронізувати завантаження",
|
||||
"components.Settings.SettingsJobsCache.download-sync-reset": "Скинути синхронізацію завантажень",
|
||||
"components.Settings.SettingsJobsCache.editJobSchedule": "Змінити завдання",
|
||||
"components.Settings.SettingsJobsCache.editJobScheduleCurrent": "Current Frequency",
|
||||
"components.Settings.SettingsJobsCache.editJobScheduleCurrent": "Поточна частота",
|
||||
"components.Settings.SettingsJobsCache.editJobSchedulePrompt": "Частота",
|
||||
"components.Settings.SettingsJobsCache.editJobScheduleSelectorHours": "Кожен {jobScheduleHours, plural, one {година} other {{jobScheduleHours} години(ів)}}",
|
||||
"components.Settings.SettingsJobsCache.editJobScheduleSelectorMinutes": "Кожну {jobScheduleMinutes, plural, one {хвилину} other {{jobScheduleMinutes} хвилин(и)}}",
|
||||
@@ -837,7 +837,7 @@
|
||||
"components.Settings.sonarrsettings": "Налаштування Sonarr",
|
||||
"components.Settings.ssl": "SSL",
|
||||
"components.Settings.startscan": "Почати сканування",
|
||||
"components.Settings.tautulliApiKey": "API Key",
|
||||
"components.Settings.tautulliApiKey": "Ключ API",
|
||||
"components.Settings.tautulliSettings": "Tautulli Налаштування",
|
||||
"components.Settings.tautulliSettingsDescription": "За бажанням налаштуйте параметри для вашого сервера Tautulli. Jellyseerr отримує дані історії переглядів для медіафайлів Plex від Tautulli.",
|
||||
"components.Settings.toastApiKeyFailure": "Щось пішло не так при створенні нового ключа API.",
|
||||
@@ -966,8 +966,8 @@
|
||||
"components.UserList.user": "Користувач",
|
||||
"components.UserList.usercreatedfailed": "Щось пішло не так при створенні користувача.",
|
||||
"components.UserList.usercreatedfailedexisting": "Вказана адреса електронної пошти вже використовується іншим користувачем.",
|
||||
"components.UserList.usercreatedsuccess": "Користувач успішно створено!",
|
||||
"components.UserList.userdeleted": "Користувач успішно видалено!",
|
||||
"components.UserList.usercreatedsuccess": "Користувача успішно створено!",
|
||||
"components.UserList.userdeleted": "Користувача успішно видалено!",
|
||||
"components.UserList.userdeleteerror": "Щось пішло не так при видаленні користувача.",
|
||||
"components.UserList.userfail": "Щось пішло не так при збереженні дозволів користувача.",
|
||||
"components.UserList.userlist": "Список користувачів",
|
||||
@@ -996,9 +996,9 @@
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.owner": "Власник",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexuser": "Користувач Plex",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncmovies": "Автоматичний запит фільмів",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncmoviestip": "Автоматично надсилайте запит на перегляд фільмів у своєму <PlexWatchlistSupportLink>списку спостереження Plex</PlexWatchlistSupportLink>",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncmoviestip": "Автоматично запитувати фільми з вашого <PlexWatchlistSupportLink>списку перегляду Plex</PlexWatchlistSupportLink>",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncseries": "Автоматичний запит Серіалів",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncseriestip": "Автоматично надсилайте запит на серіал у своєму <PlexWatchlistSupportLink>списку спостереження Plex</PlexWatchlistSupportLink>",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncseriestip": "Автоматично запитувати серіали з вашого <PlexWatchlistSupportLink>списку перегляду Plex</PlexWatchlistSupportLink>",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.region": "Регіон для пошуку фільмів та серіалів",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.regionTip": "Контент фільтрується за доступністю у вибраному регіоні",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.role": "Роль",
|
||||
@@ -1031,7 +1031,7 @@
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.sendSilently": "Надсилати без звуку",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.sendSilentlyDescription": "Надсилати повідомлення без звуку",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.telegramChatId": "ID чату",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.telegramChatIdTipLong": "<TelegramBotLink>Почніть чат</TelegramBotLink>, додайте <GetIdBotLink>@get_id_bot</GetIdBotLink> і виконайте команду <code>/my_id</code>",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.telegramChatIdTipLong": "<TelegramBotLink>Почніть чат</TelegramBotLink>, додайте <GetIdBotLink>@get_id_bot</GetIdBotLink> і виконайте команду <code>/my_id</code>",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.telegramsettingsfailed": "Не вдалося зберегти налаштування сповіщень Telegram.",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.telegramsettingssaved": "Налаштування сповіщень Telegram успішно збережено!",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.validationDiscordId": "Ви повинні надати дійсний ID користувача",
|
||||
@@ -1067,15 +1067,15 @@
|
||||
"components.UserProfile.UserSettings.menuNotifications": "Сповіщення",
|
||||
"components.UserProfile.UserSettings.menuPermissions": "Дозволи",
|
||||
"components.UserProfile.UserSettings.unauthorizedDescription": "У вас немає дозволу на зміну налаштувань цього користувача.",
|
||||
"components.UserProfile.emptywatchlist": "Тут з’являться медіафайли, додані до вашого <PlexWatchlistSupportLink>списку спостереження Plex</PlexWatchlistSupportLink>.",
|
||||
"components.UserProfile.emptywatchlist": "Тут з’являться медіафайли, додані до вашого <PlexWatchlistSupportLink>списку перегляду Plex</PlexWatchlistSupportLink>.",
|
||||
"components.UserProfile.limit": "{remaining} з {limit}",
|
||||
"components.UserProfile.movierequests": "Запитів фільмів",
|
||||
"components.UserProfile.pastdays": "{type} (за {days} день(ів))",
|
||||
"components.UserProfile.plexwatchlist": "Список спостереження Plex",
|
||||
"components.UserProfile.pastdays": "{type} (на {days} дні(в)",
|
||||
"components.UserProfile.plexwatchlist": "Список перегляду Plex",
|
||||
"components.UserProfile.recentlywatched": "Нещодавно переглянуто",
|
||||
"components.UserProfile.recentrequests": "Останні запити",
|
||||
"components.UserProfile.requestsperdays": "залишилось {limit}",
|
||||
"components.UserProfile.seriesrequest": "Запитів серіалів",
|
||||
"components.UserProfile.seriesrequest": "Запитів сезонів",
|
||||
"components.UserProfile.totalrequests": "Усього запитів",
|
||||
"components.UserProfile.unlimited": "Необмежено",
|
||||
"i18n.advanced": "Для просунутих користувачів",
|
||||
@@ -1114,7 +1114,7 @@
|
||||
"i18n.requested": "Запрошений",
|
||||
"i18n.requesting": "Запит…",
|
||||
"i18n.resolved": "Вирішені",
|
||||
"i18n.restartRequired": "Restart Required",
|
||||
"i18n.restartRequired": "Потрібне перезавантаження",
|
||||
"i18n.resultsperpage": "Відобразити {pageSize} результатів на сторінці",
|
||||
"i18n.retry": "Повторити",
|
||||
"i18n.retrying": "Повтор…",
|
||||
@@ -1140,144 +1140,211 @@
|
||||
"Components.PermissionEdit.requestMovies": "Запити фільмів",
|
||||
"Components.PermissionEdit.autoapprove4kMovies": "Автоматичне схвалення 4К фільмів",
|
||||
"Components.PermissionEdit.autoapproveMovies": "Автоматичне схвалення фільмів",
|
||||
"components.Discover.FilterSlideover.studio": "Студія",
|
||||
"components.Discover.RecentlyAddedSlider.recentlyAdded": "Нещодавно додані",
|
||||
"components.Discover.FilterSlideover.keywords": "Ключові слова",
|
||||
"components.Discover.FilterSlideover.ratingText": "Оцінки від {minValue} до {maxValue}",
|
||||
"components.Discover.FilterSlideover.tmdbuserscore": "Оцінка користувачів TMDB",
|
||||
"components.Discover.DiscoverTv.discovertv": "Серіали",
|
||||
"components.Discover.FilterSlideover.runtime": "Тривалість",
|
||||
"components.Discover.FilterSlideover.from": "Від",
|
||||
"components.Discover.studios": "Студії",
|
||||
"components.Discover.FilterSlideover.to": "До",
|
||||
"components.Discover.FilterSlideover.filters": "Фільтри",
|
||||
"components.Discover.CreateSlider.providetmdbsearch": "Введіть пошуковий запит",
|
||||
"components.Discover.DiscoverMovieKeyword.keywordMovies": "Фільми {keywordTitle}",
|
||||
"components.Discover.PlexWatchlistSlider.plexwatchlist": "Ваш список перегляду Plex",
|
||||
"components.Discover.FilterSlideover.genres": "Жанри",
|
||||
"components.Discover.FilterSlideover.originalLanguage": "Мова оригіналу",
|
||||
"components.Discover.CreateSlider.nooptions": "Немає результатів.",
|
||||
"components.Discover.FilterSlideover.tmdbuservotecount": "Кількість голосів користувачів TMDB",
|
||||
"components.Discover.DiscoverMovies.discovermovies": "Фільми",
|
||||
"components.Discover.FilterSlideover.clearfilters": "Очистити активні фільтри",
|
||||
"components.Discover.CreateSlider.searchKeywords": "Ключові слова пошуку…",
|
||||
"components.Discover.CreateSlider.searchStudios": "Пошук студій…",
|
||||
"components.Discover.CreateSlider.starttyping": "Починайте писати для пошуку.",
|
||||
"components.Discover.CreateSlider.validationTitlerequired": "Ви повинні вказати назву.",
|
||||
"components.Discover.DiscoverMovies.activefilters": "{count, plural, one {# Активний фільтр} other {# Активні фільтри}}",
|
||||
"components.Discover.DiscoverMovies.discovermovies": "Фільми",
|
||||
"components.Discover.DiscoverSliderEdit.enable": "Змінити видимість",
|
||||
"components.Discover.DiscoverSliderEdit.remove": "Видалити",
|
||||
"components.Discover.DiscoverTv.discovertv": "Серіали",
|
||||
"components.Discover.FilterSlideover.activefilters": "{count, plural, one {# Активний фільтр} other {# Активні фільтри}}",
|
||||
"components.Discover.FilterSlideover.filters": "Фільтри",
|
||||
"components.Discover.FilterSlideover.from": "Від",
|
||||
"components.Discover.FilterSlideover.genres": "Жанри",
|
||||
"components.Discover.FilterSlideover.keywords": "Ключові слова",
|
||||
"components.Discover.FilterSlideover.originalLanguage": "Оригінальна мова",
|
||||
"components.Discover.FilterSlideover.ratingText": "Оцінки від {minValue} до {maxValue}",
|
||||
"components.Discover.FilterSlideover.releaseDate": "Дата релізу",
|
||||
"components.Discover.FilterSlideover.runtime": "Тривалість",
|
||||
"components.Discover.FilterSlideover.studio": "Студія",
|
||||
"components.Discover.FilterSlideover.tmdbuserscore": "Оцінка користувачів TMDB",
|
||||
"components.Discover.FilterSlideover.tmdbuservotecount": "Кількість голосів від користувачів TMDB",
|
||||
"components.Discover.FilterSlideover.to": "До",
|
||||
"components.Discover.PlexWatchlistSlider.emptywatchlist": "Медіа додано до вашого <PlexWatchlistSupportLink>списку перегляду Plex</PlexWatchlistSupportLink>.",
|
||||
"components.Discover.PlexWatchlistSlider.plexwatchlist": "Ваш список перегляду Plex",
|
||||
"components.Discover.RecentlyAddedSlider.recentlyAdded": "Нещодавно додані",
|
||||
"components.Discover.studios": "Студії",
|
||||
"components.Discover.tmdbmoviegenre": "Жанр фільму TMDB",
|
||||
"components.Discover.tmdbmoviekeyword": "Ключове слово фільму TMDB",
|
||||
"components.Discover.tmdbmoviestreamingservices": "Сервіси потокової передачі фільмів TMDB",
|
||||
"components.Discover.tmdbnetwork": "Телеканал TMDB",
|
||||
"components.Discover.tmdbstudio": "Студія TMDB",
|
||||
"components.Discover.tmdbtvgenre": "Жанр серіалу TMDB",
|
||||
"components.Discover.tmdbtvkeyword": "Ключове слово серіалу TMDB",
|
||||
"components.Discover.tvgenres": "Жанри серіалів",
|
||||
"components.Layout.UserWarnings.passwordRequired": "Потрібно вказати пароль.",
|
||||
"components.Login.host": "{mediaServerName} URL",
|
||||
"components.Login.initialsignin": "Підключитися",
|
||||
"components.Login.initialsigningin": "Підключення…",
|
||||
"components.Login.save": "Додати",
|
||||
"components.Login.signinwithjellyfin": "Використовуйте свій {mediaServerName} обліковий запис",
|
||||
"components.Login.title": "Додати email",
|
||||
"components.Login.username": "Ім'я користувача",
|
||||
"components.ManageSlideOver.removearr4k": "Видалити з 4K {arr}",
|
||||
"components.MovieDetails.downloadstatus": "Статус завантаження",
|
||||
"components.MovieDetails.imdbuserscore": "Оцінка користувачів IMDB",
|
||||
"components.MovieDetails.openradarr4k": "Відкрити фільм у 4К Radarr",
|
||||
"components.Selector.searchKeywords": "Ключові слова пошуку…",
|
||||
"components.Selector.searchStudios": "Пошук студій…",
|
||||
"components.Selector.starttyping": "Початок введення для пошуку.",
|
||||
"components.Settings.Notifications.NotificationsPushover.sound": "Звук сповіщення",
|
||||
"components.Settings.SettingsMain.general": "Загальні",
|
||||
"components.Settings.SettingsMain.generalsettings": "Загальні налаштування",
|
||||
"components.Settings.SettingsMain.applicationTitle": "Назва програми",
|
||||
"components.Settings.SettingsMain.applicationurl": "URL програми",
|
||||
"components.Settings.SettingsMain.cacheImages": "Увімкнути кешування зображень",
|
||||
"components.Settings.SettingsMain.csrfProtection": "Увімкнути CSRF захист",
|
||||
"components.Settings.SettingsMain.csrfProtectionHoverTip": "НЕ вмикайте цей параметр, якщо ви не розумієте, що робите!",
|
||||
"components.Settings.SettingsMain.hideAvailable": "Приховати доступні медіа",
|
||||
"components.Settings.SettingsMain.locale": "Мова програми",
|
||||
"components.Settings.SettingsMain.originallanguage": "Мови для пошуку фільмів та серіалів",
|
||||
"components.Settings.SettingsMain.partialRequestsEnabled": "Дозволити запитувати серіали частково",
|
||||
"components.Settings.SettingsMain.region": "Регіон для пошуку фільмів та серіалів",
|
||||
"components.Settings.SettingsMain.regionTip": "Фільтрувати вміст за регіональною доступністю",
|
||||
"components.Settings.SettingsMain.toastApiKeySuccess": "Новий ключ API успішно згенеровано!",
|
||||
"components.Settings.SettingsMain.toastSettingsFailure": "Під час збереження налаштувань сталася помилка.",
|
||||
"components.Settings.SettingsMain.toastSettingsSuccess": "Налаштування успішно збережено!",
|
||||
"components.Settings.SettingsMain.trustProxyTip": "Дозволити Jellyseerr правильно реєструвати IP-адреси клієнтів за проксі-сервером",
|
||||
"components.Settings.SettingsMain.validationApplicationUrl": "Ви повинні надати дійсну URL-адресу",
|
||||
"components.Settings.SettingsMain.validationApplicationUrlTrailingSlash": "URL-адреса не має закінчуватися косою рискою",
|
||||
"components.Settings.SonarrModal.animeSeriesType": "Тип аніме",
|
||||
"components.Settings.jellyfinSettings": "Налаштування {mediaServerName}",
|
||||
"components.Settings.jellyfinSettingsSuccess": "Налаштування {mediaServerName} успішно збережено!",
|
||||
"components.Settings.jellyfinlibraries": "Бібліотеки {mediaServerName}",
|
||||
"components.Settings.jellyfinsettings": "Налаштування {mediaServerName}",
|
||||
"components.Setup.signinWithPlex": "Використовуйте свій обліковий запис Plex",
|
||||
"components.TvDetails.play": "Відтворити в {mediaServerName}",
|
||||
"components.UserList.mediaServerUser": "Користувач {mediaServerName}",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.email": "Електронна пошта",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.saving": "Збереження…",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.sound": "Звук сповіщення",
|
||||
"i18n.collection": "Колекція",
|
||||
"components.Discover.CreateSlider.needresults": "Ви повинні мати принаймні 1 результат.",
|
||||
"components.Discover.CreateSlider.searchGenres": "Пошук жанрів…",
|
||||
"components.Discover.DiscoverMovieKeyword.keywordMovies": "Фільми {keywordTitle}",
|
||||
"components.Discover.DiscoverTv.activefilters": "{count, plural, one {# Активний фільтр} other {# Активні фільтри}}",
|
||||
"components.Discover.DiscoverTvKeyword.keywordSeries": "{keywordTitle} Серіали",
|
||||
"components.Discover.FilterSlideover.clearfilters": "Очистити всі активні фільтри",
|
||||
"components.Discover.FilterSlideover.runtimeText": "тривалість {minValue}-{maxValue} хвилин",
|
||||
"components.Discover.FilterSlideover.voteCount": "Кількість голосів від {minValue} до {maxValue}",
|
||||
"components.Discover.DiscoverSliderEdit.remove": "Видалити",
|
||||
"components.Layout.Sidebar.browsemovies": "Фільми",
|
||||
"components.MovieDetails.imdbuserscore": "Оцінка користувачів IMDB",
|
||||
"components.Layout.Sidebar.browsetv": "Серіали",
|
||||
"components.Discover.DiscoverTv.sortPopularityDesc": "Популярність за спаданням",
|
||||
"components.Discover.moviegenres": "Жанри фільмів",
|
||||
"components.Discover.resetwarning": "Скинути всі повзунки до стандартних. Це також видалить будь-які спеціальні повзунки!",
|
||||
"components.Discover.stopediting": "Зупинити редагування",
|
||||
"components.Discover.DiscoverMovies.activefilters": "{count, plural, one {# Активний фільтр} other {# Активні фільтри}}",
|
||||
"components.Discover.DiscoverTv.activefilters": "{count, plural, one {# Активний фільтр} other {# Активні фільтри}}",
|
||||
"components.Discover.FilterSlideover.streamingservices": "Сервіси потокового передавання",
|
||||
"components.Discover.FilterSlideover.activefilters": "{count, plural, one {# Активний фільтр} other {# Активні фільтри}}",
|
||||
"components.Discover.CreateSlider.addSlider": "Додати повзунок",
|
||||
"components.Discover.tvgenres": "Жанри серіалів",
|
||||
"components.Discover.tmdbmoviekeyword": "Ключове слово фільму TMDB",
|
||||
"components.Discover.tmdbtvkeyword": "Ключове слово серіала TMDB",
|
||||
"components.Discover.tmdbnetwork": "Телеканал TMDB",
|
||||
"components.Discover.networks": "Телеканали",
|
||||
"components.Discover.tmdbtvgenre": "Жанр серіала TMDB",
|
||||
"components.Discover.tmdbstudio": "Студія TMDB",
|
||||
"components.Discover.tmdbtvstreamingservices": "Сервіси потокового передавання серіалів TMDB",
|
||||
"components.Discover.tmdbmoviestreamingservices": "Сервіси потокової передачі фільмів TMDB",
|
||||
"components.Discover.resetfailed": "Щось пішло не так під час скидання налаштувань Discover.",
|
||||
"components.Discover.tmdbsearch": "Пошук TMDB",
|
||||
"components.Discover.CreateSlider.searchKeywords": "Ключові слова пошуку…",
|
||||
"components.Discover.tmdbmoviegenre": "Жанр фільму TMDB",
|
||||
"components.Discover.updatesuccess": "Оновлено параметри налаштування Discover.",
|
||||
"components.Discover.resetsuccess": "Успішно скинуто параметри налаштування.",
|
||||
"components.Discover.updatefailed": "Під час оновлення налаштувань Discover сталася помилка.",
|
||||
"components.Selector.showmore": "Показати більше",
|
||||
"components.Selector.searchGenres": "Виберіть жанри…",
|
||||
"components.Selector.searchStudios": "Пошук студій…",
|
||||
"components.Discover.CreateSlider.addcustomslider": "Створити власний повзунок",
|
||||
"components.Selector.showless": "Показати менше",
|
||||
"components.Selector.starttyping": "Початок введення для пошуку.",
|
||||
"components.Selector.searchKeywords": "Пошук за ключовими словами…",
|
||||
"components.Selector.nooptions": "Немає результатів.",
|
||||
"components.Discover.resettodefault": "Скинути за замовчуванням",
|
||||
"components.Settings.SettingsJobsCache.availability-sync": "Синхронізація доступності медіа",
|
||||
"components.Discover.tmdbsearch": "Пошук TMDB",
|
||||
"components.Discover.tmdbtvstreamingservices": "Сервіси потокового передавання серіалів TMDB",
|
||||
"components.Layout.Sidebar.browsemovies": "Фільми",
|
||||
"components.Layout.Sidebar.browsetv": "Серіали",
|
||||
"components.Layout.UserWarnings.emailInvalid": "Адреса електронної пошти недійсна.",
|
||||
"components.Login.saving": "Додавання…",
|
||||
"components.Login.validationhostformat": "Потрібна дійсна URL-адреса",
|
||||
"components.Login.validationusernamerequired": "Потрібно ім'я користувача",
|
||||
"components.ManageSlideOver.removearr": "Видалити з {arr}",
|
||||
"components.MovieDetails.openradarr": "Відкрити фільм у Radarr",
|
||||
"components.Selector.nooptions": "Немає результатів.",
|
||||
"components.Selector.searchGenres": "Виберіть жанри…",
|
||||
"components.Settings.Notifications.NotificationsPushover.deviceDefault": "Пристрій за замовчуванням",
|
||||
"components.Settings.Notifications.userEmailRequired": "Потрібен email користувача",
|
||||
"components.Settings.RadarrModal.tagRequestsInfo": "Автоматично додавати додатковий тег з ID та іменем користувача, який запитує",
|
||||
"components.Settings.SettingsJobsCache.editJobScheduleSelectorSeconds": "Кожну {jobScheduleSeconds, plural, one {секунду} other {{jobScheduleSeconds} секунд}}",
|
||||
"components.Settings.RadarrModal.tagRequests": "Теги запитів",
|
||||
"components.Settings.SettingsMain.hideAvailable": "Приховати доступні медіа",
|
||||
"components.Settings.SettingsMain.regionTip": "Фільтрувати вміст за регіональною доступністю",
|
||||
"components.Settings.SettingsMain.region": "Регіон для пошуку фільмів та серіалів",
|
||||
"components.Settings.SettingsMain.trustProxy": "Увімкнути підтримку проксі",
|
||||
"components.Settings.SettingsMain.toastSettingsSuccess": "Налаштування успішно збережено!",
|
||||
"components.Settings.SettingsMain.locale": "Мова інтерфейсу",
|
||||
"components.Settings.SettingsMain.applicationTitle": "Назва програми",
|
||||
"components.Settings.SettingsMain.originallanguage": "Мови для пошуку фільмів та серіалів",
|
||||
"components.Settings.SettingsMain.csrfProtection": "Увімкнути захист CSRF",
|
||||
"components.Settings.SettingsMain.toastApiKeyFailure": "Під час створення нового ключа API сталася помилка.",
|
||||
"components.Settings.SettingsMain.originallanguageTip": "Фільтрувати вміст за мовою оригіналу",
|
||||
"components.Settings.SettingsMain.cacheImagesTip": "Кешувати зображення із зовнішніх джерел (потрібний значний об'єм дискового простору)",
|
||||
"components.Settings.SettingsMain.trustProxyTip": "Дозволити Overseerr правильно реєструвати IP-адреси клієнтів за проксі-сервером",
|
||||
"components.Settings.SettingsMain.generalsettings": "Загальні налаштування",
|
||||
"components.Settings.SettingsMain.validationApplicationUrlTrailingSlash": "URL-адреса не має закінчуватися скісною рискою",
|
||||
"components.Settings.SettingsMain.apikey": "Ключ API",
|
||||
"components.Settings.SettingsMain.generalsettingsDescription": "Налаштуйте глобальні параметри і параметри за замовчуванням для Overseerr.",
|
||||
"components.Settings.SettingsMain.toastApiKeySuccess": "Новий ключ API успішно згенеровано!",
|
||||
"components.Settings.SettingsMain.cacheImages": "Увімкнути кешування зображень",
|
||||
"components.Settings.SettingsMain.applicationurl": "URL програми",
|
||||
"components.Settings.SettingsMain.general": "Загальні",
|
||||
"components.Settings.SettingsMain.csrfProtectionHoverTip": "НЕ вмикайте цей параметр, якщо ви не розумієте, що робите!",
|
||||
"components.Settings.SettingsMain.partialRequestsEnabled": "Дозволити запитувати серіали частково",
|
||||
"components.Settings.SettingsMain.toastSettingsFailure": "Під час збереження налаштувань сталася помилка.",
|
||||
"components.Settings.SettingsMain.validationApplicationUrl": "Ви повинні вказати дійсну URL-адресу",
|
||||
"components.Settings.SettingsMain.validationApplicationTitle": "Ви повинні вказати назву програми",
|
||||
"components.Settings.SettingsAbout.supportjellyseerr": "Підтримайте Jellyseerr",
|
||||
"components.Settings.SettingsMain.csrfProtectionTip": "Встановіть доступ до зовнішнього API лише для читання (потрібний HTTPS)",
|
||||
"components.Discover.DiscoverTvKeyword.keywordSeries": "{keywordTitle} Серіали",
|
||||
"components.Discover.CreateSlider.editsuccess": "Відредаговано повзунок і збережено налаштування Discover.",
|
||||
"components.Discover.CreateSlider.slidernameplaceholder": "Назва повзунка",
|
||||
"components.Settings.internalUrl": "Внутрішня URL-адреса",
|
||||
"components.Settings.SettingsJobsCache.availability-sync": "Синхронізація доступності медіа",
|
||||
"components.Settings.SettingsJobsCache.editJobScheduleSelectorSeconds": "Кожну {jobScheduleSeconds, plural, one {секунду} other {{jobScheduleSeconds} секунд}}",
|
||||
"components.Settings.SettingsMain.apikey": "Ключ API",
|
||||
"components.Settings.SettingsMain.toastApiKeyFailure": "Під час створення нового ключа API сталася помилка.",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.deviceDefault": "Пристрій за замовчуванням",
|
||||
"components.UserList.noJellyfinuserstoimport": "Немає користувачів {mediaServerName} для імпорту.",
|
||||
"components.UserList.importfromJellyfinerror": "Під час імпорту користувачів з {mediaServerName} сталася помилка.",
|
||||
"components.Settings.SettingsMain.cacheImagesTip": "Кешувати зображення із зовнішніх джерел (потрібний значний об'єм дискового простору)",
|
||||
"components.Settings.SettingsMain.validationApplicationTitle": "Ви повинні вказати назву програми",
|
||||
"components.Settings.SonarrModal.seriesType": "Тип серіалу",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.mediaServerUser": "Користувач {mediaServerName}",
|
||||
"components.TitleCard.watchlistError": "Щось пішло не так, повторіть спробу.",
|
||||
"components.Settings.SettingsMain.generalsettingsDescription": "Налаштуйте глобальні параметри та параметри за замовчуванням для Jellyseerr.",
|
||||
"components.Settings.SettingsMain.originallanguageTip": "Фільтрувати вміст за мовою оригіналу",
|
||||
"components.Settings.SettingsMain.trustProxy": "Увімкнути підтримку проксі",
|
||||
"components.Settings.jellyfinSettingsFailure": "Під час збереження налаштувань {mediaServerName} сталася помилка.",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.save": "Зберегти зміни",
|
||||
"components.TvDetails.play4k": "Відтворити 4K в {mediaServerName}",
|
||||
"components.Discover.CreateSlider.providetmdbsearch": "Введіть пошуковий запит",
|
||||
"components.Discover.FilterSlideover.streamingservices": "Сервіси потокового передавання",
|
||||
"components.Discover.moviegenres": "Жанри фільмів",
|
||||
"components.MovieDetails.play": "Відтворити в {mediaServerName}",
|
||||
"components.MovieDetails.play4k": "Відтворити в {mediaServerName} у 4К",
|
||||
"components.Selector.showless": "Згорнути",
|
||||
"components.Discover.CreateSlider.addSlider": "Додати повзунок",
|
||||
"components.Discover.CreateSlider.addcustomslider": "Створити власний повзунок",
|
||||
"components.Discover.CreateSlider.addfail": "Не вдалося створити новий повзунок.",
|
||||
"components.Discover.CreateSlider.needresults": "Ви повинні мати принаймні 1 результат.",
|
||||
"components.Discover.DiscoverSliderEdit.deletefail": "Не вдалося видалити повзунок.",
|
||||
"components.Discover.DiscoverSliderEdit.deletesuccess": "Повзунок успішно видалено.",
|
||||
"components.Discover.CreateSlider.addsuccess": "Створено новий повзунок і збережено параметри налаштування Discover.",
|
||||
"components.Discover.CreateSlider.editSlider": "Редагувати повзунок",
|
||||
"components.Discover.CreateSlider.editfail": "Не вдалося відредагувати повзунок.",
|
||||
"components.Discover.CreateSlider.addsuccess": "Створено новий повзунок і збережено параметри налаштування Discover.",
|
||||
"components.Discover.PlexWatchlistSlider.emptywatchlist": "Медіа додано до вашого <PlexWatchlistSupportLink>списку перегляду Plex</PlexWatchlistSupportLink>.",
|
||||
"components.Settings.Notifications.NotificationsPushover.sound": "Звук сповіщення",
|
||||
"components.Discover.customizediscover": "Налаштувати Discover",
|
||||
"components.Discover.createnewslider": "Створити новий повзунок",
|
||||
"components.Discover.FilterSlideover.firstAirDate": "Дата виходу в ефір",
|
||||
"components.Settings.Notifications.NotificationsPushover.deviceDefault": "Пристрій за замовчуванням",
|
||||
"components.Settings.SonarrModal.tagRequests": "Теги запитів",
|
||||
"components.Settings.SonarrModal.tagRequestsInfo": "Автоматично додавати додатковий тег з ID та іменем користувача, який запитує",
|
||||
"components.Settings.SonarrModal.animeSeriesType": "Тип аніме-серіалу",
|
||||
"components.Settings.SonarrModal.seriesType": "Тип серіалу",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.deviceDefault": "Пристрій за замовчуванням",
|
||||
"i18n.collection": "Колекція",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.sound": "Звук сповіщення",
|
||||
"components.Discover.DiscoverMovies.sortPopularityDesc": "Популярність за спаданням",
|
||||
"components.Discover.DiscoverMovies.sortTmdbRatingAsc": "Рейтинг TMDB за зростанням",
|
||||
"components.Discover.DiscoverMovies.sortReleaseDateDesc": "Дата випуску за спаданням",
|
||||
"components.Discover.CreateSlider.providetmdbnetwork": "Введіть TMDB ID мережі",
|
||||
"components.Discover.DiscoverMovies.sortPopularityAsc": "Популярність за зростанням",
|
||||
"components.Discover.CreateSlider.validationDatarequired": "Ви повинні надати доступний для пошуку вміст.",
|
||||
"components.Discover.CreateSlider.providetmdbstudio": "Введіть TMDB ID студії",
|
||||
"components.Discover.DiscoverMovies.sortTitleDesc": "Назва (Я-А) за спаданням",
|
||||
"components.Discover.CreateSlider.starttyping": "Початок введення для пошуку.",
|
||||
"components.Discover.CreateSlider.providetmdbkeywordid": "Введіть TMDB ID ключового слова",
|
||||
"components.Discover.CreateSlider.validationTitlerequired": "Ви повинні вказати назву.",
|
||||
"components.Discover.DiscoverMovies.sortReleaseDateAsc": "Дата випуску за зростанням",
|
||||
"components.Discover.DiscoverMovies.sortTmdbRatingDesc": "Рейтинг TMDB за спаданням",
|
||||
"components.Discover.DiscoverMovies.sortTitleAsc": "Назва (А-Я) за зростанням",
|
||||
"components.Discover.CreateSlider.editsuccess": "Відредаговано повзунок і збережено параметри налаштування Discover.",
|
||||
"components.Discover.CreateSlider.providetmdbgenreid": "Введіть TMDB ID жанру",
|
||||
"components.Discover.DiscoverTv.sortTmdbRatingAsc": "Рейтинг TMDB за зростанням",
|
||||
"components.Discover.CreateSlider.providetmdbkeywordid": "Введіть TMDB ID ключового слова",
|
||||
"components.Discover.CreateSlider.providetmdbnetwork": "Введіть TMDB ID мережі",
|
||||
"components.Discover.CreateSlider.providetmdbstudio": "Введіть TMDB ID студії",
|
||||
"components.Discover.CreateSlider.slidernameplaceholder": "Назва повзунка",
|
||||
"components.Discover.CreateSlider.validationDatarequired": "Ви повинні надати доступний для пошуку вміст.",
|
||||
"components.Discover.DiscoverMovies.sortPopularityAsc": "Популярність за зростанням",
|
||||
"components.Discover.DiscoverMovies.sortPopularityDesc": "Популярність за спаданням",
|
||||
"components.Discover.DiscoverMovies.sortReleaseDateAsc": "Дата випуску за зростанням",
|
||||
"components.Discover.DiscoverMovies.sortReleaseDateDesc": "Дата випуску за спаданням",
|
||||
"components.Discover.DiscoverMovies.sortTitleAsc": "Назва (А-Я) за зростанням",
|
||||
"components.Discover.DiscoverMovies.sortTitleDesc": "Назва (Я-А) за спаданням",
|
||||
"components.Discover.DiscoverMovies.sortTmdbRatingAsc": "Рейтинг TMDB за зростанням",
|
||||
"components.Discover.DiscoverMovies.sortTmdbRatingDesc": "Рейтинг TMDB за спаданням",
|
||||
"components.Discover.DiscoverTv.sortFirstAirDateAsc": "Дата виходу в ефір за зростанням",
|
||||
"components.Discover.DiscoverTv.sortTmdbRatingDesc": "Рейтинг TMDB за спаданням",
|
||||
"components.Discover.DiscoverTv.sortPopularityAsc": "Популярність за зростанням",
|
||||
"components.Discover.DiscoverTv.sortTitleAsc": "Назва (А-Я) за зростанням",
|
||||
"components.Discover.DiscoverTv.sortFirstAirDateDesc": "Дата виходу в ефір за спаданням",
|
||||
"components.Discover.DiscoverSliderEdit.deletefail": "Не вдалося видалити повзунок.",
|
||||
"components.Discover.DiscoverSliderEdit.enable": "Перемкнути видимість",
|
||||
"components.Discover.DiscoverSliderEdit.deletesuccess": "Повзунок успішно видалено.",
|
||||
"components.Discover.DiscoverTv.sortTitleDesc": "Назва (Я-А) за спаданням"
|
||||
"components.Discover.DiscoverTv.sortPopularityAsc": "Популярність за зростанням",
|
||||
"components.Discover.DiscoverTv.sortPopularityDesc": "Популярність за спаданням",
|
||||
"components.Discover.DiscoverTv.sortTitleAsc": "Назва (А-Я) за зростанням",
|
||||
"components.Discover.DiscoverTv.sortTitleDesc": "Назва (Я-А) за спаданням",
|
||||
"components.Discover.DiscoverTv.sortTmdbRatingAsc": "Рейтинг TMDB за зростанням",
|
||||
"components.Discover.DiscoverTv.sortTmdbRatingDesc": "Рейтинг TMDB за спаданням",
|
||||
"components.Discover.FilterSlideover.firstAirDate": "Дата виходу в ефір",
|
||||
"components.Discover.createnewslider": "Створити новий повзунок",
|
||||
"components.Discover.customizediscover": "Налаштувати Discover",
|
||||
"components.Discover.resetfailed": "Щось пішло не так під час скидання налаштувань Discover.",
|
||||
"components.Discover.resetsuccess": "Успішно скинуто параметри налаштування.",
|
||||
"components.Discover.resetwarning": "Скинути всі повзунки до стандартних. Це також видалить будь-які спеціальні повзунки!",
|
||||
"components.Discover.stopediting": "Зупинити редагування",
|
||||
"components.Discover.updatefailed": "Під час оновлення налаштувань Discover сталася помилка.",
|
||||
"components.Discover.updatesuccess": "Оновлено параметри налаштування Discover.",
|
||||
"components.Login.credentialerror": "Ім'я користувача або пароль неправильні.",
|
||||
"components.Login.description": "Оскільки ви вперше входите в {applicationName}, вам потрібно додати дійсну адресу електронної пошти.",
|
||||
"components.Login.validationEmailFormat": "Невірний email",
|
||||
"components.Login.validationEmailRequired": "Ви повинні вказати адресу електронної пошти",
|
||||
"components.Login.validationemailformat": "Потрібен дійсний email",
|
||||
"components.Layout.UserWarnings.emailRequired": "Потрібно вказати адресу електронної пошти.",
|
||||
"components.Login.emailtooltip": "Адресу не потрібно пов’язувати з вашим {mediaServerName} сервером.",
|
||||
"components.Login.validationhostrequired": "Необхідна URL-адреса {mediaServerName}",
|
||||
"components.ManageSlideOver.manageModalRemoveMediaWarning": "* Це безповоротно видалить цей {mediaType} з {arr}, включаючи всі файли.",
|
||||
"components.Selector.showmore": "Показати більше",
|
||||
"components.Settings.RadarrModal.tagRequests": "Теги запитів",
|
||||
"components.Settings.SonarrModal.tagRequests": "Теги запитів",
|
||||
"components.Setup.configuremediaserver": "Налаштуйте медіасервер",
|
||||
"components.Settings.jellyfinsettingsDescription": "Налаштуйте свій {mediaServerName} сервер. {mediaServerName} відсканує бібліотеки, щоб побачити, які бібліотеки доступні.",
|
||||
"components.Settings.manualscanJellyfin": "Сканувати бібліотеки вручну",
|
||||
"components.Settings.menuJellyfinSettings": "{mediaServerName}",
|
||||
"components.Settings.jellyfinlibrariesDescription": "Бібліотеки {mediaServerName} перевіряються на наявність заголовків. Натисніть нижче, якщо в списку не вистачає бібліотек.",
|
||||
"components.Settings.saving": "Збереження…",
|
||||
"components.Settings.syncJellyfin": "Синхронізувати бібліотеки",
|
||||
"components.Settings.syncing": "Синхронізація",
|
||||
"components.Setup.signin": "Увійти",
|
||||
"components.Setup.signinWithJellyfin": "Використовуйте свій {mediaServerName} обліковий запис",
|
||||
"components.TitleCard.addToWatchList": "Додати в список перегляду",
|
||||
"components.TitleCard.watchlistSuccess": "<strong>{title}</strong> успішно додано до списку перегляду!",
|
||||
"components.UserList.importedfromJellyfin": "<strong>{userCount}</strong> {mediaServerName} {userCount, plural, one {user} other {users}} успішно імпортовано!",
|
||||
"components.UserList.importfromJellyfin": "Додати користувачів з {mediaServerName}",
|
||||
"components.Settings.manualscanDescriptionJellyfin": "Зазвичай це запускається лише раз на 24 години. Jellyseerr перевірятиме нещодавно доданий сервер {mediaServerName} більш агресивно. Якщо ви вперше налаштовуєте Jellyseerr, рекомендується одноразове повне сканування бібліотеки вручну!",
|
||||
"components.Settings.save": "Зберегти зміни",
|
||||
"components.TitleCard.watchlistDeleted": "<strong>{title}</strong> Успішно видалено зі списку перегляду!",
|
||||
"components.UserList.newJellyfinsigninenabled": "Параметр <strong>Увімкнути новий вхід на {mediaServerName}</strong> наразі ввімкнено. Користувачам {mediaServerName} із доступом до бібліотеки не потрібно імпортувати, щоб увійти.",
|
||||
"components.UserProfile.localWatchlist": "Список перегляду {username}",
|
||||
"components.Settings.jellyfinSettingsDescription": "Додатково налаштуйте внутрішні та зовнішні кінцеві точки для вашого сервера {mediaServerName}. У більшості випадків зовнішня URL-адреса відрізняється від внутрішньої URL-адреси. Для входу в систему {mediaServerName} також можна встановити спеціальну URL-адресу скидання пароля, якщо ви хочете переспрямувати на іншу сторінку скидання пароля.",
|
||||
"components.Settings.SonarrModal.tagRequestsInfo": "Автоматично додавати додатковий тег з ID та іменем користувача, який запитує"
|
||||
}
|
||||
|
||||
@@ -397,7 +397,7 @@
|
||||
"components.UserProfile.UserSettings.UserPasswordChange.password": "密码设置",
|
||||
"components.UserProfile.UserSettings.UserPasswordChange.nopermissionDescription": "你无权设置此用户的密码。",
|
||||
"components.UserProfile.UserSettings.UserPasswordChange.noPasswordSetOwnAccount": "你的帐户目前没有设置密码。在下方配置密码,使你能够作为“本地用户”登录。",
|
||||
"components.UserProfile.UserSettings.UserPasswordChange.noPasswordSet": "此用户帐户目前没有设置密码。在下方配置密码,使该帐户能够作为“本地用户”登录。",
|
||||
"components.UserProfile.UserSettings.UserPasswordChange.noPasswordSet": "此用户帐户目前没有设置密码。配置下面的密码以使此帐户能够作为“本地用户”登录。",
|
||||
"components.UserProfile.UserSettings.UserPasswordChange.newpassword": "新密码",
|
||||
"components.UserProfile.UserSettings.UserPasswordChange.currentpassword": "当前的密码",
|
||||
"components.UserProfile.UserSettings.UserPasswordChange.confirmpassword": "确认密码",
|
||||
@@ -766,14 +766,14 @@
|
||||
"components.RequestButton.viewrequest": "查看请求",
|
||||
"components.RequestButton.requestmore4k": "再提交 4K 请求",
|
||||
"components.RequestButton.requestmore": "提交更多季数的请求",
|
||||
"components.RequestButton.declinerequests": "拒绝{requestCount, plural, one {请求} other {{requestCount} 个请求}}",
|
||||
"components.RequestButton.declinerequests": "拒绝{requestCount, plural, one {Request} other {{requestCount} Requests}}",
|
||||
"components.RequestButton.declinerequest4k": "拒绝 4K 请求",
|
||||
"components.RequestButton.declinerequest": "拒绝请求",
|
||||
"components.RequestButton.decline4krequests": "拒绝{requestCount, plural, one { 4K 请求} other { {requestCount} 个 4K 请求}}",
|
||||
"components.RequestButton.approverequests": "批准{requestCount, plural, one {请求} other {{requestCount} 个请求}}",
|
||||
"components.RequestButton.decline4krequests": "拒绝 {requestCount, plural, one {4K Request} other {{requestCount} 4K Requests}}",
|
||||
"components.RequestButton.approverequests": "批准 {requestCount, plural, one {Request} other {{requestCount} Requests}}",
|
||||
"components.RequestButton.approverequest4k": "批准 4K 请求",
|
||||
"components.RequestButton.approverequest": "批准请求",
|
||||
"components.RequestButton.approve4krequests": "批准{requestCount, plural, one { 4K 请求} other { {requestCount} 个 4K 请求}}",
|
||||
"components.RequestButton.approve4krequests": "批准 {requestCount, plural, one {4K Request} other {{requestCount} 4K Requests}}",
|
||||
"components.RequestBlock.server": "目標服务器",
|
||||
"components.RequestBlock.seasons": "季数",
|
||||
"components.RequestBlock.rootfolder": "根目录",
|
||||
@@ -782,10 +782,10 @@
|
||||
"components.RegionSelector.regionServerDefault": "默认设置({region})",
|
||||
"components.RegionSelector.regionDefault": "所有地区",
|
||||
"components.QuotaSelector.unlimited": "无限",
|
||||
"components.QuotaSelector.tvRequests": "<quotaUnits>每 {quotaDays} {days} </quotaUnits>{quotaLimit}<quotaUnits> {seasons}</quotaUnits>",
|
||||
"components.QuotaSelector.tvRequests": "{quotaLimit} <quotaUnits>{seasons} 每 {quotaDays} {days}</quotaUnits>",
|
||||
"components.QuotaSelector.seasons": "季",
|
||||
"components.QuotaSelector.movies": "部电影",
|
||||
"components.QuotaSelector.movieRequests": "<quotaUnits>每 {quotaDays} {days} </quotaUnits>{quotaLimit}<quotaUnits> {movies}</quotaUnits>",
|
||||
"components.QuotaSelector.movieRequests": "{quotaLimit} <quotaUnits>{movies} 每 {quotaDays} {days}</quotaUnits>",
|
||||
"components.QuotaSelector.days": "天",
|
||||
"components.PlexLoginButton.signinwithplex": "登入",
|
||||
"components.PlexLoginButton.signingin": "登入中…",
|
||||
@@ -900,7 +900,7 @@
|
||||
"components.Settings.Notifications.NotificationsGotify.toastGotifyTestFailed": "Gotify 测试通知发送失败。",
|
||||
"components.Settings.Notifications.NotificationsGotify.toastGotifyTestSending": "Gotify测试通知发送中…",
|
||||
"components.Settings.Notifications.enableMentions": "允许提及",
|
||||
"components.Settings.SettingsJobsCache.editJobScheduleSelectorMinutes": "每 {jobScheduleMinutes} 分钟",
|
||||
"components.Settings.SettingsJobsCache.editJobScheduleSelectorMinutes": "每 {jobScheduleMinutes, plural, one {minute} other {{jobScheduleMinutes} minutes}}",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.pushoverApplicationToken": "应用 API 令牌",
|
||||
"components.UserList.newplexsigninenabled": "<strong>允许新的 Plex 用户登录</strong> 设置目前已启用。还没有导入的Plex用户也能登录。",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.pushoversettingsfailed": "Pushover 通知设置保存失败。",
|
||||
@@ -909,7 +909,7 @@
|
||||
"components.Settings.RadarrModal.inCinemas": "已上映",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.pushbulletAccessTokenTip": "从您的<PushbulletSettingsLink>账号设置</PushbulletSettingsLink>获取API令牌",
|
||||
"components.Settings.SettingsAbout.appDataPath": "数据目录",
|
||||
"components.Settings.SettingsJobsCache.editJobScheduleSelectorHours": "每 {jobScheduleHours} 小时",
|
||||
"components.Settings.SettingsJobsCache.editJobScheduleSelectorHours": "每 {jobScheduleHours, plural, one {hour} other {{jobScheduleHours} hours}}",
|
||||
"components.Settings.tautulliSettings": "Tautulli 设置",
|
||||
"components.Settings.tautulliSettingsDescription": "关于 Tautulli 服务器的设置。Jellyseerr 会从 Tautulli 获取 Plex 媒体的观看历史记录。",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.discordId": "Discord 用户ID",
|
||||
@@ -1063,8 +1063,8 @@
|
||||
"components.Settings.restartrequiredTooltip": "必须重新启动 Jellyseerr 才能使更改的设置生效",
|
||||
"components.TvDetails.manageseries": "管理电视节目",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncseriestip": "自动请求您的 <PlexWatchlistSupportLink>Plex 关注列表</PlexWatchlistSupportLink>的媒体",
|
||||
"components.AirDateBadge.airedrelative": "播出{relativeTime}",
|
||||
"components.AirDateBadge.airsrelative": "播出{relativeTime}",
|
||||
"components.AirDateBadge.airedrelative": "{relativeTime}播出",
|
||||
"components.AirDateBadge.airsrelative": "{relativeTime}播出",
|
||||
"components.Layout.UserDropdown.MiniQuotaDisplay.movierequests": "电影请求",
|
||||
"components.Layout.UserDropdown.MiniQuotaDisplay.seriesrequests": "电视节目请求",
|
||||
"components.NotificationTypeSelector.mediaautorequestedDescription": "当 Plex 关注列表中的项目自动提交新媒体请求时,会收到通知。",
|
||||
@@ -1203,7 +1203,7 @@
|
||||
"components.Discover.PlexWatchlistSlider.emptywatchlist": "您的 <PlexWatchlistSupportLink>Plex 关注列表</PlexWatchlistSupportLink>中的媒体会显示在这里。",
|
||||
"components.Selector.starttyping": "开始打字以进行搜索。",
|
||||
"components.Discover.CreateSlider.starttyping": "开始打字以进行搜索。",
|
||||
"components.Discover.CreateSlider.needresults": "需要至少有 1 个结果。",
|
||||
"components.Discover.CreateSlider.needresults": "你需要至少有 1 个结果。",
|
||||
"components.Selector.showless": "显示更少",
|
||||
"components.Discover.resetfailed": "重置探索媒体设置时出了点问题。",
|
||||
"components.Settings.SettingsMain.validationApplicationTitle": "你必须提供一个应用程序标题",
|
||||
@@ -1253,7 +1253,7 @@
|
||||
"components.Settings.SettingsJobsCache.availability-sync": "同步媒体可用性",
|
||||
"components.Discover.tmdbmoviestreamingservices": "TMDB 电影流媒体服务",
|
||||
"components.Discover.tmdbtvstreamingservices": "TMDB 电视流媒体服务",
|
||||
"components.Settings.SettingsJobsCache.editJobScheduleSelectorSeconds": "每 {jobScheduleSeconds} 秒",
|
||||
"components.Settings.SettingsJobsCache.editJobScheduleSelectorSeconds": "每 {jobScheduleSeconds, plural, one {second} other {{jobScheduleSeconds} seconds}}",
|
||||
"components.Discover.FilterSlideover.voteCount": "在 {minValue} 和 {maxValue} 之间的评分数",
|
||||
"components.Settings.RadarrModal.tagRequests": "标签请求",
|
||||
"components.Settings.RadarrModal.tagRequestsInfo": "自动添加带有请求者的用户 ID 和显示名称的附加标签",
|
||||
@@ -1261,11 +1261,83 @@
|
||||
"i18n.collection": "合集",
|
||||
"components.Discover.FilterSlideover.tmdbuservotecount": "TMDB 用户评分数",
|
||||
"components.Settings.SonarrModal.tagRequestsInfo": "自动添加带有请求者的用户 ID 和显示名称的附加标签",
|
||||
"components.MovieDetails.imdbuserscore": "IMDB 用户评分",
|
||||
"components.Settings.Notifications.NotificationsPushover.sound": "通知提示音",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.deviceDefault": "默认设备",
|
||||
"components.Settings.SonarrModal.animeSeriesType": "动漫剧集类型",
|
||||
"components.Settings.SonarrModal.seriesType": "剧集类型",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.sound": "通知提示音",
|
||||
"components.Settings.Notifications.NotificationsPushover.deviceDefault": "默认设备"
|
||||
"components.Layout.UserWarnings.passwordRequired": "需要输入密码。",
|
||||
"components.Login.emailtooltip": "地址不需要与{mediaServerName}实例相关联。",
|
||||
"components.Login.host": "{mediaServerName} 的 URL",
|
||||
"components.Login.initialsignin": "连接",
|
||||
"components.Login.initialsigningin": "连接中……",
|
||||
"components.Login.save": "添加",
|
||||
"components.Login.saving": "添加中……",
|
||||
"components.Login.signinwithjellyfin": "使用您的{mediaServerName}帐户",
|
||||
"components.Login.title": "添加邮件",
|
||||
"components.Login.username": "用户名",
|
||||
"components.Login.validationEmailFormat": "无效的邮件地址",
|
||||
"components.Login.validationEmailRequired": "你必须提供一个电子邮件",
|
||||
"components.Login.validationemailformat": "需要有效的电子邮件",
|
||||
"components.Login.validationhostformat": "需要有效的URL",
|
||||
"components.Login.validationusernamerequired": "需要用户名",
|
||||
"components.ManageSlideOver.manageModalRemoveMediaWarning": "* 这将不可逆地从{arr}中删除{mediaType},包括所有文件。",
|
||||
"components.ManageSlideOver.removearr4k": "移除4K {arr}",
|
||||
"components.MovieDetails.downloadstatus": "下载状态",
|
||||
"components.MovieDetails.imdbuserscore": "IMDB用户评分",
|
||||
"components.MovieDetails.openradarr": "在Radarr中打开电影",
|
||||
"components.MovieDetails.play": "播放{mediaServerName}",
|
||||
"components.MovieDetails.play4k": "播放 4K {mediaServerName}",
|
||||
"components.Settings.Notifications.NotificationsPushover.sound": "通知声音",
|
||||
"components.Settings.SettingsJobsCache.jellyfin-full-scan": "Jellyfin全库扫描",
|
||||
"components.Settings.SonarrModal.seriesType": "系列类型",
|
||||
"components.Settings.jellyfinSettingsFailure": "保存{mediaServerName}设置时出错。",
|
||||
"components.Settings.jellyfinSettingsSuccess": "{mediaServerName}设置保存成功!",
|
||||
"components.Settings.jellyfinlibraries": "{mediaServerName}库",
|
||||
"components.Settings.jellyfinlibrariesDescription": "库{mediaServerName}用于扫描标题。如果没有列出库,请单击下面的按钮。",
|
||||
"components.Settings.jellyfinsettings": "{mediaServerName}设置",
|
||||
"components.Settings.manualscanJellyfin": "手动扫描库",
|
||||
"components.Settings.menuJellyfinSettings": "{mediaServerName}",
|
||||
"components.Settings.saving": "保存中……",
|
||||
"components.Settings.syncJellyfin": "同步库",
|
||||
"components.Settings.syncing": "同步中",
|
||||
"components.Settings.timeout": "超时",
|
||||
"components.Setup.signin": "登录",
|
||||
"components.Setup.signinWithJellyfin": "使用您的{mediaServerName}帐户",
|
||||
"components.TitleCard.addToWatchList": "添加到监视列表",
|
||||
"components.TitleCard.watchlistDeleted": "<strong>{title}</strong>从监视列表中删除成功!",
|
||||
"components.TitleCard.watchlistError": "出了问题,再试一次。",
|
||||
"components.TvDetails.play": "在 {mediaServerName} 播放",
|
||||
"components.TvDetails.play4k": "mediaServerName} 播放 4K",
|
||||
"components.UserList.importfrommediaserver": "导入{mediaServerName}用户",
|
||||
"components.UserList.mediaServerUser": "{mediaServerName} 用户",
|
||||
"components.UserList.noJellyfinuserstoimport": "在{mediaServerName}中没有用户要导入。",
|
||||
"components.UserList.newJellyfinsigninenabled": "<strong>启用 {mediaServerName} 登录</strong> 设置当前已启用. {mediaServerName} 具有库访问权限的用户不需要导入即可登录。",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.mediaServerUser": "{mediaServerName} 用户",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.deviceDefault": "设备默认",
|
||||
"components.Layout.UserWarnings.emailInvalid": "邮件地址无效。",
|
||||
"components.Layout.UserWarnings.emailRequired": "需要填写电子邮件地址。",
|
||||
"components.Login.credentialerror": "用户名或密码错误。",
|
||||
"components.Login.description": "由于这是您第一次登录{applicationName},您需要添加一个有效的电子邮件地址。",
|
||||
"components.Login.validationhostrequired": "{mediaServerName} URL是必需的",
|
||||
"components.ManageSlideOver.removearr": "从{arr}中删除",
|
||||
"components.MovieDetails.openradarr4k": "在 4K Radarr 中打开电影",
|
||||
"components.Settings.Notifications.NotificationsPushover.deviceDefault": "设备默认",
|
||||
"components.Settings.Notifications.userEmailRequired": "获取用户邮箱",
|
||||
"components.Settings.SettingsAbout.supportjellyseerr": "支持Jellyseerr",
|
||||
"components.Settings.SettingsJobsCache.jellyfin-recently-added-scan": "Jellyfin最近新增扫描",
|
||||
"components.Settings.SonarrModal.animeSeriesType": "动漫系列",
|
||||
"components.Settings.internalUrl": "内部URL",
|
||||
"components.Settings.jellyfinSettings": "{mediaServerName}设置",
|
||||
"components.Settings.jellyfinSettingsDescription": "可以为您的{mediaServerName}服务器配置内部和外部端点。在大多数情况下,外部URL与内部URL不同。如果你想重定向到不同的密码重置页面,也可以为{mediaServerName}登录设置自定义密码重置URL。",
|
||||
"components.Settings.jellyfinsettingsDescription": "配置{mediaServerName}服务器的设置。{mediaServerName}扫描{mediaServerName}库以查看可用的内容。",
|
||||
"components.Settings.manualscanDescriptionJellyfin": "正常情况下,每24小时只会运行一次。Jellyseerr将更积极地检查您的{mediaServerName}服务器最近添加的内容。如果这是您第一次配置Jellyseerr,建议您手动进行一次完整的库扫描!",
|
||||
"components.Settings.save": "保存更改",
|
||||
"components.Setup.configuremediaserver": "配置媒体服务器",
|
||||
"components.Setup.signinWithPlex": "使用您的 Plex 帐户",
|
||||
"components.TitleCard.watchlistCancel": "<strong>{title}</strong>的监视列表已取消。",
|
||||
"components.TitleCard.watchlistSuccess": "<strong>{title}</strong>添加到监视列表成功!",
|
||||
"components.UserList.importfromJellyfin": "导入{mediaServerName}用户",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.email": "电子邮件",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.save": "保存更改",
|
||||
"components.UserList.importfromJellyfinerror": "导入{mediaServerName}用户时出错。",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.sound": "通知声音",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.saving": "保存中……",
|
||||
"components.UserProfile.localWatchlist": "{username}的监视列表",
|
||||
"components.UserList.importedfromJellyfin": "<strong>{userCount}</strong> {mediaServerName} {userCount, plural, one {user} other {users}} 导入成功!"
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ const JellyfinSettingsPage: NextPage = () => {
|
||||
useRouteGuard(Permission.MANAGE_SETTINGS);
|
||||
return (
|
||||
<SettingsLayout>
|
||||
<SettingsJellyfin showAdvancedSettings={true} />
|
||||
<SettingsJellyfin />
|
||||
</SettingsLayout>
|
||||
);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user