Merge branch 'develop' of https://github.com/tidusjar/Ombi into develop

This commit is contained in:
tidusjar 2022-04-14 08:56:57 +01:00
commit f7ac2b3adf
32 changed files with 408 additions and 236 deletions

View file

@ -1,3 +1,16 @@
## [4.16.10](https://github.com/Ombi-app/Ombi/compare/v4.16.9...v4.16.10) (2022-04-13)
## [4.16.9](https://github.com/Ombi-app/Ombi/compare/v4.16.8...v4.16.9) (2022-04-13)
### Bug Fixes
* **plex-watchlist:** Only request the latest season when importing from the watchlist ([77a47ff](https://github.com/Ombi-app/Ombi/commit/77a47ff157c6c5feafe3f2a29a3fcba8df4fdfef))
## [4.16.8](https://github.com/Ombi-app/Ombi/compare/v4.16.7...v4.16.8) (2022-04-13) ## [4.16.8](https://github.com/Ombi-app/Ombi/compare/v4.16.7...v4.16.8) (2022-04-13)
@ -295,16 +308,3 @@
## [4.11.2](https://github.com/Ombi-app/Ombi/compare/v4.11.1...v4.11.2) (2022-02-01)
### Bug Fixes
* :globe_with_meridians: Added Czech and Chinese Simplified to the language list ([68ef366](https://github.com/Ombi-app/Ombi/commit/68ef366e8525e2c349b9e81704ad8bcca6c347a0))
## [4.11.1](https://github.com/Ombi-app/Ombi/compare/v4.11.0...v4.11.1) (2022-02-01)

View file

@ -251,7 +251,7 @@ namespace Ombi.Core.Engine
var requests = await (OrderMovies(allRequests, orderFilter.OrderType)).Skip(position).Take(count) var requests = await (OrderMovies(allRequests, orderFilter.OrderType)).Skip(position).Take(count)
.ToListAsync(); .ToListAsync();
await CheckForSubscription(shouldHide, requests); await CheckForSubscription(shouldHide.UserId, requests);
return new RequestsViewModel<MovieRequests> return new RequestsViewModel<MovieRequests>
{ {
Collection = requests, Collection = requests,
@ -295,7 +295,7 @@ namespace Ombi.Core.Engine
var total = requests.Count(); var total = requests.Count();
requests = requests.Skip(position).Take(count).ToList(); requests = requests.Skip(position).Take(count).ToList();
await CheckForSubscription(shouldHide, requests); await CheckForSubscription(shouldHide.UserId, requests);
return new RequestsViewModel<MovieRequests> return new RequestsViewModel<MovieRequests>
{ {
Collection = requests, Collection = requests,
@ -380,7 +380,7 @@ namespace Ombi.Core.Engine
// TODO fix this so we execute this on the server // TODO fix this so we execute this on the server
requests = requests.Skip(position).Take(count).ToList(); requests = requests.Skip(position).Take(count).ToList();
await CheckForSubscription(shouldHide, requests); await CheckForSubscription(shouldHide.UserId, requests);
return new RequestsViewModel<MovieRequests> return new RequestsViewModel<MovieRequests>
{ {
Collection = requests, Collection = requests,
@ -423,7 +423,7 @@ namespace Ombi.Core.Engine
var total = requests.Count(); var total = requests.Count();
requests = requests.Skip(position).Take(count).ToList(); requests = requests.Skip(position).Take(count).ToList();
await CheckForSubscription(shouldHide, requests); await CheckForSubscription(shouldHide.UserId, requests);
return new RequestsViewModel<MovieRequests> return new RequestsViewModel<MovieRequests>
{ {
Collection = requests, Collection = requests,
@ -505,7 +505,7 @@ namespace Ombi.Core.Engine
allRequests = await MovieRepository.GetWithUser().ToListAsync(); allRequests = await MovieRepository.GetWithUser().ToListAsync();
} }
await CheckForSubscription(shouldHide, allRequests); await CheckForSubscription(shouldHide.UserId, allRequests);
return allRequests; return allRequests;
} }
@ -513,21 +513,21 @@ namespace Ombi.Core.Engine
public async Task<MovieRequests> GetRequest(int requestId) public async Task<MovieRequests> GetRequest(int requestId)
{ {
var request = await MovieRepository.GetWithUser().Where(x => x.Id == requestId).FirstOrDefaultAsync(); var request = await MovieRepository.GetWithUser().Where(x => x.Id == requestId).FirstOrDefaultAsync();
await CheckForSubscription(new HideResult(), new List<MovieRequests> { request }); await CheckForSubscription((await GetUser()).Id, new List<MovieRequests> { request });
return request; return request;
} }
private async Task CheckForSubscription(HideResult shouldHide, List<MovieRequests> movieRequests) private async Task CheckForSubscription(string UserId, List<MovieRequests> movieRequests)
{ {
var requestIds = movieRequests.Select(x => x.Id); var requestIds = movieRequests.Select(x => x.Id);
var sub = await _subscriptionRepository.GetAll().Where(s => var sub = await _subscriptionRepository.GetAll().Where(s =>
s.UserId == shouldHide.UserId && requestIds.Contains(s.RequestId) && s.RequestType == RequestType.Movie) s.UserId == UserId && requestIds.Contains(s.RequestId) && s.RequestType == RequestType.Movie)
.ToListAsync(); .ToListAsync();
foreach (var x in movieRequests) foreach (var x in movieRequests)
{ {
x.PosterPath = PosterPathHelper.FixPosterPath(x.PosterPath); x.PosterPath = PosterPathHelper.FixPosterPath(x.PosterPath);
if (shouldHide.UserId == x.RequestedUserId) if (UserId == x.RequestedUserId)
{ {
x.ShowSubscribe = false; x.ShowSubscribe = false;
} }
@ -559,7 +559,7 @@ namespace Ombi.Core.Engine
} }
var results = allRequests.Where(x => x.Title.Contains(search, CompareOptions.IgnoreCase)).ToList(); var results = allRequests.Where(x => x.Title.Contains(search, CompareOptions.IgnoreCase)).ToList();
await CheckForSubscription(shouldHide, results); await CheckForSubscription(shouldHide.UserId, results);
return results; return results;
} }

View file

@ -1,4 +1,5 @@
using System.ComponentModel.DataAnnotations.Schema; using System;
using System.ComponentModel.DataAnnotations.Schema;
using Ombi.Store.Entities; using Ombi.Store.Entities;
namespace Ombi.Core.Models.Search namespace Ombi.Core.Models.Search
@ -32,6 +33,7 @@ namespace Ombi.Core.Models.Search
public string TheMovieDbId { get; set; } public string TheMovieDbId { get; set; }
[NotMapped] [NotMapped]
[Obsolete("Use request service instead")]
public bool Subscribed { get; set; } public bool Subscribed { get; set; }
[NotMapped] [NotMapped]
public bool ShowSubscribe { get; set; } public bool ShowSubscribe { get; set; }

View file

@ -148,9 +148,9 @@
<value>Album</value> <value>Album</value>
</data> </data>
<data name="Movie" xml:space="preserve"> <data name="Movie" xml:space="preserve">
<value>Movie</value> <value>Film</value>
</data> </data>
<data name="TvShow" xml:space="preserve"> <data name="TvShow" xml:space="preserve">
<value>TV Show</value> <value>TV-Serier</value>
</data> </data>
</root> </root>

View file

@ -121,7 +121,7 @@
<value>Nouveaux Albums</value> <value>Nouveaux Albums</value>
</data> </data>
<data name="NewMovies" xml:space="preserve"> <data name="NewMovies" xml:space="preserve">
<value>Nouveaux Films</value> <value>Nouveaux films</value>
</data> </data>
<data name="NewTV" xml:space="preserve"> <data name="NewTV" xml:space="preserve">
<value>Nouvelles séries</value> <value>Nouvelles séries</value>

View file

@ -4,30 +4,18 @@
<div *ngIf="movie" class="main-content-container"> <div *ngIf="movie" class="main-content-container">
<top-banner [background]="movie.background" [available]="movie.available" [title]="movie.title" [releaseDate]="movie.releaseDate" [tagline]="movie.tagline"></top-banner> <top-banner [background]="movie.background" [available]="movie.available" [title]="movie.title"
[releaseDate]="movie.releaseDate" [tagline]="movie.tagline"></top-banner>
<div class="social-icons-container"> <div class="social-icons-container">
<social-icons <social-icons [homepage]="movie.homepage" [theMoviedbId]="movie.id"
[homepage]="movie.homepage" [hasTrailer]="movie.videos?.results?.length > 0" [imdbId]="movie.imdbId"
[theMoviedbId]="movie.id" [twitter]="movie.externalIds.twitterId" [facebook]="movie.externalIds.facebookId"
[hasTrailer]="movie.videos?.results?.length > 0" [instagram]="movie.externalIds.instagramId" [available]="movie.available" [plexUrl]="movie.plexUrl"
[imdbId]="movie.imdbId" [embyUrl]="movie.embyUrl" [jellyfinUrl]="movie.jellyfinUrl" [isAdmin]="isAdmin"
[twitter]="movie.externalIds.twitterId" [canShowAdvanced]="showAdvanced && movieRequest" [type]="requestType" [has4KRequest]="movie.has4KRequest"
[facebook]="movie.externalIds.facebookId" (openTrailer)="openDialog()" (onAdvancedOptions)="openAdvancedOptions()"
[instagram]="movie.externalIds.instagramId" (onReProcessRequest)="reProcessRequest(false)" (onReProcess4KRequest)="reProcessRequest(true)">
[available]="movie.available"
[plexUrl]="movie.plexUrl"
[embyUrl]="movie.embyUrl"
[jellyfinUrl]="movie.jellyfinUrl"
[isAdmin]="isAdmin"
[canShowAdvanced]="showAdvanced && movieRequest"
[type]="requestType"
[has4KRequest]="movie.has4KRequest"
(openTrailer)="openDialog()"
(onAdvancedOptions)="openAdvancedOptions()"
(onReProcessRequest)="reProcessRequest(false)"
(onReProcess4KRequest)="reProcessRequest(true)"
>
</social-icons> </social-icons>
</div> </div>
@ -43,118 +31,147 @@
<div class="details-button-container"> <div class="details-button-container">
<div class="col-12 media-row"> <div class="col-12 media-row">
<span *ngIf="movie.available || movie.available4K"> <span *ngIf="movie.available || movie.available4K">
<a id="viewOnPlexButton" *ngIf="movie.plexUrl" href="{{movie.plexUrl}}" mat-raised-button target="_blank" class="btn-spacing viewon-btn plex"> <a id="viewOnPlexButton" *ngIf="movie.plexUrl" href="{{movie.plexUrl}}" mat-raised-button
target="_blank" class="btn-spacing viewon-btn plex">
{{'Search.ViewOnPlex' | translate}} {{'Search.ViewOnPlex' | translate}}
<i class="far fa-play-circle fa-2x"></i> <i class="far fa-play-circle fa-2x"></i>
</a> </a>
<a id="viewOnEmbyButton" *ngIf="movie.embyUrl" href="{{movie.embyUrl}}" mat-raised-button target="_blank" class="btn-spacing viewon-btn emby"> <a id="viewOnEmbyButton" *ngIf="movie.embyUrl" href="{{movie.embyUrl}}" mat-raised-button
target="_blank" class="btn-spacing viewon-btn emby">
{{'Search.ViewOnEmby' | translate}} {{'Search.ViewOnEmby' | translate}}
<i class="far fa-play-circle fa-2x"></i> <i class="far fa-play-circle fa-2x"></i>
</a> </a>
<a id="viewOnJellyfinButton" *ngIf="movie.jellyfinUrl" href="{{movie.jellyfinUrl}}" mat-raised-button target="_blank" class="btn-spacing viewon-btn jellyfin"> <a id="viewOnJellyfinButton" *ngIf="movie.jellyfinUrl" href="{{movie.jellyfinUrl}}"
mat-raised-button target="_blank" class="btn-spacing viewon-btn jellyfin">
{{'Search.ViewOnJellyfin' | translate}} {{'Search.ViewOnJellyfin' | translate}}
<i class="far fa-play-circle fa-2x"></i> <i class="far fa-play-circle fa-2x"></i>
</a> </a>
</span> </span>
<!-- Regular Movie Status --> <!-- Regular Movie Status -->
<button mat-raised-button class="btn-green btn-spacing" id="availableBtn" *ngIf="movie.available && !movie.plexUrl && !movie.embyUrl && !movie.jellyfinUrl"> {{ <button mat-raised-button class="btn-green btn-spacing" id="availableBtn"
'Common.Available' | translate }}</button> *ngIf="movie.available && !movie.plexUrl && !movie.embyUrl && !movie.jellyfinUrl"> {{
<span *ngIf="!movie.available"> 'Common.Available' | translate }}</button>
<span *ngIf="movie.requested || movie.approved; then requestedBtn else notRequestedBtn"></span> <span *ngIf="!movie.available">
<ng-template #requestedBtn> <span
<button id="requestedBtn" mat-raised-button *ngIf="!hasRequest || hasRequest && movieRequest && !movieRequest.denied" class="btn-spacing" color="warn" [disabled]> *ngIf="movie.requested || movie.approved; then requestedBtn else notRequestedBtn"></span>
<i class="fas fa-check"></i> <ng-template #requestedBtn>
{{ 'Common.Requested' | translate }} <button id="requestedBtn" mat-raised-button
</button> *ngIf="!hasRequest || hasRequest && movieRequest && !movieRequest.denied"
</ng-template> class="btn-spacing" color="warn" [disabled]>
<ng-template #notRequestedBtn> <i class="fas fa-check"></i>
<button *ngIf="!movie.requested" id="requestBtn" mat-raised-button class="btn-spacing" color="primary" (click)="request(false)"> {{ 'Common.Requested' | translate }}
<i *ngIf="movie.requestProcessing" class="fas fa-circle-notch fa-spin fa-fw"></i> </button>
<i *ngIf="!movie.requestProcessing && !movie.processed" class="fas fa-plus"></i> </ng-template>
<i *ngIf="movie.processed && !movie.requestProcessing" class="fas fa-check"></i> <ng-template #notRequestedBtn>
{{'Common.Request' | translate }} <button *ngIf="!movie.requested" id="requestBtn" mat-raised-button class="btn-spacing"
</button> color="primary" (click)="request(false)">
</ng-template> <i *ngIf="movie.requestProcessing" class="fas fa-circle-notch fa-spin fa-fw"></i>
<i *ngIf="!movie.requestProcessing && !movie.processed" class="fas fa-plus"></i>
<i *ngIf="movie.processed && !movie.requestProcessing" class="fas fa-check"></i>
{{'Common.Request' | translate }}
</button>
</ng-template>
</span> </span>
<!-- 4k Status --> <!-- 4k Status -->
<span *ngIf="is4KEnabled"> <span *ngIf="is4KEnabled">
<span *permission="roleName4k"> <span *permission="roleName4k">
<button mat-raised-button class="btn-green btn-spacing" id="availableBtn4k" *ngIf="movie.available4K"> {{ <button mat-raised-button class="btn-green btn-spacing" id="availableBtn4k"
*ngIf="movie.available4K"> {{
'Common.Available4K' | translate }} 'Common.Available4K' | translate }}
</button> </button>
<span *ngIf="!movie.available4K"> <span *ngIf="!movie.available4K">
<span *ngIf="movie.has4KRequest || movie.approved4K; then requestedBtn4K else notRequestedBtn4K"></span> <span
*ngIf="movie.has4KRequest || movie.approved4K; then requestedBtn4K else notRequestedBtn4K"></span>
<ng-template #requestedBtn4K> <ng-template #requestedBtn4K>
<button id="requestedBtn4K" mat-raised-button *ngIf="movieRequest && !movieRequest.denied4K" class="btn-spacing" color="warn" [disabled]> <button id="requestedBtn4K" mat-raised-button
*ngIf="movieRequest && !movieRequest.denied4K" class="btn-spacing"
color="warn" [disabled]>
<i class="fas fa-check"></i> <i class="fas fa-check"></i>
{{ 'Common.Requested4K' | translate }} {{ 'Common.Requested4K' | translate }}
</button> </button>
</ng-template> </ng-template>
<ng-template #notRequestedBtn4K> <ng-template #notRequestedBtn4K>
<button *ngIf="!movie.has4KRequest" id="requestBtn4k" mat-raised-button class="btn-spacing" color="primary" (click)="request(true)"> <button *ngIf="!movie.has4KRequest" id="requestBtn4k" mat-raised-button
<i *ngIf="movie.requestProcessing" class="fas fa-circle-notch fa-spin fa-fw"></i> class="btn-spacing" color="primary" (click)="request(true)">
<i *ngIf="!movie.requestProcessing && !movie.processed" class="fas fa-plus"></i> <i *ngIf="movie.requestProcessing"
<i *ngIf="movie.processed && !movie.requestProcessing" class="fas fa-check"></i> class="fas fa-circle-notch fa-spin fa-fw"></i>
<i *ngIf="!movie.requestProcessing && !movie.processed"
class="fas fa-plus"></i>
<i *ngIf="movie.processed && !movie.requestProcessing"
class="fas fa-check"></i>
{{'Common.Request4K' | translate }} {{'Common.Request4K' | translate }}
</button> </button>
</ng-template> </ng-template>
<span *ngIf="!isAdmin && movie.showSubscribe" >
<button *ngIf="!movie.subscribed" (click)="notify()" id="notifyBtn" mat-raised-button class="btn-spacing" > <i class="fas fa-bell"></i>
{{ 'Requests.Notify' | translate }}</button>
<button *ngIf="movie.subscribed" (click)="unNotify()" id="unnotifyBtn" mat-raised-button class="btn-spacing" > <i class="fas fa-bell-slash"></i>
{{ 'Requests.RemoveNotification' | translate }}</button>
</span>
</span> </span>
</span> </span>
</span> </span>
<span *ngIf="movieRequest?.showSubscribe">
<button *ngIf="!movieRequest?.subscribed" (click)="notify()" id="notifyBtn"
mat-raised-button class="btn-spacing"> <i class="fas fa-bell"></i>
{{ 'Requests.Notify' | translate }}</button>
<button *ngIf="movieRequest?.subscribed" (click)="unNotify()" id="unnotifyBtn"
mat-raised-button class="btn-spacing"> <i class="fas fa-bell-slash"></i>
{{ 'Requests.RemoveNotification' | translate }}</button>
</span>
<span *ngIf="isAdmin && hasRequest"> <span *ngIf="isAdmin && hasRequest">
<button id="approveBtn" *ngIf="!movie.approved && movie.requested" (click)="approve(false)" mat-raised-button class="btn-spacing" color="accent"> <button id="approveBtn" *ngIf="!movie.approved && movie.requested" (click)="approve(false)"
<i class="fas fa-plus"></i> {{ 'Common.Approve' | translate }} mat-raised-button class="btn-spacing" color="accent">
</button> <i class="fas fa-plus"></i> {{ 'Common.Approve' | translate }}
<button id="markAvailableBtn" *ngIf="!movie.available && movie.requested" (click)="markAvailable(false)" mat-raised-button class="btn-spacing" </button>
color="accent"> <button id="markAvailableBtn" *ngIf="!movie.available && movie.requested"
<i class="fas fa-plus"></i> {{ 'Requests.MarkAvailable' | translate }} (click)="markAvailable(false)" mat-raised-button class="btn-spacing" color="accent">
</button> <i class="fas fa-plus"></i> {{ 'Requests.MarkAvailable' | translate }}
<button id="markUnavailableBtn" *ngIf="movie.available && movie.requested" (click)="markUnavailable(false)" mat-raised-button class="btn-spacing" </button>
color="accent"> <button id="markUnavailableBtn" *ngIf="movie.available && movie.requested"
<i class="fas fa-minus"></i> {{ 'Requests.MarkUnavailable' | translate }} (click)="markUnavailable(false)" mat-raised-button class="btn-spacing" color="accent">
</button> <i class="fas fa-minus"></i> {{ 'Requests.MarkUnavailable' | translate }}
</button>
<!-- 4k --> <!-- 4k -->
<span *ngIf="is4KEnabled"> <span *ngIf="is4KEnabled">
<span *permission="roleName4k"> <span *permission="roleName4k">
<button id="approve4kBtn" *ngIf="!movie.approved4K && movie.has4KRequest" (click)="approve(true)" mat-raised-button class="btn-spacing" color="accent"> <button id="approve4kBtn" *ngIf="!movie.approved4K && movie.has4KRequest"
<i class="fas fa-plus"></i> {{ 'Common.Approve4K' | translate }} (click)="approve(true)" mat-raised-button class="btn-spacing" color="accent">
</button> <i class="fas fa-plus"></i> {{ 'Common.Approve4K' | translate }}
<button id="markAvailable4kBtn" *ngIf="!movie.available4K && movie.has4KRequest" (click)="markAvailable(true)" mat-raised-button class="btn-spacing" </button>
color="accent"> <button id="markAvailable4kBtn" *ngIf="!movie.available4K && movie.has4KRequest"
<i class="fas fa-plus"></i> {{ 'Requests.MarkAvailable4K' | translate }} (click)="markAvailable(true)" mat-raised-button class="btn-spacing"
</button> color="accent">
<button id="markUnavailable4kBtn" *ngIf="movie.available4K" (click)="markUnavailable(true)" mat-raised-button class="btn-spacing" <i class="fas fa-plus"></i> {{ 'Requests.MarkAvailable4K' | translate }}
color="accent"> </button>
<i class="fas fa-minus"></i> {{ 'Requests.MarkUnavailable4K' | translate }} <button id="markUnavailable4kBtn" *ngIf="movie.available4K"
</button> (click)="markUnavailable(true)" mat-raised-button class="btn-spacing"
</span> color="accent">
<i class="fas fa-minus"></i> {{ 'Requests.MarkUnavailable4K' | translate }}
</button>
</span> </span>
<button id="denyBtn" *ngIf="!movieRequest.denied && movie.requested" mat-raised-button class="btn-spacing" color="warn" (click)="deny(false)">
<i class="fas fa-times"></i> {{'Requests.Deny' | translate }}
</button>
<button id="deniedButton" *ngIf="movieRequest && movieRequest.denied" [matTooltip]="movieRequest.deniedReason" mat-raised-button class="btn-spacing" color="warn">
<i class="fas fa-times"></i> {{'MediaDetails.Denied' | translate }}
</button>
</span> </span>
<button id="reportIssueBtn" mat-raised-button class="btn-spacing" color="danger" (click)="issue()" *ngIf="issuesEnabled"> <button id="denyBtn" *ngIf="!movieRequest.denied && movie.requested" mat-raised-button
<i class="fas fa-exclamation"></i> {{'Requests.ReportIssue' | translate }} class="btn-spacing" color="warn" (click)="deny(false)">
<i class="fas fa-times"></i> {{'Requests.Deny' | translate }}
</button> </button>
<button id="viewCollectionBtn" *ngIf="movie.belongsToCollection" [routerLink]="'/discover/collection/' + movie.belongsToCollection.id" mat-raised-button class="btn-spacing">
<i class="fas fa-list"></i> {{'MediaDetails.ViewCollection' | translate}} <button id="deniedButton" *ngIf="movieRequest && movieRequest.denied"
[matTooltip]="movieRequest.deniedReason" mat-raised-button class="btn-spacing"
color="warn">
<i class="fas fa-times"></i> {{'MediaDetails.Denied' | translate }}
</button> </button>
</span>
<button id="reportIssueBtn" mat-raised-button class="btn-spacing" color="danger"
(click)="issue()" *ngIf="issuesEnabled">
<i class="fas fa-exclamation"></i> {{'Requests.ReportIssue' | translate }}
</button>
<button id="viewCollectionBtn" *ngIf="movie.belongsToCollection"
[routerLink]="'/discover/collection/' + movie.belongsToCollection.id" mat-raised-button
class="btn-spacing">
<i class="fas fa-list"></i> {{'MediaDetails.ViewCollection' | translate}}
</button>
</div> </div>
</div> </div>
</div> </div>
@ -163,7 +180,8 @@
<div class="col-12 col-md-2"> <div class="col-12 col-md-2">
<mat-card class="mat-elevation-z8"> <mat-card class="mat-elevation-z8">
<mat-card-content> <mat-card-content>
<movie-information-panel [movie]="movie" [request]="movieRequest" [advancedOptions]="showAdvanced"></movie-information-panel> <movie-information-panel [movie]="movie" [request]="movieRequest"
[advancedOptions]="showAdvanced"></movie-information-panel>
</mat-card-content> </mat-card-content>
</mat-card> </mat-card>
@ -199,9 +217,14 @@
<mat-card class="mat-elevation-z8"> <mat-card class="mat-elevation-z8">
<mat-card-header>{{'MediaDetails.Trailers' | translate}}</mat-card-header> <mat-card-header>{{'MediaDetails.Trailers' | translate}}</mat-card-header>
<mat-card-content> <mat-card-content>
<p-carousel class="no-indicator" [numVisible]="2" [numScroll]="10" [page]="0" [value]="movie.videos?.results"> <p-carousel class="no-indicator" [numVisible]="2" [numScroll]="10" [page]="0"
[value]="movie.videos?.results">
<ng-template let-result pTemplate="item"> <ng-template let-result pTemplate="item">
<iframe width="98%" height="315px" [src]="'https://www.youtube.com/embed/' + result.key | safe" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> <iframe width="98%" height="315px"
[src]="'https://www.youtube.com/embed/' + result.key | safe"
frameborder="0"
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen></iframe>
</ng-template> </ng-template>
</p-carousel> </p-carousel>
</mat-card-content> </mat-card-content>
@ -229,7 +252,9 @@
<div class="sidebar affixable affix-top preview-poster"> <div class="sidebar affixable affix-top preview-poster">
<div class="poster"> <div class="poster">
<a [routerLink]="'/details/movie/'+r.id"> <a [routerLink]="'/details/movie/'+r.id">
<img class="real grow" matTooltip="{{r.title}}" src="https://image.tmdb.org/t/p/w300/{{r.poster_path}}" alt="Poster" style="display: block;"> <img class="real grow" matTooltip="{{r.title}}"
src="https://image.tmdb.org/t/p/w300/{{r.poster_path}}"
alt="Poster" style="display: block;">
</a> </a>
</div> </div>
</div> </div>
@ -249,7 +274,9 @@
<div class="sidebar affixable affix-top preview-poster"> <div class="sidebar affixable affix-top preview-poster">
<div class="poster "> <div class="poster ">
<a [routerLink]="'/details/movie/'+r.id"> <a [routerLink]="'/details/movie/'+r.id">
<img class="real grow" matTooltip="{{r.title}}" src="https://image.tmdb.org/t/p/w300/{{r.poster_path}}" alt="Poster" style="display: block;"> <img class="real grow" matTooltip="{{r.title}}"
src="https://image.tmdb.org/t/p/w300/{{r.poster_path}}"
alt="Poster" style="display: block;">
</a> </a>
</div> </div>
</div> </div>

View file

@ -98,7 +98,9 @@
<button id="bulkFab" *ngIf="selection.hasValue() && isAdmin" mat-fab color="accent" class="floating-fab" [matMenuTriggerFor]="aboveMenu"> <button id="bulkFab" *ngIf="selection.hasValue() && isAdmin" mat-fab color="accent" class="floating-fab" [matMenuTriggerFor]="aboveMenu">
<i class="fas fa-bars"></i></button> <i class="fas fa-bars"></i></button>
<mat-menu #aboveMenu="matMenu" yPosition="above"> <mat-menu #aboveMenu="matMenu" yPosition="above">
<button id="deleteFabButton" mat-menu-item (click)="bulkDelete()">{{'Requests.RequestPanel.Delete' | translate}}</button>
<button id="approveFabButton" mat-menu-item (click)="bulkApprove()">{{'Requests.RequestPanel.Approve' | translate}}</button> <button id="approveFabButton" mat-menu-item (click)="bulkApprove()">{{'Requests.RequestPanel.Approve' | translate}}</button>
<button id="approve4kFabButton" mat-menu-item (click)="bulkApprove4K()">{{'Requests.RequestPanel.Approve4K' | translate}}</button> <button *ngIf="is4kEnabled" id="approve4kFabButton" mat-menu-item (click)="bulkApprove4K()">{{'Requests.RequestPanel.Approve4K' | translate}}</button>
<button id="denyFabButton" mat-menu-item (click)="bulkDeny()">{{'Requests.RequestPanel.Deny' | translate}}</button>
<button *ngIf="is4kEnabled" id="deny4kFabButton" mat-menu-item (click)="bulkDeny4K()">{{'Requests.RequestPanel.Deny4K' | translate}}</button>
<button id="deleteFabButton" mat-menu-item (click)="bulkDelete()">{{'Requests.RequestPanel.Delete' | translate}}</button>
</mat-menu> </mat-menu>

View file

@ -62,11 +62,11 @@ export class MoviesGridComponent implements OnInit, AfterViewInit {
this.manageOwnRequests = this.auth.hasRole("ManageOwnRequests") this.manageOwnRequests = this.auth.hasRole("ManageOwnRequests")
if (this.isAdmin) { if (this.isAdmin) {
this.displayedColumns.unshift('select'); this.displayedColumns.unshift('select');
} }
this.is4kEnabled = this.featureFacade.is4kEnabled(); this.is4kEnabled = this.featureFacade.is4kEnabled();
if ((this.isAdmin || this.auth.hasRole("Request4KMovie")) if ((this.isAdmin || this.auth.hasRole("Request4KMovie"))
&& this.is4kEnabled) { && this.is4kEnabled) {
this.displayedColumns.splice(4, 0, 'has4kRequest'); this.displayedColumns.splice(4, 0, 'has4kRequest');
} }
@ -155,13 +155,13 @@ export class MoviesGridComponent implements OnInit, AfterViewInit {
private checkDate(date: Date|string): boolean { private checkDate(date: Date|string): boolean {
if (typeof date === 'string') { if (typeof date === 'string') {
return new Date(date).getFullYear() > 1; return new Date(date).getFullYear() > 1;
} }
if (date instanceof Date) { if (date instanceof Date) {
return date.getFullYear() > 1; return date.getFullYear() > 1;
} }
return false; return false;
} }
public switchFilter(type: RequestFilterType) { public switchFilter(type: RequestFilterType) {
this.currentFilter = type; this.currentFilter = type;
@ -172,15 +172,15 @@ export class MoviesGridComponent implements OnInit, AfterViewInit {
const numSelected = this.selection.selected.length; const numSelected = this.selection.selected.length;
const numRows = this.dataSource.data.length; const numRows = this.dataSource.data.length;
return numSelected === numRows; return numSelected === numRows;
} }
public masterToggle() { public masterToggle() {
this.isAllSelected() ? this.isAllSelected() ?
this.selection.clear() : this.selection.clear() :
this.dataSource.data.forEach(row => this.selection.select(row)); this.dataSource.data.forEach(row => this.selection.select(row));
} }
public async bulkDelete() { public async bulkDelete() {
if (this.selection.isEmpty()) { if (this.selection.isEmpty()) {
return; return;
} }
@ -194,13 +194,13 @@ export class MoviesGridComponent implements OnInit, AfterViewInit {
this.selection.clear(); this.selection.clear();
this.ngAfterViewInit(); this.ngAfterViewInit();
}); });
} }
public bulkApprove = () => this.bulkApproveInternal(false); public bulkApprove = () => this.bulkApproveInternal(false);
public bulkApprove4K = () => this.bulkApproveInternal(true); public bulkApprove4K = () => this.bulkApproveInternal(true);
private bulkApproveInternal(is4k: boolean) { private bulkApproveInternal(is4k: boolean) {
if (this.selection.isEmpty()) { if (this.selection.isEmpty()) {
return; return;
} }
@ -222,12 +222,45 @@ export class MoviesGridComponent implements OnInit, AfterViewInit {
this.selection.clear(); this.selection.clear();
this.ngAfterViewInit(); this.ngAfterViewInit();
}) })
} }
public getRequestDate(request: IMovieRequests) : Date { public bulkDeny = () => this.bulkDenyInternal(false);
public bulkDeny4K = () => this.bulkDenyInternal(true);
private bulkDenyInternal(is4k: boolean) {
if (this.selection.isEmpty()) {
return;
}
let tasks = new Array<Observable<IRequestEngineResult>>();
this.selection.selected.forEach((selected) => {
tasks.push(this.requestServiceV1.denyMovie({
id: selected.id,
is4K: is4k,
reason: `` // TOOD: reuse DenyDialog to allow for a reason to be entered
}));
});
this.isLoadingResults = true;
forkJoin(tasks).subscribe((result: IRequestEngineResult[]) => {
this.isLoadingResults = false;
const failed = result.filter(x => !x.result);
if (failed.length > 0) {
this.notification.error("Some requests failed to deny: " + failed[0].errorMessage);
this.selection.clear();
return;
}
this.notification.success(this.translateService.instant('Requests.RequestPanel.Denied'));
this.selection.clear();
this.ngAfterViewInit();
})
}
public getRequestDate(request: IMovieRequests): Date {
if (new Date(request.requestedDate).getFullYear() === 1) { if (new Date(request.requestedDate).getFullYear() === 1) {
return request.requestedDate4k; return request.requestedDate4k;
} }
return request.requestedDate; return request.requestedDate;
} }
} }

View file

@ -1,14 +1,20 @@
<mat-nav-list> <mat-nav-list>
<a id="requestDelete" *ngIf="data.isAdmin || data.manageOwnRequests" (click)="delete()" mat-list-item>
<span mat-line>{{'Requests.RequestPanel.Delete' | translate}}</span>
</a>
<a id="requestApprove" *ngIf="data.canApprove && data.isAdmin && data.hasRegularRequest" (click)="approve()" mat-list-item> <a id="requestApprove" *ngIf="data.canApprove && data.isAdmin && data.hasRegularRequest" (click)="approve()" mat-list-item>
<span mat-line>{{'Requests.RequestPanel.Approve' | translate}}</span> <span mat-line>{{'Requests.RequestPanel.Approve' | translate}}</span>
</a> </a>
<a id="requestDeny" *ngIf="data.canApprove && data.isAdmin && data.hasRegularRequest" (click)="deny()" mat-list-item>
<span mat-line>{{'Requests.RequestPanel.Deny' | translate}}</span>
</a>
<a id="requestApprove4k" *ngIf="data.canApprove && data.isAdmin && data.has4kRequest ?? false" (click)="approve4K()" mat-list-item> <a id="requestApprove4k" *ngIf="data.canApprove && data.isAdmin && data.has4kRequest ?? false" (click)="approve4K()" mat-list-item>
<span mat-line>{{'Requests.RequestPanel.Approve4K' | translate}}</span> <span mat-line>{{'Requests.RequestPanel.Approve4K' | translate}}</span>
</a> </a>
<a id="requestDeny4k" *ngIf="data.canApprove && data.isAdmin && data.has4kRequest ?? false" (click)="deny4K()" mat-list-item>
<span mat-line>{{'Requests.RequestPanel.Deny4K' | translate}}</span>
</a>
<a id="requestChangeAvailability" *ngIf="data.type !== RequestType.tvShow && data.isAdmin" (click)="changeAvailability()" mat-list-item> <a id="requestChangeAvailability" *ngIf="data.type !== RequestType.tvShow && data.isAdmin" (click)="changeAvailability()" mat-list-item>
<span mat-line>{{'Requests.RequestPanel.ChangeAvailability' | translate}}</span> <span mat-line>{{'Requests.RequestPanel.ChangeAvailability' | translate}}</span>
</a> </a>
<a id="requestDelete" *ngIf="data.isAdmin || data.manageOwnRequests" (click)="delete()" mat-list-item>
<span mat-line>{{'Requests.RequestPanel.Delete' | translate}}</span>
</a>
</mat-nav-list> </mat-nav-list>

View file

@ -5,6 +5,8 @@ import { IRequestEngineResult, RequestType } from '../../../interfaces';
import { UpdateType } from '../../models/UpdateType'; import { UpdateType } from '../../models/UpdateType';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { firstValueFrom, Observable } from 'rxjs'; import { firstValueFrom, Observable } from 'rxjs';
import { DenyDialogComponent } from '../../../media-details/components/shared/deny-dialog/deny-dialog.component';
import { MatDialog } from '@angular/material/dialog';
@Component({ @Component({
selector: 'request-options', selector: 'request-options',
@ -17,6 +19,7 @@ export class RequestOptionsComponent {
constructor(@Inject(MAT_BOTTOM_SHEET_DATA) public data: any, constructor(@Inject(MAT_BOTTOM_SHEET_DATA) public data: any,
private requestService: RequestService, private requestService: RequestService,
private messageService: MessageService, private messageService: MessageService,
public dialog: MatDialog,
private bottomSheetRef: MatBottomSheetRef<RequestOptionsComponent>, private bottomSheetRef: MatBottomSheetRef<RequestOptionsComponent>,
private translate: TranslateService) { } private translate: TranslateService) { }
@ -33,11 +36,11 @@ export class RequestOptionsComponent {
} }
request.subscribe(result => { request.subscribe(result => {
if (result.result) { if (result.result) {
this.messageService.send(this.translate.instant("Requests.SuccessfullyDeleted")); this.messageService.send(this.translate.instant("Requests.SuccessfullyDeleted"));
this.bottomSheetRef.dismiss({type: UpdateType.Delete}); this.bottomSheetRef.dismiss({type: UpdateType.Delete});
return; return;
} else { } else {
this.messageService.sendRequestEngineResultError(result); this.messageService.sendRequestEngineResultError(result);
} }
}); });
} }
@ -57,6 +60,24 @@ export class RequestOptionsComponent {
return; return;
} }
public deny = () => this.denyInternal(false);
public deny4K = () => this.denyInternal(true);
private async denyInternal(is4K: boolean) {
const dialogRef = this.dialog.open(DenyDialogComponent, {
width: '250px',
data: { requestId: this.data.id, is4K: is4K, requestType: this.data.type }
});
dialogRef.afterClosed().subscribe(result => {
if (result.denied) {
this.bottomSheetRef.dismiss({ type: UpdateType.Deny });
}
});
}
public async approve4K() { public async approve4K() {
if (this.data.type != RequestType.movie) { if (this.data.type != RequestType.movie) {
return; return;

View file

@ -35,6 +35,11 @@ export class RequestsListComponent {
event.onChange(); event.onChange();
return; return;
} }
if (result.type == UpdateType.Deny) {
event.request.requestStatus = 'Common.Denied';
event.onChange();
return;
}
}); });
} }
} }

