Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET Core 5.0 RoutedDataRequestCultureProvider删除url中的默认区域性_C#_Asp.net Core_.net Core_Asp.net Core Localization_Asp.net Core 5.0 - Fatal编程技术网

C# ASP.NET Core 5.0 RoutedDataRequestCultureProvider删除url中的默认区域性

C# ASP.NET Core 5.0 RoutedDataRequestCultureProvider删除url中的默认区域性,c#,asp.net-core,.net-core,asp.net-core-localization,asp.net-core-5.0,C#,Asp.net Core,.net Core,Asp.net Core Localization,Asp.net Core 5.0,我试图在我的asp.net核心项目中添加多语言功能,但在RequestLocalization中,.net 3.1和5.0之间有一些变化,我无法得到我想要的。我为每种语言添加了资源文件,并在我的razor页面中使用了资源,它可以工作,但有一个不需要的默认路由错误,我希望我的路由对默认区域性友好 这就是我想要的 对于默认区域性(土耳其语): 对于非默认区域性(英语): 我的另一个问题是;我的项目呈现site.com/foo/foo/bar这个url,就像site.com/tr/foo/bar一样,

我试图在我的asp.net核心项目中添加多语言功能,但在RequestLocalization中,.net 3.1和5.0之间有一些变化,我无法得到我想要的。我为每种语言添加了资源文件,并在我的razor页面中使用了资源,它可以工作,但有一个不需要的默认路由错误,我希望我的路由对默认区域性友好

这就是我想要的

对于默认区域性(土耳其语):

对于非默认区域性(英语):

我的另一个问题是;我的项目呈现site.com/foo/foo/bar这个url,就像site.com/tr/foo/bar一样,这不好,我想它应该重定向到404页

我的启动示例代码如下:

public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();
    services.AddLocalization(opts => opts.ResourcesPath = "Resources");
    services.Configure<RequestLocalizationOptions>(options =>
    {
        var supportedCultures = new[]
        {
            new CultureInfo("tr-TR"),
            new CultureInfo("en")
        };

        options.DefaultRequestCulture = new RequestCulture("tr");
        options.SupportedCultures = supportedCultures;
        options.SupportedUICultures = supportedCultures;
        options.RequestCultureProviders.Insert(0, new RouteDataRequestCultureProvider());
    });

    services.AddControllersWithViews();
    services.AddRazorPages();
    services.AddRouting(options => options.LowercaseUrls = true);
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseResponseCompression();

    if (env.IsDevelopment())
        app.UseDeveloperExceptionPage();
    else
    {
        app.UseExceptionHandler("/Home/Error");
        // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseRouting();
    var supportedCultures = new string[] { "tr-TR", "en" };
    app.UseRequestLocalization(options =>
                options
                .AddSupportedCultures(supportedCultures)
                .AddSupportedUICultures(supportedCultures)
                .SetDefaultCulture("tr-TR")
                .RequestCultureProviders.Insert(0, new CustomRequestCultureProvider(context => Task.FromResult(new ProviderCultureResult("tr-TR"))))
    );

    app.UseAuthorization();
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(name: "culture-route", pattern: "{culture}/{controller=Home}/{action=Index}/{id?}");
        endpoints.MapControllerRoute(name: "default", "{culture=tr}/{controller=Home}/{action=Index}/{id?}");
    });
}
public void配置服务(IServiceCollection服务)
{
services.AddResponseCompression();
services.AddLocalization(opts=>opts.ResourcesPath=“Resources”);
配置(选项=>
{
var supportedCultures=new[]
{
新文化资讯(“tr”),
新文化信息(“en”)
};
options.DefaultRequestCulture=新的RequestCulture(“tr”);
options.SupportedCultures=SupportedCultures;
options.supportedCultures=supportedCultures;
Insert(0,新RoutedDataRequestCultureProvider());
});
services.AddControllersWithViews();
services.AddRazorPages();
services.AddRouting(options=>options.LowercaseUrls=true);
}
public void配置(IApplicationBuilder应用程序、IWebHostEnvironment环境)
{
app.UseResponseCompression();
if(env.IsDevelopment())
app.UseDeveloperExceptionPage();
其他的
{
app.UseExceptionHandler(“/Home/Error”);
//默认的HSTS值为30天。您可能希望在生产场景中更改此值,请参阅https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
var-supportedCultures=新字符串[]{“tr tr”,“en”};
app.UseRequestLocalization(选项=>
选择权
.AddSupportedCultures(supportedCultures)
.AddSupportedCultures(supportedCultures)
.SetDefaultCulture(“tr”)
.RequestCultureProviders.Insert(0,新的CustomRequestCultureProvider(上下文=>Task.FromResult(新的ProviderCultureResult(“tr”)))
);
app.UseAuthorization();
app.UseEndpoints(端点=>
{
MapControllerOute(名称:“文化路由”,模式:{culture}/{controller=Home}/{action=Index}/{id?}”);
MapControllerOute(名称:“default”,“{culture=tr}/{controller=Home}/{action=Index}/{id?}”);
});
}
Razor资源使用和文化变化导航

资源文件

我如何解决这个问题,或者我做错了什么

编辑
我找到了方法。它使用CookiierRequestCultureProvider,url中没有区域性信息,但至少没有被阻塞的url。我不知道这对SEO是否合适。

为此,您需要在ASP.Net核心中配置一点不同的本地化

我已经创建了新的
ASP.Net核心MVC
项目,并执行以下步骤:

  • 首先,您需要创建自定义
    UrlRequestCultureProvider
  • Configure()
    中添加此代码:
  • 最后,这是我的家庭视图
  • @使用Microsoft.AspNetCore.Mvc.Localization
    @注入IViewLocalizer定位器
    @{
    ViewData[“Title”]=“主页”;
    }
    @定位器[“欢迎”]
    
    您可以在屏幕截图上看到结果

    Defaul->

    英语->

    法语->


    您可以向我提问并享受本地化的乐趣:)

    谢谢您的详细回答:),这种方法也有问题,如果您尝试其他控制器页面,您也会遇到“不友好路线”问题,它与主控制器一起工作会导致其默认(我想…)但其他控制器路由已损坏,并且它们不适用于默认区域性。另一个问题是,如果您尝试site.com/Home/Home,它仍在工作,这将导致创建复杂的URL。我不能像旧的asp.net那样为每种语言使用一个资源文件,因为这种新的文件命名使得翻译和可重用的单词管理变得困难。我做了一些研究,我认为CookiierRequestCultureProvider更适合我的友好路由模式。url中不会有区域性信息(只有setter url会有参数),但它更安全,并且没有损坏的url。如果我遗漏了任何一点,我也想听听你的意见。好吧,我创建了新的查看页面并添加了新的
    资源。对我来说一切都很好。不友好路线对你意味着什么?URL是:
    http://localhost:56889/en/home/privacy
    http://localhost:56889/fr/home/privacy
    。我想我有
    主页
    的url名称,不是吗?对你来说,这是不友好的,我是对的?site.com/en/home/privacy对我来说完全没问题,但我希望默认的文化在url上没有定义,如果你调用site.com/dummyCultureOrAnythingHere/home/privacy这个url在你的项目中,它会呈现得像site.com/en/home/privacy一样,我想这是不友好的,它应该重定向到主页或显示404页。您的新视图是否绑定到另一个控制器?因为如果您尝试打开另一个控制器索引页,它会导致上面的“虚拟404”示例,请尝试打开site.com/newController,但它将呈现site.com/en/home/Index,url将保留site.com/newController。我理解您的意思。我找到了与您的问题类似的答案,但使用的是旧版本的NetCore。和。我将调查这些答案,并尝试创建类似的解决方案。
    site.com/en/foo
    site.com/en/foo/bar
    site.com/en/foo/bar/5
    
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddResponseCompression();
        services.AddLocalization(opts => opts.ResourcesPath = "Resources");
        services.Configure<RequestLocalizationOptions>(options =>
        {
            var supportedCultures = new[]
            {
                new CultureInfo("tr-TR"),
                new CultureInfo("en")
            };
    
            options.DefaultRequestCulture = new RequestCulture("tr");
            options.SupportedCultures = supportedCultures;
            options.SupportedUICultures = supportedCultures;
            options.RequestCultureProviders.Insert(0, new RouteDataRequestCultureProvider());
        });
    
        services.AddControllersWithViews();
        services.AddRazorPages();
        services.AddRouting(options => options.LowercaseUrls = true);
    }
    
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        app.UseResponseCompression();
    
        if (env.IsDevelopment())
            app.UseDeveloperExceptionPage();
        else
        {
            app.UseExceptionHandler("/Home/Error");
            // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
            app.UseHsts();
        }
    
        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseRouting();
        var supportedCultures = new string[] { "tr-TR", "en" };
        app.UseRequestLocalization(options =>
                    options
                    .AddSupportedCultures(supportedCultures)
                    .AddSupportedUICultures(supportedCultures)
                    .SetDefaultCulture("tr-TR")
                    .RequestCultureProviders.Insert(0, new CustomRequestCultureProvider(context => Task.FromResult(new ProviderCultureResult("tr-TR"))))
        );
    
        app.UseAuthorization();
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(name: "culture-route", pattern: "{culture}/{controller=Home}/{action=Index}/{id?}");
            endpoints.MapControllerRoute(name: "default", "{culture=tr}/{controller=Home}/{action=Index}/{id?}");
        });
    }
    
        public class UrlRequestCultureProvider : RequestCultureProvider
        {
            private static readonly Regex PartLocalePattern = new Regex(@"^[a-z]{2}(-[a-z]{2,4})?$", RegexOptions.IgnoreCase);
            private static readonly Regex FullLocalePattern = new Regex(@"^[a-z]{2}-[A-Z]{2}$", RegexOptions.IgnoreCase);
    
            private static readonly Dictionary<string, string> LanguageMap = new Dictionary<string, string>
            {
                { "en", "en-US" },
                { "fr", "fr-FR" }
            };
    
            public override Task<ProviderCultureResult> DetermineProviderCultureResult(HttpContext httpContext)
            {
                if (httpContext == null)
                {
                    throw new ArgumentNullException(nameof(httpContext));
                }
    
                var parts = httpContext.Request.Path.Value.Split('/');
                // Get culture from path
                var culture = parts[1];
    
                if (parts.Length < 3)
                {
                    return Task.FromResult<ProviderCultureResult>(null);
                }
    
                // For full languages fr-FR or en-US pattern
                if (FullLocalePattern.IsMatch(culture))
                {
                    return Task.FromResult(new ProviderCultureResult(culture));
                }
    
                // For part languages fr or en pattern
                if (PartLocalePattern.IsMatch(culture))
                {
                    var fullCulture = LanguageMap[culture];
                    return Task.FromResult(new ProviderCultureResult(fullCulture));
                }
    
                return Task.FromResult<ProviderCultureResult>(null);
            }
        }
    
                services.AddControllersWithViews().AddViewLocalization();
                services.AddLocalization(options => options.ResourcesPath = "Resources");
    
                services.Configure<RequestLocalizationOptions>(options =>
                {
                    var supportedCulters = new List<CultureInfo>()
                    {
                        new CultureInfo("en-US"),
                        new CultureInfo("fr-FR")
                    };
    
                    options.DefaultRequestCulture = new RequestCulture(supportedCulters.FirstOrDefault());
                    options.SupportedCultures = supportedCulters;
                    options.SupportedUICultures = supportedCulters;
    
                    options.RequestCultureProviders.Insert(0, new UrlRequestCultureProvider() 
                    { 
                        Options = options 
                    });
                });
    
                var requestLocalizationOptions = app.ApplicationServices.GetRequiredService<IOptions<RequestLocalizationOptions>>();
                app.UseRequestLocalization(requestLocalizationOptions.Value);
    
                app.UseRouting();
    
                app.UseAuthorization();
    
                app.UseEndpoints(endpoints =>
                {
                    endpoints.MapControllerRoute(
                        name: "default",
                        pattern: "{controller=Home}/{action=Index}/{id?}");
    
                    endpoints.MapControllerRoute(
                        name: "culture",
                        pattern: "{culture}/{controller=Home}/{action=Index}/{id?}");
                });
    
    Views.Home.Index.en-US.resx
    Views.Home.Index.fr-FR.resx
    
    @using Microsoft.AspNetCore.Mvc.Localization
    @inject IViewLocalizer Localizer
    
    @{
        ViewData["Title"] = "Home Page";
    }
    
    <div class="text-center">
        <h1 class="display-4">@Localizer["Welcome"]</h1>
    </div>