From 7f01de5b1c6b33debe54015c5b7781c052ae9b48 Mon Sep 17 00:00:00 2001 From: Ramazan Yilmaz Date: Sat, 13 Jul 2024 16:24:16 +0200 Subject: [PATCH 01/14] Add localization --- src/BulkRename/Program.cs | 32 ++++ src/BulkRename/Resources/SharedResource.resx | 147 ++++++++++++++++++ src/BulkRename/SharedResource.cs | 6 + src/BulkRename/Views/History/Index.cshtml | 16 +- src/BulkRename/Views/Home/Index.cshtml | 12 +- src/BulkRename/Views/Series/Index.cshtml | 8 +- src/BulkRename/Views/Series/Rename.cshtml | 10 +- .../DisplayTemplates/SeriesTable.cshtml | 10 +- 8 files changed, 223 insertions(+), 18 deletions(-) create mode 100644 src/BulkRename/Resources/SharedResource.resx create mode 100644 src/BulkRename/SharedResource.cs diff --git a/src/BulkRename/Program.cs b/src/BulkRename/Program.cs index a424310..fcf1dda 100644 --- a/src/BulkRename/Program.cs +++ b/src/BulkRename/Program.cs @@ -1,5 +1,8 @@ using BulkRename; +using Microsoft.AspNetCore.Localization; using Serilog; +using System.Globalization; +using System.Reflection; var builder = WebApplication.CreateBuilder(args); builder.Host.UseSerilog(); @@ -10,8 +13,37 @@ // Add services to the container. builder.Services.AddControllersWithViews(); +builder.Services.AddLocalization(options => +{ + options.ResourcesPath = "Resources"; +}); +const string defaultCulture = "en"; + +var supportedCultures = new[] +{ + new CultureInfo(defaultCulture) +}; + +builder.Services.Configure(options => { + options.DefaultRequestCulture = new RequestCulture(defaultCulture); + options.SupportedCultures = supportedCultures; + options.SupportedUICultures = supportedCultures; +}); + +builder.Services.AddRazorPages().AddDataAnnotationsLocalization(options => +{ + options.DataAnnotationLocalizerProvider = (type, factory) => + { + var assemblyName = new AssemblyName(typeof(SharedResource).GetTypeInfo().Assembly.FullName); + + return factory.Create("SharedResource", assemblyName.Name); + }; +}); + var app = builder.Build(); +app.UseRequestLocalization(); + // Configure the HTTP request pipeline. if (!app.Environment.IsDevelopment()) { diff --git a/src/BulkRename/Resources/SharedResource.resx b/src/BulkRename/Resources/SharedResource.resx new file mode 100644 index 0000000..03a23b8 --- /dev/null +++ b/src/BulkRename/Resources/SharedResource.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + History + + + Home + + + Load History + + + New Name + + + Old Name + + + Preview Renaming of TV-Shows + + + Series + + + Successfully renamed files + + + Welcome to BulkRename + + \ No newline at end of file diff --git a/src/BulkRename/SharedResource.cs b/src/BulkRename/SharedResource.cs new file mode 100644 index 0000000..b6976ef --- /dev/null +++ b/src/BulkRename/SharedResource.cs @@ -0,0 +1,6 @@ +namespace BulkRename +{ + public class SharedResource + { + } +} \ No newline at end of file diff --git a/src/BulkRename/Views/History/Index.cshtml b/src/BulkRename/Views/History/Index.cshtml index f91e5db..186303f 100644 --- a/src/BulkRename/Views/History/Index.cshtml +++ b/src/BulkRename/Views/History/Index.cshtml @@ -1,24 +1,28 @@ -@{ - ViewData["Title"] = "History"; -} +@using Microsoft.Extensions.Localization + +@inject IStringLocalizer SharedLocalizer @model Dictionary> +@{ + ViewData["Title"] = "History"; +} + - History + @SharedLocalizer["History"] - Series + @SharedLocalizer["Series"]
diff --git a/src/BulkRename/Views/Home/Index.cshtml b/src/BulkRename/Views/Home/Index.cshtml index 5909cca..d02d8e0 100644 --- a/src/BulkRename/Views/Home/Index.cshtml +++ b/src/BulkRename/Views/Home/Index.cshtml @@ -1,13 +1,17 @@ -@{ +@using Microsoft.Extensions.Localization + +@inject IStringLocalizer SharedLocalizer + +@{ ViewData["Title"] = "Home"; } - Home + @SharedLocalizer["Home"]
-

Welcome to BulkRename

- Preview Renaming of TV-Shows +

@SharedLocalizer["WelcomeToBulkRename"]

+ @SharedLocalizer["PreviewRenamingOfTvShows"]
\ No newline at end of file diff --git a/src/BulkRename/Views/Series/Index.cshtml b/src/BulkRename/Views/Series/Index.cshtml index ebb1433..a7c72a6 100644 --- a/src/BulkRename/Views/Series/Index.cshtml +++ b/src/BulkRename/Views/Series/Index.cshtml @@ -1,4 +1,8 @@ -@{ +@using Microsoft.Extensions.Localization + +@inject IStringLocalizer SharedLocalizer + +@{ ViewData["Title"] = "Series"; } @@ -8,7 +12,7 @@ - Series + @SharedLocalizer["Series"] diff --git a/src/BulkRename/Views/Series/Rename.cshtml b/src/BulkRename/Views/Series/Rename.cshtml index a95082e..eb0cd22 100644 --- a/src/BulkRename/Views/Series/Rename.cshtml +++ b/src/BulkRename/Views/Series/Rename.cshtml @@ -1,4 +1,8 @@ -@{ +@using Microsoft.Extensions.Localization + +@inject IStringLocalizer SharedLocalizer + +@{ ViewData["Title"] = "Series"; } @@ -8,10 +12,10 @@ - Series + @SharedLocalizer["Series"] -

Successfully renamed files

+

@SharedLocalizer["SuccessfullyRenamedFiles"]

@Html.DisplayFor(model => model, "SeriesTable") \ No newline at end of file diff --git a/src/BulkRename/Views/Shared/DisplayTemplates/SeriesTable.cshtml b/src/BulkRename/Views/Shared/DisplayTemplates/SeriesTable.cshtml index bcb86cd..3106b0d 100644 --- a/src/BulkRename/Views/Shared/DisplayTemplates/SeriesTable.cshtml +++ b/src/BulkRename/Views/Shared/DisplayTemplates/SeriesTable.cshtml @@ -1,4 +1,8 @@ -@model Dictionary> +@using Microsoft.Extensions.Localization + +@inject IStringLocalizer SharedLocalizer + +@model Dictionary> @foreach (var s in Model) { @@ -6,8 +10,8 @@ - - + + @foreach (var ser in s.Value) { From 7d9f1fd701e485fda86ba7dcc115e2a6a1f95904 Mon Sep 17 00:00:00 2001 From: Ramazan Yilmaz Date: Sat, 13 Jul 2024 16:27:00 +0200 Subject: [PATCH 02/14] Use localization for title --- src/BulkRename/Views/History/Index.cshtml | 2 +- src/BulkRename/Views/Home/Index.cshtml | 2 +- src/BulkRename/Views/Series/Index.cshtml | 2 +- src/BulkRename/Views/Series/Rename.cshtml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/BulkRename/Views/History/Index.cshtml b/src/BulkRename/Views/History/Index.cshtml index 186303f..a92d4de 100644 --- a/src/BulkRename/Views/History/Index.cshtml +++ b/src/BulkRename/Views/History/Index.cshtml @@ -5,7 +5,7 @@ @model Dictionary> @{ - ViewData["Title"] = "History"; + ViewData["Title"] = SharedLocalizer["History"]; } diff --git a/src/BulkRename/Views/Home/Index.cshtml b/src/BulkRename/Views/Home/Index.cshtml index d02d8e0..74e4410 100644 --- a/src/BulkRename/Views/Home/Index.cshtml +++ b/src/BulkRename/Views/Home/Index.cshtml @@ -3,7 +3,7 @@ @inject IStringLocalizer SharedLocalizer @{ - ViewData["Title"] = "Home"; + ViewData["Title"] = @SharedLocalizer["Home"]; } diff --git a/src/BulkRename/Views/Series/Index.cshtml b/src/BulkRename/Views/Series/Index.cshtml index a7c72a6..331068a 100644 --- a/src/BulkRename/Views/Series/Index.cshtml +++ b/src/BulkRename/Views/Series/Index.cshtml @@ -3,7 +3,7 @@ @inject IStringLocalizer SharedLocalizer @{ - ViewData["Title"] = "Series"; + ViewData["Title"] = @SharedLocalizer["Series"]; } @model Dictionary> diff --git a/src/BulkRename/Views/Series/Rename.cshtml b/src/BulkRename/Views/Series/Rename.cshtml index eb0cd22..6d881db 100644 --- a/src/BulkRename/Views/Series/Rename.cshtml +++ b/src/BulkRename/Views/Series/Rename.cshtml @@ -3,7 +3,7 @@ @inject IStringLocalizer SharedLocalizer @{ - ViewData["Title"] = "Series"; + ViewData["Title"] = @SharedLocalizer["Series"]; } @model Dictionary> From c1d915b7090ccf667649b913c90aaeb164bcbfc1 Mon Sep 17 00:00:00 2001 From: Ramazan Yilmaz Date: Sat, 13 Jul 2024 16:34:33 +0200 Subject: [PATCH 03/14] Use localization for layout --- src/BulkRename/Views/Shared/_Layout.cshtml | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/BulkRename/Views/Shared/_Layout.cshtml b/src/BulkRename/Views/Shared/_Layout.cshtml index 104b551..0f03902 100644 --- a/src/BulkRename/Views/Shared/_Layout.cshtml +++ b/src/BulkRename/Views/Shared/_Layout.cshtml @@ -1,4 +1,8 @@ - +@using Microsoft.Extensions.Localization + +@inject IStringLocalizer SharedLocalizer + + @await Html.PartialAsync("_Favicons") @@ -21,13 +25,13 @@ @@ -42,7 +46,7 @@ From 7337f230682fecea177bb53cdeac1f7bc915f2f4 Mon Sep 17 00:00:00 2001 From: Ramazan Yilmaz Date: Sat, 13 Jul 2024 16:50:50 +0200 Subject: [PATCH 04/14] Add localization to error page --- src/BulkRename/Program.cs | 4 +++- src/BulkRename/Resources/SharedResource.resx | 18 +++++++++++++++ src/BulkRename/Views/Shared/Error.cshtml | 24 ++++++++++++-------- 3 files changed, 35 insertions(+), 11 deletions(-) diff --git a/src/BulkRename/Program.cs b/src/BulkRename/Program.cs index fcf1dda..288e008 100644 --- a/src/BulkRename/Program.cs +++ b/src/BulkRename/Program.cs @@ -1,5 +1,6 @@ using BulkRename; using Microsoft.AspNetCore.Localization; +using Microsoft.AspNetCore.Mvc.Razor; using Serilog; using System.Globalization; using System.Reflection; @@ -11,7 +12,8 @@ startup.ConfigureServices(builder.Services); // Add services to the container. -builder.Services.AddControllersWithViews(); +builder.Services.AddControllersWithViews() + .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix); builder.Services.AddLocalization(options => { diff --git a/src/BulkRename/Resources/SharedResource.resx b/src/BulkRename/Resources/SharedResource.resx index 03a23b8..cb3b18f 100644 --- a/src/BulkRename/Resources/SharedResource.resx +++ b/src/BulkRename/Resources/SharedResource.resx @@ -117,6 +117,21 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + An error occurred while processing your request. + + + <strong>The Development environment shouldn't be enabled for deployed applications.</strong> +It can result in displaying sensitive information from exceptions to end users. +For local debugging, enable the <strong>Development</strong> environment by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong> +and restarting the app. + + + Development Mode + + + Error + History @@ -141,6 +156,9 @@ Successfully renamed files + + Swapping to <strong>Development</strong> environment will display more detailed information about the error that occurred. + Welcome to BulkRename diff --git a/src/BulkRename/Views/Shared/Error.cshtml b/src/BulkRename/Views/Shared/Error.cshtml index 10cf32b..1c8bbd6 100644 --- a/src/BulkRename/Views/Shared/Error.cshtml +++ b/src/BulkRename/Views/Shared/Error.cshtml @@ -1,10 +1,17 @@ -@model ErrorViewModel +@using Microsoft.AspNetCore.Mvc.Localization +@using Microsoft.Extensions.Localization + +@inject IStringLocalizer SharedLocalizer +@inject IHtmlLocalizer SharedHtmlLocalizer + +@model ErrorViewModel + @{ - ViewData["Title"] = "Error"; + ViewData["Title"] = SharedLocalizer["Error"]; } -

Error.

-

An error occurred while processing your request.

+

@SharedLocalizer["Error"].

+

@SharedLocalizer["AnErrorOccuredHeader"]

@if (Model?.ShowRequestId ?? false) { @@ -13,13 +20,10 @@

} -

Development Mode

+

@SharedLocalizer["DevelopmentMode"]

- Swapping to Development environment will display more detailed information about the error that occurred. + @SharedHtmlLocalizer["SwappingToDevelopmentModeDisplay"]

- The Development environment shouldn't be enabled for deployed applications. - It can result in displaying sensitive information from exceptions to end users. - For local debugging, enable the Development environment by setting the ASPNETCORE_ENVIRONMENT environment variable to Development - and restarting the app. + @SharedHtmlLocalizer["DetailedErrorMessage"]

From 23056ed2a7c92a907ebdbe6957583f091c026def Mon Sep 17 00:00:00 2001 From: Ramazan Yilmaz Date: Sat, 13 Jul 2024 16:55:28 +0200 Subject: [PATCH 05/14] Localize renamed on --- src/BulkRename/Controllers/HistoryController.cs | 9 +++++++-- src/BulkRename/Resources/SharedResource.resx | 3 +++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/BulkRename/Controllers/HistoryController.cs b/src/BulkRename/Controllers/HistoryController.cs index cd712cc..3da2f0d 100644 --- a/src/BulkRename/Controllers/HistoryController.cs +++ b/src/BulkRename/Controllers/HistoryController.cs @@ -3,16 +3,20 @@ using BulkRename.Interfaces; using BulkRename.Models; using Microsoft.AspNetCore.Mvc; + using Microsoft.Extensions.Localization; public class HistoryController : Controller { private readonly IPersistanceService _persistanceService; + + private readonly IStringLocalizer _sharedLocalizer; private static readonly Dictionary> _dictionary = []; - public HistoryController(IPersistanceService persistanceService) + public HistoryController(IPersistanceService persistanceService, IStringLocalizer sharedLocalizer) { _persistanceService = persistanceService; + _sharedLocalizer = sharedLocalizer; } public IActionResult Index() @@ -22,6 +26,7 @@ public IActionResult Index() public async Task LoadHistory() { + var renamedOn = _sharedLocalizer["RenamedOn"]; _dictionary.Clear(); var renamingSessionToEpisodes = await _persistanceService.LoadRenamingHistory(); @@ -47,7 +52,7 @@ public async Task LoadHistory() }); } - var key = $"{renamingSessionToEpisode.RenamingSession.RenName}, Renamed on: {renamingSessionToEpisode.RenamingSession.RenExecutingDateTime:yyyy-MM-dd HH:mm:ss}"; + var key = $"{renamingSessionToEpisode.RenamingSession.RenName}, {renamedOn}: {renamingSessionToEpisode.RenamingSession.RenExecutingDateTime:yyyy-MM-dd HH:mm:ss}"; _dictionary.Add(key, series); } diff --git a/src/BulkRename/Resources/SharedResource.resx b/src/BulkRename/Resources/SharedResource.resx index cb3b18f..edcd3cc 100644 --- a/src/BulkRename/Resources/SharedResource.resx +++ b/src/BulkRename/Resources/SharedResource.resx @@ -150,6 +150,9 @@ and restarting the app. Preview Renaming of TV-Shows + + Renamed on + Series From 204e377d112b855b55bbad58193a03fc17614480 Mon Sep 17 00:00:00 2001 From: Ramazan Yilmaz Date: Sun, 14 Jul 2024 10:32:32 +0200 Subject: [PATCH 06/14] Add null-forgiving operator to assemblyname --- src/BulkRename/Program.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/BulkRename/Program.cs b/src/BulkRename/Program.cs index 288e008..a7dd560 100644 --- a/src/BulkRename/Program.cs +++ b/src/BulkRename/Program.cs @@ -36,9 +36,9 @@ { options.DataAnnotationLocalizerProvider = (type, factory) => { - var assemblyName = new AssemblyName(typeof(SharedResource).GetTypeInfo().Assembly.FullName); + var assemblyName = new AssemblyName(typeof(SharedResource)!.GetTypeInfo()!.Assembly!.FullName!); - return factory.Create("SharedResource", assemblyName.Name); + return factory.Create("SharedResource", assemblyName!.Name!); }; }); From 6630ae2d03c6da3927fe75fdcdf9b23b182b342a Mon Sep 17 00:00:00 2001 From: Ramazan Yilmaz Date: Sun, 14 Jul 2024 11:58:37 +0200 Subject: [PATCH 07/14] Use constants for the keys --- .../Constants/LocalizationConstants.cs | 35 +++++++++++++++++++ .../Controllers/HistoryController.cs | 11 +++--- src/BulkRename/Views/History/Index.cshtml | 11 +++--- src/BulkRename/Views/Home/Index.cshtml | 11 +++--- src/BulkRename/Views/Series/Index.cshtml | 7 ++-- src/BulkRename/Views/Series/Rename.cshtml | 9 ++--- .../DisplayTemplates/SeriesTable.cshtml | 7 ++-- src/BulkRename/Views/Shared/Error.cshtml | 15 ++++---- src/BulkRename/Views/Shared/_Layout.cshtml | 11 +++--- 9 files changed, 80 insertions(+), 37 deletions(-) create mode 100644 src/BulkRename/Constants/LocalizationConstants.cs diff --git a/src/BulkRename/Constants/LocalizationConstants.cs b/src/BulkRename/Constants/LocalizationConstants.cs new file mode 100644 index 0000000..8ef08b3 --- /dev/null +++ b/src/BulkRename/Constants/LocalizationConstants.cs @@ -0,0 +1,35 @@ +namespace BulkRename.Constants +{ + public static class LocalizationConstants + { + public const string AN_ERROR_OCCURED_HEADER = "AnErrorOccuredHeader"; + + public const string DETAILED_ERROR_MESSAGE = "DetailedErrorMessage"; + + public const string DEVELOPMENT_MODE = "DevelopmentMode"; + + public const string ERROR = "Error"; + + public const string HISTORY = "History"; + + public const string HOME = "Home"; + + public const string LOAD_HISTORY = "LoadHistory"; + + public const string NEW_NAME = "NewName"; + + public const string OLD_NAME = "OldName"; + + public const string PREVIEW_RENAMING_OF_TV_SHOWS = "PreviewRenamingOfTvShows"; + + public const string RENAMED_ON = "RenamedOn"; + + public const string SERIES = "Series"; + + public const string SUCCESSFULLY_RENAMED_FILES = "SuccessfullyRenamedFiles"; + + public const string SWAPPING_TO_DEVELOPMENT_MODE_DISPLAY = "SwappingToDevelopmentModeDisplay"; + + public const string WELCOME_TO_BULK_RENAME = "WelcomeToBulkRename"; + } +} \ No newline at end of file diff --git a/src/BulkRename/Controllers/HistoryController.cs b/src/BulkRename/Controllers/HistoryController.cs index 3da2f0d..11b800e 100644 --- a/src/BulkRename/Controllers/HistoryController.cs +++ b/src/BulkRename/Controllers/HistoryController.cs @@ -1,5 +1,6 @@ namespace BulkRename.Controllers { + using BulkRename.Constants; using BulkRename.Interfaces; using BulkRename.Models; using Microsoft.AspNetCore.Mvc; @@ -8,15 +9,16 @@ public class HistoryController : Controller { private readonly IPersistanceService _persistanceService; - - private readonly IStringLocalizer _sharedLocalizer; private static readonly Dictionary> _dictionary = []; + private readonly string _renamedOn; + public HistoryController(IPersistanceService persistanceService, IStringLocalizer sharedLocalizer) { _persistanceService = persistanceService; - _sharedLocalizer = sharedLocalizer; + + _renamedOn = sharedLocalizer[LocalizationConstants.RENAMED_ON]; } public IActionResult Index() @@ -26,7 +28,6 @@ public IActionResult Index() public async Task LoadHistory() { - var renamedOn = _sharedLocalizer["RenamedOn"]; _dictionary.Clear(); var renamingSessionToEpisodes = await _persistanceService.LoadRenamingHistory(); @@ -52,7 +53,7 @@ public async Task LoadHistory() }); } - var key = $"{renamingSessionToEpisode.RenamingSession.RenName}, {renamedOn}: {renamingSessionToEpisode.RenamingSession.RenExecutingDateTime:yyyy-MM-dd HH:mm:ss}"; + var key = $"{renamingSessionToEpisode.RenamingSession.RenName}, {_renamedOn}: {renamingSessionToEpisode.RenamingSession.RenExecutingDateTime:yyyy-MM-dd HH:mm:ss}"; _dictionary.Add(key, series); } diff --git a/src/BulkRename/Views/History/Index.cshtml b/src/BulkRename/Views/History/Index.cshtml index a92d4de..51e2a82 100644 --- a/src/BulkRename/Views/History/Index.cshtml +++ b/src/BulkRename/Views/History/Index.cshtml @@ -1,28 +1,29 @@ -@using Microsoft.Extensions.Localization +@using BulkRename.Constants +@using Microsoft.Extensions.Localization @inject IStringLocalizer SharedLocalizer @model Dictionary> @{ - ViewData["Title"] = SharedLocalizer["History"]; + ViewData["Title"] = SharedLocalizer[LocalizationConstants.HISTORY]; } - @SharedLocalizer["History"] + @SharedLocalizer[LocalizationConstants.HISTORY] - @SharedLocalizer["Series"] + @SharedLocalizer[LocalizationConstants.SERIES]
diff --git a/src/BulkRename/Views/Home/Index.cshtml b/src/BulkRename/Views/Home/Index.cshtml index 74e4410..70fa36a 100644 --- a/src/BulkRename/Views/Home/Index.cshtml +++ b/src/BulkRename/Views/Home/Index.cshtml @@ -1,17 +1,18 @@ -@using Microsoft.Extensions.Localization +@using BulkRename.Constants +@using Microsoft.Extensions.Localization @inject IStringLocalizer SharedLocalizer @{ - ViewData["Title"] = @SharedLocalizer["Home"]; + ViewData["Title"] = @SharedLocalizer[LocalizationConstants.HOME]; } - @SharedLocalizer["Home"] + @SharedLocalizer[LocalizationConstants.HOME]
-

@SharedLocalizer["WelcomeToBulkRename"]

- @SharedLocalizer["PreviewRenamingOfTvShows"] +

@SharedLocalizer[LocalizationConstants.WELCOME_TO_BULK_RENAME]

+ @SharedLocalizer[LocalizationConstants.PREVIEW_RENAMING_OF_TV_SHOWS]
\ No newline at end of file diff --git a/src/BulkRename/Views/Series/Index.cshtml b/src/BulkRename/Views/Series/Index.cshtml index 331068a..8a6d7c6 100644 --- a/src/BulkRename/Views/Series/Index.cshtml +++ b/src/BulkRename/Views/Series/Index.cshtml @@ -1,9 +1,10 @@ -@using Microsoft.Extensions.Localization +@using BulkRename.Constants +@using Microsoft.Extensions.Localization @inject IStringLocalizer SharedLocalizer @{ - ViewData["Title"] = @SharedLocalizer["Series"]; + ViewData["Title"] = @SharedLocalizer[LocalizationConstants.SERIES]; } @model Dictionary> @@ -12,7 +13,7 @@ - @SharedLocalizer["Series"] + @SharedLocalizer[LocalizationConstants.SERIES] diff --git a/src/BulkRename/Views/Series/Rename.cshtml b/src/BulkRename/Views/Series/Rename.cshtml index 6d881db..78ee21a 100644 --- a/src/BulkRename/Views/Series/Rename.cshtml +++ b/src/BulkRename/Views/Series/Rename.cshtml @@ -1,9 +1,10 @@ -@using Microsoft.Extensions.Localization +@using BulkRename.Constants +@using Microsoft.Extensions.Localization @inject IStringLocalizer SharedLocalizer @{ - ViewData["Title"] = @SharedLocalizer["Series"]; + ViewData["Title"] = @SharedLocalizer[LocalizationConstants.SERIES]; } @model Dictionary> @@ -12,10 +13,10 @@ - @SharedLocalizer["Series"] + @SharedLocalizer[LocalizationConstants.SERIES] -

@SharedLocalizer["SuccessfullyRenamedFiles"]

+

@SharedLocalizer[LocalizationConstants.SUCCESSFULLY_RENAMED_FILES]

@Html.DisplayFor(model => model, "SeriesTable") \ No newline at end of file diff --git a/src/BulkRename/Views/Shared/DisplayTemplates/SeriesTable.cshtml b/src/BulkRename/Views/Shared/DisplayTemplates/SeriesTable.cshtml index 3106b0d..96644fb 100644 --- a/src/BulkRename/Views/Shared/DisplayTemplates/SeriesTable.cshtml +++ b/src/BulkRename/Views/Shared/DisplayTemplates/SeriesTable.cshtml @@ -1,4 +1,5 @@ -@using Microsoft.Extensions.Localization +@using BulkRename.Constants +@using Microsoft.Extensions.Localization @inject IStringLocalizer SharedLocalizer @@ -10,8 +11,8 @@
Old NameNew Name@SharedLocalizer["OldName"]@SharedLocalizer["NewName"]
- - + + @foreach (var ser in s.Value) { diff --git a/src/BulkRename/Views/Shared/Error.cshtml b/src/BulkRename/Views/Shared/Error.cshtml index 1c8bbd6..6dbea70 100644 --- a/src/BulkRename/Views/Shared/Error.cshtml +++ b/src/BulkRename/Views/Shared/Error.cshtml @@ -1,4 +1,5 @@ -@using Microsoft.AspNetCore.Mvc.Localization +@using BulkRename.Constants +@using Microsoft.AspNetCore.Mvc.Localization @using Microsoft.Extensions.Localization @inject IStringLocalizer SharedLocalizer @@ -7,11 +8,11 @@ @model ErrorViewModel @{ - ViewData["Title"] = SharedLocalizer["Error"]; + ViewData["Title"] = SharedLocalizer[LocalizationConstants.ERROR]; } -

@SharedLocalizer["Error"].

-

@SharedLocalizer["AnErrorOccuredHeader"]

+

@SharedLocalizer[LocalizationConstants.ERROR].

+

@SharedLocalizer[LocalizationConstants.AN_ERROR_OCCURED_HEADER]

@if (Model?.ShowRequestId ?? false) { @@ -20,10 +21,10 @@

} -

@SharedLocalizer["DevelopmentMode"]

+

@SharedLocalizer[LocalizationConstants.DEVELOPMENT_MODE]

- @SharedHtmlLocalizer["SwappingToDevelopmentModeDisplay"] + @SharedHtmlLocalizer[LocalizationConstants.SWAPPING_TO_DEVELOPMENT_MODE_DISPLAY]

- @SharedHtmlLocalizer["DetailedErrorMessage"] + @SharedHtmlLocalizer[LocalizationConstants.DETAILED_ERROR_MESSAGE]

diff --git a/src/BulkRename/Views/Shared/_Layout.cshtml b/src/BulkRename/Views/Shared/_Layout.cshtml index 0f03902..4ac1f61 100644 --- a/src/BulkRename/Views/Shared/_Layout.cshtml +++ b/src/BulkRename/Views/Shared/_Layout.cshtml @@ -1,4 +1,5 @@ -@using Microsoft.Extensions.Localization +@using BulkRename.Constants +@using Microsoft.Extensions.Localization @inject IStringLocalizer SharedLocalizer @@ -25,13 +26,13 @@ @@ -46,7 +47,7 @@ From 30788aebb99368f7f7952713c7885e59ed180127 Mon Sep 17 00:00:00 2001 From: Ramazan Yilmaz Date: Sun, 14 Jul 2024 13:19:14 +0200 Subject: [PATCH 08/14] Add tests for language resources --- .../Resources/LanguageResourceEntry.cs | 15 ++ .../Resources/LanguageResourcesTests.cs | 173 ++++++++++++++++++ 2 files changed, 188 insertions(+) create mode 100644 src/BulkRename.IntegrationTests/Resources/LanguageResourceEntry.cs create mode 100644 src/BulkRename.IntegrationTests/Resources/LanguageResourcesTests.cs diff --git a/src/BulkRename.IntegrationTests/Resources/LanguageResourceEntry.cs b/src/BulkRename.IntegrationTests/Resources/LanguageResourceEntry.cs new file mode 100644 index 0000000..ff9445f --- /dev/null +++ b/src/BulkRename.IntegrationTests/Resources/LanguageResourceEntry.cs @@ -0,0 +1,15 @@ +namespace BulkRename.IntegrationTests.Resources +{ + internal class LanguageResourceEntry + { + public LanguageResourceEntry(string name, string value) + { + Name = name; + Value = value; + } + + public string Name { get; } + + public string Value { get; } + } +} \ No newline at end of file diff --git a/src/BulkRename.IntegrationTests/Resources/LanguageResourcesTests.cs b/src/BulkRename.IntegrationTests/Resources/LanguageResourcesTests.cs new file mode 100644 index 0000000..1a798c6 --- /dev/null +++ b/src/BulkRename.IntegrationTests/Resources/LanguageResourcesTests.cs @@ -0,0 +1,173 @@ +namespace BulkRename.IntegrationTests.Resources +{ + using System.Collections.Generic; + using System.Linq; + using System.Xml; + + [TestFixture] + internal class LanguageResourcesTests + { + private const string APP_RESOURCES = "SharedResource"; + + private const string APP_RESOURCES_FILE_ENDING = "resx"; + + private const string DEFAULT_LANGUAGE_CODE = "en"; + + private const string DEFAULT_LANGUAGE_RESOURCE_FILENAME = "SharedResource.resx"; + + private const int LANGUAGE_CODE_LENGTH = 2; + + private List GetLanguageResourceFiles() + { + var files = Directory.GetFiles(@"..\..\..\..\BulkRename\Resources\", "*.resx").ToList(); + return files; + } + + private List ReadLanguageResourceEntries(string filePath) + { + var list = new List(); + + var document = new XmlDocument(); + document.Load(filePath); + var node = document.GetElementsByTagName("data"); + foreach (XmlElement element in node) + { + var name = element.GetAttribute("name"); + var value = element.ChildNodes[1]!.InnerText; + + list.Add(new LanguageResourceEntry(name, value)); + } + + return list; + } + + private Dictionary> GetLanguageDictionary() + { + var languageDictionary = new Dictionary>(); + var files = GetLanguageResourceFiles(); + + var defaultLanguageFile = files.Single(f => Path.GetFileName(f).Equals(DEFAULT_LANGUAGE_RESOURCE_FILENAME)); + var defaultLanguageResourceEntries = ReadLanguageResourceEntries(defaultLanguageFile); + languageDictionary.Add(DEFAULT_LANGUAGE_CODE, defaultLanguageResourceEntries); + + foreach (var filePath in files) + { + var fileName = Path.GetFileName(filePath); + if (fileName == DEFAULT_LANGUAGE_RESOURCE_FILENAME) + { + continue; + } + + var parts = fileName.Split('.'); + var language = parts[1]; + var languageResourceEntries = ReadLanguageResourceEntries(filePath); + + languageDictionary.Add(language, languageResourceEntries); + } + + return languageDictionary; + } + + [Test] + public void GetAllLanguageFiles_CheckNamingConvention_NamingIsCorrect() + { + var files = GetLanguageResourceFiles(); + + var defaultFileErrorMessage = $"There should be a file called '{DEFAULT_LANGUAGE_RESOURCE_FILENAME}', it actually doesn't exist"; + Assert.That(files.Any(f => Path.GetFileName(f).Equals(DEFAULT_LANGUAGE_RESOURCE_FILENAME)), defaultFileErrorMessage); + + foreach (var file in files) + { + var fileName = Path.GetFileName(file); + if (fileName == DEFAULT_LANGUAGE_RESOURCE_FILENAME) + { + continue; + } + + var parts = fileName.Split('.'); + var appResourcesPart = parts[0]; + var appResourcesPartErrorMessage = $"Language resource file name has to start with '{APP_RESOURCES}', actual one is '{appResourcesPart}'"; + Assert.That(appResourcesPart, Is.EqualTo(APP_RESOURCES), appResourcesPartErrorMessage); + + var languageCodePart = parts[1]; + var languageCodeErrorMessage = $"Language code should be {LANGUAGE_CODE_LENGTH} characters string, actual one is named '{languageCodePart}'"; + Assert.That(languageCodePart, Has.Length.EqualTo(LANGUAGE_CODE_LENGTH), languageCodeErrorMessage); + + var fileEndingPart = parts[2]; + var fileEndingPartErrorMessage = $"The language resource file name has to end with '{APP_RESOURCES_FILE_ENDING}', actual is '{fileEndingPart}'"; + Assert.That(fileEndingPart, Is.EqualTo(APP_RESOURCES_FILE_ENDING), fileEndingPartErrorMessage); + } + } + + [Test] + public void ReadAllLanguageResources_CheckKeysCount_AllKeysCountAreSame() + { + // arrange + var languageDictionary = GetLanguageDictionary(); + + // act + languageDictionary.TryGetValue(DEFAULT_LANGUAGE_CODE, out var defaultLanguageList); + var defaultCount = defaultLanguageList!.Count; + + foreach (var dictionary in languageDictionary) + { + if (dictionary.Key.Equals(DEFAULT_LANGUAGE_CODE)) + { + continue; + } + + var currentCount = dictionary.Value.Count; + var dictionaryCountErrorMessage = $"The language '{dictionary.Key}' should have {defaultCount} entries but actually has {currentCount} entries"; + + // assert + Assert.That(currentCount, Is.EqualTo(defaultCount), dictionaryCountErrorMessage); + } + } + + [Test] + public void ReadAllLanguageResources_CheckAllValues_NoneOfThemIsEmpty() + { + // arrange + var languageDictionary = GetLanguageDictionary(); + + foreach (var dictionary in languageDictionary) + { + foreach (var entry in dictionary.Value) + { + // act + var entryHasEmptyValueErrorMessage = $"Entry with the name '{entry.Name}' has an empty value in '{dictionary.Key}' language"; + + // assert + Assert.That(entry.Value, Is.Not.Empty, entryHasEmptyValueErrorMessage); + } + } + } + + [Test] + public void ReadAllLanguageResources_CheckOtherLanguages_AllEntriesExistInDefaultLanguage() + { + // arrange + var languageDictionary = GetLanguageDictionary(); + + // act + languageDictionary.TryGetValue(DEFAULT_LANGUAGE_CODE, out var defaultLanguageList); + + foreach (var dictionary in languageDictionary) + { + if (dictionary.Key.Equals(DEFAULT_LANGUAGE_CODE)) + { + continue; + } + + foreach (var entry in dictionary.Value) + { + var exists = defaultLanguageList!.Any(l => l.Name.Equals(entry.Name)); + var entryDoesntExistInDefaultLanguageMessage = $"Entry with the name '{entry.Name}' does not exist in default language but in language '{dictionary.Key}'"; + + // assert + Assert.That(exists, entryDoesntExistInDefaultLanguageMessage); + } + } + } + } +} \ No newline at end of file From 6854308fdb59f1e6aee33133397abead99cb374e Mon Sep 17 00:00:00 2001 From: Ramazan Yilmaz Date: Sun, 14 Jul 2024 13:30:33 +0200 Subject: [PATCH 09/14] Add missing translation --- src/BulkRename/Constants/LocalizationConstants.cs | 4 ++++ src/BulkRename/Resources/SharedResource.resx | 8 +++++++- src/BulkRename/Views/Series/Index.cshtml | 2 +- src/BulkRename/Views/Shared/Error.cshtml | 2 +- 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/BulkRename/Constants/LocalizationConstants.cs b/src/BulkRename/Constants/LocalizationConstants.cs index 8ef08b3..ef331c5 100644 --- a/src/BulkRename/Constants/LocalizationConstants.cs +++ b/src/BulkRename/Constants/LocalizationConstants.cs @@ -23,8 +23,12 @@ public static class LocalizationConstants public const string PREVIEW_RENAMING_OF_TV_SHOWS = "PreviewRenamingOfTvShows"; public const string RENAMED_ON = "RenamedOn"; + + public const string REQUEST = "Request"; public const string SERIES = "Series"; + + public const string SUBMIT_RENAMING = "Submit Renaming"; public const string SUCCESSFULLY_RENAMED_FILES = "SuccessfullyRenamedFiles"; diff --git a/src/BulkRename/Resources/SharedResource.resx b/src/BulkRename/Resources/SharedResource.resx index edcd3cc..2e4be8f 100644 --- a/src/BulkRename/Resources/SharedResource.resx +++ b/src/BulkRename/Resources/SharedResource.resx @@ -153,9 +153,15 @@ and restarting the app. Renamed on + + Request + Series + + Submit Renaming + Successfully renamed files @@ -163,6 +169,6 @@ and restarting the app. Swapping to <strong>Development</strong> environment will display more detailed information about the error that occurred. - Welcome to BulkRename + Welcome to BulkRename! \ No newline at end of file diff --git a/src/BulkRename/Views/Series/Index.cshtml b/src/BulkRename/Views/Series/Index.cshtml index 8a6d7c6..7147b7c 100644 --- a/src/BulkRename/Views/Series/Index.cshtml +++ b/src/BulkRename/Views/Series/Index.cshtml @@ -18,7 +18,7 @@
diff --git a/src/BulkRename/Views/Shared/Error.cshtml b/src/BulkRename/Views/Shared/Error.cshtml index 6dbea70..850d78d 100644 --- a/src/BulkRename/Views/Shared/Error.cshtml +++ b/src/BulkRename/Views/Shared/Error.cshtml @@ -17,7 +17,7 @@ @if (Model?.ShowRequestId ?? false) {

- Request ID: @Model?.RequestId + @SharedLocalizer[LocalizationConstants.REQUEST] ID: @Model?.RequestId

} From 2367cd748cf6e88d5b3f1e804a8751a870a642e8 Mon Sep 17 00:00:00 2001 From: Ramazan Yilmaz Date: Sun, 14 Jul 2024 13:38:56 +0200 Subject: [PATCH 10/14] Add Hungarian language --- src/BulkRename/Program.cs | 3 +- .../Resources/SharedResource.hu.resx | 175 ++++++++++++++++++ 2 files changed, 177 insertions(+), 1 deletion(-) create mode 100644 src/BulkRename/Resources/SharedResource.hu.resx diff --git a/src/BulkRename/Program.cs b/src/BulkRename/Program.cs index a7dd560..31d034c 100644 --- a/src/BulkRename/Program.cs +++ b/src/BulkRename/Program.cs @@ -23,7 +23,8 @@ var supportedCultures = new[] { - new CultureInfo(defaultCulture) + new CultureInfo(defaultCulture), + new CultureInfo("hu") }; builder.Services.Configure(options => { diff --git a/src/BulkRename/Resources/SharedResource.hu.resx b/src/BulkRename/Resources/SharedResource.hu.resx new file mode 100644 index 0000000..4dbc8a9 --- /dev/null +++ b/src/BulkRename/Resources/SharedResource.hu.resx @@ -0,0 +1,175 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Hiba történt a kérése feldolgozása során + + + <strong>A fejlesztői környezetet nem szabad engedélyezni a telepített alkalmazásokhoz.</strong> + Ez a kivételekből származó érzékeny információk megjelenítését eredményezheti a végfelhasználók számára. + A helyi hibakereséshez engedélyezze a következő <strong>Fejlesztői</strong> környezetet: <strong>ASPNETCORE_ENVIRONMENT</strong> környezeti változók között a <strong>Fejlesztői</strong> + beállításokban, és indítsa újra az alkalmazást. + + + Fejlesztői mód + + + Hiba + + + Előzmények + + + Kezdőlap + + + Előzmények betöltése + + + Új fájlnév + + + Rági fájlnév + + + TV-műsorok átnevezése előnézet + + + Pénteken átnevezték + Translated with deepl + + + Kérés + + + Sorozatok + + + Átnevezés beküldése + + + Sikeresen átnevezett fájlok + + + A <strong>Fejlesztői</strong> környezetre váltás részletesebb információkat jelenít meg a bekövetkezett hibáról. + + + Üdvözöl a BulkRename! + + \ No newline at end of file From 5b1ba556b2ae8e2fbc7ac0d4fc6f4a8651848ce5 Mon Sep 17 00:00:00 2001 From: Ramazan Yilmaz Date: Sun, 14 Jul 2024 13:47:14 +0200 Subject: [PATCH 11/14] Fix path for test files search --- .../Resources/LanguageResourcesTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/BulkRename.IntegrationTests/Resources/LanguageResourcesTests.cs b/src/BulkRename.IntegrationTests/Resources/LanguageResourcesTests.cs index 1a798c6..6eb7e54 100644 --- a/src/BulkRename.IntegrationTests/Resources/LanguageResourcesTests.cs +++ b/src/BulkRename.IntegrationTests/Resources/LanguageResourcesTests.cs @@ -19,7 +19,7 @@ internal class LanguageResourcesTests private List GetLanguageResourceFiles() { - var files = Directory.GetFiles(@"..\..\..\..\BulkRename\Resources\", "*.resx").ToList(); + var files = Directory.GetFiles(@"../../../../BulkRename/Resources/", "*.resx").ToList(); return files; } From cf8bf4e77cd8186e926ed925d9a9364781b8ec17 Mon Sep 17 00:00:00 2001 From: Ramazan Yilmaz Date: Sun, 14 Jul 2024 14:32:11 +0200 Subject: [PATCH 12/14] Add German language --- src/BulkRename/Program.cs | 3 +- .../Resources/SharedResource.de.resx | 174 ++++++++++++++++++ 2 files changed, 176 insertions(+), 1 deletion(-) create mode 100644 src/BulkRename/Resources/SharedResource.de.resx diff --git a/src/BulkRename/Program.cs b/src/BulkRename/Program.cs index 31d034c..9117e87 100644 --- a/src/BulkRename/Program.cs +++ b/src/BulkRename/Program.cs @@ -24,7 +24,8 @@ var supportedCultures = new[] { new CultureInfo(defaultCulture), - new CultureInfo("hu") + new CultureInfo("hu"), + new CultureInfo("de") }; builder.Services.Configure(options => { diff --git a/src/BulkRename/Resources/SharedResource.de.resx b/src/BulkRename/Resources/SharedResource.de.resx new file mode 100644 index 0000000..63d0e77 --- /dev/null +++ b/src/BulkRename/Resources/SharedResource.de.resx @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Fehler bei der Verarbeitung Ihrer Anforderung. + + + <strong>Die Entwicklungsumgebung sollte für bereitgestellte Anwendungen nicht aktiviert werden.</strong> +Sie kann dazu führen, dass sensible Informationen aus Ausnahmen für Endbenutzer angezeigt werden. +Für das lokale Debugging aktivieren Sie die <strong>Entwicklungsumgebung</strong>, indem Sie die Umgebungsvariable <strong>ASPNETCORE_ENVIRONMENT</strong> auf <strong>Development</strong> +setzen und die Anwendung neu starten. + + + Entwickler Modus + + + Fehler + + + Verlauf + + + Home + + + Verlauf laden + + + Neuer Name + + + Alter Name + + + Vorschau für Umbenennung der Serien + + + Umbenannt am + + + Anfrage + + + Serien + + + Umbenennen bestätigen + + + Dateien wurden erfolgreich umbenannt + + + Wenn Sie in die <strong>Entwicklungsumgebung</strong> wechseln, werden detailliertere Informationen über den aufgetretenen Fehler angezeigt. + + + Willkommen bei Bulkrename! + + \ No newline at end of file From 34d836682402368d16ace3e60321a5d16e7fc3b4 Mon Sep 17 00:00:00 2001 From: Ramazan Yilmaz Date: Sun, 14 Jul 2024 21:43:41 +0200 Subject: [PATCH 13/14] Fix typo --- src/BulkRename/Resources/SharedResource.de.resx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/BulkRename/Resources/SharedResource.de.resx b/src/BulkRename/Resources/SharedResource.de.resx index 63d0e77..e789384 100644 --- a/src/BulkRename/Resources/SharedResource.de.resx +++ b/src/BulkRename/Resources/SharedResource.de.resx @@ -169,6 +169,6 @@ setzen und die Anwendung neu starten. Wenn Sie in die <strong>Entwicklungsumgebung</strong> wechseln, werden detailliertere Informationen über den aufgetretenen Fehler angezeigt. - Willkommen bei Bulkrename! + Willkommen bei BulkRename! \ No newline at end of file From 1874d59277f935240ade394ebf4da1375894136a Mon Sep 17 00:00:00 2001 From: Ramazan Yilmaz Date: Sun, 14 Jul 2024 21:59:41 +0200 Subject: [PATCH 14/14] Add language documentation --- DEVELOPMENT.md | 42 ++++++++++++++++++++++++++++++++++++++++++ README.md | 4 ++++ 2 files changed, 46 insertions(+) diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 9c5463d..5652b5f 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -1,3 +1,22 @@ +- [Description](#description) +- [Documentation](#documentation) +- [Branches](#branches) +- [Workflows](#workflows) + - [Variables and secrets](#variables-and-secrets) +- [.env file](#env-file) +- [Languages](#languages) + - [Resource file](#resource-file) + - [Integration Tests](#integration-tests) + - [Add language to the supported cultures](#add-language-to-the-supported-cultures) +- [Version](#version) +- [Database fields](#database-fields) + - [Primary key](#primary-key) + - [All fields](#all-fields) + - [Foreign Keys](#foreign-keys) +- [Working locally](#working-locally) + - [Local build](#local-build) + - [Running the container](#running-the-container) + # Description You are welcome to participate in the development of this tool, in this file some information and rules for the development are described. @@ -32,6 +51,29 @@ In order for the workflows to run on your GitHub account, the following variable # .env file In order that parameter values are not directly in the docker-compose.yml, the .env file is used here. This allows the parameters and values to be specified as a key-value pair in this file. The [CreateEnvFile.ps1](./src/CreateEnvFile.ps1) script was created to avoid having to create the file manually. If new parameters are defined for the docker-compose.yml file, the script should be extended accordingly. +# Languages +A new language can be added very easily, you need Visual Studio, you can download it [here](https://visualstudio.microsoft.com/downloads/). In this example, we will add `Spanish` as a new language. + +## Resource file +Create a new resource file in the folder [Resources](./src/BulkRename/Resources) and provide your language code between the file `SharedResource` name and the extension `resx`, for example `SharedResource.es.resx`. Copy all the keys from the [default language file](./src/BulkRename/Resources/SharedResource.resx) which is English, and add the translations. Check out this [Microsoft documentation](https://learn.microsoft.com/en-us/aspnet/core/fundamentals/localization/provide-resources?view=aspnetcore-8.0) to learn more about resource files. + +### Integration Tests +There are a few integration tests, that will ensure that all the language keys, that exist in the English version, have also been translated to the new language. Please run [these tests](./src/BulkRename.IntegrationTests/Resources/LanguageResourcesTests.cs) before creating a pull request. + +## Add language to the supported cultures +Go to the class [Program.cs](./src/BulkRename/Program.cs) and add your language to the `supportedCultures` with the corresponding culture. + +```c# +var supportedCultures = new[] +{ + new CultureInfo(defaultCulture), + new CultureInfo("hu"), + new CultureInfo("de"), + // Add here your new CultureInfo + new CultureInfo("es") +}; +``` + # Version The version is set in the following files: - VERSION in [Dockerfile](./src/Dockerfile) diff --git a/README.md b/README.md index d54354c..f3e92b7 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,7 @@ - [Renamed series overview](#renamed-series-overview) - [History](#history) - [Development](#development) + - [Adding new languages](#adding-new-languages) - [Contributors ✨](#contributors-) @@ -178,6 +179,9 @@ Call up the history page by pressing **History (8)**. The first time, the page w # Development Please read the [development documentation](./DEVELOPMENT.md) if you would like to participate in the development. +## Adding new languages +This app can provide multiple languages and includes already the languages `English`, `German`, and `Hungarian`. A new language can be added within a few steps, to do this, please check out the [documentation](./DEVELOPMENT.md#languages). + ## Contributors ✨
@SharedLocalizer["OldName"]@SharedLocalizer["NewName"]@SharedLocalizer[LocalizationConstants.OLD_NAME]@SharedLocalizer[LocalizationConstants.NEW_NAME]