Merge branch 'DotNetCore' of https://github.com/tidusjar/ombi into DotNetCore

pull/1909/head^2
Jamie 7 years ago
commit 0fc2037ae3

@ -1,15 +1,13 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
using Ombi.Core.Models.Requests; using Ombi.Core.Models.Requests;
using Ombi.Core.Models.Search;
using Ombi.Store.Entities;
using Ombi.Store.Entities.Requests; using Ombi.Store.Entities.Requests;
namespace Ombi.Core.Engine.Interfaces namespace Ombi.Core.Engine.Interfaces
{ {
public interface IMovieRequestEngine : IRequestEngine<MovieRequests> public interface IMovieRequestEngine : IRequestEngine<MovieRequests>
{ {
Task<RequestEngineResult> RequestMovie(SearchMovieViewModel model); Task<RequestEngineResult> RequestMovie(MovieRequestViewModel model);
Task<IEnumerable<MovieRequests>> SearchMovieRequest(string search); Task<IEnumerable<MovieRequests>> SearchMovieRequest(string search);

@ -43,16 +43,16 @@ namespace Ombi.Core.Engine
/// </summary> /// </summary>
/// <param name="model">The model.</param> /// <param name="model">The model.</param>
/// <returns></returns> /// <returns></returns>
public async Task<RequestEngineResult> RequestMovie(SearchMovieViewModel model) public async Task<RequestEngineResult> RequestMovie(MovieRequestViewModel model)
{ {
var movieInfo = await MovieApi.GetMovieInformation(model.Id); var movieInfo = await MovieApi.GetMovieInformation(model.TheMovieDbId);
if (movieInfo == null || movieInfo.Id == 0) if (movieInfo == null || movieInfo.Id == 0)
{ {
return new RequestEngineResult return new RequestEngineResult
{ {
Result = false, Result = false,
Message = "There was an issue adding this movie!", Message = "There was an issue adding this movie!",
ErrorMessage = $"TheMovieDb didn't have any information for ID {model.Id}" ErrorMessage = $"TheMovieDb didn't have any information for ID {model.TheMovieDbId}"
}; };
} }
var fullMovieName = var fullMovieName =

@ -0,0 +1,33 @@
#region Copyright
// /************************************************************************
// Copyright (c) 2018 Jamie Rees
// File: MovieRequestViewModel.cs
// Created By: Jamie Rees
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
// ************************************************************************/
#endregion
namespace Ombi.Core.Models.Requests
{
public class MovieRequestViewModel
{
public int TheMovieDbId { get; set; }
}
}

@ -20,17 +20,17 @@ namespace Ombi.Notifications.Templates
private const string SubjectKey = "{@SUBJECT}"; private const string SubjectKey = "{@SUBJECT}";
private const string BodyKey = "{@BODY}"; private const string BodyKey = "{@BODY}";
private const string ImgSrc = "{@IMGSRC}"; private const string Poster = "{@POSTER}";
private const string DateKey = "{@DATENOW}"; private const string DateKey = "{@DATENOW}";
private const string Logo = "{@LOGO}"; private const string Logo = "{@LOGO}";
public string LoadTemplate(string subject, string body, string img = default(string), string logo = default(string)) public string LoadTemplate(string subject, string body, string imgsrc = default(string), string logo = default(string))
{ {
var sb = new StringBuilder(File.ReadAllText(TemplateLocation)); var sb = new StringBuilder(File.ReadAllText(TemplateLocation));
sb.Replace(SubjectKey, subject); sb.Replace(SubjectKey, subject);
sb.Replace(BodyKey, body); sb.Replace(BodyKey, body);
sb.Replace(DateKey, DateTime.Now.ToString("f")); sb.Replace(DateKey, DateTime.Now.ToString("f"));
sb.Replace(ImgSrc, string.IsNullOrEmpty(img) ? string.Empty : img); sb.Replace(Poster, string.IsNullOrEmpty(imgsrc) ? string.Empty : $"<tr><td align=\"center\"><img src=\"{imgsrc}\" alt=\"Poster\" width=\"400px\" text-align=\"center\"/></td></tr>");
sb.Replace(Logo, string.IsNullOrEmpty(logo) ? "http://i.imgur.com/qQsN78U.png" : logo); sb.Replace(Logo, string.IsNullOrEmpty(logo) ? "http://i.imgur.com/qQsN78U.png" : logo);
return sb.ToString(); return sb.ToString();

@ -144,7 +144,7 @@
<table border="0" cellpadding="0" cellspacing="0" style="border-collapse: separate; mso-table-lspace: 0pt; mso-table-rspace: 0pt; width: 100%;" width="100%"> <table border="0" cellpadding="0" cellspacing="0" style="border-collapse: separate; mso-table-lspace: 0pt; mso-table-rspace: 0pt; width: 100%;" width="100%">
<tr> <tr>
<td align="center"> <td align="center">
<img src="{@LOGO}" alt="Ombi logo" width="400px" text-align="center" /> <img src="{@LOGO}" alt="Ombi logo" width="400px" text-align="center" />
</td> </td>
</tr> </tr>
<tr> <tr>
@ -153,11 +153,7 @@
</td> </td>
</tr> </tr>
<tr> {@POSTER}
<td align="center">
<img src="{@IMGSRC}" alt="Poster" width="400px" text-align="center" />
</td>
</tr>
</table> </table>
</td> </td>
</tr> </tr>

@ -10,6 +10,9 @@ namespace Ombi.Settings.Settings.Models
public string ApplicationName { get; set; } public string ApplicationName { get; set; }
public string ApplicationUrl { get; set; } public string ApplicationUrl { get; set; }
public string CustomCssLink { get; set; } public string CustomCssLink { get; set; }
public bool EnableCustomDonations { get; set; }
public string CustomDonationUrl { get; set; }
public string CustomDonationMessage { get; set; }
public string Logo { get; set; } public string Logo { get; set; }
public string PresetThemeName { get; set; } public string PresetThemeName { get; set; }

@ -52,6 +52,14 @@
<i class="fa fa-heart" style="color:red"></i> {{ 'NavigationBar.Donate' | translate }}</a> <i class="fa fa-heart" style="color:red"></i> {{ 'NavigationBar.Donate' | translate }}</a>
</li> </li>
</ul> </ul>
<div *ngIf="customizationSettings">
<ul *ngIf="customizationSettings.enableCustomDonations" class="nav navbar-nav">
<li>
<a href="{{customizationSettings.customDonationUrl}}" target="_blank">
<i class="fa fa-heart" style="color:yellow"></i> {{ customizationSettings.customDonationMessage ? customizationSettings.customDonationMessage : ('NavigationBar.DonateLibraryMaintainer' | translate) }}</a>
</li>
</ul>
</div>
<ul class="nav navbar-nav navbar-right"> <ul class="nav navbar-nav navbar-right">

@ -111,3 +111,7 @@ export interface IEpisodesRequests {
approved: boolean; approved: boolean;
selected: boolean; // This is for the UI only selected: boolean; // This is for the UI only
} }
export interface IMovieRequestModel {
theMovieDbId: number;
}

@ -97,6 +97,9 @@ export interface ICustomizationSettings extends ISettings {
applicationUrl: string; applicationUrl: string;
logo: string; logo: string;
customCssLink: string; customCssLink: string;
enableCustomDonations: boolean;
customDonationUrl: string;
customDonationMessage: string;
hasPresetTheme: boolean; hasPresetTheme: boolean;
presetThemeName: string; presetThemeName: string;
presetThemeContent: string; presetThemeContent: string;

@ -87,9 +87,6 @@ div.bg {
width: 100%; width: 100%;
margin: 0 auto 10px; margin: 0 auto 10px;
display: block; display: block;
-moz-border-radius: 50%;
-webkit-border-radius: 50%;
border-radius: 50%;
} }
/* /*
* Form styles * Form styles

@ -76,7 +76,7 @@ export class MovieSearchComponent implements OnInit {
} }
try { try {
this.requestService.requestMovie(searchResult) this.requestService.requestMovie({ theMovieDbId: searchResult.id })
.subscribe(x => { .subscribe(x => {
this.result = x; this.result = x;

@ -67,7 +67,7 @@ export class MovieSearchGridComponent implements OnInit {
} }
try { try {
this.requestService.requestMovie(searchResult) this.requestService.requestMovie({ theMovieDbId : searchResult.id})
.subscribe(x => { .subscribe(x => {
this.result = x; this.result = x;

@ -123,10 +123,11 @@
<i class="fa fa-check"></i> Available</button> <i class="fa fa-check"></i> Available</button>
</div> </div>
<br /> <br />
<a *ngIf="node.data.plexUrl && node.data.available" style="text-align: right" class="btn btn-sm btn-success-outline" href="{{node.data.plexUrl}}" <div *ngIf="node.data.plexUrl && node.data.available">
<a style="text-align: right" class="btn btn-sm btn-success-outline" href="{{node.data.plexUrl}}"
target="_blank"> target="_blank">
<i class="fa fa-eye"></i> View On Plex</a> <i class="fa fa-eye"></i> View On Plex</a>
</div>
<div class="dropdown" *ngIf="issueCategories && issuesEnabled"> <div class="dropdown" *ngIf="issueCategories && issuesEnabled">
<button class="btn btn-sm btn-primary-outline dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" <button class="btn btn-sm btn-primary-outline dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true"
aria-expanded="true"> aria-expanded="true">

@ -6,8 +6,7 @@ import { Observable } from "rxjs/Rx";
import { TreeNode } from "primeng/primeng"; import { TreeNode } from "primeng/primeng";
import { IRequestEngineResult } from "../interfaces"; import { IRequestEngineResult } from "../interfaces";
import { IChildRequests, IMovieRequests, IMovieUpdateModel, ITvRequests, ITvUpdateModel } from "../interfaces"; import { IChildRequests, IMovieRequestModel, IMovieRequests, IMovieUpdateModel, ITvRequests, ITvUpdateModel } from "../interfaces";
import { ISearchMovieResult } from "../interfaces";
import { ISearchTvResult } from "../interfaces"; import { ISearchTvResult } from "../interfaces";
import { ServiceHelpers } from "./service.helpers"; import { ServiceHelpers } from "./service.helpers";
@ -17,7 +16,7 @@ export class RequestService extends ServiceHelpers {
super(http, "/api/v1/Request/", platformLocation); super(http, "/api/v1/Request/", platformLocation);
} }
public requestMovie(movie: ISearchMovieResult): Observable<IRequestEngineResult> { public requestMovie(movie: IMovieRequestModel): Observable<IRequestEngineResult> {
return this.http.post<IRequestEngineResult>(`${this.url}Movie/`, JSON.stringify(movie), {headers: this.headers}); return this.http.post<IRequestEngineResult>(`${this.url}Movie/`, JSON.stringify(movie), {headers: this.headers});
} }

@ -43,6 +43,29 @@
</div> </div>
</div> </div>
<div class="form-group">
<div class="checkbox">
<input type="checkbox" id="enableCustomDonations" name="enableCustomDonations" [(ngModel)]="settings.enableCustomDonations">
<label for="enableCustomDonations" tooltipPosition="top" pTooltip="Enable to show a custom donation link in the navigation bar">Enable custom donation link</label>
</div>
</div>
<div class="form-group">
<label for="customDonation" class="control-label">Custom Donation URL</label>
<div>
<input [disabled]="!settings.enableCustomDonations" type="text" [(ngModel)]="settings.customDonationUrl" class="form-control form-control-custom " name="customDonation" value="{{settings.customDonationUrl}}"
tooltipPosition="top" pTooltip="A link to a Paypal address, or your custom donation url.">
</div>
</div>
<div class="form-group">
<label for="customDonationMessage" class="control-label">Donation Button Message</label>
<div>
<input [disabled]="!settings.enableCustomDonations" type="text" [(ngModel)]="settings.customDonationMessage" class="form-control form-control-custom " name="customDonationMessage" value="{{settings.customDonationMessage}}"
tooltipPosition="top" pTooltip="Set a custom message to be displayed in the navigation bar.">
</div>
</div>
<div class="form-group"> <div class="form-group">

@ -11,10 +11,6 @@ $success-colour: #5cb85c;
$i: !important; $i: !important;
@media (min-width: 768px ) { @media (min-width: 768px ) {
.row {
position: relative;
}
.bottom-align-text { .bottom-align-text {
position: absolute; position: absolute;
bottom: 0; bottom: 0;
@ -38,6 +34,10 @@ $i: !important;
} }
} }
.row {
position: relative;
}
.navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a,
.navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:hover,
.navbar-default .navbar-nav > .active > a:focus { .navbar-default .navbar-nav > .active > a:focus {

@ -52,7 +52,7 @@ namespace Ombi.Controllers
/// <param name="movie">The movie.</param> /// <param name="movie">The movie.</param>
/// <returns></returns> /// <returns></returns>
[HttpPost("movie")] [HttpPost("movie")]
public async Task<RequestEngineResult> RequestMovie([FromBody] SearchMovieViewModel movie) public async Task<RequestEngineResult> RequestMovie([FromBody] MovieRequestViewModel movie)
{ {
return await MovieRequestEngine.RequestMovie(movie); return await MovieRequestEngine.RequestMovie(movie);
} }

@ -58,8 +58,10 @@
"German": "Tysk", "German": "Tysk",
"Italian": "Italiensk", "Italian": "Italiensk",
"Danish": "Dansk", "Danish": "Dansk",
"Dutch": "Hollandsk" "Dutch": "Hollandsk",
} "Norwegian": "Norwegian"
},
"OpenMobileApp": "Open Mobile App"
}, },
"Search": { "Search": {
"Title": "Søg", "Title": "Søg",

@ -58,8 +58,10 @@
"German": "Deutsch", "German": "Deutsch",
"Italian": "Italienisch", "Italian": "Italienisch",
"Danish": "Dänisch", "Danish": "Dänisch",
"Dutch": "Niederländisch" "Dutch": "Niederländisch",
} "Norwegian": "Norwegian"
},
"OpenMobileApp": "Open Mobile App"
}, },
"Search": { "Search": {
"Title": "Suche", "Title": "Suche",

@ -47,6 +47,7 @@
"UserManagement": "User Management", "UserManagement": "User Management",
"Issues":"Issues", "Issues":"Issues",
"Donate": "Donate!", "Donate": "Donate!",
"DonateLibraryMaintainer": "Donate to Library Maintainer",
"DonateTooltip": "DonateTooltip":
"This is how I convince my wife to let me spend my spare time developing Ombi ;)", "This is how I convince my wife to let me spend my spare time developing Ombi ;)",
"UpdateAvailableTooltip": "Update Available!", "UpdateAvailableTooltip": "Update Available!",

@ -58,8 +58,10 @@
"German": "Alemán", "German": "Alemán",
"Italian": "Italiano", "Italian": "Italiano",
"Danish": "Danés", "Danish": "Danés",
"Dutch": "Holandés" "Dutch": "Holandés",
} "Norwegian": "Norwegian"
},
"OpenMobileApp": "Open Mobile App"
}, },
"Search": { "Search": {
"Title": "Buscar", "Title": "Buscar",

@ -13,7 +13,7 @@
"ContinueButton": "Continuer", "ContinueButton": "Continuer",
"Available": "Disponible", "Available": "Disponible",
"ProcessingRequest": "En cours de traitement", "ProcessingRequest": "En cours de traitement",
"PendingApproval": "En attente de validation", "PendingApproval": "En attente d'approbation",
"RequestDenied": "Demande refusée", "RequestDenied": "Demande refusée",
"NotRequested": "Non demandé", "NotRequested": "Non demandé",
"Requested": "Demandé", "Requested": "Demandé",
@ -58,22 +58,24 @@
"German": "Allemand", "German": "Allemand",
"Italian": "Italien", "Italian": "Italien",
"Danish": "Danois", "Danish": "Danois",
"Dutch": "Néerlandais" "Dutch": "Néerlandais",
} "Norwegian": "Norvégien"
},
"OpenMobileApp": "Ouvrir l'application mobile"
}, },
"Search": { "Search": {
"Title": "Rechercher", "Title": "Rechercher",
"Paragraph": "Vous voulez regarder quelque chose qui n'est pas disponible actuellement ? Pas de problème, recherchez-le ci-dessous et demandez-le !", "Paragraph": "Vous voulez regarder quelque chose qui n'est pas disponible actuellement ? Pas de problème, recherchez-le ci-dessous et demandez-le !",
"MoviesTab": "Films", "MoviesTab": "Films",
"TvTab": "Séries", "TvTab": "TV",
"Suggestions": "Suggestions", "Suggestions": "Suggestions",
"NoResults": "Désolé, nous n'avons trouvé aucun résultat !", "NoResults": "Désolé, nous n'avons trouvé aucun résultat !",
"ReleaseDate": "Date de sortie", "ReleaseDate": "Date de sortie",
"ViewOnPlex": "Regarder sur Plex", "ViewOnPlex": "Regarder sur Plex",
"RequestAdded": "La demande pour {{title}} a été ajouté avec succès", "RequestAdded": "La demande pour {{title}} a été ajoutée avec succès",
"Movies": { "Movies": {
"PopularMovies": "Films populaires", "PopularMovies": "Films populaires",
"UpcomingMovies": "Films populaires", "UpcomingMovies": "Films à venir",
"TopRatedMovies": "Films les mieux notés", "TopRatedMovies": "Films les mieux notés",
"NowPlayingMovies": "Films à l'affiche", "NowPlayingMovies": "Films à l'affiche",
"HomePage": "Site du film", "HomePage": "Site du film",
@ -84,7 +86,7 @@
"Title": "Demandes", "Title": "Demandes",
"Paragraph": "Vous pouvez voir ci-dessous vos demandes et celles des autres, ainsi que leur statut de téléchargement et d'approbation.", "Paragraph": "Vous pouvez voir ci-dessous vos demandes et celles des autres, ainsi que leur statut de téléchargement et d'approbation.",
"MoviesTab": "Films", "MoviesTab": "Films",
"TvTab": "Séries TV", "TvTab": "Émissions",
"RequestedBy": "Demandé par :", "RequestedBy": "Demandé par :",
"Status": "Statut :", "Status": "Statut :",
"RequestStatus": "Statut de la demande :", "RequestStatus": "Statut de la demande :",
@ -107,7 +109,7 @@
"Issues": { "Issues": {
"Title": "Problèmes", "Title": "Problèmes",
"PendingTitle": "Problèmes en attente", "PendingTitle": "Problèmes en attente",
"InProgressTitle": "Problèmes en cours de traitement", "InProgressTitle": "Problèmes en cours",
"ResolvedTitle": "Problèmes résolus", "ResolvedTitle": "Problèmes résolus",
"ColumnTitle": "Titre", "ColumnTitle": "Titre",
"Category": "Catégorie", "Category": "Catégorie",
@ -116,7 +118,7 @@
"Description": "Description", "Description": "Description",
"NoComments": "Aucun commentaire !", "NoComments": "Aucun commentaire !",
"MarkInProgress": "Marquer en cours de traitement", "MarkInProgress": "Marquer en cours de traitement",
"MarkResolved": "Marquer résolu", "MarkResolved": "Marquer comme résolu",
"SendMessageButton": "Envoyer", "SendMessageButton": "Envoyer",
"Subject": "Sujet", "Subject": "Sujet",
"Comments": "Commentaires", "Comments": "Commentaires",

@ -58,8 +58,10 @@
"German": "Tedesco", "German": "Tedesco",
"Italian": "Italiano", "Italian": "Italiano",
"Danish": "Danese", "Danish": "Danese",
"Dutch": "Olandese" "Dutch": "Olandese",
} "Norwegian": "Norwegian"
},
"OpenMobileApp": "Open Mobile App"
}, },
"Search": { "Search": {
"Title": "Search", "Title": "Search",

@ -58,8 +58,10 @@
"German": "Duits", "German": "Duits",
"Italian": "Italiaans", "Italian": "Italiaans",
"Danish": "Deens", "Danish": "Deens",
"Dutch": "Nederlands" "Dutch": "Nederlands",
} "Norwegian": "Norwegian"
},
"OpenMobileApp": "Open Mobile App"
}, },
"Search": { "Search": {
"Title": "Zoeken", "Title": "Zoeken",

@ -1,126 +1,128 @@
{ {
"Login": { "Login": {
"SignInButton": "Sign in", "SignInButton": "Logg på",
"UsernamePlaceholder": "Username", "UsernamePlaceholder": "Brukernavn",
"PasswordPlaceholder": "Password", "PasswordPlaceholder": "Passord",
"RememberMe": "Remember Me", "RememberMe": "Husk meg",
"ForgottenPassword": "Forgot your password?", "ForgottenPassword": "Glemt passord?",
"Errors": { "Errors": {
"IncorrectCredentials": "Incorrect username or password" "IncorrectCredentials": "Ugyldig brukernavn eller passord"
} }
}, },
"Common": { "Common": {
"ContinueButton": "Continue", "ContinueButton": "Gå videre",
"Available": "Available", "Available": "Tilgjengelig",
"ProcessingRequest": "Processing Request", "ProcessingRequest": "Behandler forespørsel",
"PendingApproval": "Pending Approval", "PendingApproval": "Venter på godkjenning",
"RequestDenied": "Request Denied", "RequestDenied": "Forespørsel avslått",
"NotRequested": "Not Requested", "NotRequested": "Ikke forespurt",
"Requested": "Requested", "Requested": "Forespurt",
"Request": "Request", "Request": "Forespørsel",
"Denied": "Denied", "Denied": "Avslått",
"Approve": "Approve", "Approve": "Godkjenn",
"Errors": { "Errors": {
"Validation": "Please check your entered values" "Validation": "Kontroller de angitte verdiene"
} }
}, },
"PasswordReset": { "PasswordReset": {
"EmailAddressPlaceholder": "Email Address", "EmailAddressPlaceholder": "E-postadresse",
"ResetPasswordButton": "Reset Password" "ResetPasswordButton": "Tilbakestill passord"
}, },
"LandingPage": { "LandingPage": {
"OnlineHeading": "Currently Online", "OnlineHeading": "For øyeblikket online",
"OnlineParagraph": "The media server is currently online", "OnlineParagraph": "Medieserveren er online",
"PartiallyOnlineHeading": "Partially Online", "PartiallyOnlineHeading": "Delvis online",
"PartiallyOnlineParagraph": "The media server is partially online.", "PartiallyOnlineParagraph": "Medieserveren er delvis utilgjengelig.",
"MultipleServersUnavailable": "There are {{serversUnavailable}} servers offline out of {{totalServers}}.", "MultipleServersUnavailable": "Det er {{serversUnavailable}} servere offline av totalt {{totalServers}}.",
"SingleServerUnavailable": "There is {{serversUnavailable}} server offline out of {{totalServers}}.", "SingleServerUnavailable": "Det er {{serversUnavailable}} server offline av totalt {{totalServers}}.",
"OfflineHeading": "Currently Offline", "OfflineHeading": "For øyeblikket offline",
"OfflineParagraph": "The media server is currently offline.", "OfflineParagraph": "Medieserveren er for øyeblikket utilgjengelig.",
"CheckPageForUpdates": "Check this page for continuous site updates." "CheckPageForUpdates": "Sjekk denne siden for kontinuerlige oppdateringer."
}, },
"NavigationBar": { "NavigationBar": {
"Search": "Search", "Search": "Søk",
"Requests": "Requests", "Requests": "Forespørsler",
"UserManagement": "User Management", "UserManagement": "Brukeradministrasjon",
"Issues": "Issues", "Issues": "Mangler",
"Donate": "Donate!", "Donate": "Doner!",
"DonateTooltip": "This is how I convince my wife to let me spend my spare time developing Ombi ;)", "DonateTooltip": "Dette er hvordan jeg overbevise min kone til å la meg bruke min fritid til å utvikle Ombi ;)",
"UpdateAvailableTooltip": "Update Available!", "UpdateAvailableTooltip": "Ny opdatering venter!",
"Settings": "Settings", "Settings": "Innstillinger",
"Welcome": "Welcome {{username}}", "Welcome": "Velkommen {{username}}",
"UpdateDetails": "Update Details", "UpdateDetails": "Oppdater detaljer",
"Logout": "Logout", "Logout": "Logg av",
"Language": { "Language": {
"English": "English", "English": "Engelsk",
"French": "French", "French": "Fransk",
"Spanish": "Spanish", "Spanish": "Spansk",
"German": "German", "German": "Tysk",
"Italian": "Italian", "Italian": "Italiensk",
"Danish": "Danish", "Danish": "Dansk",
"Dutch": "Dutch" "Dutch": "Nederlandsk",
} "Norwegian": "Norsk"
},
"OpenMobileApp": "Åpne mobilapp"
}, },
"Search": { "Search": {
"Title": "Search", "Title": "Søk",
"Paragraph": "Want to watch something that is not currently available? No problem, just search for it below and request it!", "Paragraph": "Vil du se noe som foreløpig ikke er tilgjengelig? Ikke noe problem, bare søk etter det nedenfor og be om det!",
"MoviesTab": "Movies", "MoviesTab": "Filmer",
"TvTab": "TV Shows", "TvTab": "TV serier",
"Suggestions": "Suggestions", "Suggestions": "Forslag",
"NoResults": "Sorry, we didn't find any results!", "NoResults": "Beklager, vi fant ingen resultater!",
"ReleaseDate": "Release Date", "ReleaseDate": "Utgivelsesdato",
"ViewOnPlex": "View On Plex", "ViewOnPlex": "Spill av på Plex",
"RequestAdded": "Request for {{title}} has been added successfully", "RequestAdded": "Forespørsel om {{title}} er lagt til",
"Movies": { "Movies": {
"PopularMovies": "Popular Movies", "PopularMovies": "Populære filmer",
"UpcomingMovies": "Upcoming Movies", "UpcomingMovies": "Kommende filmer",
"TopRatedMovies": "Top Rated Movies", "TopRatedMovies": "Kritikerroste filmer",
"NowPlayingMovies": "Now Playing Movies", "NowPlayingMovies": "Aktuelle Filmer",
"HomePage": "Home Page", "HomePage": "Startside",
"Trailer": "Trailer" "Trailer": "Trailer"
} }
}, },
"Requests": { "Requests": {
"Title": "Requests", "Title": "Forespørsler",
"Paragraph": "Below you can see yours and all other requests, as well as their download and approval status.", "Paragraph": "Nedenfor kan du se dine og alle andres forespørsler, du ser også status for nedlasting og godkjenning.",
"MoviesTab": "Movies", "MoviesTab": "Filmer",
"TvTab": "TV Shows", "TvTab": "TV serier",
"RequestedBy": "Requested By:", "RequestedBy": "Etterspurt av:",
"Status": "Status:", "Status": "Status:",
"RequestStatus": "Request status:", "RequestStatus": "Status for forespørsel:",
"Denied": " Denied:", "Denied": " Avslått:",
"ReleaseDate": "Release Date:", "ReleaseDate": "Utgivelsesdato:",
"RequestDate": "Request Date:", "RequestDate": "Dato for forespørsel:",
"QualityOverride": "Quality Override:", "QualityOverride": "Overstyr kvalitet:",
"RootFolderOverride": "Root Folder Override:", "RootFolderOverride": "Overstyring av rotmappe:",
"ChangeRootFolder": "Change Root Folder", "ChangeRootFolder": "Endre rotmappe",
"ChangeQualityProfile": "Change Quality Profile", "ChangeQualityProfile": "Endre kvalitetsprofil",
"MarkUnavailable": "Mark Unavailable", "MarkUnavailable": "Merk utilgjengelig",
"MarkAvailable": "Mark Available", "MarkAvailable": "Merk tilgjengelig",
"Remove": "Remove", "Remove": "Fjern",
"Deny": "Deny", "Deny": "Avslå",
"Season": "Season:", "Season": "Sesong:",
"GridTitle": "Title", "GridTitle": "Tittel",
"AirDate": "AirDate", "AirDate": "Sendedato",
"GridStatus": "Status" "GridStatus": "Status"
}, },
"Issues": { "Issues": {
"Title": "Issues", "Title": "Mangler",
"PendingTitle": "Pending Issues", "PendingTitle": "Ventende løsninger",
"InProgressTitle": "In Progress Issues", "InProgressTitle": "Mangler under behandling",
"ResolvedTitle": "Resolved Issues", "ResolvedTitle": "Løste mangler",
"ColumnTitle": "Title", "ColumnTitle": "Tittel",
"Category": "Category", "Category": "Kategori",
"Status": "Status", "Status": "Status",
"Details": "Details", "Details": "Detaljer",
"Description": "Description", "Description": "Beskrivelse",
"NoComments": "No Comments!", "NoComments": "Ingen kommentarer!",
"MarkInProgress": "Mark In Progress", "MarkInProgress": "Marker som pågår",
"MarkResolved": "Mark Resolved", "MarkResolved": "Marker som løst",
"SendMessageButton": "Send", "SendMessageButton": "Send",
"Subject": "Subject", "Subject": "Emne",
"Comments": "Comments", "Comments": "Kommentarer",
"WriteMessagePlaceholder": "Write your message here...", "WriteMessagePlaceholder": "Skriv meldingen din her...",
"ReportedBy": "Reported By" "ReportedBy": "Rapportert av"
} }
} }

@ -58,8 +58,10 @@
"German": "Tyska", "German": "Tyska",
"Italian": "Italienska", "Italian": "Italienska",
"Danish": "Danska", "Danish": "Danska",
"Dutch": "Holländska" "Dutch": "Holländska",
} "Norwegian": "Norwegian"
},
"OpenMobileApp": "Open Mobile App"
}, },
"Search": { "Search": {
"Title": "Sök", "Title": "Sök",

Loading…
Cancel
Save