ASP.NET Core 5.0 RouteDataRequestCultureProvider 删除 url 中的默认区域性

2024-03-07

我尝试向我的 asp.net-core 项目添加多语言功能,但 RequestLocalization 中的 .net 3.1 和 5.0 之间存在一些变化,我无法得到我想要的。我为每种语言添加了资源文件,并在我的剃刀页面中使用了资源,它可以工作,但有一个不需要的默认路由错误,我希望我的路由能够对默认文化友好地工作。

这就是我要的,

对于默认文化(土耳其语):

site.com/foo
site.com/foo/bar
site.com/foo/bar/5

对于非默认区域性(英语):

site.com/en/foo
site.com/en/foo/bar
site.com/en/foo/bar/5

我的另一个问题是;我的项目渲染 site.com/foo/foo/bar 这个网址就像 site.com/tr/foo/bar 一样,这是不行的,我想它应该重定向到 404 页面。

我的启动示例代码如下:

public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();
    services.AddLocalization(opts => opts.ResourcesPath = "Resources");
    services.Configure<RequestLocalizationOptions>(options =>
    {
        var supportedCultures = new[]
        {
            new CultureInfo("tr-TR"),
            new CultureInfo("en")
        };

        options.DefaultRequestCulture = new RequestCulture("tr");
        options.SupportedCultures = supportedCultures;
        options.SupportedUICultures = supportedCultures;
        options.RequestCultureProviders.Insert(0, new RouteDataRequestCultureProvider());
    });

    services.AddControllersWithViews();
    services.AddRazorPages();
    services.AddRouting(options => options.LowercaseUrls = true);
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseResponseCompression();

    if (env.IsDevelopment())
        app.UseDeveloperExceptionPage();
    else
    {
        app.UseExceptionHandler("/Home/Error");
        // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseRouting();
    var supportedCultures = new string[] { "tr-TR", "en" };
    app.UseRequestLocalization(options =>
                options
                .AddSupportedCultures(supportedCultures)
                .AddSupportedUICultures(supportedCultures)
                .SetDefaultCulture("tr-TR")
                .RequestCultureProviders.Insert(0, new CustomRequestCultureProvider(context => Task.FromResult(new ProviderCultureResult("tr-TR"))))
    );

    app.UseAuthorization();
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(name: "culture-route", pattern: "{culture}/{controller=Home}/{action=Index}/{id?}");
        endpoints.MapControllerRoute(name: "default", "{culture=tr}/{controller=Home}/{action=Index}/{id?}");
    });
}

Razor 资源使用和文化变革导航

资源文件

我该如何解决这个问题或者我做错了什么?

EDIT

I found this https://andrewlock.net/adding-localisation-to-an-asp-net-core-application/方法。它使用 CookieRequestCultureProvider 并且 url 中没有文化信息,但至少没有损坏的 url。我不知道这是否适合 SEO。


为此,您需要在 ASP.Net Core 中配置稍微不同的本地化。

我已经创建了新的ASP.Net Core MVC项目并执行以下步骤:

  1. 首先,您需要创建自定义UrlRequestCultureProvider
    public class UrlRequestCultureProvider : RequestCultureProvider
    {
        private static readonly Regex PartLocalePattern = new Regex(@"^[a-z]{2}(-[a-z]{2,4})?$", RegexOptions.IgnoreCase);
        private static readonly Regex FullLocalePattern = new Regex(@"^[a-z]{2}-[A-Z]{2}$", RegexOptions.IgnoreCase);

        private static readonly Dictionary<string, string> LanguageMap = new Dictionary<string, string>
        {
            { "en", "en-US" },
            { "fr", "fr-FR" }
        };

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

            var parts = httpContext.Request.Path.Value.Split('/');
            // Get culture from path
            var culture = parts[1];

            if (parts.Length < 3)
            {
                return Task.FromResult<ProviderCultureResult>(null);
            }

            // For full languages fr-FR or en-US pattern
            if (FullLocalePattern.IsMatch(culture))
            {
                return Task.FromResult(new ProviderCultureResult(culture));
            }

            // For part languages fr or en pattern
            if (PartLocalePattern.IsMatch(culture))
            {
                var fullCulture = LanguageMap[culture];
                return Task.FromResult(new ProviderCultureResult(fullCulture));
            }

            return Task.FromResult<ProviderCultureResult>(null);
        }
    }
  1. In ConfigureServices()添加此代码:
            services.AddControllersWithViews().AddViewLocalization();
            services.AddLocalization(options => options.ResourcesPath = "Resources");

            services.Configure<RequestLocalizationOptions>(options =>
            {
                var supportedCulters = new List<CultureInfo>()
                {
                    new CultureInfo("en-US"),
                    new CultureInfo("fr-FR")
                };

                options.DefaultRequestCulture = new RequestCulture(supportedCulters.FirstOrDefault());
                options.SupportedCultures = supportedCulters;
                options.SupportedUICultures = supportedCulters;

                options.RequestCultureProviders.Insert(0, new UrlRequestCultureProvider() 
                { 
                    Options = options 
                });
            });
  1. In Configure()添加此代码:
            var requestLocalizationOptions = app.ApplicationServices.GetRequiredService<IOptions<RequestLocalizationOptions>>();
            app.UseRequestLocalization(requestLocalizationOptions.Value);

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");

                endpoints.MapControllerRoute(
                    name: "culture",
                    pattern: "{culture}/{controller=Home}/{action=Index}/{id?}");
            });
  1. 另外,我添加了Resources用于 en-US 和 fr-FR 本地化。有关更多信息资源文件命名 https://learn.microsoft.com/en-us/aspnet/core/fundamentals/localization?view=aspnetcore-5.0#resource-file-naming-2在微软文档中。
