gpt4 book ai didi

c# - 本地化在通过 QueryString 设置文化时起作用,但在文化在途中时不起作用

转载 作者:行者123 更新时间:2023-11-30 13:54:28 24 4
gpt4 key购买 nike

这是我的路线:

        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 的回答并没有解决我的问题,但给了我一个很大的线索,最后我让它开始工作。

要做的事情是:

  1. 正如 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com