Skip to content

Commit

Permalink
fix(translations): 🌐 Localization - Ensuring all of the app including…
Browse files Browse the repository at this point in the history
… backend are localized Ombi-app#4366

* Localize TV and movies titles in requests

* Add missing release statuses

* Localize collection request

* Localize TV shows in newsletter

Uses TMDB instead of TVMaze for title, genres and synopsis

* Localize error messages

* Localize albums requests

* Use current language for TV and movies requests

* Remove unecessary console log
  • Loading branch information
sephrat committed Nov 2, 2021
1 parent d8d1091 commit 5e140ab
Show file tree
Hide file tree
Showing 28 changed files with 205 additions and 137 deletions.
9 changes: 6 additions & 3 deletions src/Ombi.Core/Engine/MovieRequestEngine.cs
Original file line number Diff line number Diff line change
Expand Up @@ -120,11 +120,13 @@ public async Task<RequestEngineResult> RequestMovie(MovieRequestViewModel model)
?.FirstOrDefault(x => x.Type == ReleaseDateType.Digital)?.ReleaseDate;

var ruleResults = (await RunRequestRules(requestModel)).ToList();
if (ruleResults.Any(x => !x.Success))
var ruleResultInError = ruleResults.Find(x => !x.Success);
if (ruleResultInError != null)
{
return new RequestEngineResult
{
ErrorMessage = ruleResults.FirstOrDefault(x => x.Message.HasValue()).Message
ErrorMessage = ruleResultInError.Message,
ErrorCode = ruleResultInError.ErrorCode
};
}

Expand Down Expand Up @@ -573,7 +575,8 @@ public async Task<RequestEngineResult> RequestCollection(int collectionId, Cance
{
results.Add(await RequestMovie(new MovieRequestViewModel
{
TheMovieDbId = collection.id
TheMovieDbId = collection.id,
LanguageCode = langCode
}));
}

Expand Down
22 changes: 21 additions & 1 deletion src/Ombi.Core/Engine/RequestEngineResult.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,31 @@
namespace Ombi.Core.Engine
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;

namespace Ombi.Core.Engine
{
public class RequestEngineResult
{
public bool Result { get; set; }
public string Message { get; set; }
public bool IsError => !string.IsNullOrEmpty(ErrorMessage);
public string ErrorMessage { get; set; }
public ErrorCode? ErrorCode { get; set; }
public int RequestId { get; set; }
}

[JsonConverter(typeof(StringEnumConverter))]
public enum ErrorCode {
AlreadyRequested,
EpisodesAlreadyRequested,
NoPermissionsOnBehalf,
NoPermissions,
RequestDoesNotExist,
ChildRequestDoesNotExist,
NoPermissionsRequestMovie,
NoPermissionsRequestTV,
NoPermissionsRequestAlbum,
MovieRequestQuotaExceeded,
TvRequestQuotaExceeded,
AlbumRequestQuotaExceeded,
}
}
12 changes: 11 additions & 1 deletion src/Ombi.Core/Engine/TvRequestEngine.cs
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,7 @@ public async Task<RequestEngineResult> RequestTvShow(TvRequestViewModel tv)
return new RequestEngineResult
{
Result = false,
ErrorCode = ErrorCode.AlreadyRequested,
ErrorMessage = "This has already been requested"
};
}
Expand All @@ -166,6 +167,7 @@ public async Task<RequestEngineResult> RequestTvShow(TvRequestViewModelV2 tv)
return new RequestEngineResult
{
Result = false,
ErrorCode = ErrorCode.NoPermissionsOnBehalf,
Message = "You do not have the correct permissions to request on behalf of users!",
ErrorMessage = $"You do not have the correct permissions to request on behalf of users!"
};
Expand All @@ -176,14 +178,15 @@ public async Task<RequestEngineResult> RequestTvShow(TvRequestViewModelV2 tv)
return new RequestEngineResult
{
Result = false,
ErrorCode = ErrorCode.NoPermissions,
Message = "You do not have the correct permissions!",
ErrorMessage = $"You do not have the correct permissions!"
};
}

var tvBuilder = new TvShowRequestBuilderV2(MovieDbApi);
(await tvBuilder
.GetShowInfo(tv.TheMovieDbId))
.GetShowInfo(tv.TheMovieDbId, tv.languageCode))
.CreateTvList(tv)
.CreateChild(tv, canRequestOnBehalf ? tv.RequestOnBehalf : user.Id);

