ASP.NET Core Razor Pages:如何设置非en-US的请求本地化默认区域性
ASP.NET Core 8 本地化问题:默认语言与URL参数切换无法同时生效
问题概述
使用VS2022的“ASP.NET Core Web App (Razor Pages)”模板创建了目标框架为.NET 8.0的Web应用WebApplication2,目前遇到本地化配置冲突:仅能二选一——要么通过URL参数(如?culture=fr-FR)切换请求本地化,要么将应用默认语言固定为fr-FR,无法同时实现两者。两种场景下本地化翻译功能均正常,但无法兼顾默认语言设置与URL参数切换。
情况1:URL参数生效,但默认语言无法设为fr-FR
尽管在配置中指定默认区域性为fr-FR,应用启动后仍默认使用en-US,对应Program.cs代码如下:
var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllersWithViews(); // Add localization services builder.Services.AddLocalization(options => options.ResourcesPath = "Resources"); string[] supportedCultures = [ "fr-FR", "en-US", "es-ES" ]; builder.Services.Configure<RequestLocalizationOptions>(options => { options.DefaultRequestCulture = new RequestCulture("fr-FR"); options.SetDefaultCulture("fr-FR") .AddSupportedCultures(supportedCultures) .AddSupportedUICultures(supportedCultures); }); var app = builder.Build(); // Configure the HTTP request pipeline. if (!app.Environment.IsDevelopment()) { 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(); } var localizationOptions = app.Services.GetService<IOptions<RequestLocalizationOptions>>()?.Value; if (localizationOptions != null) { localizationOptions.AddSupportedCultures(supportedCultures); localizationOptions.DefaultRequestCulture = new RequestCulture("fr-FR"); app.UseRequestLocalization(localizationOptions); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.Run();
情况2:默认语言设为fr-FR,但URL参数切换失效
将区域性固定为fr-FR后,?culture=en-US这类URL参数不再生效,修改后的代码片段如下:
/* Comment these lines and replace it with single app.UseRequestLocalization call */ // var localizationOptions = app.Services.GetService<IOptions<RequestLocalizationOptions>>()?.Value; // if (localizationOptions != null) // { // localizationOptions.AddSupportedCultures(supportedCultures); // localizationOptions.DefaultRequestCulture = new RequestCulture("fr-FR"); // app.UseRequestLocalization(localizationOptions); // } /* This has effect but then URL like `?culture=en-US` doesn't work */ app.UseRequestLocalization("fr-FR");
项目配置细节
- 项目根目录下有Resources文件夹,包含3个资源文件(各含字符串
StrLearnAbout):- Resources/SharedResource.en-US.resx
- Resources/SharedResource.es-ES.resx
- Resources/SharedResource.fr-FR.resx
- 根目录下有空类
SharedResource:
namespace WebApplication2 { public class SharedResource { } }
- Index.cshtml代码:
@using Microsoft.Extensions.Localization @inject IStringLocalizer<SharedResource> Localizer @{ ViewData["Title"] = "Home Page"; } <div class="text-center"> <h1 class="display-4">Welcome</h1> <p>@Localizer["StrLearnAbout"]</p> <p>Learn about <a href="https://learn.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p> </div>
解决方案
问题核心在于请求本地化中间件的配置顺序与重复配置冲突,修改后可同时满足默认语言设置与URL参数切换需求:
修改后的Program.cs
var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllersWithViews(); // Add localization services builder.Services.AddLocalization(options => options.ResourcesPath = "Resources"); string[] supportedCultures = [ "fr-FR", "en-US", "es-ES" ]; builder.Services.Configure<RequestLocalizationOptions>(options => { // 设置默认区域性 var defaultCulture = "fr-FR"; options.DefaultRequestCulture = new RequestCulture(defaultCulture); options.SetDefaultCulture(defaultCulture) .AddSupportedCultures(supportedCultures) .AddSupportedUICultures(supportedCultures); // 确保URL参数提供器优先级最高(默认已启用,显式声明更稳妥) options.RequestCultureProviders.Insert(0, new QueryStringRequestCultureProvider()); }); var app = builder.Build(); // Configure the HTTP request pipeline. if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } // 关键:在UseRouting之前启用请求本地化中间件 app.UseRequestLocalization(); app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.Run();
关键说明
- 中间件顺序:
UseRequestLocalization必须放在UseRouting之前,否则路由匹配会先于本地化处理,导致URL参数无法生效。 - 避免重复配置:移除服务构建后对
RequestLocalizationOptions的二次修改,服务配置阶段的设置已足够,重复修改会干扰默认逻辑。 - URL参数优先级:显式将
QueryStringRequestCultureProvider插入到提供器列表首位,确保URL参数的优先级高于Cookie、Accept-Language头等其他本地化来源。
配置完成后,应用默认将使用fr-FR,同时访问?culture=en-US或?culture=es-ES时,会正常切换到对应语言。
内容的提问来源于stack exchange,提问作者char m
相关产品推荐
相关产品推荐

