Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add localization for controllers and for view models annotations #297

Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
using OutOfSchool.Services.Models;
using OutOfSchool.Services.Repository;
using SignInResult = Microsoft.AspNetCore.Identity.SignInResult;
using Microsoft.Extensions.Localization;

namespace OutOfSchool.IdentityServer.Tests.Controllers
{
Expand All @@ -33,6 +34,7 @@ public class AuthControllerTests
private readonly Mock<ILogger<AuthController>> fakeLogger;
private readonly Mock<IParentRepository> fakeparentRepository;
private AuthController authController;
private readonly Mock<IStringLocalizer<SharedResource>> fakeLocalazier;

public AuthControllerTests()
{
Expand All @@ -41,6 +43,7 @@ public AuthControllerTests()
fakeSignInManager = new Mock<FakeSignInManager>();
fakeLogger = new Mock<ILogger<AuthController>>();
fakeparentRepository = new Mock<IParentRepository>();
fakeLocalazier = new Mock<IStringLocalizer<SharedResource>>();
}

[SetUp]
Expand All @@ -51,7 +54,8 @@ public void Setup()
fakeSignInManager.Object,
fakeInteractionService.Object,
fakeLogger.Object,
fakeparentRepository.Object
fakeparentRepository.Object,
fakeLocalazier.Object
);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using IdentityServer4.Services;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Logging;
using OutOfSchool.IdentityServer.ViewModels;
using OutOfSchool.Services.Enums;
Expand All @@ -22,6 +23,7 @@ public class AuthController : Controller
private readonly IIdentityServerInteractionService interactionService;
private readonly ILogger<AuthController> logger;
private readonly IParentRepository parentRepository;
private readonly IStringLocalizer<SharedResource> localizer;

/// <summary>
/// Initializes a new instance of the <see cref="AuthController"/> class.
Expand All @@ -31,18 +33,21 @@ public class AuthController : Controller
/// <param name="interactionService"> Identity Server 4 interaction service.</param>
/// <param name="parentRepository">Repository for Parent model.</param>
/// <param name="logger"> ILogger class.</param>
/// <param name="localizer"> Localizer.</param>
public AuthController(
UserManager<User> userManager,
SignInManager<User> signInManager,
IIdentityServerInteractionService interactionService,
ILogger<AuthController> logger,
IParentRepository parentRepository)
IParentRepository parentRepository,
IStringLocalizer<SharedResource> localizer)
{
this.logger = logger;
this.parentRepository = parentRepository;
this.signInManager = signInManager;
this.userManager = userManager;
this.interactionService = interactionService;
this.localizer = localizer;
}

/// <summary>
Expand Down Expand Up @@ -110,7 +115,7 @@ public async Task<IActionResult> Login(LoginViewModel model)
return BadRequest();
}

