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

标签 c# asp.net .net asp.net-core routes

这是我的路线:

        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/

相关文章:

.net - ListenUriMode.Unique如何为客户工作?

c# - 使用 C# 创建 3D 矩形

c# - 提交按钮在 asp.net mvc 中不起作用

c# - 如果它 = 0 c#,则跳过 for 循环中的值

c# - ASP.NET 有条件地显示 Div

asp.net - 将 Web 应用程序发布到 Azure 网站暂存部署槽因 webjob 失败

asp.net - 读取 Gedcom 文件并存储在数据库中

asp.net - 在 body 标记结束之前注册脚本引用标记

c# - 如果连接已经打开,可以调用 OracleConnection.Open() 吗?

javascript - jquery 引用出错并同时获取两个版本的 jquery