View file

@ -1,5 +1,6 @@
export enum UpdateType { export enum UpdateType {
Delete, Delete,
Approve, Approve,
Availability Availability,
Deny
} }

View file

@ -207,10 +207,13 @@
"RequestPanel": { "RequestPanel": {
"Delete": "Изтриване на заявка", "Delete": "Изтриване на заявка",
"Approve": "Одобряване на заявка", "Approve": "Одобряване на заявка",
"Deny": "Deny Request",
"Approve4K": "Approve 4K Request", "Approve4K": "Approve 4K Request",
"Deny4K": "Deny 4K Request",
"ChangeAvailability": "Маркиране като налично", "ChangeAvailability": "Маркиране като налично",
"Deleted": "Избраните елементи са изтрити успешно", "Deleted": "Избраните елементи са изтрити успешно",
"Approved": "Избраните елементи са одобрени успешно" "Approved": "Избраните елементи са одобрени успешно",
"Denied": "Successfully denied selected items"
}, },
"SuccessfullyApproved": "Successfully Approved", "SuccessfullyApproved": "Successfully Approved",
"SuccessfullyDeleted": "Request successfully deleted", "SuccessfullyDeleted": "Request successfully deleted",
@ -379,7 +382,8 @@
"Country": "Country:", "Country": "Country:",
"StartDate": "Start Date:", "StartDate": "Start Date:",
"EndDate": "EndDate:" "EndDate": "EndDate:"
} },
"RequestSource": "Source:"
}, },
"Discovery": { "Discovery": {
"PopularTab": "Популярни", "PopularTab": "Популярни",

View file

@ -207,10 +207,13 @@
"RequestPanel": { "RequestPanel": {
"Delete": "Odstranit požadavek", "Delete": "Odstranit požadavek",
"Approve": "Schválit požadavek", "Approve": "Schválit požadavek",
"Deny": "Deny Request",
"Approve4K": "Schválit 4K požadavek", "Approve4K": "Schválit 4K požadavek",
"Deny4K": "Deny 4K Request",
"ChangeAvailability": "Označit jako dostupné", "ChangeAvailability": "Označit jako dostupné",
"Deleted": "Vybrané položky úspěšně odstraněny", "Deleted": "Vybrané položky úspěšně odstraněny",
"Approved": "Vybrané položky byly úspěšně schváleny" "Approved": "Vybrané položky byly úspěšně schváleny",
"Denied": "Successfully denied selected items"
}, },
"SuccessfullyApproved": "Úspěšně schváleno", "SuccessfullyApproved": "Úspěšně schváleno",
"SuccessfullyDeleted": "Požadavek byl úspěšně odstraněn", "SuccessfullyDeleted": "Požadavek byl úspěšně odstraněn",
@ -379,7 +382,8 @@
"Country": "Stát:", "Country": "Stát:",
"StartDate": "Datum zahájení:", "StartDate": "Datum zahájení:",
"EndDate": "Datum ukončení:" "EndDate": "Datum ukončení:"
} },
"RequestSource": "Source:"
}, },
"Discovery": { "Discovery": {
"PopularTab": "Oblíbené", "PopularTab": "Oblíbené",

View file

@ -207,10 +207,13 @@
"RequestPanel": { "RequestPanel": {
"Delete": "Slet Anmodning", "Delete": "Slet Anmodning",
"Approve": "Godkend Andmodning", "Approve": "Godkend Andmodning",
"Deny": "Deny Request",
"Approve4K": "Godkend 4K Anmodning", "Approve4K": "Godkend 4K Anmodning",
"Deny4K": "Deny 4K Request",
"ChangeAvailability": "Markér som tilgængelig", "ChangeAvailability": "Markér som tilgængelig",
"Deleted": "De valgte elementer blev slettet", "Deleted": "De valgte elementer blev slettet",
"Approved": "De valgte elementer blev godkendt" "Approved": "De valgte elementer blev godkendt",
"Denied": "Successfully denied selected items"
}, },
"SuccessfullyApproved": "Godkendt", "SuccessfullyApproved": "Godkendt",
"SuccessfullyDeleted": "Anmodningen blev slettet", "SuccessfullyDeleted": "Anmodningen blev slettet",
@ -379,7 +382,8 @@
"Country": "Land:", "Country": "Land:",
"StartDate": "Startdato:", "StartDate": "Startdato:",
"EndDate": "Slutdato:" "EndDate": "Slutdato:"
} },
"RequestSource": "Kilde:"
}, },
"Discovery": { "Discovery": {
"PopularTab": "Populære", "PopularTab": "Populære",

View file

@ -207,10 +207,13 @@
"RequestPanel": { "RequestPanel": {
"Delete": "Anfrage löschen", "Delete": "Anfrage löschen",
"Approve": "Anfrage genehmigen", "Approve": "Anfrage genehmigen",
"Deny": "Deny Request",
"Approve4K": "4K Anfrage genehmigen", "Approve4K": "4K Anfrage genehmigen",
"Deny4K": "Deny 4K Request",
"ChangeAvailability": "Als verfügbar markieren", "ChangeAvailability": "Als verfügbar markieren",
"Deleted": "Ausgewählte Elemente erfolgreich gelöscht", "Deleted": "Ausgewählte Elemente erfolgreich gelöscht",
"Approved": "Ausgewählte Elemente erfolgreich freigegeben" "Approved": "Ausgewählte Elemente erfolgreich freigegeben",
"Denied": "Successfully denied selected items"
}, },
"SuccessfullyApproved": "Erfolgreich genehmigt", "SuccessfullyApproved": "Erfolgreich genehmigt",
"SuccessfullyDeleted": "Anfrage erfolgreich gelöscht", "SuccessfullyDeleted": "Anfrage erfolgreich gelöscht",
@ -228,7 +231,7 @@
"NoPermissionsOnBehalf": "Sie haben nicht die richtigen Berechtigungen, um im Namen von Benutzern anzufragen!", "NoPermissionsOnBehalf": "Sie haben nicht die richtigen Berechtigungen, um im Namen von Benutzern anzufragen!",
"NoPermissions": "Sie haben nicht die nötigen Rechte!", "NoPermissions": "Sie haben nicht die nötigen Rechte!",
"RequestDoesNotExist": "Die Anfrage existiert nicht", "RequestDoesNotExist": "Die Anfrage existiert nicht",
"ChildRequestDoesNotExist": "Child Request does not exist", "ChildRequestDoesNotExist": "Untergeordnete Anfrage existiert nicht",
"NoPermissionsRequestMovie": "Sie haben keine Berechtigung, um einen Film anzufordern", "NoPermissionsRequestMovie": "Sie haben keine Berechtigung, um einen Film anzufordern",
"NoPermissionsRequestTV": "Sie haben keine Berechtigung, um eine TV-Sendung anzufordern", "NoPermissionsRequestTV": "Sie haben keine Berechtigung, um eine TV-Sendung anzufordern",
"NoPermissionsRequestAlbum": "Sie haben keine Berechtigung, um ein Album anzufordern", "NoPermissionsRequestAlbum": "Sie haben keine Berechtigung, um ein Album anzufordern",
@ -379,7 +382,8 @@
"Country": "Land:", "Country": "Land:",
"StartDate": "Startdatum:", "StartDate": "Startdatum:",
"EndDate": "Enddatum:" "EndDate": "Enddatum:"
} },
"RequestSource": "Quelle:"
}, },
"Discovery": { "Discovery": {
"PopularTab": "Beliebt", "PopularTab": "Beliebt",
@ -432,7 +436,7 @@
"2": "Plex User", "2": "Plex User",
"3": "Emby User", "3": "Emby User",
"4": "Emby Connect User", "4": "Emby Connect User",
"5": "Jellyfin User" "5": "Jellyfin Server"
}, },
"Paginator": { "Paginator": {
"itemsPerPageLabel": "Elemente pro Seite:", "itemsPerPageLabel": "Elemente pro Seite:",

View file

@ -207,10 +207,13 @@
"RequestPanel": { "RequestPanel": {
"Delete":"Delete Request", "Delete":"Delete Request",
"Approve":"Approve Request", "Approve":"Approve Request",
"Deny":"Deny Request",
"Approve4K":"Approve 4K Request", "Approve4K":"Approve 4K Request",
"Deny4K":"Deny 4K Request",
"ChangeAvailability":"Mark Available", "ChangeAvailability":"Mark Available",
"Deleted": "Successfully deleted selected items", "Deleted": "Successfully deleted selected items",
"Approved": "Successfully approved selected items" "Approved": "Successfully approved selected items",
"Denied": "Successfully denied selected items"
}, },
"SuccessfullyApproved": "Successfully Approved", "SuccessfullyApproved": "Successfully Approved",
"SuccessfullyDeleted": "Request successfully deleted", "SuccessfullyDeleted": "Request successfully deleted",

View file

@ -207,10 +207,13 @@
"RequestPanel": { "RequestPanel": {
"Delete": "Eliminar solicitud", "Delete": "Eliminar solicitud",
"Approve": "Aprobar Solicitud", "Approve": "Aprobar Solicitud",
"Deny": "Rechazar Solicitud",
"Approve4K": "Aprobar Solicitud 4K", "Approve4K": "Aprobar Solicitud 4K",
"Deny4K": "Rechazar Solicitud 4K",
"ChangeAvailability": "Marcar como disponible", "ChangeAvailability": "Marcar como disponible",
"Deleted": "Los elementos seleccionados ha sido eliminados correctamente", "Deleted": "Los elementos seleccionados ha sido eliminados correctamente",
"Approved": "Los elementos seleccionados ha sido aprobados correctamente" "Approved": "Los elementos seleccionados ha sido aprobados correctamente",
"Denied": "Elementos seleccionados rechazados con éxito"
}, },
"SuccessfullyApproved": "Se ha aprobado con éxito", "SuccessfullyApproved": "Se ha aprobado con éxito",
"SuccessfullyDeleted": "Solicitud eliminada con éxito", "SuccessfullyDeleted": "Solicitud eliminada con éxito",
@ -379,7 +382,8 @@
"Country": "País:", "Country": "País:",
"StartDate": "Fecha de inicio:", "StartDate": "Fecha de inicio:",
"EndDate": "Fecha de finalización:" "EndDate": "Fecha de finalización:"
} },
"RequestSource": "Fuente:"
}, },
"Discovery": { "Discovery": {
"PopularTab": "Popular", "PopularTab": "Popular",

View file

@ -207,10 +207,13 @@
"RequestPanel": { "RequestPanel": {
"Delete": "Supprimer la demande", "Delete": "Supprimer la demande",
"Approve": "Approuver la demande", "Approve": "Approuver la demande",
"Deny": "Refuser la demande",
"Approve4K": "Approuver la demande 4K", "Approve4K": "Approuver la demande 4K",
"Deny4K": "Refuser la demande 4K",
"ChangeAvailability": "Marquer comme Disponible", "ChangeAvailability": "Marquer comme Disponible",
"Deleted": "Éléments sélectionnés supprimés avec succès", "Deleted": "Éléments sélectionnés supprimés avec succès",
"Approved": "Éléments sélectionnés approuvés avec succès" "Approved": "Éléments sélectionnés approuvés avec succès",
"Denied": "Les éléments sélectionnés ont été refusés"
}, },
"SuccessfullyApproved": "Approuvée avec succès", "SuccessfullyApproved": "Approuvée avec succès",
"SuccessfullyDeleted": "Demande supprimée avec succès", "SuccessfullyDeleted": "Demande supprimée avec succès",
@ -379,7 +382,8 @@
"Country": "Pays :", "Country": "Pays :",
"StartDate": "Date de début :", "StartDate": "Date de début :",
"EndDate": "Date de fin :" "EndDate": "Date de fin :"
} },
"RequestSource": "Source :"
}, },
"Discovery": { "Discovery": {
"PopularTab": "Populaire", "PopularTab": "Populaire",

View file

@ -207,10 +207,13 @@
"RequestPanel": { "RequestPanel": {
"Delete": "Kérés törlése", "Delete": "Kérés törlése",
"Approve": "Kérés elfogadása", "Approve": "Kérés elfogadása",
"Deny": "Deny Request",
"Approve4K": "Approve 4K Request", "Approve4K": "Approve 4K Request",
"Deny4K": "Deny 4K Request",
"ChangeAvailability": "Elérhetőnek jelölés", "ChangeAvailability": "Elérhetőnek jelölés",
"Deleted": "A kijelölt elemek törlésre kerultek", "Deleted": "A kijelölt elemek törlésre kerultek",
"Approved": "A kijelölt elemek jóváhagyásra kerultek" "Approved": "A kijelölt elemek jóváhagyásra kerultek",
"Denied": "Successfully denied selected items"
}, },
"SuccessfullyApproved": "Sikeresen jóváhagyva", "SuccessfullyApproved": "Sikeresen jóváhagyva",
"SuccessfullyDeleted": "Kérés sikeresen törölve", "SuccessfullyDeleted": "Kérés sikeresen törölve",
@ -379,7 +382,8 @@
"Country": "Ország:", "Country": "Ország:",
"StartDate": "Kezdés dátuma:", "StartDate": "Kezdés dátuma:",
"EndDate": "Befejezés dátuma:" "EndDate": "Befejezés dátuma:"
} },
"RequestSource": "Source:"
}, },
"Discovery": { "Discovery": {
"PopularTab": "Népszerű", "PopularTab": "Népszerű",

View file

@ -14,7 +14,7 @@
"Common": { "Common": {
"ContinueButton": "Continua", "ContinueButton": "Continua",
"Available": "Disponibile", "Available": "Disponibile",
"Available4K": "Disponibile 4K", "Available4K": "Disponibile in 4K",
"Approved": "Approvato", "Approved": "Approvato",
"Approve4K": "Approva 4K", "Approve4K": "Approva 4K",
"Pending": "In Sospeso", "Pending": "In Sospeso",
@ -66,7 +66,7 @@
"Discover": "Scopri", "Discover": "Scopri",
"Search": "Cerca", "Search": "Cerca",
"Requests": "Richieste", "Requests": "Richieste",
"UserManagement": "Gestione degli utenti", "UserManagement": "Utenti",
"Issues": "Problemi", "Issues": "Problemi",
"Vote": "Vota", "Vote": "Vota",
"Donate": "Dona!", "Donate": "Dona!",
@ -74,7 +74,7 @@
"DonateTooltip": "Questo è come convinco mia moglie a farmi spendere il mio tempo libero nello sviluppo di Ombi ;)", "DonateTooltip": "Questo è come convinco mia moglie a farmi spendere il mio tempo libero nello sviluppo di Ombi ;)",
"UpdateAvailableTooltip": "Aggiornamento disponibile!", "UpdateAvailableTooltip": "Aggiornamento disponibile!",
"Settings": "Impostazioni", "Settings": "Impostazioni",
"Welcome": "Ti diamo il benvenuto {{username}}", "Welcome": "Benvenuto {{username}}",
"UpdateDetails": "Aggiorna dettagli", "UpdateDetails": "Aggiorna dettagli",
"Logout": "Esci", "Logout": "Esci",
"OpenMobileApp": "Apri l'app Mobile", "OpenMobileApp": "Apri l'app Mobile",
@ -90,9 +90,9 @@
"Music": "Musica", "Music": "Musica",
"People": "Persone" "People": "Persone"
}, },
"MorningWelcome": "Buona mattina!", "MorningWelcome": "Buongiorno!",
"AfternoonWelcome": "Buon pomeriggio!", "AfternoonWelcome": "Buon pomeriggio!",
"EveningWelcome": "Buona sera!" "EveningWelcome": "Buonasera!"
}, },
"Search": { "Search": {
"Title": "Cerca", "Title": "Cerca",
@ -100,10 +100,10 @@
"MoviesTab": "Film", "MoviesTab": "Film",
"TvTab": "Serie TV", "TvTab": "Serie TV",
"MusicTab": "Musica", "MusicTab": "Musica",
"AdvancedSearch": "Puoi compilare uno dei seguenti per scoprire nuovi media. Tutti i risultati sono ordinati per popolarità", "AdvancedSearch": "Compila uno dei seguenti campi per cercare nuovi media. I risultati sono in ordine di popolarità",
"AdvancedSearchHeader": "Ricerca Avanzata", "AdvancedSearchHeader": "Ricerca Avanzata",
"Suggestions": "Suggerimenti", "Suggestions": "Suggerimenti",
"NoResults": "Spiacenti, non abbiamo trovato nulla!", "NoResults": "Nessun risultato trovato!",
"DigitalDate": "Uscita in digitale: {{date}}", "DigitalDate": "Uscita in digitale: {{date}}",
"TheatricalRelease": "Uscita nei cinema: {{date}}", "TheatricalRelease": "Uscita nei cinema: {{date}}",
"ViewOnPlex": "Guarda su Plex", "ViewOnPlex": "Guarda su Plex",
@ -136,12 +136,12 @@
"Season": "Stagione {{seasonNumber}}", "Season": "Stagione {{seasonNumber}}",
"SelectAllInSeason": "Seleziona tutto nella stagione {{seasonNumber}}" "SelectAllInSeason": "Seleziona tutto nella stagione {{seasonNumber}}"
}, },
"AdvancedSearchInstructions": "Sei pregato di scegliere che tipo di media stai cercando:", "AdvancedSearchInstructions": "Scegli che tipo di media cercare:",
"YearOfRelease": "Anno di Rilascio", "YearOfRelease": "Anno di Rilascio",
"SearchGenre": "Cerca per genere", "SearchGenre": "Cerca per genere",
"SearchKeyword": "Termini di ricerca", "SearchKeyword": "Cerca per parola chiave",
"SearchProvider": "Provider di ricerca", "SearchProvider": "Provider di ricerca",
"KeywordSearchingDisclaimer": "Sei pregato di notare che la Ricerca per Parola chiave è molto a fortuna a causa di dati non coerenti nel TheMovieDb" "KeywordSearchingDisclaimer": "Attenzione: La ricerca per parola chiave è incostante a causa di dati non coerenti su TheMovieDb"
}, },
"Requests": { "Requests": {
"Title": "Richieste", "Title": "Richieste",
@ -207,17 +207,20 @@
"RequestPanel": { "RequestPanel": {
"Delete": "Elimina Richiesta", "Delete": "Elimina Richiesta",
"Approve": "Approva Richiesta", "Approve": "Approva Richiesta",
"Deny": "Rifiuta Richiesta",
"Approve4K": "Approva Richiesta 4K", "Approve4K": "Approva Richiesta 4K",
"Deny4K": "Rifiuta Richiesta 4K",
"ChangeAvailability": "Segna come Disponibile", "ChangeAvailability": "Segna come Disponibile",
"Deleted": "Elementi selezionati eliminati correttamente", "Deleted": "Elementi selezionati eliminati correttamente",
"Approved": "Elementi selezionati approvati correttamente" "Approved": "Elementi selezionati approvati correttamente",
"Denied": "Elementi selezionati rifiutati con successo"
}, },
"SuccessfullyApproved": "Approvato Correttamente", "SuccessfullyApproved": "Approvata",
"SuccessfullyDeleted": "Richiesta eliminata correttamente", "SuccessfullyDeleted": "Richiesta eliminata correttamente",
"NowAvailable": "Richiesta ora disponibile", "NowAvailable": "Richiesta ora disponibile",
"NowUnavailable": "Richiesta ora non disponibile", "NowUnavailable": "Richiesta ora non disponibile",
"SuccessfullyReprocessed": "Richiesta ri-elaborata correttamente", "SuccessfullyReprocessed": "Richiesta rielaborata correttamente",
"DeniedRequest": "Richiesta Negata", "DeniedRequest": "Richiesta Rifiutata",
"RequestCollection": "Richiedi Raccolta", "RequestCollection": "Richiedi Raccolta",
"CollectionSuccesfullyAdded": "La raccolta {{name}} è stata aggiunta correttamente!", "CollectionSuccesfullyAdded": "La raccolta {{name}} è stata aggiunta correttamente!",
"NeedToSelectEpisodes": "Devi selezionare degli episodi!", "NeedToSelectEpisodes": "Devi selezionare degli episodi!",
@ -243,20 +246,20 @@
"CouldntNotify": "Impossibile notificare il titolo {{title}}" "CouldntNotify": "Impossibile notificare il titolo {{title}}"
}, },
"Issues": { "Issues": {
"Title": "Problemi", "Title": "Segnalazioni",
"IssuesForTitle": "Problemi per {{title}}", "IssuesForTitle": "Segnalazioni per {{title}}",
"PendingTitle": "Problemi In Attesa", "PendingTitle": "Segnalazioni In Attesa",
"InProgressTitle": "Problemi In Corso", "InProgressTitle": "Segnalazioni In Risoluzione",
"ResolvedTitle": "Problemi Risolti", "ResolvedTitle": "Segnalazioni Risolte",
"ColumnTitle": "Titolo", "ColumnTitle": "Titolo",
"Count": "Conteggio", "Count": "Totale",
"Category": "Categoria", "Category": "Categoria",
"Status": "Stato", "Status": "Stato",
"Details": "Dettagli", "Details": "Dettagli",
"Description": "Descrizione", "Description": "Descrizione",
"NoComments": "Nessun Commento!", "NoComments": "Nessun Commento!",
"MarkInProgress": "Senza In Corso", "MarkInProgress": "Approva",
"MarkResolved": "Segna Risolto", "MarkResolved": "Risolvi",
"SendMessageButton": "Invia", "SendMessageButton": "Invia",
"Subject": "Oggetto", "Subject": "Oggetto",
"Comments": "Commenti", "Comments": "Commenti",
@ -306,22 +309,22 @@
"Denied": "Rifiutato", "Denied": "Rifiutato",
"Denied4K": "4K Negato", "Denied4K": "4K Negato",
"Trailers": "Trailer", "Trailers": "Trailer",
"RecommendationsTitle": "Raccomandazioni", "RecommendationsTitle": "Raccomandati",
"SimilarTitle": "Simili", "SimilarTitle": "Simili",
"VideosTitle": "Video", "VideosTitle": "Video",
"AlbumsTitle": "Album", "AlbumsTitle": "Album",
"RequestAllAlbums": "Richiedi Tutti gli Album", "RequestAllAlbums": "Richiedi tutti gli Album",
"ClearSelection": "Cancella Selezione", "ClearSelection": "Cancella Selezione",
"RequestSelectedAlbums": "Richiesta degli Album Selezionati", "RequestSelectedAlbums": "Richiedi gli Album Selezionati",
"ViewCollection": "Visualizza Raccolta", "ViewCollection": "Visualizza Raccolta",
"NotEnoughInfo": "Sfortunatamente ancora non ci sono abbastanza informazioni su questo show!", "NotEnoughInfo": "Purtroppo ancora non ci sono abbastanza informazioni su questa serie!",
"AdvancedOptions": "Opzioni Avanzate", "AdvancedOptions": "Opzioni Avanzate",
"AutoApproveOptions": "Puoi configurare qui la tua richiesta, che verrà inviata alla tua applicazione DVR e automaticamente approvata! La configurazione è facoltativa, basta premere Richiedi per saltarla!", "AutoApproveOptions": "Puoi configurare qui la tua richiesta, che verrà inviata alla tua applicazione DVR e automaticamente approvata! La configurazione è facoltativa, basta premere Richiedi per saltarla!",
"AutoApproveOptionsTv": "Puoi configurare qui la tua richiesta, che verrà inviata alla tua applicazione DVR e automaticamente approvata! Se la richiesta è già presente in Sonarr, la cartella radice o il profilo qualità non verrà cambiato! La configurazione è facoltativa, basta premere Richiedi per saltarla!", "AutoApproveOptionsTv": "Puoi configurare qui la tua richiesta, che verrà inviata alla tua applicazione DVR e automaticamente approvata! Se la richiesta è già presente in Sonarr, la cartella radice o il profilo qualità non verrà cambiato! La configurazione è facoltativa, basta premere Richiedi per saltarla!",
"AutoApproveOptionsTvShort": "Puoi configurare qui la tua richiesta, che verrà inviata alla tua applicazione DVR! Se la richiesta è già presente in Sonarr, la cartella radice o il profilo qualità non verrà cambiato! La configurazione è facoltativa, basta premere Richiedi per saltarla!", "AutoApproveOptionsTvShort": "Puoi configurare qui la tua richiesta, che verrà inviata alla tua applicazione DVR! Se la richiesta è già presente in Sonarr, la cartella radice o il profilo qualità non verrà cambiato! La configurazione è facoltativa, basta premere Richiedi per saltarla!",
"QualityProfilesSelect": "Seleziona Un Profilo di Qualità", "QualityProfilesSelect": "Seleziona un Profilo per la Qualità",
"RootFolderSelect": "Seleziona Una Cartella di Root", "RootFolderSelect": "Seleziona una Cartella Principale",
"LanguageProfileSelect": "Seleziona Un Profilo della Lingua", "LanguageProfileSelect": "Seleziona un profilo per la Lingua",
"Status": "Stato:", "Status": "Stato:",
"StatusValues": { "StatusValues": {
"Rumored": "Rumor", "Rumored": "Rumor",
@ -331,16 +334,16 @@
"Released": "Rilasciato", "Released": "Rilasciato",
"Running": "In Corso", "Running": "In Corso",
"Returning Series": "Serie Rinnovate", "Returning Series": "Serie Rinnovate",
"Ended": "Terminata", "Ended": "Conclusa",
"Canceled": "Annullata" "Canceled": "Cancellata"
}, },
"Seasons": "Stagioni:", "Seasons": "Stagioni:",
"Episodes": "Episodi:", "Episodes": "Episodi:",
"Availability": "Disponibilità:", "Availability": "Disponibilità:",
"RequestStatus": "Stato Richiesta", "RequestStatus": "Stato Richiesta",
"Quality": "Qualità:", "Quality": "Qualità:",
"RootFolderOverride": "Sovrascrizione Cartella di Root:", "RootFolderOverride": "Sovrascrivi Cartella Principale:",
"QualityOverride": "Sovrascrizione Qualità:", "QualityOverride": "Sovrascrivi Qualità:",
"Network": "Rete:", "Network": "Rete:",
"GenresLabel": "Generi:", "GenresLabel": "Generi:",
"Genres": "Generi", "Genres": "Generi",
@ -357,9 +360,9 @@
"CastTitle": "Trasmetti" "CastTitle": "Trasmetti"
}, },
"EpisodeSelector": { "EpisodeSelector": {
"AllSeasonsTooltip": "Questo richiederà ogni stagione per questo show", "AllSeasonsTooltip": "Richiederà tutte le stagioni per questa serie",
"FirstSeasonTooltip": "Questo richiederà solo la Prima Stagione per questo show", "FirstSeasonTooltip": "Richiederà solo la Prima Stagione per questa serie",
"LatestSeasonTooltip": "Questo richiederà solo l'Ultima Stagione per questo show", "LatestSeasonTooltip": "Richiederà solo l'Ultima Stagione per questa serie",
"NoEpisodes": "Sfortunatamente, non c'è ancora alcun dato dell'episodio per questa serie!", "NoEpisodes": "Sfortunatamente, non c'è ancora alcun dato dell'episodio per questa serie!",
"SeasonNumber": "Stagione {{number}}" "SeasonNumber": "Stagione {{number}}"
}, },
@ -379,7 +382,8 @@
"Country": "Paese:", "Country": "Paese:",
"StartDate": "Data Iniziale:", "StartDate": "Data Iniziale:",
"EndDate": "Data Finale:" "EndDate": "Data Finale:"
} },
"RequestSource": "Sorgente:"
}, },
"Discovery": { "Discovery": {
"PopularTab": "Popolare", "PopularTab": "Popolare",
@ -410,14 +414,14 @@
"DarkMode": "Modalità Scura", "DarkMode": "Modalità Scura",
"Updated": "Aggiornate Correttamente", "Updated": "Aggiornate Correttamente",
"StreamingCountry": "Paese di Streaming", "StreamingCountry": "Paese di Streaming",
"StreamingCountryDescription": "Questo è il codice paese per cui mostreremo le informazioni di streaming. Se sei negli USA, selezionando US riceverai le informazioni di streaming correlate agli USA.", "StreamingCountryDescription": "Questo è il codice del paese per cui mostreremo le informazioni dei media. Se sei in Italia, seleziona IT e ti mostreremo le informazioni dei media in Italiano.",
"LanguageDescription": "Questa è la lingua in cui vorresti fosse visualizzata l'interfaccia di Ombi.", "LanguageDescription": "Questa è la lingua in cui vorresti fosse visualizzata l'interfaccia di Ombi.",
"MobileQRCode": "Codice QR Mobile", "MobileQRCode": "Codice QR Mobile",
"LegacyApp": "Avvia l'App Legacy", "LegacyApp": "Avvia l'App Legacy",
"NoQrCode": "Sei pregato di contattare il tuo amministratore per abilitare i codici QR", "NoQrCode": "Contatta l'amministratore per abilitare i codici QR",
"UserType": "Tipo di Utente:", "UserType": "Tipo di Utente:",
"ChangeDetails": "Modifica i Dettagli", "ChangeDetails": "Modifica i Dettagli",
"NeedCurrentPassword": "Necessiti la tua password corrente per effettuare qualsiasi modifica qui", "NeedCurrentPassword": "Hai bisogno della tua password attuale per apportare qualsiasi modifica qui",
"CurrentPassword": "Password Corrente", "CurrentPassword": "Password Corrente",
"EmailAddress": "Indirizzo Email", "EmailAddress": "Indirizzo Email",
"NewPassword": "Nuova Password", "NewPassword": "Nuova Password",
@ -429,8 +433,8 @@
}, },
"UserTypeLabel": { "UserTypeLabel": {
"1": "Utente Locale", "1": "Utente Locale",
"2": "Utente di Plex", "2": "Utente Plex",
"3": "Utente di Emby", "3": "Utente Emby",
"4": "Connetti Utente di Emby", "4": "Connetti Utente di Emby",
"5": "Utente di Jellyfin" "5": "Utente di Jellyfin"
}, },