ModelState.AddModelError(string.Empty, "Login or password is wrong");
ModelState.AddModelError(string.Empty, localizer["Login or password is wrong"]);
return View(new LoginViewModel
{
ExternalProviders = await signInManager.GetExternalAuthenticationSchemesAsync(),
Expand Down Expand Up @@ -159,15 +164,15 @@ public async Task<IActionResult> Register(RegisterViewModel model)

var user = new User()
{
UserName = model.Email,
FirstName = model.FirstName,
LastName = model.LastName,
MiddleName = model.MiddleName,
Email = model.Email,
PhoneNumber = model.PhoneNumber,
CreatingTime = DateTimeOffset.UtcNow,
Role = model.Role,
IsRegistered = false,
UserName = model.Email,
FirstName = model.FirstName,
LastName = model.LastName,
MiddleName = model.MiddleName,
Email = model.Email,
PhoneNumber = model.PhoneNumber,
CreatingTime = DateTimeOffset.UtcNow,
Role = model.Role,
IsRegistered = false,
};

try
Expand Down Expand Up @@ -216,7 +221,7 @@ public async Task<IActionResult> Register(RegisterViewModel model)
{
if (error.Code == "DuplicateUserName")
{
error.Description = $"Email {error.Description.Substring(10).Split('\'')[0]} is alredy taken";
error.Description = $"{localizer["Email"]} {error.Description.Substring(10).Split('\'')[0]} {localizer["is already taken"]}";
}

ModelState.AddModelError(string.Empty, error.Description);
Expand All @@ -230,7 +235,7 @@ public async Task<IActionResult> Register(RegisterViewModel model)
await userManager.RemoveFromRoleAsync(user, user.Role);
await userManager.DeleteAsync(user);

ModelState.AddModelError(string.Empty, "Error! Something happened on the server!");
ModelState.AddModelError(string.Empty, localizer["Error! Something happened on the server!"]);

logger.Log(LogLevel.Error, "Error happened while creating Parent entity! " + ex.Message);

Expand All @@ -243,4 +248,4 @@ public Task<IActionResult> ExternalLogin(string provider, string returnUrl)
throw new NotImplementedException();
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -258,4 +258,40 @@
<data name="Confirm email" xml:space="preserve">
<value>Підтвердження емейлу</value>
</data>
<data name="Error! Something happened on the server!" xml:space="preserve">
<value>Error! Something happened on the server!</value>
</data>
<data name="is already taken" xml:space="preserve">
<value>is already taken</value>
</data>
<data name="Login or password is wrong" xml:space="preserve">
<value>Login or password is wrong</value>
</data>
<data name="Password is required" xml:space="preserve">
<value>Password is required</value>
</data>
<data name="Email is required" xml:space="preserve">
<value>Email is required</value>
</data>
<data name="FirstName is required" xml:space="preserve">
<value>FirstName is required</value>
</data>
<data name="LastName is required" xml:space="preserve">
<value>LastName is required</value>
</data>
<data name="Password confirmation is required" xml:space="preserve">
<value>Password confirmation is required</value>
</data>
<data name="Password must contain at least one capital, number and symbol(@$!%*?&amp;)." xml:space="preserve">
<value>Password must contain at least one capital, number and symbol(@$!%*?&amp;).</value>
</data>
<data name="Passwords doesn't match" xml:space="preserve">
<value>Passwords doesn't match</value>
</data>
<data name="Phone number format is incorrect. Example: +38XXX-XXX-XX-XX" xml:space="preserve">
<value>Phone number format is incorrect. Example: +38XXX-XXX-XX-XX</value>
</data>
<data name="Phone number is required" xml:space="preserve">
<value>Phone number is required</value>
</data>
</root>
Original file line number Diff line number Diff line change
Expand Up @@ -256,4 +256,40 @@
<data name="Confirm email" xml:space="preserve">
<value>Підтвердження емейлу</value>
</data>
<data name="Error! Something happened on the server!" xml:space="preserve">
<value>Помилка! Щось сталося на сервері!</value>
</data>
<data name="is already taken" xml:space="preserve">
<value>вже зайнятий</value>
</data>
<data name="Login or password is wrong" xml:space="preserve">
<value>Логін або пароль неправильні</value>
</data>
<data name="Password is required" xml:space="preserve">
<value>Необхідний пароль</value>
</data>
<data name="Email is required" xml:space="preserve">
<value>Потрібна електронна адреса</value>
</data>
<data name="FirstName is required" xml:space="preserve">
<value>Обов'язкове ім'я</value>
</data>
<data name="LastName is required" xml:space="preserve">
<value>Потрібно прізвище</value>
</data>
<data name="Password confirmation is required" xml:space="preserve">
<value>Потрібно підтвердження пароля</value>
</data>
<data name="Password must contain at least one capital, number and symbol(@$!%*?&amp;)." xml:space="preserve">
<value>Пароль повинен містити принаймні одну велику літеру, число та символ (@$!%*? &amp;).</value>
</data>
<data name="Passwords doesn't match" xml:space="preserve">
<value>Паролі не збігаються</value>
</data>
<data name="Phone number format is incorrect. Example: +38XXX-XXX-XX-XX" xml:space="preserve">
<value>Формат номера телефону неправильний. Приклад: +38XXX-XXX-XX-XX</value>
</data>
<data name="Phone number is required" xml:space="preserve">
<value>Номер телефону обов’язковий</value>
</data>
</root>
9 changes: 7 additions & 2 deletions OutOfSchool/OutOfSchool.IdentityServer/Startup.cs
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,12 @@ public void ConfigureServices(IServiceCollection services)
builder => builder.Bind(config.GetSection(SmtpOptions.SectionName)));

services.AddControllersWithViews()
.AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix);
.AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
.AddDataAnnotationsLocalization(options =>
{
options.DataAnnotationLocalizerProvider = (type, factory) =>
factory.Create(typeof(SharedResource));
});

services.AddTransient<IParentRepository, ParentRepository>();
}
Expand Down Expand Up @@ -152,7 +157,7 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env)

app.UseRouting();

app.UseCookiePolicy(new CookiePolicyOptions {MinimumSameSitePolicy = SameSiteMode.Lax});
app.UseCookiePolicy(new CookiePolicyOptions { MinimumSameSitePolicy = SameSiteMode.Lax });

app.UseStaticFiles();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ namespace OutOfSchool.IdentityServer.ViewModels
{
public class LoginViewModel
{
[Required]
[Required(ErrorMessage = "Email is required")]
public string Username { get; set; }

[Required(ErrorMessage = "Password is required")]
Expand Down