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.