这是我的路线:
app.UseMvc(routes =>
{
routes.MapRoute(
name: "defaultWithCulture",
template: "{culture=fa-IR}/{controller}/{action=Index}/{id?}");
});
但是当我使用链接时本地化工作:
http://localhost:1776/fa-IR/Home/About?culture=fa-ir
但不是什么时候
http://localhost:1776/fa-IR/Home/About
为什么路由中的文化不适用?
最佳答案
SSA 的回答并没有解决我的问题,但给了我一个很大的线索,最后我让它开始工作。
要做的事情是:
- 正如 SSA 所说,asp.net core 按顺序具有以下 RequestCultureProviders。将使用第一个非空值。
QueryStringRequestCultureProvider CookieRequestCultureProvider AcceptLanguageHeaderRequestCultureProvider
所以我们必须改变它们的顺序并将路由添加到第一个:
services.Configure<RequestLocalizationOptions>(
options =>
{
var supportedCultures = new List<CultureInfo>
{
new CultureInfo("en-US"),
new CultureInfo("fa-IR"),
};
options.DefaultRequestCulture = new RequestCulture(culture: "fa-IR", uiCulture: "fa-IR");
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
options.RequestCultureProviders.Clear();
options.RequestCultureProviders.Insert(0, new RouteDataRequestCultureProvider();
options.RequestCultureProviders.Insert(1, new QueryStringRequestCultureProvider());
options.RequestCultureProviders.Insert(2, new CookieRequestCultureProvider());
options.RequestCultureProviders.Insert(3, new AcceptLanguageHeaderRequestCultureProvider());
services.AddSingleton(options);
});
2- 当 RouteDataRequestCultureProvider任务已执行,RoutingData 仍然为 null 且尚未被赋予值,因此它将始终返回 null,因此我将其更改为使用 Url.Path
而不是 RoutingData:
public class RouteDataRequestCultureProvider : RequestCultureProvider
{
public override Task<ProviderCultureResult> DetermineProviderCultureResult(HttpContext httpContext)
{
if (httpContext == null)
{
throw new ArgumentNullException(nameof(httpContext));
}
string culture = null;
string uiCulture = null;
uiCulture = culture = httpContext.Request.Path.Value.Split('/')[1]?.ToString();
if (culture == null)
{
return TaskCache<ProviderCultureResult>.DefaultCompletedTask;
}
var providerResultCulture = new ProviderCultureResult(culture, uiCulture);
return Task.FromResult(providerResultCulture);
}
}
关于c# - 本地化在通过 QueryString 设置文化时起作用,但在文化在途中时不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42529593/