Quantcast
Channel: ASP.NET Core
Viewing all articles
Browse latest Browse all 9386

Switching between cultures in dropdown redirects to default culture

$
0
0

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.


Viewing all articles
Browse latest Browse all 9386

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>