mirror of
https://github.com/Ombi-app/Ombi.git
synced 2025-08-20 13:23:20 -07:00
fix(translations): 🌐 Added localization for missing areas
Localization
This commit is contained in:
commit
b23668b84b
25 changed files with 186 additions and 105 deletions
|
@ -2,6 +2,7 @@ import { Component, OnInit, Input } from "@angular/core";
|
|||
import { IDiscoverCardResult } from "../../interfaces";
|
||||
import { RequestType } from "../../../interfaces";
|
||||
import { MessageService, RequestService, SearchV2Service } from "../../../services";
|
||||
import { TranslateService } from "@ngx-translate/core";
|
||||
import { MatDialog } from "@angular/material/dialog";
|
||||
import { ISearchTvResultV2 } from "../../../interfaces/ISearchTvResultV2";
|
||||
import { ISearchMovieResultV2 } from "../../../interfaces/ISearchMovieResultV2";
|
||||
|
@ -30,7 +31,7 @@ export class DiscoverCardComponent implements OnInit {
|
|||
private tvSearchResult: ISearchTvResultV2;
|
||||
|
||||
constructor(private searchService: SearchV2Service, private dialog: MatDialog, private requestService: RequestService,
|
||||
public messageService: MessageService) { }
|
||||
public messageService: MessageService, private translate: TranslateService) { }
|
||||
|
||||
public ngOnInit() {
|
||||
if (this.result.type == RequestType.tvShow) {
|
||||
|
@ -98,13 +99,13 @@ export class DiscoverCardComponent implements OnInit {
|
|||
|
||||
public getAvailbilityStatus(): string {
|
||||
if (this.result.available) {
|
||||
return "Available";
|
||||
return this.translate.instant("Common.Available");
|
||||
}
|
||||
if (this.result.approved) {
|
||||
return "Approved";
|
||||
return this.translate.instant("Common.Approved");
|
||||
}
|
||||
if (this.result.requested) {
|
||||
return "Pending";
|
||||
return this.translate.instant("Common.Pending");
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
@ -129,7 +130,7 @@ export class DiscoverCardComponent implements OnInit {
|
|||
rootFolderOverride: result.radarrFolderId, }).subscribe(x => {
|
||||
if (x.result) {
|
||||
this.result.requested = true;
|
||||
this.messageService.send(x.message, "Ok");
|
||||
this.messageService.send(this.translate.instant("Requests.RequestAddedSuccessfully", { title: this.result.title }), "Ok");
|
||||
} else {
|
||||
this.messageService.send(x.errorMessage, "Ok");
|
||||
}
|
||||
|
@ -140,7 +141,7 @@ export class DiscoverCardComponent implements OnInit {
|
|||
this.requestService.requestMovie({ theMovieDbId: +this.result.id, languageCode: null, requestOnBehalf: null, qualityPathOverride: null, rootFolderOverride: null }).subscribe(x => {
|
||||
if (x.result) {
|
||||
this.result.requested = true;
|
||||
this.messageService.send(x.message, "Ok");
|
||||
this.messageService.send(this.translate.instant("Requests.RequestAddedSuccessfully", { title: this.result.title }), "Ok");
|
||||
} else {
|
||||
this.messageService.send(x.errorMessage, "Ok");
|
||||
}
|
||||
|
|
|
@ -7,8 +7,7 @@
|
|||
<p class="col-12 text-center">{{collection.overview}}</p>
|
||||
</div>
|
||||
<div class="row justify-content-md-center">
|
||||
<button class="col-2" mat-raised-button color="accent" (click)="requestCollection();">Request
|
||||
Collection</button>
|
||||
<button class="col-2" mat-raised-button color="accent" (click)="requestCollection();">{{'Requests.RequestCollection' | translate }}</button>
|
||||
</div>
|
||||
<div *ngIf="loadingFlag" class="lightbox row justify-content-md-center">
|
||||
<div class="row justify-content-md-center top-spacing loading-spinner">
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import { Component, OnInit } from "@angular/core";
|
||||
import { MessageService, SearchV2Service } from "../../../services";
|
||||
|
||||
import { TranslateService } from "@ngx-translate/core";
|
||||
import { ActivatedRoute } from "@angular/router";
|
||||
import { AuthService } from "../../../auth/auth.service";
|
||||
import { IDiscoverCardResult } from "../../interfaces";
|
||||
|
@ -25,7 +26,8 @@ export class DiscoverCollectionsComponent implements OnInit {
|
|||
private route: ActivatedRoute,
|
||||
private requestServiceV2: RequestServiceV2,
|
||||
private messageService: MessageService,
|
||||
private auth: AuthService) {
|
||||
private auth: AuthService,
|
||||
private translate: TranslateService) {
|
||||
this.route.params.subscribe((params: any) => {
|
||||
this.collectionId = params.collectionId;
|
||||
});
|
||||
|
@ -42,7 +44,7 @@ export class DiscoverCollectionsComponent implements OnInit {
|
|||
this.loading();
|
||||
this.requestServiceV2.requestMovieCollection(this.collectionId).subscribe(result => {
|
||||
if (result.result) {
|
||||
this.messageService.send(result.message);
|
||||
this.messageService.send(this.translate.instant("Requests.CollectionSuccesfullyAdded", { name: this.collection.name }));
|
||||
} else {
|
||||
this.messageService.send(result.errorMessage);
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<mat-card class="issue-card" *ngIf="!deleted">
|
||||
<mat-card-header>
|
||||
<mat-card-title>{{issue.subject}}</mat-card-title>
|
||||
<mat-card-subtitle>{{issue.userReported?.userName}} on {{issue.createdDate | date:short}}</mat-card-subtitle>
|
||||
<mat-card-subtitle>{{'Issues.UserOnDate' | translate: { user: issue.userReported?.userName, date: issue.createdDate | amLocal | amUserLocale | amDateFormat: 'LL' } }}</mat-card-subtitle>
|
||||
</mat-card-header>
|
||||
<mat-card-content>
|
||||
<p>
|
||||
|
|
|
@ -9,6 +9,7 @@ import { AuthService } from "../../../auth/auth.service";
|
|||
import { IMovieRequests, RequestType, IAdvancedData } from "../../../interfaces";
|
||||
import { DenyDialogComponent } from "../shared/deny-dialog/deny-dialog.component";
|
||||
import { NewIssueComponent } from "../shared/new-issue/new-issue.component";
|
||||
import { TranslateService } from "@ngx-translate/core";
|
||||
import { MovieAdvancedOptionsComponent } from "./panels/movie-advanced-options/movie-advanced-options.component";
|
||||
import { RequestServiceV2 } from "../../../services/requestV2.service";
|
||||
import { RequestBehalfComponent } from "../shared/request-behalf/request-behalf.component";
|
||||
|
@ -39,7 +40,8 @@ export class MovieDetailsComponent {
|
|||
private sanitizer: DomSanitizer, private imageService: ImageService,
|
||||
public dialog: MatDialog, private requestService: RequestService,
|
||||
private requestService2: RequestServiceV2, private radarrService: RadarrService,
|
||||
public messageService: MessageService, private auth: AuthService, private settingsState: SettingsStateService) {
|
||||
public messageService: MessageService, private auth: AuthService, private settingsState: SettingsStateService,
|
||||
private translate: TranslateService) {
|
||||
this.route.params.subscribe(async (params: any) => {
|
||||
if (typeof params.movieDbId === 'string' || params.movieDbId instanceof String) {
|
||||
if (params.movieDbId.startsWith("tt")) {
|
||||
|
@ -97,7 +99,7 @@ export class MovieDetailsComponent {
|
|||
if (requestResult.result) {
|
||||
this.movie.requested = true;
|
||||
this.movie.requestId = requestResult.requestId;
|
||||
this.messageService.send(requestResult.message, "Ok");
|
||||
this.messageService.send(this.translate.instant("Requests.RequestAddedSuccessfully", { title: this.movie.title }), "Ok");
|
||||
this.movieRequest = await this.requestService.getMovieRequest(this.movie.requestId);
|
||||
} else {
|
||||
this.messageService.send(requestResult.errorMessage, "Ok");
|
||||
|
@ -110,7 +112,7 @@ export class MovieDetailsComponent {
|
|||
this.movie.requested = true;
|
||||
this.movie.requestId = result.requestId;
|
||||
this.movieRequest = await this.requestService.getMovieRequest(this.movie.requestId);
|
||||
this.messageService.send(result.message, "Ok");
|
||||
this.messageService.send(this.translate.instant("Requests.RequestAddedSuccessfully", { title: this.movie.title }), "Ok");
|
||||
} else {
|
||||
this.messageService.send(result.errorMessage, "Ok");
|
||||
}
|
||||
|
@ -151,7 +153,7 @@ export class MovieDetailsComponent {
|
|||
this.movie.approved = true;
|
||||
const result = await this.requestService.approveMovie({ id: this.movieRequest.id }).toPromise();
|
||||
if (result.result) {
|
||||
this.messageService.send("Successfully Approved", "Ok");
|
||||
this.messageService.send(this.translate.instant("Requests.SuccessfullyApproved"), "Ok");
|
||||
} else {
|
||||
this.movie.approved = false;
|
||||
this.messageService.send(result.errorMessage, "Ok");
|
||||
|
@ -162,7 +164,7 @@ export class MovieDetailsComponent {
|
|||
const result = await this.requestService.markMovieAvailable({ id: this.movieRequest.id }).toPromise();
|
||||
if (result.result) {
|
||||
this.movie.available = true;
|
||||
this.messageService.send(result.message, "Ok");
|
||||
this.messageService.send(this.translate.instant("Requests.NowAvailable"), "Ok");
|
||||
} else {
|
||||
this.messageService.send(result.errorMessage, "Ok");
|
||||
}
|
||||
|
@ -173,7 +175,7 @@ export class MovieDetailsComponent {
|
|||
const result = await this.requestService.markMovieUnavailable({ id: this.movieRequest.id }).toPromise();
|
||||
if (result.result) {
|
||||
this.movie.available = false;
|
||||
this.messageService.send(result.message, "Ok");
|
||||
this.messageService.send(this.translate.instant("Requests.NowUnavailable"), "Ok");
|
||||
} else {
|
||||
this.messageService.send(result.errorMessage, "Ok");
|
||||
}
|
||||
|
@ -204,7 +206,7 @@ export class MovieDetailsComponent {
|
|||
public reProcessRequest() {
|
||||
this.requestService2.reprocessRequest(this.movieRequest.id, RequestType.movie).subscribe(result => {
|
||||
if (result.result) {
|
||||
this.messageService.send(result.message ? result.message : "Successfully Re-processed the request", "Ok");
|
||||
this.messageService.send(result.message ? result.message : this.translate.instant("Requests.SuccessfullyReprocessed"), "Ok");
|
||||
} else {
|
||||
this.messageService.send(result.errorMessage, "Ok");
|
||||
}
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
</div>
|
||||
<div *ngIf="streams?.length > 0" class="streaming-on">
|
||||
<hr>
|
||||
<span class="label">{{'MediaDetails.StreamingOn' | translate }}:</span>
|
||||
<span class="label">{{'MediaDetails.StreamingOn' | translate }}</span>
|
||||
<div>
|
||||
<span *ngFor="let stream of streams">
|
||||
<img class="stream-small" [matTooltip]="stream.streamingProvider" src="https://image.tmdb.org/t/p/original{{stream.logo}}">
|
||||
|
@ -26,11 +26,11 @@
|
|||
</div>
|
||||
<hr>
|
||||
<div>
|
||||
<span class="label">{{'MediaDetails.Status' | translate }}:</span>
|
||||
{{movie.status}}
|
||||
<span class="label">{{'MediaDetails.Status' | translate }}</span>
|
||||
<span id="status"> {{ this.movie.status | translateStatus }}</span>
|
||||
</div>
|
||||
<div>
|
||||
<span class="label">{{'MediaDetails.Availability' | translate }}:</span>
|
||||
<span class="label">{{'MediaDetails.Availability' | translate }}</span>
|
||||
<span *ngIf="movie.available"> {{'Common.Available' | translate}}</span>
|
||||
<span *ngIf="!movie.available"> {{'Common.NotAvailable' | translate}}</span>
|
||||
</div>
|
||||
|
@ -44,23 +44,23 @@
|
|||
</div>
|
||||
|
||||
<div *ngIf="request">
|
||||
<span class="label">{{'Requests.RequestedBy' | translate }}: </span>
|
||||
<span id="requestedByInfo">{{request.requestedUser.userAlias}}</span>
|
||||
<span class="label">{{'MediaDetails.RequestedBy' | translate }}</span>
|
||||
<span id="requestedByInfo"> {{request.requestedUser.userAlias}}</span>
|
||||
</div>
|
||||
|
||||
<div *ngIf="request">
|
||||
<span class="label">{{'Requests.RequestDate' | translate }}:</span>
|
||||
{{request.requestedDate | date}}
|
||||
<span class="label">{{'MediaDetails.RequestDate' | translate }}</span>
|
||||
{{request.requestedDate | amUserLocale | amDateFormat: 'LL'}}
|
||||
</div>
|
||||
|
||||
<div *ngIf="request && request.denied">
|
||||
<span class="label">{{'Requests.DeniedReason' | translate }}: </span>
|
||||
<span class="label">{{'MediaDetails.DeniedReason' | translate }}</span>
|
||||
<span id="deniedReasonInfo">{{request.deniedReason}}</span>
|
||||
</div>
|
||||
|
||||
|
||||
<div *ngIf="movie.quality">
|
||||
<span class="label">{{'MediaDetails.Quality' | translate }}:</span>
|
||||
<span class="label">{{'MediaDetails.Quality' | translate }}</span>
|
||||
<div>{{movie.quality | quality}}</div>
|
||||
</div>
|
||||
|
||||
|
@ -77,34 +77,34 @@
|
|||
|
||||
<hr>
|
||||
|
||||
<span class="label">{{'MediaDetails.TheatricalRelease' | translate }}:</span>
|
||||
{{movie.releaseDate | date: 'mediumDate'}}
|
||||
<span class="label">{{'MediaDetails.TheatricalRelease' | translate }}</span>
|
||||
{{movie.releaseDate | amUserLocale | amDateFormat: 'LL': 'mediumDate'}}
|
||||
|
||||
<div *ngIf="movie.digitalReleaseDate">
|
||||
<span class="label">{{'MediaDetails.DigitalRelease' | translate }}:</span>
|
||||
{{movie.digitalReleaseDate | date: 'mediumDate'}}
|
||||
<span class="label">{{'MediaDetails.DigitalRelease' | translate }}</span>
|
||||
{{movie.digitalReleaseDate | amUserLocale | amDateFormat: 'LL': 'mediumDate'}}
|
||||
</div>
|
||||
|
||||
<div *ngIf="movie.voteCount">
|
||||
<span class="label">{{'MediaDetails.Votes' | translate }}:</span>
|
||||
<span class="label">{{'MediaDetails.Votes' | translate }}</span>
|
||||
{{movie.voteCount | thousandShort: 1}}
|
||||
</div>
|
||||
<div>
|
||||
<span class="label">{{'MediaDetails.Runtime' | translate }}:</span>
|
||||
<span class="label">{{'MediaDetails.Runtime' | translate }}</span>
|
||||
{{'MediaDetails.Minutes' | translate:{runtime: movie.runtime} }}
|
||||
</div>
|
||||
<div *ngIf="movie.revenue">
|
||||
<span class="label">{{'MediaDetails.Revenue' | translate }}:</span>
|
||||
<span class="label">{{'MediaDetails.Revenue' | translate }}</span>
|
||||
{{movie.revenue | currency: 'USD'}}
|
||||
</div>
|
||||
<div *ngIf="movie.budget">
|
||||
<span class="label">{{'MediaDetails.Budget' | translate }}:</span>
|
||||
<span class="label">{{'MediaDetails.Budget' | translate }}</span>
|
||||
{{movie.budget | currency: 'USD'}}
|
||||
</div>
|
||||
|
||||
<hr />
|
||||
<div class="genre-button-container" *ngIf="movie.genres">
|
||||
<span class="label">{{'MediaDetails.Genres' | translate }}:</span>
|
||||
<span class="label">{{'MediaDetails.Genres' | translate }}</span>
|
||||
<div>
|
||||
<mat-chip-list>
|
||||
<mat-chip selected *ngFor="let genre of movie.genres">
|
||||
|
@ -116,7 +116,7 @@
|
|||
|
||||
<hr />
|
||||
<div class="keyword-button-container" *ngIf="movie?.keywords?.keywordsValue?.length > 0">
|
||||
<span class="label">{{'MediaDetails.Keywords' | translate }}:</span>
|
||||
<span class="label">{{'MediaDetails.Keywords' | translate }}</span>
|
||||
<mat-chip-list>
|
||||
<mat-chip selected *ngFor="let keyword of movie.keywords.keywordsValue">
|
||||
{{keyword.name}}
|
||||
|
|
|
@ -2,6 +2,7 @@ import { Component, Inject } from "@angular/core";
|
|||
import { IDenyDialogData } from "../interfaces/interfaces";
|
||||
import { MatDialogRef, MAT_DIALOG_DATA } from "@angular/material/dialog";
|
||||
import { RequestService, MessageService } from "../../../../services";
|
||||
import { TranslateService } from "@ngx-translate/core";
|
||||
import { RequestType, IRequestEngineResult } from "../../../../interfaces";
|
||||
|
||||
@Component({
|
||||
|
@ -13,7 +14,8 @@ export class DenyDialogComponent {
|
|||
public dialogRef: MatDialogRef<DenyDialogComponent>,
|
||||
@Inject(MAT_DIALOG_DATA) public data: IDenyDialogData,
|
||||
private requestService: RequestService,
|
||||
public messageService: MessageService) {}
|
||||
public messageService: MessageService,
|
||||
private translate: TranslateService) {}
|
||||
|
||||
public denyReason: string;
|
||||
|
||||
|
@ -30,7 +32,7 @@ export class DenyDialogComponent {
|
|||
}
|
||||
|
||||
if (result.result) {
|
||||
this.messageService.send("Denied Request", "Ok");
|
||||
this.messageService.send(this.translate.instant("Requests.DeniedRequest"), "Ok");
|
||||
this.data.denied = true;
|
||||
} else {
|
||||
this.messageService.send(result.errorMessage, "Ok");
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
<div *ngIf="streams?.length > 0" id="streamingContainer" class="streaming-on-container">
|
||||
<hr>
|
||||
<div class="streaming-on-content">
|
||||
<span class="label">{{'MediaDetails.StreamingOn' | translate }}:</span>
|
||||
<span class="label">{{'MediaDetails.StreamingOn' | translate }}</span>
|
||||
<div>
|
||||
<span *ngFor="let stream of sortBy('order')">
|
||||
<img class="stream-small" id="stream{{stream.streamingProvider}}" [matTooltip]="stream.streamingProvider" src="https://image.tmdb.org/t/p/original{{stream.logo}}">
|
||||
|
@ -21,44 +21,44 @@
|
|||
</div>
|
||||
<hr>
|
||||
<div *ngIf="tv.status">
|
||||
<span class="label">{{'MediaDetails.Status' | translate }}:</span>
|
||||
<span id="status"> {{tv.status}}</span>
|
||||
<span class="label">{{'MediaDetails.Status' | translate }}</span>
|
||||
<span id="status"> {{ tv.status | translateStatus }}</span>
|
||||
</div>
|
||||
<span class="label">First Aired:</span>
|
||||
{{tv.firstAired | date: 'mediumDate'}}
|
||||
<span class="label">{{'MediaDetails.FirstAired' | translate }}</span>
|
||||
{{tv.firstAired | amLocal | amUserLocale | amDateFormat: 'LL' }}
|
||||
</div>
|
||||
|
||||
<div *ngIf="seasonCount">
|
||||
<span class="label">Seasons:</span>
|
||||
<span class="label">{{'MediaDetails.Seasons' | translate }}</span>
|
||||
{{seasonCount}}
|
||||
</div>
|
||||
<div *ngIf="totalEpisodes">
|
||||
<span class="label">Episodes:</span>
|
||||
<span class="label">{{'MediaDetails.Episodes' | translate }}</span>
|
||||
{{totalEpisodes}}
|
||||
</div>
|
||||
|
||||
<div *ngIf="advancedOptions && request?.rootPathOverrideTitle">
|
||||
<span class="label">{{'MediaDetails.RootFolderOverride' | translate }}:</span>
|
||||
<span class="label">{{'MediaDetails.RootFolderOverride' | translate }}</span>
|
||||
<div>{{request.rootPathOverrideTitle}}</div>
|
||||
</div>
|
||||
<div *ngIf="advancedOptions && request?.qualityOverrideTitle">
|
||||
<span class="label">{{'MediaDetails.QualityOverride' | translate }}:</span>
|
||||
<span class="label">{{'MediaDetails.QualityOverride' | translate }}</span>
|
||||
<div>{{request.qualityOverrideTitle}}</div>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<span class="label">{{'MediaDetails.Runtime' | translate }}:</span>
|
||||
<span class="label">{{'MediaDetails.Runtime' | translate }}</span>
|
||||
{{'MediaDetails.Minutes' | translate:{ runtime: tv.runtime} }}
|
||||
</div>
|
||||
|
||||
<div *ngIf="tv.network">
|
||||
<span class="label">Network:</span>
|
||||
<span class="label">{{'MediaDetails.Network' | translate }}</span>
|
||||
{{tv.network.name}}
|
||||
</div>
|
||||
|
||||
|
||||
<div class="genre-button-container" *ngIf="tv.genres">
|
||||
<span class="label">{{'MediaDetails.Genres' | translate }}:</span>
|
||||
<span class="label">{{'MediaDetails.Genres' | translate }}</span>
|
||||
<div>
|
||||
<mat-chip-list>
|
||||
<mat-chip selected *ngFor="let genre of tv.genres">
|
||||
|
|
|
@ -43,5 +43,5 @@ export class TvInformationPanelComponent implements OnInit {
|
|||
|
||||
public sortBy(prop: string) {
|
||||
return this.streams.sort((a, b) => a[prop] > b[prop] ? 1 : a[prop] === b[prop] ? 0 : -1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
</mat-panel-title>
|
||||
<mat-panel-description>
|
||||
{{'Requests.RequestedBy' | translate}} '{{request.requestedUser.userAlias}}' on
|
||||
{{request.requestedDate | amLocal | amDateFormat: 'LL' }}
|
||||
{{request.requestedDate | amLocal | amUserLocale | amDateFormat: 'LL' }}
|
||||
<span *ngIf="request.denied"> - {{request.deniedReason}}</span>
|
||||
</mat-panel-description>
|
||||
</mat-expansion-panel-header>
|
||||
|
|
19
src/Ombi/ClientApp/src/app/pipes/TranslateStatus.ts
Normal file
19
src/Ombi/ClientApp/src/app/pipes/TranslateStatus.ts
Normal file
|
@ -0,0 +1,19 @@
|
|||
import { Pipe, PipeTransform } from '@angular/core';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
|
||||
@Pipe({
|
||||
name: 'translateStatus'
|
||||
})
|
||||
export class TranslateStatusPipe implements PipeTransform {
|
||||
constructor(private translateService: TranslateService) {}
|
||||
|
||||
transform(value: string): string {
|
||||
const textKey = 'MediaDetails.StatusValues.' + value;
|
||||
const text = this.translateService.instant(textKey);
|
||||
if (text !== textKey) {
|
||||
return text;
|
||||
} else {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,5 +1,6 @@
|
|||
import { ModuleWithProviders, NgModule } from "@angular/core";
|
||||
import { HumanizePipe } from "./HumanizePipe";
|
||||
import { TranslateStatusPipe } from "./TranslateStatus";
|
||||
import { ThousandShortPipe } from "./ThousandShortPipe";
|
||||
import { SafePipe } from "./SafePipe";
|
||||
import { QualityPipe } from "./QualityPipe";
|
||||
|
@ -7,8 +8,8 @@ import { UserLocalePipe } from "./UserLocalePipe";
|
|||
|
||||
@NgModule({
|
||||
imports: [],
|
||||
declarations: [HumanizePipe, ThousandShortPipe, SafePipe, QualityPipe, UserLocalePipe],
|
||||
exports: [HumanizePipe, ThousandShortPipe, SafePipe, QualityPipe, UserLocalePipe],
|
||||
declarations: [HumanizePipe, ThousandShortPipe, SafePipe, QualityPipe, UserLocalePipe, TranslateStatusPipe ],
|
||||
exports: [HumanizePipe, ThousandShortPipe, SafePipe, QualityPipe, UserLocalePipe, TranslateStatusPipe ],
|
||||
})
|
||||
export class PipeModule {
|
||||
|
||||
|
|
|
@ -48,7 +48,7 @@
|
|||
|
||||
<ng-container matColumnDef="requestedDate">
|
||||
<th mat-header-cell *matHeaderCellDef mat-sort-header disableClear> {{ 'Requests.RequestDate' | translate}} </th>
|
||||
<td mat-cell *matCellDef="let element"> {{element.requestedDate | amLocal | amDateFormat: 'LL'}} </td>
|
||||
<td mat-cell *matCellDef="let element"> {{element.requestedDate | amLocal | amUserLocale | amDateFormat: 'LL'}} </td>
|
||||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="requestStatus">
|
||||
|
|
|
@ -58,12 +58,12 @@
|
|||
|
||||
<ng-container matColumnDef="requestedDate">
|
||||
<th mat-header-cell *matHeaderCellDef mat-sort-header disableClear> {{ 'Requests.RequestDate' | translate}} </th>
|
||||
<td mat-cell id="requestedDate{{element.id}}" *matCellDef="let element"> {{element.requestedDate | amLocal | amDateFormat: 'LL'}} </td>
|
||||
<td mat-cell id="requestedDate{{element.id}}" *matCellDef="let element"> {{element.requestedDate | amLocal | amUserLocale | amDateFormat: 'LL'}} </td>
|
||||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="status">
|
||||
<th mat-header-cell *matHeaderCellDef mat-sort-header disableClear> {{ 'Requests.Status' | translate}} </th>
|
||||
<td mat-cell id="status{{element.id}}" *matCellDef="let element"> {{element.status}} </td>
|
||||
<td mat-cell id="status{{element.id}}" *matCellDef="let element"> {{element.status |translateStatus }} </td>
|
||||
</ng-container>
|
||||
|
||||
|
||||
|
|
|
@ -44,7 +44,7 @@
|
|||
<ng-container matColumnDef="requestedDate">
|
||||
<th mat-header-cell *matHeaderCellDef mat-sort-header disableClear> {{'Requests.RequestDate' | translate}} </th>
|
||||
<td id="requestedDate{{element.id}}" mat-cell *matCellDef="let element">
|
||||
{{element.requestedDate | amLocal | amDateFormat: 'LL'}}
|
||||
{{element.requestedDate | amLocal | amUserLocale | amDateFormat: 'LL'}}
|
||||
</td>
|
||||
</ng-container>
|
||||
|
||||
|
@ -56,7 +56,7 @@
|
|||
<ng-container matColumnDef="status">
|
||||
<th mat-header-cell *matHeaderCellDef> {{'Requests.Status' | translate}} </th>
|
||||
<td mat-cell id="status{{element.id}}" *matCellDef="let element">
|
||||
{{element.parentRequest.status}}
|
||||
{{element.parentRequest.status | translateStatus }}
|
||||
</td>
|
||||
</ng-container>
|
||||
|
||||
|
|
|
@ -99,11 +99,11 @@
|
|||
|
||||
|
||||
<div id="releaseDate">{{ 'Requests.TheatricalRelease' | translate: {date: request.releaseDate |
|
||||
amLocal | amDateFormat: 'LL'} }}</div>
|
||||
amLocal | amUserLocale | amDateFormat: 'LL'} }}</div>
|
||||
<div *ngIf="request.digitalReleaseDate" id="digitalReleaseDate">{{ 'Requests.DigitalRelease' |
|
||||
translate: {date: request.digitalReleaseDate | amLocal | amDateFormat: 'LL'} }}</div>
|
||||
translate: {date: request.digitalReleaseDate | amLocal | amUserLocale | amDateFormat: 'LL'} }}</div>
|
||||
<div id="requestedDate">{{ 'Requests.RequestDate' | translate }} {{request.requestedDate | amLocal
|
||||
| amDateFormat: 'LL'}}</div>
|
||||
| amUserLocale | amDateFormat: 'LL'}}</div>
|
||||
<br />
|
||||
</div>
|
||||
<div *ngIf="isAdmin">
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
<div class="col-sm-5 small-padding">
|
||||
<div>
|
||||
<a href="http://www.imdb.com/title/{{node.imdbId}}/" target="_blank">
|
||||
<h4 class="request-title">{{node.title}} ({{node.releaseDate | amLocal | amDateFormat: 'YYYY'}})</h4>
|
||||
<h4 class="request-title">{{node.title}} ({{node.releaseDate | amLocal| amUserLocale | amDateFormat: 'YYYY'}})</h4>
|
||||
</a>
|
||||
</div>
|
||||
<br />
|
||||
|
@ -32,7 +32,7 @@
|
|||
</div>
|
||||
|
||||
|
||||
<div>Release Date: {{node.releaseDate | amLocal | amDateFormat: 'LL'}}</div>
|
||||
<div>Release Date: {{node.releaseDate | amLocal | amUserLocale | amDateFormat: 'LL'}}</div>
|
||||
<div *ngIf="isAdmin">
|
||||
<div *ngIf="node.qualityOverrideTitle" class="quality-override">{{ 'Requests.QualityOverride' | translate }}
|
||||
<span>{{node.qualityOverrideTitle}} </span>
|
||||
|
|
|
@ -103,7 +103,7 @@
|
|||
amDateFormat: 'LL'} }}</span>
|
||||
<span *ngIf="result.digitalReleaseDate" class="label label-info" id="releaseDateLabel"
|
||||
target="_blank">{{ 'Search.DigitalDate' | translate: {date: result.digitalReleaseDate |
|
||||
amLocal | amDateFormat: 'LL'} }}</span>
|
||||
amLocal | amUserLocale | amDateFormat: 'LL'} }}</span>
|
||||
|
||||
<a *ngIf="result.homepage" href="{{result.homepage}}" id="homePageLabel" target="_blank"><span
|
||||
class="label label-info" [translate]="'Search.Movies.HomePage'"></span></a>
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
</div>
|
||||
|
||||
|
||||
<small>Updated at {{data.updateDate | date}}</small>
|
||||
<small>Updated at {{data.updateDate | amUserLocale | amDateFormat: 'LL' }}</small>
|
||||
</mat-dialog-content>
|
||||
|
||||
|
||||
|
|
|
@ -20,8 +20,8 @@
|
|||
<mat-expansion-panel-header>
|
||||
<mat-panel-title>
|
||||
<mat-checkbox *ngIf="!season.seasonAvailable && isSeasonCheckable(season)" (click)="$event.stopPropagation();" (change)="seasonChanged($event, season)">
|
||||
Season {{season.seasonNumber}}</mat-checkbox>
|
||||
<span *ngIf="season.seasonAvailable || !isSeasonCheckable(season)">Season {{season.seasonNumber}}</span>
|
||||
{{ 'MediaDetails.EpisodeSelector.SeasonNumber' | translate: { number: season.seasonNumber } }}</mat-checkbox>
|
||||
<span *ngIf="season.seasonAvailable || !isSeasonCheckable(season)">{{ 'MediaDetails.EpisodeSelector.SeasonNumber' | translate: { number: season.seasonNumber } }}</span>
|
||||
</mat-panel-title>
|
||||
<mat-panel-description>
|
||||
<!-- Description -->
|
||||
|
|
|
@ -3,6 +3,7 @@ import { MatCheckboxChange } from "@angular/material/checkbox";
|
|||
import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from "@angular/material/dialog";
|
||||
import { ISearchTvResultV2 } from "../../interfaces/ISearchTvResultV2";
|
||||
import { MessageService } from "../../services";
|
||||
import { TranslateService } from "@ngx-translate/core";
|
||||
import { ISeasonsViewModel, IEpisodesRequests, INewSeasonRequests, ITvRequestViewModelV2, IRequestEngineResult, RequestType } from "../../interfaces";
|
||||
import { RequestServiceV2 } from "../../services/requestV2.service";
|
||||
import { AdminRequestDialogComponent } from "../admin-request-dialog/admin-request-dialog.component";
|
||||
|
@ -23,7 +24,8 @@ export class EpisodeRequestComponent {
|
|||
}
|
||||
|
||||
constructor(public dialogRef: MatDialogRef<EpisodeRequestComponent>, @Inject(MAT_DIALOG_DATA) public data: EpisodeRequestData,
|
||||
private requestService: RequestServiceV2, private notificationService: MessageService, private dialog: MatDialog) { }
|
||||
private requestService: RequestServiceV2, private notificationService: MessageService, private dialog: MatDialog,
|
||||
private translate: TranslateService) { }
|
||||
|
||||
|
||||
public async submitRequests() {
|
||||
|
@ -35,7 +37,7 @@ export class EpisodeRequestComponent {
|
|||
});
|
||||
|
||||
if (!selected && !this.data.series.requestAll && !this.data.series.firstSeason && !this.data.series.latestSeason) {
|
||||
this.notificationService.send("You need to select some episodes!", "OK");
|
||||
this.notificationService.send(this.translate.instant("Requests.NeedToSelectEpisodes"), "OK");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -123,7 +125,7 @@ export class EpisodeRequestComponent {
|
|||
private postRequest(requestResult: IRequestEngineResult) {
|
||||
if (requestResult.result) {
|
||||
this.notificationService.send(
|
||||
`Request for ${this.data.series.title} has been added successfully`);
|
||||
this.translate.instant("Requests.RequestAddedSuccessfully", { title: this.data.series.title }));
|
||||
|
||||
this.data.series.seasonRequests.forEach((season) => {
|
||||
season.episodes.forEach((ep) => {
|
||||
|
|
|
@ -38,6 +38,7 @@ import { MatTreeModule } from '@angular/material/tree';
|
|||
import { MomentModule } from "ngx-moment";
|
||||
import { NgModule } from "@angular/core";
|
||||
import { SidebarModule } from "primeng/sidebar";
|
||||
import { PipeModule } from "../pipes/pipe.module";
|
||||
import { TheMovieDbService } from "../services";
|
||||
import { TranslateModule } from "@ngx-translate/core";
|
||||
import { TruncateModule } from "@yellowspot/ng-truncate";
|
||||
|
@ -87,6 +88,7 @@ import { WatchProvidersSelectComponent } from "./components/watch-providers-sele
|
|||
MatTreeModule,
|
||||
MatStepperModule,
|
||||
MatSnackBarModule,
|
||||
PipeModule,
|
||||
],
|
||||
exports: [
|
||||
TranslateModule,
|
||||
|
|
|
@ -7,15 +7,15 @@
|
|||
</div>
|
||||
|
||||
<mat-tab-group>
|
||||
<mat-tab label="Profile">
|
||||
<mat-tab label="{{'UserPreferences.Profile' | translate}}">
|
||||
<div class="tab-content">
|
||||
|
||||
<div class="row user-type-row">
|
||||
<div class="col-5 col-sm-3 col-md-2">
|
||||
User Type:
|
||||
{{'UserPreferences.UserType' | translate}}
|
||||
</div>
|
||||
<div class="col-7 col-sm-9 col-md-10">
|
||||
{{UserType[user?.userType]}}
|
||||
{{'UserTypeLabel.' + user?.userType | translate }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
@ -58,7 +58,7 @@
|
|||
<div class="col-12">
|
||||
<a href="https://play.google.com/store/apps/details?id=com.tidusjar.Ombi&pcampaignid=pcampaignidMKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1"
|
||||
target="_blank"><img width="200" alt="Get it on Google Play"
|
||||
src="https://play.google.com/intl/en_us/badges/static/images/badges/en_badge_web_generic.png" /></a>
|
||||
src="https://play.google.com/intl/{{ selectedLang }}/badges/static/images/badges/{{ selectedLang }}_badge_web_generic.png" /></a>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<a href="https://apps.apple.com/us/app/ombi/id1335260043" target="_blank"><img
|
||||
|
@ -66,7 +66,9 @@
|
|||
src="{{baseUrl}}/images/appstore.svg" /></a>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<button style="margin-left:13px; margin-top: 20px;" mat-raised-button color="accent" type="button" (click)="openMobileApp($event)">Open Mobile App</button>
|
||||
<button style="margin-left:13px; margin-top: 20px;" mat-raised-button color="accent" type="button" (click)="openMobileApp($event)">
|
||||
{{'NavigationBar.OpenMobileApp' | translate}}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -75,15 +77,15 @@
|
|||
</div>
|
||||
|
||||
</mat-tab>
|
||||
<mat-tab *ngIf="user?.userType === UserType.LocalUser" label="Security">
|
||||
<mat-tab *ngIf="user?.userType === UserType.LocalUser" label="{{'UserPreferences.Security' | translate}}">
|
||||
<div class="tab-content">
|
||||
<h2>Change Details</h2>
|
||||
<h2>{{'UserPreferences.ChangeDetails' | translate}}</h2>
|
||||
<form novalidate [formGroup]="passwordForm" (ngSubmit)="updatePassword()">
|
||||
<div class="row">
|
||||
<div class="col-md-6 col-12">
|
||||
<span>You need your current password to make any changes here</span>
|
||||
<span>{{'UserPreferences.NeedCurrentPassword' | translate}}</span>
|
||||
<mat-form-field appearance="outline" floatLabel=always>
|
||||
<mat-label>Current Password</mat-label>
|
||||
<mat-label>{{'UserPreferences.CurrentPassword' | translate}}</mat-label>
|
||||
<input id="currentPassword" matInput type="password" formControlName="currentPassword">
|
||||
</mat-form-field>
|
||||
</div>
|
||||
|
@ -91,7 +93,7 @@
|
|||
<div class="row">
|
||||
<div class="col-md-6 col-12">
|
||||
<mat-form-field appearance="outline" floatLabel=always>
|
||||
<mat-label>Email Address</mat-label>
|
||||
<mat-label>{{'UserPreferences.EmailAddress' | translate}}</mat-label>
|
||||
<input id="email" matInput formControlName="emailAddress">
|
||||
</mat-form-field>
|
||||
</div>
|
||||
|
@ -100,7 +102,7 @@
|
|||
<div class="row">
|
||||
<div class="col-md-6 col-12">
|
||||
<mat-form-field appearance="outline" floatLabel=always>
|
||||
<mat-label>New Password</mat-label>
|
||||
<mat-label>{{'UserPreferences.NewPassword' | translate}}</mat-label>
|
||||
<input id="newPassword" matInput type="password" formControlName="password">
|
||||
</mat-form-field>
|
||||
</div>
|
||||
|
@ -108,12 +110,14 @@
|
|||
<div class="row">
|
||||
<div class="col-md-6 col-12">
|
||||
<mat-form-field appearance="outline" floatLabel=always>
|
||||
<mat-label>New Password Confirm</mat-label>
|
||||
<mat-label>{{'UserPreferences.NewPasswordConfirm' | translate}}</mat-label>
|
||||
<input id="confirmPassword" matInput type="password" formControlName="confirmPassword">
|
||||
</mat-form-field>
|
||||
</div>
|
||||
</div>
|
||||
<button id="submitSecurity" mat-raised-button color="accent" type="submit">Update</button>
|
||||
<button id="submitSecurity" mat-raised-button color="accent" type="submit">
|
||||
{{'Common.Update' | translate}}
|
||||
</button>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
|
|
|
@ -133,7 +133,7 @@ export class UserPreferenceComponent implements OnInit {
|
|||
currentPassword: values.currentPassword
|
||||
}).subscribe(x => {
|
||||
if (x.successful) {
|
||||
this.notification.success("Updated your information");
|
||||
this.notification.success(this.translate.instant("UserPreferences.UpdatedYourInformation"));
|
||||
this.user.emailAddress = values.emailAddress;
|
||||
} else {
|
||||
this.notification.error(x.errors[0]);
|
||||
|
|
|
@ -14,6 +14,8 @@
|
|||
"Common": {
|
||||
"ContinueButton": "Continue",
|
||||
"Available": "Available",
|
||||
"Approved": "Approved",
|
||||
"Pending": "Pending",
|
||||
"PartiallyAvailable": "Partially Available",
|
||||
"Monitored": "Monitored",
|
||||
"NotAvailable": "Not Available",
|
||||
|
@ -33,6 +35,7 @@
|
|||
},
|
||||
"Cancel": "Cancel",
|
||||
"Submit": "Submit",
|
||||
"Update": "Update",
|
||||
"tvShow": "TV Show",
|
||||
"movie": "Movie"
|
||||
},
|
||||
|
@ -192,7 +195,16 @@
|
|||
"ChangeAvailability":"Mark Available",
|
||||
"Deleted": "Successfully deleted selected items",
|
||||
"Approved": "Successfully approved selected items"
|
||||
}
|
||||
},
|
||||
"SuccessfullyApproved": "Successfully Approved",
|
||||
"NowAvailable": "Request is now available",
|
||||
"NowUnavailable": "Request is now unavailable",
|
||||
"SuccessfullyReprocessed": "Successfully Re-processed the request",
|
||||
"DeniedRequest": "Denied Request",
|
||||
"RequestCollection": "Request Collection",
|
||||
"CollectionSuccesfullyAdded": "The collection {{name}} has been successfully added!",
|
||||
"NeedToSelectEpisodes": "You need to select some episodes!",
|
||||
"RequestAddedSuccessfully": "Request for {{title}} has been added successfully"
|
||||
},
|
||||
"Issues": {
|
||||
"Title": "Issues",
|
||||
|
@ -228,7 +240,8 @@
|
|||
"Delete": "Delete issue",
|
||||
"DeletedIssue": "Issue has been deleted",
|
||||
"Chat":"Chat",
|
||||
"Requested":"Requested"
|
||||
"Requested":"Requested",
|
||||
"UserOnDate": "{{user}} on {{date}}"
|
||||
},
|
||||
"Filter": {
|
||||
"ClearFilter": "Clear Filter",
|
||||
|
@ -269,21 +282,33 @@
|
|||
"QualityProfilesSelect":"Select A Quality Profile",
|
||||
"RootFolderSelect":"Select A Root Folder",
|
||||
"LanguageProfileSelect":"Select A Language Profile",
|
||||
"Status":"Status",
|
||||
"Availability":"Availability",
|
||||
"Status":"Status:",
|
||||
"StatusValues" : {
|
||||
"Planned": "Planned",
|
||||
"In Production": "In Production",
|
||||
"Released": "Released",
|
||||
"Returning Series": "Returning Series",
|
||||
"Ended": "Ended",
|
||||
"Canceled": "Canceled"
|
||||
},
|
||||
"Seasons": "Seasons:",
|
||||
"Episodes": "Episodes:",
|
||||
"Availability":"Availability:",
|
||||
"RequestStatus":"Request Status",
|
||||
"Quality":"Quality",
|
||||
"RootFolderOverride":"Root Folder Override",
|
||||
"QualityOverride":"Quality Override",
|
||||
"Genres":"Genres",
|
||||
"TheatricalRelease":"Release",
|
||||
"DigitalRelease":"Digital Release",
|
||||
"Votes":"Votes",
|
||||
"Runtime":"Runtime",
|
||||
"Quality":"Quality:",
|
||||
"RootFolderOverride":"Root Folder Override:",
|
||||
"QualityOverride":"Quality Override:",
|
||||
"Network":"Network:",
|
||||
"Genres":"Genres:",
|
||||
"FirstAired":"First Aired:",
|
||||
"TheatricalRelease":"Release:",
|
||||
"DigitalRelease":"Digital Release:",
|
||||
"Votes":"Votes:",
|
||||
"Runtime":"Runtime:",
|
||||
"Minutes": "{{runtime}} Minutes",
|
||||
"Revenue":"Revenue",
|
||||
"Budget":"Budget",
|
||||
"Keywords":"Keywords/Tags",
|
||||
"Revenue":"Revenue:",
|
||||
"Budget":"Budget:",
|
||||
"Keywords":"Keywords/Tags:",
|
||||
"Casts": {
|
||||
"CastTitle": "Cast"
|
||||
},
|
||||
|
@ -291,13 +316,17 @@
|
|||
"AllSeasonsTooltip": "This will request every season for this show",
|
||||
"FirstSeasonTooltip": "This will only request the First Season for this show",
|
||||
"LatestSeasonTooltip": "This will only request the Latest Season for this show",
|
||||
"NoEpisodes": "There unfortunately is no episode data for this show yet!"
|
||||
"NoEpisodes": "There unfortunately is no episode data for this show yet!",
|
||||
"SeasonNumber": "Season {{number}}"
|
||||
},
|
||||
"SonarrConfiguration": "Sonarr Configuration",
|
||||
"RadarrConfiguration": "Radarr Configuration",
|
||||
"RequestOnBehalf": "Request on behalf of",
|
||||
"PleaseSelectUser": "Please select a user",
|
||||
"StreamingOn": "Streaming On",
|
||||
"StreamingOn": "Streaming On:",
|
||||
"RequestedBy": "Requested By:",
|
||||
"RequestDate": "Request Date:",
|
||||
"DeniedReason": "Denied Reason:",
|
||||
"ReProcessRequest": "Re-Process Request"
|
||||
},
|
||||
"Discovery": {
|
||||
|
@ -333,6 +362,24 @@
|
|||
"LanguageDescription": "This is the language you would like the Ombi interface to be displayed in.",
|
||||
"MobileQRCode":"Mobile QR Code",
|
||||
"LegacyApp":"Launch Legacy App",
|
||||
"NoQrCode":"Please contact your administrator to enable QR codes"
|
||||
"NoQrCode":"Please contact your administrator to enable QR codes",
|
||||
"UserType": "User Type:",
|
||||
"ChangeDetails": "Change Details",
|
||||
"NeedCurrentPassword": "You need your current password to make any changes here",
|
||||
"CurrentPassword": "Current Password",
|
||||
"EmailAddress": "Email Address",
|
||||
"NewPassword": "New Password",
|
||||
"NewPasswordConfirm": "New Password Confirm",
|
||||
"Security": "Security",
|
||||
"Profile": "Profile",
|
||||
"UpdatedYourInformation": "Updated your information"
|
||||
},
|
||||
"UserTypeLabel": {
|
||||
"1": "Local User",
|
||||
"2": "Plex User",
|
||||
"3": "Emby User",
|
||||
"4": "Emby Connect User",
|
||||
"5": "Jellyfin User"
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue