Hi guys,
I want to provide setting and other relevant details that I used in localization to make multi-language options to work. When I add culture query string to URL, content language changes properly, but making it with dropdown like I want gets me to default
culture everytime I switch between cultures (languages).
Startup
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Foroffer.Models;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.FileProviders;
using System.Resources;
using System.Globalization;
using Microsoft.AspNetCore.Localization;
using Microsoft.Extensions.Options;
using Microsoft.Extensions.Localization;
namespace Foroffer
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
//Add Localization
services.AddLocalization(opts =>
{
opts.ResourcesPath = "Resources";
});
services.AddDbContext<OfferDbContext>(x =>
{
x.UseSqlServer(Configuration["Database:OfferDb"]);
});
services.AddIdentity<AppUser, IdentityRole>(options => {
// options.SignIn.RequireConfirmedEmail = true;
options.Lockout.MaxFailedAccessAttempts = 9;
// options.User.AllowedUserNameCharacters = "qwertyuiopasdfghjklzxcvbnm";
options.User.RequireUniqueEmail = true;
})
.AddEntityFrameworkStores<OfferDbContext>()
.AddDefaultTokenProviders();
services.AddMvc().
AddViewLocalization(opts =>
{
opts.ResourcesPath = "Resources";
}).AddViewLocalization(Microsoft.AspNetCore.Mvc.Razor.LanguageViewLocationExpanderFormat.Suffix).
AddDataAnnotationsLocalization().
SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.AddAntiforgery(a => a.HeaderName = "XSRF-TOKEN");
services.Configure<RequestLocalizationOptions>(opts =>
{
var supportedCultures = new List<CultureInfo>
{
new CultureInfo("az-Latn-AZ"),
new CultureInfo("en-US"),
new CultureInfo("en-GB"),
new CultureInfo("ru-RU")
};
opts.DefaultRequestCulture = new RequestCulture("en-US");
opts.SupportedCultures = supportedCultures;
opts.SupportedUICultures = supportedCultures;
// services.AddSingleton(opts);
});
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
//Request Localization
var options = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
app.UseRequestLocalization(options.Value);
app.UseAuthentication();
app.UseCookiePolicy();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "root",
template: "{action}/{id?}",
defaults: new { controller = "Home", action = "Index" });
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
}
}Controller /action
private readonly OfferDbContext _offerDbContext;
private readonly IStringLocalizer<HomeController> _localizer;
public HomeController(OfferDbContext offerDbContext, IStringLocalizer<HomeController> localizer)
{
_offerDbContext = offerDbContext;
_localizer = localizer;
}
[HttpPost]
public IActionResult SetLanguage(string culture, string returnUrl)
{
Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)),
new CookieOptions { Expires = DateTimeOffset.UtcNow.AddYears(1) }
);
return LocalRedirect(returnUrl);
}_PartialView
@using System.Threading.Tasks
@using Microsoft.AspNetCore.Builder
@using Microsoft.AspNetCore.Http.Features
@using Microsoft.AspNetCore.Localization
@using Microsoft.AspNetCore.Mvc.Localization
@using Microsoft.Extensions.Options
@inject IViewLocalizer Localizer
@inject IOptions<RequestLocalizationOptions> LocOptions
@{
var requestCulture = Context.Features.Get<IRequestCultureFeature>();
var cultureItems = LocOptions.Value.SupportedUICultures
.Select(c => new SelectListItem { Value = c.Name, Text = c.DisplayName })
.ToList();
}<form asp-controller="Home" asp-action="SetLanguage"
asp-route-returnUrl="@Context.Request.Path"
method="post" class="form-horizontal">
@Localizer["Language:"] <select name="culture" onchange="this.form.submit();"
asp-for="@requestCulture.RequestCulture.UICulture.Name"
asp-items="cultureItems"></select></form>And part of View (Index)
@using System.Threading
@using Microsoft.AspNetCore.Mvc.Localization
@model Foroffer.Models.ViewModels.SlideViewModel
@inject IViewLocalizer Localizer
<button class="infotool" id="mynews">
<p>@Localizer["Foroffer"]</p>
</button>
I have also resource files that translates given Localizer (Foroffer). Folder structure is like here:https://prnt.sc/n4cuko
Please review attentively, if any further info needed, I'm ready to share with you.