From 1056d28a26032d95b6f9b49ab1300d976e86e76c Mon Sep 17 00:00:00 2001 From: samwiseg0 <2241731+samwiseg0@users.noreply.github.com> Date: Mon, 21 Dec 2020 22:50:09 -0500 Subject: [PATCH 01/16] docs: Update templates with new labels [skip ci] (#452) * docs: Update bug template with new label [skip ci] * docs: Update feature request template with new label [skip ci] --- .github/ISSUE_TEMPLATE/bug_report.md | 2 +- .github/ISSUE_TEMPLATE/feature_request.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 6d369e18..972ad2f3 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -2,7 +2,7 @@ name: Bug report about: Create a report to help us improve title: '' -labels: bug +labels: 'awaiting-triage, type:bug' assignees: '' --- diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 5f0a04ce..b9ea9edd 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -2,7 +2,7 @@ name: Feature request about: Suggest an idea for this project title: '' -labels: enhancement +labels: 'awaiting-triage, type:enhancement' assignees: '' --- From 66ef72dd42912d83ea8f86aabb75fbee547f8de9 Mon Sep 17 00:00:00 2001 From: Brandon Cohen Date: Mon, 21 Dec 2020 23:19:06 -0500 Subject: [PATCH 02/16] fix(frontend): approve and decline button (in manage panel) will now fit on mobile (#441) --- src/components/RequestBlock/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/RequestBlock/index.tsx b/src/components/RequestBlock/index.tsx index 06122ae3..41f0e1b1 100644 --- a/src/components/RequestBlock/index.tsx +++ b/src/components/RequestBlock/index.tsx @@ -84,7 +84,7 @@ const RequestBlock: React.FC = ({ request, onUpdate }) => { )} -
+
{request.status === MediaRequestStatus.PENDING && ( <> From ffe9e19c3b99de6af1185900e292da641ff44320 Mon Sep 17 00:00:00 2001 From: sct Date: Tue, 22 Dec 2020 13:45:04 +0900 Subject: [PATCH 03/16] feat(plex-sync): add support for hama guid's re #453 --- server/job/plexsync/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/job/plexsync/index.ts b/server/job/plexsync/index.ts index 31880e19..50ce766c 100644 --- a/server/job/plexsync/index.ts +++ b/server/job/plexsync/index.ts @@ -17,7 +17,7 @@ const UPDATE_RATE = 4 * 1000; const imdbRegex = new RegExp(/imdb:\/\/(tt[0-9]+)/); const tmdbRegex = new RegExp(/tmdb:\/\/([0-9]+)/); -const tvdbRegex = new RegExp(/tvdb:\/\/([0-9]+)/); +const tvdbRegex = new RegExp(/tvdb:\/\/([0-9]+)|hama:\/\/tvdb-([0-9]+)/); const tmdbShowRegex = new RegExp(/themoviedb:\/\/([0-9]+)/); const plexRegex = new RegExp(/plex:\/\//); From 4205e32ae71bc18c07209f1c82e6af1cb5f01335 Mon Sep 17 00:00:00 2001 From: sct Date: Tue, 22 Dec 2020 22:37:18 +0900 Subject: [PATCH 04/16] fix(plex-sync): match correct tmdb format for movies --- server/job/plexsync/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/job/plexsync/index.ts b/server/job/plexsync/index.ts index 50ce766c..3f600c38 100644 --- a/server/job/plexsync/index.ts +++ b/server/job/plexsync/index.ts @@ -100,7 +100,7 @@ class JobPlexSync { let tmdbMovie: TmdbMovieDetails | undefined; const imdbMatch = plexitem.guid.match(imdbRegex); - const tmdbMatch = plexitem.guid.match(tmdbRegex); + const tmdbMatch = plexitem.guid.match(tmdbShowRegex); if (imdbMatch) { tmdbMovie = await this.tmdb.getMovieByImdbId({ From 659fa505f0db32262ad0041cddb4daea893e6d65 Mon Sep 17 00:00:00 2001 From: sct Date: Wed, 23 Dec 2020 00:25:44 +0900 Subject: [PATCH 05/16] feat(notifications): include direct links to media in notifications closes #437 --- server/entity/MediaRequest.ts | 4 +++ server/lib/notifications/agents/agent.ts | 2 ++ server/lib/notifications/agents/discord.ts | 26 +++++++++++++++++-- server/lib/notifications/agents/email.ts | 17 +++++++++--- server/subscriber/MediaSubscriber.ts | 2 ++ server/templates/email/media-request/html.pug | 4 +-- server/templates/email/test-email/html.pug | 4 +-- 7 files changed, 49 insertions(+), 10 deletions(-) diff --git a/server/entity/MediaRequest.ts b/server/entity/MediaRequest.ts index e5c99367..09a80680 100644 --- a/server/entity/MediaRequest.ts +++ b/server/entity/MediaRequest.ts @@ -88,6 +88,7 @@ export class MediaRequest { message: movie.overview, image: `https://image.tmdb.org/t/p/w600_and_h900_bestv2${movie.poster_path}`, notifyUser: this.requestedBy, + media, }); } @@ -98,6 +99,7 @@ export class MediaRequest { message: tv.overview, image: `https://image.tmdb.org/t/p/w600_and_h900_bestv2${tv.poster_path}`, notifyUser: this.requestedBy, + media, extra: [ { name: 'Seasons', @@ -136,6 +138,7 @@ export class MediaRequest { message: movie.overview, image: `https://image.tmdb.org/t/p/w600_and_h900_bestv2${movie.poster_path}`, notifyUser: this.requestedBy, + media, }); } else if (this.media.mediaType === MediaType.TV) { const tv = await tmdb.getTvShow({ tvId: this.media.tmdbId }); @@ -144,6 +147,7 @@ export class MediaRequest { message: tv.overview, image: `https://image.tmdb.org/t/p/w600_and_h900_bestv2${tv.poster_path}`, notifyUser: this.requestedBy, + media, extra: [ { name: 'Seasons', diff --git a/server/lib/notifications/agents/agent.ts b/server/lib/notifications/agents/agent.ts index d04cabf0..98daf106 100644 --- a/server/lib/notifications/agents/agent.ts +++ b/server/lib/notifications/agents/agent.ts @@ -1,10 +1,12 @@ import { Notification } from '..'; +import Media from '../../../entity/Media'; import { User } from '../../../entity/User'; import { NotificationAgentConfig } from '../../settings'; export interface NotificationPayload { subject: string; notifyUser: User; + media?: Media; image?: string; message?: string; extra?: { name: string; value: string }[]; diff --git a/server/lib/notifications/agents/discord.ts b/server/lib/notifications/agents/discord.ts index 08239980..a0df2c4c 100644 --- a/server/lib/notifications/agents/discord.ts +++ b/server/lib/notifications/agents/discord.ts @@ -93,7 +93,8 @@ class DiscordAgent type: Notification, payload: NotificationPayload ): DiscordRichEmbed { - let color = EmbedColors.DEFAULT; + const settings = getSettings(); + let color = EmbedColors.DARK_PURPLE; const fields: Field[] = []; @@ -112,6 +113,13 @@ class DiscordAgent inline: true, } ); + + if (settings.main.applicationUrl) { + fields.push({ + name: 'View Media', + value: `${settings.main.applicationUrl}/${payload.media?.mediaType}/${payload.media?.tmdbId}`, + }); + } break; case Notification.MEDIA_APPROVED: color = EmbedColors.PURPLE; @@ -127,6 +135,13 @@ class DiscordAgent inline: true, } ); + + if (settings.main.applicationUrl) { + fields.push({ + name: 'View Media', + value: `${settings.main.applicationUrl}/${payload.media?.mediaType}/${payload.media?.tmdbId}`, + }); + } break; case Notification.MEDIA_AVAILABLE: color = EmbedColors.GREEN; @@ -142,6 +157,13 @@ class DiscordAgent inline: true, } ); + + if (settings.main.applicationUrl) { + fields.push({ + name: 'View Media', + value: `${settings.main.applicationUrl}/${payload.media?.mediaType}/${payload.media?.tmdbId}`, + }); + } break; } @@ -150,7 +172,7 @@ class DiscordAgent description: payload.message, color, timestamp: new Date().toISOString(), - author: { name: 'Overseerr' }, + author: { name: 'Overseerr', url: settings.main.applicationUrl }, fields: [ ...fields, // If we have extra data, map it to fields for discord notifications diff --git a/server/lib/notifications/agents/email.ts b/server/lib/notifications/agents/email.ts index 354a5150..6af5b37c 100644 --- a/server/lib/notifications/agents/email.ts +++ b/server/lib/notifications/agents/email.ts @@ -89,7 +89,10 @@ class EmailAgent imageUrl: payload.image, timestamp: new Date().toTimeString(), requestedBy: payload.notifyUser.username, - actionUrl: applicationUrl, + actionUrl: applicationUrl + ? `${applicationUrl}/${payload.media?.mediaType}/${payload.media?.tmdbId}` + : undefined, + applicationUrl, requestType: 'New Request', }, }); @@ -124,7 +127,10 @@ class EmailAgent imageUrl: payload.image, timestamp: new Date().toTimeString(), requestedBy: payload.notifyUser.username, - actionUrl: applicationUrl, + actionUrl: applicationUrl + ? `${applicationUrl}/${payload.media?.mediaType}/${payload.media?.tmdbId}` + : undefined, + applicationUrl, requestType: 'Request Approved', }, }); @@ -158,7 +164,10 @@ class EmailAgent imageUrl: payload.image, timestamp: new Date().toTimeString(), requestedBy: payload.notifyUser.username, - actionUrl: applicationUrl, + actionUrl: applicationUrl + ? `${applicationUrl}/${payload.media?.mediaType}/${payload.media?.tmdbId}` + : undefined, + applicationUrl, requestType: 'Now Available', }, }); @@ -185,7 +194,7 @@ class EmailAgent }, locals: { body: payload.message, - actionUrl: applicationUrl, + applicationUrl, }, }); return true; diff --git a/server/subscriber/MediaSubscriber.ts b/server/subscriber/MediaSubscriber.ts index f63b14f6..fe826284 100644 --- a/server/subscriber/MediaSubscriber.ts +++ b/server/subscriber/MediaSubscriber.ts @@ -29,6 +29,7 @@ export class MediaSubscriber implements EntitySubscriberInterface { notifyUser: request.requestedBy, subject: movie.title, message: movie.overview, + media: entity, image: `https://image.tmdb.org/t/p/w600_and_h900_bestv2${movie.poster_path}`, }); }); @@ -79,6 +80,7 @@ export class MediaSubscriber implements EntitySubscriberInterface { message: tv.overview, notifyUser: request.requestedBy, image: `https://image.tmdb.org/t/p/w600_and_h900_bestv2${tv.poster_path}`, + media: entity, extra: [ { name: 'Seasons', diff --git a/server/templates/email/media-request/html.pug b/server/templates/email/media-request/html.pug index f87537d6..5304d41b 100644 --- a/server/templates/email/media-request/html.pug +++ b/server/templates/email/media-request/html.pug @@ -47,7 +47,7 @@ div(role='article' aria-roledescription='email' aria-label='' lang='en') padding-bottom: 25px;\ text-align: center;\ ') - a(href=actionUrl style='\ + a(href=applicationUrl style='\ text-shadow: 0 1px 0 #ffffff;\ font-weight: 700;\ font-size: 16px;\ @@ -92,7 +92,7 @@ div(role='article' aria-roledescription='email' aria-label='' lang='en') margin-bottom: 20px;\ color: #51545e;\ ') - a(href=actionUrl style='color: #3869d4') Open Overseerr + a(href=actionUrl style='color: #3869d4') Open Media in Overseerr tr td table.sm-w-full(align='center' style='\ diff --git a/server/templates/email/test-email/html.pug b/server/templates/email/test-email/html.pug index 46f4ca2c..d9f6063d 100644 --- a/server/templates/email/test-email/html.pug +++ b/server/templates/email/test-email/html.pug @@ -47,7 +47,7 @@ div(role='article' aria-roledescription='email' aria-label='' lang='en') padding-bottom: 25px;\ text-align: center;\ ') - a(href=actionUrl style='\ + a(href=applicationUrl style='\ text-shadow: 0 1px 0 #ffffff;\ font-weight: 700;\ font-size: 16px;\ @@ -74,7 +74,7 @@ div(role='article' aria-roledescription='email' aria-label='' lang='en') margin-bottom: 20px;\ color: #51545e;\ ') - a(href=actionUrl style='color: #3869d4') Open Overseerr + a(href=applicationUrl style='color: #3869d4') Open Overseerr tr td table.sm-w-full(align='center' style='\ From 22002ab4c76aace2bb202ac58da605b7a6f75d6d Mon Sep 17 00:00:00 2001 From: sct Date: Wed, 23 Dec 2020 00:58:33 +0900 Subject: [PATCH 06/16] feat(logs): rotate log files if they reach 20MB in size closes #438 --- .gitignore | 2 +- server/logger.ts | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index ebd30895..70bef39d 100644 --- a/.gitignore +++ b/.gitignore @@ -36,7 +36,7 @@ config/db/db.sqlite3 config/settings.json # logs -config/logs/*.log +config/logs/*.log* # dist files dist diff --git a/server/logger.ts b/server/logger.ts index e865163c..06c7d025 100644 --- a/server/logger.ts +++ b/server/logger.ts @@ -16,15 +16,23 @@ const hformat = winston.format.printf( const logger = winston.createLogger({ level: process.env.LOG_LEVEL || 'debug', format: winston.format.combine( - winston.format.colorize(), winston.format.splat(), winston.format.timestamp(), hformat ), transports: [ - new winston.transports.Console(), + new winston.transports.Console({ + format: winston.format.combine( + winston.format.colorize(), + winston.format.splat(), + winston.format.timestamp(), + hformat + ), + }), new winston.transports.File({ filename: path.join(__dirname, '../config/logs/overseerr.log'), + maxsize: 20971520, + maxFiles: 6, }), ], }); From 32b4c99950659d9e1da2ffa93c22383c54d0d904 Mon Sep 17 00:00:00 2001 From: sct Date: Wed, 23 Dec 2020 01:13:29 +0900 Subject: [PATCH 07/16] fix(api): correctly return firstAirDate for series in search endpoints fixes #462 --- server/api/themoviedb.ts | 2 +- server/models/Search.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server/api/themoviedb.ts b/server/api/themoviedb.ts index 0f876396..43f9f364 100644 --- a/server/api/themoviedb.ts +++ b/server/api/themoviedb.ts @@ -71,7 +71,7 @@ export interface TmdbTvResult extends TmdbMediaResult { name: string; original_name: string; origin_country: string[]; - first_air_Date: string; + first_air_date: string; } export interface TmdbPersonResult { diff --git a/server/models/Search.ts b/server/models/Search.ts index 72e647e9..68d8dab8 100644 --- a/server/models/Search.ts +++ b/server/models/Search.ts @@ -78,7 +78,7 @@ export const mapTvResult = ( media?: Media ): TvResult => ({ id: tvResult.id, - firstAirDate: tvResult.first_air_Date, + firstAirDate: tvResult.first_air_date, genreIds: tvResult.genre_ids, // Some results from tmdb dont return the mediaType so we force it here! mediaType: tvResult.media_type || 'tv', From 0980fa54f9fc3bdfae6c57fa5a20ce3b2a88a677 Mon Sep 17 00:00:00 2001 From: sct Date: Wed, 23 Dec 2020 01:34:29 +0900 Subject: [PATCH 08/16] fix(email): correctly log errors when emails fail to send --- server/lib/notifications/agents/email.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/lib/notifications/agents/email.ts b/server/lib/notifications/agents/email.ts index 6af5b37c..7f166cf2 100644 --- a/server/lib/notifications/agents/email.ts +++ b/server/lib/notifications/agents/email.ts @@ -113,7 +113,7 @@ class EmailAgent try { const email = this.getNewEmail(); - email.send({ + await email.send({ template: path.join( __dirname, '../../../templates/email/media-request' @@ -150,7 +150,7 @@ class EmailAgent try { const email = this.getNewEmail(); - email.send({ + await email.send({ template: path.join( __dirname, '../../../templates/email/media-request' @@ -187,7 +187,7 @@ class EmailAgent try { const email = this.getNewEmail(); - email.send({ + await email.send({ template: path.join(__dirname, '../../../templates/email/test-email'), message: { to: payload.notifyUser.email, From 0c8a180189b2610bab2fa977d458743d8a60343e Mon Sep 17 00:00:00 2001 From: sct Date: Wed, 23 Dec 2020 01:40:46 +0900 Subject: [PATCH 09/16] fix: clarify full sync runs every 24 hours --- server/job/schedule.ts | 2 +- src/components/Settings/SettingsPlex.tsx | 52 ++++++++++++------------ src/i18n/locale/en.json | 2 +- 3 files changed, 28 insertions(+), 28 deletions(-) diff --git a/server/job/schedule.ts b/server/job/schedule.ts index 4ce2f8f8..82945a46 100644 --- a/server/job/schedule.ts +++ b/server/job/schedule.ts @@ -20,7 +20,7 @@ export const startJobs = (): void => { jobPlexRecentSync.run(); }), }); - // Run full plex sync every 6 hours + // Run full plex sync every 24 hours scheduledJobs.push({ name: 'Plex Full Library Sync', job: schedule.scheduleJob('0 0 3 * * *', () => { diff --git a/src/components/Settings/SettingsPlex.tsx b/src/components/Settings/SettingsPlex.tsx index 0fa23ad3..122d8d84 100644 --- a/src/components/Settings/SettingsPlex.tsx +++ b/src/components/Settings/SettingsPlex.tsx @@ -28,7 +28,7 @@ const messages = defineMessages({ sync: 'Sync Plex Libraries', manualscan: 'Manual Library Scan', manualscanDescription: - "Normally, this will only be run once every 6 hours. Overseerr will check your Plex server's recently added more aggressively. If this is your first time configuring Plex, a one time full manual library scan is recommended!", + "Normally, this will only be run once every 24 hours. Overseerr will check your Plex server's recently added more aggressively. If this is your first time configuring Plex, a one time full manual library scan is recommended!", notrunning: 'Not Running', currentlibrary: 'Current Library: {name}', librariesRemaining: 'Libraries Remaining: {count}', @@ -143,10 +143,10 @@ const SettingsPlex: React.FC = ({ onComplete }) => { return ( <>
-

+

-

+

@@ -188,7 +188,7 @@ const SettingsPlex: React.FC = ({ onComplete }) => {
{submitError && ( -
+
{submitError}
)} @@ -200,7 +200,7 @@ const SettingsPlex: React.FC = ({ onComplete }) => {
-
+
= ({ onComplete }) => { )} value={data?.name} readOnly - className="flex-1 form-input block w-full min-w-0 rounded-md transition duration-150 ease-in-out sm:text-sm sm:leading-5 bg-gray-700 border border-gray-500" + className="flex-1 block w-full min-w-0 transition duration-150 ease-in-out bg-gray-700 border border-gray-500 rounded-md form-input sm:text-sm sm:leading-5" />
@@ -223,8 +223,8 @@ const SettingsPlex: React.FC = ({ onComplete }) => {
-
- +
+ {values.useSsl ? 'https://' : 'http://'} = ({ onComplete }) => { id="hostname" name="hostname" placeholder="127.0.0.1" - className="flex-1 form-input block w-full min-w-0 rounded-r-md transition duration-150 ease-in-out sm:text-sm sm:leading-5 bg-gray-700 border border-gray-500" + className="flex-1 block w-full min-w-0 transition duration-150 ease-in-out bg-gray-700 border border-gray-500 form-input rounded-r-md sm:text-sm sm:leading-5" />
{errors.hostname && touched.hostname && ( -
{errors.hostname}
+
{errors.hostname}
)}
@@ -254,11 +254,11 @@ const SettingsPlex: React.FC = ({ onComplete }) => { id="port" name="port" placeholder="32400" - className="form-input block w-24 rounded-md transition duration-150 ease-in-out sm:text-sm sm:leading-5 bg-gray-700 border border-gray-500" + className="block w-24 transition duration-150 ease-in-out bg-gray-700 border border-gray-500 rounded-md form-input sm:text-sm sm:leading-5" />
{errors.port && touched.port && ( -
{errors.port}
+
{errors.port}
)}
@@ -278,13 +278,13 @@ const SettingsPlex: React.FC = ({ onComplete }) => { onChange={() => { setFieldValue('useSsl', !values.useSsl); }} - className="form-checkbox h-6 w-6 rounded-md text-indigo-600 transition duration-150 ease-in-out" + className="w-6 h-6 text-indigo-600 transition duration-150 ease-in-out rounded-md form-checkbox" />
-
+
- +
-
    +
      {data?.libraries.map((library) => ( = ({ onComplete }) => {
-

+

-

+

-
-
+
+
{dataSync?.running && (
= ({ onComplete }) => { }} /> )} -
+
{dataSync?.running ? `${dataSync.progress} of ${dataSync.total}` @@ -366,10 +366,10 @@ const SettingsPlex: React.FC = ({ onComplete }) => {
-
+
{dataSync?.running && ( <> -
+
Date: Tue, 22 Dec 2020 22:15:05 -0500 Subject: [PATCH 10/16] feat(frontend): first air date added to TV details page (#470) --- src/components/TvDetails/index.tsx | 23 ++++++++++++++++++++++- src/i18n/locale/en.json | 1 + 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/components/TvDetails/index.tsx b/src/components/TvDetails/index.tsx index d374c85e..4d4330d6 100644 --- a/src/components/TvDetails/index.tsx +++ b/src/components/TvDetails/index.tsx @@ -1,5 +1,10 @@ import React, { useState, useContext, useMemo } from 'react'; -import { FormattedMessage, defineMessages, useIntl } from 'react-intl'; +import { + FormattedMessage, + FormattedDate, + defineMessages, + useIntl, +} from 'react-intl'; import useSWR from 'swr'; import { useRouter } from 'next/router'; import Button from '../Common/Button'; @@ -34,6 +39,7 @@ import { sortCrewPriority } from '../../utils/creditHelpers'; import { Crew } from '../../../server/models/common'; const messages = defineMessages({ + firstAirDate: 'First Air Date', userrating: 'User Rating', status: 'Status', originallanguage: 'Original Language', @@ -519,6 +525,21 @@ const TvDetails: React.FC = ({ tv }) => {
)} + {data.firstAirDate && ( +
+ + + + + + +
+ )}
diff --git a/src/i18n/locale/en.json b/src/i18n/locale/en.json index 4f3a9227..cb6def44 100644 --- a/src/i18n/locale/en.json +++ b/src/i18n/locale/en.json @@ -289,6 +289,7 @@ "components.TvDetails.cast": "Cast", "components.TvDetails.decline": "Decline", "components.TvDetails.declinerequests": "Decline {requestCount} {requestCount, plural, one {Request} other {Requests}}", + "components.TvDetails.firstAirDate": "First Air Date", "components.TvDetails.manageModalClearMedia": "Clear All Media Data", "components.TvDetails.manageModalClearMediaWarning": "This will remove all media data including all requests for this item, irreversibly. If this item exists in your Plex library, the media info will be recreated next sync.", "components.TvDetails.manageModalNoRequests": "No Requests", From 6898357b13a6aa53a55709ea95819c2b3df6784c Mon Sep 17 00:00:00 2001 From: sct Date: Wed, 23 Dec 2020 12:18:40 +0900 Subject: [PATCH 11/16] feat(email): option to allow self signed certificates --- overseerr-api.yml | 4 +- server/lib/notifications/agents/email.ts | 5 ++ server/lib/settings.ts | 4 +- .../Notifications/NotificationsEmail.tsx | 78 ++++++++++++------- src/i18n/locale/en.json | 2 + 5 files changed, 65 insertions(+), 28 deletions(-) diff --git a/overseerr-api.yml b/overseerr-api.yml index 268fa896..f6d6aab5 100644 --- a/overseerr-api.yml +++ b/overseerr-api.yml @@ -824,7 +824,9 @@ components: authPass: type: string nullable: true - + allowSelfSigned: + type: boolean + example: false PersonDetail: type: object properties: diff --git a/server/lib/notifications/agents/email.ts b/server/lib/notifications/agents/email.ts index 7f166cf2..90755e92 100644 --- a/server/lib/notifications/agents/email.ts +++ b/server/lib/notifications/agents/email.ts @@ -41,6 +41,11 @@ class EmailAgent host: emailSettings.smtpHost, port: emailSettings.smtpPort, secure: emailSettings.secure, + tls: emailSettings.allowSelfSigned + ? { + rejectUnauthorized: false, + } + : undefined, auth: emailSettings.authUser && emailSettings.authPass ? { diff --git a/server/lib/settings.ts b/server/lib/settings.ts index 4b075af8..b0d2c45f 100644 --- a/server/lib/settings.ts +++ b/server/lib/settings.ts @@ -74,6 +74,7 @@ export interface NotificationAgentEmail extends NotificationAgentConfig { secure: boolean; authUser?: string; authPass?: string; + allowSelfSigned: boolean; }; } @@ -129,8 +130,9 @@ class Settings { options: { emailFrom: '', smtpHost: '127.0.0.1', - smtpPort: 465, + smtpPort: 587, secure: false, + allowSelfSigned: false, }, }, discord: { diff --git a/src/components/Settings/Notifications/NotificationsEmail.tsx b/src/components/Settings/Notifications/NotificationsEmail.tsx index 30459420..abcb22da 100644 --- a/src/components/Settings/Notifications/NotificationsEmail.tsx +++ b/src/components/Settings/Notifications/NotificationsEmail.tsx @@ -25,6 +25,9 @@ const messages = defineMessages({ emailsettingsfailed: 'Email notification settings failed to save.', test: 'Test', testsent: 'Test notification sent!', + allowselfsigned: 'Allow Self-Signed Certificates', + ssldisabletip: + 'SSL should be disabled on standard TLS connections (Port 587)', }); const NotificationsEmail: React.FC = () => { @@ -61,6 +64,7 @@ const NotificationsEmail: React.FC = () => { secure: data.options.secure, authUser: data.options.authUser, authPass: data.options.authPass, + allowSelfSigned: data.options.allowSelfSigned, }} validationSchema={NotificationsDiscordSchema} onSubmit={async (values) => { @@ -75,6 +79,7 @@ const NotificationsEmail: React.FC = () => { secure: values.secure, authUser: values.authUser, authPass: values.authPass, + allowSelfSigned: values.allowSelfSigned, }, }); addToast(intl.formatMessage(messages.emailsettingssaved), { @@ -116,7 +121,7 @@ const NotificationsEmail: React.FC = () => {
-
+
{errors.emailFrom && touched.emailFrom && ( -
{errors.emailFrom}
+
{errors.emailFrom}
)}
-
+
{errors.smtpHost && touched.smtpHost && ( -
{errors.smtpHost}
+
{errors.smtpHost}
)}
-
+
{errors.smtpPort && touched.smtpPort && ( -
{errors.smtpPort}
+
{errors.smtpPort}
)}
+
+
+
+ +
+
-
+
-
+
-
+
- + - +
From 1fb7ea72589d2908ae80a2a688881d4eb3c050e5 Mon Sep 17 00:00:00 2001 From: sct Date: Wed, 23 Dec 2020 16:02:55 +0900 Subject: [PATCH 13/16] feat(frontend): adjust person details design and add improved truncate --- package.json | 1 + src/assets/ellipsis.svg | 6 +++ src/components/Common/ImageFader/index.tsx | 18 +++++++- src/components/PersonDetails/index.tsx | 49 +++++++++++++++------- tailwind.config.js | 2 +- yarn.lock | 34 ++++++++++++++- 6 files changed, 90 insertions(+), 20 deletions(-) create mode 100644 src/assets/ellipsis.svg diff --git a/package.json b/package.json index f911a453..ac024cec 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "react-spring": "^8.0.27", "react-toast-notifications": "^2.4.0", "react-transition-group": "^4.4.1", + "react-truncate-markup": "^5.0.1", "react-use-clipboard": "1.0.2", "reflect-metadata": "^0.1.13", "sqlite3": "^5.0.0", diff --git a/src/assets/ellipsis.svg b/src/assets/ellipsis.svg new file mode 100644 index 00000000..2c286cb0 --- /dev/null +++ b/src/assets/ellipsis.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/components/Common/ImageFader/index.tsx b/src/components/Common/ImageFader/index.tsx index 4ccb9711..902e9a28 100644 --- a/src/components/Common/ImageFader/index.tsx +++ b/src/components/Common/ImageFader/index.tsx @@ -8,12 +8,18 @@ import React, { interface ImageFaderProps extends HTMLAttributes { backgroundImages: string[]; rotationSpeed?: number; + isDarker?: boolean; } const DEFAULT_ROTATION_SPEED = 6000; const ImageFader: ForwardRefRenderFunction = ( - { backgroundImages, rotationSpeed = DEFAULT_ROTATION_SPEED, ...props }, + { + backgroundImages, + rotationSpeed = DEFAULT_ROTATION_SPEED, + isDarker, + ...props + }, ref ) => { const [activeIndex, setIndex] = useState(0); @@ -29,6 +35,14 @@ const ImageFader: ForwardRefRenderFunction = ( }; }, [backgroundImages, rotationSpeed]); + let gradient = + 'linear-gradient(180deg, rgba(45, 55, 72, 0.47) 0%, #1A202E 100%)'; + + if (isDarker) { + gradient = + 'linear-gradient(180deg, rgba(17, 24, 39, 0.47) 0%, rgba(17, 24, 39, 1) 100%)'; + } + return (
{backgroundImages.map((imageUrl, i) => ( @@ -38,7 +52,7 @@ const ImageFader: ForwardRefRenderFunction = ( i === activeIndex ? 'opacity-100' : 'opacity-0' }`} style={{ - backgroundImage: `linear-gradient(180deg, rgba(45, 55, 72, 0.47) 0%, #1A202E 100%), url(${imageUrl})`, + backgroundImage: `${gradient}, url(${imageUrl})`, }} {...props} /> diff --git a/src/components/PersonDetails/index.tsx b/src/components/PersonDetails/index.tsx index c0582969..1121a13c 100644 --- a/src/components/PersonDetails/index.tsx +++ b/src/components/PersonDetails/index.tsx @@ -1,5 +1,6 @@ import { useRouter } from 'next/router'; import React, { useContext, useState } from 'react'; +import TruncateMarkup from 'react-truncate-markup'; import useSWR from 'swr'; import type { PersonDetail } from '../../../server/models/Person'; import type { PersonCombinedCreditsResponse } from '../../../server/interfaces/api/personInterfaces'; @@ -8,6 +9,8 @@ import LoadingSpinner from '../Common/LoadingSpinner'; import TitleCard from '../TitleCard'; import { defineMessages, useIntl } from 'react-intl'; import { LanguageContext } from '../../context/LanguageContext'; +import ImageFader from '../Common/ImageFader'; +import Ellipsis from '../../assets/ellipsis.svg'; const messages = defineMessages({ appearsin: 'Appears in', @@ -74,7 +77,21 @@ const PersonDetails: React.FC = () => { return ( <> -
+ {(sortedCrew || sortedCast) && ( +
+ media.posterPath) + .map( + (media) => + `//image.tmdb.org/t/p/w1920_and_h800_multi_faces/${media.posterPath}` + ) + .slice(0, 6)} + /> +
+ )} +
{data.profilePath && (
{
{/* eslint-disable-next-line jsx-a11y/click-events-have-key-events */}
setShowBio((show) => !show)} role="button" tabIndex={-1} > -
- {data.biography - ? data.biography - : intl.formatMessage(messages.nobiography)} -
- {!showBio && ( -
- )} + + } + > +
+ {data.biography + ? data.biography + : intl.formatMessage(messages.nobiography)} +
+
{(sortedCast ?? []).length > 0 && ( <> -
+
{intl.formatMessage(messages.appearsin)} @@ -157,7 +174,7 @@ const PersonDetails: React.FC = () => { )} {(sortedCrew ?? []).length > 0 && ( <> -
+
{intl.formatMessage(messages.crewmember)} diff --git a/tailwind.config.js b/tailwind.config.js index 94b25a79..79a78e78 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -62,7 +62,7 @@ module.exports = { borderWidth: ['first', 'last'], margin: ['first', 'last', 'responsive'], boxShadow: ['group-focus'], - opacity: ['disabled', 'hover'], + opacity: ['disabled', 'hover', 'group-hover'], }, plugins: [ require('@tailwindcss/forms'), diff --git a/yarn.lock b/yarn.lock index e281a3ab..47865d02 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4162,6 +4162,11 @@ compose-function@3.0.3: dependencies: arity-n "^1.0.4" +computed-style@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/computed-style/-/computed-style-0.1.4.tgz#7f344fd8584b2e425bedca4a1afc0e300bb05d74" + integrity sha1-fzRP2FhLLkJb7cpKGvwOMAuwXXQ= + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -8155,6 +8160,13 @@ line-column@^1.0.2: isarray "^1.0.0" isobject "^2.0.0" +line-height@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/line-height/-/line-height-0.3.1.tgz#4b1205edde182872a5efa3c8f620b3187a9c54c9" + integrity sha1-SxIF7d4YKHKl76PI9iCzGHqcVMk= + dependencies: + computed-style "~0.1.3" + lines-and-columns@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" @@ -8713,6 +8725,11 @@ mem@^1.1.0: dependencies: mimic-fn "^1.0.0" +memoize-one@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.1.1.tgz#047b6e3199b508eaec03504de71229b8eb1d75c0" + integrity sha512-HKeeBpWvqiVJD57ZUAsJNm71eHTykffzcLZVYWiVfQeI1rJtuEaS7hQiEpWfVVk18donPwJEcFKIkCmPJNOhHA== + memory-fs@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" @@ -11019,7 +11036,7 @@ promzard@^0.3.0: dependencies: read "1" -prop-types@15.7.2, prop-types@^15.5.8, prop-types@^15.6.2, prop-types@^15.7.2: +prop-types@15.7.2, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -11448,6 +11465,16 @@ react-transition-group@^4.3.0, react-transition-group@^4.4.1: loose-envify "^1.4.0" prop-types "^15.6.2" +react-truncate-markup@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/react-truncate-markup/-/react-truncate-markup-5.0.1.tgz#5c52bda712f7e185e84969b2b79440ec8b422441" + integrity sha512-WG1E9FLyTrq5ERaDbIq0DjWVs3JrAdr93fasdQqbVlEifBUp27kGM7ws4xCBIh2keDjumTPjw3iiHNNmD+YtcQ== + dependencies: + line-height "0.3.1" + memoize-one "^5.1.1" + prop-types "^15.6.0" + resize-observer-polyfill "1.5.x" + react-use-clipboard@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/react-use-clipboard/-/react-use-clipboard-1.0.2.tgz#e00254ffc70b989daa41638325fa6557c7b89dd2" @@ -11852,6 +11879,11 @@ require-main-filename@^2.0.0: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== +resize-observer-polyfill@1.5.x: + version "1.5.1" + resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" + integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== + resolve-dir@^1.0.0, resolve-dir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" From 9f5f920c23007363aa7f53ebef0b61236d4f53ea Mon Sep 17 00:00:00 2001 From: sct Date: Wed, 23 Dec 2020 16:14:39 +0900 Subject: [PATCH 14/16] fix(frontend): show backdrops instead of posters for new person detail design --- src/components/PersonDetails/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/PersonDetails/index.tsx b/src/components/PersonDetails/index.tsx index 1121a13c..3609a026 100644 --- a/src/components/PersonDetails/index.tsx +++ b/src/components/PersonDetails/index.tsx @@ -81,11 +81,11 @@ const PersonDetails: React.FC = () => {
media.posterPath) .map( (media) => - `//image.tmdb.org/t/p/w1920_and_h800_multi_faces/${media.posterPath}` + `//image.tmdb.org/t/p/w1920_and_h800_multi_faces/${media.backdropPath}` ) .slice(0, 6)} /> From 2e0e4d5129ed4912415f61eb8d1da41e88ddcaff Mon Sep 17 00:00:00 2001 From: sct Date: Wed, 23 Dec 2020 17:18:00 +0900 Subject: [PATCH 15/16] fix(frontend): filter out undefined backdrop paths for person details page --- src/components/PersonDetails/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/PersonDetails/index.tsx b/src/components/PersonDetails/index.tsx index 3609a026..7eb32fa0 100644 --- a/src/components/PersonDetails/index.tsx +++ b/src/components/PersonDetails/index.tsx @@ -82,7 +82,7 @@ const PersonDetails: React.FC = () => { media.posterPath) + .filter((media) => media.backdropPath) .map( (media) => `//image.tmdb.org/t/p/w1920_and_h800_multi_faces/${media.backdropPath}` From 941fe1990454439cf05b48ef92bd3493432f8ed8 Mon Sep 17 00:00:00 2001 From: "Weblate (bot)" Date: Wed, 23 Dec 2020 13:38:11 +0100 Subject: [PATCH 16/16] feat(lang): translations update from Weblate (#410) * feat(lang): translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (374 of 374 strings) feat(lang): translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (374 of 374 strings) feat(lang): translated using Weblate (Portuguese (Brazil)) Currently translated at 99.7% (364 of 365 strings) feat(lang): translated using Weblate (Portuguese (Brazil)) Currently translated at 81.8% (297 of 363 strings) feat(lang): translated using Weblate (Portuguese (Brazil)) Currently translated at 73.0% (265 of 363 strings) Co-authored-by: Hosted Weblate Co-authored-by: Tijuco Translate-URL: https://hosted.weblate.org/projects/overseerr/overseerr-frontend/pt_BR/ Translation: Overseerr/Overseerr Frontend * feat(lang): translated using Weblate (French) Currently translated at 100.0% (377 of 377 strings) feat(lang): translated using Weblate (French) Currently translated at 100.0% (374 of 374 strings) feat(lang): translated using Weblate (French) Currently translated at 100.0% (374 of 374 strings) feat(lang): translated using Weblate (French) Currently translated at 99.7% (368 of 369 strings) feat(lang): translated using Weblate (French) Currently translated at 100.0% (366 of 366 strings) feat(lang): translated using Weblate (French) Currently translated at 100.0% (365 of 365 strings) feat(lang): translated using Weblate (French) Currently translated at 100.0% (363 of 363 strings) Co-authored-by: Hosted Weblate Co-authored-by: J. Lavoie Co-authored-by: K. Herbert Translate-URL: https://hosted.weblate.org/projects/overseerr/overseerr-frontend/fr/ Translation: Overseerr/Overseerr Frontend * feat(lang): translated using Weblate (Swedish) Currently translated at 97.8% (366 of 374 strings) feat(lang): translated using Weblate (Swedish) Currently translated at 100.0% (365 of 365 strings) feat(lang): translated using Weblate (Swedish) Currently translated at 100.0% (363 of 363 strings) Co-authored-by: Hosted Weblate Co-authored-by: Luna Jernberg Co-authored-by: sebstrgg Translate-URL: https://hosted.weblate.org/projects/overseerr/overseerr-frontend/sv/ Translation: Overseerr/Overseerr Frontend * feat(lang): translated using Weblate (Italian) Currently translated at 99.7% (376 of 377 strings) feat(lang): translated using Weblate (Italian) Currently translated at 100.0% (374 of 374 strings) feat(lang): translated using Weblate (Italian) Currently translated at 100.0% (374 of 374 strings) feat(lang): translated using Weblate (Italian) Currently translated at 100.0% (374 of 374 strings) feat(lang): translated using Weblate (Italian) Currently translated at 99.7% (368 of 369 strings) feat(lang): translated using Weblate (Italian) Currently translated at 100.0% (366 of 366 strings) feat(lang): translated using Weblate (Italian) Currently translated at 100.0% (365 of 365 strings) feat(lang): translated using Weblate (Italian) Currently translated at 100.0% (363 of 363 strings) feat(lang): translated using Weblate (Italian) Currently translated at 100.0% (363 of 363 strings) Co-authored-by: Hosted Weblate Co-authored-by: J. Lavoie Co-authored-by: K. Herbert Co-authored-by: Simone Chiavaccini Translate-URL: https://hosted.weblate.org/projects/overseerr/overseerr-frontend/it/ Translation: Overseerr/Overseerr Frontend * feat(lang): translated using Weblate (Spanish) Currently translated at 100.0% (366 of 366 strings) Co-authored-by: Hosted Weblate Co-authored-by: Shutruk Translate-URL: https://hosted.weblate.org/projects/overseerr/overseerr-frontend/es/ Translation: Overseerr/Overseerr Frontend * feat(lang): translated using Weblate (German) Currently translated at 100.0% (377 of 377 strings) feat(lang): translated using Weblate (German) Currently translated at 100.0% (374 of 374 strings) feat(lang): translated using Weblate (German) Currently translated at 100.0% (374 of 374 strings) feat(lang): translated using Weblate (German) Currently translated at 99.7% (368 of 369 strings) feat(lang): translated using Weblate (German) Currently translated at 100.0% (366 of 366 strings) feat(lang): translated using Weblate (German) Currently translated at 100.0% (365 of 365 strings) feat(lang): translated using Weblate (German) Currently translated at 100.0% (363 of 363 strings) Co-authored-by: Hosted Weblate Co-authored-by: J. Lavoie Co-authored-by: K. Herbert Translate-URL: https://hosted.weblate.org/projects/overseerr/overseerr-frontend/de/ Translation: Overseerr/Overseerr Frontend * feat(lang): translated using Weblate (Dutch) Currently translated at 93.4% (341 of 365 strings) Co-authored-by: BodingClockchian Co-authored-by: Hosted Weblate Translate-URL: https://hosted.weblate.org/projects/overseerr/overseerr-frontend/nl/ Translation: Overseerr/Overseerr Frontend * feat(lang): translated using Weblate (Japanese) Currently translated at 98.1% (367 of 374 strings) feat(lang): translated using Weblate (Japanese) Currently translated at 100.0% (366 of 366 strings) feat(lang): translated using Weblate (Japanese) Currently translated at 95.9% (351 of 366 strings) Co-authored-by: Hosted Weblate Co-authored-by: T'ai Translate-URL: https://hosted.weblate.org/projects/overseerr/overseerr-frontend/ja/ Translation: Overseerr/Overseerr Frontend Co-authored-by: Tijuco Co-authored-by: J. Lavoie Co-authored-by: K. Herbert Co-authored-by: Luna Jernberg Co-authored-by: sebstrgg Co-authored-by: Simone Chiavaccini Co-authored-by: Shutruk Co-authored-by: BodingClockchian Co-authored-by: T'ai --- src/i18n/locale/de.json | 35 +++++++- src/i18n/locale/es.json | 28 +++++- src/i18n/locale/fr.json | 31 ++++++- src/i18n/locale/it.json | 90 +++++++++++++------- src/i18n/locale/ja.json | 19 ++++- src/i18n/locale/nl.json | 8 +- src/i18n/locale/pt_BR.json | 170 ++++++++++++++++++++++++++++++++++--- src/i18n/locale/sv.json | 38 ++++++--- 8 files changed, 355 insertions(+), 64 deletions(-) diff --git a/src/i18n/locale/de.json b/src/i18n/locale/de.json index 9254654a..75c20262 100644 --- a/src/i18n/locale/de.json +++ b/src/i18n/locale/de.json @@ -88,8 +88,8 @@ "components.RequestModal.status": "Status", "components.Search.searchresults": "Suchergebnisse", "components.Settings.Notifications.agentenabled": "Agent aktiviert", - "components.Settings.Notifications.authPass": "Passwort", - "components.Settings.Notifications.authUser": "Benutzername", + "components.Settings.Notifications.authPass": "Auth Pass", + "components.Settings.Notifications.authUser": "Auth User", "components.Settings.Notifications.emailsender": "E-Mail-Absenderadresse", "components.Settings.Notifications.enableSsl": "SSL aktivieren", "components.Settings.Notifications.save": "Änderungen speichern", @@ -183,7 +183,7 @@ "components.Settings.jobname": "Auftragsname", "components.Settings.librariesRemaining": "Verbleibende Bibliotheken: {count}", "components.Settings.manualscan": "Manueller Bibliotheksscan", - "components.Settings.manualscanDescription": "Normalerweise wird dies nur einmal alle 6 Stunden ausgeführt. Overseerr überprüft die kürzlich hinzugefügten Plex-Server aggressiver. Wenn Sie Plex zum ersten Mal konfigurieren, wird ein einmaliger vollständiger manueller Bibliotheksscan empfohlen!", + "components.Settings.manualscanDescription": "Normalerweise wird dies nur einmal alle 24 Stunden ausgeführt. Overseerr überprüft die kürzlich hinzugefügten Plex-Server aggressiver. Wenn Sie Plex zum ersten Mal konfigurieren, wird ein einmaliger vollständiger manueller Bibliotheksscan empfohlen!", "components.Settings.menuAbout": "Über", "components.Settings.menuGeneralSettings": "Allgemeine Einstellungen", "components.Settings.menuJobs": "Anträge", @@ -348,5 +348,32 @@ "components.Settings.toastApiKeyFailure": "Bei der Generierung eines neuen API-Schlüssels kam es zu einem Fehler.", "components.Settings.SonarrModal.animerootfolder": "Animestammverzeichnis", "components.Settings.SonarrModal.animequalityprofile": "Animequalitätsprofil", - "components.MovieDetails.studio": "Studio" + "components.MovieDetails.studio": "Studio", + "i18n.close": "Schließen", + "components.Settings.SettingsAbout.timezone": "Zeitzone", + "components.Settings.SettingsAbout.supportoverseerr": "Unterstützen Sie Overseerr", + "components.Settings.SettingsAbout.helppaycoffee": "Helfen Sie uns, für Kaffee zu bezahlen", + "components.Settings.SettingsAbout.Releases.viewongithub": "Ansicht auf GitHub", + "components.Settings.SettingsAbout.Releases.viewchangelog": "Änderungsprotokoll anzeigen", + "components.Settings.SettingsAbout.Releases.versionChangelog": "Änderungsprotokoll", + "components.Settings.SettingsAbout.Releases.runningDevelopMessage": "Die Änderungen in Ihrer Version sind unten nicht verfügbar. Die neuesten Aktualisierungen finden Sie im GitHub-Repository.", + "components.Settings.SettingsAbout.Releases.runningDevelop": "Sie führen eine Entwicklungsversion von Overseerr aus!", + "components.Settings.SettingsAbout.Releases.releases": "Veröffentlichungen", + "components.Settings.SettingsAbout.Releases.releasedataMissing": "Informationen der Version nicht verfügbar. Ist GitHub offline?", + "components.Settings.SettingsAbout.Releases.latestversion": "Neuste Version", + "components.Settings.SettingsAbout.Releases.currentversion": "Aktuelle Version", + "components.Settings.Notifications.testsent": "Testbenachrichtigung gesendet!", + "components.Settings.Notifications.test": "Test", + "components.Settings.defaultPermissions": "Standardbenutzerberechtigungen", + "components.UserList.importfromplexerror": "Beim Importieren von Benutzern aus Plex ist ein Fehler aufgetreten", + "components.UserList.importfromplex": "Benutzer/innen aus Plex importieren", + "components.TvDetails.viewfullcrew": "Volles Team anzeigen", + "components.TvDetails.TvCrew.fullseriescrew": "Volles Serienteam", + "components.PersonDetails.crewmember": "Teammitglied", + "components.MovieDetails.viewfullcrew": "Volles Team anzeigen", + "components.MovieDetails.MovieCrew.fullcrew": "Volles Team", + "components.UserList.importedfromplex": "{userCount, plural, =0 {Keine neue Benutzer} one {# neuer Benutzer} other {# neue Benutzer}} aus Plex importiert", + "components.TvDetails.firstAirDate": "Erster Sendetermin", + "components.Settings.Notifications.ssldisabletip": "SSL sollte bei Standard-TLS-Verbindungen deaktiviert werden (Port 587)", + "components.Settings.Notifications.allowselfsigned": "Selbstsignierte Zertifikate zulassen" } diff --git a/src/i18n/locale/es.json b/src/i18n/locale/es.json index 999d3806..0bd7ba30 100644 --- a/src/i18n/locale/es.json +++ b/src/i18n/locale/es.json @@ -338,5 +338,31 @@ "components.Settings.RadarrModal.testFirstRootFolders": "Prueba la conexión para cargar carpetas raíz", "components.Settings.RadarrModal.testFirstQualityProfiles": "Prueba la conexión para cargar perfiles de calidad", "components.Settings.RadarrModal.loadingrootfolders": "Cargando carpetas raíz…", - "components.Settings.RadarrModal.loadingprofiles": "Cargando perfiles de calidad…" + "components.Settings.RadarrModal.loadingprofiles": "Cargando perfiles de calidad…", + "i18n.close": "Cerrar", + "components.TvDetails.showtype": "Tipo de Serie", + "components.TvDetails.network": "Red", + "components.TvDetails.anime": "Anime", + "components.Settings.toastSettingsSuccess": "Ajustes guardados.", + "components.Settings.toastSettingsFailure": "Algo salió mal guardando la configuración.", + "components.Settings.toastApiKeySuccess": "¡Nueva clave API generada!", + "components.Settings.toastApiKeyFailure": "Algo salió mal generando una nueva clave API.", + "components.Settings.defaultPermissions": "Permisos de usuario predeterminados", + "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 Overseerr", + "components.Settings.SettingsAbout.helppaycoffee": "Págame un café", + "components.Settings.SettingsAbout.Releases.viewongithub": "Ver en GitHub", + "components.Settings.SettingsAbout.Releases.viewchangelog": "Ver registro de cambios", + "components.Settings.SettingsAbout.Releases.versionChangelog": "Cambios de la versión", + "components.Settings.SettingsAbout.Releases.runningDevelopMessage": "Los cambios en su versión no estarán disponibles a continuación. Consulte el repositorio de GitHub para obtener las últimas actualizaciones.", + "components.Settings.SettingsAbout.Releases.runningDevelop": "¡Está ejecutando una versión de desarrollo de Overseerr!", + "components.Settings.SettingsAbout.Releases.releases": "Versiones", + "components.Settings.SettingsAbout.Releases.releasedataMissing": "Faltan datos de la versión. ¿GitHub está caído?", + "components.Settings.SettingsAbout.Releases.latestversion": "Última Versión", + "components.Settings.SettingsAbout.Releases.currentversion": "Versión Actual", + "components.Settings.Notifications.testsent": "¡Notificación de prueba enviada!", + "components.Settings.Notifications.test": "Comprobar", + "components.MovieDetails.studio": "Estudio" } diff --git a/src/i18n/locale/fr.json b/src/i18n/locale/fr.json index bb003703..665cf7fa 100644 --- a/src/i18n/locale/fr.json +++ b/src/i18n/locale/fr.json @@ -183,7 +183,7 @@ "components.Settings.jobname": "Nom de la tâche", "components.Settings.librariesRemaining": "Bibliothèques restantes : {count}", "components.Settings.manualscan": "Scan manuel des bibliothèques", - "components.Settings.manualscanDescription": "Normalement, le scan sera effectué une fois toutes les 6 heures seulement. Overseerr va vérifier les ajouts récents de votre serveur Plex de manière plus agressive. Si c'est votre première configuration de Plex, un scan complet unique de la bibliothèque est recommandé !", + "components.Settings.manualscanDescription": "Normalement, le scan sera effectué une fois toutes les 24 heures seulement. Overseerr va vérifier les ajouts récents de votre serveur Plex de manière plus agressive. Si c'est votre première configuration de Plex, un scan complet unique de la bibliothèque est recommandé !", "components.Settings.menuAbout": "À propos", "components.Settings.menuGeneralSettings": "Paramètres généraux", "components.Settings.menuJobs": "Tâches", @@ -348,5 +348,32 @@ "components.Settings.toastApiKeyFailure": "Une erreur s'est produite lors de la génération de la nouvelle clé API.", "components.Settings.SonarrModal.animerootfolder": "Dossier racine pour anime", "components.Settings.SonarrModal.animequalityprofile": "Profil qualité pour anime", - "components.MovieDetails.studio": "Studio" + "components.MovieDetails.studio": "Studio", + "components.Settings.SettingsAbout.supportoverseerr": "Soutenez Overseerr", + "i18n.close": "Fermer", + "components.Settings.SettingsAbout.timezone": "Fuseau horaire", + "components.Settings.SettingsAbout.helppaycoffee": "Aidez à payer le café", + "components.Settings.SettingsAbout.Releases.viewongithub": "Voir sur GitHub", + "components.Settings.SettingsAbout.Releases.viewchangelog": "Voir le journal des modifications", + "components.Settings.SettingsAbout.Releases.versionChangelog": "Journal des modifications de version", + "components.Settings.SettingsAbout.Releases.runningDevelopMessage": "Les modifications apportées à votre version ne seront pas disponibles ci-dessous. Veuillez consulter le dépôt GitHub pour les dernières mises à jour.", + "components.Settings.SettingsAbout.Releases.runningDevelop": "Vous utilisez une version de développement d'Overseerr !", + "components.Settings.SettingsAbout.Releases.releases": "Versions", + "components.Settings.SettingsAbout.Releases.releasedataMissing": "Données de sortie manquantes. GitHub est-il en panne ?", + "components.Settings.SettingsAbout.Releases.latestversion": "Dernière version", + "components.Settings.SettingsAbout.Releases.currentversion": "Version actuelle", + "components.Settings.Notifications.testsent": "Notification de test envoyée !", + "components.Settings.Notifications.test": "Test", + "components.Settings.defaultPermissions": "Autorisations utilisateur par défaut", + "components.UserList.importfromplexerror": "Une erreur s'est produite lors de l'importation d'utilisateurs depuis Plex", + "components.UserList.importfromplex": "Importer des utilisateurs depuis Plex", + "components.UserList.importedfromplex": "{userCount, plural, =0 {Aucun nouvel utilisateur} one {# nouvel utilisateur} other {# nouveaux utilisateurs}} importé(s) depuis Plex", + "components.TvDetails.viewfullcrew": "Voir l'équipe complète de la série", + "components.TvDetails.TvCrew.fullseriescrew": "Équipe complète de la série", + "components.PersonDetails.crewmember": "Membre de l'équipe", + "components.MovieDetails.viewfullcrew": "Voir l'équipe complète", + "components.MovieDetails.MovieCrew.fullcrew": "Équipe complète", + "components.TvDetails.firstAirDate": "Date de première diffusion", + "components.Settings.Notifications.ssldisabletip": "Le SSL doit être désactivé sur les connexions TLS standard (Port 587)", + "components.Settings.Notifications.allowselfsigned": "Autoriser les certificats autosignés" } diff --git a/src/i18n/locale/it.json b/src/i18n/locale/it.json index 311ae6a8..959dddbb 100644 --- a/src/i18n/locale/it.json +++ b/src/i18n/locale/it.json @@ -49,7 +49,7 @@ "components.RequestList.requestedAt": "Richiesto", "components.RequestList.previous": "Precedente", "components.RequestList.next": "Successivo", - "components.RequestList.modifiedBy": "Ultima modifica da", + "components.RequestList.modifiedBy": "Ultima modifica", "components.RequestList.mediaInfo": "Media", "components.RequestList.RequestItem.seasons": "Stagioni", "components.RequestList.RequestItem.requestedby": "Richiesto da {username}", @@ -92,7 +92,7 @@ "components.MovieDetails.approve": "Approva", "components.MovieDetails.MovieCast.fullcast": "Cast completo", "components.Login.signinplex": "Accedi per continuare", - "components.Layout.alphawarning": "Questo software è in ALPHA. Tutto può smettere di funzionare o diventare instabile. Aiutaci riportando i problemi su Overseerr GitHub!", + "components.Layout.alphawarning": "Questo programma è in ALPHA. Tutto può smettere di funzionare o diventare instabile. Aiutaci segnalando i problemi su Overseerr GitHub!", "components.Layout.UserDropdown.signout": "Esci", "components.Layout.Sidebar.users": "Utenti", "components.Layout.Sidebar.settings": "Impostazioni", @@ -142,18 +142,18 @@ "i18n.deleting": "Eliminazione…", "i18n.delete": "Elimina", "pages.oops": "Ops", - "components.Settings.RadarrModal.rootfolder": "Cartella radice", - "components.Settings.RadarrModal.selectRootFolder": "Seleziona una cartella radice", + "components.Settings.RadarrModal.rootfolder": "Cartella principale", + "components.Settings.RadarrModal.selectRootFolder": "Seleziona una cartella principale", "components.Settings.RadarrModal.selectQualityProfile": "Seleziona un profilo qualità", "components.Settings.RadarrModal.selectMinimumAvailability": "Seleziona la disponibilità minima", - "components.Settings.RadarrModal.save": "Salva i cambiamenti", + "components.Settings.RadarrModal.save": "Salva le modifiche", "components.Settings.RadarrModal.qualityprofile": "Profilo qualità", "components.Settings.RadarrModal.minimumAvailability": "Disponibilità minima", "components.Settings.RadarrModal.editradarr": "Modifica server Radarr", "components.Settings.RadarrModal.defaultserver": "Server predefinito", "components.Settings.RadarrModal.apiKey": "Chiave API", "components.Settings.RadarrModal.add": "Aggiungi un server", - "components.Settings.Notifications.save": "Salva i cambiamenti", + "components.Settings.Notifications.save": "Salva le modifiche", "components.Settings.Notifications.discordsettingsfailed": "Impossibile salvare le impostazioni di notifica Discord.", "components.RequestModal.requesttitle": "Richiedi {title}", "components.RequestModal.requestfrom": "Al momento è in sospeso una richiesta da {username}", @@ -187,7 +187,7 @@ "components.Settings.startscan": "Avvia la scansione", "components.Settings.ssl": "SSL", "components.Settings.saving": "Salvataggio…", - "components.Settings.save": "Salva i cambiamenti", + "components.Settings.save": "Salva le modifiche", "components.Settings.runnow": "Esegui ora", "components.Settings.radarrsettings": "Impostazioni Radarr", "components.Settings.plexsettings": "Impostazioni Plex", @@ -201,10 +201,10 @@ "components.Settings.menuServices": "Servizi", "components.Settings.menuPlexSettings": "Plex", "components.Settings.menuNotifications": "Notifiche", - "components.Settings.menuLogs": "Registri", + "components.Settings.menuLogs": "Log", "components.Settings.menuGeneralSettings": "Impostazioni generali", - "components.Settings.menuAbout": "Informazioni", - "components.Settings.manualscan": "Scansione manuale della biblioteca", + "components.Settings.menuAbout": "Info", + "components.Settings.manualscan": "Scansione manuale della libreria", "components.Settings.librariesRemaining": "Biblioteche rimanenti: {count}", "components.Settings.hostname": "Nome host/IP", "components.Settings.generalsettingsDescription": "Queste sono impostazioni relative alla configurazione generale di Overseerr.", @@ -214,15 +214,15 @@ "components.Settings.delete": "Elimina", "components.Settings.default4k": "4K predefinito", "components.Settings.default": "Predefinito", - "components.Settings.currentlibrary": "Biblioteca corrente: {name}", + "components.Settings.currentlibrary": "Libreria corrente: {name}", "components.Settings.copied": "Chiave API copiata negli appunti", "components.Settings.cancelscan": "Annulla l'analisi", "components.Settings.applicationurl": "URL applicazione", "components.Settings.apikey": "Chiave API", "components.Settings.addsonarr": "Aggiungi un server Sonarr", - "components.Settings.addradarr": "Aggiungi un server radarr", + "components.Settings.addradarr": "Aggiungi un server Radarr", "components.Settings.activeProfile": "Profilo attivo", - "components.Settings.SonarrModal.validationRootFolderRequired": "È necessario selezionare una cartella radice", + "components.Settings.SonarrModal.validationRootFolderRequired": "È necessario selezionare una cartella principale", "components.Settings.SonarrModal.validationProfileRequired": "È necessario selezionare un profilo", "components.Settings.SonarrModal.validationPortRequired": "È necessario fornire una porta", "components.Settings.SonarrModal.validationNameRequired": "È necessario fornire un nome di server", @@ -230,18 +230,18 @@ "components.Settings.SonarrModal.validationApiKeyRequired": "È necessario fornire una chiave API", "components.Settings.SonarrModal.toastRadarrTestSuccess": "Stabilita la connessione Sonarr!", "components.Settings.SonarrModal.toastRadarrTestFailure": "Impossibile connettersi a Sonarr Server", - "components.Settings.SonarrModal.testFirstRootFolders": "Testa la connessione per caricare le cartelle radice", + "components.Settings.SonarrModal.testFirstRootFolders": "Testa la connessione per caricare le cartelle", "components.Settings.SonarrModal.testFirstQualityProfiles": "Testa la connessione per caricare profili di qualità", "components.Settings.SonarrModal.servernamePlaceholder": "Un server Sonarr", "components.Settings.SonarrModal.servername": "Nome server", "components.Settings.SonarrModal.server4k": "Server 4K", - "components.Settings.SonarrModal.selectRootFolder": "Seleziona una cartella radice", + "components.Settings.SonarrModal.selectRootFolder": "Seleziona una cartella principale", "components.Settings.SonarrModal.selectQualityProfile": "Seleziona un profilo qualità", "components.Settings.SonarrModal.seasonfolders": "Cartelle stagione", - "components.Settings.SonarrModal.save": "Salva i cambiamenti", - "components.Settings.SonarrModal.rootfolder": "Cartella radice", + "components.Settings.SonarrModal.save": "Salva le modifiche", + "components.Settings.SonarrModal.rootfolder": "Cartella principale", "components.Settings.SonarrModal.qualityprofile": "Profilo qualità", - "components.Settings.SonarrModal.loadingrootfolders": "Caricamento delle cartelle radice in…", + "components.Settings.SonarrModal.loadingrootfolders": "Caricamento delle cartelle…", "components.Settings.SonarrModal.loadingprofiles": "Caricamento profili qualità…", "components.Settings.SonarrModal.editsonarr": "Modifica server Sonarr", "components.Settings.SonarrModal.defaultserver": "Server predefinito", @@ -250,16 +250,16 @@ "components.Settings.SonarrModal.baseUrl": "URL di base", "components.Settings.SonarrModal.apiKeyPlaceholder": "La tua chiave API Sonarr", "components.Settings.SonarrModal.apiKey": "Chiave API", - "components.Settings.SonarrModal.animerootfolder": "Cartella radice anime", + "components.Settings.SonarrModal.animerootfolder": "Cartella principale Anime", "components.Settings.SonarrModal.animequalityprofile": "Profilo qualità anime", "components.Settings.SonarrModal.add": "Aggiungi un server", "components.Settings.SettingsAbout.totalrequests": "Totale richieste", "components.Settings.SettingsAbout.totalmedia": "Media totali", - "components.Settings.SettingsAbout.overseerrinformation": "Informazioni su Overseerr", + "components.Settings.SettingsAbout.overseerrinformation": "Info su Overseerr", "components.Settings.SettingsAbout.githubdiscussions": "Discussioni su GitHub", "components.Settings.SettingsAbout.gettingsupport": "Ottieni aiuto", "components.Settings.SettingsAbout.clickheretojoindiscord": "Clicca qui per unirti al nostro server Discord.", - "components.Settings.RadarrModal.validationRootFolderRequired": "È necessario selezionare una cartella radice", + "components.Settings.RadarrModal.validationRootFolderRequired": "È necessario selezionare una cartella principale", "components.Settings.RadarrModal.validationProfileRequired": "È necessario selezionare un profilo", "components.Settings.RadarrModal.validationPortRequired": "È necessario fornire una porta", "components.Settings.RadarrModal.validationNameRequired": "È necessario fornire un nome di server", @@ -268,12 +268,12 @@ "components.Settings.RadarrModal.validationApiKeyRequired": "È necessario fornire una chiave API", "components.Settings.RadarrModal.toastRadarrTestSuccess": "Stabilita la connessione Radarr!", "components.Settings.RadarrModal.toastRadarrTestFailure": "Impossibile connettersi al server Radarr", - "components.Settings.RadarrModal.testFirstRootFolders": "Testa la connessione per caricare le cartelle radice", + "components.Settings.RadarrModal.testFirstRootFolders": "Testa la connessione per caricare le cartelle", "components.Settings.RadarrModal.testFirstQualityProfiles": "Testa la connessione per caricare profili qualità", "components.Settings.RadarrModal.servernamePlaceholder": "Un server Radarr", "components.Settings.RadarrModal.servername": "Nome server", "components.Settings.RadarrModal.server4k": "Server 4K", - "components.Settings.RadarrModal.loadingrootfolders": "Caricamento delle cartelle radice in…", + "components.Settings.RadarrModal.loadingrootfolders": "Caricamento delle cartelle…", "components.Settings.RadarrModal.loadingprofiles": "Caricamento profili di qualità…", "components.Settings.RadarrModal.createradarr": "Crea un nuovo server Radarr", "components.Settings.RadarrModal.baseUrlPlaceholder": "Esempio: /radarr", @@ -288,8 +288,8 @@ "components.Settings.Notifications.smtpHost": "Host SMTP", "components.Settings.Notifications.enableSsl": "Abilita SSL", "components.Settings.Notifications.discordsettingssaved": "Impostazioni di notifica Discord salvate!", - "components.Settings.Notifications.authUser": "Nome utente", - "components.Settings.Notifications.authPass": "Password", + "components.Settings.Notifications.authUser": "Auth User", + "components.Settings.Notifications.authPass": "Auth Pass", "components.RequestModal.requestseasons": "Richiedi {seasonCount} {seasonCount, plural, one {Season} other {Seasons}}", "components.RequestList.showingresults": "Visualizzazione dei risultati da {from} a {to} di {total}", "components.UserEdit.userfail": "Qualcosa è andato storto salvando l'utente.", @@ -306,12 +306,12 @@ "components.TvDetails.unavailable": "Non disponibile", "components.TvDetails.status": "Stato", "components.TvDetails.similarsubtext": "Altre serie simili a {title}", - "components.TvDetails.similar": "Serie simile", + "components.TvDetails.similar": "Serie simili", "components.TvDetails.showtype": "Tipo di serie", "components.TvDetails.requestmore": "Richiedi di più", "components.TvDetails.request": "Richiesta", "components.TvDetails.recommendationssubtext": "Se ti è piaciuto {title}, potrebbe anche piacerti…", - "components.TvDetails.recommendations": "Consigli", + "components.TvDetails.recommendations": "Consigliati", "components.TvDetails.pending": "In sospeso", "components.TvDetails.overviewunavailable": "Trama non disponibile", "components.TvDetails.overview": "Trama", @@ -328,12 +328,12 @@ "components.Setup.signinMessage": "Comincia accedendo con il tuo account Plex", "components.Settings.sync": "Sincronizza le librerie di Plex", "components.Settings.sonarrsettings": "Impostazioni Sonarr", - "components.Settings.sonarrSettingsDescription": "Imposta la connessione al tuo Sonarr qui sotto. È possibile avere più instanze, ma solo due attive come predefinite nello stesso momento (uno per l'HD standard e uno per 4K). Gli amministratori possono ignorare quale server è utilizzato per le nuove richieste.", - "components.Settings.radarrSettingsDescription": "Imposta la connessione al tuo Radarr qui sotto. È possibile avere più instanze, ma solo due attive come predefinite nello stesso momento (uno per l'HD standard e uno per 4K). Gli amministratori possono ignorare quale server è utilizzato per le nuove richieste.", - "components.Settings.plexsettingsDescription": "Configura le impostazioni per il tuo server Plex. Overseerr utilizza il tuo server Plex per scansionare la tua libreria a intervealli per vedere quali elementi sono disponibili.", + "components.Settings.sonarrSettingsDescription": "Configura Sonarr qui sotto. È possibile avere più istanze, ma solo due predefinite contemporaneamente (uno per l'HD standard e uno per 4K). Gli amministratori possono ignorare quale server è utilizzato per le nuove richieste.", + "components.Settings.radarrSettingsDescription": "Configura Radarr qui sotto. È possibile avere più istanze, ma solo due predefinite contemporaneamente (uno per l'HD standard e uno per 4K). Gli amministratori possono ignorare quale server è utilizzato per le nuove richieste.", + "components.Settings.plexsettingsDescription": "Configura le impostazioni del tuo server Plex. Overseerr scansiona la tua libreria Plex a intervalli regolari alla ricerca di nuovi contenuti.", "components.Settings.plexlibrariesDescription": "Le librerie che verranno scansionate da Overseerr alla ricerca di titoli. Se non ci sono librerie, configura e salva le impostazioni di connessione a Plex e fai click sul pulsante qui sotto.", "components.Settings.plexlibraries": "Librerie Plex", - "components.Settings.manualscanDescription": "Normalmente, questo verrà eseguito ogni 6 ore. Overseerr controllerà in modo più aggressivo i server Plex aggiunti di recente. Se è la prima volta che configuri Plex, si consiglia una scansione manuale completa della libreria!", + "components.Settings.manualscanDescription": "Normalmente, questo verrà eseguito ogni 24 ore. Overseerr controllerà in modo più aggressivo i server Plex aggiunti di recente. Se è la prima volta che configuri Plex, si consiglia una scansione manuale completa della libreria!", "components.Settings.port": "Porta", "components.Settings.servername": "Nome server (impostato automaticamente dopo il salvataggio)", "components.Settings.servernamePlaceholder": "Nome server Plex", @@ -348,5 +348,31 @@ "pages.somethingWentWrong": "{statusCode} — Qualcosa è andato storto", "pages.serviceUnavailable": "{statusCode} — Servizio non disponibile", "pages.returnHome": "Ritorna alla pagina iniziale", - "pages.pageNotFound": "404 — Pagina non trovata" + "pages.pageNotFound": "404 — Pagina non trovata", + "i18n.close": "Chiudi", + "components.Settings.SettingsAbout.timezone": "Fuso orario", + "components.Settings.SettingsAbout.supportoverseerr": "Sostieni Overseerr", + "components.Settings.SettingsAbout.helppaycoffee": "Offri un caffè", + "components.Settings.SettingsAbout.Releases.viewongithub": "Visualizza su GitHub", + "components.Settings.SettingsAbout.Releases.viewchangelog": "Visualizza il changelog", + "components.Settings.SettingsAbout.Releases.versionChangelog": "Changelog versione", + "components.Settings.SettingsAbout.Releases.runningDevelopMessage": "Il changelog di questa versione non è disponibile qui sotto. Puoi andare surepository GitHub per gli ultimi aggiornamenti.", + "components.Settings.SettingsAbout.Releases.runningDevelop": "Stai eseguendo una versione in sviluppo di Overseerr!", + "components.Settings.SettingsAbout.Releases.releases": "Versioni", + "components.Settings.SettingsAbout.Releases.releasedataMissing": "Dati di versione mancanti. GitHub è down?", + "components.Settings.SettingsAbout.Releases.latestversion": "Ultima versione", + "components.Settings.SettingsAbout.Releases.currentversion": "Versione attuale", + "components.Settings.Notifications.testsent": "Notifica di prova inviata!", + "components.Settings.Notifications.test": "Test", + "components.Settings.defaultPermissions": "Autorizzazioni utente predefinite", + "components.UserList.importfromplexerror": "Qualcosa è andato storto durante l'importazione degli utenti da Plex", + "components.UserList.importfromplex": "Importa utenti da Plex", + "components.UserList.importedfromplex": "{userCount, plural, =0 {Nessun utente importato} one {# nuovo utente importato} other {# nuovi utenti importati}} da Plex", + "components.TvDetails.viewfullcrew": "Vedi troupe completa", + "components.TvDetails.TvCrew.fullseriescrew": "Troupe completa serie", + "components.PersonDetails.crewmember": "Membro della troupe", + "components.MovieDetails.MovieCrew.fullcrew": "Troupe completa", + "components.MovieDetails.viewfullcrew": "Vedi troupe completa", + "components.Settings.Notifications.ssldisabletip": "SSL dovrebbe essere disabilitato sulle connessioni standard TLS (Porta 587)", + "components.Settings.Notifications.allowselfsigned": "Consenti i certificati autofirmati" } diff --git a/src/i18n/locale/ja.json b/src/i18n/locale/ja.json index 109649b4..0d50e814 100644 --- a/src/i18n/locale/ja.json +++ b/src/i18n/locale/ja.json @@ -348,5 +348,22 @@ "components.Settings.RadarrModal.testFirstQualityProfiles": "画質プロファイルをロードするには先に接続をテストしてください", "components.Settings.RadarrModal.loadingprofiles": "画質プロファイルの読込中…", "components.Settings.RadarrModal.loadingrootfolders": "ルートフォルダー読込中…", - "components.MovieDetails.studio": "スタジオ" + "components.MovieDetails.studio": "スタジオ", + "components.Settings.Notifications.test": "テスト", + "i18n.close": "閉じる", + "components.Settings.defaultPermissions": "デフォルトのユーザー権限", + "components.Settings.SettingsAbout.timezone": "タイムゾーン", + "components.Settings.SettingsAbout.supportoverseerr": "Overseerrを応援", + "components.Settings.SettingsAbout.helppaycoffee": "開発者のコーヒーのためにチップを", + "components.Settings.SettingsAbout.Releases.viewongithub": "GitHubで見る", + "components.Settings.SettingsAbout.Releases.viewchangelog": "変更履歴参照", + "components.Settings.SettingsAbout.Releases.versionChangelog": "バージョン変更履歴", + "components.Settings.SettingsAbout.Releases.runningDevelopMessage": "お使いのバージョンのパッチノート以下に記載されていません。最新のアップデートはGitHubリポジトリをご覧ください。", + "components.Settings.SettingsAbout.Releases.runningDevelop": "Overseerrの開発バージョンを実行しています。", + "components.Settings.SettingsAbout.Releases.releases": "リリース", + "components.Settings.SettingsAbout.Releases.releasedataMissing": "リリースデータがありません。GitHubはダウンしていますか?", + "components.Settings.SettingsAbout.Releases.latestversion": "最新バージョン", + "components.Settings.SettingsAbout.Releases.currentversion": "現在のバージョン", + "components.Settings.Notifications.testsent": "テスト通知が送信されました。", + "components.MovieDetails.MovieCrew.fullcrew": "フルクルー" } diff --git a/src/i18n/locale/nl.json b/src/i18n/locale/nl.json index 033595b1..46373f8a 100644 --- a/src/i18n/locale/nl.json +++ b/src/i18n/locale/nl.json @@ -333,5 +333,11 @@ "components.Settings.RadarrModal.testFirstRootFolders": "Test je connectie om hoofdfolders te laden", "components.Settings.RadarrModal.testFirstQualityProfiles": "Test je connectie om kwaliteitsprofielen te laden", "components.Settings.RadarrModal.loadingrootfolders": "Bezig met laden van hoofdfolders…", - "components.Settings.RadarrModal.loadingprofiles": "Bezig met laden van kwaliteitsprofielen…" + "components.Settings.RadarrModal.loadingprofiles": "Bezig met laden van kwaliteitsprofielen…", + "components.Settings.SettingsAbout.Releases.releasedataMissing": "Publicatiedatum mist. Is GitHub offline?", + "components.Settings.SettingsAbout.Releases.latestversion": "Laatste versie", + "components.Settings.SettingsAbout.Releases.currentversion": "Huidige versie", + "components.Settings.Notifications.testsent": "Test notificatie verzonden!", + "components.Settings.Notifications.test": "Test", + "components.MovieDetails.studio": "Studio" } diff --git a/src/i18n/locale/pt_BR.json b/src/i18n/locale/pt_BR.json index 7f2b856c..8dda45e9 100644 --- a/src/i18n/locale/pt_BR.json +++ b/src/i18n/locale/pt_BR.json @@ -8,8 +8,8 @@ "components.RequestCard.requestedby": "Solicitado por {username}", "components.RequestBlock.seasons": "Temporadas", "components.PlexLoginButton.loginwithplex": "Entrar com", - "components.PlexLoginButton.loggingin": "Fazendo login...", - "components.PlexLoginButton.loading": "Carregando...", + "components.PlexLoginButton.loggingin": "Fazendo login…", + "components.PlexLoginButton.loading": "Carregando…", "components.PersonDetails.nobiography": "Biografia não disponível.", "components.PersonDetails.ascharacter": "como {character}", "components.PersonDetails.appearsin": "Aparece em", @@ -24,11 +24,11 @@ "components.MovieDetails.revenue": "Receita", "components.MovieDetails.request": "Solicitar", "components.MovieDetails.releasedate": "Data de Lançamento", - "components.MovieDetails.recommendationssubtext": "Se você gostou {title}, você provavelmente irá gostar...", + "components.MovieDetails.recommendationssubtext": "Se você gostou {title}, você provavelmente irá gostar…", "components.MovieDetails.recommendations": "Recomendações", "components.MovieDetails.pending": "Pendente", - "components.MovieDetails.overviewunavailable": "Visão Geral Indisponível", - "components.MovieDetails.overview": "Visão Geral", + "components.MovieDetails.overviewunavailable": "Sinopse indisponível", + "components.MovieDetails.overview": "Sinopse", "components.MovieDetails.originallanguage": "Língua original", "components.MovieDetails.manageModalTitle": "Gerenciar Filme", "components.MovieDetails.manageModalRequests": "Solicitações", @@ -61,12 +61,12 @@ "components.Discover.nopending": "Nenhuma Solicitação Pendente", "components.Discover.discovertv": "Séries Populares", "components.Discover.discovermovies": "Filmes Populares", - "components.Settings.SonarrModal.testing": "Testando...", - "components.Settings.SonarrModal.saving": "Salvando...", - "components.Settings.RadarrModal.testing": "Testando...", - "components.Settings.RadarrModal.saving": "Salvando...", - "components.Settings.Notifications.saving": "Salvando...", - "components.RequestModal.cancelling": "Cancelando...", + "components.Settings.SonarrModal.testing": "Testando…", + "components.Settings.SonarrModal.saving": "Salvando…", + "components.Settings.RadarrModal.testing": "Testando…", + "components.Settings.RadarrModal.saving": "Salvando…", + "components.Settings.Notifications.saving": "Salvando…", + "components.RequestModal.cancelling": "Cancelando…", "components.Settings.plexlibraries": "Bibliotecas do Plex", "components.Settings.notrunning": "Parado", "components.Settings.notificationsettingsDescription": "Aqui você pode escolher e selecionar os tipos de notificações e através de quais serviços deseja enviar.", @@ -84,7 +84,7 @@ "components.Settings.menuJobs": "Tarefas", "components.Settings.menuGeneralSettings": "Configurações Gerais", "components.Settings.menuAbout": "Sobre", - "components.Settings.manualscanDescription": "Normalmente, isso só será executado uma vez a cada 6 horas. Overseerr irá checar em detalhes items recentemente adicionados ao seu servidor Plex. Se essa é a primeira vez que você configura um servidor Plex, é recomendado a varredura completa de sua biblioteca!", + "components.Settings.manualscanDescription": "Normalmente, isso só será executado uma vez a cada 24 horas. Overseerr irá checar em detalhes items recentemente adicionados ao seu servidor Plex. Se essa é a primeira vez que você configura um servidor Plex, é recomendado a varredura completa de sua biblioteca!", "components.Settings.manualscan": "Varredura Manual da Biblioteca", "components.Settings.librariesRemaining": "Bibliotecas Restantes: {count}", "components.Settings.jobname": "Nome da Tarefa", @@ -228,5 +228,149 @@ "components.RequestList.previous": "Anterior", "components.RequestList.RequestItem.seasons": "Temporadas", "components.RequestList.RequestItem.notavailable": "N/A", - "components.RequestCard.all": "Todas" + "components.RequestCard.all": "Todas", + "components.Setup.continue": "Continuar", + "components.Setup.configureservices": "Configurar Serviços", + "components.Setup.configureplex": "Configurar Plex", + "components.Settings.validationPortRequired": "Você deve prover uma porta", + "components.Settings.validationHostnameRequired": "Você deve prover o Nome do Servidor/IP", + "components.Settings.toastSettingsSuccess": "Configurações salvas.", + "components.Settings.toastSettingsFailure": "Algo de errado ao salvar configurações.", + "components.Settings.toastApiKeySuccess": "Nova chave de API gerada!", + "components.Settings.toastApiKeyFailure": "Algo deu errado ao gerar a nova chave de API.", + "components.Settings.syncing": "Sincronizando…", + "components.Settings.sync": "Sincronizar Bibliotecas do Plex", + "components.Settings.startscan": "Iniciar Varredura", + "components.Settings.ssl": "SSL", + "components.Settings.sonarrsettings": "Configurações do Sonarr", + "components.Settings.servernamePlaceholder": "Nome do Servidor Plex", + "components.Settings.servername": "Nome do Servidor (Automaticamente definido após você salvar)", + "components.Settings.saving": "Salvando…", + "components.Settings.save": "Salvar Mudanças", + "components.Settings.runnow": "Executar Agora", + "components.Settings.radarrsettings": "Configurações do Radarr", + "components.Settings.port": "Porta", + "components.Settings.plexsettingsDescription": "Configure os dados de conexão com servidor Plex. Overseerr irá escanear sua biblioteca em intervalos e checar por novo conteúdo.", + "components.Settings.plexsettings": "Configurações do Plex", + "components.Settings.plexlibrariesDescription": "Bibliotecas que Overseerr irá buscar por títulos. Configure e salve as informações de conexão com Plex e click no botão abaixo se nenhuma biblioteca é listada.", + "components.Settings.SettingsAbout.timezone": "Fuso Horário", + "components.Settings.SettingsAbout.helppaycoffee": "Ajude a Pagar o Café", + "components.Settings.SettingsAbout.supportoverseerr": "Apoie Overseerr", + "components.Settings.SettingsAbout.Releases.viewongithub": "Ver no GitHub", + "components.Settings.SettingsAbout.Releases.viewchangelog": "Ver Mudanças", + "components.Settings.SettingsAbout.Releases.versionChangelog": "Mudanças Nessa Versão", + "components.Settings.SettingsAbout.Releases.runningDevelopMessage": "As mudanças em sua versão não serão exibidas abaixo. Por favor acesso o repositório do GitHub para saber o que mudou.", + "components.Settings.SettingsAbout.Releases.runningDevelop": "Você está usando uma versão de desenvolvimento do Overseerr!", + "components.Settings.SettingsAbout.Releases.releases": "Versões", + "components.Settings.SettingsAbout.Releases.releasedataMissing": "Informações de versão faltando. O GitHub está indisponível?", + "components.Settings.SettingsAbout.Releases.latestversion": "Última Versão", + "components.Settings.SettingsAbout.Releases.currentversion": "Versão Atual", + "components.TvDetails.request": "Solicitar", + "components.TvDetails.recommendationssubtext": "Se você gostou {title}, você provavelmente irá gostar…", + "components.TvDetails.recommendations": "Recomendações", + "components.TvDetails.pending": "Pendente", + "components.TvDetails.overviewunavailable": "Sinopse indisponível", + "components.TvDetails.overview": "Sinopse", + "components.TvDetails.originallanguage": "Língua original", + "components.TvDetails.network": "Estúdio", + "components.TvDetails.manageModalTitle": "Gerenciar Séries", + "components.TvDetails.manageModalRequests": "Solicitações", + "components.TvDetails.manageModalNoRequests": "Nenhuma Solicitação", + "components.TvDetails.manageModalClearMedia": "Limpar Todos Dados de Mídia", + "components.TvDetails.declinerequests": "Rejeitar {requestCount} {requestCount, plural, one {Solicitação} other {Solicitações}}", + "components.TvDetails.decline": "Rejeitar", + "components.TvDetails.cast": "Elenco", + "components.TvDetails.cancelrequest": "Cancelar Solicitação", + "components.TvDetails.available": "Disponível", + "components.TvDetails.approverequests": "Aprovar {requestCount} {requestCount, plural, one {Solicitação} other {Solicitações}}", + "components.TvDetails.approve": "Aprovar", + "components.TvDetails.anime": "Animes", + "components.TvDetails.TvCast.fullseriescast": "Elenco Completo da Série", + "components.TitleCard.tvshow": "Séries", + "components.TitleCard.movie": "Filme", + "components.Slider.noresults": "Nenhum Resultado", + "components.Setup.welcome": "Bem-Vindo ao Overseerr", + "components.Setup.tip": "Dica", + "components.Setup.syncingbackground": "A sincronização será executada em segundo plano. Você pode continuar a configuração enquanto isso.", + "components.Setup.signinMessage": "Comece fazendo login com sua conta Plex", + "components.Setup.loginwithplex": "Entrar com Plex", + "components.Setup.finishing": "Finalizando…", + "components.Setup.finish": "Finalizar Configurações", + "components.TvDetails.requestmore": "Solicitar Mais", + "pages.somethingWentWrong": "{statusCode} - Algo deu errado", + "pages.serviceUnavailable": "{statusCode} - Serviço Indisponível", + "pages.returnHome": "Voltar Para Página Inicial", + "pages.oops": "Opa", + "pages.internalServerError": "{statusCode} - Erro Interno no Servidor", + "i18n.unavailable": "Indisponível", + "i18n.tvshows": "Séries", + "i18n.processing": "Processando…", + "i18n.pending": "Pendente", + "i18n.partiallyavailable": "Parcialmente Disponível", + "i18n.movies": "Filmes", + "i18n.declined": "Rejeitado", + "i18n.decline": "Rejeitar", + "i18n.close": "Fechar", + "i18n.cancel": "Cancelar", + "i18n.available": "Disponível", + "i18n.approved": "Aprovada", + "i18n.approve": "Aprovar", + "components.UserList.usertype": "Tipo de Usuário", + "components.UserList.username": "Usuário", + "components.UserList.userlist": "Lista de Usuários", + "components.UserList.userdeleteerror": "Algo deu errado ao apagar usuário", + "components.UserList.userdeleted": "Usuário deletado", + "components.UserList.user": "Usuário", + "components.UserList.totalrequests": "Total de Solicitações", + "components.UserList.role": "Privilégio", + "components.UserList.plexuser": "Usuário Plex", + "components.UserList.lastupdated": "Última Atualização", + "components.UserList.edit": "Editar", + "components.UserList.deleteuser": "Deletar Usuário", + "components.UserList.deleteconfirm": "Tem certeza que deseja deletar esse usuário? Todas informações de solicitação desse usuário serão removidas.", + "components.UserList.created": "Criado", + "components.UserList.admin": "Administrador", + "components.UserEdit.voteDescription": "Concede permissão para votar em solicitações (sistema de votos ainda não implementado)", + "components.UserEdit.vote": "Votar", + "components.UserEdit.usersaved": "Usuário salvo", + "components.UserEdit.usersDescription": "Concede permissão para gerenciar usuários do Overseerr. Usuários com essa permissão não conseguem modificar usuários de Adminitradores ou conceder esse privilégio .", + "components.UserEdit.users": "Gerenciar Usuários", + "components.UserEdit.username": "Usuário", + "components.UserEdit.userfail": "Algo deu errado ao salvar edições do usuário.", + "components.UserEdit.settingsDescription": "Concede permissão para modificar todas configurações do Overseerr. Um usuário precisa dessa permissão para concedê-la para outros usuários.", + "components.UserEdit.settings": "Gerenciar Configurações", + "components.UserEdit.saving": "Salvando…", + "components.UserEdit.save": "Salvar", + "components.UserEdit.requestDescription": "Concede permissão para solicitar filmes e séries.", + "components.UserEdit.request": "Solicitação", + "components.UserEdit.permissions": "Permissões", + "components.UserEdit.managerequestsDescription": "Concede permissão para gerenciar solicitações no Overseerr. Isso inclui aprová-las e negá-las.", + "components.UserEdit.managerequests": "Gerenciar Solicitações", + "components.UserEdit.email": "E-mail", + "components.UserEdit.edituser": "Editar Usuário", + "components.UserEdit.avatar": "Avatar", + "components.UserEdit.autoapproveDescription": "Concede aprovação automática para todas as solicitações feitas por este usuário.", + "components.UserEdit.autoapprove": "Aprovação Automática", + "components.UserEdit.adminDescription": "Acesso total de administrador. Ignora todas as verificações de permissão.", + "components.UserEdit.admin": "Administrador", + "components.TvDetails.userrating": "Avaliação do usuário", + "components.TvDetails.unavailable": "Indisponível", + "components.TvDetails.similarsubtext": "Outras séries similares a {title}", + "components.TvDetails.similar": "Séries Similares", + "components.TvDetails.showtype": "Categoria", + "components.TvDetails.manageModalClearMediaWarning": "Isso irá remover em definitivo todos dados de mídia, incluindo todas solicitações para esse item. Se este item existir in sua biblioteca do Plex, os dados de mídia serão recriados na próxima sincronia.", + "components.Settings.sonarrSettingsDescription": "Configure sua conexão com Sonarr abaixo. Você pode criar várias, mas apenas duas por vez como padrão (uma para padrão HD, e outra para 4K). Administradores podem alterar qual conexão será usada para novas solicitações.", + "components.Settings.radarrSettingsDescription": "Configure sua conexão com Radarr abaixo. Você pode criar várias, mas apenas duas por vez como padrão (uma para padrão HD, e outra para 4K). Administradores podem alterar qual conexão será usada para novas solicitações.", + "components.Settings.Notifications.testsent": "Notificação de teste enviada!", + "components.Settings.Notifications.test": "Testar", + "components.RequestModal.requestseasons": "Solicitar {seasonCount} {seasonCount, plural, one {Temporada} other {Temporadas}}", + "components.TvDetails.viewfullcrew": "Ver Toda Equipe Técnica", + "components.TvDetails.TvCrew.fullseriescrew": "Equipe Técnica Completa da Série", + "components.PersonDetails.crewmember": "Membro da Equipe Técnica", + "components.MovieDetails.viewfullcrew": "Ver Equipe Técnica Completa", + "components.MovieDetails.MovieCrew.fullcrew": "Equipe Técnica Completa", + "components.UserList.importfromplexerror": "Algo deu errado ao importar usuários do Plex", + "components.UserList.importfromplex": "Importar Usuários do Plex", + "components.UserList.importedfromplex": "{userCount, plural, =0 {Nenhum novo usuário} one {# novo usuário} other {# novos usuários}} importado(s) do Plex", + "components.Settings.defaultPermissions": "Permissões Padrões de Usúarios" } diff --git a/src/i18n/locale/sv.json b/src/i18n/locale/sv.json index 30b12e90..1c04c32a 100644 --- a/src/i18n/locale/sv.json +++ b/src/i18n/locale/sv.json @@ -42,7 +42,7 @@ "components.Settings.menuJobs": "Jobb", "components.Settings.menuGeneralSettings": "Generella Inställningar", "components.Settings.menuAbout": "Om", - "components.Settings.manualscanDescription": "Normalt körs denna var sjätte timme. Overseerr kommer kontrollera till Plex Servers \"senast tillagda\" oftare. Om detta är första gången du konfigurerar din Plex Server är det starkt rekommenderat att göra en manuell full scan av ditt mediabibliotek!", + "components.Settings.manualscanDescription": "Normalt körs denna var tjugofjärde timme. Overseerr kommer kontrollera till Plex Servers \"senast tillagda\" oftare. Om detta är första gången du konfigurerar din Plex Server är det starkt rekommenderat att göra en manuell full scan av ditt mediabibliotek!", "components.Settings.manualscan": "Manuell Biblioteksscan", "components.Settings.librariesRemaining": "Kvarvarande Bibliotek: {count}", "components.Settings.jobname": "Jobbnamn", @@ -51,7 +51,7 @@ "components.Settings.generalsettings": "Generella Inställningar", "components.Settings.edit": "Ändra", "components.Settings.deleteserverconfirm": "Är du säker på att du vill radera servern?", - "components.Settings.delete": "Radera", + "components.Settings.delete": "Ta bort", "components.Settings.default4k": "Standard 4K", "components.Settings.default": "Standard", "components.Settings.currentlibrary": "Nuvarande Bibliotek: {name}", @@ -162,7 +162,7 @@ "components.Settings.Notifications.discordsettingssaved": "Notiferingsinställningar för Discord sparade!", "components.Settings.Notifications.authUser": "Användarnamn", "components.Settings.Notifications.authPass": "Lösenord", - "components.Settings.Notifications.agentenabled": "Agent Aktiverad", + "components.Settings.Notifications.agentenabled": "Aktiverad", "components.Search.searchresults": "Sökresultat", "components.RequestModal.status": "Status", "components.RequestModal.selectseason": "Välj säsong(er)", @@ -185,7 +185,7 @@ "components.RequestModal.cancel": "Avbryt förfrågan", "components.RequestList.status": "Status", "components.RequestList.showingresults": "Visar {from} till {to} av {total} sökresultat", - "components.RequestList.requests": "Förfrågan", + "components.RequestList.requests": "Förfrågningar", "components.RequestList.requestedAt": "Begärd", "components.RequestList.previous": "Föregående", "components.RequestList.next": "Nästa", @@ -255,7 +255,7 @@ "components.TvDetails.approve": "Godkänn", "components.TvDetails.anime": "Anime", "components.TvDetails.TvCast.fullseriescast": "Rollista", - "components.TitleCard.tvshow": "TV-serier", + "components.TitleCard.tvshow": "TV-serie", "components.TitleCard.movie": "Film", "components.Slider.noresults": "Inga resultat", "components.Setup.welcome": "Välkommen till Overseerr", @@ -276,8 +276,8 @@ "i18n.pending": "Väntande", "i18n.partiallyavailable": "Delvis Tillgänglig", "i18n.movies": "Filmer", - "i18n.deleting": "Raderar…", - "i18n.delete": "Radera", + "i18n.deleting": "Tar bort…", + "i18n.delete": "Ta bort", "i18n.declined": "Avböjd", "i18n.decline": "Avböj", "i18n.cancel": "Avbryt", @@ -292,12 +292,12 @@ "components.UserList.user": "Användare", "components.UserList.totalrequests": "Totalt antal förfrågningar", "components.UserList.role": "Roll", - "components.UserList.plexuser": "Plexanvändare", + "components.UserList.plexuser": "Plex", "components.UserList.lastupdated": "Senast uppdaterad", "components.UserList.edit": "Redigera", "components.UserList.deleteuser": "Ta bort användare", "components.UserList.deleteconfirm": "Är du säker på att du vill ta bort användaren? All data för användaren kommer att raderas.", - "components.UserList.delete": "Radera", + "components.UserList.delete": "Ta bort", "components.UserList.created": "Skapad", "components.UserList.admin": "Administratör", "components.UserEdit.voteDescription": "Ger behörighet att rösta på förfrågningar (röstning är inte implementerat ännu)", @@ -346,5 +346,23 @@ "components.TvDetails.decline": "Avböj", "components.TvDetails.cast": "Roller", "components.TvDetails.cancelrequest": "Avbryt begäran", - "components.TvDetails.available": "Tillgänglig" + "components.TvDetails.available": "Tillgänglig", + "i18n.close": "Stäng", + "components.TvDetails.approverequests": "Godkänn {requestCount} {requestCount, plural, one {Request} other {Requests}}", + "components.Setup.loginwithplex": "Logga in med Plex", + "components.Settings.SettingsAbout.timezone": "Tidzon", + "components.Settings.SettingsAbout.supportoverseerr": "Hjälp Overseerr", + "components.Settings.SettingsAbout.helppaycoffee": "Stötta med en kopp kaffe", + "components.Settings.SettingsAbout.Releases.viewongithub": "Visa på GitHub", + "components.Settings.SettingsAbout.Releases.viewchangelog": "Visa ändringslogg", + "components.Settings.SettingsAbout.Releases.versionChangelog": "Ändringslogg", + "components.Settings.SettingsAbout.Releases.runningDevelopMessage": "Ändringarna nedan är inte tillgängliga i din version. Vänligen se GitHub repository för dom senaste uppdateringarna.", + "components.Settings.SettingsAbout.Releases.runningDevelop": "Du kör en utvecklingsversion av Overseerr!", + "components.Settings.SettingsAbout.Releases.releases": "Versioner", + "components.Settings.SettingsAbout.Releases.releasedataMissing": "Versionsdata saknas. Ligger GitHub nere?", + "components.Settings.SettingsAbout.Releases.latestversion": "Senaste Version", + "components.Settings.SettingsAbout.Releases.currentversion": "Aktuell Version", + "components.Settings.Notifications.testsent": "Test-notifikation skickad!", + "components.Settings.Notifications.test": "Testa", + "components.UserList.importfromplex": "Importera användare från Plex" }