Asp.net core 语言切换在ASP.NET MVC.NET core 3.1中不起作用

Asp.net core 语言切换在ASP.NET MVC.NET core 3.1中不起作用,asp.net-core,.net-core,Asp.net Core,.net Core,我正在尝试支持一个用.NETCore3.1编写的多语言网站 文化转换的观点没有得到尊重。它总是加载默认区域性。换句话说,转到/en/Home/Index和/fr/Home/Index会导致相同的本地化。 这是我的创业公司 public void ConfigureServices(IServiceCollection services) { services.AddLocalization(opts => { opts.ResourcesPath = "R

我正在尝试支持一个用.NETCore3.1编写的多语言网站 文化转换的观点没有得到尊重。它总是加载默认区域性。换句话说,转到/en/Home/Index和/fr/Home/Index会导致相同的本地化。 这是我的创业公司

public void ConfigureServices(IServiceCollection services)
    {
        services.AddLocalization(opts => { opts.ResourcesPath = "Resources"; });

        services.Configure<RequestLocalizationOptions>(opts =>
        {
            var supportedCultures = new List<CultureInfo> { new CultureInfo("en"), new CultureInfo("fr"), };

            opts.DefaultRequestCulture = new RequestCulture("en");
            opts.SupportedCultures = supportedCultures;
            opts.SupportedUICultures = supportedCultures;
            opts.RequestCultureProviders.Insert(0, new CustomRequestCultureProvider(context =>
            {
                return Task.FromResult(new ProviderCultureResult("en"));
            }));

        });

        services.AddControllersWithViews()
          .AddViewLocalization(opts => { opts.ResourcesPath = "Resources"; }).
          SetCompatibilityVersion(CompatibilityVersion.Version_3_0);
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
        }
        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseRouting();

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

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
              name: "default",
                pattern: "{culture=en}/{controller=Home}/{action=Index}"
                );
        });
    }
        
@Localizer.GetString(“测试”)

请注意,我不想有任何查询参数,因为我们的客户可能会对bookedmarked URL进行查询

我使用调试器来确保我的程序在ny视图中正确读取/en或/fr


是否需要手动切换?

您正在“0”位置插入
CustomRequestCultureProvider
,这意味着应用程序将首先查看此处以检查当前区域性,在这种情况下,该区域性始终为“en”:

opts.RequestCultureProviders.Insert(0,新的CustomRequestCultureProvider(上下文=>
{
返回Task.FromResult(新ProviderCultureResult(“en”);
}));
使用
Add
,这会将其添加到提供者列表的末尾:

opts.RequestCultureProviders.Add(新的CustomRequestCultureProvider(上下文=>
{
返回Task.FromResult(新ProviderCultureResult(“en”);
}));
或替换为:

opts.DefaultRequestculture=newrequestculture(“en”);

您正在“0”位置插入
CustomRequestCultureProvider
,这意味着应用程序将首先查看此处以检查当前区域性,在这种情况下,当前区域性始终为“en”:

opts.RequestCultureProviders.Insert(0,新的CustomRequestCultureProvider(上下文=>
{
返回Task.FromResult(新ProviderCultureResult(“en”);
}));
使用
Add
,这会将其添加到提供者列表的末尾:

opts.RequestCultureProviders.Add(新的CustomRequestCultureProvider(上下文=>
{
返回Task.FromResult(新ProviderCultureResult(“en”);
}));
或替换为:

opts.DefaultRequestculture=newrequestculture(“en”);

我刚刚尝试了这个,它给出了相同的行为。我是net core的新手,框架如何将语言映射到文化?似乎您没有配置,将其插入
RequestCultureProviders
的“0”位置,或者尝试从路由模式中删除
{culture=en}
,以查看它是否与查询字符串参数一起工作。我尝试删除它,但运气不佳。实际上,当我切换语言时,它给出了错误404。Swall,我真的不知道哪里出了问题,但我建议读一读a,或者我只是尝试了一下,它给出了相同的行为。我是net core的新手,框架如何将语言映射到文化?似乎您没有配置,将其插入
RequestCultureProviders
的“0”位置,或者尝试从路由模式中删除
{culture=en}
,以查看它是否与查询字符串参数一起工作。我尝试删除它,但运气不佳。事实上,当我切换语言时,它给出了错误404。Swall,我真的不知道哪里出了问题,但我建议读一个or
@using Microsoft.AspNetCore.Mvc.Localization;
@using System.Globalization;
@inject IViewLocalizer Localizer