Expand Down Expand Up @@ -250,6 +253,7 @@ public async Task<RequestEngineResult> RequestTvShow(TvRequestViewModelV2 tv)
return new RequestEngineResult
{
Result = false,
ErrorCode = ErrorCode.AlreadyRequested,
ErrorMessage = "This has already been requested"
};
}
Expand Down Expand Up @@ -685,6 +689,7 @@ public async Task<RequestEngineResult> ApproveChildRequest(int id)
{
return new RequestEngineResult
{
ErrorCode = ErrorCode.ChildRequestDoesNotExist,
ErrorMessage = "Child Request does not exist"
};
}
Expand Down Expand Up @@ -722,6 +727,7 @@ public async Task<RequestEngineResult> DenyChildRequest(int requestId, string re
{
return new RequestEngineResult
{
ErrorCode = ErrorCode.ChildRequestDoesNotExist,
ErrorMessage = "Child Request does not exist"
};
}
Expand Down Expand Up @@ -781,6 +787,7 @@ public async Task<RequestEngineResult> MarkUnavailable(int modelId)
{
return new RequestEngineResult
{
ErrorCode = ErrorCode.ChildRequestDoesNotExist,
ErrorMessage = "Child Request does not exist"
};
}
Expand Down Expand Up @@ -808,6 +815,7 @@ public async Task<RequestEngineResult> MarkAvailable(int modelId)
{
return new RequestEngineResult
{
ErrorCode = ErrorCode.ChildRequestDoesNotExist,
ErrorMessage = "Child Request does not exist"
};
}
Expand Down Expand Up @@ -905,6 +913,7 @@ public async Task<RequestEngineResult> ReProcessRequest(int requestId, Cancellat
return new RequestEngineResult
{
Result = false,
ErrorCode = ErrorCode.RequestDoesNotExist,
ErrorMessage = "Request does not exist"
};
}
Expand Down Expand Up @@ -965,6 +974,7 @@ public async Task<RequestEngineResult> UpdateAdvancedOptions(MediaAdvancedOption
return new RequestEngineResult
{
Result = false,
ErrorCode = ErrorCode.RequestDoesNotExist,
ErrorMessage = "Request does not exist"
};
}
Expand Down
4 changes: 2 additions & 2 deletions src/Ombi.Core/Helpers/TvShowRequestBuilderV2.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,9 @@ public TvShowRequestBuilderV2(IMovieDbApi movApi)
public TvRequests NewRequest { get; protected set; }
protected TvInfo TheMovieDbRecord { get; set; }

public async Task<TvShowRequestBuilderV2> GetShowInfo(int id)
public async Task<TvShowRequestBuilderV2> GetShowInfo(int id, string langCode = "en")
{
TheMovieDbRecord = await MovieDbApi.GetTVInfo(id.ToString());
TheMovieDbRecord = await MovieDbApi.GetTVInfo(id.ToString(), langCode);

// Remove 'Specials Season'
var firstSeason = TheMovieDbRecord.seasons.OrderBy(x => x.season_number).FirstOrDefault();
Expand Down
1 change: 1 addition & 0 deletions src/Ombi.Core/Models/Requests/TvRequestViewModelV2.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,6 @@ namespace Ombi.Core.Models.Requests
public class TvRequestViewModelV2 : TvRequestViewModelBase
{
public int TheMovieDbId { get; set; }
public string languageCode { get; set; } = "en";
}
}
7 changes: 4 additions & 3 deletions src/Ombi.Core/Rule/BaseRequestRule.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
namespace Ombi.Core.Rule
using Ombi.Core.Engine;
namespace Ombi.Core.Rule
{
public abstract class BaseRequestRule
{
Expand All @@ -7,9 +8,9 @@ public RuleResult Success()
return new RuleResult {Success = true};
}

public RuleResult Fail(string message)
public RuleResult Fail(ErrorCode errorCode, string message = "")
{
return new RuleResult { Message = message };
return new RuleResult { ErrorCode = errorCode, Message = message };
}
}
}
4 changes: 3 additions & 1 deletion src/Ombi.Core/Rule/RuleResult.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
namespace Ombi.Core.Rule
using Ombi.Core.Engine;
namespace Ombi.Core.Rule
{
public class RuleResult
{
public bool Success { get; set; }
public string Message { get; set; }
public ErrorCode ErrorCode { get; set; }
}
}
7 changes: 4 additions & 3 deletions src/Ombi.Core/Rule/Rules/Request/CanRequestRule.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Ombi.Core.Authentication;
using Ombi.Core.Engine;
using Ombi.Core.Rule.Interfaces;
using Ombi.Helpers;
using Ombi.Store.Entities.Requests;
Expand Down Expand Up @@ -34,7 +35,7 @@ public async Task<RuleResult> Execute(BaseRequest obj)
{
if (await _manager.IsInRoleAsync(user, OmbiRoles.RequestMovie) || await _manager.IsInRoleAsync(user, OmbiRoles.AutoApproveMovie))
return Success();
return Fail("You do not have permissions to Request a Movie");
return Fail(ErrorCode.NoPermissionsRequestMovie, "You do not have permissions to Request a Movie");
}

if (obj.RequestType == RequestType.TvShow)
Expand All @@ -44,7 +45,7 @@ public async Task<RuleResult> Execute(BaseRequest obj)
return Success();
}

return Fail("You do not have permissions to Request a TV Show");
return Fail(ErrorCode.NoPermissionsRequestTV, "You do not have permissions to Request a TV Show");
}

if (obj.RequestType == RequestType.Album)
Expand All @@ -54,7 +55,7 @@ public async Task<RuleResult> Execute(BaseRequest obj)
return Success();
}

