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.Threading.Tasks;
using Ombi.Core.Models.Requests;
using Ombi.Core.Models.Search;
using Ombi.Store.Entities;
using Ombi.Store.Entities.Requests;
namespace Ombi.Core.Engine.Interfaces
{
public interface IMovieRequestEngine : IRequestEngine<MovieRequests>
{
Task<RequestEngineResult> RequestMovie(SearchMovieViewModel model);
Task<RequestEngineResult> RequestMovie(MovieRequestViewModel model);
Task<IEnumerable<MovieRequests>> SearchMovieRequest(string search);

@ -43,16 +43,16 @@ namespace Ombi.Core.Engine
/// </summary>
/// <param name="model">The model.</param>
/// <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)
{
return new RequestEngineResult
{
Result = false,
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 =

@ -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 BodyKey = "{@BODY}";
private const string ImgSrc = "{@IMGSRC}";
private const string Poster = "{@POSTER}";
private const string DateKey = "{@DATENOW}";
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));
sb.Replace(SubjectKey, subject);
sb.Replace(BodyKey, body);
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);
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%">
<tr>
<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>
</tr>
<tr>
@ -153,11 +153,7 @@
</td>
</tr>
<tr>
<td align="center">
<img src="{@IMGSRC}" alt="Poster" width="400px" text-align="center" />
</td>
</tr>
{@POSTER}
</table>
</td>
</tr>

@ -10,6 +10,9 @@ namespace Ombi.Settings.Settings.Models
public string ApplicationName { get; set; }
public string ApplicationUrl { 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 PresetThemeName { get; set; }

@ -52,6 +52,14 @@
<i class="fa fa-heart" style="color:red"></i> {{ 'NavigationBar.Donate' | translate }}</a>
</li>
</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">

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

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

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

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

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

@ -123,10 +123,11 @@
<i class="fa fa-check"></i> Available</button>
</div>
<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">
<i class="fa fa-eye"></i> View On Plex</a>
</div>
<div class="dropdown" *ngIf="issueCategories && issuesEnabled">
<button class="btn btn-sm btn-primary-outline dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true"
aria-expanded="true">

@ -6,8 +6,7 @@ import { Observable } from "rxjs/Rx";
import { TreeNode } from "primeng/primeng";
import { IRequestEngineResult } from "../interfaces";
import { IChildRequests, IMovieRequests, IMovieUpdateModel, ITvRequests, ITvUpdateModel } from "../interfaces";
import { ISearchMovieResult } from "../interfaces";
import { IChildRequests, IMovieRequestModel, IMovieRequests, IMovieUpdateModel, ITvRequests, ITvUpdateModel } from "../interfaces";
import { ISearchTvResult } from "../interfaces";
import { ServiceHelpers } from "./service.helpers";
@ -17,7 +16,7 @@ export class RequestService extends ServiceHelpers {
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});
}

@ -43,6 +43,29 @@
</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">

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

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

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

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

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

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

@ -13,7 +13,7 @@
"ContinueButton": "Continuer",
"Available": "Disponible",
"ProcessingRequest": "En cours de traitement",
"PendingApproval": "En attente de validation",
"PendingApproval": "En attente d'approbation",
"RequestDenied": "Demande refusée",
"NotRequested": "Non demandé",
"Requested": "Demandé",
@ -58,22 +58,24 @@
"German": "Allemand",
"Italian": "Italien",
"Danish": "Danois",
"Dutch": "Néerlandais"
}
"Dutch": "Néerlandais",
"Norwegian": "Norvégien"
},
"OpenMobileApp": "Ouvrir l'application mobile"
},
"Search": {
"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 !",
"MoviesTab": "Films",
"TvTab": "Séries",
"TvTab": "TV",
"Suggestions": "Suggestions",
"NoResults": "Désolé, nous n'avons trouvé aucun résultat !",
"ReleaseDate": "Date de sortie",
"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": {
"PopularMovies": "Films populaires",
"UpcomingMovies": "Films populaires",
"UpcomingMovies": "Films à venir",
"TopRatedMovies": "Films les mieux notés",
"NowPlayingMovies": "Films à l'affiche",
"HomePage": "Site du film",
@ -84,7 +86,7 @@
"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.",
"MoviesTab": "Films",
"TvTab": "Séries TV",
"TvTab": "Émissions",
"RequestedBy": "Demandé par :",
"Status": "Statut :",
"RequestStatus": "Statut de la demande :",
@ -107,7 +109,7 @@
"Issues": {
"Title": "Problèmes",
"PendingTitle": "Problèmes en attente",
"InProgressTitle": "Problèmes en cours de traitement",
"InProgressTitle": "Problèmes en cours",
"ResolvedTitle": "Problèmes résolus",
"ColumnTitle": "Titre",
"Category": "Catégorie",
@ -116,7 +118,7 @@
"Description": "Description",
"NoComments": "Aucun commentaire !",
"MarkInProgress": "Marquer en cours de traitement",
"MarkResolved": "Marquer résolu",
"MarkResolved": "Marquer comme résolu",
"SendMessageButton": "Envoyer",
"Subject": "Sujet",
"Comments": "Commentaires",

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

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

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

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

Loading…
Cancel
Save