View file

@ -207,10 +207,13 @@
"RequestPanel": { "RequestPanel": {
"Delete": "Verwijder Verzoek", "Delete": "Verwijder Verzoek",
"Approve": "Verzoek Goedkeuren", "Approve": "Verzoek Goedkeuren",
"Deny": "Deny Request",
"Approve4K": "Approve 4K Request", "Approve4K": "Approve 4K Request",
"Deny4K": "Deny 4K Request",
"ChangeAvailability": "Markeer beschikbaar", "ChangeAvailability": "Markeer beschikbaar",
"Deleted": "Successfully deleted selected items", "Deleted": "Successfully deleted selected items",
"Approved": "Successfully approved selected items" "Approved": "Successfully approved selected items",
"Denied": "Successfully denied selected items"
}, },
"SuccessfullyApproved": "Successfully Approved", "SuccessfullyApproved": "Successfully Approved",
"SuccessfullyDeleted": "Request successfully deleted", "SuccessfullyDeleted": "Request successfully deleted",
@ -379,7 +382,8 @@
"Country": "Country:", "Country": "Country:",
"StartDate": "Start Date:", "StartDate": "Start Date:",
"EndDate": "EndDate:" "EndDate": "EndDate:"
} },
"RequestSource": "Source:"
}, },
"Discovery": { "Discovery": {
"PopularTab": "Populair", "PopularTab": "Populair",

View file

@ -207,10 +207,13 @@
"RequestPanel": { "RequestPanel": {
"Delete": "Delete Request", "Delete": "Delete Request",
"Approve": "Approve Request", "Approve": "Approve Request",
"Deny": "Deny Request",
"Approve4K": "Approve 4K Request", "Approve4K": "Approve 4K Request",
"Deny4K": "Deny 4K Request",
"ChangeAvailability": "Merk tilgjengelig", "ChangeAvailability": "Merk tilgjengelig",
"Deleted": "Successfully deleted selected items", "Deleted": "Successfully deleted selected items",
"Approved": "Successfully approved selected items" "Approved": "Successfully approved selected items",
"Denied": "Successfully denied selected items"
}, },
"SuccessfullyApproved": "Successfully Approved", "SuccessfullyApproved": "Successfully Approved",
"SuccessfullyDeleted": "Request successfully deleted", "SuccessfullyDeleted": "Request successfully deleted",
@ -379,7 +382,8 @@
"Country": "Country:", "Country": "Country:",
"StartDate": "Start Date:", "StartDate": "Start Date:",
"EndDate": "EndDate:" "EndDate": "EndDate:"
} },
"RequestSource": "Source:"
}, },
"Discovery": { "Discovery": {
"PopularTab": "Populært", "PopularTab": "Populært",

View file

@ -207,10 +207,13 @@
"RequestPanel": { "RequestPanel": {
"Delete": "Usuń zgłoszenie", "Delete": "Usuń zgłoszenie",
"Approve": "Zatwierdź zgłoszenie", "Approve": "Zatwierdź zgłoszenie",
"Deny": "Deny Request",
"Approve4K": "Zatwierdź prośbę o 4K", "Approve4K": "Zatwierdź prośbę o 4K",
"Deny4K": "Deny 4K Request",
"ChangeAvailability": "Ozn. jako dostępne", "ChangeAvailability": "Ozn. jako dostępne",
"Deleted": "Pomyślnie usunięto wybrane elementy", "Deleted": "Pomyślnie usunięto wybrane elementy",
"Approved": "Pomyślnie zatwierdzono wybrane elementy" "Approved": "Pomyślnie zatwierdzono wybrane elementy",
"Denied": "Successfully denied selected items"
}, },
"SuccessfullyApproved": "Zatwierdzono pomyślnie", "SuccessfullyApproved": "Zatwierdzono pomyślnie",
"SuccessfullyDeleted": "Prośba pomyślnie usunięta", "SuccessfullyDeleted": "Prośba pomyślnie usunięta",
@ -379,7 +382,8 @@
"Country": "Kraj:", "Country": "Kraj:",
"StartDate": "Data rozpoczęcia:", "StartDate": "Data rozpoczęcia:",
"EndDate": "Data zakończenia:" "EndDate": "Data zakończenia:"
} },
"RequestSource": "Source:"
}, },
"Discovery": { "Discovery": {
"PopularTab": "Popularne", "PopularTab": "Popularne",

View file

@ -207,10 +207,13 @@
"RequestPanel": { "RequestPanel": {
"Delete": "Apagar Solicitação", "Delete": "Apagar Solicitação",
"Approve": "Aprovar Solicitação", "Approve": "Aprovar Solicitação",
"Deny": "Recusar pedido",
"Approve4K": "Aprovar pedido 4K", "Approve4K": "Aprovar pedido 4K",
"Deny4K": "Recusar pedido de 4K",
"ChangeAvailability": "Marcar Como Disponível", "ChangeAvailability": "Marcar Como Disponível",
"Deleted": "Successfully deleted selected items", "Deleted": "Successfully deleted selected items",
"Approved": "Successfully approved selected items" "Approved": "Successfully approved selected items",
"Denied": "Itens selecionados negados com sucesso"
}, },
"SuccessfullyApproved": "Successfully Approved", "SuccessfullyApproved": "Successfully Approved",
"SuccessfullyDeleted": "Request successfully deleted", "SuccessfullyDeleted": "Request successfully deleted",
@ -379,7 +382,8 @@
"Country": "Country:", "Country": "Country:",
"StartDate": "Start Date:", "StartDate": "Start Date:",
"EndDate": "EndDate:" "EndDate": "EndDate:"
} },
"RequestSource": "Source:"
}, },
"Discovery": { "Discovery": {
"PopularTab": "Popular", "PopularTab": "Popular",

View file

@ -207,10 +207,13 @@
"RequestPanel": { "RequestPanel": {
"Delete": "Delete Request", "Delete": "Delete Request",
"Approve": "Approve Request", "Approve": "Approve Request",
"Deny": "Deny Request",
"Approve4K": "Approve 4K Request", "Approve4K": "Approve 4K Request",
"Deny4K": "Deny 4K Request",
"ChangeAvailability": "Mark Available", "ChangeAvailability": "Mark Available",
"Deleted": "Successfully deleted selected items", "Deleted": "Successfully deleted selected items",
"Approved": "Successfully approved selected items" "Approved": "Successfully approved selected items",
"Denied": "Successfully denied selected items"
}, },
"SuccessfullyApproved": "Successfully Approved", "SuccessfullyApproved": "Successfully Approved",
"SuccessfullyDeleted": "Request successfully deleted", "SuccessfullyDeleted": "Request successfully deleted",
@ -379,7 +382,8 @@
"Country": "Country:", "Country": "Country:",
"StartDate": "Start Date:", "StartDate": "Start Date:",
"EndDate": "EndDate:" "EndDate": "EndDate:"
} },
"RequestSource": "Origem:"
}, },
"Discovery": { "Discovery": {
"PopularTab": "Popular", "PopularTab": "Popular",

View file

@ -207,10 +207,13 @@
"RequestPanel": { "RequestPanel": {
"Delete": "Delete Request", "Delete": "Delete Request",
"Approve": "Approve Request", "Approve": "Approve Request",
"Deny": "Deny Request",
"Approve4K": "Approve 4K Request", "Approve4K": "Approve 4K Request",
"Deny4K": "Deny 4K Request",
"ChangeAvailability": "Отметить доступным", "ChangeAvailability": "Отметить доступным",
"Deleted": "Successfully deleted selected items", "Deleted": "Successfully deleted selected items",
"Approved": "Successfully approved selected items" "Approved": "Successfully approved selected items",
"Denied": "Successfully denied selected items"
}, },
"SuccessfullyApproved": "Successfully Approved", "SuccessfullyApproved": "Successfully Approved",
"SuccessfullyDeleted": "Request successfully deleted", "SuccessfullyDeleted": "Request successfully deleted",
@ -379,7 +382,8 @@
"Country": "Country:", "Country": "Country:",
"StartDate": "Start Date:", "StartDate": "Start Date:",
"EndDate": "EndDate:" "EndDate": "EndDate:"
} },
"RequestSource": "Source:"
}, },
"Discovery": { "Discovery": {
"PopularTab": "Популярное", "PopularTab": "Популярное",

View file

@ -207,10 +207,13 @@
"RequestPanel": { "RequestPanel": {
"Delete": "Odstrániž požiadavku", "Delete": "Odstrániž požiadavku",
"Approve": "Schváliť žiadosť", "Approve": "Schváliť žiadosť",
"Deny": "Deny Request",
"Approve4K": "Approve 4K Request", "Approve4K": "Approve 4K Request",
"Deny4K": "Deny 4K Request",
"ChangeAvailability": "Označiť k dispozícií", "ChangeAvailability": "Označiť k dispozícií",
"Deleted": "Úspešne odstránené vybrané položky", "Deleted": "Úspešne odstránené vybrané položky",
"Approved": "Úspešne schválené vybrané položky" "Approved": "Úspešne schválené vybrané položky",
"Denied": "Successfully denied selected items"
}, },
"SuccessfullyApproved": "Úspešne schválené", "SuccessfullyApproved": "Úspešne schválené",
"SuccessfullyDeleted": "Žiadosť bola úspešne vymazaná", "SuccessfullyDeleted": "Žiadosť bola úspešne vymazaná",
@ -379,7 +382,8 @@
"Country": "Krajina:", "Country": "Krajina:",
"StartDate": "Dátum začatia:", "StartDate": "Dátum začatia:",
"EndDate": "Dátum ukončenia:" "EndDate": "Dátum ukončenia:"
} },
"RequestSource": "Source:"
}, },
"Discovery": { "Discovery": {
"PopularTab": "Populárne", "PopularTab": "Populárne",

View file

@ -207,10 +207,13 @@
"RequestPanel": { "RequestPanel": {
"Delete": "Ta bort förfrågan", "Delete": "Ta bort förfrågan",
"Approve": "Godkänn begäran", "Approve": "Godkänn begäran",
"Deny": "Deny Request",
"Approve4K": "Godkänn 4K-begäran", "Approve4K": "Godkänn 4K-begäran",
"Deny4K": "Deny 4K Request",
"ChangeAvailability": "Markera Tillgänglig", "ChangeAvailability": "Markera Tillgänglig",
"Deleted": "Successfully deleted selected items", "Deleted": "Successfully deleted selected items",
"Approved": "Successfully approved selected items" "Approved": "Successfully approved selected items",
"Denied": "Successfully denied selected items"
}, },
"SuccessfullyApproved": "Successfully Approved", "SuccessfullyApproved": "Successfully Approved",
"SuccessfullyDeleted": "Request successfully deleted", "SuccessfullyDeleted": "Request successfully deleted",
@ -379,7 +382,8 @@
"Country": "Country:", "Country": "Country:",
"StartDate": "Start Date:", "StartDate": "Start Date:",
"EndDate": "EndDate:" "EndDate": "EndDate:"
} },
"RequestSource": "Källa:"
}, },
"Discovery": { "Discovery": {
"PopularTab": "Populära", "PopularTab": "Populära",

View file

@ -207,10 +207,13 @@
"RequestPanel": { "RequestPanel": {
"Delete": "删除请求", "Delete": "删除请求",
"Approve": "批准请求", "Approve": "批准请求",
"Deny": "Deny Request",
"Approve4K": "Approve 4K Request", "Approve4K": "Approve 4K Request",
"Deny4K": "Deny 4K Request",
"ChangeAvailability": "标记为可用", "ChangeAvailability": "标记为可用",
"Deleted": "所选项目已删除", "Deleted": "所选项目已删除",
"Approved": "所选项目已批准" "Approved": "所选项目已批准",
"Denied": "Successfully denied selected items"
}, },
"SuccessfullyApproved": "批准成功", "SuccessfullyApproved": "批准成功",
"SuccessfullyDeleted": "删除请求成功", "SuccessfullyDeleted": "删除请求成功",
@ -379,7 +382,8 @@
"Country": "国家:", "Country": "国家:",
"StartDate": "开始日期:", "StartDate": "开始日期:",
"EndDate": "结束日期:" "EndDate": "结束日期:"
} },
"RequestSource": "Source:"
}, },
"Discovery": { "Discovery": {
"PopularTab": "热门", "PopularTab": "热门",

View file

@ -207,10 +207,13 @@
"RequestPanel": { "RequestPanel": {
"Delete": "删除请求", "Delete": "删除请求",
"Approve": "批准请求", "Approve": "批准请求",
"Deny": "Deny Request",
"Approve4K": "批准4K请求", "Approve4K": "批准4K请求",
"Deny4K": "Deny 4K Request",
"ChangeAvailability": "标记为可用", "ChangeAvailability": "标记为可用",
"Deleted": "所选项目已删除", "Deleted": "所选项目已删除",
"Approved": "所选项目已批准" "Approved": "所选项目已批准",
"Denied": "Successfully denied selected items"
}, },
"SuccessfullyApproved": "批准成功", "SuccessfullyApproved": "批准成功",
"SuccessfullyDeleted": "删除请求成功", "SuccessfullyDeleted": "删除请求成功",
@ -379,7 +382,8 @@
"Country": "国家:", "Country": "国家:",
"StartDate": "开始日期:", "StartDate": "开始日期:",
"EndDate": "结束日期:" "EndDate": "结束日期:"
} },
"RequestSource": "Source:"
}, },
"Discovery": { "Discovery": {
"PopularTab": "热门", "PopularTab": "热门",

View file

@ -1,3 +1,3 @@
{ {
"version": "4.16.8" "version": "4.16.10"
} }