ASP.NET Core:设置文化时遇到问题

问题描述 投票:0回答:0

我已经设置了

StartUp.cs
文件 - 本地化并配置支持的文化。我已经添加了本地化的资源路径,并使用
services.AddLocalization()
方法来配置它,以及
services.Configure\<RequestLocalizationOptions\>()
方法来指定默认请求文化、支持的文化和支持的UI文化。

但是,我在正确设置文化时遇到了困难,并且出现错误

设置文化失败:未找到

我尝试通过控制器和 ajax 设置文化。

我还要确保

UseRequestLocalization
管道在
UseMvc
之前。

StartUp.cs

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
        {
            // This lambda determines whether user consent for non-essential cookies is needed for a given request.
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

    //---- Additional code added in Startup class's ConfigureServices
    //
    services.AddCors();   // https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-2.2
    services.AddDbContext<ApplicationDBContext>(
            options => options.UseMySql(Configuration.GetConnectionString("DefaultConnection"))
        );

    // Configure strongly typed settings objects
    var appSettingsSection = Configuration.GetSection("AppSettings");
    services.Configure<AppSettings>(appSettingsSection);

    // Configure jwt authentication
    var appSettings = appSettingsSection.Get<AppSettings>();

    // Before you can use the following command, var key = Encoding.ASCII.GetBytes(appSettings.Secret);
    // to obtain the secret key value can be read from the appsettings.json file, you need three
    // commands above to prepare the appSettings object.
    // Notice that an object of a custom type AppSettings has been defined inside
    // the Helpers namespace (folder).
    var key = Encoding.ASCII.GetBytes(appSettings.Secret);

    services.AddAuthentication(("CookieAuthenticationScheme"))
            .AddCookie("CookieAuthenticationScheme", options =>
                {
                    options.ExpireTimeSpan = TimeSpan.FromDays(7);
                    options.AccessDeniedPath = "/Home/Forbidden/";
                    options.LoginPath = "/Home/Login/";
                });

    services.AddAntiforgery();

    // The following code will create a singleton object inside the services collection so that
    // any Web API or Action controller class which uses this object can either create a current date time
    // or mock-up date time for testing purposes.
    // https://medium.com/@mattmazzola/asp-net-core-injecting-custom-data-classes-into-startup-classs-constructor-and-configure-method-7cc146f00afb
    // Declaration technique to apply current system date time
    services.AddSingleton<IAppDateTimeService>
         (new AppDateTimeService("actual", DateTime.MinValue));

    services.AddLocalization(opts => { opts.ResourcesPath = "Resources"; });

    services.Configure<RequestLocalizationOptions>(options =>
        {
            var supportedCultures = new List<CultureInfo>()
            {
                new CultureInfo("zh-CN"),
                new CultureInfo("tr-TR"),
                new CultureInfo("en-US")
            };

            //options.DefaultRequestCulture = new RequestCulture(supportedCultures.First());
            options.DefaultRequestCulture = new RequestCulture("tr-TR");
            options.SupportedCultures = supportedCultures;
            options.SupportedUICultures = supportedCultures;
            options.FallBackToParentUICultures = true;
        });

    services.AddSingleton<SharedViewLocalizer>();

    // Add Authorization Roles
    services.AddAuthorization(options =>
        {
            options.AddPolicy("ADMIN",
                authBuilder =>
                {
                    authBuilder.RequireRole("ADMIN");
                });
            options.AddPolicy("STAFF",
                authBuilder =>
                {
                    authBuilder.RequireRole("STAFF");
                });
            options.AddPolicy("ADMIN2",
                authBuilder =>
                {
                    authBuilder.RequireRole("ADMIN2");
                });
            //options.AddPolicy("GUEST",
            //    authBuilder =>
            //    {
            //        authBuilder.RequireRole("GUEST");
            //    });
        });

    services.AddScoped<IUserService, UserService>();
    services.AddScoped<IDBMailService, DBMailService>();
    services.AddScoped<IImagesService, ImagesService>();
    services.AddScoped<IBookingService, BookingService>();
    services.AddScoped<INotificationRepository, NotificationRepository>();
    services.AddScoped<ICustomerService, CustomerServices>();

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

    services.AddSignalR(o =>
        {
            o.EnableDetailedErrors = true;
        });

    services.AddHttpContextAccessor();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }

        app.UseAuthentication();
        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseCookiePolicy();

        var locOptions = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
        app.UseRequestLocalization(locOptions.Value);

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });

        app.UseSignalR(routes =>
        {
            routes.MapHub<Notification>("/chat");
        });
}