Views.Home.Index.en-US.resx
Views.Home.Index.fr-FR.resx
  1. 最后,这是我的主页视图
@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer

@{
    ViewData["Title"] = "Home Page";
}

<div class="text-center">
    <h1 class="display-4">@Localizer["Welcome"]</h1>
</div>

您可以在屏幕截图中看到结果。

Defaul -> Default

English -> English

French -> French

您可以向我提问并享受本地化的乐趣:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.NET Core 5.0 RouteDataRequestCultureProvider 删除 url 中的默认区域性 的相关文章

  • 如何在 C++ 中对四元结构进行有效排序?

    我有一个包含 x y z 和 w 成员的结构 如何高效排序 在 C 中首先按 x 然后按 y 按 z 最后按 w 如果你想实现字典排序 那么最简单的方法是使用std tie实现小于或大于比较运算符或函子 然后使用std sort http
  • 通过 TCP/.NET SSLStream 发送文件很慢/无法正常工作

    我正在编写一个与 SSL 配合使用的服务器 客户端应用程序 通过SSLStream 它必须做很多事情 不仅仅是文件接收 发送 目前 它的工作原理是 只有一个连接 我总是使用从客户端 服务器发送数据SSLStream WriteLine 并使
  • Debug.WriteLine() 未命中

    我正在调试 Windows 服务 通过点击F5在 Visual Studio 2010 中 使用以下代码 In 程序 cs file static void Main if Environment UserInteractive We ar
  • 如何让BackgroundWorker返回一个对象

    我需要做RunWorkerAsync 返回一个List
  • 如何在方法模板中使用模板类型的引用传递参数?

    我目前正在努力编译以下代码 首先是包含带有方法模板的类的头文件 ConfigurationContext h class ConfigurationContext public template
  • 会员提供商使用还是不使用?

    我正在开发一个使用 Facebook 的网站 现在为了管理用户我想使用MembershipProvider并选择开发一个定制的会员提供商 我的问题是我的数据库架构与标准成员资格架构不匹配 并且提供的用于覆盖的函数采用与我预期不同的参数 例如
  • DataGridView小数不排序

    好吧 我有一个 DataGridView 它的数据绑定如下 dataGridViewChartOre AutoGenerateColumns false dataGridViewChartOre DataSource xml GetOreC
  • “已经有一个与此命令关联的打开的 DataReader,必须先将其关闭。”

    我正在开发需要连接到另一个数据库以获取一些数据的应用程序 为此 我决定使用 SqlConnection reader 等 我需要执行一些查询 例如首先我需要获取某个用户的卡 ID 之后我需要通过该卡 ID 获取一些数据 这是我的代码 reg
  • gcc 删除内联汇编代码

    看起来 gcc 4 6 2 删除了它认为函数中未使用的代码 test c int main void goto exit handler asm volatile jmp 0x0 exit return 0 拆解main 0x0804840
  • OpenMP 和 C++:this 指针

    Is thisOpenMP 中始终共享指针 尽管编译器不会抱怨以下代码default none pragma omp parallel for default none shared n for SInt i 0 i lt n i f i
  • 如何在控制台程序中获取鼠标位置?

    如何在 Windows 控制台程序中用 C 获取鼠标单击位置 点击时返回鼠标位置的变量 我想用简单的文本命令绘制一个菜单 这样当有人点击时 游戏就会注册它并知道位置 我知道如何做我需要做的一切 除了单击时获取鼠标位置 您需要使用 Conso
  • 随机排列

    我无法找到一种随机洗牌元素的好方法std vector经过一些操作后 恢复原来的顺序 我知道这应该是一个相当简单的算法 但我想我太累了 由于我被迫使用自定义随机数生成器类 我想我不能使用std random shuffle 无论如何这没有帮
  • 使用 dotnet pack 打包多个程序集

    正如问题所说 如何使用 dotnet pack 打包多个项目 程序集 使用 VS2017 和新的 csproj 文件 在 csproj 文件中包含您需要的程序集
  • AllowUserToAddRows 不适用于 DataGridView 上的 List<> 数据源

    我有一个DataGridView与DataSource set to List
  • 使用客户端 hello 消息进行 TLS 协议检测

    我需要检测网络流量中的 https 数据包 到目前为止 我将所有 443 标记为 https 但我不想再在这种情况下使用端口信息 检查客户端问候消息是否足够 Check 22 and version info 0300 0301 or 03
  • 如何获取数字列的确切类型,包括。规模和精度?

    有没有办法知道列中列的确切类型DataTable 现在我正在这样做 DataTable st dataReader GetSchemaTable foreach DataColumn col in st Columns var type c
  • 如何重写(重新实现)QFileSystemModel 中的成员函数

    我已经为此苦苦挣扎了一段时间 Qt s QFileSystemModel由于图标获取算法非常糟糕 在获取数百个文件时速度非常慢 我想完全禁用图标 它们被提取到QFileSystemModel data方法不是虚拟的 QFileSystemM
  • 我可以创建一个 List> 吗?

    我正在尝试创建一个列表WeakReference使用 4 5 泛型实现 这样我就可以避免类型检查和转换WeakReference目标 但 WeakReference
  • 如何将 IDispatch* 放入托管代码中

    我一直在考虑尝试使用 C 编写一个实现 OPOS 服务对象的 COM 对象 我已经使用自动化和 MFC 在 C 中完成了它 这并不太困难 所以我坚持尝试将其转换为一种方法 我将排除界面中的其他方法 因为它们很简单 或者我希望如此 id 6
  • Eclipse (C/C++) 错误:平台关闭后发现作业仍在运行

    当我打开 Eclipse 时 它 在一小时前工作过 但在启动时冻结并给出错误 发生错误 请参阅日志文件 请参阅下面的日志文件 尽管其中一些信息出现在日志中 操作系统 Mac OSX 10 7 5 Eclipse 面向 C C 开发人员的 E

