C# 如何在.net core的Url中显示当前区域性?
我正试图在.Netcore中实现本地化,但有一件事我陷入了困境,那就是如何在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[] {
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>