Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.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

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# 如何在.net core的Url中显示当前区域性?_C#_Asp.net Core_.net Core_Asp.net Core Mvc - Fatal编程技术网

C# 如何在.net core的Url中显示当前区域性?

C# 如何在.net core的Url中显示当前区域性?,c#,asp.net-core,.net-core,asp.net-core-mvc,C#,Asp.net Core,.net Core,Asp.net Core Mvc,我正试图在.Netcore中实现本地化,但有一件事我陷入了困境,那就是如何在Url中显示当前的文化。我已经检查和尝试了很多东西,但我不能使它工作。我将展示我已经实现了什么 在我的启动配置服务下: services.AddMvc() .AddViewLocalization(LanguageViewLocationExpanderFormat.后缀) .AddDataAnnotationsLocalization(); 配置(选项=> { var supportedCultures=new[] {

我正试图在.Netcore中实现本地化,但有一件事我陷入了困境,那就是如何在Url中显示当前的文化。我已经检查和尝试了很多东西,但我不能使它工作。我将展示我已经实现了什么

在我的启动配置服务下:

services.AddMvc()
.AddViewLocalization(LanguageViewLocationExpanderFormat.后缀)
.AddDataAnnotationsLocalization();
配置(选项=>
{
var supportedCultures=new[]
{
新文化信息(“de”),
新文化信息(“en”)
};
options.DefaultRequestCulture=新的RequestCulture(区域性:“de”,uiCulture:“de”);
options.SupportedCultures=SupportedCultures;
options.supportedCultures=supportedCultures;
options.RequestCultureProviders=新列表
{
新建QueryStringRequestCultureProvider(),
新CookiierRequestCultureProvider()
};
});
启动配置:

public void配置(IApplicationBuilder应用程序,IHostingEnvironment环境)
{
app.UseAuthentication();
var locOptions=app.ApplicationServices.GetService();
app.UseRequestLocalization(locOptions.Value);
var culture=locOptions.Value.DefaultRequestCulture.culture;
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseStaticFiles();
app.UseSession();
//正在配置mvc路由。。。
app.UseMvc(路由=>
{
routes.MapRoute(
名称:“区域路线”,
模板:“{area:exists}/{controller}/{action}/{id?}”,
默认值:新建{controller=“Home”,action=“Index”});
routes.MapRoute(
名称:“默认”,
模板:“{culture}/{controller}/{action}/{id?}”,
默认值:新建{culture=culture,controller=“Home”,action=“Index”});
});
}
我已经创建了一个局部视图,并且正在改变文化,例如这种文化正在成功地改变:-

[HttpPost]
公共IActionResult ChangeLanguage(字符串区域性、字符串返回URL)
{
Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookiierRequestCultureProvider.MakeCookieValue(新请求文化(文化)),
新CookieOptions{Expires=DateTimeOffset.UtcNow.AddYears(1)}
);
返回LocalRedirect(returnUrl);
}
现在我想在url中显示我当前的文化,如www.test.com/en/home/view

我已经创建了一条路线并设置了区域性,但即使在我更改了区域性之后,它也只采用默认区域性

另外,请告诉我这是实现本地化的正确方法,因为我对这个话题太困惑了


编辑:-我只需要在更改应用程序的区域性时更改url中的区域性。

删除
var culture=locOptions.Value.DefaultRequestCulture.culture

下面的演示应用于使用twoLetterLanguageName。请参阅

1.创建一个
RoutedDataRequestCultureProvider
类:

public class RouteDataRequestCultureProvider : RequestCultureProvider
{
    public int IndexOfCulture;
    public int IndexofUICulture;

    public override Task<ProviderCultureResult> DetermineProviderCultureResult(HttpContext httpContext)
    {
        if (httpContext == null)
            throw new ArgumentNullException(nameof(httpContext));

        string culture = null;
        string uiCulture = null;

        var twoLetterCultureName = httpContext.Request.Path.Value.Split('/')[IndexOfCulture]?.ToString();
        var twoLetterUICultureName = httpContext.Request.Path.Value.Split('/')[IndexofUICulture]?.ToString();

        if (twoLetterCultureName == "de")
            culture = "de-DE";
        else if (twoLetterCultureName == "en")
            culture = uiCulture = "en-US";

        if (twoLetterUICultureName == "de")
            culture = "de-DE";
        else if (twoLetterUICultureName == "en")
            culture = uiCulture = "en-US";

        if (culture == null && uiCulture == null)
            return NullProviderCultureResult;

        if (culture != null && uiCulture == null)
            uiCulture = culture;

        if (culture == null && uiCulture != null)
            culture = uiCulture;

        var providerResultCulture = new ProviderCultureResult(culture, uiCulture);

        return Task.FromResult(providerResultCulture);
    }
}
3.startup.cs:

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

    options.DefaultRequestCulture = new RequestCulture(culture: "en", uiCulture: "en-US");
    options.SupportedCultures = supportedCultures;
    options.SupportedUICultures = supportedCultures;

    options.RequestCultureProviders = new[]{ new RouteDataRequestCultureProvider{
        IndexOfCulture=1,
        IndexofUICulture=1
    }};

});

services.Configure<RouteOptions>(options =>
{
    options.ConstraintMap.Add("culture", typeof(LanguageRouteConstraint));
});

services.AddMvc()
    .AddRazorPagesOptions(options =>
    {
        options.Conventions.AddAreaFolderRouteModelConvention("Identity", "/Account/", model =>
        {
            foreach (var x in model.Selectors)
            {
                if (x.AttributeRouteModel.Template.StartsWith("Identity"))
                {
                    x.AttributeRouteModel = new AttributeRouteModel()
                    {
                        Order = -1,
                        Template = AttributeRouteModel.CombineTemplates(("{culture=en}"),
                            x.AttributeRouteModel.Template)
                    };
                }
            }
        });
    }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);  

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

    routes.MapRoute(
            name: "LocalizedDefault",
            template: "{culture:culture}/{controller}/{action}/{id?}");

    routes.MapRoute(
            name: "default",
            template: "{controller}/{action}/{id?}",
            defaults: new { controller = "Home", action = "Index" });
});
5.在
\u SelectLanguagePartial.cshtml
中为您的操作设置
asp区域
,如果操作位于根区域,请使用
asp区域=”

<form id="selectLanguage" asp-area="" asp-controller="Home" ...>...
</form>
。。。

你试过
CultureInfo.CurrentCulture
吗?@JagjitSingh我要在哪里试这个?谢谢。这是工作,但我有一个问题。当我进入某个区域时,它工作不正常。请使用和更新代码。修改发送路线和
\u选择语言部分
部分邮件视图。
[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) }
        );
        var array = returnUrl.Split("/");
        if (array[1] == "en" || array[1] == "de")//returnUrl like ~/en/Home/privacy
        {
            array[1] = culture;
            return LocalRedirect(String.Join("/", array));
        }
        else// returnUrl like ~/Home/privacy
        {
            return LocalRedirect("/" + culture + returnUrl.Substring(1));
        }

    }
<form id="selectLanguage" asp-area="" asp-controller="Home" ...>...
</form>