return Fail("You do not have permissions to Request an Album");
return Fail(ErrorCode.NoPermissionsRequestAlbum, "You do not have permissions to Request an Album");
}

throw new InvalidDataException("Permission check failed: unknown RequestType");
Expand Down
3 changes: 2 additions & 1 deletion src/Ombi.Core/Rule/Rules/Request/ExistingMovieRequestRule.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using Ombi.Store.Entities;
using Ombi.Store.Entities.Requests;
using Ombi.Store.Repository;
using Ombi.Core.Engine;
using Ombi.Store.Repository.Requests;

namespace Ombi.Core.Rule.Rules.Request
Expand Down Expand Up @@ -49,7 +50,7 @@ public async Task<RuleResult> Execute(BaseRequest obj)
}
if(found)
{
return Fail($"\"{obj.Title}\" has already been requested");
return Fail(ErrorCode.AlreadyRequested, $"\"{obj.Title}\" has already been requested");
}
}
return Success();
Expand Down
3 changes: 2 additions & 1 deletion src/Ombi.Core/Rule/Rules/Request/ExistingPlexRequestRule.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Ombi.Core.Engine;
using Ombi.Core.Rule.Interfaces;
using Ombi.Store.Entities;
using Ombi.Store.Entities.Requests;
Expand Down Expand Up @@ -87,7 +88,7 @@ private RuleResult CheckExistingContent(ChildRequests child, PlexServerContent c

if (!anyEpisodes)
{
return Fail($"We already have episodes requested from series {child.Title}");
return Fail(ErrorCode.EpisodesAlreadyRequested, $"We already have episodes requested from series {child.Title}");
}

return Success();
Expand Down
3 changes: 2 additions & 1 deletion src/Ombi.Core/Rule/Rules/Request/ExistingTVRequestRule.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Ombi.Core.Rule.Interfaces;
using Ombi.Core.Engine;
using Ombi.Store.Entities;
using Ombi.Store.Entities.Requests;
using Ombi.Store.Repository.Requests;
Expand Down Expand Up @@ -63,7 +64,7 @@ public async Task<RuleResult> Execute(BaseRequest obj)

if (!anyEpisodes)
{
return Fail($"We already have episodes requested from series {tv.Title}");
return Fail(ErrorCode.EpisodesAlreadyRequested, $"We already have episodes requested from series {tv.Title}");
}

}
Expand Down
6 changes: 3 additions & 3 deletions src/Ombi.Core/Rule/Rules/Request/RequestLimitRule.cs
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ public async Task<RuleResult> Execute(BaseRequest obj)

if (remainingLimitsModel.Remaining < 1)
{
return Fail("You have exceeded your Movie request quota!");
return Fail(Engine.ErrorCode.MovieRequestQuotaExceeded, "You have exceeded your Movie request quota!");
}
}
if (obj.RequestType == RequestType.TvShow)
Expand All @@ -75,7 +75,7 @@ public async Task<RuleResult> Execute(BaseRequest obj)

if ((remainingLimitsModel.Remaining - requestCount) < 0)
{
return Fail("You have exceeded your Episode request quota!");
return Fail(Engine.ErrorCode.TvRequestQuotaExceeded, "You have exceeded your Episode request quota!");
}
}
if (obj.RequestType == RequestType.Album)
Expand All @@ -88,7 +88,7 @@ public async Task<RuleResult> Execute(BaseRequest obj)

if (remainingLimitsModel.Remaining < 1)
{
return Fail("You have exceeded your Album request quota!");
return Fail(Engine.ErrorCode.AlbumRequestQuotaExceeded, "You have exceeded your Album request quota!");
}
}
return Success();
Expand Down
3 changes: 2 additions & 1 deletion src/Ombi.Core/Rule/Rules/SonarrCacheRule.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Ombi.Core.Engine;
using Ombi.Core.Models.Search;
using Ombi.Helpers;
using Ombi.Store.Context;
Expand Down Expand Up @@ -56,7 +57,7 @@ public async Task<RuleResult> Execute(BaseRequest obj)

if (!anyEpisodes)
{
return new RuleResult { Message = $"We already have episodes requested from series {vm.Title}" };
return new RuleResult { ErrorCode = ErrorCode.EpisodesAlreadyRequested, Message = $"We already have episodes requested from series {vm.Title}" };
}
}
}
Expand Down
7 changes: 4 additions & 3 deletions src/Ombi.Core/Rule/SpecificRule.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Ombi.Core.Rule.Interfaces;
using Ombi.Core.Engine;
using Ombi.Core.Rule.Interfaces;

namespace Ombi.Core.Rule
{
Expand All @@ -9,9 +10,9 @@ public RuleResult Success()
return new RuleResult { Success = true };
}

public RuleResult Fail(string message)
public RuleResult Fail(ErrorCode errorCode, string message = "")
{
return new RuleResult { Message = message };
return new RuleResult { ErrorCode = errorCode, Message = message };
}

public abstract SpecificRules Rule { get; }
Expand Down
Loading

0 comments on commit 5e140ab

Please sign in to comment.