我这里有三个

.resx
文件:

enter image description here

这是我的

.cshtml
观点:

@using System.Security.Claims
@using AmkThkhCardBookingSystem.Services
@{var identity = Context.User.Identity as ClaimsIdentity; }

@using Microsoft.AspNetCore.Localization
@using AmkThkhCardBookingSystem.ExtensionMethods
@using System.Globalization;

@using Microsoft.Extensions.Localization

@inject IStringLocalizer<SharedResource> SharedLocalizer


@{ ViewData["Title"] = "Home Page"; }

@{ var requestCulture = Context.Features.Get<IRequestCultureFeature>();
    var cultureList = ViewData["Cultures"] as List<SelectListItem>;
    var currentUICulture = CultureInfo.CurrentUICulture.Name; }

<h3>@Html.Translate("VP")</h3><br />
<small>@currentUICulture</small>

<form id="selectLanguage" asp-controller="User"
          asp-action="SetLanguage" asp-route-returnUrl="@Context.Request.Path"
          method="post" role="form" style="width: 100%">
        <select class="form-control" name="culture"
                asp-for="@requestCulture.RequestCulture.UICulture.Name" asp-items="@cultureList" onchange="this.form.submit()"></select>
    </form>

    <select onchange="setCulture(this.value)">
        <option value="en-US">English</option>
        <option value="zh-CN">Français</option>
        <option value="es-ES">Español</option>
    </select>

    <button onclick="setCulture('en-US')">English</button>
    <button onclick="setCulture('zh-CN')">中文</button>

<script>
function setCulture(culture) {
            var cookieValue = "Culture=" + culture + "; path=/; expires=Fri, 31 Dec 9999 23:59:59 GMT";
            document.cookie = cookieValue;
            console.log(document.cookie)
        }
        function setCulture(culture) {
            $.ajax({
                type: "POST",
                url: "Settings/SetCulture2/zh-CN",
                data: { culture: culture },
                success: function (data) {
                    if (data.success) {
                        // Reload the page to apply the new culture
                        window.location.reload();
                    } else {
                        alert("Failed to set culture: " + data.error);
                    }
                },
                error: function (xhr, status, error) {
                    alert("Failed to set culture: " + error);
                }
            });
        }

</script>

在我的 StartUp.cs 中,我通过“options.DefaultRequestCulture = new RequestCulture("tr-TR");”将默认文化设置为 tr-TR。但是,在我看来,@currentUICulture 值是 en-US。

最后,这是控制器类。我还尝试了以下两个代码。 (评论)

[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) }
            //);

            //// Set the culture explicitly for the current request
            //CultureInfo.CurrentCulture = new CultureInfo(culture);
            //CultureInfo.CurrentUICulture = new CultureInfo(culture);
            var cultureInfo = new CultureInfo(culture);
            var thisss = cultureInfo.Name;
            Thread.CurrentThread.CurrentUICulture = cultureInfo;
            Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureInfo.Name);
            _httpContextAccessor.HttpContext.Response.Cookies.Append("culture", "en-US", new CookieOptions
            {
                Expires = DateTimeOffset.Now.AddYears(1),
                HttpOnly = true
            });

            return LocalRedirect(returnUrl);
        }

我还能尝试什么来确保在我的应用程序中正确设置文化?

非常感谢您对我的问题的帮助。非常感谢您的时间和专业知识!

我还尝试重命名我的 resx 文件。这是在 ASP.NET Core 2.1.

我想到了清除缓存,但不太确定该怎么做。

asp.net-core cookies localization cultureinfo resx
© www.soinside.com 2019 - 2024. All rights reserved.