随机推荐

  • 为什么 height: 0 不隐藏我的填充

    我有一个 div 带衬垫 我已将其设置为height 0 并给出它overflow hidden and box sizing border box div webkit box sizing border box moz box sizi
  • Do while javascript问题

    我试图在 do while 循环中发送多个帖子 但结果未添加
  • 如何从命令行更新 SSDT 项目?

    我希望能够使用SSDT SQL Server Data Tools 将我们的数据库模式置于版本控制之下 将数据库导入到 Visual Studio 中的 SSDT 项目中会创建数据库架构的良好文本表示形式 适合版本控制 现在的问题是 当对数
  • 在 Java 中格式化时间戳

    我希望以以下格式生成当前时间戳yyyy MM dd HH mm ss 我编写了以下代码 但它总是给我这种格式yyyy MM dd HH mm ss x 你如何摆脱 x part DateFormat df new SimpleDateFor
  • 根据图片名称获取url文件

    大家好 我在 WordPress 的媒体文件夹中有几张图片 当保存新图像时 WordPress 保存为年 月 name png wp content uploads 2011 01 matt png 是否可以按名称查找图像并返回 url 文
  • XCode - 动态创建的标签,当我更改文本时,它仅更改最后一个标签

    所以我有一堆动态加载的标签 他们每个人都有相同的名字 因为不知道会有多少人 我有另一种方法 不是创建标签的方法 更改其中一个标签的文本 但是当我运行它时 只有创建的最后一个标签会更改 我需要它来更改具有特定标签或其他内容的那个 非常感谢帮助
  • 获取列表中每 n 个项目的一大块项目

    假设我有以下列表 l 4 3 1 5 3 5 8 11 10 4 12 2 1 最Pythonic的切片方式是什么l为了获得长度块n离开k块之间的项目 例如 如果n 2 and k 3结果应该是 4 3 5 8 12 2 使用列表理解 e
  • Xamarin.Forms 中的圆形图像

    我需要在 Xamarin Forms 中使用带有圆角的图像控件 但我没有找到任何可以做到的财产 如何制作圆形图像 我用FF图像加载 https github com molinch FFImageLoading图书馆CachedImage对
  • 将动态数组传递给 C 中的函数

    我正在尝试创建一个函数 该函数将数组作为参数 向其添加值 如果需要 增加其大小 并返回项目的计数 到目前为止我有 int main int argc char argv int mSize 10 ent a mSize int n n ad
  • 无法使用 py2exe 以“Domain\ComputerName”pyodbc 身份登录

    好的 我有一个连接到 mssql 数据库的脚本 我需要作为我已经完成的服务运行 但是当我将它作为服务运行时 它会覆盖我在使用以下命令连接到数据库时输入的凭据 广告计算机帐户 当我单独运行它而不是作为服务运行时 它运行得非常完美 我的连接字符
  • PDF 和 MFMailComposeViewController

    编写允许用户生成 pdf 并发送的应用程序部分 似乎工作正常 发送的 PDF 在 MAC 上可以正常打开 但在 iPhone 上它只是不断加载并且永远不会打开 在 Ray Wenderlich 教程的帮助下创建了一个 pdf 文档 并通过带
  • Delphi RTTI:获取属性的类

    使用Delphi 2010和RTTI 我知道如何获取对象的类类型以及如何获取 设置对象属性的值和类型 但是如何确定属性来自继承链中的哪个类 我想以不同于主类的方式使用基类的属性 考虑这段代码 TClassBase class TObject
  • 使用 SQL 对列表排序还是作为集合排序?

    我的数据库中有一些带有日期的条目 什么是最好的 用sql语句获取它们并应用order by 使用 sql 获取列表 并在应用程序中对它们进行排序collection sort or so Thanks 这是一个非常广泛的问题 很难回答 这在
  • Rust 进程使用 GitHub 操作失败,退出代码为 101

    该代码在我的本地计算机上运行良好并且没有给出任何错误 但是当我推送到 GitHub 时 构建失败了 这是我的工作流程文件的块 runs on matrix platform steps name Checkout Repository us
  • Delphi 多索引通用列表

    我正在寻找一种 TList 后代 它可以让我添加一个或多个索引 并让我通过这些索引进行搜索和查看 30分钟的谷歌搜索让我一无所获 以前肯定需要这个 我的意思是 有多少次您有一个内存索引集合 然后需要以不同的顺序显示它 Thanks AJ 你
  • 事件与路由器绑定

    我在用着导航网 https github com krasimir navigo对于一个小网站 用户被要求登录到登陆页面上的帐户 然后在验证其帐户后路由到主模板 页面对象是从 Firebase 数据库填充的 因此我初始化一个类并将多个事件和
  • 是否可以在 Sublime Text 2 中链接键绑定命令?

    有时 我想在 Sublime Text 中显示侧栏中的当前文件 然后在文件夹结构中导航 这可以使用命令来实现reveal in side bar and focus side bar然而 它们必须绑定到两个单独的按键组合 因此我必须执行 2
  • 在 SQL Server 中将月份名称转换为月份编号

    在 T SQL 中 将月份名称转换为数字的最佳方法是什么 E g January gt 1 February gt 2 March gt 3 Etc 是否有任何内置函数可以做到这一点 这个怎么样 select DATEPART MM jan
  • 如何用新列覆盖 Spark 数据框中的整个现有列?

    我想用一个新列覆盖 Spark 列 该新列是二进制标志 我尝试直接覆盖 id2 列 但为什么它不像 Pandas 中的就地操作那样工作 如何在不使用 withcolumn 创建新列和 drop 删除旧列的情况下做到这一点 我知道 Spark
  • ASP.NET Core 5.0 RouteDataRequestCultureProvider 删除 url 中的默认区域性

    我尝试向我的 asp net core 项目添加多语言功能 但 RequestLocalization 中的 net 3 1 和 5 0 之间存在一些变化 我无法得到我想要的 我为每种语言添加了资源文件 并在我的剃刀页面中使用了资源 它可以